asn1parse.c 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392
  1. /*
  2. * Generic ASN.1 parsing
  3. *
  4. * Copyright (C) 2006-2014, Brainspark B.V.
  5. *
  6. * This file is part of PolarSSL (http://www.polarssl.org)
  7. * Lead Maintainer: Paul Bakker <polarssl_maintainer at polarssl.org>
  8. *
  9. * All rights reserved.
  10. *
  11. * This program is free software; you can redistribute it and/or modify
  12. * it under the terms of the GNU General Public License as published by
  13. * the Free Software Foundation; either version 2 of the License, or
  14. * (at your option) any later version.
  15. *
  16. * This program is distributed in the hope that it will be useful,
  17. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  18. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  19. * GNU General Public License for more details.
  20. *
  21. * You should have received a copy of the GNU General Public License along
  22. * with this program; if not, write to the Free Software Foundation, Inc.,
  23. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  24. */
  25. #if !defined(POLARSSL_CONFIG_FILE)
  26. #include "polarssl/config.h"
  27. #else
  28. #include POLARSSL_CONFIG_FILE
  29. #endif
  30. #if defined(POLARSSL_ASN1_PARSE_C)
  31. #include "polarssl/asn1.h"
  32. #if defined(POLARSSL_BIGNUM_C)
  33. #include "polarssl/bignum.h"
  34. #endif
  35. #if defined(POLARSSL_PLATFORM_C)
  36. #include "polarssl/platform.h"
  37. #else
  38. #define polarssl_malloc malloc
  39. #define polarssl_free free
  40. #endif
  41. #include <string.h>
  42. #include <stdlib.h>
  43. /*
  44. * ASN.1 DER decoding routines
  45. */
  46. int asn1_get_len( unsigned char **p,
  47. const unsigned char *end,
  48. size_t *len )
  49. {
  50. if( ( end - *p ) < 1 )
  51. return( POLARSSL_ERR_ASN1_OUT_OF_DATA );
  52. if( ( **p & 0x80 ) == 0 )
  53. *len = *(*p)++;
  54. else
  55. {
  56. switch( **p & 0x7F )
  57. {
  58. case 1:
  59. if( ( end - *p ) < 2 )
  60. return( POLARSSL_ERR_ASN1_OUT_OF_DATA );
  61. *len = (*p)[1];
  62. (*p) += 2;
  63. break;
  64. case 2:
  65. if( ( end - *p ) < 3 )
  66. return( POLARSSL_ERR_ASN1_OUT_OF_DATA );
  67. *len = ( (*p)[1] << 8 ) | (*p)[2];
  68. (*p) += 3;
  69. break;
  70. case 3:
  71. if( ( end - *p ) < 4 )
  72. return( POLARSSL_ERR_ASN1_OUT_OF_DATA );
  73. *len = ( (*p)[1] << 16 ) | ( (*p)[2] << 8 ) | (*p)[3];
  74. (*p) += 4;
  75. break;
  76. case 4:
  77. if( ( end - *p ) < 5 )
  78. return( POLARSSL_ERR_ASN1_OUT_OF_DATA );
  79. *len = ( (*p)[1] << 24 ) | ( (*p)[2] << 16 ) | ( (*p)[3] << 8 ) |
  80. (*p)[4];
  81. (*p) += 5;
  82. break;
  83. default:
  84. return( POLARSSL_ERR_ASN1_INVALID_LENGTH );
  85. }
  86. }
  87. if( *len > (size_t) ( end - *p ) )
  88. return( POLARSSL_ERR_ASN1_OUT_OF_DATA );
  89. return( 0 );
  90. }
  91. int asn1_get_tag( unsigned char **p,
  92. const unsigned char *end,
  93. size_t *len, int tag )
  94. {
  95. if( ( end - *p ) < 1 )
  96. return( POLARSSL_ERR_ASN1_OUT_OF_DATA );
  97. if( **p != tag )
  98. return( POLARSSL_ERR_ASN1_UNEXPECTED_TAG );
  99. (*p)++;
  100. return( asn1_get_len( p, end, len ) );
  101. }
  102. int asn1_get_bool( unsigned char **p,
  103. const unsigned char *end,
  104. int *val )
  105. {
  106. int ret;
  107. size_t len;
  108. if( ( ret = asn1_get_tag( p, end, &len, ASN1_BOOLEAN ) ) != 0 )
  109. return( ret );
  110. if( len != 1 )
  111. return( POLARSSL_ERR_ASN1_INVALID_LENGTH );
  112. *val = ( **p != 0 ) ? 1 : 0;
  113. (*p)++;
  114. return( 0 );
  115. }
  116. int asn1_get_int( unsigned char **p,
  117. const unsigned char *end,
  118. int *val )
  119. {
  120. int ret;
  121. size_t len;
  122. if( ( ret = asn1_get_tag( p, end, &len, ASN1_INTEGER ) ) != 0 )
  123. return( ret );
  124. if( len > sizeof( int ) || ( **p & 0x80 ) != 0 )
  125. return( POLARSSL_ERR_ASN1_INVALID_LENGTH );
  126. *val = 0;
  127. while( len-- > 0 )
  128. {
  129. *val = ( *val << 8 ) | **p;
  130. (*p)++;
  131. }
  132. return( 0 );
  133. }
  134. #if defined(POLARSSL_BIGNUM_C)
  135. int asn1_get_mpi( unsigned char **p,
  136. const unsigned char *end,
  137. mpi *X )
  138. {
  139. int ret;
  140. size_t len;
  141. if( ( ret = asn1_get_tag( p, end, &len, ASN1_INTEGER ) ) != 0 )
  142. return( ret );
  143. ret = mpi_read_binary( X, *p, len );
  144. *p += len;
  145. return( ret );
  146. }
  147. #endif /* POLARSSL_BIGNUM_C */
  148. int asn1_get_bitstring( unsigned char **p, const unsigned char *end,
  149. asn1_bitstring *bs)
  150. {
  151. int ret;
  152. /* Certificate type is a single byte bitstring */
  153. if( ( ret = asn1_get_tag( p, end, &bs->len, ASN1_BIT_STRING ) ) != 0 )
  154. return( ret );
  155. /* Check length, subtract one for actual bit string length */
  156. if( bs->len < 1 )
  157. return( POLARSSL_ERR_ASN1_OUT_OF_DATA );
  158. bs->len -= 1;
  159. /* Get number of unused bits, ensure unused bits <= 7 */
  160. bs->unused_bits = **p;
  161. if( bs->unused_bits > 7 )
  162. return( POLARSSL_ERR_ASN1_INVALID_LENGTH );
  163. (*p)++;
  164. /* Get actual bitstring */
  165. bs->p = *p;
  166. *p += bs->len;
  167. if( *p != end )
  168. return( POLARSSL_ERR_ASN1_LENGTH_MISMATCH );
  169. return( 0 );
  170. }
  171. /*
  172. * Get a bit string without unused bits
  173. */
  174. int asn1_get_bitstring_null( unsigned char **p, const unsigned char *end,
  175. size_t *len )
  176. {
  177. int ret;
  178. if( ( ret = asn1_get_tag( p, end, len, ASN1_BIT_STRING ) ) != 0 )
  179. return( ret );
  180. if( (*len)-- < 2 || *(*p)++ != 0 )
  181. return( POLARSSL_ERR_ASN1_INVALID_DATA );
  182. return( 0 );
  183. }
  184. /*
  185. * Parses and splits an ASN.1 "SEQUENCE OF <tag>"
  186. */
  187. int asn1_get_sequence_of( unsigned char **p,
  188. const unsigned char *end,
  189. asn1_sequence *cur,
  190. int tag)
  191. {
  192. int ret;
  193. size_t len;
  194. asn1_buf *buf;
  195. /* Get main sequence tag */
  196. if( ( ret = asn1_get_tag( p, end, &len,
  197. ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 )
  198. return( ret );
  199. if( *p + len != end )
  200. return( POLARSSL_ERR_ASN1_LENGTH_MISMATCH );
  201. while( *p < end )
  202. {
  203. buf = &(cur->buf);
  204. buf->tag = **p;
  205. if( ( ret = asn1_get_tag( p, end, &buf->len, tag ) ) != 0 )
  206. return( ret );
  207. buf->p = *p;
  208. *p += buf->len;
  209. /* Allocate and assign next pointer */
  210. if( *p < end )
  211. {
  212. cur->next = (asn1_sequence *) polarssl_malloc(
  213. sizeof( asn1_sequence ) );
  214. if( cur->next == NULL )
  215. return( POLARSSL_ERR_ASN1_MALLOC_FAILED );
  216. cur = cur->next;
  217. }
  218. }
  219. /* Set final sequence entry's next pointer to NULL */
  220. cur->next = NULL;
  221. if( *p != end )
  222. return( POLARSSL_ERR_ASN1_LENGTH_MISMATCH );
  223. return( 0 );
  224. }
  225. int asn1_get_alg( unsigned char **p,
  226. const unsigned char *end,
  227. asn1_buf *alg, asn1_buf *params )
  228. {
  229. int ret;
  230. size_t len;
  231. if( ( ret = asn1_get_tag( p, end, &len,
  232. ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 )
  233. return( ret );
  234. if( ( end - *p ) < 1 )
  235. return( POLARSSL_ERR_ASN1_OUT_OF_DATA );
  236. alg->tag = **p;
  237. end = *p + len;
  238. if( ( ret = asn1_get_tag( p, end, &alg->len, ASN1_OID ) ) != 0 )
  239. return( ret );
  240. alg->p = *p;
  241. *p += alg->len;
  242. if( *p == end )
  243. {
  244. memset( params, 0, sizeof(asn1_buf) );
  245. return( 0 );
  246. }
  247. params->tag = **p;
  248. (*p)++;
  249. if( ( ret = asn1_get_len( p, end, &params->len ) ) != 0 )
  250. return( ret );
  251. params->p = *p;
  252. *p += params->len;
  253. if( *p != end )
  254. return( POLARSSL_ERR_ASN1_LENGTH_MISMATCH );
  255. return( 0 );
  256. }
  257. int asn1_get_alg_null( unsigned char **p,
  258. const unsigned char *end,
  259. asn1_buf *alg )
  260. {
  261. int ret;
  262. asn1_buf params;
  263. memset( &params, 0, sizeof(asn1_buf) );
  264. if( ( ret = asn1_get_alg( p, end, alg, &params ) ) != 0 )
  265. return( ret );
  266. if( ( params.tag != ASN1_NULL && params.tag != 0 ) || params.len != 0 )
  267. return( POLARSSL_ERR_ASN1_INVALID_DATA );
  268. return( 0 );
  269. }
  270. void asn1_free_named_data( asn1_named_data *cur )
  271. {
  272. if( cur == NULL )
  273. return;
  274. polarssl_free( cur->oid.p );
  275. polarssl_free( cur->val.p );
  276. memset( cur, 0, sizeof( asn1_named_data ) );
  277. }
  278. void asn1_free_named_data_list( asn1_named_data **head )
  279. {
  280. asn1_named_data *cur;
  281. while( ( cur = *head ) != NULL )
  282. {
  283. *head = cur->next;
  284. asn1_free_named_data( cur );
  285. polarssl_free( cur );
  286. }
  287. }
  288. asn1_named_data *asn1_find_named_data( asn1_named_data *list,
  289. const char *oid, size_t len )
  290. {
  291. while( list != NULL )
  292. {
  293. if( list->oid.len == len &&
  294. memcmp( list->oid.p, oid, len ) == 0 )
  295. {
  296. break;
  297. }
  298. list = list->next;
  299. }
  300. return( list );
  301. }
  302. #endif /* POLARSSL_ASN1_PARSE_C */