/src/botan/build/include/internal/botan/internal/ec_inner_bn.h
Line | Count | Source |
1 | | /* |
2 | | * (C) 2024 Jack Lloyd |
3 | | * |
4 | | * Botan is released under the Simplified BSD License (see license.txt) |
5 | | */ |
6 | | |
7 | | #ifndef BOTAN_EC_INNER_DATA_BN_H_ |
8 | | #define BOTAN_EC_INNER_DATA_BN_H_ |
9 | | |
10 | | #include <botan/internal/ec_inner_data.h> |
11 | | #include <botan/internal/point_mul.h> |
12 | | |
13 | | namespace Botan { |
14 | | |
15 | | class EC_Scalar_Data_BN final : public EC_Scalar_Data { |
16 | | public: |
17 | | EC_Scalar_Data_BN(std::shared_ptr<const EC_Group_Data> group, BigInt v) : |
18 | 3.25k | m_group(std::move(group)), m_v(std::move(v)) {} |
19 | | |
20 | | static const EC_Scalar_Data_BN& checked_ref(const EC_Scalar_Data& data); |
21 | | |
22 | | const std::shared_ptr<const EC_Group_Data>& group() const override; |
23 | | |
24 | | std::unique_ptr<EC_Scalar_Data> clone() const override; |
25 | | |
26 | | size_t bytes() const override; |
27 | | |
28 | | bool is_zero() const override; |
29 | | |
30 | | bool is_eq(const EC_Scalar_Data& y) const override; |
31 | | |
32 | | void assign(const EC_Scalar_Data& y) override; |
33 | | |
34 | | void square_self() override; |
35 | | |
36 | | std::unique_ptr<EC_Scalar_Data> negate() const override; |
37 | | |
38 | | std::unique_ptr<EC_Scalar_Data> invert() const override; |
39 | | |
40 | | std::unique_ptr<EC_Scalar_Data> add(const EC_Scalar_Data& other) const override; |
41 | | |
42 | | std::unique_ptr<EC_Scalar_Data> sub(const EC_Scalar_Data& other) const override; |
43 | | |
44 | | std::unique_ptr<EC_Scalar_Data> mul(const EC_Scalar_Data& other) const override; |
45 | | |
46 | | void serialize_to(std::span<uint8_t> bytes) const override; |
47 | | |
48 | 3.46k | const BigInt& value() const { return m_v; } |
49 | | |
50 | | private: |
51 | | std::shared_ptr<const EC_Group_Data> m_group; |
52 | | BigInt m_v; |
53 | | }; |
54 | | |
55 | | class EC_AffinePoint_Data_BN final : public EC_AffinePoint_Data { |
56 | | public: |
57 | | EC_AffinePoint_Data_BN(std::shared_ptr<const EC_Group_Data> group, EC_Point pt); |
58 | | |
59 | | EC_AffinePoint_Data_BN(std::shared_ptr<const EC_Group_Data> group, std::span<const uint8_t> pt); |
60 | | |
61 | | const std::shared_ptr<const EC_Group_Data>& group() const override; |
62 | | |
63 | | std::unique_ptr<EC_AffinePoint_Data> clone() const override; |
64 | | |
65 | | size_t field_element_bytes() const override; |
66 | | |
67 | | bool is_identity() const override; |
68 | | |
69 | | void serialize_x_to(std::span<uint8_t> bytes) const override; |
70 | | |
71 | | void serialize_y_to(std::span<uint8_t> bytes) const override; |
72 | | |
73 | | void serialize_xy_to(std::span<uint8_t> bytes) const override; |
74 | | |
75 | | void serialize_compressed_to(std::span<uint8_t> bytes) const override; |
76 | | |
77 | | void serialize_uncompressed_to(std::span<uint8_t> bytes) const override; |
78 | | |
79 | | std::unique_ptr<EC_AffinePoint_Data> mul(const EC_Scalar_Data& scalar, |
80 | | RandomNumberGenerator& rng, |
81 | | std::vector<BigInt>& ws) const override; |
82 | | |
83 | 1.47k | EC_Point to_legacy_point() const override { return m_pt; } |
84 | | |
85 | | private: |
86 | | std::shared_ptr<const EC_Group_Data> m_group; |
87 | | EC_Point m_pt; |
88 | | secure_vector<uint8_t> m_xy; // empty if point is identity element |
89 | | }; |
90 | | |
91 | | class EC_Mul2Table_Data_BN final : public EC_Mul2Table_Data { |
92 | | public: |
93 | | EC_Mul2Table_Data_BN(const EC_AffinePoint_Data& g, const EC_AffinePoint_Data& h); |
94 | | |
95 | | std::unique_ptr<EC_AffinePoint_Data> mul2_vartime(const EC_Scalar_Data& x, |
96 | | const EC_Scalar_Data& y) const override; |
97 | | |
98 | | bool mul2_vartime_x_mod_order_eq(const EC_Scalar_Data& v, |
99 | | const EC_Scalar_Data& x, |
100 | | const EC_Scalar_Data& y) const override; |
101 | | |
102 | | private: |
103 | | std::shared_ptr<const EC_Group_Data> m_group; |
104 | | EC_Point_Multi_Point_Precompute m_tbl; |
105 | | }; |
106 | | |
107 | | } // namespace Botan |
108 | | |
109 | | #endif |