@@ -1237,9 +1237,11 @@ NATIVE_FUNCTION(LibsodiumObject, Constants) {
12371237 LOCAL_V8STRING (s_crypto_secretbox_NONCEBYTES, " crypto_secretbox_NONCEBYTES" );
12381238 LOCAL_V8STRING (s_crypto_auth_BYTES, " crypto_auth_BYTES" );
12391239 LOCAL_V8STRING (s_crypto_auth_KEYBYTES, " crypto_auth_KEYBYTES" );
1240+ LOCAL_V8STRING (s_crypto_aead_chacha20poly1305_NPUBBYTES, " crypto_aead_chacha20poly1305_NPUBBYTES" );
12401241 ret->Set (context, s_crypto_secretbox_NONCEBYTES, v8::Number::New (iv8, crypto_secretbox_NONCEBYTES));
12411242 ret->Set (context, s_crypto_auth_BYTES, v8::Number::New (iv8, crypto_auth_BYTES));
12421243 ret->Set (context, s_crypto_auth_KEYBYTES, v8::Number::New (iv8, crypto_auth_KEYBYTES));
1244+ ret->Set (context, s_crypto_aead_chacha20poly1305_NPUBBYTES, v8::Number::New (iv8, crypto_aead_chacha20poly1305_NPUBBYTES));
12431245
12441246 args.GetReturnValue ().Set (ret);
12451247}
@@ -1429,4 +1431,142 @@ NATIVE_FUNCTION(LibsodiumObject, AuthVerify) {
14291431 args.GetReturnValue ().Set (v8::Boolean::New (iv8, true ));
14301432}
14311433
1434+ NATIVE_FUNCTION (LibsodiumObject, AEADChaCha20Poly135Encrypt) {
1435+ PROLOGUE;
1436+ USEARG (0 );
1437+ USEARG (1 );
1438+ USEARG (2 );
1439+ USEARG (3 );
1440+ VALIDATEARG (0 , OBJECT, " crypto_aead_chacha20poly1305_encrypt: argument 0 is not an array/object." );
1441+ VALIDATEARG (1 , OBJECT, " crypto_aead_chacha20poly1305_encrypt: argument 1 is not an array/object." );
1442+ VALIDATEARG (2 , OBJECT, " crypto_aead_chacha20poly1305_encrypt: argument 2 is not an array/object." );
1443+ VALIDATEARG (3 , OBJECT, " crypto_aead_chacha20poly1305_encrypt: argument 3 is not an array/object." );
1444+
1445+ v8::Local<v8::Object> dataArray = arg0->ToObject (context).ToLocalChecked ();
1446+ unsigned char dataBytes[(int )dataArray->Get (v8::String::NewFromUtf8 (iv8, " length" , v8::NewStringType::kNormal ).ToLocalChecked ())->ToNumber ()->Value ()];
1447+
1448+ for (int i = 0 ; i < (int )dataArray->Get (v8::String::NewFromUtf8 (iv8, " length" , v8::NewStringType::kNormal ).ToLocalChecked ())->ToNumber ()->Value (); i++) {
1449+ dataBytes[i] = (unsigned char )dataArray->Get (i)->ToNumber ()->Value ();
1450+ }
1451+
1452+ v8::Local<v8::Object> keyArray = arg1->ToObject (context).ToLocalChecked ();
1453+ unsigned char keyBytes[(int )keyArray->Get (v8::String::NewFromUtf8 (iv8, " length" , v8::NewStringType::kNormal ).ToLocalChecked ())->ToNumber ()->Value ()];
1454+
1455+ for (int i = 0 ; i < (int )keyArray->Get (v8::String::NewFromUtf8 (iv8, " length" , v8::NewStringType::kNormal ).ToLocalChecked ())->ToNumber ()->Value (); i++) {
1456+ keyBytes[i] = (unsigned char )keyArray->Get (i)->ToNumber ()->Value ();
1457+ }
1458+
1459+ v8::Local<v8::Object> nonceArray = arg2->ToObject (context).ToLocalChecked ();
1460+ unsigned char nonceBytes[crypto_secretbox_NONCEBYTES];
1461+
1462+ for (int i = 0 ; i < (int )nonceArray->Get (v8::String::NewFromUtf8 (iv8, " length" , v8::NewStringType::kNormal ).ToLocalChecked ())->ToNumber ()->Value (); i++) {
1463+ nonceBytes[i] = (unsigned char )nonceArray->Get (i)->ToNumber ()->Value ();
1464+ }
1465+
1466+ v8::Local<v8::Object> addArray = arg3->ToObject (context).ToLocalChecked ();
1467+ unsigned char addBytes[(int )addArray->Get (v8::String::NewFromUtf8 (iv8, " length" , v8::NewStringType::kNormal ).ToLocalChecked ())->ToNumber ()->Value ()];
1468+
1469+ for (int i = 0 ; i < (int )addArray->Get (v8::String::NewFromUtf8 (iv8, " length" , v8::NewStringType::kNormal ).ToLocalChecked ())->ToNumber ()->Value (); i++) {
1470+ addBytes[i] = (unsigned char )addArray->Get (i)->ToNumber ()->Value ();
1471+ }
1472+
1473+ unsigned char ciphertext[crypto_aead_chacha20poly1305_ABYTES + (int )dataArray->Get (v8::String::NewFromUtf8 (iv8, " length" , v8::NewStringType::kNormal ).ToLocalChecked ())->ToNumber ()->Value ()];
1474+ unsigned long long ciphertext_len;
1475+
1476+ crypto_aead_chacha20poly1305_encrypt (ciphertext, &ciphertext_len, dataBytes, (int )dataArray->Get (v8::String::NewFromUtf8 (iv8, " length" , v8::NewStringType::kNormal ).ToLocalChecked ())->ToNumber ()->Value (), addBytes, (int )addArray->Get (v8::String::NewFromUtf8 (iv8, " length" , v8::NewStringType::kNormal ).ToLocalChecked ())->ToNumber ()->Value (), NULL , nonceBytes, keyBytes);
1477+
1478+ char returnString[(sizeof (ciphertext)/sizeof (unsigned char ))*2 + 1 ];
1479+
1480+ for (int i = 0 ; i < (sizeof (ciphertext)/sizeof (unsigned char )); i++) {
1481+ sprintf (&returnString[i*2 ], " %02X" , ciphertext[i]);
1482+ }
1483+
1484+ v8::MaybeLocal<v8::String> maybe_ret = v8::String::NewFromUtf8 (iv8, returnString, v8::NewStringType::kNormal );
1485+
1486+ v8::Local<v8::String> ret;
1487+ if (!maybe_ret.ToLocal (&ret)) {
1488+ args.GetReturnValue ().SetUndefined ();
1489+ return ;
1490+ }
1491+
1492+ v8::Local<v8::Object> retObj = v8::Object::New (iv8);
1493+ retObj->Set (context, v8::String::NewFromUtf8 (iv8, " ciphertext" , v8::NewStringType::kNormal ).ToLocalChecked (), ret);
1494+ retObj->Set (context, v8::String::NewFromUtf8 (iv8, " ciphertext_len" , v8::NewStringType::kNormal ).ToLocalChecked (), v8::Number::New (iv8, ciphertext_len));
1495+
1496+ args.GetReturnValue ().Set (retObj);
1497+ }
1498+
1499+ NATIVE_FUNCTION (LibsodiumObject, AEADChaCha20Poly135Decrypt) {
1500+ PROLOGUE;
1501+ USEARG (0 );
1502+ USEARG (1 );
1503+ USEARG (2 );
1504+ USEARG (3 );
1505+ USEARG (4 );
1506+ VALIDATEARG (0 , OBJECT, " crypto_aead_chacha20poly1305_decrypt: argument 0 is not an array/object." );
1507+ VALIDATEARG (1 , OBJECT, " crypto_aead_chacha20poly1305_decrypt: argument 1 is not an array/object." );
1508+ VALIDATEARG (2 , OBJECT, " crypto_aead_chacha20poly1305_decrypt: argument 2 is not an array/object." );
1509+ VALIDATEARG (3 , OBJECT, " crypto_aead_chacha20poly1305_decrypt: argument 3 is not an array/object." );
1510+ VALIDATEARG (4 , NUMBER, " crypto_aead_chacha20poly1305_decrypt: argument 4 is not a number." );
1511+
1512+ v8::Local<v8::Object> cipherArray = arg0->ToObject (context).ToLocalChecked ();
1513+ unsigned char cipherBytes[(int )cipherArray->Get (v8::String::NewFromUtf8 (iv8, " length" , v8::NewStringType::kNormal ).ToLocalChecked ())->ToNumber ()->Value ()];
1514+
1515+ for (int i = 0 ; i < (int )cipherArray->Get (v8::String::NewFromUtf8 (iv8, " length" , v8::NewStringType::kNormal ).ToLocalChecked ())->ToNumber ()->Value (); i++) {
1516+ cipherBytes[i] = (unsigned char )cipherArray->Get (i)->ToNumber ()->Value ();
1517+ }
1518+
1519+ v8::Local<v8::Object> keyArray = arg1->ToObject (context).ToLocalChecked ();
1520+ unsigned char keyBytes[(int )keyArray->Get (v8::String::NewFromUtf8 (iv8, " length" , v8::NewStringType::kNormal ).ToLocalChecked ())->ToNumber ()->Value ()];
1521+
1522+ for (int i = 0 ; i < (int )keyArray->Get (v8::String::NewFromUtf8 (iv8, " length" , v8::NewStringType::kNormal ).ToLocalChecked ())->ToNumber ()->Value (); i++) {
1523+ keyBytes[i] = (unsigned char )keyArray->Get (i)->ToNumber ()->Value ();
1524+ }
1525+
1526+ v8::Local<v8::Object> nonceArray = arg2->ToObject (context).ToLocalChecked ();
1527+ unsigned char nonceBytes[crypto_secretbox_NONCEBYTES];
1528+
1529+ for (int i = 0 ; i < (int )nonceArray->Get (v8::String::NewFromUtf8 (iv8, " length" , v8::NewStringType::kNormal ).ToLocalChecked ())->ToNumber ()->Value (); i++) {
1530+ nonceBytes[i] = (unsigned char )nonceArray->Get (i)->ToNumber ()->Value ();
1531+ }
1532+
1533+ v8::Local<v8::Object> addArray = arg3->ToObject (context).ToLocalChecked ();
1534+ unsigned char addBytes[(int )addArray->Get (v8::String::NewFromUtf8 (iv8, " length" , v8::NewStringType::kNormal ).ToLocalChecked ())->ToNumber ()->Value ()];
1535+
1536+ for (int i = 0 ; i < (int )addArray->Get (v8::String::NewFromUtf8 (iv8, " length" , v8::NewStringType::kNormal ).ToLocalChecked ())->ToNumber ()->Value (); i++) {
1537+ addBytes[i] = (unsigned char )addArray->Get (i)->ToNumber ()->Value ();
1538+ }
1539+
1540+ v8::Local<v8::Number> ciphertextNum = arg4->ToNumber (context).ToLocalChecked ();
1541+ unsigned long long ciphertextLen = ciphertextNum->Value ();
1542+
1543+ unsigned char deciphertext[ciphertextLen - crypto_aead_chacha20poly1305_ABYTES];
1544+ unsigned long long deciphertext_len;
1545+
1546+ if (crypto_aead_chacha20poly1305_decrypt (deciphertext, &deciphertext_len, NULL , cipherBytes, ciphertextLen, addBytes, (int )addArray->Get (v8::String::NewFromUtf8 (iv8, " length" , v8::NewStringType::kNormal ).ToLocalChecked ())->ToNumber ()->Value (), nonceBytes, keyBytes) != 0 ) {
1547+ args.GetReturnValue ().SetUndefined ();
1548+ return ;
1549+ }
1550+
1551+ char returnString[(sizeof (deciphertext)/sizeof (unsigned char ))*2 + 1 ];
1552+
1553+ for (int i = 0 ; i < (sizeof (deciphertext)/sizeof (unsigned char )); i++) {
1554+ sprintf (&returnString[i*2 ], " %02X" , deciphertext[i]);
1555+ }
1556+
1557+ v8::MaybeLocal<v8::String> maybe_ret = v8::String::NewFromUtf8 (iv8, returnString, v8::NewStringType::kNormal );
1558+
1559+ v8::Local<v8::String> ret;
1560+ if (!maybe_ret.ToLocal (&ret)) {
1561+ args.GetReturnValue ().SetUndefined ();
1562+ return ;
1563+ }
1564+
1565+ v8::Local<v8::Object> retObj = v8::Object::New (iv8);
1566+ retObj->Set (context, v8::String::NewFromUtf8 (iv8, " deciphertext" , v8::NewStringType::kNormal ).ToLocalChecked (), ret);
1567+ retObj->Set (context, v8::String::NewFromUtf8 (iv8, " deciphertext_len" , v8::NewStringType::kNormal ).ToLocalChecked (), v8::Number::New (iv8, deciphertext_len));
1568+
1569+ args.GetReturnValue ().Set (retObj);
1570+ }
1571+
14321572} // namespace rt
0 commit comments