From 40cbe16300f609f6c250e0ffa3fe06abbe82ad03 Mon Sep 17 00:00:00 2001 From: devgianlu Date: Sun, 15 Dec 2024 21:45:50 +0100 Subject: [PATCH] LibWeb: Add support for AES-GCM encrypt and decrypt Adds ~400 WPT test passes. --- Libraries/LibWeb/Crypto/CryptoAlgorithms.cpp | 49 ++- .../encrypt_decrypt/aes_gcm.https.any.txt | 330 ++++++++++++++++++ .../aes_gcm_256_iv.https.any.txt | 330 ++++++++++++++++++ .../WebCryptoAPI/encrypt_decrypt/aes.js | 325 +++++++++++++++++ .../encrypt_decrypt/aes_gcm.https.any.html | 18 + .../encrypt_decrypt/aes_gcm.https.any.js | 7 + .../aes_gcm_256_iv.https.any.html | 18 + .../aes_gcm_256_iv.https.any.js | 7 + .../aes_gcm_256_iv_fixtures.js | 210 +++++++++++ .../encrypt_decrypt/aes_gcm_96_iv_fixtures.js | 209 +++++++++++ .../encrypt_decrypt/aes_gcm_vectors.js | 76 ++++ 11 files changed, 1554 insertions(+), 25 deletions(-) create mode 100644 Tests/LibWeb/Text/expected/wpt-import/WebCryptoAPI/encrypt_decrypt/aes_gcm.https.any.txt create mode 100644 Tests/LibWeb/Text/expected/wpt-import/WebCryptoAPI/encrypt_decrypt/aes_gcm_256_iv.https.any.txt create mode 100644 Tests/LibWeb/Text/input/wpt-import/WebCryptoAPI/encrypt_decrypt/aes.js create mode 100644 Tests/LibWeb/Text/input/wpt-import/WebCryptoAPI/encrypt_decrypt/aes_gcm.https.any.html create mode 100644 Tests/LibWeb/Text/input/wpt-import/WebCryptoAPI/encrypt_decrypt/aes_gcm.https.any.js create mode 100644 Tests/LibWeb/Text/input/wpt-import/WebCryptoAPI/encrypt_decrypt/aes_gcm_256_iv.https.any.html create mode 100644 Tests/LibWeb/Text/input/wpt-import/WebCryptoAPI/encrypt_decrypt/aes_gcm_256_iv.https.any.js create mode 100644 Tests/LibWeb/Text/input/wpt-import/WebCryptoAPI/encrypt_decrypt/aes_gcm_256_iv_fixtures.js create mode 100644 Tests/LibWeb/Text/input/wpt-import/WebCryptoAPI/encrypt_decrypt/aes_gcm_96_iv_fixtures.js create mode 100644 Tests/LibWeb/Text/input/wpt-import/WebCryptoAPI/encrypt_decrypt/aes_gcm_vectors.js diff --git a/Libraries/LibWeb/Crypto/CryptoAlgorithms.cpp b/Libraries/LibWeb/Crypto/CryptoAlgorithms.cpp index 63fb0271454bb..03e503bcc0016 100644 --- a/Libraries/LibWeb/Crypto/CryptoAlgorithms.cpp +++ b/Libraries/LibWeb/Crypto/CryptoAlgorithms.cpp @@ -2015,11 +2015,15 @@ WebIDL::ExceptionOr> AesGcm::encrypt(AlgorithmParams co { auto const& normalized_algorithm = static_cast(params); - // FIXME: 1. If plaintext has a length greater than 2^39 - 256 bytes, then throw an OperationError. + // 1. If plaintext has a length greater than 2^39 - 256 bytes, then throw an OperationError. + if (plaintext.size() > (1ULL << 39) - 256) + return WebIDL::OperationError::create(m_realm, "Invalid plaintext length"_string); - // FIXME: 2. If the iv member of normalizedAlgorithm has a length greater than 2^64 - 1 bytes, then throw an OperationError. + // 2. If the iv member of normalizedAlgorithm has a length greater than 2^64 - 1 bytes, then throw an OperationError. + // NOTE: This is not possible - // FIXME: 3. If the additionalData member of normalizedAlgorithm is present and has a length greater than 2^64 - 1 bytes, then throw an OperationError. + // 3. If the additionalData member of normalizedAlgorithm is present and has a length greater than 2^64 - 1 bytes, then throw an OperationError. + // NOTE: This is not possible // 4. If the tagLength member of normalizedAlgorithm is not present: Let tagLength be 128. auto tag_length = 0; @@ -2049,19 +2053,16 @@ WebIDL::ExceptionOr> AesGcm::encrypt(AlgorithmParams co auto key_bytes = key->handle().get(); ::Crypto::Cipher::AESCipher::GCMMode cipher(key_bytes, key_length, ::Crypto::Cipher::Intent::Encryption); - ByteBuffer ciphertext = TRY_OR_THROW_OOM(m_realm->vm(), ByteBuffer::create_zeroed(plaintext.size())); - ByteBuffer tag = TRY_OR_THROW_OOM(m_realm->vm(), ByteBuffer::create_zeroed(tag_length / 8)); - [[maybe_unused]] Bytes ciphertext_span = ciphertext.bytes(); - [[maybe_unused]] Bytes tag_span = tag.bytes(); + auto ciphertext = TRY_OR_THROW_OOM(m_realm->vm(), ByteBuffer::create_zeroed(plaintext.size())); + auto tag = TRY_OR_THROW_OOM(m_realm->vm(), ByteBuffer::create_zeroed(tag_length / 8)); - // FIXME: cipher.encrypt(plaintext, ciphertext_span, normalized_algorithm.iv, additional_data, tag_span); - return WebIDL::NotSupportedError::create(m_realm, "AES GCM encryption not yet implemented"_string); + cipher.encrypt(plaintext, ciphertext.bytes(), normalized_algorithm.iv, additional_data, tag.bytes()); // 7. Let ciphertext be equal to C | T, where '|' denotes concatenation. - // TRY_OR_THROW_OOM(m_realm->vm(), ciphertext.try_append(tag)); + TRY_OR_THROW_OOM(m_realm->vm(), ciphertext.try_append(tag)); // 8. Return the result of creating an ArrayBuffer containing ciphertext. - // return JS::ArrayBuffer::create(m_realm, ciphertext); + return JS::ArrayBuffer::create(m_realm, ciphertext); } WebIDL::ExceptionOr> AesGcm::decrypt(AlgorithmParams const& params, GC::Ref key, ByteBuffer const& ciphertext) @@ -2086,16 +2087,18 @@ WebIDL::ExceptionOr> AesGcm::decrypt(AlgorithmParams co if (ciphertext.size() < tag_length / 8) return WebIDL::OperationError::create(m_realm, "Invalid ciphertext length"_string); - // FIXME: 3. If the iv member of normalizedAlgorithm has a length greater than 2^64 - 1 bytes, then throw an OperationError. + // 3. If the iv member of normalizedAlgorithm has a length greater than 2^64 - 1 bytes, then throw an OperationError. + // NOTE: This is not possible - // FIXME: 4. If the additionalData member of normalizedAlgorithm is present and has a length greater than 2^64 - 1 bytes, then throw an OperationError. + // 4. If the additionalData member of normalizedAlgorithm is present and has a length greater than 2^64 - 1 bytes, then throw an OperationError. + // NOTE: This is not possible // 5. Let tag be the last tagLength bits of ciphertext. - auto tag_bits = tag_length / 8; - auto tag = TRY_OR_THROW_OOM(m_realm->vm(), ciphertext.slice(ciphertext.size() - tag_bits, tag_bits)); + auto tag_bytes = tag_length / 8; + auto tag = TRY_OR_THROW_OOM(m_realm->vm(), ciphertext.slice(ciphertext.size() - tag_bytes, tag_bytes)); // 6. Let actualCiphertext be the result of removing the last tagLength bits from ciphertext. - auto actual_ciphertext = TRY_OR_THROW_OOM(m_realm->vm(), ciphertext.slice(0, ciphertext.size() - tag_bits)); + auto actual_ciphertext = TRY_OR_THROW_OOM(m_realm->vm(), ciphertext.slice(0, ciphertext.size() - tag_bytes)); // 7. Let additionalData be the contents of the additionalData member of normalizedAlgorithm if present or the empty octet string otherwise. auto additional_data = normalized_algorithm.additional_data.value_or(ByteBuffer {}); @@ -2112,22 +2115,18 @@ WebIDL::ExceptionOr> AesGcm::decrypt(AlgorithmParams co auto key_bytes = key->handle().get(); ::Crypto::Cipher::AESCipher::GCMMode cipher(key_bytes, key_length, ::Crypto::Cipher::Intent::Decryption); - ByteBuffer plaintext = TRY_OR_THROW_OOM(m_realm->vm(), ByteBuffer::create_zeroed(actual_ciphertext.size())); - [[maybe_unused]] Bytes plaintext_span = plaintext.bytes(); - [[maybe_unused]] Bytes actual_ciphertext_span = actual_ciphertext.bytes(); - [[maybe_unused]] Bytes tag_span = tag.bytes(); + auto plaintext = TRY_OR_THROW_OOM(m_realm->vm(), ByteBuffer::create_zeroed(actual_ciphertext.size())); - // FIXME: auto result = cipher.decrypt(ciphertext, plaintext_span, normalized_algorithm.iv, additional_data, tag_span); - return WebIDL::NotSupportedError::create(m_realm, "AES GCM decryption not yet implemented"_string); + auto result = cipher.decrypt(actual_ciphertext.bytes(), plaintext.bytes(), normalized_algorithm.iv, additional_data, tag.bytes()); // If the result of the algorithm is the indication of inauthenticity, "FAIL": throw an OperationError - // if (result == ::Crypto::VerificationConsistency::Inconsistent) - // return WebIDL::OperationError::create(m_realm, "Decryption failed"_string); + if (result == ::Crypto::VerificationConsistency::Inconsistent) + return WebIDL::OperationError::create(m_realm, "Decryption failed"_string); // Otherwise: Let plaintext be the output P of the Authenticated Decryption Function. // 9. Return the result of creating an ArrayBuffer containing plaintext. - // return JS::ArrayBuffer::create(m_realm, plaintext); + return JS::ArrayBuffer::create(m_realm, plaintext); } WebIDL::ExceptionOr, GC::Ref>> AesGcm::generate_key(AlgorithmParams const& params, bool extractable, Vector const& key_usages) diff --git a/Tests/LibWeb/Text/expected/wpt-import/WebCryptoAPI/encrypt_decrypt/aes_gcm.https.any.txt b/Tests/LibWeb/Text/expected/wpt-import/WebCryptoAPI/encrypt_decrypt/aes_gcm.https.any.txt new file mode 100644 index 0000000000000..bfc5fa7a180d7 --- /dev/null +++ b/Tests/LibWeb/Text/expected/wpt-import/WebCryptoAPI/encrypt_decrypt/aes_gcm.https.any.txt @@ -0,0 +1,330 @@ +Harness status: OK + +Found 325 tests + +325 Pass +Pass setup +Pass AES-GCM 128-bit key, 32-bit tag, 96-bit iv +Pass AES-GCM 128-bit key, no additional data, 32-bit tag, 96-bit iv +Pass AES-GCM 128-bit key, 64-bit tag, 96-bit iv +Pass AES-GCM 128-bit key, no additional data, 64-bit tag, 96-bit iv +Pass AES-GCM 128-bit key, 96-bit tag, 96-bit iv +Pass AES-GCM 128-bit key, no additional data, 96-bit tag, 96-bit iv +Pass AES-GCM 128-bit key, 104-bit tag, 96-bit iv +Pass AES-GCM 128-bit key, no additional data, 104-bit tag, 96-bit iv +Pass AES-GCM 128-bit key, 112-bit tag, 96-bit iv +Pass AES-GCM 128-bit key, no additional data, 112-bit tag, 96-bit iv +Pass AES-GCM 128-bit key, 120-bit tag, 96-bit iv +Pass AES-GCM 128-bit key, no additional data, 120-bit tag, 96-bit iv +Pass AES-GCM 128-bit key, 128-bit tag, 96-bit iv +Pass AES-GCM 128-bit key, no additional data, 128-bit tag, 96-bit iv +Pass AES-GCM 192-bit key, 32-bit tag, 96-bit iv +Pass AES-GCM 192-bit key, no additional data, 32-bit tag, 96-bit iv +Pass AES-GCM 192-bit key, 64-bit tag, 96-bit iv +Pass AES-GCM 192-bit key, no additional data, 64-bit tag, 96-bit iv +Pass AES-GCM 192-bit key, 96-bit tag, 96-bit iv +Pass AES-GCM 192-bit key, no additional data, 96-bit tag, 96-bit iv +Pass AES-GCM 192-bit key, 104-bit tag, 96-bit iv +Pass AES-GCM 192-bit key, no additional data, 104-bit tag, 96-bit iv +Pass AES-GCM 192-bit key, 112-bit tag, 96-bit iv +Pass AES-GCM 192-bit key, no additional data, 112-bit tag, 96-bit iv +Pass AES-GCM 192-bit key, 120-bit tag, 96-bit iv +Pass AES-GCM 192-bit key, no additional data, 120-bit tag, 96-bit iv +Pass AES-GCM 192-bit key, 128-bit tag, 96-bit iv +Pass AES-GCM 192-bit key, no additional data, 128-bit tag, 96-bit iv +Pass AES-GCM 256-bit key, 32-bit tag, 96-bit iv +Pass AES-GCM 256-bit key, no additional data, 32-bit tag, 96-bit iv +Pass AES-GCM 256-bit key, 64-bit tag, 96-bit iv +Pass AES-GCM 256-bit key, no additional data, 64-bit tag, 96-bit iv +Pass AES-GCM 256-bit key, 96-bit tag, 96-bit iv +Pass AES-GCM 256-bit key, no additional data, 96-bit tag, 96-bit iv +Pass AES-GCM 256-bit key, 104-bit tag, 96-bit iv +Pass AES-GCM 256-bit key, no additional data, 104-bit tag, 96-bit iv +Pass AES-GCM 256-bit key, 112-bit tag, 96-bit iv +Pass AES-GCM 256-bit key, no additional data, 112-bit tag, 96-bit iv +Pass AES-GCM 256-bit key, 120-bit tag, 96-bit iv +Pass AES-GCM 256-bit key, no additional data, 120-bit tag, 96-bit iv +Pass AES-GCM 256-bit key, 128-bit tag, 96-bit iv +Pass AES-GCM 256-bit key, no additional data, 128-bit tag, 96-bit iv +Pass AES-GCM 128-bit key, 32-bit tag, 96-bit iv with altered plaintext +Pass AES-GCM 128-bit key, no additional data, 32-bit tag, 96-bit iv with altered plaintext +Pass AES-GCM 128-bit key, 64-bit tag, 96-bit iv with altered plaintext +Pass AES-GCM 128-bit key, no additional data, 64-bit tag, 96-bit iv with altered plaintext +Pass AES-GCM 128-bit key, 96-bit tag, 96-bit iv with altered plaintext +Pass AES-GCM 128-bit key, no additional data, 96-bit tag, 96-bit iv with altered plaintext +Pass AES-GCM 128-bit key, 104-bit tag, 96-bit iv with altered plaintext +Pass AES-GCM 128-bit key, no additional data, 104-bit tag, 96-bit iv with altered plaintext +Pass AES-GCM 128-bit key, 112-bit tag, 96-bit iv with altered plaintext +Pass AES-GCM 128-bit key, no additional data, 112-bit tag, 96-bit iv with altered plaintext +Pass AES-GCM 128-bit key, 120-bit tag, 96-bit iv with altered plaintext +Pass AES-GCM 128-bit key, no additional data, 120-bit tag, 96-bit iv with altered plaintext +Pass AES-GCM 128-bit key, 128-bit tag, 96-bit iv with altered plaintext +Pass AES-GCM 128-bit key, no additional data, 128-bit tag, 96-bit iv with altered plaintext +Pass AES-GCM 192-bit key, 32-bit tag, 96-bit iv with altered plaintext +Pass AES-GCM 192-bit key, no additional data, 32-bit tag, 96-bit iv with altered plaintext +Pass AES-GCM 192-bit key, 64-bit tag, 96-bit iv with altered plaintext +Pass AES-GCM 192-bit key, no additional data, 64-bit tag, 96-bit iv with altered plaintext +Pass AES-GCM 192-bit key, 96-bit tag, 96-bit iv with altered plaintext +Pass AES-GCM 192-bit key, no additional data, 96-bit tag, 96-bit iv with altered plaintext +Pass AES-GCM 192-bit key, 104-bit tag, 96-bit iv with altered plaintext +Pass AES-GCM 192-bit key, no additional data, 104-bit tag, 96-bit iv with altered plaintext +Pass AES-GCM 192-bit key, 112-bit tag, 96-bit iv with altered plaintext +Pass AES-GCM 192-bit key, no additional data, 112-bit tag, 96-bit iv with altered plaintext +Pass AES-GCM 192-bit key, 120-bit tag, 96-bit iv with altered plaintext +Pass AES-GCM 192-bit key, no additional data, 120-bit tag, 96-bit iv with altered plaintext +Pass AES-GCM 192-bit key, 128-bit tag, 96-bit iv with altered plaintext +Pass AES-GCM 192-bit key, no additional data, 128-bit tag, 96-bit iv with altered plaintext +Pass AES-GCM 256-bit key, 32-bit tag, 96-bit iv with altered plaintext +Pass AES-GCM 256-bit key, no additional data, 32-bit tag, 96-bit iv with altered plaintext +Pass AES-GCM 256-bit key, 64-bit tag, 96-bit iv with altered plaintext +Pass AES-GCM 256-bit key, no additional data, 64-bit tag, 96-bit iv with altered plaintext +Pass AES-GCM 256-bit key, 96-bit tag, 96-bit iv with altered plaintext +Pass AES-GCM 256-bit key, no additional data, 96-bit tag, 96-bit iv with altered plaintext +Pass AES-GCM 256-bit key, 104-bit tag, 96-bit iv with altered plaintext +Pass AES-GCM 256-bit key, no additional data, 104-bit tag, 96-bit iv with altered plaintext +Pass AES-GCM 256-bit key, 112-bit tag, 96-bit iv with altered plaintext +Pass AES-GCM 256-bit key, no additional data, 112-bit tag, 96-bit iv with altered plaintext +Pass AES-GCM 256-bit key, 120-bit tag, 96-bit iv with altered plaintext +Pass AES-GCM 256-bit key, no additional data, 120-bit tag, 96-bit iv with altered plaintext +Pass AES-GCM 256-bit key, 128-bit tag, 96-bit iv with altered plaintext +Pass AES-GCM 256-bit key, no additional data, 128-bit tag, 96-bit iv with altered plaintext +Pass AES-GCM 128-bit key, 32-bit tag, 96-bit iv decryption +Pass AES-GCM 128-bit key, no additional data, 32-bit tag, 96-bit iv decryption +Pass AES-GCM 128-bit key, 64-bit tag, 96-bit iv decryption +Pass AES-GCM 128-bit key, no additional data, 64-bit tag, 96-bit iv decryption +Pass AES-GCM 128-bit key, 96-bit tag, 96-bit iv decryption +Pass AES-GCM 128-bit key, no additional data, 96-bit tag, 96-bit iv decryption +Pass AES-GCM 128-bit key, 104-bit tag, 96-bit iv decryption +Pass AES-GCM 128-bit key, no additional data, 104-bit tag, 96-bit iv decryption +Pass AES-GCM 128-bit key, 112-bit tag, 96-bit iv decryption +Pass AES-GCM 128-bit key, no additional data, 112-bit tag, 96-bit iv decryption +Pass AES-GCM 128-bit key, 120-bit tag, 96-bit iv decryption +Pass AES-GCM 128-bit key, no additional data, 120-bit tag, 96-bit iv decryption +Pass AES-GCM 128-bit key, 128-bit tag, 96-bit iv decryption +Pass AES-GCM 128-bit key, no additional data, 128-bit tag, 96-bit iv decryption +Pass AES-GCM 192-bit key, 32-bit tag, 96-bit iv decryption +Pass AES-GCM 192-bit key, no additional data, 32-bit tag, 96-bit iv decryption +Pass AES-GCM 192-bit key, 64-bit tag, 96-bit iv decryption +Pass AES-GCM 192-bit key, no additional data, 64-bit tag, 96-bit iv decryption +Pass AES-GCM 192-bit key, 96-bit tag, 96-bit iv decryption +Pass AES-GCM 192-bit key, no additional data, 96-bit tag, 96-bit iv decryption +Pass AES-GCM 192-bit key, 104-bit tag, 96-bit iv decryption +Pass AES-GCM 192-bit key, no additional data, 104-bit tag, 96-bit iv decryption +Pass AES-GCM 192-bit key, 112-bit tag, 96-bit iv decryption +Pass AES-GCM 192-bit key, no additional data, 112-bit tag, 96-bit iv decryption +Pass AES-GCM 192-bit key, 120-bit tag, 96-bit iv decryption +Pass AES-GCM 192-bit key, no additional data, 120-bit tag, 96-bit iv decryption +Pass AES-GCM 192-bit key, 128-bit tag, 96-bit iv decryption +Pass AES-GCM 192-bit key, no additional data, 128-bit tag, 96-bit iv decryption +Pass AES-GCM 256-bit key, 32-bit tag, 96-bit iv decryption +Pass AES-GCM 256-bit key, no additional data, 32-bit tag, 96-bit iv decryption +Pass AES-GCM 256-bit key, 64-bit tag, 96-bit iv decryption +Pass AES-GCM 256-bit key, no additional data, 64-bit tag, 96-bit iv decryption +Pass AES-GCM 256-bit key, 96-bit tag, 96-bit iv decryption +Pass AES-GCM 256-bit key, no additional data, 96-bit tag, 96-bit iv decryption +Pass AES-GCM 256-bit key, 104-bit tag, 96-bit iv decryption +Pass AES-GCM 256-bit key, no additional data, 104-bit tag, 96-bit iv decryption +Pass AES-GCM 256-bit key, 112-bit tag, 96-bit iv decryption +Pass AES-GCM 256-bit key, no additional data, 112-bit tag, 96-bit iv decryption +Pass AES-GCM 256-bit key, 120-bit tag, 96-bit iv decryption +Pass AES-GCM 256-bit key, no additional data, 120-bit tag, 96-bit iv decryption +Pass AES-GCM 256-bit key, 128-bit tag, 96-bit iv decryption +Pass AES-GCM 256-bit key, no additional data, 128-bit tag, 96-bit iv decryption +Pass AES-GCM 128-bit key, 32-bit tag, 96-bit iv decryption with altered ciphertext +Pass AES-GCM 128-bit key, no additional data, 32-bit tag, 96-bit iv decryption with altered ciphertext +Pass AES-GCM 128-bit key, 64-bit tag, 96-bit iv decryption with altered ciphertext +Pass AES-GCM 128-bit key, no additional data, 64-bit tag, 96-bit iv decryption with altered ciphertext +Pass AES-GCM 128-bit key, 96-bit tag, 96-bit iv decryption with altered ciphertext +Pass AES-GCM 128-bit key, no additional data, 96-bit tag, 96-bit iv decryption with altered ciphertext +Pass AES-GCM 128-bit key, 104-bit tag, 96-bit iv decryption with altered ciphertext +Pass AES-GCM 128-bit key, no additional data, 104-bit tag, 96-bit iv decryption with altered ciphertext +Pass AES-GCM 128-bit key, 112-bit tag, 96-bit iv decryption with altered ciphertext +Pass AES-GCM 128-bit key, no additional data, 112-bit tag, 96-bit iv decryption with altered ciphertext +Pass AES-GCM 128-bit key, 120-bit tag, 96-bit iv decryption with altered ciphertext +Pass AES-GCM 128-bit key, no additional data, 120-bit tag, 96-bit iv decryption with altered ciphertext +Pass AES-GCM 128-bit key, 128-bit tag, 96-bit iv decryption with altered ciphertext +Pass AES-GCM 128-bit key, no additional data, 128-bit tag, 96-bit iv decryption with altered ciphertext +Pass AES-GCM 192-bit key, 32-bit tag, 96-bit iv decryption with altered ciphertext +Pass AES-GCM 192-bit key, no additional data, 32-bit tag, 96-bit iv decryption with altered ciphertext +Pass AES-GCM 192-bit key, 64-bit tag, 96-bit iv decryption with altered ciphertext +Pass AES-GCM 192-bit key, no additional data, 64-bit tag, 96-bit iv decryption with altered ciphertext +Pass AES-GCM 192-bit key, 96-bit tag, 96-bit iv decryption with altered ciphertext +Pass AES-GCM 192-bit key, no additional data, 96-bit tag, 96-bit iv decryption with altered ciphertext +Pass AES-GCM 192-bit key, 104-bit tag, 96-bit iv decryption with altered ciphertext +Pass AES-GCM 192-bit key, no additional data, 104-bit tag, 96-bit iv decryption with altered ciphertext +Pass AES-GCM 192-bit key, 112-bit tag, 96-bit iv decryption with altered ciphertext +Pass AES-GCM 192-bit key, no additional data, 112-bit tag, 96-bit iv decryption with altered ciphertext +Pass AES-GCM 192-bit key, 120-bit tag, 96-bit iv decryption with altered ciphertext +Pass AES-GCM 192-bit key, no additional data, 120-bit tag, 96-bit iv decryption with altered ciphertext +Pass AES-GCM 192-bit key, 128-bit tag, 96-bit iv decryption with altered ciphertext +Pass AES-GCM 192-bit key, no additional data, 128-bit tag, 96-bit iv decryption with altered ciphertext +Pass AES-GCM 256-bit key, 32-bit tag, 96-bit iv decryption with altered ciphertext +Pass AES-GCM 256-bit key, no additional data, 32-bit tag, 96-bit iv decryption with altered ciphertext +Pass AES-GCM 256-bit key, 64-bit tag, 96-bit iv decryption with altered ciphertext +Pass AES-GCM 256-bit key, no additional data, 64-bit tag, 96-bit iv decryption with altered ciphertext +Pass AES-GCM 256-bit key, 96-bit tag, 96-bit iv decryption with altered ciphertext +Pass AES-GCM 256-bit key, no additional data, 96-bit tag, 96-bit iv decryption with altered ciphertext +Pass AES-GCM 256-bit key, 104-bit tag, 96-bit iv decryption with altered ciphertext +Pass AES-GCM 256-bit key, no additional data, 104-bit tag, 96-bit iv decryption with altered ciphertext +Pass AES-GCM 256-bit key, 112-bit tag, 96-bit iv decryption with altered ciphertext +Pass AES-GCM 256-bit key, no additional data, 112-bit tag, 96-bit iv decryption with altered ciphertext +Pass AES-GCM 256-bit key, 120-bit tag, 96-bit iv decryption with altered ciphertext +Pass AES-GCM 256-bit key, no additional data, 120-bit tag, 96-bit iv decryption with altered ciphertext +Pass AES-GCM 256-bit key, 128-bit tag, 96-bit iv decryption with altered ciphertext +Pass AES-GCM 256-bit key, no additional data, 128-bit tag, 96-bit iv decryption with altered ciphertext +Pass AES-GCM 128-bit key, 32-bit tag, 96-bit iv without encrypt usage +Pass AES-GCM 128-bit key, no additional data, 32-bit tag, 96-bit iv without encrypt usage +Pass AES-GCM 128-bit key, 64-bit tag, 96-bit iv without encrypt usage +Pass AES-GCM 128-bit key, no additional data, 64-bit tag, 96-bit iv without encrypt usage +Pass AES-GCM 128-bit key, 96-bit tag, 96-bit iv without encrypt usage +Pass AES-GCM 128-bit key, no additional data, 96-bit tag, 96-bit iv without encrypt usage +Pass AES-GCM 128-bit key, 104-bit tag, 96-bit iv without encrypt usage +Pass AES-GCM 128-bit key, no additional data, 104-bit tag, 96-bit iv without encrypt usage +Pass AES-GCM 128-bit key, 112-bit tag, 96-bit iv without encrypt usage +Pass AES-GCM 128-bit key, no additional data, 112-bit tag, 96-bit iv without encrypt usage +Pass AES-GCM 128-bit key, 120-bit tag, 96-bit iv without encrypt usage +Pass AES-GCM 128-bit key, no additional data, 120-bit tag, 96-bit iv without encrypt usage +Pass AES-GCM 128-bit key, 128-bit tag, 96-bit iv without encrypt usage +Pass AES-GCM 128-bit key, no additional data, 128-bit tag, 96-bit iv without encrypt usage +Pass AES-GCM 192-bit key, 32-bit tag, 96-bit iv without encrypt usage +Pass AES-GCM 192-bit key, no additional data, 32-bit tag, 96-bit iv without encrypt usage +Pass AES-GCM 192-bit key, 64-bit tag, 96-bit iv without encrypt usage +Pass AES-GCM 192-bit key, no additional data, 64-bit tag, 96-bit iv without encrypt usage +Pass AES-GCM 192-bit key, 96-bit tag, 96-bit iv without encrypt usage +Pass AES-GCM 192-bit key, no additional data, 96-bit tag, 96-bit iv without encrypt usage +Pass AES-GCM 192-bit key, 104-bit tag, 96-bit iv without encrypt usage +Pass AES-GCM 192-bit key, no additional data, 104-bit tag, 96-bit iv without encrypt usage +Pass AES-GCM 192-bit key, 112-bit tag, 96-bit iv without encrypt usage +Pass AES-GCM 192-bit key, no additional data, 112-bit tag, 96-bit iv without encrypt usage +Pass AES-GCM 192-bit key, 120-bit tag, 96-bit iv without encrypt usage +Pass AES-GCM 192-bit key, no additional data, 120-bit tag, 96-bit iv without encrypt usage +Pass AES-GCM 192-bit key, 128-bit tag, 96-bit iv without encrypt usage +Pass AES-GCM 192-bit key, no additional data, 128-bit tag, 96-bit iv without encrypt usage +Pass AES-GCM 256-bit key, 32-bit tag, 96-bit iv without encrypt usage +Pass AES-GCM 256-bit key, no additional data, 32-bit tag, 96-bit iv without encrypt usage +Pass AES-GCM 256-bit key, 64-bit tag, 96-bit iv without encrypt usage +Pass AES-GCM 256-bit key, no additional data, 64-bit tag, 96-bit iv without encrypt usage +Pass AES-GCM 256-bit key, 96-bit tag, 96-bit iv without encrypt usage +Pass AES-GCM 256-bit key, no additional data, 96-bit tag, 96-bit iv without encrypt usage +Pass AES-GCM 256-bit key, 104-bit tag, 96-bit iv without encrypt usage +Pass AES-GCM 256-bit key, no additional data, 104-bit tag, 96-bit iv without encrypt usage +Pass AES-GCM 256-bit key, 112-bit tag, 96-bit iv without encrypt usage +Pass AES-GCM 256-bit key, no additional data, 112-bit tag, 96-bit iv without encrypt usage +Pass AES-GCM 256-bit key, 120-bit tag, 96-bit iv without encrypt usage +Pass AES-GCM 256-bit key, no additional data, 120-bit tag, 96-bit iv without encrypt usage +Pass AES-GCM 256-bit key, 128-bit tag, 96-bit iv without encrypt usage +Pass AES-GCM 256-bit key, no additional data, 128-bit tag, 96-bit iv without encrypt usage +Pass AES-GCM 128-bit key, 32-bit tag, 96-bit iv with mismatched key and algorithm +Pass AES-GCM 128-bit key, no additional data, 32-bit tag, 96-bit iv with mismatched key and algorithm +Pass AES-GCM 128-bit key, 64-bit tag, 96-bit iv with mismatched key and algorithm +Pass AES-GCM 128-bit key, no additional data, 64-bit tag, 96-bit iv with mismatched key and algorithm +Pass AES-GCM 128-bit key, 96-bit tag, 96-bit iv with mismatched key and algorithm +Pass AES-GCM 128-bit key, no additional data, 96-bit tag, 96-bit iv with mismatched key and algorithm +Pass AES-GCM 128-bit key, 104-bit tag, 96-bit iv with mismatched key and algorithm +Pass AES-GCM 128-bit key, no additional data, 104-bit tag, 96-bit iv with mismatched key and algorithm +Pass AES-GCM 128-bit key, 112-bit tag, 96-bit iv with mismatched key and algorithm +Pass AES-GCM 128-bit key, no additional data, 112-bit tag, 96-bit iv with mismatched key and algorithm +Pass AES-GCM 128-bit key, 120-bit tag, 96-bit iv with mismatched key and algorithm +Pass AES-GCM 128-bit key, no additional data, 120-bit tag, 96-bit iv with mismatched key and algorithm +Pass AES-GCM 128-bit key, 128-bit tag, 96-bit iv with mismatched key and algorithm +Pass AES-GCM 128-bit key, no additional data, 128-bit tag, 96-bit iv with mismatched key and algorithm +Pass AES-GCM 192-bit key, 32-bit tag, 96-bit iv with mismatched key and algorithm +Pass AES-GCM 192-bit key, no additional data, 32-bit tag, 96-bit iv with mismatched key and algorithm +Pass AES-GCM 192-bit key, 64-bit tag, 96-bit iv with mismatched key and algorithm +Pass AES-GCM 192-bit key, no additional data, 64-bit tag, 96-bit iv with mismatched key and algorithm +Pass AES-GCM 192-bit key, 96-bit tag, 96-bit iv with mismatched key and algorithm +Pass AES-GCM 192-bit key, no additional data, 96-bit tag, 96-bit iv with mismatched key and algorithm +Pass AES-GCM 192-bit key, 104-bit tag, 96-bit iv with mismatched key and algorithm +Pass AES-GCM 192-bit key, no additional data, 104-bit tag, 96-bit iv with mismatched key and algorithm +Pass AES-GCM 192-bit key, 112-bit tag, 96-bit iv with mismatched key and algorithm +Pass AES-GCM 192-bit key, no additional data, 112-bit tag, 96-bit iv with mismatched key and algorithm +Pass AES-GCM 192-bit key, 120-bit tag, 96-bit iv with mismatched key and algorithm +Pass AES-GCM 192-bit key, no additional data, 120-bit tag, 96-bit iv with mismatched key and algorithm +Pass AES-GCM 192-bit key, 128-bit tag, 96-bit iv with mismatched key and algorithm +Pass AES-GCM 192-bit key, no additional data, 128-bit tag, 96-bit iv with mismatched key and algorithm +Pass AES-GCM 256-bit key, 32-bit tag, 96-bit iv with mismatched key and algorithm +Pass AES-GCM 256-bit key, no additional data, 32-bit tag, 96-bit iv with mismatched key and algorithm +Pass AES-GCM 256-bit key, 64-bit tag, 96-bit iv with mismatched key and algorithm +Pass AES-GCM 256-bit key, no additional data, 64-bit tag, 96-bit iv with mismatched key and algorithm +Pass AES-GCM 256-bit key, 96-bit tag, 96-bit iv with mismatched key and algorithm +Pass AES-GCM 256-bit key, no additional data, 96-bit tag, 96-bit iv with mismatched key and algorithm +Pass AES-GCM 256-bit key, 104-bit tag, 96-bit iv with mismatched key and algorithm +Pass AES-GCM 256-bit key, no additional data, 104-bit tag, 96-bit iv with mismatched key and algorithm +Pass AES-GCM 256-bit key, 112-bit tag, 96-bit iv with mismatched key and algorithm +Pass AES-GCM 256-bit key, no additional data, 112-bit tag, 96-bit iv with mismatched key and algorithm +Pass AES-GCM 256-bit key, 120-bit tag, 96-bit iv with mismatched key and algorithm +Pass AES-GCM 256-bit key, no additional data, 120-bit tag, 96-bit iv with mismatched key and algorithm +Pass AES-GCM 256-bit key, 128-bit tag, 96-bit iv with mismatched key and algorithm +Pass AES-GCM 256-bit key, no additional data, 128-bit tag, 96-bit iv with mismatched key and algorithm +Pass AES-GCM 128-bit key, 32-bit tag, 96-bit iv without decrypt usage +Pass AES-GCM 128-bit key, no additional data, 32-bit tag, 96-bit iv without decrypt usage +Pass AES-GCM 128-bit key, 64-bit tag, 96-bit iv without decrypt usage +Pass AES-GCM 128-bit key, no additional data, 64-bit tag, 96-bit iv without decrypt usage +Pass AES-GCM 128-bit key, 96-bit tag, 96-bit iv without decrypt usage +Pass AES-GCM 128-bit key, no additional data, 96-bit tag, 96-bit iv without decrypt usage +Pass AES-GCM 128-bit key, 104-bit tag, 96-bit iv without decrypt usage +Pass AES-GCM 128-bit key, no additional data, 104-bit tag, 96-bit iv without decrypt usage +Pass AES-GCM 128-bit key, 112-bit tag, 96-bit iv without decrypt usage +Pass AES-GCM 128-bit key, no additional data, 112-bit tag, 96-bit iv without decrypt usage +Pass AES-GCM 128-bit key, 120-bit tag, 96-bit iv without decrypt usage +Pass AES-GCM 128-bit key, no additional data, 120-bit tag, 96-bit iv without decrypt usage +Pass AES-GCM 128-bit key, 128-bit tag, 96-bit iv without decrypt usage +Pass AES-GCM 128-bit key, no additional data, 128-bit tag, 96-bit iv without decrypt usage +Pass AES-GCM 192-bit key, 32-bit tag, 96-bit iv without decrypt usage +Pass AES-GCM 192-bit key, no additional data, 32-bit tag, 96-bit iv without decrypt usage +Pass AES-GCM 192-bit key, 64-bit tag, 96-bit iv without decrypt usage +Pass AES-GCM 192-bit key, no additional data, 64-bit tag, 96-bit iv without decrypt usage +Pass AES-GCM 192-bit key, 96-bit tag, 96-bit iv without decrypt usage +Pass AES-GCM 192-bit key, no additional data, 96-bit tag, 96-bit iv without decrypt usage +Pass AES-GCM 192-bit key, 104-bit tag, 96-bit iv without decrypt usage +Pass AES-GCM 192-bit key, no additional data, 104-bit tag, 96-bit iv without decrypt usage +Pass AES-GCM 192-bit key, 112-bit tag, 96-bit iv without decrypt usage +Pass AES-GCM 192-bit key, no additional data, 112-bit tag, 96-bit iv without decrypt usage +Pass AES-GCM 192-bit key, 120-bit tag, 96-bit iv without decrypt usage +Pass AES-GCM 192-bit key, no additional data, 120-bit tag, 96-bit iv without decrypt usage +Pass AES-GCM 192-bit key, 128-bit tag, 96-bit iv without decrypt usage +Pass AES-GCM 192-bit key, no additional data, 128-bit tag, 96-bit iv without decrypt usage +Pass AES-GCM 256-bit key, 32-bit tag, 96-bit iv without decrypt usage +Pass AES-GCM 256-bit key, no additional data, 32-bit tag, 96-bit iv without decrypt usage +Pass AES-GCM 256-bit key, 64-bit tag, 96-bit iv without decrypt usage +Pass AES-GCM 256-bit key, no additional data, 64-bit tag, 96-bit iv without decrypt usage +Pass AES-GCM 256-bit key, 96-bit tag, 96-bit iv without decrypt usage +Pass AES-GCM 256-bit key, no additional data, 96-bit tag, 96-bit iv without decrypt usage +Pass AES-GCM 256-bit key, 104-bit tag, 96-bit iv without decrypt usage +Pass AES-GCM 256-bit key, no additional data, 104-bit tag, 96-bit iv without decrypt usage +Pass AES-GCM 256-bit key, 112-bit tag, 96-bit iv without decrypt usage +Pass AES-GCM 256-bit key, no additional data, 112-bit tag, 96-bit iv without decrypt usage +Pass AES-GCM 256-bit key, 120-bit tag, 96-bit iv without decrypt usage +Pass AES-GCM 256-bit key, no additional data, 120-bit tag, 96-bit iv without decrypt usage +Pass AES-GCM 256-bit key, 128-bit tag, 96-bit iv without decrypt usage +Pass AES-GCM 256-bit key, no additional data, 128-bit tag, 96-bit iv without decrypt usage +Pass AES-GCM 128-bit key, 96-bit iv, illegal tag length 24-bits +Pass AES-GCM 128-bit key, 96-bit iv, illegal tag length 48-bits +Pass AES-GCM 128-bit key, 96-bit iv, illegal tag length 72-bits +Pass AES-GCM 128-bit key, 96-bit iv, illegal tag length 95-bits +Pass AES-GCM 128-bit key, 96-bit iv, illegal tag length 129-bits +Pass AES-GCM 192-bit key, 96-bit iv, illegal tag length 24-bits +Pass AES-GCM 192-bit key, 96-bit iv, illegal tag length 48-bits +Pass AES-GCM 192-bit key, 96-bit iv, illegal tag length 72-bits +Pass AES-GCM 192-bit key, 96-bit iv, illegal tag length 95-bits +Pass AES-GCM 192-bit key, 96-bit iv, illegal tag length 129-bits +Pass AES-GCM 256-bit key, 96-bit iv, illegal tag length 24-bits +Pass AES-GCM 256-bit key, 96-bit iv, illegal tag length 48-bits +Pass AES-GCM 256-bit key, 96-bit iv, illegal tag length 72-bits +Pass AES-GCM 256-bit key, 96-bit iv, illegal tag length 95-bits +Pass AES-GCM 256-bit key, 96-bit iv, illegal tag length 129-bits +Pass AES-GCM 128-bit key, 96-bit iv, illegal tag length 24-bits decryption +Pass AES-GCM 128-bit key, 96-bit iv, illegal tag length 48-bits decryption +Pass AES-GCM 128-bit key, 96-bit iv, illegal tag length 72-bits decryption +Pass AES-GCM 128-bit key, 96-bit iv, illegal tag length 95-bits decryption +Pass AES-GCM 128-bit key, 96-bit iv, illegal tag length 129-bits decryption +Pass AES-GCM 192-bit key, 96-bit iv, illegal tag length 24-bits decryption +Pass AES-GCM 192-bit key, 96-bit iv, illegal tag length 48-bits decryption +Pass AES-GCM 192-bit key, 96-bit iv, illegal tag length 72-bits decryption +Pass AES-GCM 192-bit key, 96-bit iv, illegal tag length 95-bits decryption +Pass AES-GCM 192-bit key, 96-bit iv, illegal tag length 129-bits decryption +Pass AES-GCM 256-bit key, 96-bit iv, illegal tag length 24-bits decryption +Pass AES-GCM 256-bit key, 96-bit iv, illegal tag length 48-bits decryption +Pass AES-GCM 256-bit key, 96-bit iv, illegal tag length 72-bits decryption +Pass AES-GCM 256-bit key, 96-bit iv, illegal tag length 95-bits decryption +Pass AES-GCM 256-bit key, 96-bit iv, illegal tag length 129-bits decryption \ No newline at end of file diff --git a/Tests/LibWeb/Text/expected/wpt-import/WebCryptoAPI/encrypt_decrypt/aes_gcm_256_iv.https.any.txt b/Tests/LibWeb/Text/expected/wpt-import/WebCryptoAPI/encrypt_decrypt/aes_gcm_256_iv.https.any.txt new file mode 100644 index 0000000000000..28dc5e00037ba --- /dev/null +++ b/Tests/LibWeb/Text/expected/wpt-import/WebCryptoAPI/encrypt_decrypt/aes_gcm_256_iv.https.any.txt @@ -0,0 +1,330 @@ +Harness status: OK + +Found 325 tests + +325 Pass +Pass setup +Pass AES-GCM 128-bit key, 32-bit tag, 256-bit iv +Pass AES-GCM 128-bit key, no additional data, 32-bit tag, 256-bit iv +Pass AES-GCM 128-bit key, 64-bit tag, 256-bit iv +Pass AES-GCM 128-bit key, no additional data, 64-bit tag, 256-bit iv +Pass AES-GCM 128-bit key, 96-bit tag, 256-bit iv +Pass AES-GCM 128-bit key, no additional data, 96-bit tag, 256-bit iv +Pass AES-GCM 128-bit key, 104-bit tag, 256-bit iv +Pass AES-GCM 128-bit key, no additional data, 104-bit tag, 256-bit iv +Pass AES-GCM 128-bit key, 112-bit tag, 256-bit iv +Pass AES-GCM 128-bit key, no additional data, 112-bit tag, 256-bit iv +Pass AES-GCM 128-bit key, 120-bit tag, 256-bit iv +Pass AES-GCM 128-bit key, no additional data, 120-bit tag, 256-bit iv +Pass AES-GCM 128-bit key, 128-bit tag, 256-bit iv +Pass AES-GCM 128-bit key, no additional data, 128-bit tag, 256-bit iv +Pass AES-GCM 192-bit key, 32-bit tag, 256-bit iv +Pass AES-GCM 192-bit key, no additional data, 32-bit tag, 256-bit iv +Pass AES-GCM 192-bit key, 64-bit tag, 256-bit iv +Pass AES-GCM 192-bit key, no additional data, 64-bit tag, 256-bit iv +Pass AES-GCM 192-bit key, 96-bit tag, 256-bit iv +Pass AES-GCM 192-bit key, no additional data, 96-bit tag, 256-bit iv +Pass AES-GCM 192-bit key, 104-bit tag, 256-bit iv +Pass AES-GCM 192-bit key, no additional data, 104-bit tag, 256-bit iv +Pass AES-GCM 192-bit key, 112-bit tag, 256-bit iv +Pass AES-GCM 192-bit key, no additional data, 112-bit tag, 256-bit iv +Pass AES-GCM 192-bit key, 120-bit tag, 256-bit iv +Pass AES-GCM 192-bit key, no additional data, 120-bit tag, 256-bit iv +Pass AES-GCM 192-bit key, 128-bit tag, 256-bit iv +Pass AES-GCM 192-bit key, no additional data, 128-bit tag, 256-bit iv +Pass AES-GCM 256-bit key, 32-bit tag, 256-bit iv +Pass AES-GCM 256-bit key, no additional data, 32-bit tag, 256-bit iv +Pass AES-GCM 256-bit key, 64-bit tag, 256-bit iv +Pass AES-GCM 256-bit key, no additional data, 64-bit tag, 256-bit iv +Pass AES-GCM 256-bit key, 96-bit tag, 256-bit iv +Pass AES-GCM 256-bit key, no additional data, 96-bit tag, 256-bit iv +Pass AES-GCM 256-bit key, 104-bit tag, 256-bit iv +Pass AES-GCM 256-bit key, no additional data, 104-bit tag, 256-bit iv +Pass AES-GCM 256-bit key, 112-bit tag, 256-bit iv +Pass AES-GCM 256-bit key, no additional data, 112-bit tag, 256-bit iv +Pass AES-GCM 256-bit key, 120-bit tag, 256-bit iv +Pass AES-GCM 256-bit key, no additional data, 120-bit tag, 256-bit iv +Pass AES-GCM 256-bit key, 128-bit tag, 256-bit iv +Pass AES-GCM 256-bit key, no additional data, 128-bit tag, 256-bit iv +Pass AES-GCM 128-bit key, 32-bit tag, 256-bit iv with altered plaintext +Pass AES-GCM 128-bit key, no additional data, 32-bit tag, 256-bit iv with altered plaintext +Pass AES-GCM 128-bit key, 64-bit tag, 256-bit iv with altered plaintext +Pass AES-GCM 128-bit key, no additional data, 64-bit tag, 256-bit iv with altered plaintext +Pass AES-GCM 128-bit key, 96-bit tag, 256-bit iv with altered plaintext +Pass AES-GCM 128-bit key, no additional data, 96-bit tag, 256-bit iv with altered plaintext +Pass AES-GCM 128-bit key, 104-bit tag, 256-bit iv with altered plaintext +Pass AES-GCM 128-bit key, no additional data, 104-bit tag, 256-bit iv with altered plaintext +Pass AES-GCM 128-bit key, 112-bit tag, 256-bit iv with altered plaintext +Pass AES-GCM 128-bit key, no additional data, 112-bit tag, 256-bit iv with altered plaintext +Pass AES-GCM 128-bit key, 120-bit tag, 256-bit iv with altered plaintext +Pass AES-GCM 128-bit key, no additional data, 120-bit tag, 256-bit iv with altered plaintext +Pass AES-GCM 128-bit key, 128-bit tag, 256-bit iv with altered plaintext +Pass AES-GCM 128-bit key, no additional data, 128-bit tag, 256-bit iv with altered plaintext +Pass AES-GCM 192-bit key, 32-bit tag, 256-bit iv with altered plaintext +Pass AES-GCM 192-bit key, no additional data, 32-bit tag, 256-bit iv with altered plaintext +Pass AES-GCM 192-bit key, 64-bit tag, 256-bit iv with altered plaintext +Pass AES-GCM 192-bit key, no additional data, 64-bit tag, 256-bit iv with altered plaintext +Pass AES-GCM 192-bit key, 96-bit tag, 256-bit iv with altered plaintext +Pass AES-GCM 192-bit key, no additional data, 96-bit tag, 256-bit iv with altered plaintext +Pass AES-GCM 192-bit key, 104-bit tag, 256-bit iv with altered plaintext +Pass AES-GCM 192-bit key, no additional data, 104-bit tag, 256-bit iv with altered plaintext +Pass AES-GCM 192-bit key, 112-bit tag, 256-bit iv with altered plaintext +Pass AES-GCM 192-bit key, no additional data, 112-bit tag, 256-bit iv with altered plaintext +Pass AES-GCM 192-bit key, 120-bit tag, 256-bit iv with altered plaintext +Pass AES-GCM 192-bit key, no additional data, 120-bit tag, 256-bit iv with altered plaintext +Pass AES-GCM 192-bit key, 128-bit tag, 256-bit iv with altered plaintext +Pass AES-GCM 192-bit key, no additional data, 128-bit tag, 256-bit iv with altered plaintext +Pass AES-GCM 256-bit key, 32-bit tag, 256-bit iv with altered plaintext +Pass AES-GCM 256-bit key, no additional data, 32-bit tag, 256-bit iv with altered plaintext +Pass AES-GCM 256-bit key, 64-bit tag, 256-bit iv with altered plaintext +Pass AES-GCM 256-bit key, no additional data, 64-bit tag, 256-bit iv with altered plaintext +Pass AES-GCM 256-bit key, 96-bit tag, 256-bit iv with altered plaintext +Pass AES-GCM 256-bit key, no additional data, 96-bit tag, 256-bit iv with altered plaintext +Pass AES-GCM 256-bit key, 104-bit tag, 256-bit iv with altered plaintext +Pass AES-GCM 256-bit key, no additional data, 104-bit tag, 256-bit iv with altered plaintext +Pass AES-GCM 256-bit key, 112-bit tag, 256-bit iv with altered plaintext +Pass AES-GCM 256-bit key, no additional data, 112-bit tag, 256-bit iv with altered plaintext +Pass AES-GCM 256-bit key, 120-bit tag, 256-bit iv with altered plaintext +Pass AES-GCM 256-bit key, no additional data, 120-bit tag, 256-bit iv with altered plaintext +Pass AES-GCM 256-bit key, 128-bit tag, 256-bit iv with altered plaintext +Pass AES-GCM 256-bit key, no additional data, 128-bit tag, 256-bit iv with altered plaintext +Pass AES-GCM 128-bit key, 32-bit tag, 256-bit iv decryption +Pass AES-GCM 128-bit key, no additional data, 32-bit tag, 256-bit iv decryption +Pass AES-GCM 128-bit key, 64-bit tag, 256-bit iv decryption +Pass AES-GCM 128-bit key, no additional data, 64-bit tag, 256-bit iv decryption +Pass AES-GCM 128-bit key, 96-bit tag, 256-bit iv decryption +Pass AES-GCM 128-bit key, no additional data, 96-bit tag, 256-bit iv decryption +Pass AES-GCM 128-bit key, 104-bit tag, 256-bit iv decryption +Pass AES-GCM 128-bit key, no additional data, 104-bit tag, 256-bit iv decryption +Pass AES-GCM 128-bit key, 112-bit tag, 256-bit iv decryption +Pass AES-GCM 128-bit key, no additional data, 112-bit tag, 256-bit iv decryption +Pass AES-GCM 128-bit key, 120-bit tag, 256-bit iv decryption +Pass AES-GCM 128-bit key, no additional data, 120-bit tag, 256-bit iv decryption +Pass AES-GCM 128-bit key, 128-bit tag, 256-bit iv decryption +Pass AES-GCM 128-bit key, no additional data, 128-bit tag, 256-bit iv decryption +Pass AES-GCM 192-bit key, 32-bit tag, 256-bit iv decryption +Pass AES-GCM 192-bit key, no additional data, 32-bit tag, 256-bit iv decryption +Pass AES-GCM 192-bit key, 64-bit tag, 256-bit iv decryption +Pass AES-GCM 192-bit key, no additional data, 64-bit tag, 256-bit iv decryption +Pass AES-GCM 192-bit key, 96-bit tag, 256-bit iv decryption +Pass AES-GCM 192-bit key, no additional data, 96-bit tag, 256-bit iv decryption +Pass AES-GCM 192-bit key, 104-bit tag, 256-bit iv decryption +Pass AES-GCM 192-bit key, no additional data, 104-bit tag, 256-bit iv decryption +Pass AES-GCM 192-bit key, 112-bit tag, 256-bit iv decryption +Pass AES-GCM 192-bit key, no additional data, 112-bit tag, 256-bit iv decryption +Pass AES-GCM 192-bit key, 120-bit tag, 256-bit iv decryption +Pass AES-GCM 192-bit key, no additional data, 120-bit tag, 256-bit iv decryption +Pass AES-GCM 192-bit key, 128-bit tag, 256-bit iv decryption +Pass AES-GCM 192-bit key, no additional data, 128-bit tag, 256-bit iv decryption +Pass AES-GCM 256-bit key, 32-bit tag, 256-bit iv decryption +Pass AES-GCM 256-bit key, no additional data, 32-bit tag, 256-bit iv decryption +Pass AES-GCM 256-bit key, 64-bit tag, 256-bit iv decryption +Pass AES-GCM 256-bit key, no additional data, 64-bit tag, 256-bit iv decryption +Pass AES-GCM 256-bit key, 96-bit tag, 256-bit iv decryption +Pass AES-GCM 256-bit key, no additional data, 96-bit tag, 256-bit iv decryption +Pass AES-GCM 256-bit key, 104-bit tag, 256-bit iv decryption +Pass AES-GCM 256-bit key, no additional data, 104-bit tag, 256-bit iv decryption +Pass AES-GCM 256-bit key, 112-bit tag, 256-bit iv decryption +Pass AES-GCM 256-bit key, no additional data, 112-bit tag, 256-bit iv decryption +Pass AES-GCM 256-bit key, 120-bit tag, 256-bit iv decryption +Pass AES-GCM 256-bit key, no additional data, 120-bit tag, 256-bit iv decryption +Pass AES-GCM 256-bit key, 128-bit tag, 256-bit iv decryption +Pass AES-GCM 256-bit key, no additional data, 128-bit tag, 256-bit iv decryption +Pass AES-GCM 128-bit key, 32-bit tag, 256-bit iv decryption with altered ciphertext +Pass AES-GCM 128-bit key, no additional data, 32-bit tag, 256-bit iv decryption with altered ciphertext +Pass AES-GCM 128-bit key, 64-bit tag, 256-bit iv decryption with altered ciphertext +Pass AES-GCM 128-bit key, no additional data, 64-bit tag, 256-bit iv decryption with altered ciphertext +Pass AES-GCM 128-bit key, 96-bit tag, 256-bit iv decryption with altered ciphertext +Pass AES-GCM 128-bit key, no additional data, 96-bit tag, 256-bit iv decryption with altered ciphertext +Pass AES-GCM 128-bit key, 104-bit tag, 256-bit iv decryption with altered ciphertext +Pass AES-GCM 128-bit key, no additional data, 104-bit tag, 256-bit iv decryption with altered ciphertext +Pass AES-GCM 128-bit key, 112-bit tag, 256-bit iv decryption with altered ciphertext +Pass AES-GCM 128-bit key, no additional data, 112-bit tag, 256-bit iv decryption with altered ciphertext +Pass AES-GCM 128-bit key, 120-bit tag, 256-bit iv decryption with altered ciphertext +Pass AES-GCM 128-bit key, no additional data, 120-bit tag, 256-bit iv decryption with altered ciphertext +Pass AES-GCM 128-bit key, 128-bit tag, 256-bit iv decryption with altered ciphertext +Pass AES-GCM 128-bit key, no additional data, 128-bit tag, 256-bit iv decryption with altered ciphertext +Pass AES-GCM 192-bit key, 32-bit tag, 256-bit iv decryption with altered ciphertext +Pass AES-GCM 192-bit key, no additional data, 32-bit tag, 256-bit iv decryption with altered ciphertext +Pass AES-GCM 192-bit key, 64-bit tag, 256-bit iv decryption with altered ciphertext +Pass AES-GCM 192-bit key, no additional data, 64-bit tag, 256-bit iv decryption with altered ciphertext +Pass AES-GCM 192-bit key, 96-bit tag, 256-bit iv decryption with altered ciphertext +Pass AES-GCM 192-bit key, no additional data, 96-bit tag, 256-bit iv decryption with altered ciphertext +Pass AES-GCM 192-bit key, 104-bit tag, 256-bit iv decryption with altered ciphertext +Pass AES-GCM 192-bit key, no additional data, 104-bit tag, 256-bit iv decryption with altered ciphertext +Pass AES-GCM 192-bit key, 112-bit tag, 256-bit iv decryption with altered ciphertext +Pass AES-GCM 192-bit key, no additional data, 112-bit tag, 256-bit iv decryption with altered ciphertext +Pass AES-GCM 192-bit key, 120-bit tag, 256-bit iv decryption with altered ciphertext +Pass AES-GCM 192-bit key, no additional data, 120-bit tag, 256-bit iv decryption with altered ciphertext +Pass AES-GCM 192-bit key, 128-bit tag, 256-bit iv decryption with altered ciphertext +Pass AES-GCM 192-bit key, no additional data, 128-bit tag, 256-bit iv decryption with altered ciphertext +Pass AES-GCM 256-bit key, 32-bit tag, 256-bit iv decryption with altered ciphertext +Pass AES-GCM 256-bit key, no additional data, 32-bit tag, 256-bit iv decryption with altered ciphertext +Pass AES-GCM 256-bit key, 64-bit tag, 256-bit iv decryption with altered ciphertext +Pass AES-GCM 256-bit key, no additional data, 64-bit tag, 256-bit iv decryption with altered ciphertext +Pass AES-GCM 256-bit key, 96-bit tag, 256-bit iv decryption with altered ciphertext +Pass AES-GCM 256-bit key, no additional data, 96-bit tag, 256-bit iv decryption with altered ciphertext +Pass AES-GCM 256-bit key, 104-bit tag, 256-bit iv decryption with altered ciphertext +Pass AES-GCM 256-bit key, no additional data, 104-bit tag, 256-bit iv decryption with altered ciphertext +Pass AES-GCM 256-bit key, 112-bit tag, 256-bit iv decryption with altered ciphertext +Pass AES-GCM 256-bit key, no additional data, 112-bit tag, 256-bit iv decryption with altered ciphertext +Pass AES-GCM 256-bit key, 120-bit tag, 256-bit iv decryption with altered ciphertext +Pass AES-GCM 256-bit key, no additional data, 120-bit tag, 256-bit iv decryption with altered ciphertext +Pass AES-GCM 256-bit key, 128-bit tag, 256-bit iv decryption with altered ciphertext +Pass AES-GCM 256-bit key, no additional data, 128-bit tag, 256-bit iv decryption with altered ciphertext +Pass AES-GCM 128-bit key, 32-bit tag, 256-bit iv without encrypt usage +Pass AES-GCM 128-bit key, no additional data, 32-bit tag, 256-bit iv without encrypt usage +Pass AES-GCM 128-bit key, 64-bit tag, 256-bit iv without encrypt usage +Pass AES-GCM 128-bit key, no additional data, 64-bit tag, 256-bit iv without encrypt usage +Pass AES-GCM 128-bit key, 96-bit tag, 256-bit iv without encrypt usage +Pass AES-GCM 128-bit key, no additional data, 96-bit tag, 256-bit iv without encrypt usage +Pass AES-GCM 128-bit key, 104-bit tag, 256-bit iv without encrypt usage +Pass AES-GCM 128-bit key, no additional data, 104-bit tag, 256-bit iv without encrypt usage +Pass AES-GCM 128-bit key, 112-bit tag, 256-bit iv without encrypt usage +Pass AES-GCM 128-bit key, no additional data, 112-bit tag, 256-bit iv without encrypt usage +Pass AES-GCM 128-bit key, 120-bit tag, 256-bit iv without encrypt usage +Pass AES-GCM 128-bit key, no additional data, 120-bit tag, 256-bit iv without encrypt usage +Pass AES-GCM 128-bit key, 128-bit tag, 256-bit iv without encrypt usage +Pass AES-GCM 128-bit key, no additional data, 128-bit tag, 256-bit iv without encrypt usage +Pass AES-GCM 192-bit key, 32-bit tag, 256-bit iv without encrypt usage +Pass AES-GCM 192-bit key, no additional data, 32-bit tag, 256-bit iv without encrypt usage +Pass AES-GCM 192-bit key, 64-bit tag, 256-bit iv without encrypt usage +Pass AES-GCM 192-bit key, no additional data, 64-bit tag, 256-bit iv without encrypt usage +Pass AES-GCM 192-bit key, 96-bit tag, 256-bit iv without encrypt usage +Pass AES-GCM 192-bit key, no additional data, 96-bit tag, 256-bit iv without encrypt usage +Pass AES-GCM 192-bit key, 104-bit tag, 256-bit iv without encrypt usage +Pass AES-GCM 192-bit key, no additional data, 104-bit tag, 256-bit iv without encrypt usage +Pass AES-GCM 192-bit key, 112-bit tag, 256-bit iv without encrypt usage +Pass AES-GCM 192-bit key, no additional data, 112-bit tag, 256-bit iv without encrypt usage +Pass AES-GCM 192-bit key, 120-bit tag, 256-bit iv without encrypt usage +Pass AES-GCM 192-bit key, no additional data, 120-bit tag, 256-bit iv without encrypt usage +Pass AES-GCM 192-bit key, 128-bit tag, 256-bit iv without encrypt usage +Pass AES-GCM 192-bit key, no additional data, 128-bit tag, 256-bit iv without encrypt usage +Pass AES-GCM 256-bit key, 32-bit tag, 256-bit iv without encrypt usage +Pass AES-GCM 256-bit key, no additional data, 32-bit tag, 256-bit iv without encrypt usage +Pass AES-GCM 256-bit key, 64-bit tag, 256-bit iv without encrypt usage +Pass AES-GCM 256-bit key, no additional data, 64-bit tag, 256-bit iv without encrypt usage +Pass AES-GCM 256-bit key, 96-bit tag, 256-bit iv without encrypt usage +Pass AES-GCM 256-bit key, no additional data, 96-bit tag, 256-bit iv without encrypt usage +Pass AES-GCM 256-bit key, 104-bit tag, 256-bit iv without encrypt usage +Pass AES-GCM 256-bit key, no additional data, 104-bit tag, 256-bit iv without encrypt usage +Pass AES-GCM 256-bit key, 112-bit tag, 256-bit iv without encrypt usage +Pass AES-GCM 256-bit key, no additional data, 112-bit tag, 256-bit iv without encrypt usage +Pass AES-GCM 256-bit key, 120-bit tag, 256-bit iv without encrypt usage +Pass AES-GCM 256-bit key, no additional data, 120-bit tag, 256-bit iv without encrypt usage +Pass AES-GCM 256-bit key, 128-bit tag, 256-bit iv without encrypt usage +Pass AES-GCM 256-bit key, no additional data, 128-bit tag, 256-bit iv without encrypt usage +Pass AES-GCM 128-bit key, 32-bit tag, 256-bit iv with mismatched key and algorithm +Pass AES-GCM 128-bit key, no additional data, 32-bit tag, 256-bit iv with mismatched key and algorithm +Pass AES-GCM 128-bit key, 64-bit tag, 256-bit iv with mismatched key and algorithm +Pass AES-GCM 128-bit key, no additional data, 64-bit tag, 256-bit iv with mismatched key and algorithm +Pass AES-GCM 128-bit key, 96-bit tag, 256-bit iv with mismatched key and algorithm +Pass AES-GCM 128-bit key, no additional data, 96-bit tag, 256-bit iv with mismatched key and algorithm +Pass AES-GCM 128-bit key, 104-bit tag, 256-bit iv with mismatched key and algorithm +Pass AES-GCM 128-bit key, no additional data, 104-bit tag, 256-bit iv with mismatched key and algorithm +Pass AES-GCM 128-bit key, 112-bit tag, 256-bit iv with mismatched key and algorithm +Pass AES-GCM 128-bit key, no additional data, 112-bit tag, 256-bit iv with mismatched key and algorithm +Pass AES-GCM 128-bit key, 120-bit tag, 256-bit iv with mismatched key and algorithm +Pass AES-GCM 128-bit key, no additional data, 120-bit tag, 256-bit iv with mismatched key and algorithm +Pass AES-GCM 128-bit key, 128-bit tag, 256-bit iv with mismatched key and algorithm +Pass AES-GCM 128-bit key, no additional data, 128-bit tag, 256-bit iv with mismatched key and algorithm +Pass AES-GCM 192-bit key, 32-bit tag, 256-bit iv with mismatched key and algorithm +Pass AES-GCM 192-bit key, no additional data, 32-bit tag, 256-bit iv with mismatched key and algorithm +Pass AES-GCM 192-bit key, 64-bit tag, 256-bit iv with mismatched key and algorithm +Pass AES-GCM 192-bit key, no additional data, 64-bit tag, 256-bit iv with mismatched key and algorithm +Pass AES-GCM 192-bit key, 96-bit tag, 256-bit iv with mismatched key and algorithm +Pass AES-GCM 192-bit key, no additional data, 96-bit tag, 256-bit iv with mismatched key and algorithm +Pass AES-GCM 192-bit key, 104-bit tag, 256-bit iv with mismatched key and algorithm +Pass AES-GCM 192-bit key, no additional data, 104-bit tag, 256-bit iv with mismatched key and algorithm +Pass AES-GCM 192-bit key, 112-bit tag, 256-bit iv with mismatched key and algorithm +Pass AES-GCM 192-bit key, no additional data, 112-bit tag, 256-bit iv with mismatched key and algorithm +Pass AES-GCM 192-bit key, 120-bit tag, 256-bit iv with mismatched key and algorithm +Pass AES-GCM 192-bit key, no additional data, 120-bit tag, 256-bit iv with mismatched key and algorithm +Pass AES-GCM 192-bit key, 128-bit tag, 256-bit iv with mismatched key and algorithm +Pass AES-GCM 192-bit key, no additional data, 128-bit tag, 256-bit iv with mismatched key and algorithm +Pass AES-GCM 256-bit key, 32-bit tag, 256-bit iv with mismatched key and algorithm +Pass AES-GCM 256-bit key, no additional data, 32-bit tag, 256-bit iv with mismatched key and algorithm +Pass AES-GCM 256-bit key, 64-bit tag, 256-bit iv with mismatched key and algorithm +Pass AES-GCM 256-bit key, no additional data, 64-bit tag, 256-bit iv with mismatched key and algorithm +Pass AES-GCM 256-bit key, 96-bit tag, 256-bit iv with mismatched key and algorithm +Pass AES-GCM 256-bit key, no additional data, 96-bit tag, 256-bit iv with mismatched key and algorithm +Pass AES-GCM 256-bit key, 104-bit tag, 256-bit iv with mismatched key and algorithm +Pass AES-GCM 256-bit key, no additional data, 104-bit tag, 256-bit iv with mismatched key and algorithm +Pass AES-GCM 256-bit key, 112-bit tag, 256-bit iv with mismatched key and algorithm +Pass AES-GCM 256-bit key, no additional data, 112-bit tag, 256-bit iv with mismatched key and algorithm +Pass AES-GCM 256-bit key, 120-bit tag, 256-bit iv with mismatched key and algorithm +Pass AES-GCM 256-bit key, no additional data, 120-bit tag, 256-bit iv with mismatched key and algorithm +Pass AES-GCM 256-bit key, 128-bit tag, 256-bit iv with mismatched key and algorithm +Pass AES-GCM 256-bit key, no additional data, 128-bit tag, 256-bit iv with mismatched key and algorithm +Pass AES-GCM 128-bit key, 32-bit tag, 256-bit iv without decrypt usage +Pass AES-GCM 128-bit key, no additional data, 32-bit tag, 256-bit iv without decrypt usage +Pass AES-GCM 128-bit key, 64-bit tag, 256-bit iv without decrypt usage +Pass AES-GCM 128-bit key, no additional data, 64-bit tag, 256-bit iv without decrypt usage +Pass AES-GCM 128-bit key, 96-bit tag, 256-bit iv without decrypt usage +Pass AES-GCM 128-bit key, no additional data, 96-bit tag, 256-bit iv without decrypt usage +Pass AES-GCM 128-bit key, 104-bit tag, 256-bit iv without decrypt usage +Pass AES-GCM 128-bit key, no additional data, 104-bit tag, 256-bit iv without decrypt usage +Pass AES-GCM 128-bit key, 112-bit tag, 256-bit iv without decrypt usage +Pass AES-GCM 128-bit key, no additional data, 112-bit tag, 256-bit iv without decrypt usage +Pass AES-GCM 128-bit key, 120-bit tag, 256-bit iv without decrypt usage +Pass AES-GCM 128-bit key, no additional data, 120-bit tag, 256-bit iv without decrypt usage +Pass AES-GCM 128-bit key, 128-bit tag, 256-bit iv without decrypt usage +Pass AES-GCM 128-bit key, no additional data, 128-bit tag, 256-bit iv without decrypt usage +Pass AES-GCM 192-bit key, 32-bit tag, 256-bit iv without decrypt usage +Pass AES-GCM 192-bit key, no additional data, 32-bit tag, 256-bit iv without decrypt usage +Pass AES-GCM 192-bit key, 64-bit tag, 256-bit iv without decrypt usage +Pass AES-GCM 192-bit key, no additional data, 64-bit tag, 256-bit iv without decrypt usage +Pass AES-GCM 192-bit key, 96-bit tag, 256-bit iv without decrypt usage +Pass AES-GCM 192-bit key, no additional data, 96-bit tag, 256-bit iv without decrypt usage +Pass AES-GCM 192-bit key, 104-bit tag, 256-bit iv without decrypt usage +Pass AES-GCM 192-bit key, no additional data, 104-bit tag, 256-bit iv without decrypt usage +Pass AES-GCM 192-bit key, 112-bit tag, 256-bit iv without decrypt usage +Pass AES-GCM 192-bit key, no additional data, 112-bit tag, 256-bit iv without decrypt usage +Pass AES-GCM 192-bit key, 120-bit tag, 256-bit iv without decrypt usage +Pass AES-GCM 192-bit key, no additional data, 120-bit tag, 256-bit iv without decrypt usage +Pass AES-GCM 192-bit key, 128-bit tag, 256-bit iv without decrypt usage +Pass AES-GCM 192-bit key, no additional data, 128-bit tag, 256-bit iv without decrypt usage +Pass AES-GCM 256-bit key, 32-bit tag, 256-bit iv without decrypt usage +Pass AES-GCM 256-bit key, no additional data, 32-bit tag, 256-bit iv without decrypt usage +Pass AES-GCM 256-bit key, 64-bit tag, 256-bit iv without decrypt usage +Pass AES-GCM 256-bit key, no additional data, 64-bit tag, 256-bit iv without decrypt usage +Pass AES-GCM 256-bit key, 96-bit tag, 256-bit iv without decrypt usage +Pass AES-GCM 256-bit key, no additional data, 96-bit tag, 256-bit iv without decrypt usage +Pass AES-GCM 256-bit key, 104-bit tag, 256-bit iv without decrypt usage +Pass AES-GCM 256-bit key, no additional data, 104-bit tag, 256-bit iv without decrypt usage +Pass AES-GCM 256-bit key, 112-bit tag, 256-bit iv without decrypt usage +Pass AES-GCM 256-bit key, no additional data, 112-bit tag, 256-bit iv without decrypt usage +Pass AES-GCM 256-bit key, 120-bit tag, 256-bit iv without decrypt usage +Pass AES-GCM 256-bit key, no additional data, 120-bit tag, 256-bit iv without decrypt usage +Pass AES-GCM 256-bit key, 128-bit tag, 256-bit iv without decrypt usage +Pass AES-GCM 256-bit key, no additional data, 128-bit tag, 256-bit iv without decrypt usage +Pass AES-GCM 128-bit key, 256-bit iv, illegal tag length 24-bits +Pass AES-GCM 128-bit key, 256-bit iv, illegal tag length 48-bits +Pass AES-GCM 128-bit key, 256-bit iv, illegal tag length 72-bits +Pass AES-GCM 128-bit key, 256-bit iv, illegal tag length 95-bits +Pass AES-GCM 128-bit key, 256-bit iv, illegal tag length 129-bits +Pass AES-GCM 192-bit key, 256-bit iv, illegal tag length 24-bits +Pass AES-GCM 192-bit key, 256-bit iv, illegal tag length 48-bits +Pass AES-GCM 192-bit key, 256-bit iv, illegal tag length 72-bits +Pass AES-GCM 192-bit key, 256-bit iv, illegal tag length 95-bits +Pass AES-GCM 192-bit key, 256-bit iv, illegal tag length 129-bits +Pass AES-GCM 256-bit key, 256-bit iv, illegal tag length 24-bits +Pass AES-GCM 256-bit key, 256-bit iv, illegal tag length 48-bits +Pass AES-GCM 256-bit key, 256-bit iv, illegal tag length 72-bits +Pass AES-GCM 256-bit key, 256-bit iv, illegal tag length 95-bits +Pass AES-GCM 256-bit key, 256-bit iv, illegal tag length 129-bits +Pass AES-GCM 128-bit key, 256-bit iv, illegal tag length 24-bits decryption +Pass AES-GCM 128-bit key, 256-bit iv, illegal tag length 48-bits decryption +Pass AES-GCM 128-bit key, 256-bit iv, illegal tag length 72-bits decryption +Pass AES-GCM 128-bit key, 256-bit iv, illegal tag length 95-bits decryption +Pass AES-GCM 128-bit key, 256-bit iv, illegal tag length 129-bits decryption +Pass AES-GCM 192-bit key, 256-bit iv, illegal tag length 24-bits decryption +Pass AES-GCM 192-bit key, 256-bit iv, illegal tag length 48-bits decryption +Pass AES-GCM 192-bit key, 256-bit iv, illegal tag length 72-bits decryption +Pass AES-GCM 192-bit key, 256-bit iv, illegal tag length 95-bits decryption +Pass AES-GCM 192-bit key, 256-bit iv, illegal tag length 129-bits decryption +Pass AES-GCM 256-bit key, 256-bit iv, illegal tag length 24-bits decryption +Pass AES-GCM 256-bit key, 256-bit iv, illegal tag length 48-bits decryption +Pass AES-GCM 256-bit key, 256-bit iv, illegal tag length 72-bits decryption +Pass AES-GCM 256-bit key, 256-bit iv, illegal tag length 95-bits decryption +Pass AES-GCM 256-bit key, 256-bit iv, illegal tag length 129-bits decryption \ No newline at end of file diff --git a/Tests/LibWeb/Text/input/wpt-import/WebCryptoAPI/encrypt_decrypt/aes.js b/Tests/LibWeb/Text/input/wpt-import/WebCryptoAPI/encrypt_decrypt/aes.js new file mode 100644 index 0000000000000..fdeb7963f761e --- /dev/null +++ b/Tests/LibWeb/Text/input/wpt-import/WebCryptoAPI/encrypt_decrypt/aes.js @@ -0,0 +1,325 @@ + +function run_test() { + var subtle = self.crypto.subtle; // Change to test prefixed implementations + + // When are all these tests really done? When all the promises they use have resolved. + var all_promises = []; + + // Source file aes_XXX_vectors.js provides the getTestVectors method + // for the AES-XXX algorithm that drives these tests. + var vectors = getTestVectors(); + var passingVectors = vectors.passing; + var failingVectors = vectors.failing; + var decryptionFailingVectors = vectors.decryptionFailing; + + // Check for successful encryption. + passingVectors.forEach(function(vector) { + var promise = importVectorKey(vector, ["encrypt", "decrypt"]) + .then(function(vector) { + promise_test(function(test) { + return subtle.encrypt(vector.algorithm, vector.key, vector.plaintext) + .then(function(result) { + assert_true(equalBuffers(result, vector.result), "Should return expected result"); + }, function(err) { + assert_unreached("encrypt error for test " + vector.name + ": " + err.message); + }); + }, vector.name); + }, function(err) { + // We need a failed test if the importVectorKey operation fails, so + // we know we never tested encryption + promise_test(function(test) { + assert_unreached("importKey failed for " + vector.name); + }, "importKey step: " + vector.name); + }); + + all_promises.push(promise); + }); + + // Check for successful encryption even if the buffer is changed after calling encrypt. + passingVectors.forEach(function(vector) { + var plaintext = copyBuffer(vector.plaintext); + var promise = importVectorKey(vector, ["encrypt", "decrypt"]) + .then(function(vector) { + promise_test(function(test) { + var operation = subtle.encrypt(vector.algorithm, vector.key, plaintext) + .then(function(result) { + assert_true(equalBuffers(result, vector.result), "Should return expected result"); + }, function(err) { + assert_unreached("encrypt error for test " + vector.name + ": " + err.message); + }); + plaintext[0] = 255 - plaintext[0]; + return operation; + }, vector.name + " with altered plaintext"); + }, function(err) { + // We need a failed test if the importVectorKey operation fails, so + // we know we never tested encryption + promise_test(function(test) { + assert_unreached("importKey failed for " + vector.name); + }, "importKey step: " + vector.name + " with altered plaintext"); + }); + + all_promises.push(promise); + }); + + // Check for successful decryption. + passingVectors.forEach(function(vector) { + var promise = importVectorKey(vector, ["encrypt", "decrypt"]) + .then(function(vector) { + promise_test(function(test) { + return subtle.decrypt(vector.algorithm, vector.key, vector.result) + .then(function(result) { + assert_true(equalBuffers(result, vector.plaintext), "Should return expected result"); + }, function(err) { + assert_unreached("decrypt error for test " + vector.name + ": " + err.message); + }); + }, vector.name + " decryption"); + }, function(err) { + // We need a failed test if the importVectorKey operation fails, so + // we know we never tested encryption + promise_test(function(test) { + assert_unreached("importKey failed for " + vector.name); + }, "importKey step for decryption: " + vector.name); + }); + + all_promises.push(promise); + }); + + // Check for successful decryption even if ciphertext is altered. + passingVectors.forEach(function(vector) { + var ciphertext = copyBuffer(vector.result); + var promise = importVectorKey(vector, ["encrypt", "decrypt"]) + .then(function(vector) { + promise_test(function(test) { + var operation = subtle.decrypt(vector.algorithm, vector.key, ciphertext) + .then(function(result) { + assert_true(equalBuffers(result, vector.plaintext), "Should return expected result"); + }, function(err) { + assert_unreached("decrypt error for test " + vector.name + ": " + err.message); + }); + ciphertext[0] = 255 - ciphertext[0]; + return operation; + }, vector.name + " decryption with altered ciphertext"); + }, function(err) { + // We need a failed test if the importVectorKey operation fails, so + // we know we never tested encryption + promise_test(function(test) { + assert_unreached("importKey failed for " + vector.name); + }, "importKey step for decryption: " + vector.name + " with altered ciphertext"); + }); + + all_promises.push(promise); + }); + + // Everything that succeeded should fail if no "encrypt" usage. + passingVectors.forEach(function(vector) { + // Don't want to overwrite key being used for success tests! + var badVector = Object.assign({}, vector); + badVector.key = null; + + var promise = importVectorKey(badVector, ["decrypt"]) + .then(function(vector) { + promise_test(function(test) { + return subtle.encrypt(vector.algorithm, vector.key, vector.plaintext) + .then(function(result) { + assert_unreached("should have thrown exception for test " + vector.name); + }, function(err) { + assert_equals(err.name, "InvalidAccessError", "Should throw an InvalidAccessError instead of " + err.message) + }); + }, vector.name + " without encrypt usage"); + }, function(err) { + // We need a failed test if the importVectorKey operation fails, so + // we know we never tested encryption + promise_test(function(test) { + assert_unreached("importKey failed for " + vector.name); + }, "importKey step: " + vector.name + " without encrypt usage"); + }); + + all_promises.push(promise); + }); + + // Encryption should fail if algorithm of key doesn't match algorithm of function call. + passingVectors.forEach(function(vector) { + var algorithm = Object.assign({}, vector.algorithm); + if (algorithm.name === "AES-CBC") { + algorithm.name = "AES-CTR"; + algorithm.counter = new Uint8Array(16); + algorithm.length = 64; + } else { + algorithm.name = "AES-CBC"; + algorithm.iv = new Uint8Array(16); // Need syntactically valid parameter to get to error being checked. + } + + var promise = importVectorKey(vector, ["encrypt", "decrypt"]) + .then(function(vector) { + promise_test(function(test) { + return subtle.encrypt(algorithm, vector.key, vector.plaintext) + .then(function(result) { + assert_unreached("encrypt succeeded despite mismatch " + vector.name + ": " + err.message); + }, function(err) { + assert_equals(err.name, "InvalidAccessError", "Mismatch should cause InvalidAccessError instead of " + err.message); + }); + }, vector.name + " with mismatched key and algorithm"); + }, function(err) { + // We need a failed test if the importVectorKey operation fails, so + // we know we never tested encryption + promise_test(function(test) { + assert_unreached("importKey failed for " + vector.name); + }, "importKey step: " + vector.name + " with mismatched key and algorithm"); + }); + + all_promises.push(promise); + }); + + // Everything that succeeded decrypting should fail if no "decrypt" usage. + passingVectors.forEach(function(vector) { + // Don't want to overwrite key being used for success tests! + var badVector = Object.assign({}, vector); + badVector.key = null; + + var promise = importVectorKey(badVector, ["encrypt"]) + .then(function(vector) { + promise_test(function(test) { + return subtle.decrypt(vector.algorithm, vector.key, vector.result) + .then(function(result) { + assert_unreached("should have thrown exception for test " + vector.name); + }, function(err) { + assert_equals(err.name, "InvalidAccessError", "Should throw an InvalidAccessError instead of " + err.message) + }); + }, vector.name + " without decrypt usage"); + }, function(err) { + // We need a failed test if the importVectorKey operation fails, so + // we know we never tested encryption + promise_test(function(test) { + assert_unreached("importKey failed for " + vector.name); + }, "importKey step: " + vector.name + " without decrypt usage"); + }); + + all_promises.push(promise); + }); + + // Check for OperationError due to data lengths. + failingVectors.forEach(function(vector) { + var promise = importVectorKey(vector, ["encrypt", "decrypt"]) + .then(function(vector) { + promise_test(function(test) { + return subtle.encrypt(vector.algorithm, vector.key, vector.plaintext) + .then(function(result) { + assert_unreached("should have thrown exception for test " + vector.name); + }, function(err) { + assert_equals(err.name, "OperationError", "Should throw an OperationError instead of " + err.message) + }); + }, vector.name); + }, function(err) { + // We need a failed test if the importVectorKey operation fails, so + // we know we never tested encryption + promise_test(function(test) { + assert_unreached("importKey failed for " + vector.name); + }, "importKey step: " + vector.name); + }); + + all_promises.push(promise); + }); + + // Check for OperationError due to data lengths for decryption, too. + failingVectors.forEach(function(vector) { + var promise = importVectorKey(vector, ["encrypt", "decrypt"]) + .then(function(vector) { + promise_test(function(test) { + return subtle.decrypt(vector.algorithm, vector.key, vector.result) + .then(function(result) { + assert_unreached("should have thrown exception for test " + vector.name); + }, function(err) { + assert_equals(err.name, "OperationError", "Should throw an OperationError instead of " + err.message) + }); + }, vector.name + " decryption"); + }, function(err) { + // We need a failed test if the importVectorKey operation fails, so + // we know we never tested encryption + promise_test(function(test) { + assert_unreached("importKey failed for " + vector.name); + }, "importKey step: decryption " + vector.name); + }); + + all_promises.push(promise); + }); + + // Check for decryption failing for algorithm-specific reasons (such as bad + // padding for AES-CBC). + decryptionFailingVectors.forEach(function(vector) { + var promise = importVectorKey(vector, ["encrypt", "decrypt"]) + .then(function(vector) { + promise_test(function(test) { + return subtle.decrypt(vector.algorithm, vector.key, vector.result) + .then(function(result) { + assert_unreached("should have thrown exception for test " + vector.name); + }, function(err) { + assert_equals(err.name, "OperationError", "Should throw an OperationError instead of " + err.message) + }); + }, vector.name); + }, function(err) { + // We need a failed test if the importVectorKey operation fails, so + // we know we never tested encryption + promise_test(function(test) { + assert_unreached("importKey failed for " + vector.name); + }, "importKey step: decryption " + vector.name); + }); + + all_promises.push(promise); + }); + + promise_test(function() { + return Promise.all(all_promises) + .then(function() {done();}) + .catch(function() {done();}) + }, "setup"); + + // A test vector has all needed fields for encryption, EXCEPT that the + // key field may be null. This function replaces that null with the Correct + // CryptoKey object. + // + // Returns a Promise that yields an updated vector on success. + function importVectorKey(vector, usages) { + if (vector.key !== null) { + return new Promise(function(resolve, reject) { + resolve(vector); + }); + } else { + return subtle.importKey("raw", vector.keyBuffer, {name: vector.algorithm.name}, false, usages) + .then(function(key) { + vector.key = key; + return vector; + }); + } + } + + // Returns a copy of the sourceBuffer it is sent. + function copyBuffer(sourceBuffer) { + var source = new Uint8Array(sourceBuffer); + var copy = new Uint8Array(sourceBuffer.byteLength) + + for (var i=0; i + +WebCryptoAPI: encrypt() Using AES-GCM w/ 96-bit iv + + + + + + + +
+ diff --git a/Tests/LibWeb/Text/input/wpt-import/WebCryptoAPI/encrypt_decrypt/aes_gcm.https.any.js b/Tests/LibWeb/Text/input/wpt-import/WebCryptoAPI/encrypt_decrypt/aes_gcm.https.any.js new file mode 100644 index 0000000000000..6e3a6efb12d7b --- /dev/null +++ b/Tests/LibWeb/Text/input/wpt-import/WebCryptoAPI/encrypt_decrypt/aes_gcm.https.any.js @@ -0,0 +1,7 @@ +// META: title=WebCryptoAPI: encrypt() Using AES-GCM w/ 96-bit iv +// META: script=aes_gcm_96_iv_fixtures.js +// META: script=aes_gcm_vectors.js +// META: script=aes.js +// META: timeout=long + +run_test(); diff --git a/Tests/LibWeb/Text/input/wpt-import/WebCryptoAPI/encrypt_decrypt/aes_gcm_256_iv.https.any.html b/Tests/LibWeb/Text/input/wpt-import/WebCryptoAPI/encrypt_decrypt/aes_gcm_256_iv.https.any.html new file mode 100644 index 0000000000000..bd36cb05c04ad --- /dev/null +++ b/Tests/LibWeb/Text/input/wpt-import/WebCryptoAPI/encrypt_decrypt/aes_gcm_256_iv.https.any.html @@ -0,0 +1,18 @@ + + +WebCryptoAPI: encrypt() Using AES-GCM w/ 256-bit iv + + + + + + + +
+ diff --git a/Tests/LibWeb/Text/input/wpt-import/WebCryptoAPI/encrypt_decrypt/aes_gcm_256_iv.https.any.js b/Tests/LibWeb/Text/input/wpt-import/WebCryptoAPI/encrypt_decrypt/aes_gcm_256_iv.https.any.js new file mode 100644 index 0000000000000..92900fb13ae2e --- /dev/null +++ b/Tests/LibWeb/Text/input/wpt-import/WebCryptoAPI/encrypt_decrypt/aes_gcm_256_iv.https.any.js @@ -0,0 +1,7 @@ +// META: title=WebCryptoAPI: encrypt() Using AES-GCM w/ 256-bit iv +// META: script=aes_gcm_256_iv_fixtures.js +// META: script=aes_gcm_vectors.js +// META: script=aes.js +// META: timeout=long + +run_test(); diff --git a/Tests/LibWeb/Text/input/wpt-import/WebCryptoAPI/encrypt_decrypt/aes_gcm_256_iv_fixtures.js b/Tests/LibWeb/Text/input/wpt-import/WebCryptoAPI/encrypt_decrypt/aes_gcm_256_iv_fixtures.js new file mode 100644 index 0000000000000..9cdbbbb79075c --- /dev/null +++ b/Tests/LibWeb/Text/input/wpt-import/WebCryptoAPI/encrypt_decrypt/aes_gcm_256_iv_fixtures.js @@ -0,0 +1,210 @@ +function getFixtures() { + // Before we can really start, we need to fill a bunch of buffers with data + var plaintext = new Uint8Array([ + 84, 104, 105, 115, 32, 115, 112, 101, 99, 105, 102, 105, 99, 97, 116, 105, + 111, 110, 32, 100, 101, 115, 99, 114, 105, 98, 101, 115, 32, 97, 32, 74, 97, + 118, 97, 83, 99, 114, 105, 112, 116, 32, 65, 80, 73, 32, 102, 111, 114, 32, + 112, 101, 114, 102, 111, 114, 109, 105, 110, 103, 32, 98, 97, 115, 105, 99, + 32, 99, 114, 121, 112, 116, 111, 103, 114, 97, 112, 104, 105, 99, 32, 111, + 112, 101, 114, 97, 116, 105, 111, 110, 115, 32, 105, 110, 32, 119, 101, 98, + 32, 97, 112, 112, 108, 105, 99, 97, 116, 105, 111, 110, 115, 44, 32, 115, + 117, 99, 104, 32, 97, 115, 32, 104, 97, 115, 104, 105, 110, 103, 44, 32, + 115, 105, 103, 110, 97, 116, 117, 114, 101, 32, 103, 101, 110, 101, 114, 97, + 116, 105, 111, 110, 32, 97, 110, 100, 32, 118, 101, 114, 105, 102, 105, 99, + 97, 116, 105, 111, 110, 44, 32, 97, 110, 100, 32, 101, 110, 99, 114, 121, + 112, 116, 105, 111, 110, 32, 97, 110, 100, 32, 100, 101, 99, 114, 121, 112, + 116, 105, 111, 110, 46, 32, 65, 100, 100, 105, 116, 105, 111, 110, 97, 108, + 108, 121, 44, 32, 105, 116, 32, 100, 101, 115, 99, 114, 105, 98, 101, 115, + 32, 97, 110, 32, 65, 80, 73, 32, 102, 111, 114, 32, 97, 112, 112, 108, 105, + 99, 97, 116, 105, 111, 110, 115, 32, 116, 111, 32, 103, 101, 110, 101, 114, + 97, 116, 101, 32, 97, 110, 100, 47, 111, 114, 32, 109, 97, 110, 97, 103, + 101, 32, 116, 104, 101, 32, 107, 101, 121, 105, 110, 103, 32, 109, 97, 116, + 101, 114, 105, 97, 108, 32, 110, 101, 99, 101, 115, 115, 97, 114, 121, 32, + 116, 111, 32, 112, 101, 114, 102, 111, 114, 109, 32, 116, 104, 101, 115, + 101, 32, 111, 112, 101, 114, 97, 116, 105, 111, 110, 115, 46, 32, 85, 115, + 101, 115, 32, 102, 111, 114, 32, 116, 104, 105, 115, 32, 65, 80, 73, 32, + 114, 97, 110, 103, 101, 32, 102, 114, 111, 109, 32, 117, 115, 101, 114, 32, + 111, 114, 32, 115, 101, 114, 118, 105, 99, 101, 32, 97, 117, 116, 104, 101, + 110, 116, 105, 99, 97, 116, 105, 111, 110, 44, 32, 100, 111, 99, 117, 109, + 101, 110, 116, 32, 111, 114, 32, 99, 111, 100, 101, 32, 115, 105, 103, 110, + 105, 110, 103, 44, 32, 97, 110, 100, 32, 116, 104, 101, 32, 99, 111, 110, + 102, 105, 100, 101, 110, 116, 105, 97, 108, 105, 116, 121, 32, 97, 110, 100, + 32, 105, 110, 116, 101, 103, 114, 105, 116, 121, 32, 111, 102, 32, 99, 111, + 109, 109, 117, 110, 105, 99, 97, 116, 105, 111, 110, 115, 46, + ]); + + // We want some random key bytes of various sizes. + // These were randomly generated from a script. + var keyBytes = { + 128: new Uint8Array([ + 222, 192, 212, 252, 191, 60, 71, 65, 200, 146, 218, 189, 28, 212, 192, 78, + ]), + 192: new Uint8Array([ + 208, 238, 131, 65, 63, 68, 196, 63, 186, 208, 61, 207, 166, 18, 99, 152, + 29, 109, 221, 95, 240, 30, 28, 246, + ]), + 256: new Uint8Array([ + 103, 105, 56, 35, 251, 29, 88, 7, 63, 145, 236, 233, 204, 58, 249, 16, + 229, 83, 38, 22, 164, 210, 123, 19, 235, 123, 116, 216, 0, 11, 191, 48, + ]), + }; + + // AES-GCM needs an IV of no more than 2^64 - 1 bytes. Arbitrary 32 bytes is okay then. + var iv = new Uint8Array([ + 58, 146, 115, 42, 166, 234, 57, 191, 57, 134, 224, 199, 63, 169, 32, 0, 32, + 33, 117, 56, 94, 248, 173, 234, 194, 200, 115, 53, 235, 146, 141, 212, + ]); + + // Authenticated encryption via AES-GCM requires additional data that + // will be checked. We use the ASCII encoded Editorial Note + // following the Abstract of the Web Cryptography API recommendation. + var additionalData = new Uint8Array([ + 84, 104, 101, 114, 101, 32, 97, 114, 101, 32, 55, 32, 102, 117, 114, 116, + 104, 101, 114, 32, 101, 100, 105, 116, 111, 114, 105, 97, 108, 32, 110, 111, + 116, 101, 115, 32, 105, 110, 32, 116, 104, 101, 32, 100, 111, 99, 117, 109, + 101, 110, 116, 46, + ]); + + // The length of the tag defaults to 16 bytes (128 bit). + var tag = { + 128: new Uint8Array([ + 194, 226, 198, 253, 239, 28, 197, 240, 123, 216, 176, 151, 239, 200, 184, + 183, + ]), + 192: new Uint8Array([ + 183, 57, 32, 144, 164, 76, 121, 77, 58, 86, 62, 132, 53, 130, 96, 225, + ]), + 256: new Uint8Array([ + 188, 239, 241, 48, 159, 21, 213, 0, 241, 42, 85, 76, 194, 28, 49, 60, + ]), + }; + + var tag_with_empty_ad = { + 128: new Uint8Array([ + 222, 51, 11, 23, 36, 222, 250, 248, 27, 98, 30, 81, 150, 35, 220, 198, + ]), + 192: new Uint8Array([ + 243, 11, 130, 112, 169, 239, 114, 238, 185, 219, 93, 1, 95, 108, 184, 183, + ]), + 256: new Uint8Array([ + 244, 186, 86, 203, 154, 37, 191, 248, 246, 57, 139, 130, 224, 47, 217, + 238, + ]), + }; + + // Results. These were created using the Python cryptography module. + + // AES-GCM produces ciphertext and a tag. + var ciphertext = { + 128: new Uint8Array([ + 180, 241, 40, 183, 105, 52, 147, 238, 224, 175, 175, 236, 168, 244, 241, + 121, 9, 202, 225, 237, 56, 216, 253, 254, 186, 102, 111, 207, 228, 190, + 130, 177, 159, 246, 6, 53, 249, 113, 228, 254, 81, 126, 253, 191, 100, 43, + 251, 147, 107, 91, 166, 231, 201, 241, 180, 214, 112, 47, 123, 164, 186, + 134, 54, 65, 22, 181, 201, 82, 236, 59, 52, 139, 172, 39, 41, 89, 123, 62, + 102, 167, 82, 150, 250, 93, 96, 169, 135, 89, 245, 255, 164, 192, 169, + 159, 25, 16, 139, 145, 76, 4, 144, 131, 148, 197, 204, 46, 23, 110, 193, + 228, 127, 120, 242, 24, 54, 240, 181, 162, 98, 244, 249, 68, 134, 122, + 126, 151, 38, 108, 116, 68, 150, 109, 38, 194, 21, 159, 140, 205, 183, 35, + 97, 151, 186, 120, 145, 22, 235, 22, 210, 223, 187, 143, 162, 183, 93, + 196, 104, 51, 96, 53, 234, 250, 184, 76, 237, 157, 37, 203, 226, 87, 222, + 75, 240, 95, 218, 222, 64, 81, 165, 75, 201, 216, 190, 13, 116, 217, 69, + 66, 47, 161, 68, 247, 74, 253, 157, 181, 162, 121, 53, 32, 91, 124, 230, + 105, 224, 17, 187, 50, 61, 77, 103, 79, 71, 57, 163, 116, 234, 149, 27, + 105, 24, 31, 159, 3, 128, 130, 42, 94, 125, 200, 142, 251, 148, 201, 17, + 149, 232, 84, 50, 17, 18, 203, 186, 226, 164, 227, 202, 76, 65, 16, 163, + 224, 132, 52, 31, 101, 129, 72, 171, 159, 42, 177, 253, 98, 86, 201, 95, + 117, 62, 12, 205, 78, 36, 126, 196, 121, 89, 185, 37, 161, 66, 181, 117, + 186, 71, 124, 132, 110, 120, 27, 246, 163, 18, 13, 90, 200, 127, 82, 209, + 241, 170, 73, 247, 137, 96, 244, 254, 251, 119, 71, 156, 27, 107, 53, 33, + 45, 22, 0, 144, 48, 32, 11, 116, 21, 125, 246, 217, 171, 158, 224, 142, + 234, 141, 242, 168, 89, 154, 66, 227, 161, 182, 96, 1, 88, 78, 12, 7, 239, + 30, 206, 31, 89, 111, 107, 42, 37, 241, 148, 232, 1, 8, 251, 117, 146, + 183, 9, 48, 39, 94, 59, 70, 230, 26, 165, 97, 156, 140, 141, 31, 62, 10, + 206, 55, 48, 207, 0, 197, 202, 197, 108, 133, 175, 80, 4, 16, 154, 223, + 255, 4, 196, 188, 178, 240, 29, 13, 120, 5, 225, 202, 3, 35, 225, 158, 92, + 152, 73, 205, 107, 157, 224, 245, 99, 194, 171, 156, 245, 247, 183, 165, + 40, 62, 200, 110, 29, 151, 206, 100, 175, 88, 36, 242, 90, 4, 82, 73, 250, + 140, 245, 217, 9, 153, 35, 242, 206, 78, 197, 121, 115, 15, 80, 128, 101, + 191, 240, 91, 151, 249, 62, 62, 244, 18, 3, 17, 135, 222, 210, 93, 149, + 123, + ]), + + 192: new Uint8Array([ + 126, 160, 166, 112, 227, 212, 106, 186, 175, 70, 24, 28, 86, 149, 31, 154, + 156, 190, 244, 132, 44, 61, 149, 242, 105, 67, 17, 136, 7, 146, 153, 170, + 200, 214, 142, 205, 170, 225, 85, 44, 241, 159, 255, 234, 10, 13, 37, 48, + 255, 21, 141, 176, 60, 117, 73, 130, 247, 204, 144, 102, 167, 89, 203, + 235, 229, 129, 122, 253, 124, 179, 115, 118, 163, 157, 67, 141, 122, 146, + 209, 11, 112, 5, 230, 117, 123, 184, 243, 99, 83, 10, 31, 166, 96, 1, 121, + 44, 10, 241, 24, 43, 184, 187, 25, 239, 246, 176, 108, 230, 127, 25, 42, + 67, 202, 140, 179, 104, 159, 75, 103, 43, 248, 98, 166, 179, 67, 0, 163, + 227, 84, 40, 129, 227, 198, 205, 7, 156, 16, 185, 24, 166, 59, 218, 197, + 114, 74, 34, 126, 22, 226, 226, 85, 212, 69, 83, 163, 185, 68, 109, 182, + 54, 209, 237, 96, 184, 32, 53, 127, 175, 13, 146, 141, 115, 164, 184, 98, + 245, 174, 223, 46, 32, 167, 39, 103, 19, 210, 80, 131, 254, 103, 249, 247, + 29, 120, 31, 105, 241, 103, 169, 249, 93, 153, 74, 56, 53, 239, 157, 132, + 236, 169, 246, 242, 24, 113, 97, 128, 238, 152, 148, 31, 84, 8, 52, 105, + 198, 116, 103, 132, 48, 199, 23, 90, 24, 29, 63, 41, 117, 191, 57, 31, + 209, 128, 60, 119, 175, 84, 141, 177, 165, 169, 195, 35, 163, 105, 146, + 157, 209, 93, 149, 105, 160, 93, 231, 78, 201, 92, 235, 200, 89, 37, 50, + 181, 30, 213, 242, 59, 156, 219, 19, 158, 17, 224, 81, 108, 52, 87, 248, + 101, 23, 39, 107, 67, 151, 103, 230, 126, 202, 184, 118, 226, 18, 29, 93, + 37, 208, 40, 82, 113, 35, 157, 145, 152, 50, 253, 140, 47, 141, 192, 1, + 148, 114, 40, 10, 112, 79, 227, 16, 105, 247, 31, 49, 102, 195, 75, 183, + 172, 254, 188, 42, 89, 77, 38, 104, 1, 180, 106, 61, 71, 70, 35, 160, 103, + 101, 244, 26, 226, 37, 159, 155, 4, 107, 222, 219, 136, 37, 24, 246, 44, + 23, 44, 248, 132, 108, 59, 179, 99, 145, 132, 82, 53, 203, 111, 150, 55, + 123, 51, 214, 165, 108, 124, 179, 131, 174, 139, 224, 114, 96, 218, 181, + 243, 128, 198, 98, 115, 92, 95, 165, 23, 229, 108, 146, 14, 244, 162, 37, + 85, 201, 33, 44, 92, 106, 112, 185, 16, 189, 42, 114, 109, 59, 124, 131, + 16, 211, 31, 97, 29, 135, 61, 150, 75, 250, 207, 129, 38, 205, 187, 186, + 55, 207, 232, 24, 48, 232, 49, 226, 16, 12, 27, 70, 31, 124, 128, 218, + 100, 91, 200, 184, 78, 252, 100, 235, 62, 43, 69, 214, 163, 65, 14, 44, + 180, + ]), + + 256: new Uint8Array([ + 8, 97, 235, 113, 70, 32, 135, 131, 210, 209, 124, 160, 255, 182, 9, 29, + 125, 193, 27, 240, 129, 46, 2, 137, 169, 142, 61, 7, 145, 54, 170, 207, + 159, 111, 39, 95, 87, 63, 162, 27, 6, 18, 219, 215, 116, 34, 90, 57, 114, + 244, 102, 145, 67, 6, 51, 152, 247, 165, 242, 116, 100, 219, 177, 72, 177, + 17, 110, 67, 93, 219, 100, 217, 20, 207, 89, 154, 45, 37, 105, 83, 67, + 162, 140, 235, 129, 40, 177, 202, 174, 54, 148, 55, 156, 193, 232, 249, + 134, 163, 195, 51, 114, 116, 65, 38, 73, 99, 96, 249, 224, 69, 17, 119, + 186, 188, 181, 43, 78, 156, 76, 138, 226, 63, 5, 248, 9, 94, 26, 1, 2, + 235, 39, 174, 74, 47, 183, 22, 40, 47, 47, 13, 100, 119, 12, 67, 178, 184, + 56, 167, 238, 143, 13, 44, 208, 185, 151, 108, 6, 17, 52, 122, 182, 210, + 207, 42, 219, 37, 74, 94, 126, 36, 249, 37, 32, 4, 218, 44, 238, 69, 56, + 219, 31, 77, 173, 46, 187, 103, 36, 112, 213, 252, 40, 87, 164, 240, 163, + 159, 32, 129, 125, 178, 108, 47, 28, 31, 36, 42, 115, 36, 14, 145, 195, + 156, 191, 46, 163, 249, 181, 31, 90, 73, 30, 72, 57, 223, 63, 60, 79, 140, + 14, 117, 31, 145, 222, 156, 121, 237, 32, 145, 143, 96, 12, 254, 35, 21, + 21, 59, 168, 171, 154, 217, 0, 59, 202, 175, 103, 214, 192, 175, 26, 18, + 43, 54, 176, 222, 75, 22, 7, 122, 253, 224, 145, 61, 42, 208, 73, 237, 84, + 141, 209, 213, 228, 46, 244, 59, 9, 68, 6, 35, 88, 189, 10, 62, 9, 85, 28, + 44, 82, 19, 153, 160, 178, 240, 56, 160, 244, 201, 173, 77, 61, 20, 227, + 30, 180, 167, 16, 105, 185, 193, 95, 207, 41, 23, 134, 78, 198, 182, 93, + 24, 89, 247, 231, 75, 233, 194, 137, 242, 114, 194, 190, 130, 138, 238, + 94, 137, 193, 194, 115, 137, 190, 207, 169, 83, 155, 14, 210, 160, 129, + 195, 161, 234, 221, 255, 114, 67, 98, 12, 93, 41, 65, 183, 244, 103, 247, + 101, 82, 246, 125, 87, 125, 78, 21, 186, 102, 205, 20, 40, 32, 201, 174, + 15, 52, 240, 217, 180, 162, 108, 6, 211, 41, 18, 135, 232, 184, 18, 188, + 169, 157, 190, 76, 166, 75, 176, 127, 39, 251, 22, 203, 153, 80, 49, 241, + 124, 137, 151, 123, 204, 43, 159, 190, 177, 196, 18, 117, 169, 46, 152, + 251, 45, 25, 164, 27, 145, 214, 228, 55, 15, 2, 131, 216, 80, 255, 204, + 175, 100, 59, 145, 15, 103, 40, 33, 45, 255, 200, 254, 172, 138, 20, 58, + 87, 182, 192, 148, 219, 41, 88, 230, 229, 70, 249, + ]), + }; + + return { + plaintext, + keyBytes, + iv, + additionalData, + tag, + tag_with_empty_ad, + ciphertext, + }; +} diff --git a/Tests/LibWeb/Text/input/wpt-import/WebCryptoAPI/encrypt_decrypt/aes_gcm_96_iv_fixtures.js b/Tests/LibWeb/Text/input/wpt-import/WebCryptoAPI/encrypt_decrypt/aes_gcm_96_iv_fixtures.js new file mode 100644 index 0000000000000..bb00e2d7dd92c --- /dev/null +++ b/Tests/LibWeb/Text/input/wpt-import/WebCryptoAPI/encrypt_decrypt/aes_gcm_96_iv_fixtures.js @@ -0,0 +1,209 @@ +function getFixtures() { + // Before we can really start, we need to fill a bunch of buffers with data + var plaintext = new Uint8Array([ + 84, 104, 105, 115, 32, 115, 112, 101, 99, 105, 102, 105, 99, 97, 116, 105, + 111, 110, 32, 100, 101, 115, 99, 114, 105, 98, 101, 115, 32, 97, 32, 74, 97, + 118, 97, 83, 99, 114, 105, 112, 116, 32, 65, 80, 73, 32, 102, 111, 114, 32, + 112, 101, 114, 102, 111, 114, 109, 105, 110, 103, 32, 98, 97, 115, 105, 99, + 32, 99, 114, 121, 112, 116, 111, 103, 114, 97, 112, 104, 105, 99, 32, 111, + 112, 101, 114, 97, 116, 105, 111, 110, 115, 32, 105, 110, 32, 119, 101, 98, + 32, 97, 112, 112, 108, 105, 99, 97, 116, 105, 111, 110, 115, 44, 32, 115, + 117, 99, 104, 32, 97, 115, 32, 104, 97, 115, 104, 105, 110, 103, 44, 32, + 115, 105, 103, 110, 97, 116, 117, 114, 101, 32, 103, 101, 110, 101, 114, 97, + 116, 105, 111, 110, 32, 97, 110, 100, 32, 118, 101, 114, 105, 102, 105, 99, + 97, 116, 105, 111, 110, 44, 32, 97, 110, 100, 32, 101, 110, 99, 114, 121, + 112, 116, 105, 111, 110, 32, 97, 110, 100, 32, 100, 101, 99, 114, 121, 112, + 116, 105, 111, 110, 46, 32, 65, 100, 100, 105, 116, 105, 111, 110, 97, 108, + 108, 121, 44, 32, 105, 116, 32, 100, 101, 115, 99, 114, 105, 98, 101, 115, + 32, 97, 110, 32, 65, 80, 73, 32, 102, 111, 114, 32, 97, 112, 112, 108, 105, + 99, 97, 116, 105, 111, 110, 115, 32, 116, 111, 32, 103, 101, 110, 101, 114, + 97, 116, 101, 32, 97, 110, 100, 47, 111, 114, 32, 109, 97, 110, 97, 103, + 101, 32, 116, 104, 101, 32, 107, 101, 121, 105, 110, 103, 32, 109, 97, 116, + 101, 114, 105, 97, 108, 32, 110, 101, 99, 101, 115, 115, 97, 114, 121, 32, + 116, 111, 32, 112, 101, 114, 102, 111, 114, 109, 32, 116, 104, 101, 115, + 101, 32, 111, 112, 101, 114, 97, 116, 105, 111, 110, 115, 46, 32, 85, 115, + 101, 115, 32, 102, 111, 114, 32, 116, 104, 105, 115, 32, 65, 80, 73, 32, + 114, 97, 110, 103, 101, 32, 102, 114, 111, 109, 32, 117, 115, 101, 114, 32, + 111, 114, 32, 115, 101, 114, 118, 105, 99, 101, 32, 97, 117, 116, 104, 101, + 110, 116, 105, 99, 97, 116, 105, 111, 110, 44, 32, 100, 111, 99, 117, 109, + 101, 110, 116, 32, 111, 114, 32, 99, 111, 100, 101, 32, 115, 105, 103, 110, + 105, 110, 103, 44, 32, 97, 110, 100, 32, 116, 104, 101, 32, 99, 111, 110, + 102, 105, 100, 101, 110, 116, 105, 97, 108, 105, 116, 121, 32, 97, 110, 100, + 32, 105, 110, 116, 101, 103, 114, 105, 116, 121, 32, 111, 102, 32, 99, 111, + 109, 109, 117, 110, 105, 99, 97, 116, 105, 111, 110, 115, 46, + ]); + + // We want some random key bytes of various sizes. + // These were randomly generated from a script. + var keyBytes = { + 128: new Uint8Array([ + 222, 192, 212, 252, 191, 60, 71, 65, 200, 146, 218, 189, 28, 212, 192, 78, + ]), + 192: new Uint8Array([ + 208, 238, 131, 65, 63, 68, 196, 63, 186, 208, 61, 207, 166, 18, 99, 152, + 29, 109, 221, 95, 240, 30, 28, 246, + ]), + 256: new Uint8Array([ + 103, 105, 56, 35, 251, 29, 88, 7, 63, 145, 236, 233, 204, 58, 249, 16, + 229, 83, 38, 22, 164, 210, 123, 19, 235, 123, 116, 216, 0, 11, 191, 48, + ]), + }; + + // AES-GCM specification recommends that the IV should be 96 bits long. + var iv = new Uint8Array([ + 58, 146, 115, 42, 166, 234, 57, 191, 57, 134, 224, 199, + ]); + + // Authenticated encryption via AES-GCM requires additional data that + // will be checked. We use the ASCII encoded Editorial Note + // following the Abstract of the Web Cryptography API recommendation. + var additionalData = new Uint8Array([ + 84, 104, 101, 114, 101, 32, 97, 114, 101, 32, 55, 32, 102, 117, 114, 116, + 104, 101, 114, 32, 101, 100, 105, 116, 111, 114, 105, 97, 108, 32, 110, 111, + 116, 101, 115, 32, 105, 110, 32, 116, 104, 101, 32, 100, 111, 99, 117, 109, + 101, 110, 116, 46, + ]); + + // The length of the tag defaults to 16 bytes (128 bit). + var tag = { + 128: new Uint8Array([ + 180, 165, 14, 180, 121, 113, 220, 168, 254, 117, 18, 66, 110, 98, 146, + 240, + ]), + 192: new Uint8Array([ + 43, 102, 63, 121, 1, 120, 252, 2, 95, 149, 99, 207, 161, 10, 139, 159, + ]), + 256: new Uint8Array([ + 53, 0, 70, 11, 217, 64, 250, 241, 175, 160, 37, 78, 92, 160, 107, 38, + ]), + }; + + var tag_with_empty_ad = { + 128: new Uint8Array([ + 168, 116, 195, 94, 178, 179, 227, 160, 158, 207, 188, 132, 23, 137, 246, + 129, + ]), + 192: new Uint8Array([ + 111, 84, 157, 153, 12, 219, 247, 161, 220, 24, 0, 74, 203, 228, 83, 201, + ]), + 256: new Uint8Array([ + 125, 85, 225, 240, 220, 112, 144, 9, 168, 179, 251, 128, 126, 147, 131, + 244, + ]), + }; + + // Results. These were created using OpenSSL. + + // AES-GCM produces ciphertext and a tag. + var ciphertext = { + 128: new Uint8Array([ + 46, 244, 139, 198, 120, 180, 9, 39, 83, 58, 203, 107, 69, 71, 8, 165, 132, + 200, 94, 31, 228, 120, 170, 81, 241, 29, 38, 175, 99, 215, 241, 157, 144, + 97, 35, 42, 36, 231, 2, 94, 214, 140, 67, 48, 189, 242, 21, 208, 110, 179, + 30, 90, 181, 105, 242, 17, 244, 42, 42, 36, 125, 228, 82, 250, 87, 199, + 95, 168, 210, 57, 174, 20, 220, 188, 107, 65, 242, 43, 217, 122, 145, 160, + 100, 139, 54, 135, 175, 139, 115, 89, 15, 236, 234, 83, 2, 135, 51, 125, + 63, 168, 184, 235, 148, 68, 132, 124, 166, 171, 53, 68, 94, 187, 31, 68, + 119, 47, 252, 73, 63, 138, 154, 84, 167, 0, 54, 33, 11, 200, 22, 91, 245, + 62, 64, 192, 7, 180, 210, 52, 233, 23, 24, 181, 50, 230, 63, 118, 228, 24, + 1, 242, 75, 62, 196, 222, 122, 154, 227, 125, 89, 73, 112, 100, 154, 249, + 61, 141, 126, 145, 46, 247, 102, 242, 62, 148, 94, 172, 128, 181, 110, 6, + 7, 209, 58, 222, 51, 169, 83, 189, 200, 47, 22, 80, 49, 169, 227, 245, + 165, 24, 96, 152, 228, 14, 252, 199, 193, 148, 46, 84, 49, 248, 198, 7, 0, + 134, 255, 174, 151, 103, 48, 154, 178, 198, 103, 45, 226, 118, 19, 41, 85, + 2, 55, 71, 7, 6, 0, 24, 150, 145, 227, 162, 126, 102, 248, 134, 116, 174, + 215, 217, 166, 160, 140, 129, 21, 220, 131, 110, 242, 94, 249, 103, 151, + 154, 81, 225, 35, 111, 131, 129, 111, 172, 214, 168, 30, 169, 71, 210, 64, + 68, 56, 228, 223, 248, 233, 234, 140, 86, 145, 121, 29, 232, 55, 165, 61, + 175, 147, 66, 33, 92, 6, 209, 241, 149, 73, 77, 9, 104, 2, 154, 247, 92, + 87, 159, 191, 113, 82, 122, 148, 89, 28, 122, 111, 93, 110, 60, 42, 34, + 70, 161, 14, 50, 153, 238, 189, 173, 99, 10, 118, 252, 1, 28, 67, 151, + 114, 46, 78, 181, 78, 233, 183, 6, 254, 57, 29, 53, 118, 175, 80, 97, 156, + 237, 219, 196, 71, 80, 161, 248, 139, 96, 124, 181, 154, 124, 149, 219, + 47, 90, 11, 98, 63, 21, 64, 144, 77, 161, 204, 127, 209, 209, 7, 86, 65, + 39, 142, 251, 183, 43, 227, 120, 155, 72, 70, 204, 89, 227, 199, 203, 28, + 128, 23, 104, 188, 215, 32, 190, 18, 156, 57, 105, 7, 179, 155, 136, 236, + 82, 173, 156, 170, 124, 210, 22, 11, 27, 182, 236, 109, 200, 172, 227, 72, + 37, 1, 175, 9, 214, 227, 23, 141, 169, 215, 77, 134, 76, 229, 169, 241, + 116, 222, 157, 77, 158, 213, 118, 223, 17, 31, 212, 97, 21, 237, 83, 2, + 218, 239, 59, 147, 30, 169, 97, 12, + ]), + + 192: new Uint8Array([ + 129, 16, 61, 38, 99, 56, 226, 139, 71, 251, 211, 15, 91, 152, 159, 219, + 112, 147, 210, 73, 97, 204, 203, 240, 183, 243, 104, 241, 37, 67, 169, + 198, 56, 76, 96, 202, 250, 212, 177, 157, 93, 115, 247, 176, 19, 3, 229, + 102, 75, 200, 252, 222, 197, 58, 31, 44, 123, 151, 9, 191, 88, 123, 35, + 48, 47, 25, 149, 35, 191, 219, 223, 94, 251, 152, 109, 171, 225, 31, 236, + 252, 223, 174, 128, 238, 173, 32, 32, 79, 22, 100, 112, 215, 153, 128, 63, + 158, 247, 18, 215, 81, 247, 208, 91, 28, 223, 222, 170, 9, 135, 210, 143, + 47, 247, 132, 183, 252, 84, 19, 78, 85, 17, 215, 20, 51, 32, 124, 149, + 172, 129, 202, 161, 217, 207, 24, 45, 177, 11, 106, 17, 108, 17, 12, 6, + 62, 90, 132, 2, 54, 96, 90, 30, 239, 216, 173, 76, 67, 7, 221, 62, 124, + 228, 156, 243, 31, 111, 160, 192, 188, 87, 107, 182, 138, 95, 122, 152, + 202, 51, 118, 100, 124, 67, 220, 116, 52, 99, 15, 39, 2, 14, 209, 173, + 119, 88, 6, 174, 106, 236, 150, 28, 189, 112, 161, 224, 186, 58, 110, 91, + 54, 211, 132, 149, 7, 188, 77, 232, 118, 197, 43, 107, 101, 179, 44, 195, + 159, 4, 124, 5, 30, 48, 227, 251, 199, 72, 98, 177, 206, 234, 228, 58, + 191, 150, 28, 211, 29, 182, 138, 141, 249, 152, 142, 244, 203, 210, 128, + 143, 244, 44, 187, 251, 221, 101, 152, 31, 119, 194, 51, 27, 167, 215, + 122, 244, 193, 224, 191, 198, 210, 2, 143, 185, 207, 145, 228, 193, 153, + 207, 119, 167, 75, 145, 43, 17, 1, 42, 146, 164, 21, 15, 164, 221, 216, + 140, 122, 248, 49, 19, 246, 84, 214, 176, 226, 118, 140, 130, 123, 163, + 217, 61, 198, 243, 182, 217, 52, 127, 190, 127, 135, 18, 239, 163, 195, + 102, 136, 227, 128, 38, 244, 49, 208, 229, 249, 126, 157, 100, 72, 246, + 10, 102, 163, 241, 155, 112, 165, 95, 32, 61, 66, 24, 233, 123, 236, 190, + 124, 214, 65, 135, 114, 118, 122, 222, 196, 47, 120, 120, 64, 117, 253, + 165, 28, 17, 152, 104, 119, 10, 53, 140, 109, 79, 246, 246, 28, 104, 228, + 175, 102, 71, 246, 183, 79, 30, 31, 186, 32, 64, 146, 72, 228, 1, 175, + 252, 115, 254, 95, 66, 87, 196, 134, 41, 115, 165, 206, 253, 245, 147, + 137, 163, 230, 235, 238, 77, 218, 74, 157, 65, 97, 43, 198, 130, 190, 195, + 142, 22, 166, 4, 179, 184, 167, 254, 156, 243, 38, 46, 66, 68, 252, 252, + 161, 209, 83, 177, 128, 115, 92, 158, 182, 177, 185, 23, 39, 138, 245, 29, + 216, 17, 178, 142, 225, 135, 8, 115, + ]), + + 256: new Uint8Array([ + 191, 72, 167, 1, 122, 218, 148, 218, 15, 239, 202, 129, 96, 108, 229, 157, + 138, 161, 232, 71, 80, 188, 118, 61, 75, 105, 120, 201, 14, 102, 102, 240, + 111, 131, 180, 83, 95, 73, 2, 138, 205, 56, 9, 137, 227, 235, 73, 71, 200, + 62, 246, 0, 223, 209, 3, 255, 113, 112, 63, 103, 41, 154, 77, 13, 149, 89, + 94, 79, 132, 193, 114, 40, 158, 33, 55, 242, 130, 109, 136, 69, 124, 130, + 150, 40, 69, 211, 224, 154, 209, 243, 65, 58, 230, 253, 31, 21, 72, 102, + 18, 250, 139, 230, 235, 11, 108, 184, 133, 108, 181, 138, 188, 189, 91, + 91, 115, 216, 68, 9, 229, 30, 154, 132, 118, 219, 183, 235, 177, 197, 221, + 58, 13, 90, 126, 198, 74, 87, 162, 226, 7, 51, 184, 15, 209, 81, 86, 138, + 169, 154, 12, 206, 58, 187, 228, 177, 68, 65, 62, 68, 141, 93, 241, 105, + 29, 239, 20, 102, 222, 49, 209, 18, 162, 247, 200, 240, 122, 244, 204, + 148, 67, 58, 118, 164, 95, 230, 68, 242, 203, 138, 145, 132, 6, 224, 206, + 234, 131, 183, 137, 249, 2, 11, 254, 123, 235, 70, 14, 136, 207, 76, 57, + 22, 38, 49, 197, 219, 123, 43, 241, 191, 64, 211, 152, 178, 140, 165, 1, + 189, 52, 79, 184, 213, 56, 215, 182, 27, 27, 70, 243, 101, 255, 50, 108, + 210, 105, 13, 22, 218, 176, 238, 36, 113, 251, 18, 218, 138, 214, 193, 21, + 122, 224, 125, 118, 134, 161, 174, 130, 86, 233, 149, 151, 33, 31, 88, 63, + 91, 63, 209, 145, 158, 109, 42, 176, 43, 23, 151, 49, 101, 199, 35, 101, + 158, 139, 198, 219, 209, 125, 221, 205, 99, 69, 142, 165, 139, 110, 220, + 184, 226, 238, 149, 161, 175, 171, 167, 170, 65, 19, 156, 166, 219, 231, + 87, 20, 226, 58, 210, 134, 110, 160, 176, 118, 250, 73, 86, 213, 116, 53, + 114, 24, 101, 34, 185, 59, 237, 47, 39, 206, 67, 12, 74, 236, 130, 7, 249, + 217, 203, 245, 122, 14, 230, 53, 203, 126, 93, 131, 51, 2, 0, 231, 161, + 111, 42, 126, 173, 121, 80, 179, 59, 186, 133, 236, 252, 188, 149, 99, + 221, 182, 55, 5, 38, 83, 132, 43, 123, 233, 174, 208, 140, 165, 77, 1, + 202, 46, 6, 183, 207, 246, 125, 37, 110, 226, 61, 155, 194, 198, 153, 107, + 1, 8, 0, 23, 124, 18, 4, 144, 235, 146, 77, 220, 123, 152, 114, 219, 127, + 59, 126, 10, 79, 106, 198, 11, 27, 111, 11, 155, 1, 137, 38, 74, 3, 248, + 225, 221, 203, 86, 4, 148, 25, 88, 144, 185, 38, 114, 139, 48, 74, 82, + 172, 36, 115, 193, 223, 220, 144, 69, 91, 5, 83, 56, 138, 63, + ]), + }; + + return { + plaintext, + keyBytes, + iv, + additionalData, + tag, + tag_with_empty_ad, + ciphertext, + }; +} diff --git a/Tests/LibWeb/Text/input/wpt-import/WebCryptoAPI/encrypt_decrypt/aes_gcm_vectors.js b/Tests/LibWeb/Text/input/wpt-import/WebCryptoAPI/encrypt_decrypt/aes_gcm_vectors.js new file mode 100644 index 0000000000000..965fe9564d461 --- /dev/null +++ b/Tests/LibWeb/Text/input/wpt-import/WebCryptoAPI/encrypt_decrypt/aes_gcm_vectors.js @@ -0,0 +1,76 @@ +// aes_gcm_vectors.js + +// The following function returns an array of test vectors +// for the subtleCrypto encrypt method. +// +// Each test vector has the following fields: +// name - a unique name for this vector +// keyBuffer - an arrayBuffer with the key data in raw form +// key - a CryptoKey object for the keyBuffer. INITIALLY null! You must fill this in first to use it! +// algorithm - the value of the AlgorithmIdentifier parameter to provide to encrypt +// plaintext - the text to encrypt +// result - the expected result (usually just ciphertext, sometimes with added authentication) +function getTestVectors() { + const { + plaintext, + keyBytes, + iv, + additionalData, + tag, + tag_with_empty_ad, + ciphertext, + } = getFixtures(); + + var keyLengths = [128, 192, 256]; + var tagLengths = [32, 64, 96, 104, 112, 120, 128]; + + // All the scenarios that should succeed, if the key has "encrypt" usage + var passing = []; + keyLengths.forEach(function(keyLength) { + tagLengths.forEach(function(tagLength) { + var byteCount = tagLength / 8; + + var result = new Uint8Array(ciphertext[keyLength].byteLength + byteCount); + result.set(ciphertext[keyLength], 0); + result.set(tag[keyLength].slice(0, byteCount), ciphertext[keyLength].byteLength); + passing.push({ + name: "AES-GCM " + keyLength.toString() + "-bit key, " + tagLength.toString() + "-bit tag, " + (iv.byteLength << 3).toString() + "-bit iv", + keyBuffer: keyBytes[keyLength], + key: null, + algorithm: {name: "AES-GCM", iv: iv, additionalData: additionalData, tagLength: tagLength}, + plaintext: plaintext, + result: result + }); + + var noadresult = new Uint8Array(ciphertext[keyLength].byteLength + byteCount); + noadresult.set(ciphertext[keyLength], 0); + noadresult.set(tag_with_empty_ad[keyLength].slice(0, byteCount), ciphertext[keyLength].byteLength); + passing.push({ + name: "AES-GCM " + keyLength.toString() + "-bit key, no additional data, " + tagLength.toString() + "-bit tag, " + (iv.byteLength << 3).toString() + "-bit iv", + keyBuffer: keyBytes[keyLength], + key: null, + algorithm: {name: "AES-GCM", iv: iv, tagLength: tagLength}, + plaintext: plaintext, + result: noadresult + }); + }); + }); + + // Scenarios that should fail because of a bad tag length, causing an OperationError + var failing = []; + keyLengths.forEach(function(keyLength) { + // First, make some tests for bad tag lengths + [24, 48, 72, 95, 129].forEach(function(badTagLength) { + failing.push({ + name: "AES-GCM " + keyLength.toString() + "-bit key, " + (iv.byteLength << 3).toString() + "-bit iv, " + "illegal tag length " + badTagLength.toString() + "-bits", + keyBuffer: keyBytes[keyLength], + key: null, + algorithm: {name: "AES-GCM", iv: iv, additionalData: additionalData, tagLength: badTagLength}, + plaintext: plaintext, + result: ciphertext[keyLength] + }); + }); + }); + + return {passing: passing, failing: failing, decryptionFailing: []}; +}