Skip to content

Instantly share code, notes, and snippets.

@argon
Created July 23, 2010 00:56
Show Gist options
  • Save argon/486863 to your computer and use it in GitHub Desktop.
Save argon/486863 to your computer and use it in GitHub Desktop.
From c3f2ff065e1910cc567f55c9123f8f80d3a11c5f Mon Sep 17 00:00:00 2001
From: Andrew Naylor <argon@mkbot.net>
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