Skip to content
This repository was archived by the owner on Jul 3, 2020. It is now read-only.

Commit 8378fee

Browse files
committed
Allow U8 buffer for crypto_secretbox_easy
1 parent a44b25a commit 8378fee

2 files changed

Lines changed: 28 additions & 24 deletions

File tree

js/core/libsodium.js

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -27,30 +27,31 @@ function hexToU8(hexStr) {
2727

2828
module.exports = {
2929
crypto_secretbox_easy: function(data, key) {
30-
var nonce = runtime.random.getRandomValues(lib.crypto_constants().crypto_secretbox_NONCEBYTES);
31-
var nonceArr = new Array(lib.crypto_constants().crypto_secretbox_NONCEBYTES);
32-
for (var i = 0; i < nonce.length; i++) {
33-
nonceArr[i] = nonce[i];
30+
var dataArr = data;
31+
32+
if (typeof data === 'string') {
33+
dataArr = new Uint8Array(data.length);
34+
for (var i = 0; i < data.length; i++) {
35+
dataArr[i] = data.charCodeAt(i);
36+
}
37+
} else {
38+
throw new Error('crypto_secretbox_easy: data (argument 0) must be a string or Uint8Array.');
3439
}
3540

36-
var cipher = lib.crypto_secretbox_easy(data, key, nonceArr);
41+
var nonceArr = runtime.random.getRandomValues(lib.crypto_constants().crypto_secretbox_NONCEBYTES);
42+
43+
var cipher = lib.crypto_secretbox_easy(dataArr, key, nonceArr);
3744
if (!cipher) {
3845
throw new Error('crypto_secretbox_easy: error creating box.');
3946
}
4047
return {
4148
ciphertext: hexToU8(cipher),
42-
nonce: nonce
49+
nonce: nonceArr
4350
};
4451
},
45-
crypto_secretbox_open_easy: function(cipheru8, key, nonce) {
46-
var nonceArr = new Array(lib.crypto_constants().crypto_secretbox_NONCEBYTES);
47-
for (var i = 0; i < nonce.length; i++) {
48-
nonceArr[i] = nonce[i];
49-
}
50-
51-
var cipherArr = new Array(cipheru8.length);
52-
for (var i = 0; i < cipheru8.length; i++) {
53-
cipherArr[i] = cipheru8[i];
52+
crypto_secretbox_open_easy: function(cipherArr, key, nonceArr) {
53+
if (!cipherArr instanceof Uint8Array) {
54+
throw new Error('crypto_secretbox_open_easy: cipher data (argument 0) must be a Uint8Array.');
5455
}
5556

5657
var decipher = lib.crypto_secretbox_open_easy(cipherArr, key, nonceArr);

src/kernel/native-object.cc

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1431,13 +1431,16 @@ NATIVE_FUNCTION(LibsodiumObject, SecretboxEasy) {
14311431
USEARG(0);
14321432
USEARG(1);
14331433
USEARG(2);
1434-
VALIDATEARG(0, STRING, "crypto_secretbox_easy: argument 0 is not a string.");
1434+
VALIDATEARG(0, OBJECT, "crypto_secretbox_easy: argument 0 is not a array/object.");
14351435
VALIDATEARG(1, STRING, "crypto_secretbox_easy: argument 1 is not a string.");
14361436
VALIDATEARG(2, OBJECT, "crypto_secretbox_easy: argument 2 is not a array/object.");
14371437

1438-
v8::Local<v8::String> encData = arg0->ToString(context).ToLocalChecked();
1439-
v8::String::Utf8Value encData_utf8_val(encData);
1440-
const char* encData_str = *encData_utf8_val;
1438+
v8::Local<v8::Object> dataArray = arg0->ToObject(context).ToLocalChecked();
1439+
unsigned char dataBytes[(int)dataArray->Get(v8::String::NewFromUtf8(iv8, "length", v8::NewStringType::kNormal).ToLocalChecked())->ToNumber()->Value()];
1440+
1441+
for (int i = 0; i < (int)dataArray->Get(v8::String::NewFromUtf8(iv8, "length", v8::NewStringType::kNormal).ToLocalChecked())->ToNumber()->Value(); i++) {
1442+
dataBytes[i] = (unsigned char)dataArray->Get(i)->ToNumber()->Value();
1443+
}
14411444

14421445
v8::Local<v8::String> keyData = arg1->ToString(context).ToLocalChecked();
14431446
v8::String::Utf8Value keyData_utf8_val(keyData);
@@ -1450,9 +1453,9 @@ NATIVE_FUNCTION(LibsodiumObject, SecretboxEasy) {
14501453
nonceBytes[i] = (unsigned char)nonceArray->Get(i)->ToNumber()->Value();
14511454
}
14521455

1453-
unsigned char ciphertext[crypto_secretbox_MACBYTES + strlen(encData_str)];
1456+
unsigned char ciphertext[crypto_secretbox_MACBYTES + (int)dataArray->Get(v8::String::NewFromUtf8(iv8, "length", v8::NewStringType::kNormal).ToLocalChecked())->ToNumber()->Value()];
14541457

1455-
crypto_secretbox_easy(ciphertext, (const unsigned char*)encData_str, strlen(encData_str), nonceBytes, (const unsigned char*)keyData_str);
1458+
crypto_secretbox_easy(ciphertext, dataBytes, (int)dataArray->Get(v8::String::NewFromUtf8(iv8, "length", v8::NewStringType::kNormal).ToLocalChecked())->ToNumber()->Value(), nonceBytes, (const unsigned char*)keyData_str);
14561459

14571460
char returnString[(sizeof(ciphertext)/sizeof(unsigned char))*2 + 1];
14581461

@@ -1476,9 +1479,9 @@ NATIVE_FUNCTION(LibsodiumObject, SecretboxEasyOpen) {
14761479
USEARG(0);
14771480
USEARG(1);
14781481
USEARG(2);
1479-
VALIDATEARG(0, OBJECT, "crypto_secretbox_easy_open: argument 0 is not a array/object.");
1480-
VALIDATEARG(1, STRING, "crypto_secretbox_easy_open: argument 1 is not a string.");
1481-
VALIDATEARG(2, OBJECT, "crypto_secretbox_easy_open: argument 2 is not a array/object.");
1482+
VALIDATEARG(0, OBJECT, "crypto_secretbox_open_easy: argument 0 is not a array/object.");
1483+
VALIDATEARG(1, STRING, "crypto_secretbox_open_easy: argument 1 is not a string.");
1484+
VALIDATEARG(2, OBJECT, "crypto_secretbox_open_easy: argument 2 is not a array/object.");
14821485

14831486
v8::Local<v8::Object> cipherArray = arg0->ToObject(context).ToLocalChecked();
14841487
unsigned char cipherBytes[(int)cipherArray->Get(v8::String::NewFromUtf8(iv8, "length", v8::NewStringType::kNormal).ToLocalChecked())->ToNumber()->Value()];

0 commit comments

Comments
 (0)