Skip to content

Commit 93210bf

Browse files
committed
feat: Normalize function names
1 parent d3fb660 commit 93210bf

File tree

3 files changed

+64
-54
lines changed

3 files changed

+64
-54
lines changed

js/common.js

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ class MozCommon {
3232
.replace(/\_/g, "/"));
3333
}
3434

35-
_strToArray(str) {
35+
strToArray(str) {
3636
/* convert a string into a ByteArray
3737
*
3838
* TextEncoders would be faster, but have a habit of altering
@@ -46,7 +46,7 @@ class MozCommon {
4646
return reply;
4747
}
4848

49-
_arrayToStr(array) {
49+
arrayToStr(array) {
5050
/* convert a ByteArray into a string
5151
*/
5252
return String.fromCharCode.apply(null, new Uint8Array(array));
@@ -56,18 +56,16 @@ class MozCommon {
5656
/* convert a URL safe base64 raw key to jwk format
5757
*/
5858
if (typeof(raw) == "string") {
59-
raw = this._strToArray(this.fromUrlBase64(raw));
59+
raw = this.strToArray(this.fromUrlBase64(raw));
6060
}
6161
// Raw is supposed to start with a 0x04, but some libraries don't. sigh.
6262
if (raw.length == 65 && raw[0] != 4) {
6363
throw new Error('ERR_PUB_KEY');
6464
}
6565

66-
raw= raw.slice(-64);
67-
let x = this.toUrlBase64(String.fromCharCode.apply(null,
68-
raw.slice(0,32)));
69-
let y = this.toUrlBase64(String.fromCharCode.apply(null,
70-
raw.slice(32,64)));
66+
raw = raw.slice(-64);
67+
let x = this.toUrlBase64(this.arrayToStr(raw.slice(0,32)));
68+
let y = this.toUrlBase64(this.arrayToSTr(raw.slice(32,64)));
7169

7270
// Convert to a JWK and import it.
7371
let jwk = {
@@ -85,8 +83,8 @@ class MozCommon {
8583
JWKToRaw(jwk) {
8684
/* Convert a JWK object to a "raw" URL Safe base64 string
8785
*/
88-
xv = this.fromUrlBase64(jwk.x);
89-
yv = this.fromUrlBase64(jwk.y);
86+
let xv = this.fromUrlBase64(jwk.x);
87+
let yv = this.fromUrlBase64(jwk.y);
9088
return this.toUrlBase64("\x04" + xv + yv);
9189
}
9290
}

js/der_lite.js

Lines changed: 27 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
'use strict';
22

33
class DERLite{
4-
constructor() {}
4+
constructor(mzcc) {
5+
if (mzcc === undefined) {
6+
mzcc = new MozCommon();
7+
}
8+
this.mzcc = mzcc
9+
}
510

611
/* Simplified DER export and import is provided because a large number of
712
* libraries and languages understand DER as a key exchange and storage
@@ -25,29 +30,29 @@ class DERLite{
2530
return webCrypto.exportKey("jwk", key)
2631
.then(k => {
2732
// verifying key
28-
let xv = mzcc.fromUrlBase64(k.x);
29-
let yv = mzcc.fromUrlBase64(k.y);
33+
let xv = this.mzcc.fromUrlBase64(k.x);
34+
let yv = this.mzcc.fromUrlBase64(k.y);
3035
// private key
31-
let dv = mzcc.fromUrlBase64(k.d);
36+
let dv = this.mzcc.fromUrlBase64(k.d);
3237

3338
// verifying key (public)
3439
let vk = '\x00\x04' + xv + yv;
3540
// \x02 is integer
3641
let int1 = '\x02\x01\x01'; // integer 1
3742
// \x04 is octet string
38-
let dvstr = '\x04' + mzcc.chr(dv.length) + dv;
43+
let dvstr = '\x04' + this.mzcc.chr(dv.length) + dv;
3944
let curve_oid = "\x06\x08" +
4045
"\x2a\x86\x48\xce\x3d\x03\x01\x07";
4146
// \xaX is a construct, low byte is order.
42-
let curve_oid_const = '\xa0' + mzcc.chr(curve_oid.length) +
47+
let curve_oid_const = '\xa0' + this.mzcc.chr(curve_oid.length) +
4348
curve_oid;
4449
// \x03 is a bitstring
45-
let vk_enc = '\x03' + mzcc.chr(vk.length) + vk;
46-
let vk_const = '\xa1' + mzcc.chr(vk_enc.length) + vk_enc;
50+
let vk_enc = '\x03' + this.mzcc.chr(vk.length) + vk;
51+
let vk_const = '\xa1' + this.mzcc.chr(vk_enc.length) + vk_enc;
4752
// \x30 is a sequence start.
4853
let seq = int1 + dvstr + curve_oid_const + vk_const;
49-
let rder = "\x30" + mzcc.chr(seq.length) + seq;
50-
return mzcc.toUrlBase64(rder);
54+
let rder = "\x30" + this.mzcc.chr(seq.length) + seq;
55+
return this.mzcc.toUrlBase64(rder);
5156
})
5257
.catch(err => console.error(err))
5358
}
@@ -59,7 +64,7 @@ class DERLite{
5964
* :param der_str: URL safe base64 formatted DER string.
6065
* :returns: Promise containing the imported private key
6166
*/
62-
let der = mzcc._strToArray(mzcc.fromUrlBase64(der_str));
67+
let der = this.mzcc.strToArray(this.mzcc.fromUrlBase64(der_str));
6368
// quick guantlet to see if this is a valid DER
6469
let cmp = new Uint8Array([2,1,1,4]);
6570
if (der[0] != 48 ||
@@ -77,9 +82,9 @@ class DERLite{
7782
ext: true,
7883
key_ops: key_ops,
7984
kty: "EC",
80-
x: mzcc.toUrlBase64(String.fromCharCode.apply(null, xv)),
81-
y: mzcc.toUrlBase64(String.fromCharCode.apply(null, yv)),
82-
d: mzcc.toUrlBase64(String.fromCharCode.apply(null, dv)),
85+
x: this.mzcc.toUrlBase64(String.fromCharCode.apply(null, xv)),
86+
y: this.mzcc.toUrlBase64(String.fromCharCode.apply(null, yv)),
87+
d: this.mzcc.toUrlBase64(String.fromCharCode.apply(null, dv)),
8388
};
8489

8590
console.debug(JSON.stringify(jwk));
@@ -96,8 +101,8 @@ class DERLite{
96101
return webCrypto.exportKey("jwk", key)
97102
.then(k => {
98103
// raw keys always begin with a 4
99-
let xv = mzcc._strToArray(mzcc.fromUrlBase64(k.x));
100-
let yv = mzcc._strToArray(mzcc.fromUrlBase64(k.y));
104+
let xv = this.mzcc.strToArray(this.mzcc.fromUrlBase64(k.x));
105+
let yv = this.mzcc.strToArray(this.mzcc.fromUrlBase64(k.y));
101106

102107
let point = "\x00\x04" +
103108
String.fromCharCode.apply(null, xv) +
@@ -107,10 +112,10 @@ class DERLite{
107112
let prefix = "\x30\x13" + // sequence + length
108113
"\x06\x07" + "\x2a\x86\x48\xce\x3d\x02\x01" +
109114
"\x06\x08" + "\x2a\x86\x48\xce\x3d\x03\x01\x07"
110-
let encPoint = "\x03" + mzcc.chr(point.length) + point
111-
let rder = "\x30" + mzcc.chr(prefix.length + encPoint.length) +
115+
let encPoint = "\x03" + this.mzcc.chr(point.length) + point
116+
let rder = "\x30" + this.mzcc.chr(prefix.length + encPoint.length) +
112117
prefix + encPoint;
113-
let der = mzcc.toUrlBase64(rder);
118+
let der = this.mzcc.toUrlBase64(rder);
114119
return der;
115120
});
116121
}
@@ -128,7 +133,7 @@ class DERLite{
128133
*
129134
*/
130135
if (typeof(derArray) == "string") {
131-
derArray = mzcc._strToArray(mzcc.fromUrlBase64(derArray));
136+
derArray = this.mzcc.strToArray(this.mzcc.fromUrlBase64(derArray));
132137
}
133138
/* Super light weight public key import function */
134139
let err = new Error(this.lang.errs.ERR_PUB_D_KEY);
@@ -143,9 +148,9 @@ class DERLite{
143148
throw err;
144149
}
145150
// pubkey offset starts at byte 25
146-
let x = mzcc.toUrlBase64(String.fromCharCode
151+
let x = this.mzcc.toUrlBase64(String.fromCharCode
147152
.apply(null, derArray.slice(27, 27+32)));
148-
let y = mzcc.toUrlBase64(String.fromCharCode
153+
let y = this.mzcc.toUrlBase64(String.fromCharCode
149154
.apply(null, derArray.slice(27+32, 27+64)));
150155

151156
// Convert to a JWK and import it.

js/vapid.js

Lines changed: 29 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/* Javascript VAPID library.
22
*
3-
* Requires: common.js :: mzcc
3+
* Requires: common.js
44
*
55
*/
66

@@ -14,9 +14,8 @@ try {
1414
var webCrypto = window.crypto.subtle;
1515
}
1616

17-
1817
class VapidToken {
19-
constructor(aud, sub, exp, lang) {
18+
constructor(aud, sub, exp, lang, mzcc) {
2019
/* Construct a base VAPID token.
2120
*
2221
* VAPID allows for self identification of a subscription update.
@@ -26,6 +25,11 @@ class VapidToken {
2625
* :param exp: Expiration - UTC expiration of this update. Defaults
2726
* to now + 24 hours
2827
*/
28+
29+
if (mzcc == undefined) {
30+
mzcc = new MozCommon();
31+
}
32+
this.mzcc = mzcc;
2933
this._claims={};
3034
this._claims['aud'] = aud || "";
3135
if (sub !== undefined) {
@@ -88,9 +92,9 @@ class VapidToken {
8892
*/
8993
return webCrypto.exportKey('jwk', this._public_key)
9094
.then( key => {
91-
return mzcc.toUrlBase64("\x04" +
92-
mzcc.fromUrlBase64(key.x) +
93-
mzcc.fromUrlBase64(key.y))
95+
return this.mzcc.toUrlBase64("\x04" +
96+
this.mzcc.fromUrlBase64(key.x) +
97+
this.mzcc.fromUrlBase64(key.y))
9498
})
9599
.catch(err => {
96100
console.error("public raw format", err);
@@ -105,7 +109,7 @@ class VapidToken {
105109
* :returns: a promise from the imported key.
106110
*/
107111
if (typeof(raw) == "string") {
108-
raw = mzcc._strToArray(mzcc.fromUrlBase64(raw));
112+
raw = this.mzcc.strToArray(this.mzcc.fromUrlBase64(raw));
109113
}
110114
let err = new Error(this.lang.errs.ERR_PUB_KEY);
111115

@@ -115,9 +119,9 @@ class VapidToken {
115119
}
116120

117121
raw= raw.slice(-64);
118-
let x = mzcc.toUrlBase64(String.fromCharCode.apply(null,
122+
let x = this.mzcc.toUrlBase64(String.fromCharCode.apply(null,
119123
raw.slice(0,32)));
120-
let y = mzcc.toUrlBase64(String.fromCharCode.apply(null,
124+
let y = this.mzcc.toUrlBase64(String.fromCharCode.apply(null,
121125
raw.slice(32,64)));
122126

123127
// Convert to a JWK and import it.
@@ -139,7 +143,7 @@ class VapidToken {
139143
sign(claims) {
140144
/* Sign a claims object and return the headers that can be used to
141145
* decrypt the string.
142-
* *
146+
*
143147
* :param claims: An object containing the VAPID claims.
144148
* :returns: a promise containing an object identifying the headers
145149
* and values to include to specify VAPID auth.
@@ -157,18 +161,19 @@ class VapidToken {
157161
throw new Error(this.lang.errs.ERR_CLAIM_MIS, "aud");
158162
}
159163
let alg = {name:"ECDSA", namedCurve: "P-256", hash:{name:"SHA-256"}};
160-
let headStr = mzcc.toUrlBase64(
164+
let headStr = this.mzcc.toUrlBase64(
161165
JSON.stringify({typ:"JWT",alg:"ES256"}));
162-
let claimStr = mzcc.toUrlBase64(
166+
let claimStr = this.mzcc.toUrlBase64(
163167
JSON.stringify(claims));
164168
let content = headStr + "." + claimStr;
165-
let signatory = mzcc._strToArray(content);
169+
let signatory = this.mzcc.strToArray(content);
166170
return webCrypto.sign(
167171
alg,
168172
this._private_key,
169173
signatory)
170174
.then(signature => {
171-
let sig = mzcc.toUrlBase64(mzcc._arrayToStr(signature));
175+
let sig = this.mzcc.toUrlBase64(
176+
this.mzcc.arrayToStr(signature));
172177
/* The headers consist of the constructed JWT as the
173178
* "authorization" and the raw Public key as the p256ecdsa
174179
* element of "Crypto-Key"
@@ -236,17 +241,18 @@ class VapidToken {
236241
let signature;
237242
let key;
238243
try {
239-
signature = mzcc._strToArray(mzcc.fromUrlBase64(items[2]));
244+
signature = this.mzcc.strToArray(
245+
this.mzcc.fromUrlBase64(items[2]));
240246
} catch (err) {
241247
throw new Error(this.lang.errs.ERR_VERIFY_SG + err.message);
242248
}
243249
try {
244-
key = mzcc._strToArray(mzcc.fromUrlBase64(items[1]));
250+
key = this.mzcc.strToArray(this.mzcc.fromUrlBase64(items[1]));
245251
} catch (err) {
246252
throw new Error(this.lang.errs.ERR_VERIFY_KE + err.message);
247253
}
248254
let content = items.slice(0,2).join('.');
249-
let signatory = mzcc._strToArray(content);
255+
let signatory = this.mzcc.strToArray(content);
250256
return webCrypto.verify(
251257
alg,
252258
this._public_key,
@@ -257,7 +263,8 @@ class VapidToken {
257263
return JSON.parse(
258264
String.fromCharCode.apply(
259265
null,
260-
mzcc._strToArray(mzcc.fromUrlBase64(items[1]))))
266+
this.mzcc.strToArray(
267+
this.mzcc.fromUrlBase64(items[1]))))
261268
}
262269
throw new Error(this.lang.errs.ERR_SIGNATURE);
263270
})
@@ -285,10 +292,10 @@ class VapidToken {
285292
* :returns: the signature value to paste back into the Dashboard.
286293
*/
287294
let alg = {name:"ECDSA", namedCurve: "P-256", hash:{name:"SHA-256"}};
288-
let t2v = mzcc._strToArray(string);
295+
let t2v = this.mzcc.strToArray(string);
289296
return webCrypto.sign(alg, this._private_key, t2v)
290297
.then(signed => {
291-
let sig = mzcc.toUrlBase64(mzcc._arrayToStr(signed));
298+
let sig = this.mzcc.toUrlBase64(this.mzcc.arrayToStr(signed));
292299
return sig;
293300
});
294301
}
@@ -303,8 +310,8 @@ class VapidToken {
303310
* :returns: Boolean indicating successful verification.
304311
*/
305312
let alg = {name: "ECDSA", namedCurve: "P-256", hash:{name:"SHA-256"}};
306-
let vsig = mzcc._strToArray(mzcc.fromUrlBase64(sig));
307-
let t2v = mzcc._strToArray(mzcc.fromUrlBase64(string));
313+
let vsig = this.mzcc.strToArray(this.mzcc.fromUrlBase64(sig));
314+
let t2v = this.mzcc.strToArray(this.mzcc.fromUrlBase64(string));
308315
return webCrypto.verify(alg, this._public_key, vsig, t2v);
309316
}
310317
}

0 commit comments

Comments
 (0)