diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib/libcrypto/bn/bn_convert.c | 64 |
1 files changed, 16 insertions, 48 deletions
diff --git a/src/lib/libcrypto/bn/bn_convert.c b/src/lib/libcrypto/bn/bn_convert.c index 5c3c98b787..0bfb00e958 100644 --- a/src/lib/libcrypto/bn/bn_convert.c +++ b/src/lib/libcrypto/bn/bn_convert.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: bn_convert.c,v 1.18 2024/04/16 13:14:46 jsing Exp $ */ | 1 | /* $OpenBSD: bn_convert.c,v 1.19 2024/04/17 14:45:46 jsing Exp $ */ |
| 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) |
| 3 | * All rights reserved. | 3 | * All rights reserved. |
| 4 | * | 4 | * |
| @@ -154,7 +154,7 @@ BN_bn2binpad(const BIGNUM *a, unsigned char *to, int tolen) | |||
| 154 | LCRYPTO_ALIAS(BN_bn2binpad); | 154 | LCRYPTO_ALIAS(BN_bn2binpad); |
| 155 | 155 | ||
| 156 | static int | 156 | static int |
| 157 | bn_bin2bn_cbs(BIGNUM **bnp, CBS *cbs) | 157 | bn_bin2bn_cbs(BIGNUM **bnp, CBS *cbs, int lebin) |
| 158 | { | 158 | { |
| 159 | BIGNUM *bn = NULL; | 159 | BIGNUM *bn = NULL; |
| 160 | BN_ULONG w; | 160 | BN_ULONG w; |
| @@ -173,8 +173,13 @@ bn_bin2bn_cbs(BIGNUM **bnp, CBS *cbs) | |||
| 173 | w = 0; | 173 | w = 0; |
| 174 | 174 | ||
| 175 | while (CBS_len(cbs) > 0) { | 175 | while (CBS_len(cbs) > 0) { |
| 176 | if (!CBS_get_last_u8(cbs, &v)) | 176 | if (lebin) { |
| 177 | goto err; | 177 | if (!CBS_get_u8(cbs, &v)) |
| 178 | goto err; | ||
| 179 | } else { | ||
| 180 | if (!CBS_get_last_u8(cbs, &v)) | ||
| 181 | goto err; | ||
| 182 | } | ||
| 178 | 183 | ||
| 179 | w |= (BN_ULONG)v << b; | 184 | w |= (BN_ULONG)v << b; |
| 180 | b += 8; | 185 | b += 8; |
| @@ -212,7 +217,7 @@ BN_bin2bn(const unsigned char *d, int len, BIGNUM *bn) | |||
| 212 | 217 | ||
| 213 | CBS_init(&cbs, d, len); | 218 | CBS_init(&cbs, d, len); |
| 214 | 219 | ||
| 215 | if (!bn_bin2bn_cbs(&bn, &cbs)) | 220 | if (!bn_bin2bn_cbs(&bn, &cbs, 0)) |
| 216 | return NULL; | 221 | return NULL; |
| 217 | 222 | ||
| 218 | return bn; | 223 | return bn; |
| @@ -230,56 +235,19 @@ BN_bn2lebinpad(const BIGNUM *a, unsigned char *to, int tolen) | |||
| 230 | LCRYPTO_ALIAS(BN_bn2lebinpad); | 235 | LCRYPTO_ALIAS(BN_bn2lebinpad); |
| 231 | 236 | ||
| 232 | BIGNUM * | 237 | BIGNUM * |
| 233 | BN_lebin2bn(const unsigned char *s, int len, BIGNUM *ret) | 238 | BN_lebin2bn(const unsigned char *d, int len, BIGNUM *bn) |
| 234 | { | 239 | { |
| 235 | unsigned int i, m, n; | 240 | CBS cbs; |
| 236 | BN_ULONG l; | ||
| 237 | BIGNUM *bn = NULL; | ||
| 238 | 241 | ||
| 239 | if (ret == NULL) | 242 | if (len < 0) |
| 240 | ret = bn = BN_new(); | ||
| 241 | if (ret == NULL) | ||
| 242 | return NULL; | 243 | return NULL; |
| 243 | 244 | ||
| 245 | CBS_init(&cbs, d, len); | ||
| 244 | 246 | ||
| 245 | s += len; | 247 | if (!bn_bin2bn_cbs(&bn, &cbs, 1)) |
| 246 | /* Skip trailing zeroes. */ | ||
| 247 | for (; len > 0 && s[-1] == 0; s--, len--) | ||
| 248 | continue; | ||
| 249 | |||
| 250 | n = len; | ||
| 251 | if (n == 0) { | ||
| 252 | ret->top = 0; | ||
| 253 | return ret; | ||
| 254 | } | ||
| 255 | |||
| 256 | i = ((n - 1) / BN_BYTES) + 1; | ||
| 257 | m = (n - 1) % BN_BYTES; | ||
| 258 | if (!bn_wexpand(ret, (int)i)) { | ||
| 259 | BN_free(bn); | ||
| 260 | return NULL; | 248 | return NULL; |
| 261 | } | ||
| 262 | |||
| 263 | ret->top = i; | ||
| 264 | ret->neg = 0; | ||
| 265 | l = 0; | ||
| 266 | while (n-- > 0) { | ||
| 267 | s--; | ||
| 268 | l = (l << 8L) | *s; | ||
| 269 | if (m-- == 0) { | ||
| 270 | ret->d[--i] = l; | ||
| 271 | l = 0; | ||
| 272 | m = BN_BYTES - 1; | ||
| 273 | } | ||
| 274 | } | ||
| 275 | 249 | ||
| 276 | /* | 250 | return bn; |
| 277 | * need to call this due to clear byte at top if avoiding having the | ||
| 278 | * top bit set (-ve number) | ||
| 279 | */ | ||
| 280 | bn_correct_top(ret); | ||
| 281 | |||
| 282 | return ret; | ||
| 283 | } | 251 | } |
| 284 | LCRYPTO_ALIAS(BN_lebin2bn); | 252 | LCRYPTO_ALIAS(BN_lebin2bn); |
| 285 | 253 | ||
