8#ifndef BOTAN_DONNA128_H_
9#define BOTAN_DONNA128_H_
11#include <botan/internal/ct_utils.h>
12#include <botan/internal/mul128.h>
19 constexpr explicit donna128(uint64_t l = 0, uint64_t h = 0) : m_lo(l), m_hi(h) {}
21 template <std::
unsigned_
integral T>
26 z.m_lo = z.m_hi >> (shift - 64);
28 }
else if(shift == 64) {
31 }
else if(shift > 0) {
32 const uint64_t
carry = z.m_hi <<
static_cast<size_t>(64 - shift);
41 template <std::
unsigned_
integral T>
45 z.m_hi = z.m_lo << (shift - 64);
47 }
else if(shift == 64) {
50 }
else if(shift > 0) {
51 const uint64_t
carry = z.m_lo >>
static_cast<size_t>(64 - shift);
52 z.m_lo = (z.m_lo << shift);
53 z.m_hi = (z.m_hi << shift) |
carry;
59 constexpr friend uint64_t
operator&(
const donna128& x, uint64_t mask) {
return x.m_lo & mask; }
83 constexpr uint64_t
lo()
const {
return m_lo; }
85 constexpr uint64_t
hi()
const {
return m_hi; }
87 constexpr explicit operator uint64_t()
const {
return lo(); }
94template <std::
integral T>
96 BOTAN_ARG_CHECK(x.
hi() == 0,
"High 64 bits of donna128 set to zero during multiply");
104template <std::
integral T>
130 return (a >> shift).lo();
138#if defined(BOTAN_TARGET_HAS_NATIVE_UINT128)
139inline uint64_t
carry_shift(
const uint128_t a,
size_t shift) {
140 return static_cast<uint64_t
>(a >> shift);
143inline uint64_t
combine_lower(
const uint128_t a,
size_t s1,
const uint128_t b,
size_t s2) {
144 return static_cast<uint64_t
>((a >> s1) | (b << s2));
#define BOTAN_ARG_CHECK(expr, msg)
static constexpr Mask< T > is_lt(T x, T y)
constexpr uint64_t operator&=(uint64_t mask)
constexpr uint64_t lo() const
constexpr donna128 & operator+=(uint64_t x)
constexpr friend donna128 operator<<(const donna128 &x, T shift)
constexpr friend uint64_t operator&(const donna128 &x, uint64_t mask)
constexpr uint64_t hi() const
constexpr friend donna128 operator>>(const donna128 &x, T shift)
constexpr donna128 & operator+=(const donna128 &x)
constexpr donna128(uint64_t l=0, uint64_t h=0)
ASN1_Type operator|(ASN1_Type x, ASN1_Type y)
constexpr uint64_t carry_shift(const donna128 &a, size_t shift)
BigInt operator*(const BigInt &x, const BigInt &y)
OctetString operator+(const OctetString &k1, const OctetString &k2)
void carry(int64_t &h0, int64_t &h1)
constexpr void mul64x64_128(uint64_t a, uint64_t b, uint64_t *lo, uint64_t *hi)
constexpr uint64_t combine_lower(const donna128 &a, size_t s1, const donna128 &b, size_t s2)