@@ -91,48 +91,36 @@ describe('JWE', () => {
9191 } ) ;
9292
9393 describe ( 'ECDH_ES' , ( ) => {
94- /**
95- * Test vectors from https://www.rfc-editor.org/rfc/rfc7518#appendix-C
96- */
97- it ( 'should derive expected key using ECDH-ES' , async ( ) => {
98- const alicePub : JsonWebKey = {
99- kty : 'EC' ,
100- crv : 'P-256' ,
101- x : 'gI0GAILBdu7T53akrFmMyGcsF3n5dO7MmwNBHKW5SV0' ,
102- y : 'SLW_xSffzlPWrHEVI30DHM_4egVwt3NQqeUD7nMFpps'
103- } ;
104- const alicePriv : JsonWebKey = {
105- ... alicePub ,
106- d : '0_NxaRPUMQoAJt50Gz8YiTr8gRTwyEaCumd-MToTmIo'
107- } ;
108- const alice = await crypto . subtle . importKey (
109- 'jwk ',
110- alicePriv ,
111- {
112- name : 'ECDH' ,
113- namedCurve : 'P-256'
114- } ,
115- false ,
116- [ 'deriveBits' ]
117- ) ;
94+ // Test vectors from https://www.rfc-editor.org/rfc/rfc7518#appendix-C
95+ const alicePub : JsonWebKey = {
96+ kty : 'EC' ,
97+ crv : 'P-256' ,
98+ x : 'gI0GAILBdu7T53akrFmMyGcsF3n5dO7MmwNBHKW5SV0' ,
99+ y : 'SLW_xSffzlPWrHEVI30DHM_4egVwt3NQqeUD7nMFpps'
100+ } ;
101+ const alicePriv : JsonWebKey = {
102+ ... alicePub ,
103+ d : '0_NxaRPUMQoAJt50Gz8YiTr8gRTwyEaCumd-MToTmIo'
104+ } ;
105+ let alice : CryptoKey ;
106+ const bobPub : JsonWebKey = {
107+ kty : 'EC' ,
108+ crv : 'P-256' ,
109+ x : 'weNJy2HscCSM6AEDTDg04biOvhFhyyWvOHQfeF_PxMQ ',
110+ y : 'e8lnCO-AlStT-NJVX-crhB7QRYhiix03illJOVAOyck'
111+ } ;
112+ let bob : CryptoKey ;
113+
114+ beforeEach ( async ( ) => {
115+ const importParams : EcKeyImportParams = { name : 'ECDH' , namedCurve : 'P-256' } ;
116+ alice = await crypto . subtle . importKey ( 'jwk' , alicePriv , importParams , false , [ 'deriveBits' ] ) ;
117+ bob = await crypto . subtle . importKey ( 'jwk' , bobPub , importParams , false , [ ] ) ;
118118 expect ( alice . type , 'alice\'s key type' ) . to . eql ( 'private' ) ;
119- const bob = await crypto . subtle . importKey (
120- 'jwk' ,
121- {
122- kty : 'EC' ,
123- crv : 'P-256' ,
124- x : 'weNJy2HscCSM6AEDTDg04biOvhFhyyWvOHQfeF_PxMQ' ,
125- y : 'e8lnCO-AlStT-NJVX-crhB7QRYhiix03illJOVAOyck'
126- } ,
127- {
128- name : 'ECDH' ,
129- namedCurve : 'P-256'
130- } ,
131- false ,
132- [ ]
133- ) ;
134119 expect ( bob . type , 'bob\'s key type' ) . to . eql ( 'public' ) ;
120+ } ) ;
135121
122+ it ( 'should derive expected key using ECDH-ES' , async ( ) => {
123+ // Test vectors from https://www.rfc-editor.org/rfc/rfc7518#appendix-C
136124 const apu = new Uint8Array ( [ 65 , 108 , 105 , 99 , 101 ] ) ;
137125 const apv = new Uint8Array ( [ 66 , 111 , 98 ] ) ;
138126 const header : JWEHeader = {
@@ -146,5 +134,18 @@ describe('JWE', () => {
146134 const derivedBytes = await crypto . subtle . exportKey ( 'raw' , derived ) ;
147135 expect ( new Uint8Array ( derivedBytes ) , 'derived key' ) . to . eql ( new Uint8Array ( [ 86 , 170 , 141 , 234 , 248 , 35 , 109 , 32 , 92 , 34 , 40 , 205 , 113 , 167 , 16 , 26 ] ) ) ;
148136 } ) ;
137+
138+ it ( 'should derive content key despite missing apu/apv' , async ( ) => {
139+ const header : JWEHeader = {
140+ alg : 'ECDH-ES' , // not relevant for this test
141+ enc : 'A128GCM' ,
142+ epk : alicePub ,
143+ apu : undefined ,
144+ apv : undefined
145+ } ;
146+ const derived = await ECDH_ES . deriveContentKey ( bob , alice , 256 , 16 , header , true ) ;
147+ const derivedBytes = await crypto . subtle . exportKey ( 'raw' , derived ) ;
148+ expect ( new Uint8Array ( derivedBytes ) , 'derived key' ) . to . eql ( new Uint8Array ( [ 187 , 151 , 171 , 93 , 14 , 133 , 109 , 143 , 143 , 192 , 62 , 38 , 91 , 36 , 42 , 125 ] ) ) ;
149+ } ) ;
149150 } ) ;
150151} ) ;
0 commit comments