Botan 3.3.0
Crypto and TLS for C&
poly_dbl.cpp
Go to the documentation of this file.
1/*
2* (C) 2017,2018 Jack Lloyd
3*
4* Botan is released under the Simplified BSD License (see license.txt)
5*/
6
7#include <botan/internal/poly_dbl.h>
8
9#include <botan/exceptn.h>
10#include <botan/internal/loadstor.h>
11
12namespace Botan {
13
14namespace {
15
16/*
17* The minimum weight irreducible binary polynomial of size n
18*
19* See "Table of Low-Weight Binary Irreducible Polynomials"
20* by Gadiel Seroussi, HP Labs Tech Report HPL-98-135
21* http://www.hpl.hp.com/techreports/98/HPL-98-135.pdf
22*/
23enum class MinWeightPolynomial : uint64_t {
24 P64 = 0x1B,
25 P128 = 0x87,
26 P192 = 0x87,
27 P256 = 0x425,
28 P512 = 0x125,
29 P1024 = 0x80043,
30};
31
32template <size_t LIMBS, MinWeightPolynomial P>
33void poly_double(uint8_t out[], const uint8_t in[]) {
34 uint64_t W[LIMBS];
35 load_be(W, in, LIMBS);
36
37 const uint64_t POLY = static_cast<uint64_t>(P);
38
39 const uint64_t carry = POLY * (W[0] >> 63);
40
41 if constexpr(LIMBS > 0) {
42 for(size_t i = 0; i != LIMBS - 1; ++i) {
43 W[i] = (W[i] << 1) ^ (W[i + 1] >> 63);
44 }
45 }
46
47 W[LIMBS - 1] = (W[LIMBS - 1] << 1) ^ carry;
48
49 copy_out_be(out, LIMBS * 8, W);
50}
51
52template <size_t LIMBS, MinWeightPolynomial P>
53void poly_double_le(uint8_t out[], const uint8_t in[]) {
54 uint64_t W[LIMBS];
55 load_le(W, in, LIMBS);
56
57 const uint64_t POLY = static_cast<uint64_t>(P);
58
59 const uint64_t carry = POLY * (W[LIMBS - 1] >> 63);
60
61 if constexpr(LIMBS > 0) {
62 for(size_t i = 0; i != LIMBS - 1; ++i) {
63 W[LIMBS - 1 - i] = (W[LIMBS - 1 - i] << 1) ^ (W[LIMBS - 2 - i] >> 63);
64 }
65 }
66
67 W[0] = (W[0] << 1) ^ carry;
68
69 copy_out_le(out, LIMBS * 8, W);
70}
71
72} // namespace
73
74void poly_double_n(uint8_t out[], const uint8_t in[], size_t n) {
75 switch(n) {
76 case 8:
77 return poly_double<1, MinWeightPolynomial::P64>(out, in);
78 case 16:
79 return poly_double<2, MinWeightPolynomial::P128>(out, in);
80 case 24:
81 return poly_double<3, MinWeightPolynomial::P192>(out, in);
82 case 32:
83 return poly_double<4, MinWeightPolynomial::P256>(out, in);
84 case 64:
85 return poly_double<8, MinWeightPolynomial::P512>(out, in);
86 case 128:
87 return poly_double<16, MinWeightPolynomial::P1024>(out, in);
88 default:
89 throw Invalid_Argument("Unsupported size for poly_double_n");
90 }
91}
92
93void poly_double_n_le(uint8_t out[], const uint8_t in[], size_t n) {
94 switch(n) {
95 case 8:
96 return poly_double_le<1, MinWeightPolynomial::P64>(out, in);
97 case 16:
98 return poly_double_le<2, MinWeightPolynomial::P128>(out, in);
99 case 24:
100 return poly_double_le<3, MinWeightPolynomial::P192>(out, in);
101 case 32:
102 return poly_double_le<4, MinWeightPolynomial::P256>(out, in);
103 case 64:
104 return poly_double_le<8, MinWeightPolynomial::P512>(out, in);
105 case 128:
106 return poly_double_le<16, MinWeightPolynomial::P1024>(out, in);
107 default:
108 throw Invalid_Argument("Unsupported size for poly_double_n_le");
109 }
110}
111
112} // namespace Botan
void copy_out_le(uint8_t out[], size_t out_bytes, const T in[])
Definition loadstor.h:526
constexpr T load_le(InR &&in_range)
Definition loadstor.h:117
void poly_double_n_le(uint8_t out[], const uint8_t in[], size_t n)
Definition poly_dbl.cpp:93
void carry(int64_t &h0, int64_t &h1)
void poly_double_n(uint8_t out[], const uint8_t in[], size_t n)
Definition poly_dbl.cpp:74
constexpr T load_be(InR &&in_range)
Definition loadstor.h:92
void copy_out_be(uint8_t out[], size_t out_bytes, const T in[])
Definition loadstor.h:507