@@ -18,9 +18,10 @@ use coset::{
18
18
CoseSign1 , CoseSign1Builder , Header , HeaderBuilder , Label , ProtectedHeader ,
19
19
TaggedCborSerializable ,
20
20
} ;
21
+ use serde_bytes:: ByteBuf ;
21
22
22
23
use crate :: {
23
- cose:: { add_sigtst_header, add_sigtst_header_async, CoseError } ,
24
+ cose:: { add_sigtst_header, add_sigtst_header_async, CoseError , TimeStampStorage } ,
24
25
p1363:: { der_to_p1363, parse_ec_der_sig} ,
25
26
raw_signature:: { AsyncRawSigner , RawSigner } ,
26
27
SigningAlg ,
@@ -76,22 +77,60 @@ use crate::{
76
77
#[ async_generic( async_signature(
77
78
signer: & dyn AsyncRawSigner ,
78
79
data: & [ u8 ] ,
79
- box_size: usize
80
+ box_size: usize ,
81
+ tss: TimeStampStorage
80
82
) ) ]
81
- pub fn sign ( signer : & dyn RawSigner , data : & [ u8 ] , box_size : usize ) -> Result < Vec < u8 > , CoseError > {
83
+ pub fn sign (
84
+ signer : & dyn RawSigner ,
85
+ data : & [ u8 ] ,
86
+ box_size : usize ,
87
+ tss : TimeStampStorage ,
88
+ ) -> Result < Vec < u8 > , CoseError > {
89
+ if _sync {
90
+ match tss {
91
+ TimeStampStorage :: V1_sigTst => sign_v1 ( signer, data, box_size, tss) ,
92
+ TimeStampStorage :: V2_sigTst2_CTT => sign_v2 ( signer, data, box_size, tss) ,
93
+ }
94
+ } else {
95
+ match tss {
96
+ TimeStampStorage :: V1_sigTst => sign_v1_async ( signer, data, box_size, tss) . await ,
97
+ TimeStampStorage :: V2_sigTst2_CTT => sign_v2_async ( signer, data, box_size, tss) . await ,
98
+ }
99
+ }
100
+ }
101
+
102
+ #[ async_generic( async_signature(
103
+ signer: & dyn AsyncRawSigner ,
104
+ data: & [ u8 ] ,
105
+ box_size: usize ,
106
+ tss: TimeStampStorage
107
+ ) ) ]
108
+ pub fn sign_v1 (
109
+ signer : & dyn RawSigner ,
110
+ data : & [ u8 ] ,
111
+ box_size : usize ,
112
+ tss : TimeStampStorage ,
113
+ ) -> Result < Vec < u8 > , CoseError > {
82
114
let alg = signer. alg ( ) ;
83
115
84
- let ( protected_header, unprotected_header ) = if _sync {
85
- build_headers ( signer, data , alg) ?
116
+ let protected_header = if _sync {
117
+ build_protected_header ( signer, alg) ?
86
118
} else {
87
- build_headers_async ( signer, data , alg) . await ?
119
+ build_protected_header_async ( signer, alg) . await ?
88
120
} ;
89
121
90
122
// We don't use the additional data header.
91
123
let aad: & [ u8 ; 0 ] = b"" ;
92
124
125
+ // V1: Generate time stamp then sign.
126
+ let unprotected_header = if _sync {
127
+ build_unprotected_header ( signer, data, & protected_header, tss) ?
128
+ } else {
129
+ build_unprotected_header_async ( signer, data, & protected_header, tss) . await ?
130
+ } ;
131
+
93
132
let sign1_builder = CoseSign1Builder :: new ( )
94
- . protected ( protected_header)
133
+ . protected ( protected_header. header . clone ( ) )
95
134
. unprotected ( unprotected_header)
96
135
. payload ( data. to_vec ( ) ) ;
97
136
@@ -130,12 +169,89 @@ pub fn sign(signer: &dyn RawSigner, data: &[u8], box_size: usize) -> Result<Vec<
130
169
pad_cose_sig ( & mut sign1, box_size)
131
170
}
132
171
133
- #[ async_generic( async_signature( signer: & dyn AsyncRawSigner , data: & [ u8 ] , alg: SigningAlg ) ) ]
134
- fn build_headers (
172
+ #[ async_generic( async_signature(
173
+ signer: & dyn AsyncRawSigner ,
174
+ data: & [ u8 ] ,
175
+ box_size: usize ,
176
+ tss: TimeStampStorage
177
+ ) ) ]
178
+ pub fn sign_v2 (
135
179
signer : & dyn RawSigner ,
136
180
data : & [ u8 ] ,
181
+ box_size : usize ,
182
+ tss : TimeStampStorage ,
183
+ ) -> Result < Vec < u8 > , CoseError > {
184
+ let alg = signer. alg ( ) ;
185
+
186
+ let protected_header = if _sync {
187
+ build_protected_header ( signer, alg) ?
188
+ } else {
189
+ build_protected_header_async ( signer, alg) . await ?
190
+ } ;
191
+
192
+ // We don't use the additional data header.
193
+ let aad: & [ u8 ; 0 ] = b"" ;
194
+
195
+ // V2: Sign then generate time stamp.
196
+ let sign1_builder = CoseSign1Builder :: new ( )
197
+ . protected ( protected_header. header . clone ( ) )
198
+ . payload ( data. to_vec ( ) ) ;
199
+
200
+ let mut sign1 = sign1_builder. build ( ) ;
201
+
202
+ let tbs = coset:: sig_structure_data (
203
+ coset:: SignatureContext :: CoseSign1 ,
204
+ sign1. protected . clone ( ) ,
205
+ None ,
206
+ aad,
207
+ sign1. payload . as_ref ( ) . unwrap_or ( & vec ! [ ] ) ,
208
+ ) ;
209
+
210
+ let signature = if _sync {
211
+ signer. sign ( & tbs) ?
212
+ } else {
213
+ signer. sign ( tbs) . await ?
214
+ } ;
215
+
216
+ // Fix up signatures that may be in the wrong format.
217
+ sign1. signature = match alg {
218
+ SigningAlg :: Es256 | SigningAlg :: Es384 | SigningAlg :: Es512 => {
219
+ if parse_ec_der_sig ( & signature) . is_ok ( ) {
220
+ // Fix up DER signature to be in P1363 format.
221
+ der_to_p1363 ( & signature, alg) ?
222
+ } else {
223
+ signature
224
+ }
225
+ }
226
+ _ => signature,
227
+ } ;
228
+
229
+ // The payload is provided elsewhere, so we don't need to repeat it in the
230
+ // `Cose_Sign1` structure.
231
+ sign1. payload = None ;
232
+
233
+ let sig_data = ByteBuf :: from ( sign1. signature . clone ( ) ) ;
234
+ let mut sig_data_cbor: Vec < u8 > = vec ! [ ] ;
235
+ ciborium:: into_writer ( & sig_data, & mut sig_data_cbor)
236
+ . map_err ( |e| CoseError :: CborGenerationError ( e. to_string ( ) ) ) ?;
237
+
238
+ // Fill in the unprotected header with time stamp data.
239
+ let unprotected_header = if _sync {
240
+ build_unprotected_header ( signer, & sig_data_cbor, & protected_header, tss) ?
241
+ } else {
242
+ build_unprotected_header_async ( signer, & sig_data_cbor, & protected_header, tss) . await ?
243
+ } ;
244
+
245
+ sign1. unprotected = unprotected_header;
246
+
247
+ pad_cose_sig ( & mut sign1, box_size)
248
+ }
249
+
250
+ #[ async_generic( async_signature( signer: & dyn AsyncRawSigner , alg: SigningAlg ) ) ]
251
+ fn build_protected_header (
252
+ signer : & dyn RawSigner ,
137
253
alg : SigningAlg ,
138
- ) -> Result < ( Header , Header ) , CoseError > {
254
+ ) -> Result < ProtectedHeader , CoseError > {
139
255
let mut protected_h = match alg {
140
256
SigningAlg :: Ps256 => HeaderBuilder :: new ( ) . algorithm ( iana:: Algorithm :: PS256 ) ,
141
257
SigningAlg :: Ps384 => HeaderBuilder :: new ( ) . algorithm ( iana:: Algorithm :: PS384 ) ,
@@ -146,14 +262,6 @@ fn build_headers(
146
262
SigningAlg :: Ed25519 => HeaderBuilder :: new ( ) . algorithm ( iana:: Algorithm :: EdDSA ) ,
147
263
} ;
148
264
149
- let ocsp_val = if _sync {
150
- signer. ocsp_response ( )
151
- } else {
152
- signer. ocsp_response ( ) . await
153
- } ;
154
-
155
- dbg ! ( & ocsp_val) ;
156
-
157
265
let certs = signer. cert_chain ( ) ?;
158
266
159
267
let sc_der_array_or_bytes = match certs. len ( ) {
@@ -173,15 +281,35 @@ fn build_headers(
173
281
header : protected_header. clone ( ) ,
174
282
} ;
175
283
284
+ Ok ( ph2)
285
+ }
286
+
287
+ #[ async_generic( async_signature( signer: & dyn AsyncRawSigner , data: & [ u8 ] , p_header: & ProtectedHeader , tss: TimeStampStorage , ) ) ]
288
+ fn build_unprotected_header (
289
+ signer : & dyn RawSigner ,
290
+ data : & [ u8 ] ,
291
+ p_header : & ProtectedHeader ,
292
+ tss : TimeStampStorage ,
293
+ ) -> Result < Header , CoseError > {
294
+ // signed_data_from_time_stamp_response
295
+
296
+ // TO DO: Continue with diff here ... (let maybe_cts etc)
297
+
176
298
let unprotected_h = HeaderBuilder :: new ( ) ;
177
299
178
300
let mut unprotected_h = if _sync {
179
- add_sigtst_header ( signer, data, & ph2 , unprotected_h) ?
301
+ add_sigtst_header ( signer, data, p_header , unprotected_h, tss ) ?
180
302
} else {
181
- add_sigtst_header_async ( signer, data, & ph2 , unprotected_h) . await ?
303
+ add_sigtst_header_async ( signer, data, p_header , unprotected_h, tss ) . await ?
182
304
} ;
183
305
184
306
// Set the OCSP responder response if available.
307
+ let ocsp_val = if _sync {
308
+ signer. ocsp_response ( )
309
+ } else {
310
+ signer. ocsp_response ( ) . await
311
+ } ;
312
+
185
313
if let Some ( ocsp) = ocsp_val {
186
314
let mut ocsp_vec: Vec < Value > = Vec :: new ( ) ;
187
315
let mut r_vals: Vec < ( Value , Value ) > = vec ! [ ] ;
@@ -192,8 +320,8 @@ fn build_headers(
192
320
unprotected_h = unprotected_h. text_value ( "rVals" . to_string ( ) , Value :: Map ( r_vals) ) ;
193
321
}
194
322
195
- // Build complete header
196
- Ok ( ( protected_header , unprotected_h. build ( ) ) )
323
+ // Build complete header.
324
+ Ok ( unprotected_h. build ( ) )
197
325
}
198
326
199
327
const PAD : & str = "pad" ;
0 commit comments