1 | #include "fe.h" |
---|---|
2 | #include "crypto_int64.h" |
3 | #include "crypto_uint64.h" |
4 | |
5 | static crypto_uint64 load_3(const unsigned char *in) |
6 | { |
7 | crypto_uint64 result; |
8 | result = (crypto_uint64) in[0]; |
9 | result |= ((crypto_uint64) in[1]) << 8; |
10 | result |= ((crypto_uint64) in[2]) << 16; |
11 | return result; |
12 | } |
13 | |
14 | static crypto_uint64 load_4(const unsigned char *in) |
15 | { |
16 | crypto_uint64 result; |
17 | result = (crypto_uint64) in[0]; |
18 | result |= ((crypto_uint64) in[1]) << 8; |
19 | result |= ((crypto_uint64) in[2]) << 16; |
20 | result |= ((crypto_uint64) in[3]) << 24; |
21 | return result; |
22 | } |
23 | |
24 | /* |
25 | Ignores top bit of h. |
26 | */ |
27 | |
28 | void fe_frombytes(fe h,const unsigned char *s) |
29 | { |
30 | crypto_int64 h0 = load_4(s); |
31 | crypto_int64 h1 = load_3(s + 4) << 6; |
32 | crypto_int64 h2 = load_3(s + 7) << 5; |
33 | crypto_int64 h3 = load_3(s + 10) << 3; |
34 | crypto_int64 h4 = load_3(s + 13) << 2; |
35 | crypto_int64 h5 = load_4(s + 16); |
36 | crypto_int64 h6 = load_3(s + 20) << 7; |
37 | crypto_int64 h7 = load_3(s + 23) << 5; |
38 | crypto_int64 h8 = load_3(s + 26) << 4; |
39 | crypto_int64 h9 = (load_3(s + 29) & 8388607) << 2; |
40 | crypto_int64 carry0; |
41 | crypto_int64 carry1; |
42 | crypto_int64 carry2; |
43 | crypto_int64 carry3; |
44 | crypto_int64 carry4; |
45 | crypto_int64 carry5; |
46 | crypto_int64 carry6; |
47 | crypto_int64 carry7; |
48 | crypto_int64 carry8; |
49 | crypto_int64 carry9; |
50 | |
51 | carry9 = (h9 + (crypto_int64) (1<<24)) >> 25; h0 += carry9 * 19; h9 -= carry9 << 25; |
52 | carry1 = (h1 + (crypto_int64) (1<<24)) >> 25; h2 += carry1; h1 -= carry1 << 25; |
53 | carry3 = (h3 + (crypto_int64) (1<<24)) >> 25; h4 += carry3; h3 -= carry3 << 25; |
54 | carry5 = (h5 + (crypto_int64) (1<<24)) >> 25; h6 += carry5; h5 -= carry5 << 25; |
55 | carry7 = (h7 + (crypto_int64) (1<<24)) >> 25; h8 += carry7; h7 -= carry7 << 25; |
56 | |
57 | carry0 = (h0 + (crypto_int64) (1<<25)) >> 26; h1 += carry0; h0 -= carry0 << 26; |
58 | carry2 = (h2 + (crypto_int64) (1<<25)) >> 26; h3 += carry2; h2 -= carry2 << 26; |
59 | carry4 = (h4 + (crypto_int64) (1<<25)) >> 26; h5 += carry4; h4 -= carry4 << 26; |
60 | carry6 = (h6 + (crypto_int64) (1<<25)) >> 26; h7 += carry6; h6 -= carry6 << 26; |
61 | carry8 = (h8 + (crypto_int64) (1<<25)) >> 26; h9 += carry8; h8 -= carry8 << 26; |
62 | |
63 | h[0] = h0; |
64 | h[1] = h1; |
65 | h[2] = h2; |
66 | h[3] = h3; |
67 | h[4] = h4; |
68 | h[5] = h5; |
69 | h[6] = h6; |
70 | h[7] = h7; |
71 | h[8] = h8; |
72 | h[9] = h9; |
73 | } |
74 |