Line data Source code
1 : #include "tommath_private.h"
2 : #ifdef BN_MP_TO_UBIN_C
3 : /* LibTomMath, multiple-precision integer library -- Tom St Denis */
4 : /* SPDX-License-Identifier: Unlicense */
5 :
6 : /* store in unsigned [big endian] format */
7 153 : mp_err mp_to_ubin(const mp_int *a, unsigned char *buf, size_t maxlen, size_t *written)
8 : {
9 : size_t x, count;
10 : mp_err err;
11 : mp_int t;
12 :
13 153 : count = mp_ubin_size(a);
14 153 : if (count > maxlen) {
15 0 : return MP_BUF;
16 : }
17 :
18 153 : if ((err = mp_init_copy(&t, a)) != MP_OKAY) {
19 0 : return err;
20 : }
21 :
22 49036 : for (x = count; x --> 0u;) {
23 : #ifndef MP_8BIT
24 48730 : buf[x] = (unsigned char)(t.dp[0] & 255u);
25 : #else
26 : buf[x] = (unsigned char)(t.dp[0] | ((t.dp[1] & 1u) << 7));
27 : #endif
28 48730 : if ((err = mp_div_2d(&t, 8, &t, NULL)) != MP_OKAY) {
29 0 : goto LBL_ERR;
30 : }
31 : }
32 :
33 153 : if (written != NULL) {
34 0 : *written = count;
35 : }
36 :
37 306 : LBL_ERR:
38 153 : mp_clear(&t);
39 153 : return err;
40 : }
41 : #endif
|