blob: 9c503ba53ba3825502ca213c3e5cc4c3c408fcaf [file] [log] [blame]
Alice Wang000595b2023-10-02 13:46:45 +00001// Copyright 2023, The Android Open Source Project
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
Alice Wang7468ae42023-11-30 10:20:36 +000015use bssl_avf::{sha256, ApiName, Digester, EcKey, EcdsaError, Error, PKey, Result};
Alice Wang9bd98092023-11-10 14:08:12 +000016use coset::CborSerializable;
Alice Wang600ea5b2023-11-17 15:12:16 +000017use spki::{
18 der::{AnyRef, Decode},
19 AlgorithmIdentifier, ObjectIdentifier, SubjectPublicKeyInfo,
20};
21
22/// OID value for general-use NIST EC keys held in PKCS#8 and X.509; see RFC 5480 s2.1.1.
23const X509_NIST_OID: ObjectIdentifier = ObjectIdentifier::new_unwrap("1.2.840.10045.2.1");
24
25/// OID value in `AlgorithmIdentifier.parameters` for P-256; see RFC 5480 s2.1.1.1.
26const ALGO_PARAM_P256_OID: ObjectIdentifier = ObjectIdentifier::new_unwrap("1.2.840.10045.3.1.7");
Alice Wang000595b2023-10-02 13:46:45 +000027
Alice Wang0271ee02023-11-15 15:03:42 +000028const MESSAGE1: &[u8] = b"test message 1";
29const MESSAGE2: &[u8] = b"test message 2";
30
Alice Wang000595b2023-10-02 13:46:45 +000031#[test]
32fn ec_private_key_serialization() -> Result<()> {
Alice Wang9bd98092023-11-10 14:08:12 +000033 let mut ec_key = EcKey::new_p256()?;
34 ec_key.generate_key()?;
Alice Wang000595b2023-10-02 13:46:45 +000035 let der_encoded_ec_private_key = ec_key.ec_private_key()?;
36 let deserialized_ec_key = EcKey::from_ec_private_key(der_encoded_ec_private_key.as_slice())?;
37
38 assert_eq!(ec_key.cose_public_key()?, deserialized_ec_key.cose_public_key()?);
39 Ok(())
40}
Alice Wang9bd98092023-11-10 14:08:12 +000041
42#[test]
Alice Wang600ea5b2023-11-17 15:12:16 +000043fn subject_public_key_info_serialization() -> Result<()> {
44 let mut ec_key = EcKey::new_p256()?;
45 ec_key.generate_key()?;
Alice Wangeb77f7d2023-12-01 09:13:58 +000046 let pkey: PKey = ec_key.try_into()?;
Alice Wang600ea5b2023-11-17 15:12:16 +000047 let subject_public_key_info = pkey.subject_public_key_info()?;
48
49 let subject_public_key_info = SubjectPublicKeyInfo::from_der(&subject_public_key_info).unwrap();
50 let expected_algorithm = AlgorithmIdentifier {
51 oid: X509_NIST_OID,
52 parameters: Some(AnyRef::from(&ALGO_PARAM_P256_OID)),
53 };
54 assert_eq!(expected_algorithm, subject_public_key_info.algorithm);
55 assert!(!subject_public_key_info.subject_public_key.to_vec().is_empty());
56 Ok(())
57}
58
59#[test]
Alice Wang306c8e22023-11-29 12:40:43 +000060fn p256_cose_public_key_serialization() -> Result<()> {
Alice Wang9bd98092023-11-10 14:08:12 +000061 let mut ec_key = EcKey::new_p256()?;
Alice Wang306c8e22023-11-29 12:40:43 +000062 check_cose_public_key_serialization(&mut ec_key)
63}
64
65#[test]
66fn p384_cose_public_key_serialization() -> Result<()> {
67 let mut ec_key = EcKey::new_p384()?;
68 check_cose_public_key_serialization(&mut ec_key)
69}
70
71fn check_cose_public_key_serialization(ec_key: &mut EcKey) -> Result<()> {
Alice Wang9bd98092023-11-10 14:08:12 +000072 ec_key.generate_key()?;
73 let cose_key = ec_key.cose_public_key()?;
74 let cose_key_data = cose_key.clone().to_vec().unwrap();
75 let deserialized_ec_key = EcKey::from_cose_public_key(&cose_key_data)?;
76
77 assert_eq!(cose_key, deserialized_ec_key.cose_public_key()?);
78 Ok(())
79}
Alice Wang0271ee02023-11-15 15:03:42 +000080
81#[test]
82fn ecdsa_p256_signing_and_verification_succeed() -> Result<()> {
83 let mut ec_key = EcKey::new_p256()?;
84 ec_key.generate_key()?;
85 let digest = sha256(MESSAGE1)?;
86
87 let signature = ec_key.ecdsa_sign(&digest)?;
Alice Wang7468ae42023-11-30 10:20:36 +000088 ec_key.ecdsa_verify(&signature, &digest)?;
89 let pkey: PKey = ec_key.try_into()?;
90 pkey.verify(&signature, MESSAGE1, Some(Digester::sha256()))
Alice Wang0271ee02023-11-15 15:03:42 +000091}
92
93#[test]
94fn verifying_ecdsa_p256_signed_with_a_different_key_fails() -> Result<()> {
95 let mut ec_key1 = EcKey::new_p256()?;
96 ec_key1.generate_key()?;
97 let digest = sha256(MESSAGE1)?;
98 let signature = ec_key1.ecdsa_sign(&digest)?;
99
100 let mut ec_key2 = EcKey::new_p256()?;
101 ec_key2.generate_key()?;
102 let err = ec_key2.ecdsa_verify(&signature, &digest).unwrap_err();
103 let expected_err = Error::CallFailed(ApiName::ECDSA_verify, EcdsaError::BadSignature.into());
104 assert_eq!(expected_err, err);
Alice Wang7468ae42023-11-30 10:20:36 +0000105
106 let pkey: PKey = ec_key2.try_into()?;
107 let err = pkey.verify(&signature, MESSAGE1, Some(Digester::sha256())).unwrap_err();
108 let expected_err =
109 Error::CallFailed(ApiName::EVP_DigestVerify, EcdsaError::BadSignature.into());
110 assert_eq!(expected_err, err);
Alice Wang0271ee02023-11-15 15:03:42 +0000111 Ok(())
112}
113
114#[test]
115fn verifying_ecdsa_p256_signed_with_a_different_message_fails() -> Result<()> {
116 let mut ec_key = EcKey::new_p256()?;
117 ec_key.generate_key()?;
118 let digest1 = sha256(MESSAGE1)?;
119 let signature = ec_key.ecdsa_sign(&digest1)?;
120 let digest2 = sha256(MESSAGE2)?;
121
122 let err = ec_key.ecdsa_verify(&signature, &digest2).unwrap_err();
123 let expected_err = Error::CallFailed(ApiName::ECDSA_verify, EcdsaError::BadSignature.into());
124 assert_eq!(expected_err, err);
125 Ok(())
126}