| OLD | NEW |
| 1 /* crypto/asn1/a_bitstr.c */ | 1 /* crypto/asn1/a_bitstr.c */ |
| 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 * |
| 5 * This package is an SSL implementation written | 5 * This package is an SSL implementation written |
| 6 * by Eric Young (eay@cryptsoft.com). | 6 * by Eric Young (eay@cryptsoft.com). |
| 7 * The implementation was written so as to conform with Netscapes SSL. | 7 * The implementation was written so as to conform with Netscapes SSL. |
| 8 * | 8 * |
| 9 * This library is free for commercial and non-commercial use as long as | 9 * This library is free for commercial and non-commercial use as long as |
| 10 * the following conditions are aheared to. The following conditions | 10 * the following conditions are aheared to. The following conditions |
| (...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 216 { | 216 { |
| 217 int w,v; | 217 int w,v; |
| 218 | 218 |
| 219 w=n/8; | 219 w=n/8; |
| 220 v=1<<(7-(n&0x07)); | 220 v=1<<(7-(n&0x07)); |
| 221 if ((a == NULL) || (a->length < (w+1)) || (a->data == NULL)) | 221 if ((a == NULL) || (a->length < (w+1)) || (a->data == NULL)) |
| 222 return(0); | 222 return(0); |
| 223 return((a->data[w]&v) != 0); | 223 return((a->data[w]&v) != 0); |
| 224 } | 224 } |
| 225 | 225 |
| 226 /* |
| 227 * Checks if the given bit string contains only bits specified by |
| 228 * the flags vector. Returns 0 if there is at least one bit set in 'a' |
| 229 * which is not specified in 'flags', 1 otherwise. |
| 230 * 'len' is the length of 'flags'. |
| 231 */ |
| 232 int ASN1_BIT_STRING_check(ASN1_BIT_STRING *a, |
| 233 unsigned char *flags, int flags_len) |
| 234 { |
| 235 int i, ok; |
| 236 /* Check if there is one bit set at all. */ |
| 237 if (!a || !a->data) return 1; |
| 238 |
| 239 /* Check each byte of the internal representation of the bit string. */ |
| 240 ok = 1; |
| 241 for (i = 0; i < a->length && ok; ++i) |
| 242 { |
| 243 unsigned char mask = i < flags_len ? ~flags[i] : 0xff; |
| 244 /* We are done if there is an unneeded bit set. */ |
| 245 ok = (a->data[i] & mask) == 0; |
| 246 } |
| 247 return ok; |
| 248 } |
| OLD | NEW |