summaryrefslogtreecommitdiffstats
path: root/comm/third_party/botan/src/lib/pubkey/ed25519/ed25519_internal.h
diff options
context:
space:
mode:
Diffstat (limited to 'comm/third_party/botan/src/lib/pubkey/ed25519/ed25519_internal.h')
-rw-r--r--comm/third_party/botan/src/lib/pubkey/ed25519/ed25519_internal.h119
1 files changed, 119 insertions, 0 deletions
diff --git a/comm/third_party/botan/src/lib/pubkey/ed25519/ed25519_internal.h b/comm/third_party/botan/src/lib/pubkey/ed25519/ed25519_internal.h
new file mode 100644
index 0000000000..cb67a43fd2
--- /dev/null
+++ b/comm/third_party/botan/src/lib/pubkey/ed25519/ed25519_internal.h
@@ -0,0 +1,119 @@
+/*
+* Ed25519
+* (C) 2017 Ribose Inc
+*
+* Based on the public domain code from SUPERCOP ref10 by
+* Peter Schwabe, Daniel J. Bernstein, Niels Duif, Tanja Lange, Bo-Yin Yang
+*
+* Botan is released under the Simplified BSD License (see license.txt)
+*/
+
+#ifndef BOTAN_ED25519_INT_H_
+#define BOTAN_ED25519_INT_H_
+
+#include <botan/internal/ed25519_fe.h>
+#include <botan/loadstor.h>
+
+namespace Botan {
+
+inline uint64_t load_3(const uint8_t in[3])
+ {
+ return static_cast<uint64_t>(in[0]) |
+ (static_cast<uint64_t>(in[1]) << 8) |
+ (static_cast<uint64_t>(in[2]) << 16);
+ }
+
+inline uint64_t load_4(const uint8_t* in)
+ {
+ return load_le<uint32_t>(in, 0);
+ }
+
+template<size_t S, int64_t MUL=1>
+inline void carry(int64_t& h0, int64_t& h1)
+ {
+ static_assert(S > 0 && S < 64, "Shift in range");
+
+ const int64_t X1 = (static_cast<int64_t>(1) << S);
+ const int64_t X2 = (static_cast<int64_t>(1) << (S - 1));
+ int64_t c = (h0 + X2) >> S;
+ h1 += c * MUL;
+ h0 -= c * X1;
+ }
+
+template<size_t S>
+inline void carry0(int64_t& h0, int64_t& h1)
+ {
+ static_assert(S > 0 && S < 64, "Shift in range");
+
+ const int64_t X1 = (static_cast<int64_t>(1) << S);
+ int64_t c = h0 >> S;
+ h1 += c;
+ h0 -= c * X1;
+ }
+
+template<size_t S>
+inline void carry0(int32_t& h0, int32_t& h1)
+ {
+ static_assert(S > 0 && S < 32, "Shift in range");
+
+ const int32_t X1 = (static_cast<int64_t>(1) << S);
+ int32_t c = h0 >> S;
+ h1 += c;
+ h0 -= c * X1;
+ }
+
+inline void redc_mul(int64_t& s1,
+ int64_t& s2,
+ int64_t& s3,
+ int64_t& s4,
+ int64_t& s5,
+ int64_t& s6,
+ int64_t& X)
+ {
+ s1 += X * 666643;
+ s2 += X * 470296;
+ s3 += X * 654183;
+ s4 -= X * 997805;
+ s5 += X * 136657;
+ s6 -= X * 683901;
+ X = 0;
+ }
+
+/*
+ge means group element.
+
+Here the group is the set of pairs (x,y) of field elements (see fe.h)
+satisfying -x^2 + y^2 = 1 + d x^2y^2
+where d = -121665/121666.
+
+Representations:
+ ge_p3 (extended): (X:Y:Z:T) satisfying x=X/Z, y=Y/Z, XY=ZT
+*/
+
+typedef struct
+ {
+ fe X;
+ fe Y;
+ fe Z;
+ fe T;
+ } ge_p3;
+
+int ge_frombytes_negate_vartime(ge_p3*, const uint8_t*);
+void ge_scalarmult_base(uint8_t out[32], const uint8_t in[32]);
+
+void ge_double_scalarmult_vartime(uint8_t out[32],
+ const uint8_t a[],
+ const ge_p3* A,
+ const uint8_t b[]);
+
+/*
+The set of scalars is \Z/l
+where l = 2^252 + 27742317777372353535851937790883648493.
+*/
+
+void sc_reduce(uint8_t*);
+void sc_muladd(uint8_t*, const uint8_t*, const uint8_t*, const uint8_t*);
+
+}
+
+#endif