@@ -136,8 +136,9 @@ function determineRecordSize(params) {
136136 if ( isNaN ( rs ) ) {
137137 return 4096 ;
138138 }
139- if ( rs <= PAD_SIZE ) {
140- throw new Error ( 'The rs parameter has to be greater than ' + PAD_SIZE ) ;
139+ var padSize = params . padSize || PAD_SIZE ;
140+ if ( rs <= padSize ) {
141+ throw new Error ( 'The rs parameter has to be greater than ' + padSize ) ;
141142 }
142143 return rs ;
143144}
@@ -151,22 +152,23 @@ function generateNonce(base, counter) {
151152 return nonce ;
152153}
153154
154- function decryptRecord ( key , counter , buffer ) {
155+ function decryptRecord ( key , counter , buffer , padSize ) {
155156 var nonce = generateNonce ( key . nonce , counter ) ;
156157 var gcm = crypto . createDecipheriv ( AES_GCM , key . key , nonce ) ;
157158 gcm . setAuthTag ( buffer . slice ( buffer . length - TAG_LENGTH ) ) ;
158159 var data = gcm . update ( buffer . slice ( 0 , buffer . length - TAG_LENGTH ) ) ;
159160 data = Buffer . concat ( [ data , gcm . final ( ) ] ) ;
160- var pad = data . readUIntBE ( 0 , PAD_SIZE ) ;
161- if ( pad + PAD_SIZE > data . length ) {
161+ padSize = padSize || PAD_SIZE
162+ var pad = data . readUIntBE ( 0 , padSize ) ;
163+ if ( pad + padSize > data . length ) {
162164 throw new Error ( 'padding exceeds block size' ) ;
163165 }
164166 var padCheck = new Buffer ( pad ) ;
165167 padCheck . fill ( 0 ) ;
166- if ( padCheck . compare ( data . slice ( PAD_SIZE , PAD_SIZE + pad ) ) !== 0 ) {
168+ if ( padCheck . compare ( data . slice ( padSize , padSize + pad ) ) !== 0 ) {
167169 throw new Error ( 'invalid padding' ) ;
168170 }
169- return data . slice ( PAD_SIZE + pad ) ;
171+ return data . slice ( padSize + pad ) ;
170172}
171173
172174// TODO: this really should use the node streams stuff
@@ -195,20 +197,22 @@ function decrypt(buffer, params) {
195197 if ( end - start <= TAG_LENGTH ) {
196198 throw new Error ( 'Invalid block: too small at ' + i ) ;
197199 }
198- var block = decryptRecord ( key , i , buffer . slice ( start , end ) ) ;
200+ var block = decryptRecord ( key , i , buffer . slice ( start , end ) ,
201+ params . padSize ) ;
199202 result = Buffer . concat ( [ result , block ] ) ;
200203 start = end ;
201204 }
202205 return result ;
203206}
204207
205- function encryptRecord ( key , counter , buffer , pad ) {
208+ function encryptRecord ( key , counter , buffer , pad , padSize ) {
206209 pad = pad || 0 ;
207210 var nonce = generateNonce ( key . nonce , counter ) ;
208211 var gcm = crypto . createCipheriv ( AES_GCM , key . key , nonce ) ;
209- var padding = new Buffer ( pad + PAD_SIZE ) ;
212+ padSize = padSize || PAD_SIZE ;
213+ var padding = new Buffer ( pad + padSize ) ;
210214 padding . fill ( 0 ) ;
211- padding . writeUIntBE ( pad , 0 , PAD_SIZE ) ;
215+ padding . writeUIntBE ( pad , 0 , padSize ) ;
212216 var epadding = gcm . update ( padding ) ;
213217 var ebuffer = gcm . update ( buffer ) ;
214218 gcm . final ( ) ;
@@ -231,20 +235,22 @@ function encrypt(buffer, params) {
231235 var rs = determineRecordSize ( params ) ;
232236 var start = 0 ;
233237 var result = new Buffer ( 0 ) ;
238+ var padSize = params . padSize || PAD_SIZE ;
234239 var pad = isNaN ( parseInt ( params . pad , 10 ) ) ? 0 : parseInt ( params . pad , 10 ) ;
235240
236241 // Note the <= here ensures that we write out a padding-only block at the end
237242 // of a buffer.
238243 for ( var i = 0 ; start <= buffer . length ; ++ i ) {
239244 // Pad so that at least one data byte is in a block.
240- var recordPad = Math . min ( ( 1 << ( PAD_SIZE * 8 ) ) - 1 , // maximum padding
241- Math . min ( rs - PAD_SIZE - 1 , pad ) ) ;
245+ var recordPad = Math . min ( ( 1 << ( padSize * 8 ) ) - 1 , // maximum padding
246+ Math . min ( rs - padSize - 1 , pad ) ) ;
242247 pad -= recordPad ;
243248
244- var end = Math . min ( start + rs - PAD_SIZE - recordPad , buffer . length ) ;
245- var block = encryptRecord ( key , i , buffer . slice ( start , end ) , recordPad ) ;
249+ var end = Math . min ( start + rs - padSize - recordPad , buffer . length ) ;
250+ var block = encryptRecord ( key , i , buffer . slice ( start , end ) ,
251+ recordPad , padSize ) ;
246252 result = Buffer . concat ( [ result , block ] ) ;
247- start += rs - PAD_SIZE - recordPad ;
253+ start += rs - padSize - recordPad ;
248254 }
249255 if ( pad ) {
250256 throw new Error ( 'Unable to pad by requested amount, ' + pad + ' remaining' ) ;
0 commit comments