blob: 968af635237be6886efaca70c53d12fab9f6a933 [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 Wang600ea5b2023-11-17 15:12:16 +000015use bssl_avf::{sha256, ApiName, EcKey, EcdsaError, Error, EvpPKey, 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()?;
46 let pkey: EvpPKey = ec_key.try_into()?;
47 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 Wang9bd98092023-11-10 14:08:12 +000060fn cose_public_key_serialization() -> Result<()> {
61 let mut ec_key = EcKey::new_p256()?;
62 ec_key.generate_key()?;
63 let cose_key = ec_key.cose_public_key()?;
64 let cose_key_data = cose_key.clone().to_vec().unwrap();
65 let deserialized_ec_key = EcKey::from_cose_public_key(&cose_key_data)?;
66
67 assert_eq!(cose_key, deserialized_ec_key.cose_public_key()?);
68 Ok(())
69}
Alice Wang0271ee02023-11-15 15:03:42 +000070
71#[test]
72fn ecdsa_p256_signing_and_verification_succeed() -> Result<()> {
73 let mut ec_key = EcKey::new_p256()?;
74 ec_key.generate_key()?;
75 let digest = sha256(MESSAGE1)?;
76
77 let signature = ec_key.ecdsa_sign(&digest)?;
78 ec_key.ecdsa_verify(&signature, &digest)
79}
80
81#[test]
82fn verifying_ecdsa_p256_signed_with_a_different_key_fails() -> Result<()> {
83 let mut ec_key1 = EcKey::new_p256()?;
84 ec_key1.generate_key()?;
85 let digest = sha256(MESSAGE1)?;
86 let signature = ec_key1.ecdsa_sign(&digest)?;
87
88 let mut ec_key2 = EcKey::new_p256()?;
89 ec_key2.generate_key()?;
90 let err = ec_key2.ecdsa_verify(&signature, &digest).unwrap_err();
91 let expected_err = Error::CallFailed(ApiName::ECDSA_verify, EcdsaError::BadSignature.into());
92 assert_eq!(expected_err, err);
93 Ok(())
94}
95
96#[test]
97fn verifying_ecdsa_p256_signed_with_a_different_message_fails() -> Result<()> {
98 let mut ec_key = EcKey::new_p256()?;
99 ec_key.generate_key()?;
100 let digest1 = sha256(MESSAGE1)?;
101 let signature = ec_key.ecdsa_sign(&digest1)?;
102 let digest2 = sha256(MESSAGE2)?;
103
104 let err = ec_key.ecdsa_verify(&signature, &digest2).unwrap_err();
105 let expected_err = Error::CallFailed(ApiName::ECDSA_verify, EcdsaError::BadSignature.into());
106 assert_eq!(expected_err, err);
107 Ok(())
108}