@@ -998,15 +998,18 @@ class Cipher : public ObjectWrap {
998998 return ThrowException (exception);
999999 }
10001000
1001- char * buf = new char [len];
1002- ssize_t written = DecodeWrite (buf, len, args[0 ], enc);
1003- assert (written == len);
1004-
10051001 unsigned char *out=0 ;
10061002 int out_len=0 ;
1007- int r = cipher->CipherUpdate (buf, len,&out,&out_len);
1008-
1009- delete [] buf;
1003+ if (Buffer::HasInstance (args[0 ])) {
1004+ Buffer *buffer = ObjectWrap::Unwrap<Buffer>(args[0 ]->ToObject ());
1005+ int r = cipher->CipherUpdate (buffer->data (), buffer->length (), &out, &out_len);
1006+ } else {
1007+ char * buf = new char [len];
1008+ ssize_t written = DecodeWrite (buf, len, args[0 ], enc);
1009+ assert (written == len);
1010+ int r = cipher->CipherUpdate (buf, len,&out,&out_len);
1011+ delete [] buf;
1012+ }
10101013
10111014 Local<Value> outString;
10121015 if (out_len==0 ) {
@@ -1337,8 +1340,20 @@ class Decipher : public ObjectWrap {
13371340 " node`DecodeBytes() failed" )));
13381341 }
13391342
1340- char * buf = new char [len];
1341- ssize_t written = DecodeWrite (buf, len, args[0 ], BINARY );
1343+ char * buf;
1344+ // if alloc_buf then buf must be deleted later
1345+ bool alloc_buf = false ;
1346+ if (Buffer::HasInstance (args[0 ])) {
1347+ Buffer *buffer = ObjectWrap::Unwrap<Buffer>(args[0 ]->ToObject ());
1348+ buf = buffer->data ();
1349+ len = buffer->length ();
1350+ } else {
1351+ alloc_buf = true ;
1352+ buf = new char [len];
1353+ ssize_t written = DecodeWrite (buf, len, args[0 ], BINARY );
1354+ assert (written == len);
1355+ }
1356+
13421357 char * ciphertext;
13431358 int ciphertext_len;
13441359
@@ -1353,7 +1368,10 @@ class Decipher : public ObjectWrap {
13531368 char * complete_hex = new char [len+2 ];
13541369 memcpy (complete_hex, &cipher->incomplete_hex , 1 );
13551370 memcpy (complete_hex+1 , buf, len);
1356- delete [] buf;
1371+ if (alloc_buf) {
1372+ delete [] buf;
1373+ alloc_buf = false ;
1374+ }
13571375 buf = complete_hex;
13581376 len += 1 ;
13591377 }
@@ -1366,14 +1384,19 @@ class Decipher : public ObjectWrap {
13661384 }
13671385 HexDecode ((unsigned char *)buf, len, (char **)&ciphertext, &ciphertext_len);
13681386
1369-
1370- delete [] buf;
1387+ if (alloc_buf) {
1388+ delete [] buf;
1389+ alloc_buf = false ;
1390+ }
13711391 buf = ciphertext;
13721392 len = ciphertext_len;
13731393
13741394 } else if (strcasecmp (*encoding, " base64" ) == 0 ) {
13751395 unbase64 ((unsigned char *)buf, len, (char **)&ciphertext, &ciphertext_len);
1376- delete [] buf;
1396+ if (alloc_buf) {
1397+ delete [] buf;
1398+ alloc_buf = false ;
1399+ }
13771400 buf = ciphertext;
13781401 len = ciphertext_len;
13791402
@@ -1426,7 +1449,7 @@ class Decipher : public ObjectWrap {
14261449
14271450 if (out) delete [] out;
14281451
1429- delete [] buf;
1452+ if (alloc_buf) delete [] buf;
14301453 return scope.Close (outString);
14311454
14321455 }
@@ -1639,14 +1662,17 @@ class Hmac : public ObjectWrap {
16391662 Local<Value> exception = Exception::TypeError (String::New (" Bad argument" ));
16401663 return ThrowException (exception);
16411664 }
1642-
1643- char * buf = new char [len];
1644- ssize_t written = DecodeWrite (buf, len, args[0 ], enc);
1645- assert (written == len);
1646-
1647- int r = hmac->HmacUpdate (buf, len);
1648-
1649- delete [] buf;
1665+
1666+ if ( Buffer::HasInstance (args[0 ])) {
1667+ Buffer *buffer = ObjectWrap::Unwrap<Buffer>(args[0 ]->ToObject ());
1668+ int r = hmac->HmacUpdate (buffer->data (), buffer->length ());
1669+ } else {
1670+ char * buf = new char [len];
1671+ ssize_t written = DecodeWrite (buf, len, args[0 ], enc);
1672+ assert (written == len);
1673+ int r = hmac->HmacUpdate (buf, len);
1674+ delete [] buf;
1675+ }
16501676
16511677 return args.This ();
16521678 }
@@ -1954,13 +1980,16 @@ class Sign : public ObjectWrap {
19541980 return ThrowException (exception);
19551981 }
19561982
1957- char * buf = new char [len];
1958- ssize_t written = DecodeWrite (buf, len, args[0 ], enc);
1959- assert (written == len);
1960-
1961- int r = sign->SignUpdate (buf, len);
1962-
1963- delete [] buf;
1983+ if (Buffer::HasInstance (args[0 ])) {
1984+ Buffer *buffer = ObjectWrap::Unwrap<Buffer>(args[0 ]->ToObject ());
1985+ int r = sign->SignUpdate (buffer->data (), buffer->length ());
1986+ } else {
1987+ char * buf = new char [len];
1988+ ssize_t written = DecodeWrite (buf, len, args[0 ], enc);
1989+ assert (written == len);
1990+ int r = sign->SignUpdate (buf, len);
1991+ delete [] buf;
1992+ }
19641993
19651994 return args.This ();
19661995 }
@@ -2150,13 +2179,16 @@ class Verify : public ObjectWrap {
21502179 return ThrowException (exception);
21512180 }
21522181
2153- char * buf = new char [len];
2154- ssize_t written = DecodeWrite (buf, len, args[0 ], enc);
2155- assert (written == len);
2156-
2157- int r = verify->VerifyUpdate (buf, len);
2158-
2159- delete [] buf;
2182+ if (Buffer::HasInstance (args[0 ])) {
2183+ Buffer *buffer = ObjectWrap::Unwrap<Buffer>(args[0 ]->ToObject ());
2184+ int r = verify->VerifyUpdate (buffer->data (), buffer->length ());
2185+ } else {
2186+ char * buf = new char [len];
2187+ ssize_t written = DecodeWrite (buf, len, args[0 ], enc);
2188+ assert (written == len);
2189+ int r = verify->VerifyUpdate (buf, len);
2190+ delete [] buf;
2191+ }
21602192
21612193 return args.This ();
21622194 }
0 commit comments