51 lines
1.4 KiB
Crystal
51 lines
1.4 KiB
Crystal
# ===================
|
|
# ©AngelaMos | 2026
|
|
# aead_spec.cr
|
|
# ===================
|
|
|
|
require "../../spec_helper"
|
|
require "../../../src/cre/crypto/aead"
|
|
require "../../../src/cre/crypto/random"
|
|
|
|
describe CRE::Crypto::Aead do
|
|
it "round-trips AES-256-GCM with AAD" do
|
|
key = CRE::Crypto::Random.bytes(32)
|
|
plaintext = "secret value 123".to_slice
|
|
aad = "tenant=t1|cred=c1|ver=v1".to_slice
|
|
|
|
ct, nonce, tag = CRE::Crypto::Aead.encrypt(plaintext, key, aad)
|
|
decrypted = CRE::Crypto::Aead.decrypt(ct, key, aad, nonce, tag)
|
|
decrypted.should eq plaintext
|
|
end
|
|
|
|
it "fails to decrypt with wrong AAD" do
|
|
key = CRE::Crypto::Random.bytes(32)
|
|
plaintext = "secret".to_slice
|
|
aad = "right".to_slice
|
|
|
|
ct, nonce, tag = CRE::Crypto::Aead.encrypt(plaintext, key, aad)
|
|
expect_raises(CRE::Crypto::Aead::Error) do
|
|
CRE::Crypto::Aead.decrypt(ct, key, "wrong".to_slice, nonce, tag)
|
|
end
|
|
end
|
|
|
|
it "fails to decrypt with tampered ciphertext" do
|
|
key = CRE::Crypto::Random.bytes(32)
|
|
plaintext = "abc-def".to_slice
|
|
aad = "x".to_slice
|
|
|
|
ct, nonce, tag = CRE::Crypto::Aead.encrypt(plaintext, key, aad)
|
|
ct[0] ^= 0x01_u8
|
|
expect_raises(CRE::Crypto::Aead::Error) do
|
|
CRE::Crypto::Aead.decrypt(ct, key, aad, nonce, tag)
|
|
end
|
|
end
|
|
|
|
it "rejects keys of incorrect size" do
|
|
bad_key = Bytes.new(16)
|
|
expect_raises(ArgumentError) do
|
|
CRE::Crypto::Aead.encrypt("x".to_slice, bad_key, "a".to_slice)
|
|
end
|
|
end
|
|
end
|