ec_misc.h
Go to the documentation of this file.
1 /**
2  * @file ec_misc.h
3  * @brief Helper routines for ECC
4  *
5  * @section License
6  *
7  * SPDX-License-Identifier: GPL-2.0-or-later
8  *
9  * Copyright (C) 2010-2025 Oryx Embedded SARL. All rights reserved.
10  *
11  * This file is part of CycloneCRYPTO Open.
12  *
13  * This program is free software; you can redistribute it and/or
14  * modify it under the terms of the GNU General Public License
15  * as published by the Free Software Foundation; either version 2
16  * of the License, or (at your option) any later version.
17  *
18  * This program is distributed in the hope that it will be useful,
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21  * GNU General Public License for more details.
22  *
23  * You should have received a copy of the GNU General Public License
24  * along with this program; if not, write to the Free Software Foundation,
25  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
26  *
27  * @author Oryx Embedded SARL (www.oryx-embedded.com)
28  * @version 2.5.0
29  **/
30 
31 #ifndef _EC_MISC_H
32 #define _EC_MISC_H
33 
34 //Dependencies
35 #include "core/crypto.h"
36 #include "ecc/ec.h"
37 
38 //C++ guard
39 #ifdef __cplusplus
40 extern "C" {
41 #endif
42 
43 
44 /**
45  * @brief Scalar import/export format
46  **/
47 
48 typedef enum
49 {
53 
54 
55 //EC related functions
56 error_t ecScalarImport(uint32_t *r, uint_t n, const uint8_t *input,
57  size_t length, EcScalarFormat format);
58 
59 error_t ecScalarExport(const uint32_t *a, uint_t n, uint8_t *output,
60  size_t length, EcScalarFormat format);
61 
62 uint_t ecScalarGetByteLength(const uint32_t *a, uint_t n);
63 uint_t ecScalarGetBitLength(const uint32_t *a, uint_t n);
64 
65 uint32_t ecScalarGetBitValue(const uint32_t *a, int_t index);
66 
67 int_t ecScalarComp(const uint32_t *a, const uint32_t *b, uint_t n);
68 int_t ecScalarCompInt(const uint32_t *a, uint32_t b, uint_t n);
69 
70 uint32_t ecScalarTestEqual(const uint32_t *a, const uint32_t *b, uint_t n);
71 uint32_t ecScalarTestEqualInt(const uint32_t *a, uint32_t b, uint_t n);
72 
73 uint32_t ecScalarTestNotEqual(const uint32_t *a, const uint32_t *b, uint_t n);
74 uint32_t ecScalarTestNotEqualInt(const uint32_t *a, uint32_t b, uint_t n);
75 
76 void ecScalarSetInt(uint32_t *a, uint32_t b, uint_t n);
77 
78 void ecScalarCopy(uint32_t *a, const uint32_t *b, uint_t n);
79 void ecScalarSwap(uint32_t *a, uint32_t *b, uint32_t c, uint_t n);
80 
81 void ecScalarSelect(uint32_t *r, const uint32_t *a, const uint32_t *b,
82  uint32_t c, uint_t n);
83 
84 error_t ecScalarRand(const EcCurve *curve, uint32_t *r,
85  const PrngAlgo *prngAlgo, void *prngContext);
86 
87 uint32_t ecScalarAdd(uint32_t *r, const uint32_t *a, const uint32_t *b,
88  uint_t n);
89 
90 uint32_t ecScalarAddInt(uint32_t *r, const uint32_t *a, uint32_t b, uint_t n);
91 
92 uint32_t ecScalarSub(uint32_t *r, const uint32_t *a, const uint32_t *b,
93  uint_t n);
94 
95 uint32_t ecScalarSubInt(uint32_t *r, const uint32_t *a, uint32_t b, uint_t n);
96 
97 void ecScalarMul(uint32_t *rl, uint32_t *rh, const uint32_t *a,
98  const uint32_t *b, uint_t n);
99 
100 void ecScalarSqr(uint32_t *r, const uint32_t *a, uint_t n);
101 
102 void ecScalarShiftLeft(uint32_t *r, const uint32_t *a, uint_t k, uint_t n);
103 void ecScalarShiftRight(uint32_t *r, const uint32_t *a, uint_t k, uint_t n);
104 
105 void ecScalarMod(uint32_t *r, const uint32_t *a, uint_t m, const uint32_t *p,
106  uint_t n);
107 
108 void ecScalarAddMod(const EcCurve *curve, uint32_t *r, const uint32_t *a,
109  const uint32_t *b);
110 
111 void ecScalarSubMod(const EcCurve *curve, uint32_t *r, const uint32_t *a,
112  const uint32_t *b);
113 
114 void ecScalarMulMod(const EcCurve *curve, uint32_t *r, const uint32_t *a,
115  const uint32_t *b);
116 
117 void ecScalarSqrMod(const EcCurve *curve, uint32_t *r, const uint32_t *a);
118 
119 void ecScalarPwr2Mod(const EcCurve *curve, uint32_t *r, const uint32_t *a,
120  uint_t n);
121 
122 void ecScalarInvMod(const EcCurve *curve, uint32_t *r, const uint32_t *a);
123 
124 void ecFieldAddMod(const EcCurve *curve, uint32_t *r, const uint32_t *a,
125  const uint32_t *b);
126 
127 void ecFieldSubMod(const EcCurve *curve, uint32_t *r, const uint32_t *a,
128  const uint32_t *b);
129 
130 void ecFieldMulMod(const EcCurve *curve, uint32_t *r, const uint32_t *a,
131  const uint32_t *b);
132 
133 void ecFieldSqrMod(const EcCurve *curve, uint32_t *r, const uint32_t *a);
134 
135 void ecFieldPwr2Mod(const EcCurve *curve, uint32_t *r, const uint32_t *a,
136  uint_t n);
137 
138 void ecFieldInvMod(const EcCurve *curve, uint32_t *r, const uint32_t *a);
139 
140 void ecFieldCanonicalize(const EcCurve *curve, uint32_t *r, const uint32_t *a);
141 
143 
144 void ecZaddu(EcState *state, EcPoint3 *r, EcPoint3 *s, const EcPoint3 *p,
145  const EcPoint3 *q);
146 
147 void ecZaddc(EcState *state, EcPoint3 *r, EcPoint3 *s, const EcPoint3 *p,
148  const EcPoint3 *q);
149 
150 void ecDblu(EcState *state, EcPoint3 *r, EcPoint3 *s, const EcPoint3 *p);
151 void ecTplu(EcState *state, EcPoint3 *r, EcPoint3 *s, const EcPoint3 *p);
152 
153 void ecScalarDump(FILE *stream, const char_t *prepend, const uint32_t *a,
154  uint_t n);
155 
156 //C++ guard
157 #ifdef __cplusplus
158 }
159 #endif
160 
161 #endif
uint32_t ecScalarAdd(uint32_t *r, const uint32_t *a, const uint32_t *b, uint_t n)
Addition of two integers.
Definition: ec_misc.c:651
void ecScalarShiftRight(uint32_t *r, const uint32_t *a, uint_t k, uint_t n)
Right shift operation.
Definition: ec_misc.c:940
uint8_t b
Definition: nbns_common.h:104
void ecScalarSubMod(const EcCurve *curve, uint32_t *r, const uint32_t *a, const uint32_t *b)
Modular subtraction.
Definition: ec_misc.c:1088
uint32_t ecScalarTestEqualInt(const uint32_t *a, uint32_t b, uint_t n)
Test if two integers are equal.
Definition: ec_misc.c:435
uint8_t a
Definition: ndp.h:411
signed int int_t
Definition: compiler_port.h:56
void ecScalarInvMod(const EcCurve *curve, uint32_t *r, const uint32_t *a)
Modular inversion.
Definition: ec_misc.c:1181
void ecFieldPwr2Mod(const EcCurve *curve, uint32_t *r, const uint32_t *a, uint_t n)
Raise an integer to power 2^n.
Definition: ec_misc.c:1331
#define PrngAlgo
Definition: crypto.h:973
void ecScalarAddMod(const EcCurve *curve, uint32_t *r, const uint32_t *a, const uint32_t *b)
Modular addition.
Definition: ec_misc.c:1062
uint32_t ecScalarTestNotEqualInt(const uint32_t *a, uint32_t b, uint_t n)
Test if two integers are different.
Definition: ec_misc.c:478
uint8_t p
Definition: ndp.h:300
uint32_t ecScalarTestEqual(const uint32_t *a, const uint32_t *b, uint_t n)
Test if two integers are equal.
Definition: ec_misc.c:420
uint8_t t
Definition: lldp_ext_med.h:212
void ecScalarMul(uint32_t *rl, uint32_t *rh, const uint32_t *a, const uint32_t *b, uint_t n)
Multiplication of two integers.
Definition: ec_misc.c:766
uint32_t ecScalarAddInt(uint32_t *r, const uint32_t *a, uint32_t b, uint_t n)
Addition of two integers.
Definition: ec_misc.c:680
uint8_t r
Definition: ndp.h:346
error_t ecScalarExport(const uint32_t *a, uint_t n, uint8_t *output, size_t length, EcScalarFormat format)
Integer to octet string conversion.
Definition: ec_misc.c:150
void ecFieldCanonicalize(const EcCurve *curve, uint32_t *r, const uint32_t *a)
Reduce non-canonical value.
Definition: ec_misc.c:1405
void ecZaddc(EcState *state, EcPoint3 *r, EcPoint3 *s, const EcPoint3 *p, const EcPoint3 *q)
Conjugate co-Z addition.
Definition: ec_misc.c:1535
uint_t ecTwinMulF(uint_t t)
An auxiliary function for the twin multiplication.
Definition: ec_misc.c:1426
void ecZaddu(EcState *state, EcPoint3 *r, EcPoint3 *s, const EcPoint3 *p, const EcPoint3 *q)
Co-Z addition with update.
Definition: ec_misc.c:1466
error_t
Error codes.
Definition: error.h:43
error_t ecScalarRand(const EcCurve *curve, uint32_t *r, const PrngAlgo *prngAlgo, void *prngContext)
Generate a random value.
Definition: ec_misc.c:603
uint_t ecScalarGetBitLength(const uint32_t *a, uint_t n)
Get the actual length in bits.
Definition: ec_misc.c:273
void ecFieldSubMod(const EcCurve *curve, uint32_t *r, const uint32_t *a, const uint32_t *b)
Modular subtraction.
Definition: ec_misc.c:1261
void ecFieldAddMod(const EcCurve *curve, uint32_t *r, const uint32_t *a, const uint32_t *b)
Modular addition.
Definition: ec_misc.c:1235
error_t ecScalarImport(uint32_t *r, uint_t n, const uint8_t *input, size_t length, EcScalarFormat format)
Octet string to integer conversion.
Definition: ec_misc.c:54
void ecFieldMulMod(const EcCurve *curve, uint32_t *r, const uint32_t *a, const uint32_t *b)
Modular multiplication.
Definition: ec_misc.c:1286
void ecScalarSwap(uint32_t *a, uint32_t *b, uint32_t c, uint_t n)
Conditional swap.
Definition: ec_misc.c:547
uint32_t ecScalarTestNotEqual(const uint32_t *a, const uint32_t *b, uint_t n)
Test if two integers are different.
Definition: ec_misc.c:450
int_t ecScalarCompInt(const uint32_t *a, uint32_t b, uint_t n)
Compare integers.
Definition: ec_misc.c:374
void ecScalarMulMod(const EcCurve *curve, uint32_t *r, const uint32_t *a, const uint32_t *b)
Modular multiplication.
Definition: ec_misc.c:1113
@ EC_SCALAR_FORMAT_LITTLE_ENDIAN
Definition: ec_misc.h:50
General definitions for cryptographic algorithms.
uint32_t ecScalarGetBitValue(const uint32_t *a, int_t index)
Get the bit value at the specified index.
Definition: ec_misc.c:315
uint8_t length
Definition: tcp.h:375
void ecDblu(EcState *state, EcPoint3 *r, EcPoint3 *s, const EcPoint3 *p)
Co-Z doubling with update.
Definition: ec_misc.c:1625
void ecScalarDump(FILE *stream, const char_t *prepend, const uint32_t *a, uint_t n)
Display the contents of an integer.
Definition: ec_misc.c:1717
void ecTplu(EcState *state, EcPoint3 *r, EcPoint3 *s, const EcPoint3 *p)
Co-Z tripling with update.
Definition: ec_misc.c:1700
void ecScalarMod(uint32_t *r, const uint32_t *a, uint_t m, const uint32_t *p, uint_t n)
Modulo operation.
Definition: ec_misc.c:1009
void ecScalarSqr(uint32_t *r, const uint32_t *a, uint_t n)
Squaring operation.
Definition: ec_misc.c:832
uint_t ecScalarGetByteLength(const uint32_t *a, uint_t n)
Get the actual length in bytes.
Definition: ec_misc.c:231
char char_t
Definition: compiler_port.h:55
int_t ecScalarComp(const uint32_t *a, const uint32_t *b, uint_t n)
Compare integers.
Definition: ec_misc.c:337
uint32_t ecScalarSubInt(uint32_t *r, const uint32_t *a, uint32_t b, uint_t n)
Subtraction of two integers.
Definition: ec_misc.c:736
Working state (point addition/subtraction/doubling)
Definition: ec.h:445
uint8_t m
Definition: ndp.h:304
uint8_t n
@ EC_SCALAR_FORMAT_BIG_ENDIAN
Definition: ec_misc.h:51
void ecScalarCopy(uint32_t *a, const uint32_t *b, uint_t n)
Copy an integer.
Definition: ec_misc.c:527
EC point (projective coordinates)
Definition: ec.h:409
void ecFieldSqrMod(const EcCurve *curve, uint32_t *r, const uint32_t *a)
Modular squaring.
Definition: ec_misc.c:1308
uint8_t s
Definition: igmp_common.h:234
uint32_t ecScalarSub(uint32_t *r, const uint32_t *a, const uint32_t *b, uint_t n)
Subtraction of two integers.
Definition: ec_misc.c:707
void ecScalarSetInt(uint32_t *a, uint32_t b, uint_t n)
Set integer value.
Definition: ec_misc.c:505
void ecScalarShiftLeft(uint32_t *r, const uint32_t *a, uint_t k, uint_t n)
Left shift operation.
Definition: ec_misc.c:884
#define EcCurve
Definition: ec.h:346
unsigned int uint_t
Definition: compiler_port.h:57
void ecScalarSqrMod(const EcCurve *curve, uint32_t *r, const uint32_t *a)
Modular squaring.
Definition: ec_misc.c:1135
void ecScalarPwr2Mod(const EcCurve *curve, uint32_t *r, const uint32_t *a, uint_t n)
Raise an integer to power 2^n.
Definition: ec_misc.c:1158
ECC (Elliptic Curve Cryptography)
uint8_t c
Definition: ndp.h:514
EcScalarFormat
Scalar import/export format.
Definition: ec_misc.h:49
void ecScalarSelect(uint32_t *r, const uint32_t *a, const uint32_t *b, uint32_t c, uint_t n)
Select an integer.
Definition: ec_misc.c:576
void ecFieldInvMod(const EcCurve *curve, uint32_t *r, const uint32_t *a)
Modular inversion.
Definition: ec_misc.c:1354