@@ -9,7 +9,7 @@ const exec = require('child_process').exec;
99const  crypto  =  require ( 'crypto' ) ; 
1010const  fixtures  =  require ( '../common/fixtures' ) ; 
1111const  { 
12-   hasOpenSSL3 , 
12+   hasOpenSSL , 
1313  opensslCli, 
1414}  =  require ( '../common/crypto' ) ; 
1515
@@ -66,7 +66,7 @@ const keySize = 2048;
6666        key : keyPem , 
6767        padding : crypto . constants . RSA_PKCS1_OAEP_PADDING 
6868      } ) ; 
69-   } ,  {  message : hasOpenSSL3  ?
69+   } ,  {  message : hasOpenSSL ( 3 )  ?
7070    'error:1C8000A5:Provider routines::illegal or unsupported padding mode'  :
7171    'bye, bye, error stack'  } ) ; 
7272
@@ -344,7 +344,7 @@ assert.throws(
344344        key : keyPem , 
345345        padding : crypto . constants . RSA_PKCS1_OAEP_PADDING 
346346      } ) ; 
347-   } ,  hasOpenSSL3  ? { 
347+   } ,  hasOpenSSL ( 3 )  ? { 
348348    code : 'ERR_OSSL_ILLEGAL_OR_UNSUPPORTED_PADDING_MODE' , 
349349    message : / i l l e g a l   o r   u n s u p p o r t e d   p a d d i n g   m o d e / , 
350350  }  : { 
@@ -426,6 +426,7 @@ assert.throws(
426426  {  private : fixtures . readKey ( 'ed448_private.pem' ,  'ascii' ) , 
427427    public : fixtures . readKey ( 'ed448_public.pem' ,  'ascii' ) , 
428428    algo : null , 
429+     supportsContext : true , 
429430    sigLen : 114  } , 
430431  {  private : fixtures . readKey ( 'rsa_private_2048.pem' ,  'ascii' ) , 
431432    public : fixtures . readKey ( 'rsa_public_2048.pem' ,  'ascii' ) , 
@@ -473,6 +474,55 @@ assert.throws(
473474    assert . strictEqual ( crypto . verify ( algo ,  data ,  pair . private ,  sig ) , 
474475                       true ) ; 
475476  } ) ; 
477+ 
478+   if  ( pair . supportsContext  &&  hasOpenSSL ( 3 ,  2 ) )  { 
479+     const  data  =  Buffer . from ( 'Hello world' ) ; 
480+     { 
481+       const  context  =  new  Uint8Array ( ) ; 
482+       const  sig  =  crypto . sign ( algo ,  data ,  {  key : pair . private ,  context } ) ; 
483+       assert . strictEqual ( crypto . verify ( algo ,  data ,  {  key : pair . public  } ,  sig ) ,  true ) ; 
484+       assert . strictEqual ( crypto . verify ( algo ,  data ,  {  key : pair . public ,  context } ,  sig ) ,  true ) ; 
485+       assert . strictEqual ( crypto . verify ( algo ,  data ,  {  key : pair . public ,  context : crypto . randomBytes ( 30 )  } ,  sig ) ,  false ) ; 
486+     } 
487+ 
488+     { 
489+       const  context  =  new  Uint8Array ( 32 ) ; 
490+       const  sig  =  crypto . sign ( algo ,  data ,  {  key : pair . private ,  context } ) ; 
491+       assert . strictEqual ( crypto . verify ( algo ,  data ,  {  key : pair . public  } ,  sig ) ,  false ) ; 
492+       assert . strictEqual ( crypto . verify ( algo ,  data ,  {  key : pair . public ,  context } ,  sig ) ,  true ) ; 
493+       assert . strictEqual ( crypto . verify ( algo ,  data ,  {  key : pair . public ,  context : crypto . randomBytes ( 30 )  } ,  sig ) ,  false ) ; 
494+     } 
495+ 
496+     assert . throws ( ( )  =>  crypto . sign ( algo ,  data ,  {  key : pair . private ,  context : new  Uint8Array ( 256 )  } ) ,  { 
497+       code : 'ERR_OUT_OF_RANGE' , 
498+       message : 'context string must be at most 255 bytes' , 
499+     } ) ; 
500+ 
501+     assert . throws ( ( )  =>  { 
502+       crypto . verify ( algo ,  data ,  {  key : pair . public ,  context : new  Uint8Array ( 256 )  } ,  new  Uint8Array ( ) ) ; 
503+     } ,  { 
504+       code : 'ERR_OUT_OF_RANGE' , 
505+       message : 'context string must be at most 255 bytes' , 
506+     } ) ; 
507+   }  else  if  ( pair . supportsContext )  { 
508+     const  data  =  Buffer . from ( 'Hello world' ) ; 
509+     { 
510+       const  context  =  new  Uint8Array ( ) ; 
511+       const  sig  =  crypto . sign ( algo ,  data ,  {  key : pair . private ,  context } ) ; 
512+       assert . strictEqual ( crypto . verify ( algo ,  data ,  {  key : pair . public  } ,  sig ) ,  true ) ; 
513+       assert . strictEqual ( crypto . verify ( algo ,  data ,  {  key : pair . public ,  context } ,  sig ) ,  true ) ; 
514+     } 
515+ 
516+     { 
517+       const  context  =  new  Uint8Array ( 32 ) ; 
518+       assert . throws ( ( )  =>  { 
519+         crypto . sign ( algo ,  data ,  {  key : pair . private ,  context } ) ; 
520+       } ,  {  message : 'Context parameter is unsupported'  } ) ; 
521+       assert . throws ( ( )  =>  { 
522+         crypto . verify ( algo ,  data ,  {  key : pair . public ,  context : crypto . randomBytes ( 30 )  } ,  crypto . randomBytes ( 32 ) ) ; 
523+       } ,  {  message : 'Context parameter is unsupported'  } ) ; 
524+     } 
525+   } 
476526} ) ; 
477527
478528[ 1 ,  { } ,  [ ] ,  true ,  Infinity ] . forEach ( ( input )  =>  { 
0 commit comments