/rust/registry/src/index.crates.io-1949cf8c6b5b557f/aws-lc-rs-1.12.4/src/pq.rs
Line | Count | Source |
1 | | // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. |
2 | | // SPDX-License-Identifier: Apache-2.0 OR ISC |
3 | | #![allow(unused)] |
4 | | |
5 | | use crate::aws_lc::{ |
6 | | d2i_PrivateKey, CBB_init, EVP_PKEY_CTX_new_id, EVP_PKEY_CTX_pqdsa_set_params, |
7 | | EVP_PKEY_get_raw_private_key, EVP_PKEY_get_raw_public_key, EVP_PKEY_new, |
8 | | EVP_PKEY_pqdsa_new_raw_private_key, EVP_PKEY_pqdsa_new_raw_public_key, EVP_marshal_private_key, |
9 | | EVP_marshal_public_key, EVP_parse_public_key, CBB, EVP_PKEY, EVP_PKEY_PQDSA, |
10 | | }; |
11 | | use crate::cbb::LcCBB; |
12 | | use crate::cbs::build_CBS; |
13 | | use crate::digest; |
14 | | use crate::digest::digest_ctx::DigestContext; |
15 | | use crate::error::{KeyRejected, Unspecified}; |
16 | | use crate::evp_pkey::*; |
17 | | use crate::fips::indicator_check; |
18 | | use crate::ptr::LcPtr; |
19 | | use crate::signature::MAX_LEN; |
20 | | use std::os::raw::c_int; |
21 | | use std::ptr::null_mut; |
22 | | |
23 | 0 | pub(crate) fn evp_key_pqdsa_generate(nid: c_int) -> Result<LcPtr<EVP_PKEY>, Unspecified> { |
24 | 0 | let params_fn = |ctx| { |
25 | 0 | if 1 == unsafe { EVP_PKEY_CTX_pqdsa_set_params(ctx, nid) } { |
26 | 0 | Ok(()) |
27 | | } else { |
28 | 0 | Err(()) |
29 | | } |
30 | 0 | }; |
31 | 0 | LcPtr::<EVP_PKEY>::generate(EVP_PKEY_PQDSA, Some(params_fn)) |
32 | 0 | } |
33 | | |
34 | | #[cfg(test)] |
35 | | mod tests { |
36 | | use crate::aws_lc::{ |
37 | | EVP_PKEY_cmp, EVP_PKEY, EVP_PKEY_PQDSA, NID_MLDSA44, NID_MLDSA65, NID_MLDSA87, |
38 | | }; |
39 | | use crate::digest; |
40 | | use crate::evp_pkey::*; |
41 | | use crate::hmac::sign; |
42 | | use crate::pkcs8::Version; |
43 | | use crate::pq::evp_key_pqdsa_generate; |
44 | | use crate::ptr::LcPtr; |
45 | | use std::ffi::c_int; |
46 | | |
47 | | #[test] |
48 | | fn test_keygen() { |
49 | | for nid in [NID_MLDSA44, NID_MLDSA65, NID_MLDSA87] { |
50 | | let key = evp_key_pqdsa_generate(nid).unwrap(); |
51 | | println!("key size: {:?}", key.key_size_bytes()); |
52 | | test_serialization_for(&key); |
53 | | test_signing_for(&key); |
54 | | } |
55 | | } |
56 | | |
57 | | fn test_serialization_for(evp_pkey: &LcPtr<EVP_PKEY>) { |
58 | | let public_buffer = evp_pkey.marshal_rfc5280_public_key().unwrap(); |
59 | | println!("public marshall: {public_buffer:?}"); |
60 | | let key_public = |
61 | | LcPtr::<EVP_PKEY>::parse_rfc5280_public_key(&public_buffer, EVP_PKEY_PQDSA).unwrap(); |
62 | | |
63 | | let private_buffer = evp_pkey.marshal_rfc5208_private_key(Version::V1).unwrap(); |
64 | | println!("private marshall: {private_buffer:?}"); |
65 | | let key_private = |
66 | | LcPtr::<EVP_PKEY>::parse_rfc5208_private_key(&private_buffer, EVP_PKEY_PQDSA).unwrap(); |
67 | | |
68 | | let raw_public_buffer = key_public.marshal_raw_public_key().unwrap(); |
69 | | println!("raw public size: {}", raw_public_buffer.len()); |
70 | | let key_public2 = |
71 | | LcPtr::<EVP_PKEY>::parse_raw_public_key(&raw_public_buffer, EVP_PKEY_PQDSA).unwrap(); |
72 | | |
73 | | assert_eq!(1, unsafe { |
74 | | EVP_PKEY_cmp(*key_public.as_const(), *key_public2.as_const()) |
75 | | }); |
76 | | |
77 | | let raw_private_buffer = key_private.marshal_raw_private_key().unwrap(); |
78 | | println!("raw private size: {}", raw_private_buffer.len()); |
79 | | let key_private2 = |
80 | | LcPtr::<EVP_PKEY>::parse_raw_private_key(&raw_private_buffer, EVP_PKEY_PQDSA).unwrap(); |
81 | | |
82 | | // TODO: Currently the public key is not populated |
83 | | // assert_eq!(1, unsafe { |
84 | | // EVP_PKEY_cmp(*key_private.as_const(), *key_private2.as_const()) |
85 | | // }); |
86 | | } |
87 | | |
88 | | fn test_signing_for(evp_pkey: &LcPtr<EVP_PKEY>) { |
89 | | let message = b"hello world"; |
90 | | let signature = evp_pkey |
91 | | .sign(message, None, No_EVP_PKEY_CTX_consumer) |
92 | | .unwrap(); |
93 | | println!("signature size: {}", signature.len()); |
94 | | assert_eq!(signature.len(), evp_pkey.signature_size_bytes()); |
95 | | evp_pkey |
96 | | .verify(message, None, No_EVP_PKEY_CTX_consumer, &signature) |
97 | | .unwrap(); |
98 | | println!("verified: {signature:?}"); |
99 | | } |
100 | | } |