diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib/libcrypto/asn1/a_bitstr.c | 40 |
1 files changed, 26 insertions, 14 deletions
diff --git a/src/lib/libcrypto/asn1/a_bitstr.c b/src/lib/libcrypto/asn1/a_bitstr.c index 7ea3e12b91..851a3a3d51 100644 --- a/src/lib/libcrypto/asn1/a_bitstr.c +++ b/src/lib/libcrypto/asn1/a_bitstr.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: a_bitstr.c,v 1.41 2023/07/28 10:33:13 tb Exp $ */ | 1 | /* $OpenBSD: a_bitstr.c,v 1.42 2023/12/25 22:02:59 tb 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 | * |
| @@ -120,20 +120,24 @@ ASN1_BIT_STRING_set_bit(ASN1_BIT_STRING *a, int n, int value) | |||
| 120 | int w, v, iv; | 120 | int w, v, iv; |
| 121 | unsigned char *c; | 121 | unsigned char *c; |
| 122 | 122 | ||
| 123 | w = n/8; | 123 | if (a == NULL) |
| 124 | return 0; | ||
| 125 | if (n < 0) | ||
| 126 | return 0; | ||
| 127 | |||
| 128 | w = n / 8; | ||
| 124 | v = 1 << (7 - (n & 0x07)); | 129 | v = 1 << (7 - (n & 0x07)); |
| 125 | iv = ~v; | 130 | iv = ~v; |
| 126 | if (!value) | ||
| 127 | v = 0; | ||
| 128 | 131 | ||
| 129 | if (a == NULL) | 132 | if (value == 0) |
| 130 | return 0; | 133 | v = 0; |
| 131 | 134 | ||
| 132 | asn1_abs_clear_unused_bits(a); | 135 | asn1_abs_clear_unused_bits(a); |
| 133 | 136 | ||
| 134 | if ((a->length < (w + 1)) || (a->data == NULL)) { | 137 | if (a->length < w + 1 || a->data == NULL) { |
| 135 | if (!value) | 138 | /* Don't expand if there's no bit to set. */ |
| 136 | return(1); /* Don't need to set */ | 139 | if (value == 0) |
| 140 | return 1; | ||
| 137 | if ((c = recallocarray(a->data, a->length, w + 1, 1)) == NULL) { | 141 | if ((c = recallocarray(a->data, a->length, w + 1, 1)) == NULL) { |
| 138 | ASN1error(ERR_R_MALLOC_FAILURE); | 142 | ASN1error(ERR_R_MALLOC_FAILURE); |
| 139 | return 0; | 143 | return 0; |
| @@ -141,11 +145,12 @@ ASN1_BIT_STRING_set_bit(ASN1_BIT_STRING *a, int n, int value) | |||
| 141 | a->data = c; | 145 | a->data = c; |
| 142 | a->length = w + 1; | 146 | a->length = w + 1; |
| 143 | } | 147 | } |
| 148 | |||
| 144 | a->data[w] = ((a->data[w]) & iv) | v; | 149 | a->data[w] = ((a->data[w]) & iv) | v; |
| 145 | while ((a->length > 0) && (a->data[a->length - 1] == 0)) | 150 | while (a->length > 0 && a->data[a->length - 1] == 0) |
| 146 | a->length--; | 151 | a->length--; |
| 147 | 152 | ||
| 148 | return (1); | 153 | return 1; |
| 149 | } | 154 | } |
| 150 | LCRYPTO_ALIAS(ASN1_BIT_STRING_set_bit); | 155 | LCRYPTO_ALIAS(ASN1_BIT_STRING_set_bit); |
| 151 | 156 | ||
| @@ -154,11 +159,18 @@ ASN1_BIT_STRING_get_bit(const ASN1_BIT_STRING *a, int n) | |||
| 154 | { | 159 | { |
| 155 | int w, v; | 160 | int w, v; |
| 156 | 161 | ||
| 162 | if (a == NULL) | ||
| 163 | return 0; | ||
| 164 | if (n < 0) | ||
| 165 | return 0; | ||
| 166 | |||
| 157 | w = n / 8; | 167 | w = n / 8; |
| 158 | v = 1 << (7 - (n & 0x07)); | 168 | v = 1 << (7 - (n & 0x07)); |
| 159 | if ((a == NULL) || (a->length < (w + 1)) || (a->data == NULL)) | 169 | |
| 160 | return (0); | 170 | if (a->length < w + 1 || a->data == NULL) |
| 161 | return ((a->data[w] & v) != 0); | 171 | return 0; |
| 172 | |||
| 173 | return (a->data[w] & v) != 0; | ||
| 162 | } | 174 | } |
| 163 | LCRYPTO_ALIAS(ASN1_BIT_STRING_get_bit); | 175 | LCRYPTO_ALIAS(ASN1_BIT_STRING_get_bit); |
| 164 | 176 | ||
