RFC 3161 compliant time stamp request creation, response generation
[openssl.git] / crypto / asn1 / a_bitstr.c
index 0fb9ce0c2aea189ce384b988361b868d758f9efa..34179960b87aed426902213ab2640ec6f4998d58 100644 (file)
@@ -223,3 +223,26 @@ int ASN1_BIT_STRING_get_bit(ASN1_BIT_STRING *a, int n)
        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;
+       }