File Coverage

ed25519/src/key_exchange.c
Criterion Covered Total %
statement 0 48 0.0
branch 0 4 0.0
condition n/a
subroutine n/a
pod n/a
total 0 52 0.0


line stmt bran cond sub pod time code
1             #include "ed25519.h"
2             #include "fe.h"
3              
4             static
5 0           void ed25519_key_exchange(unsigned char *shared_secret, const unsigned char *public_key, const unsigned char *private_key) {
6             unsigned char e[32];
7             unsigned int i;
8            
9             fe x1;
10             fe x2;
11             fe z2;
12             fe x3;
13             fe z3;
14             fe tmp0;
15             fe tmp1;
16              
17             int pos;
18             unsigned int swap;
19             unsigned int b;
20              
21             /* copy the private key and make sure it's valid */
22 0 0         for (i = 0; i < 32; ++i) {
23 0           e[i] = private_key[i];
24             }
25              
26 0           e[0] &= 248;
27 0           e[31] &= 63;
28 0           e[31] |= 64;
29              
30             /* unpack the public key and convert edwards to montgomery */
31             /* due to CodesInChaos: montgomeryX = (edwardsY + 1)*inverse(1 - edwardsY) mod p */
32 0           fe_frombytes(x1, public_key);
33 0           fe_1(tmp1);
34 0           fe_add(tmp0, x1, tmp1);
35 0           fe_sub(tmp1, tmp1, x1);
36 0           fe_invert(tmp1, tmp1);
37 0           fe_mul(x1, tmp0, tmp1);
38              
39 0           fe_1(x2);
40 0           fe_0(z2);
41 0           fe_copy(x3, x1);
42 0           fe_1(z3);
43              
44 0           swap = 0;
45 0 0         for (pos = 254; pos >= 0; --pos) {
46 0           b = e[pos / 8] >> (pos & 7);
47 0           b &= 1;
48 0           swap ^= b;
49 0           fe_cswap(x2, x3, swap);
50 0           fe_cswap(z2, z3, swap);
51 0           swap = b;
52              
53             /* from montgomery.h */
54 0           fe_sub(tmp0, x3, z3);
55 0           fe_sub(tmp1, x2, z2);
56 0           fe_add(x2, x2, z2);
57 0           fe_add(z2, x3, z3);
58 0           fe_mul(z3, tmp0, x2);
59 0           fe_mul(z2, z2, tmp1);
60 0           fe_sq(tmp0, tmp1);
61 0           fe_sq(tmp1, x2);
62 0           fe_add(x3, z3, z2);
63 0           fe_sub(z2, z3, z2);
64 0           fe_mul(x2, tmp1, tmp0);
65 0           fe_sub(tmp1, tmp1, tmp0);
66 0           fe_sq(z2, z2);
67 0           fe_mul121666(z3, tmp1);
68 0           fe_sq(x3, x3);
69 0           fe_add(tmp0, tmp0, z3);
70 0           fe_mul(z3, x1, z2);
71 0           fe_mul(z2, tmp1, tmp0);
72             }
73              
74 0           fe_cswap(x2, x3, swap);
75 0           fe_cswap(z2, z3, swap);
76              
77 0           fe_invert(z2, z2);
78 0           fe_mul(x2, x2, z2);
79 0           fe_tobytes(shared_secret, x2);
80 0           }