11import { test } from '../util' ;
22import { expect } from 'chai' ;
33import { subtle , getRandomValues } from 'react-native-quick-crypto' ;
4- import { CryptoKey } from 'react-native-quick-crypto' ;
5-
6- // eslint-disable-next-line @typescript-eslint/no-explicit-any
7- const subtleAny = subtle as any ;
4+ import type { CryptoKey , CryptoKeyPair } from 'react-native-quick-crypto' ;
85
96const SUITE = 'subtle.wrapKey/unwrapKey' ;
107
@@ -22,14 +19,14 @@ test(SUITE, 'wrap/unwrap AES-256 with AES-KW', async () => {
2219 [ 'wrapKey' , 'unwrapKey' ] ,
2320 ) ;
2421
25- const wrapped = await subtleAny . wrapKey (
22+ const wrapped = await subtle . wrapKey (
2623 'raw' ,
2724 keyToWrap as CryptoKey ,
2825 wrappingKey as CryptoKey ,
2926 { name : 'AES-KW' } ,
3027 ) ;
3128
32- const unwrapped = await subtleAny . unwrapKey (
29+ const unwrapped = await subtle . unwrapKey (
3330 'raw' ,
3431 wrapped ,
3532 wrappingKey as CryptoKey ,
@@ -76,14 +73,14 @@ test(SUITE, 'wrap/unwrap with AES-GCM', async () => {
7673
7774 const iv = getRandomValues ( new Uint8Array ( 12 ) ) ;
7875
79- const wrapped = await subtleAny . wrapKey (
76+ const wrapped = await subtle . wrapKey (
8077 'raw' ,
8178 keyToWrap as CryptoKey ,
8279 wrappingKey as CryptoKey ,
8380 { name : 'AES-GCM' , iv } ,
8481 ) ;
8582
86- const unwrapped = await subtleAny . unwrapKey (
83+ const unwrapped = await subtle . unwrapKey (
8784 'raw' ,
8885 wrapped ,
8986 wrappingKey as CryptoKey ,
@@ -125,14 +122,14 @@ test(SUITE, 'wrap/unwrap JWK format', async () => {
125122 [ 'wrapKey' , 'unwrapKey' ] ,
126123 ) ;
127124
128- const wrapped = await subtleAny . wrapKey (
125+ const wrapped = await subtle . wrapKey (
129126 'jwk' ,
130127 keyToWrap as CryptoKey ,
131128 wrappingKey as CryptoKey ,
132129 { name : 'AES-KW' } ,
133130 ) ;
134131
135- const unwrapped = await subtleAny . unwrapKey (
132+ const unwrapped = await subtle . unwrapKey (
136133 'jwk' ,
137134 wrapped ,
138135 wrappingKey as CryptoKey ,
@@ -149,3 +146,215 @@ test(SUITE, 'wrap/unwrap JWK format', async () => {
149146 Buffer . from ( exported2 as ArrayBuffer ) . toString ( 'hex' ) ,
150147 ) ;
151148} ) ;
149+
150+ // Test 4: Wrap/unwrap with AES-CBC
151+ test ( SUITE , 'wrap/unwrap with AES-CBC' , async ( ) => {
152+ const keyToWrap = await subtle . generateKey (
153+ { name : 'AES-GCM' , length : 256 } ,
154+ true ,
155+ [ 'encrypt' , 'decrypt' ] ,
156+ ) ;
157+
158+ const wrappingKey = await subtle . generateKey (
159+ { name : 'AES-CBC' , length : 256 } ,
160+ true ,
161+ [ 'wrapKey' , 'unwrapKey' ] ,
162+ ) ;
163+
164+ const iv = getRandomValues ( new Uint8Array ( 16 ) ) ;
165+
166+ const wrapped = await subtle . wrapKey (
167+ 'raw' ,
168+ keyToWrap as CryptoKey ,
169+ wrappingKey as CryptoKey ,
170+ { name : 'AES-CBC' , iv } ,
171+ ) ;
172+
173+ const unwrapped = await subtle . unwrapKey (
174+ 'raw' ,
175+ wrapped ,
176+ wrappingKey as CryptoKey ,
177+ { name : 'AES-CBC' , iv } ,
178+ { name : 'AES-GCM' , length : 256 } ,
179+ true ,
180+ [ 'encrypt' , 'decrypt' ] ,
181+ ) ;
182+
183+ const plaintext = getRandomValues ( new Uint8Array ( 32 ) ) ;
184+ const gcmIv = getRandomValues ( new Uint8Array ( 12 ) ) ;
185+
186+ const ct = await subtle . encrypt (
187+ { name : 'AES-GCM' , iv : gcmIv } ,
188+ keyToWrap as CryptoKey ,
189+ plaintext ,
190+ ) ;
191+
192+ const pt = await subtle . decrypt (
193+ { name : 'AES-GCM' , iv : gcmIv } ,
194+ unwrapped as CryptoKey ,
195+ ct ,
196+ ) ;
197+
198+ expect ( Buffer . from ( pt ) . toString ( 'hex' ) ) . to . equal (
199+ Buffer . from ( plaintext ) . toString ( 'hex' ) ,
200+ ) ;
201+ } ) ;
202+
203+ // Test 5: Wrap/unwrap with AES-CTR
204+ test ( SUITE , 'wrap/unwrap with AES-CTR' , async ( ) => {
205+ const keyToWrap = await subtle . generateKey (
206+ { name : 'HMAC' , hash : 'SHA-256' , length : 256 } ,
207+ true ,
208+ [ 'sign' , 'verify' ] ,
209+ ) ;
210+
211+ const wrappingKey = await subtle . generateKey (
212+ { name : 'AES-CTR' , length : 256 } ,
213+ true ,
214+ [ 'wrapKey' , 'unwrapKey' ] ,
215+ ) ;
216+
217+ const counter = getRandomValues ( new Uint8Array ( 16 ) ) ;
218+
219+ const wrapped = await subtle . wrapKey (
220+ 'raw' ,
221+ keyToWrap as CryptoKey ,
222+ wrappingKey as CryptoKey ,
223+ { name : 'AES-CTR' , counter, length : 64 } ,
224+ ) ;
225+
226+ const unwrapped = await subtle . unwrapKey (
227+ 'raw' ,
228+ wrapped ,
229+ wrappingKey as CryptoKey ,
230+ { name : 'AES-CTR' , counter, length : 64 } ,
231+ { name : 'HMAC' , hash : 'SHA-256' } ,
232+ true ,
233+ [ 'sign' , 'verify' ] ,
234+ ) ;
235+
236+ const data = new Uint8Array ( [ 1 , 2 , 3 , 4 ] ) ;
237+ const sig1 = await subtle . sign (
238+ { name : 'HMAC' } ,
239+ keyToWrap as CryptoKey ,
240+ data ,
241+ ) ;
242+ const sig2 = await subtle . sign (
243+ { name : 'HMAC' } ,
244+ unwrapped as CryptoKey ,
245+ data ,
246+ ) ;
247+
248+ expect ( Buffer . from ( sig1 ) . toString ( 'hex' ) ) . to . equal (
249+ Buffer . from ( sig2 ) . toString ( 'hex' ) ,
250+ ) ;
251+ } ) ;
252+
253+ // Test 6: Wrap/unwrap with RSA-OAEP
254+ test ( SUITE , 'wrap/unwrap with RSA-OAEP' , async ( ) => {
255+ const keyToWrap = await subtle . generateKey (
256+ { name : 'AES-GCM' , length : 128 } ,
257+ true ,
258+ [ 'encrypt' , 'decrypt' ] ,
259+ ) ;
260+
261+ const rsaKeyPair = await subtle . generateKey (
262+ {
263+ name : 'RSA-OAEP' ,
264+ modulusLength : 2048 ,
265+ publicExponent : new Uint8Array ( [ 1 , 0 , 1 ] ) ,
266+ hash : 'SHA-256' ,
267+ } ,
268+ true ,
269+ [ 'wrapKey' , 'unwrapKey' ] ,
270+ ) ;
271+
272+ const wrapped = await subtle . wrapKey (
273+ 'raw' ,
274+ keyToWrap as CryptoKey ,
275+ ( rsaKeyPair as CryptoKeyPair ) . publicKey as CryptoKey ,
276+ { name : 'RSA-OAEP' } ,
277+ ) ;
278+
279+ const unwrapped = await subtle . unwrapKey (
280+ 'raw' ,
281+ wrapped ,
282+ ( rsaKeyPair as CryptoKeyPair ) . privateKey as CryptoKey ,
283+ { name : 'RSA-OAEP' } ,
284+ { name : 'AES-GCM' , length : 128 } ,
285+ true ,
286+ [ 'encrypt' , 'decrypt' ] ,
287+ ) ;
288+
289+ const plaintext = getRandomValues ( new Uint8Array ( 32 ) ) ;
290+ const iv = getRandomValues ( new Uint8Array ( 12 ) ) ;
291+
292+ const ct = await subtle . encrypt (
293+ { name : 'AES-GCM' , iv } ,
294+ keyToWrap as CryptoKey ,
295+ plaintext ,
296+ ) ;
297+
298+ const pt = await subtle . decrypt (
299+ { name : 'AES-GCM' , iv } ,
300+ unwrapped as CryptoKey ,
301+ ct ,
302+ ) ;
303+
304+ expect ( Buffer . from ( pt ) . toString ( 'hex' ) ) . to . equal (
305+ Buffer . from ( plaintext ) . toString ( 'hex' ) ,
306+ ) ;
307+ } ) ;
308+
309+ // Test 7: Wrap/unwrap with ChaCha20-Poly1305
310+ test ( SUITE , 'wrap/unwrap with ChaCha20-Poly1305' , async ( ) => {
311+ const keyToWrap = await subtle . generateKey (
312+ { name : 'AES-GCM' , length : 256 } ,
313+ true ,
314+ [ 'encrypt' , 'decrypt' ] ,
315+ ) ;
316+
317+ const wrappingKey = await subtle . generateKey (
318+ { name : 'ChaCha20-Poly1305' , length : 256 } ,
319+ true ,
320+ [ 'wrapKey' , 'unwrapKey' ] ,
321+ ) ;
322+
323+ const iv = getRandomValues ( new Uint8Array ( 12 ) ) ;
324+
325+ const wrapped = await subtle . wrapKey (
326+ 'raw' ,
327+ keyToWrap as CryptoKey ,
328+ wrappingKey as CryptoKey ,
329+ { name : 'ChaCha20-Poly1305' , iv } ,
330+ ) ;
331+
332+ const unwrapped = await subtle . unwrapKey (
333+ 'raw' ,
334+ wrapped ,
335+ wrappingKey as CryptoKey ,
336+ { name : 'ChaCha20-Poly1305' , iv } ,
337+ { name : 'AES-GCM' , length : 256 } ,
338+ true ,
339+ [ 'encrypt' , 'decrypt' ] ,
340+ ) ;
341+
342+ const plaintext = getRandomValues ( new Uint8Array ( 32 ) ) ;
343+ const gcmIv = getRandomValues ( new Uint8Array ( 12 ) ) ;
344+
345+ const ct = await subtle . encrypt (
346+ { name : 'AES-GCM' , iv : gcmIv } ,
347+ keyToWrap as CryptoKey ,
348+ plaintext ,
349+ ) ;
350+
351+ const pt = await subtle . decrypt (
352+ { name : 'AES-GCM' , iv : gcmIv } ,
353+ unwrapped as CryptoKey ,
354+ ct ,
355+ ) ;
356+
357+ expect ( Buffer . from ( pt ) . toString ( 'hex' ) ) . to . equal (
358+ Buffer . from ( plaintext ) . toString ( 'hex' ) ,
359+ ) ;
360+ } ) ;
0 commit comments