コード例 #1
0
ファイル: parser_aux.c プロジェクト: FANTOM007/libtasn1
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);
}
コード例 #2
0
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);
}
コード例 #3
0
ファイル: extract-openssl.c プロジェクト: Distrotech/p11-kit
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;
}
コード例 #4
0
ファイル: Test_overflow.c プロジェクト: Distrotech/libtasn1
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;
}