@@ -7,8 +7,10 @@ use crate::common::USER_PIN;
7
7
use common:: init_pins;
8
8
use cryptoki:: { mechanism:: Mechanism , object:: Attribute , session:: UserType , types:: AuthPin } ;
9
9
use cryptoki_rustcrypto:: rsa:: { pkcs1v15, pss} ;
10
+ use rand:: { thread_rng, RngCore } ;
10
11
use serial_test:: serial;
11
- use signature:: { Keypair , Signer , Verifier } ;
12
+ use sha2:: { Digest , Sha256 } ;
13
+ use signature:: { hazmat:: PrehashSigner , Keypair , Signer , Verifier } ;
12
14
use testresult:: TestResult ;
13
15
14
16
#[ test]
@@ -49,8 +51,7 @@ fn pkcs1v15_sign_verify() -> TestResult {
49
51
// data to sign
50
52
let data = [ 0xFF , 0x55 , 0xDD ] ;
51
53
52
- let signer =
53
- pkcs1v15:: Signer :: < sha2:: Sha256 , _ > :: new ( & session, label) . expect ( "Lookup keys from HSM" ) ;
54
+ let signer = pkcs1v15:: Signer :: < Sha256 , _ > :: new ( & session, label) . expect ( "Lookup keys from HSM" ) ;
54
55
55
56
let signature = signer. sign ( & data) ;
56
57
@@ -102,8 +103,7 @@ fn pss_sign_verify() -> TestResult {
102
103
// data to sign
103
104
let data = [ 0xFF , 0x55 , 0xDD ] ;
104
105
105
- let signer =
106
- pss:: Signer :: < sha2:: Sha256 , _ > :: new ( & session, label) . expect ( "Lookup keys from HSM" ) ;
106
+ let signer = pss:: Signer :: < Sha256 , _ > :: new ( & session, label) . expect ( "Lookup keys from HSM" ) ;
107
107
108
108
let signature = signer. sign ( & data) ;
109
109
@@ -116,3 +116,60 @@ fn pss_sign_verify() -> TestResult {
116
116
117
117
Ok ( ( ) )
118
118
}
119
+
120
+ #[ test]
121
+ #[ serial]
122
+ fn pkcs1v15_sign_verify_prehashed ( ) -> TestResult {
123
+ let ( pkcs11, slot) = init_pins ( ) ;
124
+
125
+ // open a session
126
+ let session = pkcs11. open_rw_session ( slot) ?;
127
+
128
+ // log in the session
129
+ session. login ( UserType :: User , Some ( & AuthPin :: new ( USER_PIN . into ( ) ) ) ) ?;
130
+
131
+ // get mechanism
132
+ let mechanism = Mechanism :: RsaPkcsKeyPairGen ;
133
+
134
+ let public_exponent: Vec < u8 > = vec ! [ 0x01 , 0x00 , 0x01 ] ;
135
+ let modulus_bits = 1024 ;
136
+
137
+ let label = b"demo-signer" ;
138
+
139
+ // pub key template
140
+ let pub_key_template = vec ! [
141
+ Attribute :: Token ( true ) ,
142
+ Attribute :: Private ( false ) ,
143
+ Attribute :: Label ( label. to_vec( ) ) ,
144
+ Attribute :: PublicExponent ( public_exponent) ,
145
+ Attribute :: ModulusBits ( modulus_bits. into( ) ) ,
146
+ ] ;
147
+
148
+ // priv key template
149
+ let priv_key_template = vec ! [ Attribute :: Token ( true ) , Attribute :: Label ( label. to_vec( ) ) ] ;
150
+
151
+ // generate a key pair
152
+ let ( public, private) =
153
+ session. generate_key_pair ( & mechanism, & pub_key_template, & priv_key_template) ?;
154
+
155
+ // data to sign
156
+ let mut data = [ 0u8 ; 7123 ] ;
157
+ thread_rng ( ) . fill_bytes ( & mut data[ ..] ) ;
158
+
159
+ let prehashed = Sha256 :: digest ( & data[ ..] ) ;
160
+
161
+ let signer = pkcs1v15:: Signer :: < Sha256 , _ > :: new ( & session, label) . expect ( "Lookup keys from HSM" ) ;
162
+
163
+ let signature1 = signer. sign ( & data) ;
164
+ let signature2 = signer. sign_prehash ( & prehashed) . expect ( "Sign prehash" ) ;
165
+
166
+ let verifying_key = signer. verifying_key ( ) ;
167
+ verifying_key. verify ( & data, & signature1) ?;
168
+ verifying_key. verify ( & data, & signature2) ?;
169
+
170
+ // delete keys
171
+ session. destroy_object ( public) ?;
172
+ session. destroy_object ( private) ?;
173
+
174
+ Ok ( ( ) )
175
+ }
0 commit comments