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

Commit 377b3df

Browse files
author
Face Kapow
committed
crypto_auth, crypto_auth_verify, and allow string or U8 for all arguments
1 parent 1a7cb7a commit 377b3df

3 files changed

Lines changed: 181 additions & 49 deletions

File tree

js/core/libsodium.js

Lines changed: 47 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright 2014-2015 runtime.js project authors
1+
// Copyright 2014-present runtime.js project authors
22
//
33
// Licensed under the Apache License, Version 2.0 (the "License");
44
// you may not use this file except in compliance with the License.
@@ -15,6 +15,7 @@
1515
'use strict';
1616

1717
var lib = require('./resources').libsodium;
18+
var constants = lib.crypto_constants();
1819

1920
// Helper function to convert hex results into Uint8Arrays.
2021
function hexToU8(hexStr) {
@@ -25,22 +26,29 @@ function hexToU8(hexStr) {
2526
return u8;
2627
}
2728

28-
module.exports = {
29-
crypto_secretbox_easy: function(data, key) {
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);
29+
function stringOrU8(arg, funcName, argName, i) {
30+
var ret = arg;
31+
if (!(arg instanceof Uint8Array)) {
32+
if (typeof arg === 'string') {
33+
ret = new Uint8Array(arg.length);
34+
for (var i = 0; i < arg.length; i++) {
35+
ret[i] = arg.charCodeAt(i);
3636
}
3737
} else {
38-
throw new Error('crypto_secretbox_easy: data (argument 0) must be a string or Uint8Array.');
38+
throw new Error(funcName + ': ' + argName + '(argument ' + i + ') must be a string or Uint8Array.');
3939
}
40+
}
41+
return ret;
42+
}
4043

41-
var nonceArr = runtime.random.getRandomValues(lib.crypto_constants().crypto_secretbox_NONCEBYTES);
44+
module.exports = {
45+
crypto_secretbox_easy: function(data, key) {
46+
var dataArr = stringOrU8(data, 'crypto_secretbox_easy', 'data', 0);
47+
var keyArr = stringOrU8(key, 'crypto_secretbox_easy', 'key', 1);
4248

43-
var cipher = lib.crypto_secretbox_easy(dataArr, key, nonceArr);
49+
var nonceArr = runtime.random.getRandomValues(constants.crypto_secretbox_NONCEBYTES);
50+
51+
var cipher = lib.crypto_secretbox_easy(dataArr, keyArr, nonceArr);
4452
if (!cipher) {
4553
throw new Error('crypto_secretbox_easy: error creating box.');
4654
}
@@ -49,16 +57,37 @@ module.exports = {
4957
nonce: nonceArr
5058
};
5159
},
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.');
55-
}
60+
crypto_secretbox_open_easy: function(cipher, key, nonce) {
61+
var cipherArr = stringOrU8(cipher, 'crypto_secretbox_open_easy', 'cipher', 0);
62+
var keyArr = stringOrU8(key, 'crypto_secretbox_open_easy', 'key', 1);
63+
var nonceArr = stringOrU8(nonce, 'crypto_secretbox_open_easy', 'nonce', 2);
5664

57-
var decipher = lib.crypto_secretbox_open_easy(cipherArr, key, nonceArr);
65+
var decipher = lib.crypto_secretbox_open_easy(cipherArr, keyArr, nonceArr);
5866
if (!decipher) {
5967
throw new Error('crypto_secretbox_open_easy: error decrypting box.');
6068
}
6169
return hexToU8(decipher);
70+
},
71+
crypto_auth: function(data) {
72+
var dataArr = stringOrU8(data, 'crypto_auth', 'data', 0);
73+
74+
var key = runtime.random.getRandomValues(constants.crypto_auth_KEYBYTES);
75+
76+
var mac = lib.crypto_auth(dataArr, key);
77+
if (!mac) {
78+
throw new Error('crypto_auth: error creating tag.');
79+
}
80+
return {
81+
mac: hexToU8(mac),
82+
key: key
83+
};
84+
},
85+
crypto_auth_verify: function(mac, key, data) {
86+
var macArr = stringOrU8(mac, 'crypto_auth_verify', 'MAC', 0);
87+
var keyArr = stringOrU8(key, 'crypto_auth_verify', 'key', 1);
88+
var dataArr = stringOrU8(data, 'crypto_auth_verify', 'data', 2);
89+
90+
return lib.crypto_auth_verify(macArr, keyArr, dataArr);
6291
}
6392
};
6493

@@ -80,7 +109,7 @@ var justConvertHex = [
80109
for (var i = 0; i < justConvertHex.length; i++) {
81110
(function(i) {
82111
module.exports[justConvertHex[i].funcName] = function(data) {
83-
var result = lib[justConvertHex[i].funcName](data);
112+
var result = lib[justConvertHex[i].funcName](stringOrU8(data, justConvertHex[i].funcName, 'data', 0));
84113
if (!result) {
85114
throw new Error(justConvertHex[i].funcName + ': ' + justConvertHex[i].errorInfo);
86115
}

src/kernel/native-object.cc

Lines changed: 129 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright 2014-2015 runtime.js project authors
1+
// Copyright 2014-present runtime.js project authors
22
//
33
// Licensed under the Apache License, Version 2.0 (the "License");
44
// you may not use this file except in compliance with the License.
@@ -1134,15 +1134,18 @@ NATIVE_FUNCTION(NativesObject, AllocDMA) {
11341134
NATIVE_FUNCTION(LibsodiumObject, BlakeHash) {
11351135
PROLOGUE;
11361136
USEARG(0);
1137-
VALIDATEARG(0, STRING, "blake_hash: argument 0 is not a string");
1137+
VALIDATEARG(0, OBJECT, "blake_hash: argument 0 is not a array/object");
11381138

1139-
v8::Local<v8::String> hashData = arg0->ToString(context).ToLocalChecked();
1140-
v8::String::Utf8Value hashData_utf8_val(hashData);
1141-
const char* hashData_str = *hashData_utf8_val;
1139+
v8::Local<v8::Object> dataArray = arg0->ToObject(context).ToLocalChecked();
1140+
unsigned char dataBytes[(int)dataArray->Get(v8::String::NewFromUtf8(iv8, "length", v8::NewStringType::kNormal).ToLocalChecked())->ToNumber()->Value()];
1141+
1142+
for (int i = 0; i < (int)dataArray->Get(v8::String::NewFromUtf8(iv8, "length", v8::NewStringType::kNormal).ToLocalChecked())->ToNumber()->Value(); i++) {
1143+
dataBytes[i] = (unsigned char)dataArray->Get(i)->ToNumber()->Value();
1144+
}
11421145

11431146
unsigned char hash[crypto_generichash_BYTES];
11441147

1145-
crypto_generichash(hash, sizeof hash, (const unsigned char*)hashData_str, strlen(hashData_str), nullptr, 0);
1148+
crypto_generichash(hash, sizeof hash, dataBytes, (int)dataArray->Get(v8::String::NewFromUtf8(iv8, "length", v8::NewStringType::kNormal).ToLocalChecked())->ToNumber()->Value(), nullptr, 0);
11461149

11471150
char returnString[(sizeof(hash)/sizeof(unsigned char))*2 + 1];
11481151

@@ -1164,15 +1167,18 @@ NATIVE_FUNCTION(LibsodiumObject, BlakeHash) {
11641167
NATIVE_FUNCTION(LibsodiumObject, Sha256Hash) {
11651168
PROLOGUE;
11661169
USEARG(0);
1167-
VALIDATEARG(0, STRING, "sha256_hash: argument 0 is not a string");
1170+
VALIDATEARG(0, OBJECT, "sha256_hash: argument 0 is not a object/array");
11681171

1169-
v8::Local<v8::String> hashData = arg0->ToString(context).ToLocalChecked();
1170-
v8::String::Utf8Value hashData_utf8_val(hashData);
1171-
const char* hashData_str = *hashData_utf8_val;
1172+
v8::Local<v8::Object> dataArray = arg0->ToObject(context).ToLocalChecked();
1173+
unsigned char dataBytes[(int)dataArray->Get(v8::String::NewFromUtf8(iv8, "length", v8::NewStringType::kNormal).ToLocalChecked())->ToNumber()->Value()];
1174+
1175+
for (int i = 0; i < (int)dataArray->Get(v8::String::NewFromUtf8(iv8, "length", v8::NewStringType::kNormal).ToLocalChecked())->ToNumber()->Value(); i++) {
1176+
dataBytes[i] = (unsigned char)dataArray->Get(i)->ToNumber()->Value();
1177+
}
11721178

11731179
unsigned char hash[crypto_hash_sha256_BYTES];
11741180

1175-
crypto_hash_sha256(hash, (const unsigned char*)hashData_str, strlen(hashData_str));
1181+
crypto_hash_sha256(hash, dataBytes, (int)dataArray->Get(v8::String::NewFromUtf8(iv8, "length", v8::NewStringType::kNormal).ToLocalChecked())->ToNumber()->Value());
11761182

11771183
char returnString[(sizeof(hash)/sizeof(unsigned char))*2 + 1];
11781184

@@ -1194,15 +1200,18 @@ NATIVE_FUNCTION(LibsodiumObject, Sha256Hash) {
11941200
NATIVE_FUNCTION(LibsodiumObject, Sha512Hash) {
11951201
PROLOGUE;
11961202
USEARG(0);
1197-
VALIDATEARG(0, STRING, "crypto_hash_sha512: argument 0 is not a string.");
1203+
VALIDATEARG(0, OBJECT, "crypto_hash_sha512: argument 0 is not a array/object.");
11981204

1199-
v8::Local<v8::String> hashData = arg0->ToString(context).ToLocalChecked();
1200-
v8::String::Utf8Value hashData_utf8_val(hashData);
1201-
const char* hashData_str = *hashData_utf8_val;
1205+
v8::Local<v8::Object> dataArray = arg0->ToObject(context).ToLocalChecked();
1206+
unsigned char dataBytes[(int)dataArray->Get(v8::String::NewFromUtf8(iv8, "length", v8::NewStringType::kNormal).ToLocalChecked())->ToNumber()->Value()];
1207+
1208+
for (int i = 0; i < (int)dataArray->Get(v8::String::NewFromUtf8(iv8, "length", v8::NewStringType::kNormal).ToLocalChecked())->ToNumber()->Value(); i++) {
1209+
dataBytes[i] = (unsigned char)dataArray->Get(i)->ToNumber()->Value();
1210+
}
12021211

12031212
unsigned char hash[crypto_hash_sha512_BYTES];
12041213

1205-
crypto_hash_sha512(hash, (const unsigned char*)hashData_str, strlen(hashData_str));
1214+
crypto_hash_sha512(hash, dataBytes, (int)dataArray->Get(v8::String::NewFromUtf8(iv8, "length", v8::NewStringType::kNormal).ToLocalChecked())->ToNumber()->Value());
12061215

12071216
char returnString[(sizeof(hash)/sizeof(unsigned char))*2 + 1];
12081217

@@ -1226,7 +1235,11 @@ NATIVE_FUNCTION(LibsodiumObject, Constants) {
12261235

12271236
v8::Local<v8::Object> ret = v8::Object::New(iv8);
12281237
LOCAL_V8STRING(s_crypto_secretbox_NONCEBYTES, "crypto_secretbox_NONCEBYTES");
1238+
LOCAL_V8STRING(s_crypto_auth_BYTES, "crypto_auth_BYTES");
1239+
LOCAL_V8STRING(s_crypto_auth_KEYBYTES, "crypto_auth_KEYBYTES");
12291240
ret->Set(context, s_crypto_secretbox_NONCEBYTES, v8::Number::New(iv8, crypto_secretbox_NONCEBYTES));
1241+
ret->Set(context, s_crypto_auth_BYTES, v8::Number::New(iv8, crypto_auth_BYTES));
1242+
ret->Set(context, s_crypto_auth_KEYBYTES, v8::Number::New(iv8, crypto_auth_KEYBYTES));
12301243

12311244
args.GetReturnValue().Set(ret);
12321245
}
@@ -1236,9 +1249,9 @@ NATIVE_FUNCTION(LibsodiumObject, SecretboxEasy) {
12361249
USEARG(0);
12371250
USEARG(1);
12381251
USEARG(2);
1239-
VALIDATEARG(0, OBJECT, "crypto_secretbox_easy: argument 0 is not a array/object.");
1240-
VALIDATEARG(1, STRING, "crypto_secretbox_easy: argument 1 is not a string.");
1241-
VALIDATEARG(2, OBJECT, "crypto_secretbox_easy: argument 2 is not a array/object.");
1252+
VALIDATEARG(0, OBJECT, "crypto_secretbox_easy: argument 0 is not an array/object.");
1253+
VALIDATEARG(1, OBJECT, "crypto_secretbox_easy: argument 1 is not an array/object.");
1254+
VALIDATEARG(2, OBJECT, "crypto_secretbox_easy: argument 2 is not an array/object.");
12421255

12431256
v8::Local<v8::Object> dataArray = arg0->ToObject(context).ToLocalChecked();
12441257
unsigned char dataBytes[(int)dataArray->Get(v8::String::NewFromUtf8(iv8, "length", v8::NewStringType::kNormal).ToLocalChecked())->ToNumber()->Value()];
@@ -1247,9 +1260,12 @@ NATIVE_FUNCTION(LibsodiumObject, SecretboxEasy) {
12471260
dataBytes[i] = (unsigned char)dataArray->Get(i)->ToNumber()->Value();
12481261
}
12491262

1250-
v8::Local<v8::String> keyData = arg1->ToString(context).ToLocalChecked();
1251-
v8::String::Utf8Value keyData_utf8_val(keyData);
1252-
const char* keyData_str = *keyData_utf8_val;
1263+
v8::Local<v8::Object> keyArray = arg1->ToObject(context).ToLocalChecked();
1264+
unsigned char keyBytes[(int)keyArray->Get(v8::String::NewFromUtf8(iv8, "length", v8::NewStringType::kNormal).ToLocalChecked())->ToNumber()->Value()];
1265+
1266+
for (int i = 0; i < (int)keyArray->Get(v8::String::NewFromUtf8(iv8, "length", v8::NewStringType::kNormal).ToLocalChecked())->ToNumber()->Value(); i++) {
1267+
keyBytes[i] = (unsigned char)keyArray->Get(i)->ToNumber()->Value();
1268+
}
12531269

12541270
v8::Local<v8::Object> nonceArray = arg2->ToObject(context).ToLocalChecked();
12551271
unsigned char nonceBytes[crypto_secretbox_NONCEBYTES];
@@ -1260,7 +1276,7 @@ NATIVE_FUNCTION(LibsodiumObject, SecretboxEasy) {
12601276

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

1263-
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);
1279+
crypto_secretbox_easy(ciphertext, dataBytes, (int)dataArray->Get(v8::String::NewFromUtf8(iv8, "length", v8::NewStringType::kNormal).ToLocalChecked())->ToNumber()->Value(), nonceBytes, keyBytes);
12641280

12651281
char returnString[(sizeof(ciphertext)/sizeof(unsigned char))*2 + 1];
12661282

@@ -1284,9 +1300,9 @@ NATIVE_FUNCTION(LibsodiumObject, SecretboxEasyOpen) {
12841300
USEARG(0);
12851301
USEARG(1);
12861302
USEARG(2);
1287-
VALIDATEARG(0, OBJECT, "crypto_secretbox_open_easy: argument 0 is not a array/object.");
1288-
VALIDATEARG(1, STRING, "crypto_secretbox_open_easy: argument 1 is not a string.");
1289-
VALIDATEARG(2, OBJECT, "crypto_secretbox_open_easy: argument 2 is not a array/object.");
1303+
VALIDATEARG(0, OBJECT, "crypto_secretbox_open_easy: argument 0 is not an array/object.");
1304+
VALIDATEARG(1, OBJECT, "crypto_secretbox_open_easy: argument 1 is not an array/object.");
1305+
VALIDATEARG(2, OBJECT, "crypto_secretbox_open_easy: argument 2 is not an array/object.");
12901306

12911307
v8::Local<v8::Object> cipherArray = arg0->ToObject(context).ToLocalChecked();
12921308
unsigned char cipherBytes[(int)cipherArray->Get(v8::String::NewFromUtf8(iv8, "length", v8::NewStringType::kNormal).ToLocalChecked())->ToNumber()->Value()];
@@ -1295,9 +1311,12 @@ NATIVE_FUNCTION(LibsodiumObject, SecretboxEasyOpen) {
12951311
cipherBytes[i] = (unsigned char)cipherArray->Get(i)->ToNumber()->Value();
12961312
}
12971313

1298-
v8::Local<v8::String> keyData = arg1->ToString(context).ToLocalChecked();
1299-
v8::String::Utf8Value keyData_utf8_val(keyData);
1300-
const char* keyData_str = *keyData_utf8_val;
1314+
v8::Local<v8::Object> keyArray = arg1->ToObject(context).ToLocalChecked();
1315+
unsigned char keyBytes[(int)keyArray->Get(v8::String::NewFromUtf8(iv8, "length", v8::NewStringType::kNormal).ToLocalChecked())->ToNumber()->Value()];
1316+
1317+
for (int i = 0; i < (int)keyArray->Get(v8::String::NewFromUtf8(iv8, "length", v8::NewStringType::kNormal).ToLocalChecked())->ToNumber()->Value(); i++) {
1318+
keyBytes[i] = (unsigned char)keyArray->Get(i)->ToNumber()->Value();
1319+
}
13011320

13021321
v8::Local<v8::Object> nonceArray = arg2->ToObject(context).ToLocalChecked();
13031322
unsigned char nonceBytes[crypto_secretbox_NONCEBYTES];
@@ -1308,7 +1327,7 @@ NATIVE_FUNCTION(LibsodiumObject, SecretboxEasyOpen) {
13081327

13091328
unsigned char deciphertext[(int)cipherArray->Get(v8::String::NewFromUtf8(iv8, "length", v8::NewStringType::kNormal).ToLocalChecked())->ToNumber()->Value() - crypto_secretbox_MACBYTES];
13101329

1311-
if (crypto_secretbox_open_easy(deciphertext, cipherBytes, (int)cipherArray->Get(v8::String::NewFromUtf8(iv8, "length", v8::NewStringType::kNormal).ToLocalChecked())->ToNumber()->Value(), nonceBytes, (const unsigned char*)keyData_str) != 0) {
1330+
if (crypto_secretbox_open_easy(deciphertext, cipherBytes, (int)cipherArray->Get(v8::String::NewFromUtf8(iv8, "length", v8::NewStringType::kNormal).ToLocalChecked())->ToNumber()->Value(), nonceBytes, keyBytes) != 0) {
13121331
args.GetReturnValue().SetUndefined();
13131332
return;
13141333
}
@@ -1330,4 +1349,84 @@ NATIVE_FUNCTION(LibsodiumObject, SecretboxEasyOpen) {
13301349
args.GetReturnValue().Set(ret);
13311350
}
13321351

1352+
NATIVE_FUNCTION(LibsodiumObject, Auth) {
1353+
PROLOGUE;
1354+
USEARG(0);
1355+
USEARG(1);
1356+
VALIDATEARG(0, OBJECT, "crypto_auth: argument 0 is not an array/object.");
1357+
VALIDATEARG(1, OBJECT, "crypto_auth: argument 1 is not an array/object.");
1358+
1359+
v8::Local<v8::Object> dataArray = arg0->ToObject(context).ToLocalChecked();
1360+
unsigned char dataBytes[(int)dataArray->Get(v8::String::NewFromUtf8(iv8, "length", v8::NewStringType::kNormal).ToLocalChecked())->ToNumber()->Value()];
1361+
1362+
for (int i = 0; i < (int)dataArray->Get(v8::String::NewFromUtf8(iv8, "length", v8::NewStringType::kNormal).ToLocalChecked())->ToNumber()->Value(); i++) {
1363+
dataBytes[i] = (unsigned char)dataArray->Get(i)->ToNumber()->Value();
1364+
}
1365+
1366+
v8::Local<v8::Object> keyArray = arg1->ToObject(context).ToLocalChecked();
1367+
unsigned char keyBytes[(int)keyArray->Get(v8::String::NewFromUtf8(iv8, "length", v8::NewStringType::kNormal).ToLocalChecked())->ToNumber()->Value()];
1368+
1369+
for (int i = 0; i < (int)keyArray->Get(v8::String::NewFromUtf8(iv8, "length", v8::NewStringType::kNormal).ToLocalChecked())->ToNumber()->Value(); i++) {
1370+
keyBytes[i] = (unsigned char)keyArray->Get(i)->ToNumber()->Value();
1371+
}
1372+
1373+
unsigned char mac[crypto_auth_BYTES];
1374+
1375+
crypto_auth(mac, dataBytes, (int)dataArray->Get(v8::String::NewFromUtf8(iv8, "length", v8::NewStringType::kNormal).ToLocalChecked())->ToNumber()->Value(), keyBytes);
1376+
1377+
char returnString[(sizeof(mac)/sizeof(unsigned char))*2 + 1];
1378+
1379+
for (int i = 0; i < (sizeof(mac)/sizeof(unsigned char)); i++) {
1380+
sprintf(&returnString[i*2], "%02X", mac[i]);
1381+
}
1382+
1383+
v8::MaybeLocal<v8::String> maybe_ret = v8::String::NewFromUtf8(iv8, returnString, v8::NewStringType::kNormal);
1384+
1385+
v8::Local<v8::String> ret;
1386+
if (!maybe_ret.ToLocal(&ret)) {
1387+
args.GetReturnValue().SetUndefined();
1388+
return;
1389+
}
1390+
1391+
args.GetReturnValue().Set(ret);
1392+
}
1393+
1394+
NATIVE_FUNCTION(LibsodiumObject, AuthVerify) {
1395+
PROLOGUE;
1396+
USEARG(0);
1397+
USEARG(1);
1398+
USEARG(2);
1399+
VALIDATEARG(0, OBJECT, "crypto_auth_verify: argument 0 is not an array/object.");
1400+
VALIDATEARG(1, OBJECT, "crypto_auth_verify: argument 1 is not an array/object.");
1401+
VALIDATEARG(2, OBJECT, "crypto_auth_verify: argument 2 is not an array/object.");
1402+
1403+
v8::Local<v8::Object> macArray = arg0->ToObject(context).ToLocalChecked();
1404+
unsigned char macBytes[(int)macArray->Get(v8::String::NewFromUtf8(iv8, "length", v8::NewStringType::kNormal).ToLocalChecked())->ToNumber()->Value()];
1405+
1406+
for (int i = 0; i < (int)macArray->Get(v8::String::NewFromUtf8(iv8, "length", v8::NewStringType::kNormal).ToLocalChecked())->ToNumber()->Value(); i++) {
1407+
macBytes[i] = (unsigned char)macArray->Get(i)->ToNumber()->Value();
1408+
}
1409+
1410+
v8::Local<v8::Object> keyArray = arg1->ToObject(context).ToLocalChecked();
1411+
unsigned char keyBytes[(int)keyArray->Get(v8::String::NewFromUtf8(iv8, "length", v8::NewStringType::kNormal).ToLocalChecked())->ToNumber()->Value()];
1412+
1413+
for (int i = 0; i < (int)keyArray->Get(v8::String::NewFromUtf8(iv8, "length", v8::NewStringType::kNormal).ToLocalChecked())->ToNumber()->Value(); i++) {
1414+
keyBytes[i] = (unsigned char)keyArray->Get(i)->ToNumber()->Value();
1415+
}
1416+
1417+
v8::Local<v8::Object> dataArray = arg2->ToObject(context).ToLocalChecked();
1418+
unsigned char dataBytes[(int)dataArray->Get(v8::String::NewFromUtf8(iv8, "length", v8::NewStringType::kNormal).ToLocalChecked())->ToNumber()->Value()];
1419+
1420+
for (int i = 0; i < (int)dataArray->Get(v8::String::NewFromUtf8(iv8, "length", v8::NewStringType::kNormal).ToLocalChecked())->ToNumber()->Value(); i++) {
1421+
dataBytes[i] = (unsigned char)dataArray->Get(i)->ToNumber()->Value();
1422+
}
1423+
1424+
if (crypto_auth_verify(macBytes, dataBytes, (int)dataArray->Get(v8::String::NewFromUtf8(iv8, "length", v8::NewStringType::kNormal).ToLocalChecked())->ToNumber()->Value(), keyBytes) != 0) {
1425+
args.GetReturnValue().Set(v8::Boolean::New(iv8, false));
1426+
return;
1427+
}
1428+
1429+
args.GetReturnValue().Set(v8::Boolean::New(iv8, true));
1430+
}
1431+
13331432
} // namespace rt

src/kernel/native-object.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright 2014-2015 runtime.js project authors
1+
// Copyright 2014-present runtime.js project authors
22
//
33
// Licensed under the Apache License, Version 2.0 (the "License");
44
// you may not use this file except in compliance with the License.
@@ -292,6 +292,8 @@ class LibsodiumObject : public JsObjectWrapper<LibsodiumObject, NativeTypeId::TY
292292
DECLARE_NATIVE(Constants);
293293
DECLARE_NATIVE(SecretboxEasy);
294294
DECLARE_NATIVE(SecretboxEasyOpen);
295+
DECLARE_NATIVE(Auth);
296+
DECLARE_NATIVE(AuthVerify);
295297

296298
void ObjectInit(ExportBuilder obj) {
297299
obj.SetCallback("crypto_generichash", BlakeHash);
@@ -300,6 +302,8 @@ class LibsodiumObject : public JsObjectWrapper<LibsodiumObject, NativeTypeId::TY
300302
obj.SetCallback("crypto_constants", Constants);
301303
obj.SetCallback("crypto_secretbox_easy", SecretboxEasy);
302304
obj.SetCallback("crypto_secretbox_open_easy", SecretboxEasyOpen);
305+
obj.SetCallback("crypto_auth", Auth);
306+
obj.SetCallback("crypto_auth_verify", AuthVerify);
303307
}
304308

305309
JsObjectWrapperBase* Clone() const {

0 commit comments

Comments
 (0)