| 81 | } |
| 82 | |
| 83 | export default class PKCS8 { |
| 84 | static parse(buf) { |
| 85 | // RSA only |
| 86 | var key = {}; |
| 87 | var ber = new BER(buf); |
| 88 | if (ber.getTag() != 0x30) // SEQUENCE |
| 89 | throw new Error("PKCS8: not a sequence"); |
| 90 | ber.getLength() // skip the sequence length |
| 91 | ber.getInteger(); // skip the Version |
| 92 | ber.next(); // skip the AlgorithmIdentifier |
| 93 | ber.getTag(); // OCTET STRING that includes the private key in the SEQUENCE |
| 94 | ber.getLength(); |
| 95 | { |
| 96 | ber.getTag(); // SEQUENCE |
| 97 | ber.getLength(); |
| 98 | ber.getInteger(); // skip the first INTEGER |
| 99 | key.modulus = ber.getInteger(); |
| 100 | key.exponent = ber.getInteger(); |
| 101 | key.privExponent = ber.getInteger(); |
| 102 | key.prim1 = ber.getInteger(); |
| 103 | key.prim2 = ber.getInteger(); |
| 104 | key.exponent1 = ber.getInteger(); |
| 105 | key.exponent2 = ber.getInteger(); |
| 106 | key.coefficient = ber.getInteger(); |
| 107 | } |
| 108 | return key; |
| 109 | }; |
| 110 | static decrypt(buf, pass) { |
| 111 | var ber = new BER(buf); |
| 112 | if (ber.getTag() == 0x30) { |
| 113 | ber.getLength(); |
| 114 | if (ber.getTag() == 0x30) { |
| 115 | ber.getLength(); |
| 116 | var oid = ber.getObjectIdentifier(); |
| 117 | if (ber.getTag() == 0x30) { |
| 118 | ber.getLength(); |
| 119 | var salt = ber.getOctetString(); |
| 120 | var iter = ber.getInteger(); |
| 121 | var data = ber.getOctetString(); |
| 122 | var cipher, hash, mode, v; |
| 123 | switch (oid.toString()) { |
| 124 | case [1,2,840,113549,1,12,1,1].toString(): // pbeWithSHA1And128BitRC4 |
| 125 | cipher = Crypt.RC4; |
| 126 | hash = Crypt.SHA1; |
| 127 | v = 512 / 8; |
| 128 | break; |
| 129 | default: |
| 130 | throw new Error("PKCS8: unsupported encryption scheme: " + oid); |
| 131 | } |
| 132 | var key = pkcs12gen(pass, salt, iter.toNumber(), 16, hash, v); |
| 133 | var enc = new cipher(key); |
| 134 | if (mode) |
| 135 | var enc = new mode(enc); |
| 136 | enc.decrypt(data, data); |
| 137 | return this.parse(data); |
| 138 | } |
| 139 | } |
| 140 | } |
nothing calls this directly
no outgoing calls
no test coverage detected