Skip to content

Commit 0ea2ffd

Browse files
Add support for using the 32 bit optimized HACL code. (#279)
* Add support for using the 32 bit optimized HACL code. * Remove comment. * fixed allocation for alloca inside of loops * A bit of cleanup. Co-authored-by: Steve Maier <ysfred4@hotmail.com>
1 parent 32b5589 commit 0ea2ffd

File tree

5 files changed

+483
-461
lines changed

5 files changed

+483
-461
lines changed

src/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,8 @@ set(PROJECT_SOURCE_FILES
8282
${PROJECT_SOURCE_DIR}/src/karamel/Hacl_Bignum4096.h
8383
${PROJECT_SOURCE_DIR}/src/karamel/Hacl_Bignum4096_32.c
8484
${PROJECT_SOURCE_DIR}/src/karamel/Hacl_Bignum4096_32.h
85+
${PROJECT_SOURCE_DIR}/src/karamel/Hacl_GenericField32.c
86+
${PROJECT_SOURCE_DIR}/src/karamel/Hacl_GenericField32.h
8587
${PROJECT_SOURCE_DIR}/src/karamel/Hacl_GenericField64.c
8688
${PROJECT_SOURCE_DIR}/src/karamel/Hacl_GenericField64.h
8789
${PROJECT_SOURCE_DIR}/src/karamel/Hacl_Hash.c

src/electionguard/facades/Hacl_Bignum4096.cpp

Lines changed: 89 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,102 @@
11
#include "Hacl_Bignum4096.hpp"
22

33
#include "../../karamel/Hacl_Bignum4096.h"
4+
#ifdef _WIN32
5+
#include "../../karamel/Hacl_GenericField32.h"
6+
#endif // _WIN32
47
#include "../../karamel/Hacl_GenericField64.h"
58
#include "../log.hpp"
69

710
using electionguard::Log;
811

912
namespace hacl
1013
{
14+
#ifdef _WIN32
15+
Bignum4096::Bignum4096(uint32_t *elem)
16+
{
17+
HaclBignumContext4096 ctx{Hacl_Bignum4096_32_mont_ctx_init(elem)};
18+
context = std::move(ctx);
19+
}
20+
#else
1121
Bignum4096::Bignum4096(uint64_t *elem)
1222
{
1323
HaclBignumContext4096 ctx{Hacl_Bignum4096_mont_ctx_init(elem)};
1424
context = std::move(ctx);
1525
}
26+
#endif // _WIN32
1627
Bignum4096::~Bignum4096() {}
1728

1829
uint64_t Bignum4096::add(uint64_t *a, uint64_t *b, uint64_t *res)
1930
{
31+
#ifdef _WIN32
32+
return Hacl_Bignum4096_32_add(reinterpret_cast<uint32_t *>(a),
33+
reinterpret_cast<uint32_t *>(b),
34+
reinterpret_cast<uint32_t *>(res));
35+
#else
2036
return Hacl_Bignum4096_add(a, b, res);
37+
#endif // _WIN32
2138
}
2239

2340
uint64_t Bignum4096::sub(uint64_t *a, uint64_t *b, uint64_t *res)
2441
{
42+
#ifdef _WIN32
43+
return Hacl_Bignum4096_32_sub(reinterpret_cast<uint32_t *>(a),
44+
reinterpret_cast<uint32_t *>(b),
45+
reinterpret_cast<uint32_t *>(res));
46+
#else
2547
return Hacl_Bignum4096_sub(a, b, res);
48+
#endif // _WIN32
2649
}
2750

2851
void Bignum4096::mul(uint64_t *a, uint64_t *b, uint64_t *res)
2952
{
53+
#ifdef _WIN32
54+
Hacl_Bignum4096_32_mul(reinterpret_cast<uint32_t *>(a),
55+
reinterpret_cast<uint32_t *>(b),
56+
reinterpret_cast<uint32_t *>(res));
57+
#else
3058
Hacl_Bignum4096_mul(a, b, res);
59+
#endif // _WIN32
3160
}
3261

3362
bool Bignum4096::mod(uint64_t *n, uint64_t *a, uint64_t *res)
3463
{
64+
65+
#ifdef _WIN32
66+
return Hacl_Bignum4096_32_mod(reinterpret_cast<uint32_t *>(n),
67+
reinterpret_cast<uint32_t *>(a),
68+
reinterpret_cast<uint32_t *>(res));
69+
#else
3570
return Hacl_Bignum4096_mod(n, a, res);
71+
#endif // _WIN32
3672
}
3773

3874
bool Bignum4096::modExp(uint64_t *n, uint64_t *a, uint32_t bBits, uint64_t *b, uint64_t *res,
3975
bool useConstTime /* = true */)
40-
{
76+
{
4177
if (bBits <= 0) {
4278
Log::trace("Bignum4096::modExp:: bbits <= 0");
4379
return false;
4480
}
4581
if (useConstTime) {
82+
#ifdef _WIN32
83+
return Hacl_Bignum4096_32_mod_exp_consttime(reinterpret_cast<uint32_t *>(n),
84+
reinterpret_cast<uint32_t *>(a), bBits,
85+
reinterpret_cast<uint32_t *>(b),
86+
reinterpret_cast<uint32_t *>(res));
87+
#else
4688
return Hacl_Bignum4096_mod_exp_consttime(n, a, bBits, b, res);
89+
#endif // WIN32
4790
}
91+
#ifdef _WIN32
92+
return Hacl_Bignum4096_32_mod_exp_vartime(reinterpret_cast<uint32_t *>(n),
93+
reinterpret_cast<uint32_t *>(a),
94+
bBits,
95+
reinterpret_cast<uint32_t *>(b),
96+
reinterpret_cast<uint32_t *>(res));
97+
#else
4898
return Hacl_Bignum4096_mod_exp_vartime(n, a, bBits, b, res);
99+
#endif // _WIN32
49100
}
50101

51102
uint64_t *Bignum4096::fromBytes(uint32_t len, uint8_t *bytes)
@@ -65,7 +116,12 @@ namespace hacl
65116

66117
void Bignum4096::mod(uint64_t *a, uint64_t *res) const
67118
{
119+
#ifdef _WIN32
120+
Hacl_Bignum4096_32_mod_precomp(context.get(), reinterpret_cast<uint32_t *>(a),
121+
reinterpret_cast<uint32_t *>(res));
122+
#else
68123
Hacl_Bignum4096_mod_precomp(context.get(), a, res);
124+
#endif // _WIN32
69125
}
70126

71127
void Bignum4096::modExp(uint64_t *a, uint32_t bBits, uint64_t *b, uint64_t *res,
@@ -76,29 +132,61 @@ namespace hacl
76132
return throw;
77133
}
78134
if (useConstTime) {
135+
#ifdef _WIN32
136+
return Hacl_Bignum4096_32_mod_exp_consttime_precomp(context.get(),
137+
reinterpret_cast<uint32_t *>(a), bBits,
138+
reinterpret_cast<uint32_t *>(b),
139+
reinterpret_cast<uint32_t *>(res));
140+
#else
79141
return Hacl_Bignum4096_mod_exp_consttime_precomp(context.get(), a, bBits, b, res);
142+
#endif // _WIN32
80143
}
144+
#ifdef _WIN32
145+
return Hacl_Bignum4096_32_mod_exp_vartime_precomp(context.get(), reinterpret_cast<uint32_t *>(a),
146+
bBits, reinterpret_cast<uint32_t *>(b),
147+
reinterpret_cast<uint32_t *>(res));
148+
#else
81149
return Hacl_Bignum4096_mod_exp_vartime_precomp(context.get(), a, bBits, b, res);
150+
#endif // _WIN32
82151
}
83152

84153
void Bignum4096::to_montgomery_form(uint64_t *a, uint64_t *aM) const
85154
{
155+
#ifdef _WIN32
156+
Hacl_GenericField32_to_field(context.get(), reinterpret_cast<uint32_t *>(a),
157+
reinterpret_cast<uint32_t *>(aM));
158+
#else
86159
Hacl_GenericField64_to_field(context.get(), a, aM);
160+
#endif // _WIN32
87161
}
88162

89163
void Bignum4096::from_montgomery_form(uint64_t *aM, uint64_t *a) const
90164
{
165+
#ifdef _WIN32
166+
Hacl_GenericField32_from_field(context.get(), reinterpret_cast<uint32_t *>(aM),
167+
reinterpret_cast<uint32_t *>(a));
168+
#else
91169
Hacl_GenericField64_from_field(context.get(), aM, a);
170+
#endif // _WIN32
92171
}
93172

94173
void Bignum4096::montgomery_mod_mul_stay_in_mont_form(uint64_t *aM, uint64_t *bM, uint64_t *cM) const
95174
{
175+
#ifdef _WIN32
176+
Hacl_GenericField32_mul(context.get(), reinterpret_cast<uint32_t *>(aM),
177+
reinterpret_cast<uint32_t *>(bM), reinterpret_cast<uint32_t *>(cM));
178+
#else
96179
Hacl_GenericField64_mul(context.get(), aM, bM, cM);
180+
#endif // _WIN32
97181
}
98182

99183
const Bignum4096 &CONTEXT_P()
100184
{
185+
#ifdef _WIN32
186+
static Bignum4096 instance{(uint32_t*)(P_ARRAY_REVERSE)};
187+
#else
101188
static Bignum4096 instance{const_cast<uint64_t *>(P_ARRAY_REVERSE)};
189+
#endif // _WIN32
102190
return instance;
103191
}
104192
} // namespace hacl

src/electionguard/facades/Hacl_Bignum4096.hpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
#ifndef __FACADES__Hacl_Bignum4096_H_INCLUDED__
22
#define __FACADES__Hacl_Bignum4096_H_INCLUDED__
33

4+
#ifdef _WIN32
5+
#include "../../karamel/Hacl_Bignum4096_32.h"
6+
#endif // _WIN32
47
#include "../../karamel/Hacl_Bignum4096.h"
58
#include "electionguard/export.h"
69

@@ -18,7 +21,11 @@ namespace hacl
1821
class EG_INTERNAL_API Bignum4096
1922
{
2023
public:
24+
#ifdef _WIN32
25+
explicit Bignum4096(uint32_t *elem);
26+
#else
2127
explicit Bignum4096(uint64_t *elem);
28+
#endif // _WIN32
2229
~Bignum4096();
2330

2431
static uint64_t add(uint64_t *a, uint64_t *b, uint64_t *res);
@@ -63,13 +70,25 @@ namespace hacl
6370

6471
private:
6572
struct handle_destructor {
73+
#ifdef _WIN32
74+
void operator()(Hacl_Bignum_MontArithmetic_bn_mont_ctx_u32 *handle) const
75+
{
76+
Hacl_Bignum4096_32_mont_ctx_free(handle);
77+
}
78+
#else
6679
void operator()(Hacl_Bignum_MontArithmetic_bn_mont_ctx_u64 *handle) const
6780
{
6881
Hacl_Bignum4096_mont_ctx_free(handle);
6982
}
83+
#endif // _WIN32
7084
};
85+
#ifdef _WIN32
86+
typedef std::unique_ptr<Hacl_Bignum_MontArithmetic_bn_mont_ctx_u32, handle_destructor>
87+
HaclBignumContext4096;
88+
#else
7189
typedef std::unique_ptr<Hacl_Bignum_MontArithmetic_bn_mont_ctx_u64, handle_destructor>
7290
HaclBignumContext4096;
91+
#endif // _WIN32
7392
HaclBignumContext4096 context;
7493
};
7594

0 commit comments

Comments
 (0)