Skip to content

Commit e0d6f14

Browse files
argonry
authored andcommitted
Buffer for Cipher, Decipher, Hmac, Sign and Verify
1 parent cb97cdb commit e0d6f14

2 files changed

Lines changed: 68 additions & 39 deletions

File tree

TODO

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,6 @@
66
- tab completion interface
77
- SSL should be factored out of net.js into standalone stream object
88
- base64 write and toString for buffers
9-
- node_crypto, support for Buffer in update function of Cipher, Decipher,
10-
Hmac, Sign, Verify. See 9a26946aaa99a3f27905d5ba91220784e864e5d0 for an
11-
example of how to do it.
129

1310
- debug and production modes
1411
- EventSource branch merged

src/node_crypto.cc

Lines changed: 68 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)