Skip to content

Commit 430dc39

Browse files
committed
crypto: use StringBytes::Encode
1 parent a1eacdf commit 430dc39

2 files changed

Lines changed: 49 additions & 39 deletions

File tree

lib/crypto.js

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,8 @@ Hash.prototype._transform = function(chunk, encoding, callback) {
197197
};
198198

199199
Hash.prototype._flush = function(callback) {
200-
this.push(this._binding.digest());
200+
var encoding = this._readableState.encoding || 'buffer';
201+
this.push(this._binding.digest(encoding), encoding);
201202
callback();
202203
};
203204

@@ -212,10 +213,10 @@ Hash.prototype.update = function(data, encoding) {
212213

213214
Hash.prototype.digest = function(outputEncoding) {
214215
outputEncoding = outputEncoding || exports.DEFAULT_ENCODING;
215-
var result = this._binding.digest();
216-
if (outputEncoding && outputEncoding !== 'buffer')
217-
result = result.toString(outputEncoding);
218-
return result;
216+
var ret = this._binding.digest(outputEncoding);
217+
if (outputEncoding !== 'buffer' && Buffer.isBuffer(ret))
218+
ret = ret.toString(outputEncoding);
219+
return ret;
219220
};
220221

221222

src/node_crypto.cc

Lines changed: 43 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1573,7 +1573,7 @@ Handle<Value> Connection::GetPeerCertificate(const Arguments& args) {
15731573
const char hex[] = "0123456789ABCDEF";
15741574
char fingerprint[EVP_MAX_MD_SIZE * 3];
15751575

1576-
for (i=0; i<md_size; i++) {
1576+
for (i = 0; i<md_size; i++) {
15771577
fingerprint[3*i] = hex[(md[i] & 0xf0) >> 4];
15781578
fingerprint[(3*i)+1] = hex[(md[i] & 0x0f)];
15791579
fingerprint[(3*i)+2] = ':';
@@ -2109,8 +2109,8 @@ class Cipher : public ObjectWrap {
21092109

21102110
int CipherUpdate(char* data, int len, unsigned char** out, int* out_len) {
21112111
if (!initialised_) return 0;
2112-
*out_len=len+EVP_CIPHER_CTX_block_size(&ctx);
2113-
*out= new unsigned char[*out_len];
2112+
*out_len = len+EVP_CIPHER_CTX_block_size(&ctx);
2113+
*out = new unsigned char[*out_len];
21142114
return EVP_CipherUpdate(&ctx, *out, out_len, (unsigned char*)data, len);
21152115
}
21162116

@@ -2235,15 +2235,15 @@ class Cipher : public ObjectWrap {
22352235
ASSERT_IS_STRING_OR_BUFFER(args[0]);
22362236

22372237
// Only copy the data if we have to, because it's a string
2238-
unsigned char* out=0;
2239-
int out_len=0, r;
2238+
unsigned char* out = 0;
2239+
int out_len = 0, r;
22402240
if (args[0]->IsString()) {
22412241
enum encoding encoding = ParseEncoding(args[1], BINARY);
2242-
size_t buflen = StringBytes::SizeFast(args[0], encoding);
2243-
char* buf = static_cast<char*>(malloc(buflen));
2242+
size_t buflen = StringBytes::StorageSize(args[0], encoding);
2243+
char* buf = new char[buflen];
22442244
size_t written = StringBytes::Write(buf, buflen, args[0], encoding);
22452245
r = cipher->CipherUpdate(buf, written, &out, &out_len);
2246-
free(buf);
2246+
delete[] buf;
22472247
} else {
22482248
char* buf = Buffer::Data(args[0]);
22492249
size_t buflen = Buffer::Length(args[0]);
@@ -2407,8 +2407,8 @@ class Decipher : public ObjectWrap {
24072407
return 0;
24082408
}
24092409

2410-
*out_len=len+EVP_CIPHER_CTX_block_size(&ctx);
2411-
*out= new unsigned char[*out_len];
2410+
*out_len = len+EVP_CIPHER_CTX_block_size(&ctx);
2411+
*out = new unsigned char[*out_len];
24122412

24132413
return EVP_CipherUpdate(&ctx, *out, out_len, (unsigned char*)data, len);
24142414
}
@@ -2544,15 +2544,15 @@ class Decipher : public ObjectWrap {
25442544
ASSERT_IS_STRING_OR_BUFFER(args[0]);
25452545

25462546
// Only copy the data if we have to, because it's a string
2547-
unsigned char* out=0;
2548-
int out_len=0, r;
2547+
unsigned char* out = 0;
2548+
int out_len = 0, r;
25492549
if (args[0]->IsString()) {
25502550
enum encoding encoding = ParseEncoding(args[1], BINARY);
2551-
size_t buflen = StringBytes::SizeFast(args[0], encoding);
2552-
char* buf = static_cast<char*>(malloc(buflen));
2551+
size_t buflen = StringBytes::StorageSize(args[0], encoding);
2552+
char* buf = new char[buflen];
25532553
size_t written = StringBytes::Write(buf, buflen, args[0], encoding);
25542554
r = cipher->DecipherUpdate(buf, written, &out, &out_len);
2555-
free(buf);
2555+
delete[] buf;
25562556
} else {
25572557
char* buf = Buffer::Data(args[0]);
25582558
size_t buflen = Buffer::Length(args[0]);
@@ -2737,11 +2737,11 @@ class Hmac : public ObjectWrap {
27372737
int r;
27382738
if (args[0]->IsString()) {
27392739
enum encoding encoding = ParseEncoding(args[1], BINARY);
2740-
size_t buflen = StringBytes::SizeFast(args[0], encoding);
2741-
char* buf = static_cast<char*>(malloc(buflen));
2740+
size_t buflen = StringBytes::StorageSize(args[0], encoding);
2741+
char* buf = new char[buflen];
27422742
size_t written = StringBytes::Write(buf, buflen, args[0], encoding);
27432743
r = hmac->HmacUpdate(buf, written);
2744-
free(buf);
2744+
delete[] buf;
27452745
} else {
27462746
char* buf = Buffer::Data(args[0]);
27472747
size_t buflen = Buffer::Length(args[0]);
@@ -2860,11 +2860,11 @@ class Hash : public ObjectWrap {
28602860
int r;
28612861
if (args[0]->IsString()) {
28622862
enum encoding encoding = ParseEncoding(args[1], BINARY);
2863-
size_t buflen = StringBytes::SizeFast(args[0], encoding);
2864-
char* buf = static_cast<char*>(malloc(buflen));
2863+
size_t buflen = StringBytes::StorageSize(args[0], encoding);
2864+
char* buf = new char[buflen];
28652865
size_t written = StringBytes::Write(buf, buflen, args[0], encoding);
28662866
r = hash->HashUpdate(buf, written);
2867-
free(buf);
2867+
delete[] buf;
28682868
} else {
28692869
char* buf = Buffer::Data(args[0]);
28702870
size_t buflen = Buffer::Length(args[0]);
@@ -2888,18 +2888,20 @@ class Hash : public ObjectWrap {
28882888
return ThrowException(Exception::Error(String::New("Not initialized")));
28892889
}
28902890

2891+
enum encoding encoding = BUFFER;
2892+
if (args.Length() >= 1) {
2893+
encoding = ParseEncoding(args[0]->ToString(), BUFFER);
2894+
}
2895+
28912896
unsigned char md_value[EVP_MAX_MD_SIZE];
28922897
unsigned int md_len;
28932898

28942899
EVP_DigestFinal_ex(&hash->mdctx, md_value, &md_len);
28952900
EVP_MD_CTX_cleanup(&hash->mdctx);
28962901
hash->initialised_ = false;
28972902

2898-
Local<Value> outString;
2899-
2900-
outString = Encode(md_value, md_len, BUFFER);
2901-
2902-
return scope.Close(outString);
2903+
return scope.Close(StringBytes::Encode(
2904+
reinterpret_cast<const char*>(md_value), md_len, encoding));
29032905
}
29042906

29052907
Hash () : ObjectWrap () {
@@ -3021,11 +3023,11 @@ class Sign : public ObjectWrap {
30213023
int r;
30223024
if (args[0]->IsString()) {
30233025
enum encoding encoding = ParseEncoding(args[1], BINARY);
3024-
size_t buflen = StringBytes::SizeFast(args[0], encoding);
3025-
char* buf = static_cast<char*>(malloc(buflen));
3026+
size_t buflen = StringBytes::StorageSize(args[0], encoding);
3027+
char* buf = new char[buflen];
30263028
size_t written = StringBytes::Write(buf, buflen, args[0], encoding);
30273029
r = sign->SignUpdate(buf, written);
3028-
free(buf);
3030+
delete[] buf;
30293031
} else {
30303032
char* buf = Buffer::Data(args[0]);
30313033
size_t buflen = Buffer::Length(args[0]);
@@ -3240,11 +3242,11 @@ class Verify : public ObjectWrap {
32403242
int r;
32413243
if (args[0]->IsString()) {
32423244
enum encoding encoding = ParseEncoding(args[1], BINARY);
3243-
size_t buflen = StringBytes::SizeFast(args[0], encoding);
3244-
char* buf = static_cast<char*>(malloc(buflen));
3245+
size_t buflen = StringBytes::StorageSize(args[0], encoding);
3246+
char* buf = new char[buflen];
32453247
size_t written = StringBytes::Write(buf, buflen, args[0], encoding);
32463248
r = verify->VerifyUpdate(buf, written);
3247-
free(buf);
3249+
delete[] buf;
32483250
} else {
32493251
char* buf = Buffer::Data(args[0]);
32503252
size_t buflen = Buffer::Length(args[0]);
@@ -3277,8 +3279,15 @@ class Verify : public ObjectWrap {
32773279
ssize_t kwritten = DecodeWrite(kbuf, klen, args[0], BINARY);
32783280
assert(kwritten == klen);
32793281

3280-
ASSERT_IS_BUFFER(args[1]);
3281-
ssize_t hlen = Buffer::Length(args[1]);
3282+
ASSERT_IS_STRING_OR_BUFFER(args[1]);
3283+
3284+
// BINARY works for both buffers and binary strings.
3285+
enum encoding encoding = BINARY;
3286+
if (args.Length() >= 3) {
3287+
encoding = ParseEncoding(args[2]->ToString(), BINARY);
3288+
}
3289+
3290+
ssize_t hlen = StringBytes::Size(args[1], encoding);
32823291

32833292
if (hlen < 0) {
32843293
delete [] kbuf;

0 commit comments

Comments
 (0)