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) {
11341134NATIVE_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) {
11641167NATIVE_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) {
11941200NATIVE_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
0 commit comments