@@ -85,6 +85,7 @@ export async function encryptData(data: string | File): Promise<EncryptionResult
8585
8686 // Generate random IV
8787 const iv = crypto . getRandomValues ( new Uint8Array ( 12 ) ) ;
88+ console . log ( '[ENCRYPT] IV length:' , iv . length , 'bytes' ) ;
8889
8990 // Encrypt with master key
9091 const encryptedBlob = await crypto . subtle . encrypt (
@@ -96,12 +97,14 @@ export async function encryptData(data: string | File): Promise<EncryptionResult
9697 // Export keys as base64 strings
9798 const keyABuffer = await crypto . subtle . exportKey ( 'raw' , keyA ) ;
9899 const keyBBuffer = await crypto . subtle . exportKey ( 'raw' , keyB ) ;
100+ const ivBase64 = arrayBufferToBase64 ( iv . buffer ) ;
101+ console . log ( '[ENCRYPT] IV base64 length:' , ivBase64 . length , 'value:' , ivBase64 ) ;
99102
100103 return {
101104 encryptedBlob,
102105 keyA : arrayBufferToBase64 ( keyABuffer ) ,
103106 keyB : arrayBufferToBase64 ( keyBBuffer ) ,
104- iv : arrayBufferToBase64 ( iv . buffer ) ,
107+ iv : ivBase64 ,
105108 } ;
106109}
107110
@@ -110,33 +113,43 @@ export async function decryptData(
110113 encryptedBlob : ArrayBuffer ,
111114 keys : DecryptionKeys
112115) : Promise < ArrayBuffer > {
113- // Import keys from base64
114- const keyA = await crypto . subtle . importKey (
115- 'raw' ,
116- base64ToArrayBuffer ( keys . keyA ) ,
117- { name : 'AES-GCM' } ,
118- true ,
119- [ 'decrypt' ]
120- ) ;
121-
122- const keyB = await crypto . subtle . importKey (
123- 'raw' ,
124- base64ToArrayBuffer ( keys . keyB ) ,
125- { name : 'AES-GCM' } ,
126- true ,
127- [ 'decrypt' ]
128- ) ;
116+ try {
117+ // Import keys from base64
118+ const keyA = await crypto . subtle . importKey (
119+ 'raw' ,
120+ base64ToArrayBuffer ( keys . keyA ) ,
121+ { name : 'AES-GCM' } ,
122+ true ,
123+ [ 'decrypt' ]
124+ ) ;
125+
126+ const keyB = await crypto . subtle . importKey (
127+ 'raw' ,
128+ base64ToArrayBuffer ( keys . keyB ) ,
129+ { name : 'AES-GCM' } ,
130+ true ,
131+ [ 'decrypt' ]
132+ ) ;
129133
130- // Derive master key
131- const masterKey = await deriveMasterKey ( keyA , keyB ) ;
132-
133- // Decrypt
134- const iv = base64ToArrayBuffer ( keys . iv ) ;
135- return await crypto . subtle . decrypt (
136- { name : 'AES-GCM' , iv } ,
137- masterKey ,
138- encryptedBlob
139- ) as ArrayBuffer ;
134+ // Derive master key
135+ const masterKey = await deriveMasterKey ( keyA , keyB ) ;
136+
137+ // Decrypt
138+ console . log ( '[DECRYPT] IV base64 received:' , keys . iv , 'length:' , keys . iv . length ) ;
139+ const iv = base64ToArrayBuffer ( keys . iv ) ;
140+ console . log ( '[DECRYPT] IV ArrayBuffer byteLength:' , iv . byteLength ) ;
141+ return await crypto . subtle . decrypt (
142+ { name : 'AES-GCM' , iv } ,
143+ masterKey ,
144+ encryptedBlob
145+ ) as ArrayBuffer ;
146+ } catch ( error ) {
147+ // Check if it's an IV length error
148+ if ( error instanceof Error && error . message . includes ( 'iv' ) ) {
149+ throw new Error ( 'This seal was created with an incompatible version. Please create a new seal.' ) ;
150+ }
151+ throw error ;
152+ }
140153}
141154
142155// Utility functions
0 commit comments