Skip to content

Commit 5da4faf

Browse files
committed
fast buffers for crypto
1 parent 5f935f6 commit 5da4faf

1 file changed

Lines changed: 55 additions & 29 deletions

File tree

src/node_crypto.cc

Lines changed: 55 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -322,21 +322,23 @@ Handle<Value> SecureStream::ReadInject(const Arguments& args) {
322322
String::New("Second argument should be a buffer")));
323323
}
324324

325-
Buffer * buffer = ObjectWrap::Unwrap<Buffer>(args[0]->ToObject());
325+
Local<Object> buffer_obj = args[0]->ToObject();
326+
char *buffer_data = Buffer::Data(buffer_obj);
327+
size_t buffer_length = Buffer::Length(buffer_obj);
326328

327329
size_t off = args[1]->Int32Value();
328-
if (off >= buffer->length()) {
330+
if (off >= buffer_length) {
329331
return ThrowException(Exception::Error(
330332
String::New("Offset is out of bounds")));
331333
}
332334

333335
size_t len = args[2]->Int32Value();
334-
if (off + len > buffer->length()) {
336+
if (off + len > buffer_length) {
335337
return ThrowException(Exception::Error(
336338
String::New("Length is extends beyond buffer")));
337339
}
338340

339-
int bytes_written = BIO_write(ss->pbioRead, (char*)buffer->data() + off, len);
341+
int bytes_written = BIO_write(ss->pbioRead, (char*)buffer_data + off, len);
340342

341343
if (bytes_written < 0) {
342344
if (errno == EAGAIN || errno == EINTR) return Null();
@@ -362,16 +364,18 @@ Handle<Value> SecureStream::ReadExtract(const Arguments& args) {
362364
String::New("Second argument should be a buffer")));
363365
}
364366

365-
Buffer * buffer = ObjectWrap::Unwrap<Buffer>(args[0]->ToObject());
367+
Local<Object> buffer_obj = args[0]->ToObject();
368+
char *buffer_data = Buffer::Data(buffer_obj);
369+
size_t buffer_length = Buffer::Length(buffer_obj);
366370

367371
size_t off = args[1]->Int32Value();
368-
if (off >= buffer->length()) {
372+
if (off >= buffer_length) {
369373
return ThrowException(Exception::Error(
370374
String::New("Offset is out of bounds")));
371375
}
372376

373377
size_t len = args[2]->Int32Value();
374-
if (off + len > buffer->length()) {
378+
if (off + len > buffer_length) {
375379
return ThrowException(Exception::Error(
376380
String::New("Length is extends beyond buffer")));
377381
}
@@ -393,7 +397,7 @@ Handle<Value> SecureStream::ReadExtract(const Arguments& args) {
393397
return scope.Close(Integer::New(0));
394398
}
395399

396-
bytes_read = SSL_read(ss->pSSL, (char*)buffer->data() + off, len);
400+
bytes_read = SSL_read(ss->pSSL, (char*)buffer_data + off, len);
397401
if (bytes_read < 0) {
398402
int err = SSL_get_error(ss->pSSL, bytes_read);
399403
if (err == SSL_ERROR_WANT_READ) {
@@ -445,21 +449,23 @@ Handle<Value> SecureStream::WriteExtract(const Arguments& args) {
445449
String::New("Second argument should be a buffer")));
446450
}
447451

448-
Buffer * buffer = ObjectWrap::Unwrap<Buffer>(args[0]->ToObject());
452+
Local<Object> buffer_obj = args[0]->ToObject();
453+
char *buffer_data = Buffer::Data(buffer_obj);
454+
size_t buffer_length = Buffer::Length(buffer_obj);
449455

450456
size_t off = args[1]->Int32Value();
451-
if (off >= buffer->length()) {
457+
if (off >= buffer_length) {
452458
return ThrowException(Exception::Error(
453459
String::New("Offset is out of bounds")));
454460
}
455461

456462
size_t len = args[2]->Int32Value();
457-
if (off + len > buffer->length()) {
463+
if (off + len > buffer_length) {
458464
return ThrowException(Exception::Error(
459465
String::New("Length is extends beyond buffer")));
460466
}
461467

462-
int bytes_read = BIO_read(ss->pbioWrite, (char*)buffer->data() + off, len);
468+
int bytes_read = BIO_read(ss->pbioWrite, (char*)buffer_data + off, len);
463469

464470
return scope.Close(Integer::New(bytes_read));
465471
}
@@ -480,16 +486,18 @@ Handle<Value> SecureStream::WriteInject(const Arguments& args) {
480486
String::New("Second argument should be a buffer")));
481487
}
482488

483-
Buffer * buffer = ObjectWrap::Unwrap<Buffer>(args[0]->ToObject());
489+
Local<Object> buffer_obj = args[0]->ToObject();
490+
char *buffer_data = Buffer::Data(buffer_obj);
491+
size_t buffer_length = Buffer::Length(buffer_obj);
484492

485493
size_t off = args[1]->Int32Value();
486-
if (off >= buffer->length()) {
494+
if (off >= buffer_length) {
487495
return ThrowException(Exception::Error(
488496
String::New("Offset is out of bounds")));
489497
}
490498

491499
size_t len = args[2]->Int32Value();
492-
if (off + len > buffer->length()) {
500+
if (off + len > buffer_length) {
493501
return ThrowException(Exception::Error(
494502
String::New("Length is extends beyond buffer")));
495503
}
@@ -503,7 +511,7 @@ Handle<Value> SecureStream::WriteInject(const Arguments& args) {
503511
}
504512
return scope.Close(Integer::New(0));
505513
}
506-
int bytes_written = SSL_write(ss->pSSL, (char*)buffer->data() + off, len);
514+
int bytes_written = SSL_write(ss->pSSL, (char*)buffer_data + off, len);
507515

508516
return scope.Close(Integer::New(bytes_written));
509517
}
@@ -1001,8 +1009,11 @@ class Cipher : public ObjectWrap {
10011009
unsigned char *out=0;
10021010
int out_len=0;
10031011
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);
1012+
Local<Object> buffer_obj = args[0]->ToObject();
1013+
char *buffer_data = Buffer::Data(buffer_obj);
1014+
size_t buffer_length = Buffer::Length(buffer_obj);
1015+
1016+
int r = cipher->CipherUpdate(buffer_data, buffer_length, &out, &out_len);
10061017
} else {
10071018
char* buf = new char[len];
10081019
ssize_t written = DecodeWrite(buf, len, args[0], enc);
@@ -1344,9 +1355,12 @@ class Decipher : public ObjectWrap {
13441355
// if alloc_buf then buf must be deleted later
13451356
bool alloc_buf = false;
13461357
if (Buffer::HasInstance(args[0])) {
1347-
Buffer *buffer = ObjectWrap::Unwrap<Buffer>(args[0]->ToObject());
1348-
buf = buffer->data();
1349-
len = buffer->length();
1358+
Local<Object> buffer_obj = args[0]->ToObject();
1359+
char *buffer_data = Buffer::Data(buffer_obj);
1360+
size_t buffer_length = Buffer::Length(buffer_obj);
1361+
1362+
buf = buffer_data;
1363+
len = buffer_length;
13501364
} else {
13511365
alloc_buf = true;
13521366
buf = new char[len];
@@ -1664,8 +1678,11 @@ class Hmac : public ObjectWrap {
16641678
}
16651679

16661680
if( Buffer::HasInstance(args[0])) {
1667-
Buffer *buffer = ObjectWrap::Unwrap<Buffer>(args[0]->ToObject());
1668-
int r = hmac->HmacUpdate(buffer->data(), buffer->length());
1681+
Local<Object> buffer_obj = args[0]->ToObject();
1682+
char *buffer_data = Buffer::Data(buffer_obj);
1683+
size_t buffer_length = Buffer::Length(buffer_obj);
1684+
1685+
int r = hmac->HmacUpdate(buffer_data, buffer_length);
16691686
} else {
16701687
char* buf = new char[len];
16711688
ssize_t written = DecodeWrite(buf, len, args[0], enc);
@@ -1811,8 +1828,11 @@ class Hash : public ObjectWrap {
18111828

18121829

18131830
if (Buffer::HasInstance(args[0])) {
1814-
Buffer *buffer = ObjectWrap::Unwrap<Buffer>(args[0]->ToObject());
1815-
int r = hash->HashUpdate(buffer->data(), buffer->length());
1831+
Local<Object> buffer_obj = args[0]->ToObject();
1832+
char *buffer_data = Buffer::Data(buffer_obj);
1833+
size_t buffer_length = Buffer::Length(buffer_obj);
1834+
1835+
int r = hash->HashUpdate(buffer_data, buffer_length);
18161836
} else {
18171837
char* buf = new char[len];
18181838
ssize_t written = DecodeWrite(buf, len, args[0], enc);
@@ -1981,8 +2001,11 @@ class Sign : public ObjectWrap {
19812001
}
19822002

19832003
if (Buffer::HasInstance(args[0])) {
1984-
Buffer *buffer = ObjectWrap::Unwrap<Buffer>(args[0]->ToObject());
1985-
int r = sign->SignUpdate(buffer->data(), buffer->length());
2004+
Local<Object> buffer_obj = args[0]->ToObject();
2005+
char *buffer_data = Buffer::Data(buffer_obj);
2006+
size_t buffer_length = Buffer::Length(buffer_obj);
2007+
2008+
int r = sign->SignUpdate(buffer_data, buffer_length);
19862009
} else {
19872010
char* buf = new char[len];
19882011
ssize_t written = DecodeWrite(buf, len, args[0], enc);
@@ -2180,8 +2203,11 @@ class Verify : public ObjectWrap {
21802203
}
21812204

21822205
if(Buffer::HasInstance(args[0])) {
2183-
Buffer *buffer = ObjectWrap::Unwrap<Buffer>(args[0]->ToObject());
2184-
int r = verify->VerifyUpdate(buffer->data(), buffer->length());
2206+
Local<Object> buffer_obj = args[0]->ToObject();
2207+
char *buffer_data = Buffer::Data(buffer_obj);
2208+
size_t buffer_length = Buffer::Length(buffer_obj);
2209+
2210+
int r = verify->VerifyUpdate(buffer_data, buffer_length);
21852211
} else {
21862212
char* buf = new char[len];
21872213
ssize_t written = DecodeWrite(buf, len, args[0], enc);

0 commit comments

Comments
 (0)