asn1_decode_test.c 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. /*
  2. * Copyright 2017-2020 The OpenSSL Project Authors. All Rights Reserved.
  3. *
  4. * Licensed under the OpenSSL license (the "License"). You may not use
  5. * this file except in compliance with the License. You can obtain a copy
  6. * in the file LICENSE in the source distribution or at
  7. * https://www.openssl.org/source/license.html
  8. */
  9. #include <stdio.h>
  10. #include <string.h>
  11. #include <openssl/rand.h>
  12. #include <openssl/asn1t.h>
  13. #include "internal/numbers.h"
  14. #include "testutil.h"
  15. #ifdef __GNUC__
  16. # pragma GCC diagnostic ignored "-Wunused-function"
  17. #endif
  18. #ifdef __clang__
  19. # pragma clang diagnostic ignored "-Wunused-function"
  20. #endif
  21. /* Badly coded ASN.1 INTEGER zero wrapped in a sequence */
  22. static unsigned char t_invalid_zero[] = {
  23. 0x30, 0x02, /* SEQUENCE tag + length */
  24. 0x02, 0x00 /* INTEGER tag + length */
  25. };
  26. #if OPENSSL_API_COMPAT < 0x10200000L
  27. /* LONG case ************************************************************* */
  28. typedef struct {
  29. long test_long;
  30. } ASN1_LONG_DATA;
  31. ASN1_SEQUENCE(ASN1_LONG_DATA) = {
  32. ASN1_EMBED(ASN1_LONG_DATA, test_long, LONG),
  33. } static_ASN1_SEQUENCE_END(ASN1_LONG_DATA)
  34. IMPLEMENT_STATIC_ASN1_ENCODE_FUNCTIONS(ASN1_LONG_DATA)
  35. IMPLEMENT_STATIC_ASN1_ALLOC_FUNCTIONS(ASN1_LONG_DATA)
  36. static int test_long(void)
  37. {
  38. const unsigned char *p = t_invalid_zero;
  39. ASN1_LONG_DATA *dectst =
  40. d2i_ASN1_LONG_DATA(NULL, &p, sizeof(t_invalid_zero));
  41. if (dectst == NULL)
  42. return 0; /* Fail */
  43. ASN1_LONG_DATA_free(dectst);
  44. return 1;
  45. }
  46. #endif
  47. /* INT32 case ************************************************************* */
  48. typedef struct {
  49. int32_t test_int32;
  50. } ASN1_INT32_DATA;
  51. ASN1_SEQUENCE(ASN1_INT32_DATA) = {
  52. ASN1_EMBED(ASN1_INT32_DATA, test_int32, INT32),
  53. } static_ASN1_SEQUENCE_END(ASN1_INT32_DATA)
  54. IMPLEMENT_STATIC_ASN1_ENCODE_FUNCTIONS(ASN1_INT32_DATA)
  55. IMPLEMENT_STATIC_ASN1_ALLOC_FUNCTIONS(ASN1_INT32_DATA)
  56. static int test_int32(void)
  57. {
  58. const unsigned char *p = t_invalid_zero;
  59. ASN1_INT32_DATA *dectst =
  60. d2i_ASN1_INT32_DATA(NULL, &p, sizeof(t_invalid_zero));
  61. if (dectst == NULL)
  62. return 0; /* Fail */
  63. ASN1_INT32_DATA_free(dectst);
  64. return 1;
  65. }
  66. /* UINT32 case ************************************************************* */
  67. typedef struct {
  68. uint32_t test_uint32;
  69. } ASN1_UINT32_DATA;
  70. ASN1_SEQUENCE(ASN1_UINT32_DATA) = {
  71. ASN1_EMBED(ASN1_UINT32_DATA, test_uint32, UINT32),
  72. } static_ASN1_SEQUENCE_END(ASN1_UINT32_DATA)
  73. IMPLEMENT_STATIC_ASN1_ENCODE_FUNCTIONS(ASN1_UINT32_DATA)
  74. IMPLEMENT_STATIC_ASN1_ALLOC_FUNCTIONS(ASN1_UINT32_DATA)
  75. static int test_uint32(void)
  76. {
  77. const unsigned char *p = t_invalid_zero;
  78. ASN1_UINT32_DATA *dectst =
  79. d2i_ASN1_UINT32_DATA(NULL, &p, sizeof(t_invalid_zero));
  80. if (dectst == NULL)
  81. return 0; /* Fail */
  82. ASN1_UINT32_DATA_free(dectst);
  83. return 1;
  84. }
  85. /* INT64 case ************************************************************* */
  86. typedef struct {
  87. int64_t test_int64;
  88. } ASN1_INT64_DATA;
  89. ASN1_SEQUENCE(ASN1_INT64_DATA) = {
  90. ASN1_EMBED(ASN1_INT64_DATA, test_int64, INT64),
  91. } static_ASN1_SEQUENCE_END(ASN1_INT64_DATA)
  92. IMPLEMENT_STATIC_ASN1_ENCODE_FUNCTIONS(ASN1_INT64_DATA)
  93. IMPLEMENT_STATIC_ASN1_ALLOC_FUNCTIONS(ASN1_INT64_DATA)
  94. static int test_int64(void)
  95. {
  96. const unsigned char *p = t_invalid_zero;
  97. ASN1_INT64_DATA *dectst =
  98. d2i_ASN1_INT64_DATA(NULL, &p, sizeof(t_invalid_zero));
  99. if (dectst == NULL)
  100. return 0; /* Fail */
  101. ASN1_INT64_DATA_free(dectst);
  102. return 1;
  103. }
  104. /* UINT64 case ************************************************************* */
  105. typedef struct {
  106. uint64_t test_uint64;
  107. } ASN1_UINT64_DATA;
  108. ASN1_SEQUENCE(ASN1_UINT64_DATA) = {
  109. ASN1_EMBED(ASN1_UINT64_DATA, test_uint64, UINT64),
  110. } static_ASN1_SEQUENCE_END(ASN1_UINT64_DATA)
  111. IMPLEMENT_STATIC_ASN1_ENCODE_FUNCTIONS(ASN1_UINT64_DATA)
  112. IMPLEMENT_STATIC_ASN1_ALLOC_FUNCTIONS(ASN1_UINT64_DATA)
  113. static int test_uint64(void)
  114. {
  115. const unsigned char *p = t_invalid_zero;
  116. ASN1_UINT64_DATA *dectst =
  117. d2i_ASN1_UINT64_DATA(NULL, &p, sizeof(t_invalid_zero));
  118. if (dectst == NULL)
  119. return 0; /* Fail */
  120. ASN1_UINT64_DATA_free(dectst);
  121. return 1;
  122. }
  123. typedef struct {
  124. ASN1_STRING *invalidDirString;
  125. } INVALIDTEMPLATE;
  126. ASN1_SEQUENCE(INVALIDTEMPLATE) = {
  127. /*
  128. * DirectoryString is a CHOICE type so it must use explicit tagging -
  129. * but we deliberately use implicit here, which makes this template invalid.
  130. */
  131. ASN1_IMP(INVALIDTEMPLATE, invalidDirString, DIRECTORYSTRING, 12)
  132. } static_ASN1_SEQUENCE_END(INVALIDTEMPLATE)
  133. IMPLEMENT_STATIC_ASN1_ENCODE_FUNCTIONS(INVALIDTEMPLATE)
  134. IMPLEMENT_STATIC_ASN1_ALLOC_FUNCTIONS(INVALIDTEMPLATE)
  135. /* Empty sequence for invalid template test */
  136. static unsigned char t_invalid_template[] = {
  137. 0x30, 0x03, /* SEQUENCE tag + length */
  138. 0x0c, 0x01, 0x41 /* UTF8String, length 1, "A" */
  139. };
  140. static int test_invalid_template(void)
  141. {
  142. const unsigned char *p = t_invalid_template;
  143. INVALIDTEMPLATE *tmp = d2i_INVALIDTEMPLATE(NULL, &p,
  144. sizeof(t_invalid_template));
  145. /* We expect a NULL pointer return */
  146. if (TEST_ptr_null(tmp))
  147. return 1;
  148. INVALIDTEMPLATE_free(tmp);
  149. return 0;
  150. }
  151. int setup_tests(void)
  152. {
  153. #if OPENSSL_API_COMPAT < 0x10200000L
  154. ADD_TEST(test_long);
  155. #endif
  156. ADD_TEST(test_int32);
  157. ADD_TEST(test_uint32);
  158. ADD_TEST(test_int64);
  159. ADD_TEST(test_uint64);
  160. ADD_TEST(test_invalid_template);
  161. return 1;
  162. }