Index: openssl/crypto/asn1/a_bitstr.c |
=================================================================== |
--- openssl/crypto/asn1/a_bitstr.c (revision 105093) |
+++ openssl/crypto/asn1/a_bitstr.c (working copy) |
@@ -223,3 +223,26 @@ |
return((a->data[w]&v) != 0); |
} |
+/* |
+ * Checks if the given bit string contains only bits specified by |
+ * the flags vector. Returns 0 if there is at least one bit set in 'a' |
+ * which is not specified in 'flags', 1 otherwise. |
+ * 'len' is the length of 'flags'. |
+ */ |
+int ASN1_BIT_STRING_check(ASN1_BIT_STRING *a, |
+ unsigned char *flags, int flags_len) |
+ { |
+ int i, ok; |
+ /* Check if there is one bit set at all. */ |
+ if (!a || !a->data) return 1; |
+ |
+ /* Check each byte of the internal representation of the bit string. */ |
+ ok = 1; |
+ for (i = 0; i < a->length && ok; ++i) |
+ { |
+ unsigned char mask = i < flags_len ? ~flags[i] : 0xff; |
+ /* We are done if there is an unneeded bit set. */ |
+ ok = (a->data[i] & mask) == 0; |
+ } |
+ return ok; |
+ } |