Coverage Report

Created: 2020-02-14 15:38

/src/botan/build/include/botan/internal/ed25519_internal.h
Line
Count
Source
1
/*
2
* Ed25519
3
* (C) 2017 Ribose Inc
4
*
5
* Based on the public domain code from SUPERCOP ref10 by
6
* Peter Schwabe, Daniel J. Bernstein, Niels Duif, Tanja Lange, Bo-Yin Yang
7
*
8
* Botan is released under the Simplified BSD License (see license.txt)
9
*/
10
11
#ifndef BOTAN_ED25519_INT_H_
12
#define BOTAN_ED25519_INT_H_
13
14
#include <botan/internal/ed25519_fe.h>
15
#include <botan/loadstor.h>
16
17
namespace Botan {
18
19
inline uint64_t load_3(const uint8_t in[3])
20
1.30k
   {
21
1.30k
   return static_cast<uint64_t>(in[0]) |
22
1.30k
      (static_cast<uint64_t>(in[1]) << 8) |
23
1.30k
      (static_cast<uint64_t>(in[2]) << 16);
24
1.30k
   }
25
26
inline uint64_t load_4(const uint8_t* in)
27
1.02k
   {
28
1.02k
   return load_le<uint32_t>(in, 0);
29
1.02k
   }
30
31
template<size_t S, int64_t MUL=1>
32
inline void carry(int64_t& h0, int64_t& h1)
33
2.37M
   {
34
2.37M
   static_assert(S > 0 && S < 64, "Shift in range");
35
2.37M
36
2.37M
   const int64_t X1 = (static_cast<int64_t>(1) << S);
37
2.37M
   const int64_t X2 = (static_cast<int64_t>(1) << (S - 1));
38
2.37M
   int64_t c = (h0 + X2)  >> S;
39
2.37M
   h1 += c * MUL;
40
2.37M
   h0 -= c * X1;
41
2.37M
   }
void Botan::carry<21ul, 1l>(long&, long&)
Line
Count
Source
33
1.56k
   {
34
1.56k
   static_assert(S > 0 && S < 64, "Shift in range");
35
1.56k
36
1.56k
   const int64_t X1 = (static_cast<int64_t>(1) << S);
37
1.56k
   const int64_t X2 = (static_cast<int64_t>(1) << (S - 1));
38
1.56k
   int64_t c = (h0 + X2)  >> S;
39
1.56k
   h1 += c * MUL;
40
1.56k
   h0 -= c * X1;
41
1.56k
   }
void Botan::carry<26ul, 1l>(long&, long&)
Line
Count
Source
33
1.38M
   {
34
1.38M
   static_assert(S > 0 && S < 64, "Shift in range");
35
1.38M
36
1.38M
   const int64_t X1 = (static_cast<int64_t>(1) << S);
37
1.38M
   const int64_t X2 = (static_cast<int64_t>(1) << (S - 1));
38
1.38M
   int64_t c = (h0 + X2)  >> S;
39
1.38M
   h1 += c * MUL;
40
1.38M
   h0 -= c * X1;
41
1.38M
   }
void Botan::carry<25ul, 1l>(long&, long&)
Line
Count
Source
33
790k
   {
34
790k
   static_assert(S > 0 && S < 64, "Shift in range");
35
790k
36
790k
   const int64_t X1 = (static_cast<int64_t>(1) << S);
37
790k
   const int64_t X2 = (static_cast<int64_t>(1) << (S - 1));
38
790k
   int64_t c = (h0 + X2)  >> S;
39
790k
   h1 += c * MUL;
40
790k
   h0 -= c * X1;
41
790k
   }
void Botan::carry<25ul, 19l>(long&, long&)
Line
Count
Source
33
197k
   {
34
197k
   static_assert(S > 0 && S < 64, "Shift in range");
35
197k
36
197k
   const int64_t X1 = (static_cast<int64_t>(1) << S);
37
197k
   const int64_t X2 = (static_cast<int64_t>(1) << (S - 1));
38
197k
   int64_t c = (h0 + X2)  >> S;
39
197k
   h1 += c * MUL;
40
197k
   h0 -= c * X1;
41
197k
   }
42
43
template<size_t S>
44
inline void carry0(int64_t& h0, int64_t& h1)
45
1.63k
   {
46
1.63k
   static_assert(S > 0 && S < 64, "Shift in range");
47
1.63k
48
1.63k
   const int64_t X1 = (static_cast<int64_t>(1) << S);
49
1.63k
   int64_t c = h0 >> S;
50
1.63k
   h1 += c;
51
1.63k
   h0 -= c * X1;
52
1.63k
   }
53
54
template<size_t S>
55
inline void carry0(int32_t& h0, int32_t& h1)
56
2.78k
   {
57
2.78k
   static_assert(S > 0 && S < 32, "Shift in range");
58
2.78k
59
2.78k
   const int32_t X1 = (static_cast<int64_t>(1) << S);
60
2.78k
   int32_t c = h0 >> S;
61
2.78k
   h1 += c;
62
2.78k
   h0 -= c * X1;
63
2.78k
   }
void Botan::carry0<26ul>(int&, int&)
Line
Count
Source
56
1.54k
   {
57
1.54k
   static_assert(S > 0 && S < 32, "Shift in range");
58
1.54k
59
1.54k
   const int32_t X1 = (static_cast<int64_t>(1) << S);
60
1.54k
   int32_t c = h0 >> S;
61
1.54k
   h1 += c;
62
1.54k
   h0 -= c * X1;
63
1.54k
   }
void Botan::carry0<25ul>(int&, int&)
Line
Count
Source
56
1.23k
   {
57
1.23k
   static_assert(S > 0 && S < 32, "Shift in range");
58
1.23k
59
1.23k
   const int32_t X1 = (static_cast<int64_t>(1) << S);
60
1.23k
   int32_t c = h0 >> S;
61
1.23k
   h1 += c;
62
1.23k
   h0 -= c * X1;
63
1.23k
   }
64
65
inline void redc_mul(int64_t& s1,
66
                     int64_t& s2,
67
                     int64_t& s3,
68
                     int64_t& s4,
69
                     int64_t& s5,
70
                     int64_t& s6,
71
                     int64_t& X)
72
952
   {
73
952
   s1 += X * 666643;
74
952
   s2 += X * 470296;
75
952
   s3 += X * 654183;
76
952
   s4 -= X * 997805;
77
952
   s5 += X * 136657;
78
952
   s6 -= X * 683901;
79
952
   X = 0;
80
952
   }
81
82
/*
83
ge means group element.
84
85
Here the group is the set of pairs (x,y) of field elements (see fe.h)
86
satisfying -x^2 + y^2 = 1 + d x^2y^2
87
where d = -121665/121666.
88
89
Representations:
90
  ge_p3 (extended): (X:Y:Z:T) satisfying x=X/Z, y=Y/Z, XY=ZT
91
*/
92
93
typedef struct
94
   {
95
   fe X;
96
   fe Y;
97
   fe Z;
98
   fe T;
99
   } ge_p3;
100
101
int ge_frombytes_negate_vartime(ge_p3*, const uint8_t*);
102
void ge_scalarmult_base(uint8_t out[32], const uint8_t in[32]);
103
104
void ge_double_scalarmult_vartime(uint8_t out[32],
105
                                  const uint8_t a[],
106
                                  const ge_p3* A,
107
                                  const uint8_t b[]);
108
109
/*
110
The set of scalars is \Z/l
111
where l = 2^252 + 27742317777372353535851937790883648493.
112
*/
113
114
void sc_reduce(uint8_t*);
115
void sc_muladd(uint8_t*, const uint8_t*, const uint8_t*, const uint8_t*);
116
117
}
118
119
#endif