• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

randombit / botan / 5123321399

30 May 2023 04:06PM UTC coverage: 92.213% (+0.004%) from 92.209%
5123321399

Pull #3558

github

web-flow
Merge dd72f7389 into 057bcbc35
Pull Request #3558: Add braces around all if/else statements

75602 of 81986 relevant lines covered (92.21%)

11859779.3 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

92.0
/src/lib/utils/poly_dbl/poly_dbl.cpp
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

12
namespace Botan {
13

14
namespace {
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
*/
23
enum class MinWeightPolynomial : uint64_t {
24
   P64 = 0x1B,
25
   P128 = 0x87,
26
   P192 = 0x87,
27
   P256 = 0x425,
28
   P512 = 0x125,
29
   P1024 = 0x80043,
30
};
31

32
template <size_t LIMBS, MinWeightPolynomial P>
33
void poly_double(uint8_t out[], const uint8_t in[]) {
36,836✔
34
   uint64_t W[LIMBS];
35
   load_be(W, in, LIMBS);
36,836✔
36

37
   const uint64_t POLY = static_cast<uint64_t>(P);
36,836✔
38

39
   const uint64_t carry = POLY * (W[0] >> 63);
36,836✔
40

41
   if constexpr(LIMBS > 0) {
42
      for(size_t i = 0; i != LIMBS - 1; ++i) {
132,629✔
43
         W[i] = (W[i] << 1) ^ (W[i + 1] >> 63);
95,793✔
44
      }
45
   }
46

47
   W[LIMBS - 1] = (W[LIMBS - 1] << 1) ^ carry;
36,836✔
48

49
   copy_out_be(out, LIMBS * 8, W);
36,836✔
50
}
36,836✔
51

52
template <size_t LIMBS, MinWeightPolynomial P>
53
void poly_double_le(uint8_t out[], const uint8_t in[]) {
332,292✔
54
   uint64_t W[LIMBS];
55
   load_le(W, in, LIMBS);
332,292✔
56

57
   const uint64_t POLY = static_cast<uint64_t>(P);
332,292✔
58

59
   const uint64_t carry = POLY * (W[LIMBS - 1] >> 63);
332,292✔
60

61
   if constexpr(LIMBS > 0) {
62
      for(size_t i = 0; i != LIMBS - 1; ++i) {
646,401✔
63
         W[LIMBS - 1 - i] = (W[LIMBS - 1 - i] << 1) ^ (W[LIMBS - 2 - i] >> 63);
347,451✔
64
      }
65
   }
66

67
   W[0] = (W[0] << 1) ^ carry;
332,292✔
68

69
   copy_out_le(out, LIMBS * 8, W);
332,292✔
70
}
332,292✔
71

72
}  // namespace
73

74
void poly_double_n(uint8_t out[], const uint8_t in[], size_t n) {
36,836✔
75
   switch(n) {
36,836✔
76
      case 8:
3,623✔
77
         return poly_double<1, MinWeightPolynomial::P64>(out, in);
3,623✔
78
      case 16:
16,708✔
79
         return poly_double<2, MinWeightPolynomial::P128>(out, in);
16,708✔
80
      case 24:
5,742✔
81
         return poly_double<3, MinWeightPolynomial::P192>(out, in);
5,742✔
82
      case 32:
5,245✔
83
         return poly_double<4, MinWeightPolynomial::P256>(out, in);
5,245✔
84
      case 64:
3,863✔
85
         return poly_double<8, MinWeightPolynomial::P512>(out, in);
3,863✔
86
      case 128:
1,655✔
87
         return poly_double<16, MinWeightPolynomial::P1024>(out, in);
1,655✔
88
      default:
×
89
         throw Invalid_Argument("Unsupported size for poly_double_n");
×
90
   }
91
}
92

93
void poly_double_n_le(uint8_t out[], const uint8_t in[], size_t n) {
332,292✔
94
   switch(n) {
332,292✔
95
      case 8:
33,342✔
96
         return poly_double_le<1, MinWeightPolynomial::P64>(out, in);
365,634✔
97
      case 16:
288,534✔
98
         return poly_double_le<2, MinWeightPolynomial::P128>(out, in);
288,534✔
99
      case 24:
3,091✔
100
         return poly_double_le<3, MinWeightPolynomial::P192>(out, in);
3,091✔
101
      case 32:
3,099✔
102
         return poly_double_le<4, MinWeightPolynomial::P256>(out, in);
3,099✔
103
      case 64:
2,494✔
104
         return poly_double_le<8, MinWeightPolynomial::P512>(out, in);
2,494✔
105
      case 128:
1,732✔
106
         return poly_double_le<16, MinWeightPolynomial::P1024>(out, in);
1,732✔
107
      default:
×
108
         throw Invalid_Argument("Unsupported size for poly_double_n_le");
×
109
   }
110
}
111

112
}  // namespace Botan
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc