| 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 |