From 0124565a5206a27e01acb07eac7ef70b400cf7de Mon Sep 17 00:00:00 2001 From: Brian Smith Date: Sat, 13 May 2017 00:10:26 -1000 Subject: [PATCH] Move ECDSA integration/functional tests to tests/. --- Cargo.toml | 5 +- src/ec/suite_b/ecdsa.rs | 122 +++--------------- tests/ecdsa_tests.rs | 89 +++++++++++++ .../ecdsa_verify_asn1_tests.txt | 0 .../ecdsa_verify_fixed_tests.txt | 0 5 files changed, 108 insertions(+), 108 deletions(-) create mode 100644 tests/ecdsa_tests.rs rename {src/ec/suite_b => tests}/ecdsa_verify_asn1_tests.txt (100%) rename {src/ec/suite_b => tests}/ecdsa_verify_fixed_tests.txt (100%) diff --git a/Cargo.toml b/Cargo.toml index db3d1f3a4..8395cca6a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -66,8 +66,6 @@ include = [ "src/ec/suite_b/ecdh.rs", "src/ec/suite_b/ecdsa.rs", "src/ec/suite_b/ecdsa_digest_scalar_tests.txt", - "src/ec/suite_b/ecdsa_verify_asn1_tests.txt", - "src/ec/suite_b/ecdsa_verify_fixed_tests.txt", "src/ec/suite_b/ops/elem.rs", "src/ec/suite_b/ops/ops.rs", "src/ec/suite_b/ops/p256.rs", @@ -235,6 +233,9 @@ include = [ "include/GFp/mem.h", "include/GFp/type_check.h", "examples/checkdigest.rs", + "tests/ecdsa_tests.rs", + "tests/ecdsa_verify_asn1_tests.txt", + "tests/ecdsa_verify_fixed_tests.txt", "tests/ed25519_tests.rs", "tests/ed25519_tests.txt", "tests/ed25519_from_pkcs8_tests.txt", diff --git a/src/ec/suite_b/ecdsa.rs b/src/ec/suite_b/ecdsa.rs index 9da50efc7..ed9d90074 100644 --- a/src/ec/suite_b/ecdsa.rs +++ b/src/ec/suite_b/ecdsa.rs @@ -294,71 +294,11 @@ pub static ECDSA_P384_SHA384_ASN1: ECDSAVerificationAlgorithm = #[cfg(test)] mod tests { - use {digest, test, signature}; + use {digest, test}; use super::digest_scalar_; use super::super::ops::*; use untrusted; - #[test] - fn signature_ecdsa_verify_asn1_test() { - test::from_file("src/ec/suite_b/ecdsa_verify_asn1_tests.txt", - |section, test_case| { - assert_eq!(section, ""); - - let curve_name = test_case.consume_string("Curve"); - let digest_name = test_case.consume_string("Digest"); - - let msg = test_case.consume_bytes("Msg"); - let msg = untrusted::Input::from(&msg); - - let public_key = test_case.consume_bytes("Q"); - let public_key = untrusted::Input::from(&public_key); - - let sig = test_case.consume_bytes("Sig"); - let sig = untrusted::Input::from(&sig); - - let expected_result = test_case.consume_string("Result"); - - let (alg, _, _) = - alg_from_curve_and_digest_asn1(&curve_name, &digest_name); - - let actual_result = signature::verify(alg, public_key, msg, sig); - assert_eq!(actual_result.is_ok(), expected_result == "P (0 )"); - - Ok(()) - }); - } - - #[test] - fn signature_ecdsa_verify_fixed_test() { - test::from_file("src/ec/suite_b/ecdsa_verify_fixed_tests.txt", - |section, test_case| { - assert_eq!(section, ""); - - let curve_name = test_case.consume_string("Curve"); - let digest_name = test_case.consume_string("Digest"); - - let msg = test_case.consume_bytes("Msg"); - let msg = untrusted::Input::from(&msg); - - let public_key = test_case.consume_bytes("Q"); - let public_key = untrusted::Input::from(&public_key); - - let sig = test_case.consume_bytes("Sig"); - let sig = untrusted::Input::from(&sig); - - let expected_result = test_case.consume_string("Result"); - - let (alg, _, _) = - alg_from_curve_and_digest_fixed(&curve_name, &digest_name); - - let actual_result = signature::verify(alg, public_key, msg, sig); - assert_eq!(actual_result.is_ok(), expected_result == "P (0 )"); - - Ok(()) - }); - } - #[test] fn ecdsa_digest_scalar_test() { test::from_file("src/ec/suite_b/ecdsa_digest_scalar_tests.txt", @@ -367,13 +307,24 @@ mod tests { let curve_name = test_case.consume_string("Curve"); let digest_name = test_case.consume_string("Digest"); - let input = test_case.consume_bytes("Input"); - let output = test_case.consume_bytes("Output"); - let (_, ops, digest_alg) = - alg_from_curve_and_digest_asn1(&curve_name, &digest_name); + let (ops, digest_alg) = match + (curve_name.as_str(), digest_name.as_str()) { + ("P-256", "SHA256") => + (&p256::PUBLIC_SCALAR_OPS, &digest::SHA256), + ("P-256", "SHA384") => + (&p256::PUBLIC_SCALAR_OPS, &digest::SHA384), + ("P-384", "SHA256") => + (&p384::PUBLIC_SCALAR_OPS, &digest::SHA256), + ("P-384", "SHA384") => + (&p384::PUBLIC_SCALAR_OPS, &digest::SHA384), + _ => { + panic!("Unsupported curve+digest: {}+{}", curve_name, + digest_name); + } + }; let num_limbs = ops.public_key_ops.common.num_limbs; assert_eq!(input.len(), digest_alg.output_len); @@ -391,47 +342,6 @@ mod tests { Ok(()) }); } - - fn alg_from_curve_and_digest_asn1(curve_name: &str, digest_name: &str) - -> (&'static signature::VerificationAlgorithm, - &'static PublicScalarOps, &'static digest::Algorithm) { - match (curve_name, digest_name) { - ("P-256", "SHA256") => - (&signature::ECDSA_P256_SHA256_ASN1, &p256::PUBLIC_SCALAR_OPS, - &digest::SHA256), - ("P-256", "SHA384") => - (&signature::ECDSA_P256_SHA384_ASN1, &p256::PUBLIC_SCALAR_OPS, - &digest::SHA384), - ("P-384", "SHA256") => - (&signature::ECDSA_P384_SHA256_ASN1, &p384::PUBLIC_SCALAR_OPS, - &digest::SHA256), - ("P-384", "SHA384") => - (&signature::ECDSA_P384_SHA384_ASN1, &p384::PUBLIC_SCALAR_OPS, - &digest::SHA384), - _ => { - panic!("Unsupported curve+digest: {}+{}", curve_name, - digest_name); - } - } - } - - fn alg_from_curve_and_digest_fixed(curve_name: &str, digest_name: &str) - -> (&'static signature::VerificationAlgorithm, - &'static PublicScalarOps, &'static digest::Algorithm) { - match (curve_name, digest_name) { - ("P-256", "SHA256") => - (&signature::ECDSA_P256_SHA256_FIXED, &p256::PUBLIC_SCALAR_OPS, - &digest::SHA256), - ("P-384", "SHA384") => - (&signature::ECDSA_P384_SHA384_FIXED, &p384::PUBLIC_SCALAR_OPS, - &digest::SHA384), - _ => { - panic!("Unsupported curve+digest: {}+{}", curve_name, - digest_name); - } - } - } - } #[cfg(feature = "internal_benches")] diff --git a/tests/ecdsa_tests.rs b/tests/ecdsa_tests.rs new file mode 100644 index 000000000..95c45de26 --- /dev/null +++ b/tests/ecdsa_tests.rs @@ -0,0 +1,89 @@ +// Copyright 2015-2016 Brian Smith. +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION +// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +extern crate ring; +extern crate untrusted; + +use ring::{signature, test}; + +#[test] +fn signature_ecdsa_verify_asn1_test() { + test::from_file("tests/ecdsa_verify_asn1_tests.txt", |section, test_case| { + assert_eq!(section, ""); + + let curve_name = test_case.consume_string("Curve"); + let digest_name = test_case.consume_string("Digest"); + + let msg = test_case.consume_bytes("Msg"); + let msg = untrusted::Input::from(&msg); + + let public_key = test_case.consume_bytes("Q"); + let public_key = untrusted::Input::from(&public_key); + + let sig = test_case.consume_bytes("Sig"); + let sig = untrusted::Input::from(&sig); + + let expected_result = test_case.consume_string("Result"); + + let alg = match (curve_name.as_str(), digest_name.as_str()) { + ("P-256", "SHA256") => &signature::ECDSA_P256_SHA256_ASN1, + ("P-256", "SHA384") => &signature::ECDSA_P256_SHA384_ASN1, + ("P-384", "SHA256") => &signature::ECDSA_P384_SHA256_ASN1, + ("P-384", "SHA384") => &signature::ECDSA_P384_SHA384_ASN1, + _ => { + panic!("Unsupported curve+digest: {}+{}", curve_name, + digest_name); + } + }; + + let actual_result = signature::verify(alg, public_key, msg, sig); + assert_eq!(actual_result.is_ok(), expected_result == "P (0 )"); + + Ok(()) + }); +} + +#[test] +fn signature_ecdsa_verify_fixed_test() { + test::from_file("tests/ecdsa_verify_fixed_tests.txt", |section, test_case| { + assert_eq!(section, ""); + + let curve_name = test_case.consume_string("Curve"); + let digest_name = test_case.consume_string("Digest"); + + let msg = test_case.consume_bytes("Msg"); + let msg = untrusted::Input::from(&msg); + + let public_key = test_case.consume_bytes("Q"); + let public_key = untrusted::Input::from(&public_key); + + let sig = test_case.consume_bytes("Sig"); + let sig = untrusted::Input::from(&sig); + + let expected_result = test_case.consume_string("Result"); + + let alg = match (curve_name.as_str(), digest_name.as_str()) { + ("P-256", "SHA256") => &signature::ECDSA_P256_SHA256_FIXED, + ("P-384", "SHA384") => &signature::ECDSA_P384_SHA384_FIXED, + _ => { + panic!("Unsupported curve+digest: {}+{}", curve_name, digest_name); + } + }; + + let actual_result = signature::verify(alg, public_key, msg, sig); + assert_eq!(actual_result.is_ok(), expected_result == "P (0 )"); + + Ok(()) + }); +} diff --git a/src/ec/suite_b/ecdsa_verify_asn1_tests.txt b/tests/ecdsa_verify_asn1_tests.txt similarity index 100% rename from src/ec/suite_b/ecdsa_verify_asn1_tests.txt rename to tests/ecdsa_verify_asn1_tests.txt diff --git a/src/ec/suite_b/ecdsa_verify_fixed_tests.txt b/tests/ecdsa_verify_fixed_tests.txt similarity index 100% rename from src/ec/suite_b/ecdsa_verify_fixed_tests.txt rename to tests/ecdsa_verify_fixed_tests.txt