@@ -29,7 +29,12 @@ use mbedtls::{
29
29
} ;
30
30
31
31
use super :: CryptoKeyPair ;
32
- use crate :: error:: Error ;
32
+ use crate :: {
33
+ // TODO: We should move ASN1Writer out of Cert,
34
+ // so Crypto doesn't have to depend on Cert
35
+ cert:: { ASN1Writer , CertConsumer } ,
36
+ error:: Error ,
37
+ } ;
33
38
34
39
pub struct HmacSha256 {
35
40
inner : Hmac ,
@@ -183,7 +188,7 @@ impl CryptoKeyPair for KeyPair {
183
188
184
189
// current rust-mbedTLS APIs the signature to be in DER format
185
190
let mut mbedtls_sign = [ 0u8 ; super :: EC_SIGNATURE_LEN_BYTES * 3 ] ;
186
- let len = convert_r_s_to_asn1_sign ( signature, & mut mbedtls_sign) ;
191
+ let len = convert_r_s_to_asn1_sign ( signature, & mut mbedtls_sign) ? ;
187
192
let mbedtls_sign = & mbedtls_sign[ ..len] ;
188
193
189
194
if let Err ( e) = tmp_key. verify ( hash:: Type :: Sha256 , & msg_hash, mbedtls_sign) {
@@ -195,51 +200,16 @@ impl CryptoKeyPair for KeyPair {
195
200
}
196
201
}
197
202
198
- fn convert_r_s_to_asn1_sign ( signature : & [ u8 ] , mbedtls_sign : & mut [ u8 ] ) -> usize {
199
- let mut offset = 0 ;
200
- mbedtls_sign[ offset] = 0x30 ;
201
- offset += 1 ;
202
- let mut len = 68 ;
203
- if ( signature[ 0 ] & 0x80 ) == 0x80 {
204
- len += 1 ;
205
- }
206
- if ( signature[ 32 ] & 0x80 ) == 0x80 {
207
- len += 1 ;
208
- }
209
- mbedtls_sign[ offset] = len;
210
- offset += 1 ;
211
- mbedtls_sign[ offset] = 0x02 ;
212
- offset += 1 ;
213
- if ( signature[ 0 ] & 0x80 ) == 0x80 {
214
- // It seems if topmost bit is 1, there is an extra 0
215
- mbedtls_sign[ offset] = 33 ;
216
- offset += 1 ;
217
- mbedtls_sign[ offset] = 0 ;
218
- offset += 1 ;
219
- } else {
220
- mbedtls_sign[ offset] = 32 ;
221
- offset += 1 ;
222
- }
223
- mbedtls_sign[ offset..( offset + 32 ) ] . copy_from_slice ( & signature[ ..32 ] ) ;
224
- offset += 32 ;
225
-
226
- mbedtls_sign[ offset] = 0x02 ;
227
- offset += 1 ;
228
- if ( signature[ 32 ] & 0x80 ) == 0x80 {
229
- // It seems if topmost bit is 1, there is an extra 0
230
- mbedtls_sign[ offset] = 33 ;
231
- offset += 1 ;
232
- mbedtls_sign[ offset] = 0 ;
233
- offset += 1 ;
234
- } else {
235
- mbedtls_sign[ offset] = 32 ;
236
- offset += 1 ;
237
- }
238
-
239
- mbedtls_sign[ offset..( offset + 32 ) ] . copy_from_slice ( & signature[ 32 ..64 ] ) ;
240
- offset += 32 ;
203
+ fn convert_r_s_to_asn1_sign ( signature : & [ u8 ] , mbedtls_sign : & mut [ u8 ] ) -> Result < usize , Error > {
204
+ let r = & signature[ 0 ..32 ] ;
205
+ let s = & signature[ 32 ..64 ] ;
241
206
242
- offset
207
+ let mut wr = ASN1Writer :: new ( mbedtls_sign) ;
208
+ wr. start_seq ( "" ) ?;
209
+ wr. integer ( "r" , r) ?;
210
+ wr. integer ( "s" , s) ?;
211
+ wr. end_seq ( ) ?;
212
+ Ok ( wr. as_slice ( ) . len ( ) )
243
213
}
244
214
245
215
// mbedTLS sign() function directly encodes the signature in ASN1. The lower level function
0 commit comments