API参考
载入中...
搜索中...
未找到
bsl_bytes.h
1/*
2 * This file is part of the openHiTLS project.
3 *
4 * openHiTLS is licensed under the Mulan PSL v2.
5 * You can use this software according to the terms and conditions of the Mulan PSL v2.
6 * You may obtain a copy of Mulan PSL v2 at:
7 *
8 * http://license.coscl.org.cn/MulanPSL2
9 *
10 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
11 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
12 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
13 * See the Mulan PSL v2 for more details.
14 */
15
16#ifndef BSL_BYTES_H
17#define BSL_BYTES_H
18
19#include <stdint.h>
20
21#ifdef __cplusplus
22extern "C" {
23#endif
24
34static inline uint16_t BSL_ByteToUint16(const uint8_t *data)
35{
37 return ((uint16_t)data[0] << 8) | ((uint16_t)data[1]);
38}
39
48static inline void BSL_Uint16ToByte(uint16_t num, uint8_t *data)
49{
51 data[0] = (uint8_t)(num >> 8); // data is shifted rightwards by 8 bits and put in byte 0
52 data[1] = (uint8_t)(num & 0xffu); // data AND 0xffu, put in byte 1
53 return;
54}
55
65static inline uint32_t BSL_ByteToUint24(const uint8_t *data)
66{
69 return ((uint32_t)data[0] << 16) | ((uint32_t)data[1] << 8) | ((uint32_t)data[2]);
70}
71
80static inline void BSL_Uint24ToByte(uint32_t num, uint8_t *data)
81{
83 data[0] = (uint8_t)(num >> 16); // data is shifted rightwards by 16 bits and put in byte 0
84 data[1] = (uint8_t)(num >> 8); // data is shifted rightwards by 8 bits and placed in byte 1
85 data[2] = (uint8_t)(num & 0xffu); // data AND 0xffu, put in byte 2
86 return;
87}
88
98static inline uint32_t BSL_ByteToUint32(const uint8_t *data)
99{
102 return ((uint32_t)data[0] << 24) | ((uint32_t)data[1] << 16) | ((uint32_t)data[2] << 8) | ((uint32_t)data[3]);
103}
104
114static inline uint64_t BSL_ByteToUint48(const uint8_t *data)
115{
119 return ((uint64_t)data[0] << 40) | ((uint64_t)data[1] << 32) | ((uint64_t)data[2] << 24) |
120 ((uint64_t)data[3] << 16) | ((uint64_t)data[4] << 8) | ((uint64_t)data[5]);
121}
122
131static inline void BSL_Uint48ToByte(uint64_t num, uint8_t *data)
132{
134 data[0] = (uint8_t)(num >> 40); // data is shifted rightwards by 40 bits and put in byte 0
135 data[1] = (uint8_t)(num >> 32); // data is shifted rightwards by 32 bits and put in byte 1
136 data[2] = (uint8_t)(num >> 24); // data is shifted rightwards by 24 bits and put in byte 2
137 data[3] = (uint8_t)(num >> 16); // data is shifted rightwards by 16 bits and put in byte 3
138 data[4] = (uint8_t)(num >> 8); // data is shifted rightwards by 8 bits and put in byte 4
139 data[5] = (uint8_t)(num & 0xffu); // data AND 0xffu, put in byte 5
140 return;
141}
142
152static inline uint64_t BSL_ByteToUint64(const uint8_t *data)
153{
158 return ((uint64_t)data[0] << 56) | ((uint64_t)data[1] << 48) | ((uint64_t)data[2] << 40) |
159 ((uint64_t)data[3] << 32) | ((uint64_t)data[4] << 24) | ((uint64_t)data[5] << 16) |
160 ((uint64_t)data[6] << 8) | ((uint64_t)data[7]);
161}
162
171static inline void BSL_Uint32ToByte(uint32_t num, uint8_t *data)
172{
174 data[0] = (uint8_t)(num >> 24); // data is shifted rightwards by 24 bits and put in byte 0
175 data[1] = (uint8_t)(num >> 16); // data is shifted rightwards by 16 bits and put in byte 1
176 data[2] = (uint8_t)(num >> 8); // data is shifted rightwards by 8 bits and put in byte 2
177 data[3] = (uint8_t)(num & 0xffu); // data AND 0xffu, put in byte 3
178 return;
179}
180
189static inline void BSL_Uint64ToByte(uint64_t num, uint8_t *data)
190{
192 data[0] = (uint8_t)(num >> 56); // data is shifted rightwards by 56 bits and put in byte 0
193 data[1] = (uint8_t)(num >> 48); // data is shifted rightwards by 48 bits and put in byte 1
194 data[2] = (uint8_t)(num >> 40); // data is shifted rightwards by 40 bits and put in byte 2
195 data[3] = (uint8_t)(num >> 32); // data is shifted rightwards by 32 bits and put in byte 3
196 data[4] = (uint8_t)(num >> 24); // data is shifted rightwards by 24 bits and put in byte 4
197 data[5] = (uint8_t)(num >> 16); // data is shifted rightwards by 16 bits and put in byte 5
198 data[6] = (uint8_t)(num >> 8); // data is shifted rightwards by 8 bits and put in byte 6
199 data[7] = (uint8_t)(num & 0xffu); // data AND 0xffu, put in byte 7
200 return;
201}
202
203// if a's MSB is 0, output 0
204// else if a' MSB is 1 output 0xffffffff
205static inline uint32_t Uint32ConstTimeMsb(uint32_t a)
206{
207 // 31 == (4 * 8 - 1)
208 return 0u - (a >> 31);
209}
210
211// if a is 0, output 0xffffffff, else output 0
212static inline uint32_t Uint32ConstTimeIsZero(uint32_t a)
213{
214 return Uint32ConstTimeMsb(~a & (a - 1));
215}
216
217// if a == b, output 0xffffffff, else output 0
218static inline uint32_t Uint32ConstTimeEqual(uint32_t a, uint32_t b)
219{
220 return Uint32ConstTimeIsZero(a ^ b);
221}
222
223// if mask == 0xffffffff, return a,
224// else if mask == 0, return b
225static inline uint32_t Uint32ConstTimeSelect(uint32_t mask, uint32_t a, uint32_t b)
226{
227 return ((mask) & a) | ((~mask) & b);
228}
229
230static inline uint8_t Uint8ConstTimeSelect(uint32_t mask, uint8_t a, uint8_t b)
231{
232 return (((mask) & a) | ((~mask) & b)) & 0xff;
233}
234
235// if a < b, output 0xffffffff, else output 0
236static inline uint32_t Uint32ConstTimeLt(uint32_t a, uint32_t b)
237{
238 return Uint32ConstTimeMsb(a ^ ((a ^ b) | ((a - b) ^ a)));
239}
240
241// if a >= b, output 0xffffffff, else output 0
242static inline uint32_t Uint32ConstTimeGe(uint32_t a, uint32_t b)
243{
244 return ~Uint32ConstTimeLt(a, b);
245}
246
247// if a > b, output 0xffffffff, else output 0
248static inline uint32_t Uint32ConstTimeGt(uint32_t a, uint32_t b)
249{
250 return Uint32ConstTimeLt(b, a);
251}
252
253// if a <= b, output 0xffffffff, else output 0
254static inline uint32_t Uint32ConstTimeLe(uint32_t a, uint32_t b)
255{
256 return Uint32ConstTimeGe(b, a);
257}
258
259// if a == b, return 0xffffffff, else return 0
260static inline uint32_t ConstTimeMemcmp(const uint8_t *a, const uint8_t *b, uint32_t l)
261{
262 uint8_t r = 0;
263 for (uint32_t i = 0; i < l; i++) {
264 r |= a[i] ^ b[i];
265 }
266 return Uint32ConstTimeIsZero(r);
267}
268
269#ifdef __cplusplus
270}
271#endif /* __cplusplus */
272
273#endif // BSL_BYTES_H