xref: /OK3568_Linux_fs/external/security/librkcrypto/test/c_mode/ecdsa.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 /*
2  *  Elliptic curve DSA
3  *
4  *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
5  *  SPDX-License-Identifier: Apache-2.0
6  *
7  *  Licensed under the Apache License, Version 2.0 (the "License"); you may
8  *  not use this file except in compliance with the License.
9  *  You may obtain a copy of the License at
10  *
11  *  http://www.apache.org/licenses/LICENSE-2.0
12  *
13  *  Unless required by applicable law or agreed to in writing, software
14  *  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
15  *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  *  See the License for the specific language governing permissions and
17  *  limitations under the License.
18  *
19  *  This file is part of mbed TLS (https://tls.mbed.org)
20  */
21 
22 /*
23  * References:
24  *
25  * SEC1 http://www.secg.org/index.php?action=secg,docs_secg
26  */
27 
28 #define MBEDTLS_ECDSA_C
29 #if defined(MBEDTLS_ECDSA_C)
30 #include <stdlib.h>
31 #include <stdio.h>
32 #include <time.h>
33 #include "ecdsa.h"
34 #include "asn1write.h"
35 
36 #include <string.h>
37 
38 #if defined(MBEDTLS_ECDSA_DETERMINISTIC)
39 #include "mbedtls/hmac_drbg.h"
40 #endif
41 
42 #define DEBUG(format,...) printf("[%s]:%d: "format"\n", __func__,__LINE__, ##__VA_ARGS__)
43 
44 /*
45  * Derive a suitable integer for group grp from a buffer of length len
46  * SEC1 4.1.3 step 5 aka SEC1 4.1.4 step 3
47  */
derive_mpi(const mbedtls_ecp_group * grp,mbedtls_mpi * x,const unsigned char * buf,size_t blen)48 static int derive_mpi( const mbedtls_ecp_group *grp, mbedtls_mpi *x,
49                        const unsigned char *buf, size_t blen )
50 {
51     int ret;
52     size_t n_size = ( grp->nbits + 7 ) / 8;
53     size_t use_size = blen > n_size ? n_size : blen;
54 
55     MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( x, buf, use_size ) );
56     if( use_size * 8 > grp->nbits )
57         MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( x, use_size * 8 - grp->nbits ) );
58 
59     /* While at it, reduce modulo N */
60     if( mbedtls_mpi_cmp_mpi( x, &grp->N ) >= 0 )
61         MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( x, x, &grp->N ) );
62 
63 cleanup:
64     return( ret );
65 }
66 
67 /*
68  * Compute ECDSA signature of a hashed message (SEC1 4.1.3)
69  * Obviously, compared to SEC1 4.1.3, we skip step 4 (hash message)
70  */
mbedtls_ecdsa_sign(mbedtls_ecp_group * grp,mbedtls_mpi * r,mbedtls_mpi * s,const mbedtls_mpi * d,const unsigned char * buf,size_t blen,int (* f_rng)(void *,unsigned char *,size_t),void * p_rng)71 int mbedtls_ecdsa_sign( mbedtls_ecp_group *grp, mbedtls_mpi *r, mbedtls_mpi *s,
72                 const mbedtls_mpi *d, const unsigned char *buf, size_t blen,
73                 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )
74 {
75     int ret, key_tries, sign_tries, blind_tries;
76     mbedtls_ecp_point R;
77     mbedtls_mpi k, e, t;
78 
79     /* Fail cleanly on curves such as Curve25519 that can't be used for ECDSA */
80     if( grp->N.p == NULL )
81         return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );
82 
83     mbedtls_ecp_point_init( &R );
84     mbedtls_mpi_init( &k ); mbedtls_mpi_init( &e ); mbedtls_mpi_init( &t );
85 
86     sign_tries = 0;
87     do
88     {
89         /*
90          * Steps 1-3: generate a suitable ephemeral keypair
91          * and set r = xR mod n
92          */
93         key_tries = 0;
94         do
95         {
96             MBEDTLS_MPI_CHK( mbedtls_ecp_gen_keypair( grp, &k, &R, f_rng, p_rng ) );
97             MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( r, &R.X, &grp->N ) );
98 
99             if( key_tries++ > 10 )
100             {
101                 ret = MBEDTLS_ERR_ECP_RANDOM_FAILED;
102                 goto cleanup;
103             }
104         }
105         while( mbedtls_mpi_cmp_int( r, 0 ) == 0 );
106 
107         /*
108          * Step 5: derive MPI from hashed message
109          */
110         MBEDTLS_MPI_CHK( derive_mpi( grp, &e, buf, blen ) );
111 
112         /*
113          * Generate a random value to blind inv_mod in next step,
114          * avoiding a potential timing leak.
115          */
116         blind_tries = 0;
117         do
118         {
119             size_t n_size = ( grp->nbits + 7 ) / 8;
120             MBEDTLS_MPI_CHK( mbedtls_mpi_fill_random( &t, n_size, f_rng, p_rng ) );
121             MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &t, 8 * n_size - grp->nbits ) );
122 
123             /* See mbedtls_ecp_gen_keypair() */
124             if( ++blind_tries > 30 )
125                 return( MBEDTLS_ERR_ECP_RANDOM_FAILED );
126         }
127         while( mbedtls_mpi_cmp_int( &t, 1 ) < 0 ||
128                mbedtls_mpi_cmp_mpi( &t, &grp->N ) >= 0 );
129 
130         /*
131          * Step 6: compute s = (e + r * d) / k = t (e + rd) / (kt) mod n
132          */
133         MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( s, r, d ) );
134         MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &e, &e, s ) );
135         MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &e, &e, &t ) );
136         MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &k, &k, &t ) );
137         MBEDTLS_MPI_CHK( mbedtls_mpi_inv_mod( s, &k, &grp->N ) );
138         MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( s, s, &e ) );
139         MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( s, s, &grp->N ) );
140 
141         if( sign_tries++ > 10 )
142         {
143             ret = MBEDTLS_ERR_ECP_RANDOM_FAILED;
144             goto cleanup;
145         }
146     }
147     while( mbedtls_mpi_cmp_int( s, 0 ) == 0 );
148 
149 cleanup:
150     mbedtls_ecp_point_free( &R );
151     mbedtls_mpi_free( &k ); mbedtls_mpi_free( &e ); mbedtls_mpi_free( &t );
152 
153     return( ret );
154 }
155 
156 #if defined(MBEDTLS_ECDSA_DETERMINISTIC)
157 /*
158  * Deterministic signature wrapper
159  */
mbedtls_ecdsa_sign_det(mbedtls_ecp_group * grp,mbedtls_mpi * r,mbedtls_mpi * s,const mbedtls_mpi * d,const unsigned char * buf,size_t blen,mbedtls_md_type_t md_alg)160 int mbedtls_ecdsa_sign_det( mbedtls_ecp_group *grp, mbedtls_mpi *r, mbedtls_mpi *s,
161                     const mbedtls_mpi *d, const unsigned char *buf, size_t blen,
162                     mbedtls_md_type_t md_alg )
163 {
164     int ret;
165     mbedtls_hmac_drbg_context rng_ctx;
166     unsigned char data[2 * MBEDTLS_ECP_MAX_BYTES];
167     size_t grp_len = ( grp->nbits + 7 ) / 8;
168     const mbedtls_md_info_t *md_info;
169     mbedtls_mpi h;
170 
171     if( ( md_info = mbedtls_md_info_from_type( md_alg ) ) == NULL )
172         return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );
173 
174     mbedtls_mpi_init( &h );
175     mbedtls_hmac_drbg_init( &rng_ctx );
176 
177     /* Use private key and message hash (reduced) to initialize HMAC_DRBG */
178     MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( d, data, grp_len ) );
179     MBEDTLS_MPI_CHK( derive_mpi( grp, &h, buf, blen ) );
180     MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( &h, data + grp_len, grp_len ) );
181     mbedtls_hmac_drbg_seed_buf( &rng_ctx, md_info, data, 2 * grp_len );
182 
183     ret = mbedtls_ecdsa_sign( grp, r, s, d, buf, blen,
184                       mbedtls_hmac_drbg_random, &rng_ctx );
185 
186 cleanup:
187     mbedtls_hmac_drbg_free( &rng_ctx );
188     mbedtls_mpi_free( &h );
189 
190     return( ret );
191 }
192 #endif /* MBEDTLS_ECDSA_DETERMINISTIC */
193 
194 /*
195  * Verify ECDSA signature of hashed message (SEC1 4.1.4)
196  * Obviously, compared to SEC1 4.1.3, we skip step 2 (hash message)
197  */
mbedtls_ecdsa_verify(mbedtls_ecp_group * grp,const unsigned char * buf,size_t blen,const mbedtls_ecp_point * Q,const mbedtls_mpi * r,const mbedtls_mpi * s)198 int mbedtls_ecdsa_verify( mbedtls_ecp_group *grp,
199                   const unsigned char *buf, size_t blen,
200                   const mbedtls_ecp_point *Q, const mbedtls_mpi *r, const mbedtls_mpi *s)
201 {
202     int ret;
203     mbedtls_mpi e, s_inv, u1, u2;
204     mbedtls_ecp_point R;
205 
206     mbedtls_ecp_point_init( &R );
207     mbedtls_mpi_init( &e ); mbedtls_mpi_init( &s_inv ); mbedtls_mpi_init( &u1 ); mbedtls_mpi_init( &u2 );
208 
209     /* Fail cleanly on curves such as Curve25519 that can't be used for ECDSA */
210     if( grp->N.p == NULL )
211         return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );
212 
213     /*
214      * Step 1: make sure r and s are in range 1..n-1
215      */
216     if( mbedtls_mpi_cmp_int( r, 1 ) < 0 || mbedtls_mpi_cmp_mpi( r, &grp->N ) >= 0 ||
217         mbedtls_mpi_cmp_int( s, 1 ) < 0 || mbedtls_mpi_cmp_mpi( s, &grp->N ) >= 0 )
218     {
219         ret = MBEDTLS_ERR_ECP_VERIFY_FAILED;
220         goto cleanup;
221     }
222 
223     /*
224      * Additional precaution: make sure Q is valid
225      */
226     MBEDTLS_MPI_CHK( mbedtls_ecp_check_pubkey( grp, Q ) );
227 
228     /*
229      * Step 3: derive MPI from hashed message
230      */
231     MBEDTLS_MPI_CHK( derive_mpi( grp, &e, buf, blen ) );
232 
233     /*
234      * Step 4: u1 = e / s mod n, u2 = r / s mod n
235      */
236     MBEDTLS_MPI_CHK( mbedtls_mpi_inv_mod( &s_inv, s, &grp->N ) );
237 
238     MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &u1, &e, &s_inv ) );
239     MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &u1, &u1, &grp->N ) );
240 
241     MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &u2, r, &s_inv ) );
242     MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &u2, &u2, &grp->N ) );
243 
244     /*
245      * Step 5: R = u1 G + u2 Q
246      *
247      * Since we're not using any secret data, no need to pass a RNG to
248      * mbedtls_ecp_mul() for countermesures.
249      */
250     MBEDTLS_MPI_CHK( mbedtls_ecp_muladd( grp, &R, &u1, &grp->G, &u2, Q ) );
251 
252     if( mbedtls_ecp_is_zero( &R ) )
253     {
254         ret = MBEDTLS_ERR_ECP_VERIFY_FAILED;
255         goto cleanup;
256     }
257 
258     /*
259      * Step 6: convert xR to an integer (no-op)
260      * Step 7: reduce xR mod n (gives v)
261      */
262     MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &R.X, &R.X, &grp->N ) );
263 
264     /*
265      * Step 8: check if v (that is, R.X) is equal to r
266      */
267     if( mbedtls_mpi_cmp_mpi( &R.X, r ) != 0 )
268     {
269         ret = MBEDTLS_ERR_ECP_VERIFY_FAILED;
270         goto cleanup;
271     }
272 
273 cleanup:
274     mbedtls_ecp_point_free( &R );
275     mbedtls_mpi_free( &e ); mbedtls_mpi_free( &s_inv ); mbedtls_mpi_free( &u1 ); mbedtls_mpi_free( &u2 );
276 
277     return( ret );
278 }
279 
280 /*
281  * Convert a signature (given by context) to ASN.1
282  */
ecdsa_signature_to_asn1(const mbedtls_mpi * r,const mbedtls_mpi * s,unsigned char * sig,size_t * slen)283 static int ecdsa_signature_to_asn1( const mbedtls_mpi *r, const mbedtls_mpi *s,
284                                     unsigned char *sig, size_t *slen )
285 {
286     int ret;
287     unsigned char buf[MBEDTLS_ECDSA_MAX_LEN];
288     unsigned char *p = buf + sizeof( buf );
289     size_t len = 0;
290 
291     MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_mpi( &p, buf, s ) );
292     MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_mpi( &p, buf, r ) );
293 
294     MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &p, buf, len ) );
295     MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &p, buf,
296                                        MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) );
297 
298     memcpy( sig, p, len );
299     *slen = len;
300 
301     return( 0 );
302 }
303 
304 /*
305  * Compute and write signature
306  */
mbedtls_ecdsa_write_signature(mbedtls_ecdsa_context * ctx,mbedtls_md_type_t md_alg,const unsigned char * hash,size_t hlen,unsigned char * sig,size_t * slen,int (* f_rng)(void *,unsigned char *,size_t),void * p_rng)307 int mbedtls_ecdsa_write_signature( mbedtls_ecdsa_context *ctx, mbedtls_md_type_t md_alg,
308                            const unsigned char *hash, size_t hlen,
309                            unsigned char *sig, size_t *slen,
310                            int (*f_rng)(void *, unsigned char *, size_t),
311                            void *p_rng )
312 {
313     int ret;
314     mbedtls_mpi r, s;
315 
316     mbedtls_mpi_init( &r );
317     mbedtls_mpi_init( &s );
318 
319 #if defined(MBEDTLS_ECDSA_DETERMINISTIC)
320     (void) f_rng;
321     (void) p_rng;
322 
323     MBEDTLS_MPI_CHK( mbedtls_ecdsa_sign_det( &ctx->grp, &r, &s, &ctx->d,
324                              hash, hlen, md_alg ) );
325 #else
326     (void) md_alg;
327 
328     MBEDTLS_MPI_CHK( mbedtls_ecdsa_sign( &ctx->grp, &r, &s, &ctx->d,
329                          hash, hlen, f_rng, p_rng ) );
330 #endif
331 
332     MBEDTLS_MPI_CHK( ecdsa_signature_to_asn1( &r, &s, sig, slen ) );
333 
334 cleanup:
335     mbedtls_mpi_free( &r );
336     mbedtls_mpi_free( &s );
337 
338     return( ret );
339 }
340 
341 #if ! defined(MBEDTLS_DEPRECATED_REMOVED) && \
342     defined(MBEDTLS_ECDSA_DETERMINISTIC)
mbedtls_ecdsa_write_signature_det(mbedtls_ecdsa_context * ctx,const unsigned char * hash,size_t hlen,unsigned char * sig,size_t * slen,mbedtls_md_type_t md_alg)343 int mbedtls_ecdsa_write_signature_det( mbedtls_ecdsa_context *ctx,
344                                const unsigned char *hash, size_t hlen,
345                                unsigned char *sig, size_t *slen,
346                                mbedtls_md_type_t md_alg )
347 {
348     return( mbedtls_ecdsa_write_signature( ctx, md_alg, hash, hlen, sig, slen,
349                                    NULL, NULL ) );
350 }
351 #endif
352 
353 /*
354  * Read and check signature
355  */
mbedtls_ecdsa_read_signature(mbedtls_ecdsa_context * ctx,const unsigned char * hash,size_t hlen,const unsigned char * sig,size_t slen)356 int mbedtls_ecdsa_read_signature( mbedtls_ecdsa_context *ctx,
357                           const unsigned char *hash, size_t hlen,
358                           const unsigned char *sig, size_t slen )
359 {
360     int ret;
361     unsigned char *p = (unsigned char *) sig;
362     const unsigned char *end = sig + slen;
363     size_t len;
364     mbedtls_mpi r, s;
365 
366     mbedtls_mpi_init( &r );
367     mbedtls_mpi_init( &s );
368 
369     if( ( ret = mbedtls_asn1_get_tag( &p, end, &len,
370                     MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )
371     {
372         ret += MBEDTLS_ERR_ECP_BAD_INPUT_DATA;
373         goto cleanup;
374     }
375 
376     if( p + len != end )
377     {
378         ret = MBEDTLS_ERR_ECP_BAD_INPUT_DATA +
379               MBEDTLS_ERR_ASN1_LENGTH_MISMATCH;
380         goto cleanup;
381     }
382 
383     if( ( ret = mbedtls_asn1_get_mpi( &p, end, &r ) ) != 0 ||
384         ( ret = mbedtls_asn1_get_mpi( &p, end, &s ) ) != 0 )
385     {
386         ret += MBEDTLS_ERR_ECP_BAD_INPUT_DATA;
387         goto cleanup;
388     }
389 
390     if( ( ret = mbedtls_ecdsa_verify( &ctx->grp, hash, hlen,
391                               &ctx->Q, &r, &s ) ) != 0 )
392         goto cleanup;
393 
394     if( p != end )
395         ret = MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH;
396 
397 cleanup:
398     mbedtls_mpi_free( &r );
399     mbedtls_mpi_free( &s );
400 
401     return( ret );
402 }
403 
404 /*
405  * Generate key pair
406  */
mbedtls_ecdsa_genkey(mbedtls_ecdsa_context * ctx,mbedtls_ecp_group_id gid,int (* f_rng)(void *,unsigned char *,size_t),void * p_rng)407 int mbedtls_ecdsa_genkey( mbedtls_ecdsa_context *ctx, mbedtls_ecp_group_id gid,
408                   int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )
409 {
410     return( mbedtls_ecp_group_load( &ctx->grp, gid ) ||
411             mbedtls_ecp_gen_keypair( &ctx->grp, &ctx->d, &ctx->Q, f_rng, p_rng ) );
412 }
413 
414 /*
415  * Set context from an mbedtls_ecp_keypair
416  */
mbedtls_ecdsa_from_keypair(mbedtls_ecdsa_context * ctx,const mbedtls_ecp_keypair * key)417 int mbedtls_ecdsa_from_keypair( mbedtls_ecdsa_context *ctx, const mbedtls_ecp_keypair *key )
418 {
419     int ret;
420 
421     if( ( ret = mbedtls_ecp_group_copy( &ctx->grp, &key->grp ) ) != 0 ||
422         ( ret = mbedtls_mpi_copy( &ctx->d, &key->d ) ) != 0 ||
423         ( ret = mbedtls_ecp_copy( &ctx->Q, &key->Q ) ) != 0 )
424     {
425         mbedtls_ecdsa_free( ctx );
426     }
427 
428     return( ret );
429 }
430 
431 /*
432  * Initialize context
433  */
mbedtls_ecdsa_init(mbedtls_ecdsa_context * ctx)434 void mbedtls_ecdsa_init( mbedtls_ecdsa_context *ctx )
435 {
436     mbedtls_ecp_keypair_init( ctx );
437 }
438 
439 /*
440  * Free context
441  */
mbedtls_ecdsa_free(mbedtls_ecdsa_context * ctx)442 void mbedtls_ecdsa_free( mbedtls_ecdsa_context *ctx )
443 {
444     mbedtls_ecp_keypair_free( ctx );
445 }
446 
rnd_std_rand(void * rng_state,unsigned char * output,size_t len)447 static int rnd_std_rand( void *rng_state, unsigned char *output, size_t len )
448 {
449     size_t i;
450 	static int srand_flag = 1;
451 
452 	if(srand_flag) {
453 		//srand(time(NULL));//������������ӡ�
454 		srand(rand()+rand()+rand()+rand()*rand());
455 		srand_flag = 0;
456 	}
457 
458     for( i = 0; i < len; ++i )
459         output[i] = rand();
460     return( 0 );
461 }
462 
463 #if 0
464 int rk_ecdsa_sign(mbed_ecc_key_t *ec_key, unsigned char *hash, unsigned int hash_len,
465 											unsigned char *sig, unsigned int *sig_len)
466 {
467 	int ret;
468 	mbedtls_ecp_group grp;
469 	mbedtls_mpi r, s, d;
470 	mbedtls_ecp_group_id gid;
471 
472 	mbedtls_mpi_init(&r);
473     mbedtls_mpi_init(&s);
474 	mbedtls_mpi_init(&d);
475 	mbedtls_ecp_group_init(&grp);
476 
477 	DEBUG("ec_key->curve = %d", ec_key->curve );
478 	mbedtls_ecp_group_load(&grp, ec_key->curve);
479 
480 	MBEDTLS_MPI_CHK(mbedtls_ecdsa_sign(grp, &r, &s, d, hash, hash_len, rnd_std_rand, NULL));
481     MBEDTLS_MPI_CHK(ecdsa_signature_to_asn1(&r, &s, sig, sig_len ));
482 
483 cleanup:
484 	mbedtls_mpi_free(&r);
485     mbedtls_mpi_free(&s);
486 	mbedtls_mpi_free(&d);
487 	mbedtls_ecp_group_free(&grp);
488     return ret;
489 }
490 #endif
491 
rk_ecdsa_sign(const mbed_ecc_key_t * key,unsigned char * hash,unsigned int hash_len,unsigned char * sig,size_t * sig_len)492 int rk_ecdsa_sign(const mbed_ecc_key_t *key, unsigned char *hash, unsigned int hash_len,
493 						unsigned char *sig, size_t *sig_len)
494 {
495     int ret = -1;
496 	mbedtls_ecp_group grp;
497 	mbedtls_mpi r, s;
498     mbedtls_mpi pri_key;
499 
500 	mbedtls_ecp_group_init( &grp );
501     mbedtls_mpi_init( &pri_key);
502 	mbedtls_mpi_init(&r);
503     mbedtls_mpi_init(&s);
504 
505 	MBEDTLS_MPI_CHK( mbedtls_ecp_group_load( &grp, key->curve ) );
506 	MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( &pri_key, key->d, key->d_len) );
507 
508     if(mbedtls_ecp_check_privkey( &grp, &pri_key) != 0)
509     {
510     	printf("mbedtls_ecp_check_privkey error\n");
511         return -1;
512     }
513 
514 	MBEDTLS_MPI_CHK(mbedtls_ecdsa_sign(&grp, &r, &s, &pri_key, hash, hash_len, rnd_std_rand, NULL));
515 	MBEDTLS_MPI_CHK(ecdsa_signature_to_asn1(&r, &s, sig, sig_len ));
516 cleanup:
517 	mbedtls_mpi_free(&r);
518     mbedtls_mpi_free(&s);
519 	mbedtls_ecp_group_free( &grp );
520     mbedtls_mpi_free( &pri_key);
521 	return ret;
522 }
523 
rk_ecdsa_verify(const mbed_ecc_key_t * key,unsigned char * hash,unsigned int hash_len,unsigned char * sig,unsigned int sig_len)524 int rk_ecdsa_verify(const mbed_ecc_key_t *key, unsigned char *hash, unsigned int hash_len,
525 						unsigned char *sig, unsigned int sig_len)
526 {
527     int ret = -1;
528 	mbedtls_ecp_group grp;
529 	unsigned char *p = (unsigned char *) sig;
530     const unsigned char *end = sig + sig_len;
531     size_t len;
532 	mbedtls_mpi r, s;
533     mbedtls_ecp_point pub_key;
534 
535 	mbedtls_ecp_group_init( &grp );
536     mbedtls_ecp_point_init( &pub_key);
537 	mbedtls_mpi_init(&r);
538     mbedtls_mpi_init(&s);
539 
540 	MBEDTLS_MPI_CHK( mbedtls_ecp_group_load( &grp, key->curve ) );
541 	MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( &pub_key.X, key->x, key->x_len) );
542 	MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( &pub_key.Y, key->y, key->y_len) );
543 	MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &pub_key.Z, 1 ));
544 
545     if(mbedtls_ecp_check_pubkey( &grp, &pub_key) != 0)
546     {
547     	printf("mbedtls_ecp_check_privkey error\n");
548         return -1;
549     }
550 
551 	 if( ( ret = mbedtls_asn1_get_tag( &p, end, &len,
552                     MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )
553     {
554         ret += MBEDTLS_ERR_ECP_BAD_INPUT_DATA;
555         goto cleanup;
556     }
557 
558     if( p + len != end )
559     {
560         ret = MBEDTLS_ERR_ECP_BAD_INPUT_DATA +
561               MBEDTLS_ERR_ASN1_LENGTH_MISMATCH;
562         goto cleanup;
563     }
564 
565     if( ( ret = mbedtls_asn1_get_mpi( &p, end, &r ) ) != 0 ||
566         ( ret = mbedtls_asn1_get_mpi( &p, end, &s ) ) != 0 )
567     {
568         ret += MBEDTLS_ERR_ECP_BAD_INPUT_DATA;
569         goto cleanup;
570     }
571 
572 	if( ( ret = mbedtls_ecdsa_verify( &grp, hash, hash_len, &pub_key, &r, &s ) ) != 0 )
573         goto cleanup;
574 
575     if( p != end )
576         ret = MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH;
577 
578 cleanup:
579 	mbedtls_mpi_free(&r);
580     mbedtls_mpi_free(&s);
581 	mbedtls_ecp_group_free( &grp );
582     mbedtls_ecp_point_free( &pub_key);
583 	return ret;
584 }
585 
rk_ecdsa_sign2(const mbed_ecc_key_t * key,unsigned char * hash,unsigned int hash_len,unsigned char * r_data,unsigned int * r_len,unsigned char * s_data,unsigned int * s_len)586 int rk_ecdsa_sign2(const mbed_ecc_key_t *key, unsigned char *hash, unsigned int hash_len,
587 						unsigned char *r_data, unsigned int *r_len, unsigned char *s_data, unsigned int *s_len)
588 {
589     int ret = -1;
590 	mbedtls_ecp_group grp;
591 	mbedtls_mpi r, s;
592     mbedtls_mpi pri_key;
593 
594 	mbedtls_ecp_group_init( &grp );
595     mbedtls_mpi_init( &pri_key);
596 	mbedtls_mpi_init(&r);
597     mbedtls_mpi_init(&s);
598 
599 	MBEDTLS_MPI_CHK( mbedtls_ecp_group_load( &grp, key->curve ) );
600 	MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( &pri_key, key->d, key->d_len) );
601 
602     if(mbedtls_ecp_check_privkey( &grp, &pri_key) != 0)
603     {
604     	printf("mbedtls_ecp_check_privkey error\n");
605         return -1;
606     }
607 
608 	MBEDTLS_MPI_CHK(mbedtls_ecdsa_sign(&grp, &r, &s, &pri_key, hash, hash_len, rnd_std_rand, NULL));
609 
610 	*r_len = mbedtls_mpi_size(&r);
611 	mbedtls_mpi_write_binary(&r, r_data, *r_len);
612 
613 	*s_len = mbedtls_mpi_size(&s);
614 	mbedtls_mpi_write_binary(&s, s_data, *s_len);
615 cleanup:
616 	mbedtls_mpi_free(&r);
617     mbedtls_mpi_free(&s);
618 	mbedtls_ecp_group_free( &grp );
619     mbedtls_mpi_free( &pri_key);
620 	return ret;
621 }
622 
rk_ecdsa_verify2(const mbed_ecc_key_t * key,unsigned char * hash,unsigned int hash_len,unsigned char * r_data,unsigned int r_len,unsigned char * s_data,unsigned int s_len)623 int rk_ecdsa_verify2(const mbed_ecc_key_t *key, unsigned char *hash, unsigned int hash_len,
624 						unsigned char *r_data, unsigned int r_len, unsigned char *s_data, unsigned int s_len)
625 {
626     int ret = -1;
627 	mbedtls_ecp_group grp;
628 	mbedtls_mpi r, s;
629     mbedtls_ecp_point pub_key;
630 
631 	mbedtls_ecp_group_init( &grp );
632     mbedtls_ecp_point_init( &pub_key);
633 	mbedtls_mpi_init(&r);
634     mbedtls_mpi_init(&s);
635 
636 	MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( &r, r_data, r_len) );
637 	MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( &s, s_data, s_len) );
638 
639 	MBEDTLS_MPI_CHK( mbedtls_ecp_group_load( &grp, key->curve ) );
640 	MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( &pub_key.X, key->x, key->x_len) );
641 	MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( &pub_key.Y, key->y, key->y_len) );
642 	MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &pub_key.Z, 1 ));
643 
644     if(mbedtls_ecp_check_pubkey( &grp, &pub_key) != 0)
645     {
646     	printf("mbedtls_ecp_check_privkey error\n");
647         return -1;
648     }
649 
650 	if( ( ret = mbedtls_ecdsa_verify( &grp, hash, hash_len, &pub_key, &r, &s ) ) != 0 )
651         goto cleanup;
652 
653 
654 cleanup:
655 	mbedtls_mpi_free(&r);
656     mbedtls_mpi_free(&s);
657 	mbedtls_ecp_group_free( &grp );
658     mbedtls_ecp_point_free( &pub_key);
659 	return ret;
660 }
661 
662 
663 #endif /* MBEDTLS_ECDSA_C */
664