@@ -23,6 +23,53 @@ function define_tests() {
2323 "X448" : new Uint8Array ( [ 240 , 246 , 197 , 241 , 127 , 148 , 244 , 41 , 30 , 171 , 113 , 120 , 134 , 109 , 55 , 236 , 137 , 6 , 221 , 108 , 81 , 65 , 67 , 220 , 133 , 190 , 124 , 242 , 141 , 239 , 243 , 155 , 114 , 110 , 15 , 109 , 207 , 129 , 14 , 181 , 148 , 220 , 169 , 123 , 72 , 130 , 189 , 68 , 196 , 62 , 167 , 220 , 103 , 244 , 154 , 78 ] )
2424 } ;
2525
26+ var kSmallOrderPoint = {
27+ "X25519" : [
28+ { order : "0" , vector : new Uint8Array ( [ 48 , 42 , 48 , 5 , 6 , 3 , 43 , 101 , 110 , 3 , 33 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ] ) } ,
29+ { order : "1" , vector : new Uint8Array ( [ 48 , 42 , 48 , 5 , 6 , 3 , 43 , 101 , 110 , 3 , 33 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ] ) } ,
30+ { order : "8" , vector : new Uint8Array ( [ 48 , 42 , 48 , 5 , 6 , 3 , 43 , 101 , 110 , 3 , 33 , 0 , 224 , 235 , 122 , 124 , 59 , 65 , 184 , 174 , 22 , 86 , 227 , 250 , 241 , 159 , 196 , 106 , 218 , 9 , 141 , 235 , 156 , 50 , 177 , 253 , 134 , 98 , 5 , 22 , 95 , 73 , 184 , 0 ] ) } ,
31+ { order : "p-1 (order 2)" , vector : new Uint8Array ( [ 48 , 42 , 48 , 5 , 6 , 3 , 43 , 101 , 110 , 3 , 33 , 0 , 236 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 127 ] ) } ,
32+ { order : "p (=0, order 4)" , vector : new Uint8Array ( [ 48 , 42 , 48 , 5 , 6 , 3 , 43 , 101 , 110 , 3 , 33 , 0 , 237 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 127 ] ) } ,
33+ { order : "p+1 (=1, order 1)" , vector : new Uint8Array ( [ 48 , 42 , 48 , 5 , 6 , 3 , 43 , 101 , 110 , 3 , 33 , 0 , 238 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 127 ] ) } ,
34+ ] ,
35+ "X448" : [
36+ { order : "0" , vector : new Uint8Array ( [ 48 , 66 , 48 , 5 , 6 , 3 , 43 , 101 , 111 , 3 , 57 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ] ) } ,
37+ { order : "1" , vector : new Uint8Array ( [ 48 , 66 , 48 , 5 , 6 , 3 , 43 , 101 , 111 , 3 , 57 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ] ) } ,
38+ { order : "p-1 (order 2)" , vector : new Uint8Array ( [ 48 , 66 , 48 , 5 , 6 , 3 , 43 , 101 , 111 , 3 , 57 , 0 , 254 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 254 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 ] ) } ,
39+ { order : "p (=0, order 4)" , vector : new Uint8Array ( [ 48 , 66 , 48 , 5 , 6 , 3 , 43 , 101 , 111 , 3 , 57 , 0 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 254 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 ] ) } ,
40+ { order : "p+1 (=1, order 1)" , vector : new Uint8Array ( [ 48 , 66 , 48 , 5 , 6 , 3 , 43 , 101 , 111 , 3 , 57 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 ] ) } ,
41+ ]
42+ } ;
43+
44+ // Verify the derive functions perform checks against the all-zero value results,
45+ // ensuring small-order points are rejected.
46+ // https://www.rfc-editor.org/rfc/rfc7748#section-6.1
47+ // TODO: The spec states that the check must be done on use, but there is discussion about doing it on import.
48+ // https://github.com/WICG/webcrypto-secure-curves/pull/13
49+ Object . keys ( kSmallOrderPoint ) . forEach ( function ( algorithmName ) {
50+ kSmallOrderPoint [ algorithmName ] . forEach ( function ( test ) {
51+ promise_test ( async ( ) => {
52+ let derived ;
53+ let privateKey = await subtle . importKey ( "pkcs8" , pkcs8 [ algorithmName ] ,
54+ { name : algorithmName } ,
55+ false , [ "deriveBits" , "deriveKey" ] ) ;
56+ let publicKey = await subtle . importKey ( "spki" , test . vector ,
57+ { name : algorithmName } ,
58+ false , [ ] )
59+ try {
60+ derived = await subtle . deriveKey ( { name : algorithmName , public : publicKey } , privateKey ,
61+ { name : "HMAC" , hash : "SHA-256" , length : 256 } , true ,
62+ [ "sign" , "verify" ] ) ;
63+ } catch ( err ) {
64+ assert_false ( privateKey === undefined , "Private key should be valid." ) ;
65+ assert_false ( publicKey === undefined , "Public key should be valid." ) ;
66+ assert_equals ( err . name , "OperationError" , "Should throw correct error, not " + err . name + ": " + err . message + "." ) ;
67+ }
68+ assert_equals ( derived , undefined , "Operation succeeded, but should not have." ) ;
69+ } , algorithmName + " key derivation checks for all-zero value result with a key of order " + test . order ) ;
70+ } ) ;
71+ } ) ;
72+
2673 return importKeys ( pkcs8 , spki , sizes )
2774 . then ( function ( results ) {
2875 publicKeys = results . publicKeys ;
0 commit comments