Branch data Line data Source code
1 : : /* $OpenBSD: ed25519.c,v 1.3 2013/12/09 11:03:45 markus Exp $ */
2 : :
3 : : /*
4 : : * Public Domain, Authors: Daniel J. Bernstein, Niels Duif, Tanja Lange,
5 : : * Peter Schwabe, Bo-Yin Yang.
6 : : * Copied from supercop-20130419/crypto_sign/ed25519/ref/ed25519.c
7 : : */
8 : :
9 : : #include "includes.h"
10 : : #include "crypto_api.h"
11 : :
12 : : #include "ge25519.h"
13 : :
14 : 53 : static void get_hram(unsigned char *hram, const unsigned char *sm, const unsigned char *pk, unsigned char *playground, unsigned long long smlen)
15 : : {
16 : : unsigned long long i;
17 : :
18 [ + + ]: 1749 : for (i = 0;i < 32;++i) playground[i] = sm[i];
19 [ + + ]: 1749 : for (i = 32;i < 64;++i) playground[i] = pk[i-32];
20 [ + + ]: 34493 : for (i = 64;i < smlen;++i) playground[i] = sm[i];
21 : :
22 : 53 : crypto_hash_sha512(hram,playground,smlen);
23 : 53 : }
24 : :
25 : :
26 : 5 : int crypto_sign_ed25519_keypair(
27 : : unsigned char *pk,
28 : : unsigned char *sk
29 : : )
30 : : {
31 : : sc25519 scsk;
32 : : ge25519 gepk;
33 : : unsigned char extsk[64];
34 : : int i;
35 : :
36 : 5 : randombytes(sk, 32);
37 : 5 : crypto_hash_sha512(extsk, sk, 32);
38 : 5 : extsk[0] &= 248;
39 : 5 : extsk[31] &= 127;
40 : 5 : extsk[31] |= 64;
41 : :
42 : 5 : sc25519_from32bytes(&scsk,extsk);
43 : :
44 : 5 : ge25519_scalarmult_base(&gepk, &scsk);
45 : 5 : ge25519_pack(pk, &gepk);
46 [ + + ]: 165 : for(i=0;i<32;i++)
47 : 160 : sk[32 + i] = pk[i];
48 : 5 : return 0;
49 : : }
50 : :
51 : 25 : int crypto_sign_ed25519(
52 : : unsigned char *sm,unsigned long long *smlen,
53 : : const unsigned char *m,unsigned long long mlen,
54 : : const unsigned char *sk
55 : : )
56 : : {
57 : : sc25519 sck, scs, scsk;
58 : : ge25519 ger;
59 : : unsigned char r[32];
60 : : unsigned char s[32];
61 : : unsigned char extsk[64];
62 : : unsigned long long i;
63 : : unsigned char hmg[crypto_hash_sha512_BYTES];
64 : : unsigned char hram[crypto_hash_sha512_BYTES];
65 : :
66 : 25 : crypto_hash_sha512(extsk, sk, 32);
67 : 25 : extsk[0] &= 248;
68 : 25 : extsk[31] &= 127;
69 : 25 : extsk[31] |= 64;
70 : :
71 : 25 : *smlen = mlen+64;
72 [ + + ]: 17139 : for(i=0;i<mlen;i++)
73 : 17114 : sm[64 + i] = m[i];
74 [ + + ]: 825 : for(i=0;i<32;i++)
75 : 800 : sm[32 + i] = extsk[32+i];
76 : :
77 : 25 : crypto_hash_sha512(hmg, sm+32, mlen+32); /* Generate k as h(extsk[32],...,extsk[63],m) */
78 : :
79 : : /* Computation of R */
80 : 25 : sc25519_from64bytes(&sck, hmg);
81 : 25 : ge25519_scalarmult_base(&ger, &sck);
82 : 25 : ge25519_pack(r, &ger);
83 : :
84 : : /* Computation of s */
85 [ + + ]: 825 : for(i=0;i<32;i++)
86 : 800 : sm[i] = r[i];
87 : :
88 : 25 : get_hram(hram, sm, sk+32, sm, mlen+64);
89 : :
90 : 25 : sc25519_from64bytes(&scs, hram);
91 : 25 : sc25519_from32bytes(&scsk, extsk);
92 : 25 : sc25519_mul(&scs, &scs, &scsk);
93 : :
94 : 25 : sc25519_add(&scs, &scs, &sck);
95 : :
96 : 25 : sc25519_to32bytes(s,&scs); /* cat s */
97 [ + + ]: 825 : for(i=0;i<32;i++)
98 : 800 : sm[32 + i] = s[i];
99 : :
100 : 25 : return 0;
101 : : }
102 : :
103 : 28 : int crypto_sign_ed25519_open(
104 : : unsigned char *m,unsigned long long *mlen,
105 : : const unsigned char *sm,unsigned long long smlen,
106 : : const unsigned char *pk
107 : : )
108 : : {
109 : : unsigned int i;
110 : : int ret;
111 : : unsigned char t2[32];
112 : : ge25519 get1, get2;
113 : : sc25519 schram, scs;
114 : : unsigned char hram[crypto_hash_sha512_BYTES];
115 : :
116 : 28 : *mlen = (unsigned long long) -1;
117 [ + - ]: 28 : if (smlen < 64) return -1;
118 : :
119 [ + - ]: 28 : if (ge25519_unpackneg_vartime(&get1, pk)) return -1;
120 : :
121 : 28 : get_hram(hram,sm,pk,m,smlen);
122 : :
123 : 28 : sc25519_from64bytes(&schram, hram);
124 : :
125 : 28 : sc25519_from32bytes(&scs, sm+32);
126 : :
127 : 28 : ge25519_double_scalarmult_vartime(&get2, &get1, &schram, &ge25519_base, &scs);
128 : 28 : ge25519_pack(t2, &get2);
129 : :
130 : 28 : ret = crypto_verify_32(sm, t2);
131 : :
132 [ - + ]: 28 : if (!ret)
133 : : {
134 [ + + ]: 17354 : for(i=0;i<smlen-64;i++)
135 : 17326 : m[i] = sm[i + 64];
136 : 28 : *mlen = smlen-64;
137 : : }
138 : : else
139 : : {
140 [ # # ]: 0 : for(i=0;i<smlen-64;i++)
141 : 0 : m[i] = 0;
142 : : }
143 : 28 : return ret;
144 : : }
|