Created
July 23, 2010 00:56
-
-
Save argon/486863 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
From c3f2ff065e1910cc567f55c9123f8f80d3a11c5f Mon Sep 17 00:00:00 2001 | |
From: Andrew Naylor <[email protected]> | |
Date: Fri, 23 Jul 2010 01:20:02 +0100 | |
Subject: [PATCH] Added Buffer support for node_crypto update functions of Cipher, Decipher, Hmac, Sign and Verify | |
--- | |
src/node_crypto.cc | 106 ++++++++++++++++++++++++++++++++++------------------ | |
1 files changed, 69 insertions(+), 37 deletions(-) | |
diff --git a/src/node_crypto.cc b/src/node_crypto.cc | |
index de33548..8eb868a 100644 | |
--- a/src/node_crypto.cc | |
+++ b/src/node_crypto.cc | |
@@ -998,15 +998,18 @@ class Cipher : public ObjectWrap { | |
return ThrowException(exception); | |
} | |
- char* buf = new char[len]; | |
- ssize_t written = DecodeWrite(buf, len, args[0], enc); | |
- assert(written == len); | |
- | |
unsigned char *out=0; | |
int out_len=0; | |
- int r = cipher->CipherUpdate(buf, len,&out,&out_len); | |
- | |
- delete [] buf; | |
+ if (Buffer::HasInstance(args[0])) { | |
+ Buffer *buffer = ObjectWrap::Unwrap<Buffer>(args[0]->ToObject()); | |
+ int r = cipher->CipherUpdate(buffer->data(), buffer->length(), &out, &out_len); | |
+ } else { | |
+ char* buf = new char[len]; | |
+ ssize_t written = DecodeWrite(buf, len, args[0], enc); | |
+ assert(written == len); | |
+ int r = cipher->CipherUpdate(buf, len,&out,&out_len); | |
+ delete [] buf; | |
+ } | |
Local<Value> outString; | |
if (out_len==0) { | |
@@ -1337,8 +1340,20 @@ class Decipher : public ObjectWrap { | |
"node`DecodeBytes() failed"))); | |
} | |
- char* buf = new char[len]; | |
- ssize_t written = DecodeWrite(buf, len, args[0], BINARY); | |
+ char* buf; | |
+ // if usingBuffer then buf must be deleted later | |
+ bool usingBuffer = false; | |
+ if (Buffer::HasInstance(args[0])) { | |
+ Buffer *buffer = ObjectWrap::Unwrap<Buffer>(args[0]->ToObject()); | |
+ buf = buffer->data(); | |
+ len = buffer->length(); | |
+ } else { | |
+ usingBuffer = true; | |
+ buf = new char[len]; | |
+ ssize_t written = DecodeWrite(buf, len, args[0], BINARY); | |
+ assert(written == len); | |
+ } | |
+ | |
char* ciphertext; | |
int ciphertext_len; | |
@@ -1353,7 +1368,10 @@ class Decipher : public ObjectWrap { | |
char* complete_hex = new char[len+2]; | |
memcpy(complete_hex, &cipher->incomplete_hex, 1); | |
memcpy(complete_hex+1, buf, len); | |
- delete [] buf; | |
+ if (usingBuffer) { | |
+ delete [] buf; | |
+ usingBuffer = false; | |
+ } | |
buf = complete_hex; | |
len += 1; | |
} | |
@@ -1366,14 +1384,19 @@ class Decipher : public ObjectWrap { | |
} | |
HexDecode((unsigned char*)buf, len, (char **)&ciphertext, &ciphertext_len); | |
- | |
- delete [] buf; | |
+ if (usingBuffer) { | |
+ delete [] buf; | |
+ usingBuffer = false; | |
+ } | |
buf = ciphertext; | |
len = ciphertext_len; | |
} else if (strcasecmp(*encoding, "base64") == 0) { | |
unbase64((unsigned char*)buf, len, (char **)&ciphertext, &ciphertext_len); | |
- delete [] buf; | |
+ if (usingBuffer) { | |
+ delete [] buf; | |
+ usingBuffer = false; | |
+ } | |
buf = ciphertext; | |
len = ciphertext_len; | |
@@ -1426,7 +1449,7 @@ class Decipher : public ObjectWrap { | |
if (out) delete [] out; | |
- delete [] buf; | |
+ if (usingBuffer) delete [] buf; | |
return scope.Close(outString); | |
} | |
@@ -1639,14 +1662,17 @@ class Hmac : public ObjectWrap { | |
Local<Value> exception = Exception::TypeError(String::New("Bad argument")); | |
return ThrowException(exception); | |
} | |
- | |
- char* buf = new char[len]; | |
- ssize_t written = DecodeWrite(buf, len, args[0], enc); | |
- assert(written == len); | |
- | |
- int r = hmac->HmacUpdate(buf, len); | |
- | |
- delete [] buf; | |
+ | |
+ if( Buffer::HasInstance(args[0])) { | |
+ Buffer *buffer = ObjectWrap::Unwrap<Buffer>(args[0]->ToObject()); | |
+ int r = hmac->HmacUpdate(buffer->data(), buffer->length()); | |
+ } else { | |
+ char* buf = new char[len]; | |
+ ssize_t written = DecodeWrite(buf, len, args[0], enc); | |
+ assert(written == len); | |
+ int r = hmac->HmacUpdate(buf, len); | |
+ delete [] buf; | |
+ } | |
return args.This(); | |
} | |
@@ -1953,14 +1979,17 @@ class Sign : public ObjectWrap { | |
Local<Value> exception = Exception::TypeError(String::New("Bad argument")); | |
return ThrowException(exception); | |
} | |
- | |
- char* buf = new char[len]; | |
- ssize_t written = DecodeWrite(buf, len, args[0], enc); | |
- assert(written == len); | |
- | |
- int r = sign->SignUpdate(buf, len); | |
- | |
- delete [] buf; | |
+ | |
+ if (Buffer::HasInstance(args[0])) { | |
+ Buffer *buffer = ObjectWrap::Unwrap<Buffer>(args[0]->ToObject()); | |
+ int r = sign->SignUpdate(buffer->data(), buffer->length()); | |
+ } else { | |
+ char* buf = new char[len]; | |
+ ssize_t written = DecodeWrite(buf, len, args[0], enc); | |
+ assert(written == len); | |
+ int r = sign->SignUpdate(buf, len); | |
+ delete [] buf; | |
+ } | |
return args.This(); | |
} | |
@@ -2150,13 +2179,16 @@ class Verify : public ObjectWrap { | |
return ThrowException(exception); | |
} | |
- char* buf = new char[len]; | |
- ssize_t written = DecodeWrite(buf, len, args[0], enc); | |
- assert(written == len); | |
- | |
- int r = verify->VerifyUpdate(buf, len); | |
- | |
- delete [] buf; | |
+ if(Buffer::HasInstance(args[0])) { | |
+ Buffer *buffer = ObjectWrap::Unwrap<Buffer>(args[0]->ToObject()); | |
+ int r = verify->VerifyUpdate(buffer->data(), buffer->length()); | |
+ } else { | |
+ char* buf = new char[len]; | |
+ ssize_t written = DecodeWrite(buf, len, args[0], enc); | |
+ assert(written == len); | |
+ int r = verify->VerifyUpdate(buf, len); | |
+ delete [] buf; | |
+ } | |
return args.This(); | |
} | |
-- | |
1.7.0.6+GitX |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment