@@ -14,30 +14,37 @@ function hmacSignFN(name) {
14
14
var md = name . replace ( "HS" , "SHA" ) . toLowerCase ( ) ,
15
15
hash = name . replace ( "HS" , "SHA-" ) ;
16
16
17
- // ### Fallback Implementation -- uses forge
18
- var fallback = function ( key , pdata , props ) {
19
- props = props || { } ;
20
- if ( ! props . loose && CONSTANTS . HASHLENGTH [ hash ] > ( key . length << 3 ) ) {
17
+ function checkKeyLength ( len , key ) {
18
+ len = ( len || CONSTANTS . HASHLENGTH [ hash ] ) / 8 ;
19
+ if ( len > key . length ) {
21
20
return Promise . reject ( new Error ( "invalid key length" ) ) ;
22
21
}
23
22
24
- var sig = forge . hmac . create ( ) ;
25
- sig . start ( md , key . toString ( "binary" ) ) ;
26
- sig . update ( pdata ) ;
27
- sig = sig . digest ( ) . native ( ) ;
23
+ return Promise . resolve ( key ) ;
24
+ }
28
25
29
- return Promise . resolve ( {
30
- data : pdata ,
31
- mac : sig
26
+ // ### Fallback Implementation -- uses forge
27
+ var fallback = function ( key , pdata , props ) {
28
+ props = props || { } ;
29
+ var promise ;
30
+ promise = checkKeyLength ( props . length , key ) ;
31
+ promise = p . then ( function ( ) {
32
+ var sig = forge . hmac . create ( ) ;
33
+ sig . start ( md , key . toString ( "binary" ) ) ;
34
+ sig . update ( pdata ) ;
35
+ sig = sig . digest ( ) . native ( ) ;
36
+
37
+ return {
38
+ data : pdata ,
39
+ mac : sig
40
+ }
32
41
} ) ;
42
+ return p ;
33
43
} ;
34
44
35
45
// ### WebCryptoAPI Implementation
36
46
var webcrypto = function ( key , pdata , props ) {
37
47
props = props || { } ;
38
- if ( ! props . loose && CONSTANTS . HASHLENGTH [ hash ] > ( key . length << 3 ) ) {
39
- return Promise . reject ( new Error ( "invalid key length" ) ) ;
40
- }
41
48
42
49
var alg = {
43
50
name : "HMAC" ,
@@ -46,7 +53,10 @@ function hmacSignFN(name) {
46
53
}
47
54
} ;
48
55
var promise ;
49
- promise = helpers . subtleCrypto . importKey ( "raw" , key , alg , true , [ "sign" ] ) ;
56
+ promise = checkKeyLength ( props . length , key ) ;
57
+ promise = promise . then ( function ( ) {
58
+ return helpers . subtleCrypto . importKey ( "raw" , key , alg , true , [ "sign" ] ) ;
59
+ } ) ;
50
60
promise = promise . then ( function ( key ) {
51
61
return helpers . subtleCrypto . sign ( alg , key , pdata ) ;
52
62
} ) ;
@@ -64,18 +74,20 @@ function hmacSignFN(name) {
64
74
// ### NodeJS implementation
65
75
var nodejs = function ( key , pdata , props ) {
66
76
props = props || { } ;
67
- if ( ! props . loose && CONSTANTS . HASHLENGTH [ hash ] > ( key . length << 3 ) ) {
68
- return Promise . reject ( new Error ( "invalid key length" ) ) ;
69
- }
70
77
71
- var hmac = helpers . nodeCrypto . createHmac ( md , key ) ;
72
- hmac . update ( pdata ) ;
78
+ var promise ;
79
+ promise = checkKeyLength ( props . length , key ) ;
80
+ promise = promise . then ( function ( ) {
81
+ var hmac = helpers . nodeCrypto . createHmac ( md , key ) ;
82
+ hmac . update ( pdata ) ;
73
83
74
- var sig = hmac . digest ( ) ;
75
- return {
76
- data : pdata ,
77
- mac : sig
78
- } ;
84
+ var sig = hmac . digest ( ) ;
85
+ return {
86
+ data : pdata ,
87
+ mac : sig
88
+ } ;
89
+ } ) ;
90
+ return promise ;
79
91
} ;
80
92
81
93
return helpers . setupFallback ( nodejs , webcrypto , fallback ) ;
@@ -85,9 +97,9 @@ function hmacVerifyFN(name) {
85
97
var md = name . replace ( "HS" , "SHA" ) . toLowerCase ( ) ,
86
98
hash = name . replace ( "HS" , "SHA-" ) ;
87
99
88
- function compare ( loose , expected , actual ) {
89
- var len = loose ? expected . length : CONSTANTS . HASHLENGTH [ hash ] / 8 ,
90
- valid = true ;
100
+ function compare ( len , expected , actual ) {
101
+ len = ( len || CONSTANTS . HASHLENGTH [ hash ] ) / 8 ;
102
+ var valid = true ;
91
103
for ( var idx = 0 ; len > idx ; idx ++ ) {
92
104
valid = valid && ( expected [ idx ] === actual [ idx ] ) ;
93
105
}
@@ -97,16 +109,13 @@ function hmacVerifyFN(name) {
97
109
// ### Fallback Implementation -- uses forge
98
110
var fallback = function ( key , pdata , mac , props ) {
99
111
props = props || { } ;
100
- if ( ! props . loose && CONSTANTS . HASHLENGTH [ hash ] > ( key . length << 3 ) ) {
101
- return Promise . reject ( new Error ( "invalid key length" ) ) ;
102
- }
103
112
104
113
var vrfy = forge . hmac . create ( ) ;
105
114
vrfy . start ( md , new DataBuffer ( key ) ) ;
106
115
vrfy . update ( pdata ) ;
107
116
vrfy = vrfy . digest ( ) . native ( ) ;
108
117
109
- if ( compare ( props . loose , mac , vrfy ) ) {
118
+ if ( compare ( props . length , mac , vrfy ) ) {
110
119
return Promise . resolve ( {
111
120
data : pdata ,
112
121
mac : mac ,
@@ -119,9 +128,6 @@ function hmacVerifyFN(name) {
119
128
120
129
var webcrypto = function ( key , pdata , mac , props ) {
121
130
props = props || { } ;
122
- if ( ! props . loose && CONSTANTS . HASHLENGTH [ hash ] > ( key . length << 3 ) ) {
123
- return Promise . reject ( new Error ( "invalid key length" ) ) ;
124
- }
125
131
126
132
var alg = {
127
133
name : "HMAC" ,
@@ -130,14 +136,14 @@ function hmacVerifyFN(name) {
130
136
}
131
137
} ;
132
138
var promise ;
133
- if ( props . loose ) {
139
+ if ( props . length ) {
134
140
promise = helpers . subtleCrypto . importKey ( "raw" , key , alg , true , [ "sign" ] ) ;
135
141
promise = promise . then ( function ( key ) {
136
142
return helpers . subtleCrypto . sign ( alg , key , pdata ) ;
137
143
} ) ;
138
144
promise = promise . then ( function ( result ) {
139
145
var sig = new Buffer ( result ) ;
140
- return compare ( true , mac , sig ) ;
146
+ return compare ( props . length , mac , sig ) ;
141
147
} ) ;
142
148
} else {
143
149
promise = helpers . subtleCrypto . importKey ( "raw" , key , alg , true , [ "verify" ] ) ;
@@ -162,15 +168,12 @@ function hmacVerifyFN(name) {
162
168
163
169
var nodejs = function ( key , pdata , mac , props ) {
164
170
props = props || { } ;
165
- if ( ! props . loose && CONSTANTS . HASHLENGTH [ hash ] > ( key . length << 3 ) ) {
166
- return Promise . reject ( new Error ( "invalid key length" ) ) ;
167
- }
168
171
169
172
var hmac = helpers . nodeCrypto . createHmac ( md , key ) ;
170
173
hmac . update ( pdata ) ;
171
174
172
175
var sig = hmac . digest ( ) ;
173
- if ( ! compare ( props . loose , mac , sig ) ) {
176
+ if ( ! compare ( props . length , mac , sig ) ) {
174
177
throw new Error ( "verification failed" ) ;
175
178
}
176
179
return {
0 commit comments