From 6ab5632e609faee36b505b6bad7af81ea6eb2de0 Mon Sep 17 00:00:00 2001 From: Jeffrey Walton Date: Sat, 6 Aug 2022 12:58:38 -0400 Subject: Switch to heap allocations for ECGDSA signature verification (GH #1134) --- validat9.cpp | 74 +++++++++++++++++++++++++++++++++--------------------------- 1 file changed, 41 insertions(+), 33 deletions(-) (limited to 'validat9.cpp') diff --git a/validat9.cpp b/validat9.cpp index 818148be..0aec033e 100644 --- a/validat9.cpp +++ b/validat9.cpp @@ -354,11 +354,12 @@ bool ValidateECGDSAStandard() const byte msg[] = "Example of ECGDSA with the hash function SHA-1"; const size_t len = strlen((char*)msg); - byte signature[48]; - r.Encode(signature+0, 24); - s.Encode(signature+24, 24); + const size_t maxLength = signer.MaxSignatureLength(); + SecByteBlock signature(maxLength); + r.Encode(signature+ 0, maxLength/2); + s.Encode(signature+maxLength/2, maxLength/2); - fail = !verifier.VerifyMessage(msg, len, signature, sizeof(signature)); + fail = !verifier.VerifyMessage(msg, len, signature, signature.size()); pass = pass && !fail; std::cout << (fail ? "FAILED " : "passed "); @@ -391,11 +392,12 @@ bool ValidateECGDSAStandard() const byte msg[] = "Example of ECGDSA with the hash function SHA-224"; const size_t len = strlen((char*)msg); - byte signature[80]; - r.Encode(signature+0, 40); - s.Encode(signature+40, 40); + const size_t maxLength = signer.MaxSignatureLength(); + SecByteBlock signature(maxLength); + r.Encode(signature+ 0, maxLength/2); + s.Encode(signature+maxLength/2, maxLength/2); - fail = !verifier.VerifyMessage(msg, len, signature, sizeof(signature)); + fail = !verifier.VerifyMessage(msg, len, signature, signature.size()); pass = pass && !fail; std::cout << (fail ? "FAILED " : "passed "); @@ -428,11 +430,12 @@ bool ValidateECGDSAStandard() const byte msg[] = "Example of ECGDSA with the hash function SHA-256"; const size_t len = strlen((char*)msg); - byte signature[80]; - r.Encode(signature+0, 40); - s.Encode(signature+40, 40); + const size_t maxLength = signer.MaxSignatureLength(); + SecByteBlock signature(maxLength); + r.Encode(signature+ 0, maxLength/2); + s.Encode(signature+maxLength/2, maxLength/2); - fail = !verifier.VerifyMessage(msg, len, signature, sizeof(signature)); + fail = !verifier.VerifyMessage(msg, len, signature, signature.size()); pass = pass && !fail; std::cout << (fail ? "FAILED " : "passed "); @@ -465,11 +468,12 @@ bool ValidateECGDSAStandard() const byte msg[] = "Example of ECGDSA with the hash function SHA-384"; const size_t len = strlen((char*)msg); - byte signature[128]; - r.Encode(signature+0, 64); - s.Encode(signature+64, 64); + const size_t maxLength = signer.MaxSignatureLength(); + SecByteBlock signature(maxLength); + r.Encode(signature+ 0, maxLength/2); + s.Encode(signature+maxLength/2, maxLength/2); - fail = !verifier.VerifyMessage(msg, len, signature, sizeof(signature)); + fail = !verifier.VerifyMessage(msg, len, signature, signature.size()); pass = pass && !fail; std::cout << (fail ? "FAILED " : "passed "); @@ -502,11 +506,12 @@ bool ValidateECGDSAStandard() const byte msg[] = "Example of ECGDSA with the hash function SHA-512"; const size_t len = strlen((char*)msg); - byte signature[128]; - r.Encode(signature+0, 64); - s.Encode(signature+64, 64); + const size_t maxLength = signer.MaxSignatureLength(); + SecByteBlock signature(maxLength); + r.Encode(signature+ 0, maxLength/2); + s.Encode(signature+maxLength/2, maxLength/2); - fail = !verifier.VerifyMessage(msg, len, signature, sizeof(signature)); + fail = !verifier.VerifyMessage(msg, len, signature, signature.size()); pass = pass && !fail; std::cout << (fail ? "FAILED " : "passed "); @@ -548,11 +553,12 @@ bool ValidateECGDSAThorough() const byte msg[] = "Example of ECGDSA with the hash function RIPEMD-160"; const size_t len = strlen((char*)msg); - byte signature[48]; - r.Encode(signature+0, 24); - s.Encode(signature+24, 24); + const size_t maxLength = signer.MaxSignatureLength(); + SecByteBlock signature(maxLength); + r.Encode(signature+ 0, maxLength/2); + s.Encode(signature+maxLength/2, maxLength/2); - fail = !verifier.VerifyMessage(msg, len, signature, sizeof(signature)); + fail = !verifier.VerifyMessage(msg, len, signature, signature.size()); pass = pass && !fail; std::cout << (fail ? "FAILED " : "passed "); @@ -585,11 +591,12 @@ bool ValidateECGDSAThorough() const byte msg[] = "Example of ECGDSA with the hash function RIPEMD-160"; const size_t len = strlen((char*)msg); - byte signature[64]; - r.Encode(signature+0, 32); - s.Encode(signature+32, 32); + const size_t maxLength = signer.MaxSignatureLength(); + SecByteBlock signature(maxLength); + r.Encode(signature+ 0, maxLength/2); + s.Encode(signature+maxLength/2, maxLength/2); - fail = !verifier.VerifyMessage(msg, len, signature, sizeof(signature)); + fail = !verifier.VerifyMessage(msg, len, signature, signature.size()); pass = pass && !fail; std::cout << (fail ? "FAILED " : "passed "); @@ -622,11 +629,12 @@ bool ValidateECGDSAThorough() const byte msg[] = "Example of ECGDSA with the hash function RIPEMD-160"; const size_t len = strlen((char*)msg); - byte signature[80]; - r.Encode(signature+0, 40); - s.Encode(signature+40, 40); + const size_t maxLength = signer.MaxSignatureLength(); + SecByteBlock signature(maxLength); + r.Encode(signature+ 0, maxLength/2); + s.Encode(signature+maxLength/2, maxLength/2); - fail = !verifier.VerifyMessage(msg, len, signature, sizeof(signature)); + fail = !verifier.VerifyMessage(msg, len, signature, signature.size()); pass = pass && !fail; std::cout << (fail ? "FAILED " : "passed "); @@ -644,7 +652,7 @@ bool ValidateECGDSA(bool thorough) { std::cout << "\nECGDSA validation suite running...\n\n"; - if(thorough) + if (thorough) return ValidateECGDSAStandard() && ValidateECGDSAThorough(); else return ValidateECGDSAStandard(); -- cgit v1.2.1