MCPcopy Create free account
hub / github.com/Moddable-OpenSource/moddable / PKCS8

Class PKCS8

modules/crypt/etc/pkcs8.js:83–143  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

81}
82
83export 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 }

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected