11import { argon2id } from '@bitgo/argon2' ;
22import { base64String , boundedInt , decodeWithCodec } from '@bitgo/sdk-core' ;
3- import { randomBytes } from 'crypto' ;
3+ import { randomBytes , webcrypto } from 'crypto' ;
44import * as t from 'io-ts' ;
55
6+ /** Web Crypto subtle — browser global in DOM; Node/Electron main must use `webcrypto`. */
7+ const subtle = globalThis . crypto ?. subtle ?? webcrypto . subtle ;
8+
69/** Default Argon2id parameters per RFC 9106 second recommendation
710 * @see https://www.rfc-editor.org/rfc/rfc9106#section-4
811 */
@@ -80,7 +83,7 @@ async function argon2ToAesKey(
8083 params : { memorySize : number ; iterations : number ; parallelism : number }
8184) : Promise < CryptoKey > {
8285 const keyBytes = await argon2Hash ( password , salt , params ) ;
83- return crypto . subtle . importKey ( 'raw' , keyBytes , { name : 'AES-GCM' } , false , [ 'encrypt' , 'decrypt' ] ) ;
86+ return subtle . importKey ( 'raw' , keyBytes , { name : 'AES-GCM' } , false , [ 'encrypt' , 'decrypt' ] ) ;
8487}
8588
8689export async function argon2ToHkdfKey (
@@ -89,11 +92,11 @@ export async function argon2ToHkdfKey(
8992 params : { memorySize : number ; iterations : number ; parallelism : number }
9093) : Promise < CryptoKey > {
9194 const keyBytes = await argon2Hash ( password , salt , params ) ;
92- return crypto . subtle . importKey ( 'raw' , keyBytes , 'HKDF' , false , [ 'deriveKey' ] ) ;
95+ return subtle . importKey ( 'raw' , keyBytes , 'HKDF' , false , [ 'deriveKey' ] ) ;
9396}
9497
9598export function hkdfDeriveAesKey ( hkdfKey : CryptoKey , hkdfSalt : Uint8Array , usage : KeyUsage ) : Promise < CryptoKey > {
96- return crypto . subtle . deriveKey (
99+ return subtle . deriveKey (
97100 { name : 'HKDF' , hash : 'SHA-256' , salt : hkdfSalt , info : HKDF_INFO } ,
98101 hkdfKey ,
99102 { name : 'AES-GCM' , length : 256 } ,
@@ -110,7 +113,7 @@ export async function aesGcmEncrypt(
110113) : Promise < Uint8Array > {
111114 const params : AesGcmParams = { name : 'AES-GCM' , iv, tagLength : 128 } ;
112115 if ( additionalData ) params . additionalData = additionalData ;
113- const ct = await crypto . subtle . encrypt ( params , key , new TextEncoder ( ) . encode ( plaintext ) ) ;
116+ const ct = await subtle . encrypt ( params , key , new TextEncoder ( ) . encode ( plaintext ) ) ;
114117 return new Uint8Array ( ct ) ;
115118}
116119
@@ -122,7 +125,7 @@ export async function aesGcmDecrypt(
122125) : Promise < string > {
123126 const params : AesGcmParams = { name : 'AES-GCM' , iv, tagLength : 128 } ;
124127 if ( additionalData ) params . additionalData = additionalData ;
125- const plaintext = await crypto . subtle . decrypt ( params , key , ct ) ;
128+ const plaintext = await subtle . decrypt ( params , key , ct ) ;
126129 return new TextDecoder ( ) . decode ( plaintext ) ;
127130}
128131
0 commit comments