]> git.cryptolib.org Git - avr-crypto-lib.git/blob - dsa/dsa_sign.c
updated Grøstl for round 3
[avr-crypto-lib.git] / dsa / dsa_sign.c
1 /* dsa_sign.c */
2 /*
3     This file is part of the AVR-Crypto-Lib.
4     Copyright (C) 2010 Daniel Otte (daniel.otte@rub.de)
5
6     This program is free software: you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation, either version 3 of the License, or
9     (at your option) any later version.
10
11     This program is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.
15
16     You should have received a copy of the GNU General Public License
17     along with this program.  If not, see <http://www.gnu.org/licenses/>.
18 */
19
20 #include <stdint.h>
21 #include "cli.h"
22 #include "bigint.h"
23 #include "dsa.h"
24 #include "hashfunction_descriptor.h"
25 #include "hfal-basic.h"
26
27 uint8_t dsa_sign_bigint(dsa_signature_t* s, const bigint_t* m,
28                                 const dsa_ctx_t* ctx, const bigint_t* k){
29         bigint_t tmp, tmp2;
30         uint8_t tmp_b[ctx->domain.p.length_B+5], tmp2_b[ctx->domain.q.length_B+5];
31         tmp.wordv= tmp_b;
32         tmp2.wordv = tmp2_b;
33         bigint_expmod_u(&tmp, &(ctx->domain.g), k, &(ctx->domain.p));
34         bigint_reduce(&tmp, &(ctx->domain.q));
35         bigint_copy(&(s->r), &tmp);
36         bigint_mul_u(&tmp, &tmp, &(ctx->priv));
37         bigint_add_u(&tmp, &tmp, m);
38         bigint_inverse(&tmp2, k, &(ctx->domain.q));
39         bigint_mul_u(&tmp, &tmp, &tmp2);
40         bigint_reduce(&tmp, &(ctx->domain.q));
41         bigint_copy(&(s->s), &tmp);
42
43         if(s->s.length_B==0 || s->r.length_B==0){
44                 return 1;
45         }
46
47         return 0;
48 }
49
50 uint8_t dsa_sign_message(dsa_signature_t* s, const void* m, uint16_t m_len_b,
51                                 const hfdesc_t* hash_desc, const dsa_ctx_t* ctx,
52                                 const rand_func_ptr_t rand_in){
53         bigint_t z, k;
54         uint8_t i, n_B = ctx->domain.q.length_B;
55         uint8_t hash_value[(n_B>(hfal_hash_getHashsize(hash_desc)+7)/8)?n_B:(hfal_hash_getHashsize(hash_desc)+7)/8];
56         uint8_t k_b[n_B];
57         hfal_hash_mem(hash_desc, hash_value, m, m_len_b);
58         z.wordv = hash_value;
59         z.length_B = n_B;
60         bigint_changeendianess(&z);
61         k.wordv = k_b;
62         k.length_B = n_B;
63         do{
64                 for(i=0; i<n_B; ++i){
65                         k_b[i] = rand_in();
66                 }
67                 k.length_B = n_B;
68                 bigint_adjust(&k);
69         }while(dsa_sign_bigint(s, &z, ctx, &k));
70         cli_putstr_P(PSTR("\r\nsignature computed"));
71         return 0;
72 }
73