Mercurial > dropbear
comparison libtommath/bn_mp_unpack.c @ 1733:d529a52b2f7c coverity coverity
merge coverity from main
author | Matt Johnston <matt@ucc.asn.au> |
---|---|
date | Fri, 26 Jun 2020 21:07:34 +0800 |
parents | 1051e4eea25a |
children |
comparison
equal
deleted
inserted
replaced
1643:b59623a64678 | 1733:d529a52b2f7c |
---|---|
1 #include "tommath_private.h" | |
2 #ifdef BN_MP_UNPACK_C | |
3 /* LibTomMath, multiple-precision integer library -- Tom St Denis */ | |
4 /* SPDX-License-Identifier: Unlicense */ | |
5 | |
6 /* based on gmp's mpz_import. | |
7 * see http://gmplib.org/manual/Integer-Import-and-Export.html | |
8 */ | |
9 mp_err mp_unpack(mp_int *rop, size_t count, mp_order order, size_t size, | |
10 mp_endian endian, size_t nails, const void *op) | |
11 { | |
12 mp_err err; | |
13 size_t odd_nails, nail_bytes, i, j; | |
14 unsigned char odd_nail_mask; | |
15 | |
16 mp_zero(rop); | |
17 | |
18 if (endian == MP_NATIVE_ENDIAN) { | |
19 MP_GET_ENDIANNESS(endian); | |
20 } | |
21 | |
22 odd_nails = (nails % 8u); | |
23 odd_nail_mask = 0xff; | |
24 for (i = 0; i < odd_nails; ++i) { | |
25 odd_nail_mask ^= (unsigned char)(1u << (7u - i)); | |
26 } | |
27 nail_bytes = nails / 8u; | |
28 | |
29 for (i = 0; i < count; ++i) { | |
30 for (j = 0; j < (size - nail_bytes); ++j) { | |
31 unsigned char byte = *((const unsigned char *)op + | |
32 (((order == MP_MSB_FIRST) ? i : ((count - 1u) - i)) * size) + | |
33 ((endian == MP_BIG_ENDIAN) ? (j + nail_bytes) : (((size - 1u) - j) - nail_bytes))); | |
34 | |
35 if ((err = mp_mul_2d(rop, (j == 0u) ? (int)(8u - odd_nails) : 8, rop)) != MP_OKAY) { | |
36 return err; | |
37 } | |
38 | |
39 rop->dp[0] |= (j == 0u) ? (mp_digit)(byte & odd_nail_mask) : (mp_digit)byte; | |
40 rop->used += 1; | |
41 } | |
42 } | |
43 | |
44 mp_clamp(rop); | |
45 | |
46 return MP_OKAY; | |
47 } | |
48 | |
49 #endif |