local testimony = require("testimony") local litls = require("litls.core") local hex = litls.hex_encode local unhex = litls.hex_decode local testify = testimony.new("== LITLS Ed25519 ==") -- RFC 8032 Section 7.1, Test Vector 1 (empty message) testify:that("Ed25519 sign/verify empty message (RFC 8032 7.1 #1)", function() local seed = unhex("9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60") local expected_pk = "d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a" local expected_sig = "e5564300c360ac729086e2cc806e828a84877f1eb8e5d974d873e06522490155" .. "5fb8821590a33bacc61e39701cf9b46bd25bf5f0595bbe24655141438e7a100b" local pk, sk = litls.ed25519_keypair(seed) testimony.assert_equal(expected_pk, hex(pk)) local sig = litls.ed25519_sign("", pk, sk) testimony.assert_equal(expected_sig, hex(sig)) testimony.assert_true(litls.ed25519_verify(sig, "", pk)) end) -- RFC 8032 Section 7.1, Test Vector 2 (single byte 0x72) testify:that("Ed25519 sign/verify single byte (RFC 8032 7.1 #2)", function() local seed = unhex("4ccd089b28ff96da9db6c346ec114e0f5b8a319f35aba624da8cf6ed4fb8a6fb") local expected_pk = "3d4017c3e843895a92b70aa74d1b7ebc9c982ccf2ec4968cc0cd55f12af4660c" local expected_sig = "92a009a9f0d4cab8720e820b5f642540a2b27b5416503f8fb3762223ebdb69da" .. "085ac1e43e15996e458f3613d0f11d8c387b2eaeb4302aeeb00d291612bb0c00" local pk, sk = litls.ed25519_keypair(seed) testimony.assert_equal(expected_pk, hex(pk)) local msg = unhex("72") local sig = litls.ed25519_sign(msg, pk, sk) testimony.assert_equal(expected_sig, hex(sig)) testimony.assert_true(litls.ed25519_verify(sig, msg, pk)) end) -- RFC 8032 Section 7.1, Test Vector 3 (two bytes) testify:that("Ed25519 sign/verify two bytes (RFC 8032 7.1 #3)", function() local seed = unhex("c5aa8df43f9f837bedb7442f31dcb7b166d38535076f094b85ce3a2e0b4458f7") local expected_pk = "fc51cd8e6218a1a38da47ed00230f0580816ed13ba3303ac5deb911548908025" local expected_sig = "6291d657deec24024827e69c3abe01a30ce548a284743a445e3680d7db5ac3ac" .. "18ff9b538d16f290ae67f760984dc6594a7c15e9716ed28dc027beceea1ec40a" local pk, sk = litls.ed25519_keypair(seed) testimony.assert_equal(expected_pk, hex(pk)) local msg = unhex("af82") local sig = litls.ed25519_sign(msg, pk, sk) testimony.assert_equal(expected_sig, hex(sig)) testimony.assert_true(litls.ed25519_verify(sig, msg, pk)) end) -- Verify rejects modified message testify:that("Ed25519 verify rejects tampered message", function() local seed = litls.random_bytes(32) local pk, sk = litls.ed25519_keypair(seed) local msg = "original message" local sig = litls.ed25519_sign(msg, pk, sk) testimony.assert_true(litls.ed25519_verify(sig, msg, pk)) testimony.assert_false(litls.ed25519_verify(sig, "tampered message", pk)) end) -- Verify rejects wrong public key testify:that("Ed25519 verify rejects wrong key", function() local seed1 = litls.random_bytes(32) local seed2 = litls.random_bytes(32) local pk1, sk1 = litls.ed25519_keypair(seed1) local pk2, _ = litls.ed25519_keypair(seed2) local msg = "test message" local sig = litls.ed25519_sign(msg, pk1, sk1) testimony.assert_true(litls.ed25519_verify(sig, msg, pk1)) testimony.assert_false(litls.ed25519_verify(sig, msg, pk2)) end) testify:conclude()