blob: 3dd243c116311ac87578f1071c432cae7886bd65 [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 Wang0271ee02023-11-15 15:03:42 +000015use bssl_avf::{sha256, ApiName, EcKey, EcdsaError, Error, Result};
Alice Wang9bd98092023-11-10 14:08:12 +000016use coset::CborSerializable;
Alice Wang000595b2023-10-02 13:46:45 +000017
Alice Wang0271ee02023-11-15 15:03:42 +000018const MESSAGE1: &[u8] = b"test message 1";
19const MESSAGE2: &[u8] = b"test message 2";
20
Alice Wang000595b2023-10-02 13:46:45 +000021#[test]
22fn ec_private_key_serialization() -> Result<()> {
Alice Wang9bd98092023-11-10 14:08:12 +000023 let mut ec_key = EcKey::new_p256()?;
24 ec_key.generate_key()?;
Alice Wang000595b2023-10-02 13:46:45 +000025 let der_encoded_ec_private_key = ec_key.ec_private_key()?;
26 let deserialized_ec_key = EcKey::from_ec_private_key(der_encoded_ec_private_key.as_slice())?;
27
28 assert_eq!(ec_key.cose_public_key()?, deserialized_ec_key.cose_public_key()?);
29 Ok(())
30}
Alice Wang9bd98092023-11-10 14:08:12 +000031
32#[test]
33fn cose_public_key_serialization() -> Result<()> {
34 let mut ec_key = EcKey::new_p256()?;
35 ec_key.generate_key()?;
36 let cose_key = ec_key.cose_public_key()?;
37 let cose_key_data = cose_key.clone().to_vec().unwrap();
38 let deserialized_ec_key = EcKey::from_cose_public_key(&cose_key_data)?;
39
40 assert_eq!(cose_key, deserialized_ec_key.cose_public_key()?);
41 Ok(())
42}
Alice Wang0271ee02023-11-15 15:03:42 +000043
44#[test]
45fn ecdsa_p256_signing_and_verification_succeed() -> Result<()> {
46 let mut ec_key = EcKey::new_p256()?;
47 ec_key.generate_key()?;
48 let digest = sha256(MESSAGE1)?;
49
50 let signature = ec_key.ecdsa_sign(&digest)?;
51 ec_key.ecdsa_verify(&signature, &digest)
52}
53
54#[test]
55fn verifying_ecdsa_p256_signed_with_a_different_key_fails() -> Result<()> {
56 let mut ec_key1 = EcKey::new_p256()?;
57 ec_key1.generate_key()?;
58 let digest = sha256(MESSAGE1)?;
59 let signature = ec_key1.ecdsa_sign(&digest)?;
60
61 let mut ec_key2 = EcKey::new_p256()?;
62 ec_key2.generate_key()?;
63 let err = ec_key2.ecdsa_verify(&signature, &digest).unwrap_err();
64 let expected_err = Error::CallFailed(ApiName::ECDSA_verify, EcdsaError::BadSignature.into());
65 assert_eq!(expected_err, err);
66 Ok(())
67}
68
69#[test]
70fn verifying_ecdsa_p256_signed_with_a_different_message_fails() -> Result<()> {
71 let mut ec_key = EcKey::new_p256()?;
72 ec_key.generate_key()?;
73 let digest1 = sha256(MESSAGE1)?;
74 let signature = ec_key.ecdsa_sign(&digest1)?;
75 let digest2 = sha256(MESSAGE2)?;
76
77 let err = ec_key.ecdsa_verify(&signature, &digest2).unwrap_err();
78 let expected_err = Error::CallFailed(ApiName::ECDSA_verify, EcdsaError::BadSignature.into());
79 assert_eq!(expected_err, err);
80 Ok(())
81}