44// SHA-256/SHA-512 test vectors from:
55// https://stackoverflow.com/questions/5130513/pbkdf2-hmac-sha2-test-vectors
66// https://stackoverflow.com/questions/15593184/pbkdf2-hmac-sha-512-test-vectors
7- var fixtures = require ( './fixtures' ) ;
87var tape = require ( 'tape' ) ;
98var satisfies = require ( 'semver' ) . satisfies ;
109var Buffer = require ( 'safe-buffer' ) . Buffer ;
1110
1211var node = require ( 'crypto' ) ;
12+
13+ var fixtures = require ( './fixtures' ) ;
1314var js = require ( '../browser' ) ;
1415var browserImpl = require ( '../lib/sync-browser' ) ;
1516
@@ -173,19 +174,26 @@ function runTests(name, compat) {
173174var description = algorithm + ' encodes "' + key + '" (' + keyType + ') with salt "' + salt + '" (' + saltType + ') with ' + algorithm + ' to ' + expected ;
174175
175176t . test ( name + ' async w/ ' + description , function ( st ) {
176- st . plan ( 2 ) ;
177+ st . plan ( 3 ) ;
177178
178179compat . pbkdf2 ( key , salt , f . iterations , f . dkLen , algorithm , function ( err , result ) {
179180st . error ( err ) ;
180- st . equal ( result . toString ( 'hex' ) , expected ) ;
181+
182+ var hash = result . toString ( 'hex' ) ;
183+
184+ st . doesNotMatch ( hash , / ^ 0 + $ / , 'is not the all-zeroes result' ) ;
185+ st . equal ( hash , expected ) ;
181186} ) ;
182187} ) ;
183188
184189t . test ( name + 'sync w/ ' + description , function ( st ) {
185- st . plan ( 1 ) ;
190+ st . plan ( 2 ) ;
186191
187192var result = compat . pbkdf2Sync ( key , salt , f . iterations , f . dkLen , algorithm ) ;
188- st . equal ( result . toString ( 'hex' ) , expected ) ;
193+ var hash = result . toString ( 'hex' ) ;
194+
195+ st . doesNotMatch ( hash , / ^ 0 + $ / , 'is not the all-zeroes result' ) ;
196+ st . equal ( hash , expected ) ;
189197} ) ;
190198} ) ;
191199
@@ -238,6 +246,7 @@ tape('does not return all zeroes for any algorithm', function (t) {
238246var throwCount = 0 ;
239247var impls = { __proto__ : null , node : node . pbkdf2Sync , lib : js . pbkdf2Sync , browser : browserImpl } ;
240248var results = { __proto__ : null } ;
249+ var throws = { __proto__ : null } ;
241250for ( var implName in impls ) { // eslint-disable-line no-restricted-syntax
242251var pbkdf2Sync = impls [ implName ] ;
243252try {
@@ -246,13 +255,15 @@ tape('does not return all zeroes for any algorithm', function (t) {
246255t . doesNotMatch ( key , / ^ 0 + $ / , implName + ' does not return all zeros for ' + algo ) ;
247256} catch ( e ) {
248257throwCount += 1 ;
258+ throws [ implName ] = true ;
249259t . ok ( e , implName + ' throws for ' + algo ) ;
250260t . comment ( e ) ;
251261}
252262}
253263
254264if ( throwCount === 0 ) {
255265t . equal ( throwCount , 0 , 'all implementations return a value for ' + algo ) ;
266+ t . deepEqual ( throws , { __proto__ : null } , 'no implementations throw for ' + algo ) ;
256267t . equal (
257268results . node ,
258269results . lib ,
@@ -265,9 +276,47 @@ tape('does not return all zeroes for any algorithm', function (t) {
265276'node and browser pbkdf2Sync should return the same value for ' + algo
266277) ;
267278} else {
268- t . equal (
269- throwCount ,
270- 3 ,
279+ var expected = {
280+ __proto__ : null ,
281+ node : true ,
282+ lib : true ,
283+ browser : true
284+ } ;
285+ if (
286+ ( algo . toLowerCase ( ) === 'ripemd-160' || algo . toLowerCase ( ) === 'rmd160' )
287+ && satisfies ( process . version , '< 18' ) // node < 18 doesn't support ripemd160
288+ ) {
289+ if ( ! throws . browser ) {
290+ delete expected . browser ;
291+ }
292+ if ( ! throws . lib ) {
293+ delete expected . lib ;
294+ }
295+ }
296+
297+ if (
298+ algo . toLowerCase ( ) === 'sha-1'
299+ && satisfies ( process . version , '< 17' ) // node < 17 doesn't support "sha-1"
300+ && ! throws . lib
301+ && ! throws . browser
302+ ) {
303+ delete expected . lib ;
304+ delete expected . browser ;
305+ }
306+
307+ if (
308+ ( algo . toLowerCase ( ) === 'sha256' || algo . toLowerCase ( ) === 'sha512' )
309+ && satisfies ( process . version , '< 10' ) // node < 10 doesn't support "sha256" or "sha512"
310+ && ! throws . lib
311+ && ! throws . browser
312+ ) {
313+ delete expected . lib ;
314+ delete expected . browser ;
315+ }
316+
317+ t . deepEqual (
318+ throws ,
319+ expected ,
271320'all implementations throw for ' + algo ,
272321{ todo : throwCount === 1 && algo === 'sha512-256' && 'sha.js does not yet support sha512-256' }
273322) ;
0 commit comments