asn1_node _asn1_set_value_lv (asn1_node node, const void *value, unsigned int len) { int len2; void *temp; if (node == NULL) return node; asn1_length_der (len, NULL, &len2); temp = malloc (len + len2); if (temp == NULL) return NULL; asn1_octet_der (value, len, temp, &len2); return _asn1_set_value_m (node, temp, len2); }
ASN1_TYPE _asn1_set_value_octet (ASN1_TYPE node, const void *value, unsigned int len) { int len2; void *temp; if (node == NULL) return node; asn1_length_der (len, NULL, &len2); temp = (unsigned char *) _asn1_malloc (len + len2); if (temp == NULL) return NULL; asn1_octet_der (value, len, temp, &len2); return _asn1_set_value_m (node, temp, len2); }
bool p11_openssl_canon_string_der (p11_buffer *der) { char *string; size_t length; int output_len; int len_len; bool unknown_string; unsigned char *output; int len; string = p11_x509_parse_directory_string (der->data, der->len, &unknown_string, &length); /* Just pass through all the non-string types */ if (string == NULL) return unknown_string; p11_openssl_canon_string (string, &length); asn1_length_der (length, NULL, &len_len); output_len = 1 + len_len + length; if (!p11_buffer_reset (der, output_len)) return_val_if_reached (false); output = der->data; der->len = output_len; output[0] = 12; /* UTF8String */ len = output_len - 1; asn1_octet_der ((unsigned char *)string, length, output + 1, &len); assert (len == output_len - 1); free (string); return true; }
int main (int argc, char **argv) { /* Test that values larger than long are rejected. This has worked fine with all versions of libtasn1. */ int verbose = 0; if (argc > 1) verbose = 1; { unsigned char der[] = "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"; long l; int len; l = asn1_get_length_der (der, sizeof der, &len); if (l == -2L) { if (verbose) puts ("OK: asn1_get_length_der bignum"); } else { printf ("ERROR: asn1_get_length_der bignum (l %ld len %d)\n", l, len); return 1; } } /* Test that values larger than int but smaller than long are rejected. This limitation was introduced with libtasn1 2.12. */ if (LONG_MAX > INT_MAX) { unsigned long num = ((long) UINT_MAX) << 2; unsigned char der[20]; int der_len; long l; int len; asn1_length_der (num, der, &der_len); l = asn1_get_length_der (der, der_len, &len); if (l == -2L) { if (verbose) puts ("OK: asn1_get_length_der intnum"); } else { printf ("ERROR: asn1_get_length_der intnum (l %ld len %d)\n", l, len); return 1; } } /* Test that values larger than would fit in the input string are rejected. This problem was fixed in libtasn1 2.12. */ { unsigned long num = 64; unsigned char der[20]; int der_len; long l; int len; asn1_length_der (num, der, &der_len); der_len = sizeof (der); l = asn1_get_length_der (der, der_len, &len); if (l == -4L) { if (verbose) puts ("OK: asn1_get_length_der overflow-small"); } else { printf ("ERROR: asn1_get_length_der overflow-small (l %ld len %d)\n", l, len); return 1; } } /* Test that values larger than would fit in the input string are rejected. This problem was fixed in libtasn1 2.12. */ { unsigned long num = 1073741824; unsigned char der[20]; int der_len; long l; int len; asn1_length_der (num, der, &der_len); der_len = sizeof (der); l = asn1_get_length_der (der, der_len, &len); if (l == -4L) { if (verbose) puts ("OK: asn1_get_length_der overflow-large1"); } else { printf ("ERROR: asn1_get_length_der overflow-large1 (l %ld len %d)\n", l, len); return 1; } } /* Test that values larger than would fit in the input string are rejected. This problem was fixed in libtasn1 2.12. */ { unsigned long num = 2147483649; unsigned char der[20]; int der_len; long l; int len; asn1_length_der (num, der, &der_len); der_len = sizeof (der); l = asn1_get_length_der (der, der_len, &len); if (l == -2L) { if (verbose) puts ("OK: asn1_get_length_der overflow-large2"); } else { printf ("ERROR: asn1_get_length_der overflow-large2 (l %ld len %d)\n", l, len); return 1; } } return 0; }