@@ -5,9 +5,15 @@ mod common;
55
66use crate :: common:: USER_PIN ;
77use common:: init_pins;
8- use cryptoki:: { mechanism:: Mechanism , object:: Attribute , session:: UserType , types:: AuthPin } ;
9- use cryptoki_rustcrypto:: rsa:: pss;
10- use der:: { pem:: LineEnding , EncodePem } ;
8+ use cryptoki:: {
9+ mechanism:: Mechanism ,
10+ object:: { Attribute , KeyType } ,
11+ session:: UserType ,
12+ types:: AuthPin ,
13+ } ;
14+ use cryptoki_rustcrypto:: { ecdsa, rsa:: pss} ;
15+ use der:: { pem:: LineEnding , Encode , EncodePem } ;
16+ use p256:: pkcs8:: AssociatedOid ;
1117use serial_test:: serial;
1218use signature:: Keypair ;
1319use spki:: SubjectPublicKeyInfoOwned ;
@@ -80,3 +86,69 @@ fn pss_create_ca() -> TestResult {
8086
8187 Ok ( ( ) )
8288}
89+
90+ #[ test]
91+ #[ serial]
92+ fn ecdsa_create_ca ( ) -> TestResult {
93+ let ( pkcs11, slot) = init_pins ( ) ;
94+
95+ // open a session
96+ let session = pkcs11. open_rw_session ( slot) ?;
97+
98+ // log in the session
99+ session. login ( UserType :: User , Some ( & AuthPin :: new ( USER_PIN . into ( ) ) ) ) ?;
100+
101+ // get mechanism
102+ let mechanism = Mechanism :: EccKeyPairGen ;
103+
104+ let secp256r1_oid: Vec < u8 > = p256:: NistP256 :: OID . to_der ( ) . unwrap ( ) ;
105+
106+ let label = b"demo-signer" ;
107+
108+ // pub key template
109+ let pub_key_template = vec ! [
110+ Attribute :: Token ( true ) ,
111+ Attribute :: Private ( false ) ,
112+ Attribute :: KeyType ( KeyType :: EC ) ,
113+ Attribute :: Verify ( true ) ,
114+ Attribute :: EcParams ( secp256r1_oid. clone( ) ) ,
115+ Attribute :: Label ( label. to_vec( ) ) ,
116+ ] ;
117+
118+ // priv key template
119+ let priv_key_template = vec ! [
120+ Attribute :: Token ( true ) ,
121+ Attribute :: Private ( true ) ,
122+ Attribute :: Sign ( true ) ,
123+ Attribute :: Label ( label. to_vec( ) ) ,
124+ ] ;
125+
126+ // generate a key pair
127+ let ( public, private) =
128+ session. generate_key_pair ( & mechanism, & pub_key_template, & priv_key_template) ?;
129+
130+ let signer =
131+ ecdsa:: Signer :: < p256:: NistP256 , _ > :: new ( & session, label) . expect ( "Lookup keys from HSM" ) ;
132+
133+ let serial_number = SerialNumber :: from ( 42u32 ) ;
134+ let validity = Validity :: from_now ( Duration :: new ( 5 , 0 ) ) . unwrap ( ) ;
135+ let profile = Profile :: Root ;
136+ let subject =
137+ Name :: from_str ( "CN=World domination corporation,O=World domination Inc,C=US" ) . unwrap ( ) ;
138+ let pub_key = SubjectPublicKeyInfoOwned :: from_key ( signer. verifying_key ( ) ) . unwrap ( ) ;
139+
140+ let builder =
141+ CertificateBuilder :: new ( profile, serial_number, validity, subject, pub_key, & signer)
142+ . expect ( "Create certificate" ) ;
143+
144+ let certificate = builder. build :: < p256:: ecdsa:: DerSignature > ( ) . unwrap ( ) ;
145+
146+ let pem = certificate. to_pem ( LineEnding :: LF ) . expect ( "generate pem" ) ;
147+ println ! ( "{}" , pem) ;
148+
149+ // delete keys
150+ session. destroy_object ( public) ?;
151+ session. destroy_object ( private) ?;
152+
153+ Ok ( ( ) )
154+ }
0 commit comments