asn1t.h
上传用户:yisoukefu
上传日期:2020-08-09
资源大小:39506k
文件大小:27k
源码类别:

其他游戏

开发平台:

Visual C++

  1. /* asn1t.h */
  2. /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL
  3.  * project 2000.
  4.  */
  5. /* ====================================================================
  6.  * Copyright (c) 2000 The OpenSSL Project.  All rights reserved.
  7.  *
  8.  * Redistribution and use in source and binary forms, with or without
  9.  * modification, are permitted provided that the following conditions
  10.  * are met:
  11.  *
  12.  * 1. Redistributions of source code must retain the above copyright
  13.  *    notice, this list of conditions and the following disclaimer. 
  14.  *
  15.  * 2. Redistributions in binary form must reproduce the above copyright
  16.  *    notice, this list of conditions and the following disclaimer in
  17.  *    the documentation and/or other materials provided with the
  18.  *    distribution.
  19.  *
  20.  * 3. All advertising materials mentioning features or use of this
  21.  *    software must display the following acknowledgment:
  22.  *    "This product includes software developed by the OpenSSL Project
  23.  *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
  24.  *
  25.  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
  26.  *    endorse or promote products derived from this software without
  27.  *    prior written permission. For written permission, please contact
  28.  *    licensing@OpenSSL.org.
  29.  *
  30.  * 5. Products derived from this software may not be called "OpenSSL"
  31.  *    nor may "OpenSSL" appear in their names without prior written
  32.  *    permission of the OpenSSL Project.
  33.  *
  34.  * 6. Redistributions of any form whatsoever must retain the following
  35.  *    acknowledgment:
  36.  *    "This product includes software developed by the OpenSSL Project
  37.  *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
  38.  *
  39.  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
  40.  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  41.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  42.  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
  43.  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  44.  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  45.  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  46.  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  47.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
  48.  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  49.  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
  50.  * OF THE POSSIBILITY OF SUCH DAMAGE.
  51.  * ====================================================================
  52.  *
  53.  * This product includes cryptographic software written by Eric Young
  54.  * (eay@cryptsoft.com).  This product includes software written by Tim
  55.  * Hudson (tjh@cryptsoft.com).
  56.  *
  57.  */
  58. #ifndef HEADER_ASN1T_H
  59. #define HEADER_ASN1T_H
  60. #include <stddef.h>
  61. #include <openssl/e_os2.h>
  62. #include <openssl/asn1.h>
  63. #ifdef OPENSSL_BUILD_SHLIBCRYPTO
  64. # undef OPENSSL_EXTERN
  65. # define OPENSSL_EXTERN OPENSSL_EXPORT
  66. #endif
  67. /* ASN1 template defines, structures and functions */
  68. #ifdef  __cplusplus
  69. extern "C" {
  70. #endif
  71. #ifndef OPENSSL_EXPORT_VAR_AS_FUNCTION
  72. /* Macro to obtain ASN1_ADB pointer from a type (only used internally) */
  73. #define ASN1_ADB_ptr(iptr) ((const ASN1_ADB *)(iptr))
  74. /* Macros for start and end of ASN1_ITEM definition */
  75. #define ASN1_ITEM_start(itname) 
  76. OPENSSL_GLOBAL const ASN1_ITEM itname##_it = {
  77. #define ASN1_ITEM_end(itname) 
  78. };
  79. #else
  80. /* Macro to obtain ASN1_ADB pointer from a type (only used internally) */
  81. #define ASN1_ADB_ptr(iptr) ((const ASN1_ADB *)(iptr()))
  82. /* Macros for start and end of ASN1_ITEM definition */
  83. #define ASN1_ITEM_start(itname) 
  84. const ASN1_ITEM * itname##_it(void) 
  85. static const ASN1_ITEM local_it = { 
  86. #define ASN1_ITEM_end(itname) 
  87. }; 
  88. return &local_it; 
  89. }
  90. #endif
  91. /* Macros to aid ASN1 template writing */
  92. #define ASN1_ITEM_TEMPLATE(tname) 
  93. static const ASN1_TEMPLATE tname##_item_tt 
  94. #define ASN1_ITEM_TEMPLATE_END(tname) 
  95. ;
  96. ASN1_ITEM_start(tname) 
  97. ASN1_ITYPE_PRIMITIVE,
  98. -1,
  99. &tname##_item_tt,
  100. 0,
  101. NULL,
  102. 0,
  103. #tname 
  104. ASN1_ITEM_end(tname)
  105. /* This is a ASN1 type which just embeds a template */
  106.  
  107. /* This pair helps declare a SEQUENCE. We can do:
  108.  *
  109.  *  ASN1_SEQUENCE(stname) = {
  110.  *  ... SEQUENCE components ...
  111.  *  } ASN1_SEQUENCE_END(stname)
  112.  *
  113.  *  This will produce an ASN1_ITEM called stname_it
  114.  * for a structure called stname.
  115.  *
  116.  *  If you want the same structure but a different
  117.  * name then use:
  118.  *
  119.  *  ASN1_SEQUENCE(itname) = {
  120.  *  ... SEQUENCE components ...
  121.  *  } ASN1_SEQUENCE_END_name(stname, itname)
  122.  *
  123.  * This will create an item called itname_it using
  124.  * a structure called stname.
  125.  */
  126. #define ASN1_SEQUENCE(tname) 
  127. static const ASN1_TEMPLATE tname##_seq_tt[] 
  128. #define ASN1_SEQUENCE_END(stname) ASN1_SEQUENCE_END_name(stname, stname)
  129. #define ASN1_SEQUENCE_END_name(stname, tname) 
  130. ;
  131. ASN1_ITEM_start(tname) 
  132. ASN1_ITYPE_SEQUENCE,
  133. V_ASN1_SEQUENCE,
  134. tname##_seq_tt,
  135. sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),
  136. NULL,
  137. sizeof(stname),
  138. #stname 
  139. ASN1_ITEM_end(tname)
  140. #define ASN1_NDEF_SEQUENCE(tname) 
  141. ASN1_SEQUENCE(tname)
  142. #define ASN1_SEQUENCE_cb(tname, cb) 
  143. static const ASN1_AUX tname##_aux = {NULL, 0, 0, 0, cb, 0}; 
  144. ASN1_SEQUENCE(tname)
  145. #define ASN1_BROKEN_SEQUENCE(tname) 
  146. static const ASN1_AUX tname##_aux = {NULL, ASN1_AFLG_BROKEN, 0, 0, 0, 0}; 
  147. ASN1_SEQUENCE(tname)
  148. #define ASN1_SEQUENCE_ref(tname, cb, lck) 
  149. static const ASN1_AUX tname##_aux = {NULL, ASN1_AFLG_REFCOUNT, offsetof(tname, references), lck, cb, 0}; 
  150. ASN1_SEQUENCE(tname)
  151. #define ASN1_SEQUENCE_enc(tname, enc, cb) 
  152. static const ASN1_AUX tname##_aux = {NULL, ASN1_AFLG_ENCODING, 0, 0, cb, offsetof(tname, enc)}; 
  153. ASN1_SEQUENCE(tname)
  154. #define ASN1_NDEF_SEQUENCE_END(tname) 
  155. ;
  156. ASN1_ITEM_start(tname) 
  157. ASN1_ITYPE_NDEF_SEQUENCE,
  158. V_ASN1_SEQUENCE,
  159. tname##_seq_tt,
  160. sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),
  161. NULL,
  162. sizeof(tname),
  163. #tname 
  164. ASN1_ITEM_end(tname)
  165. #define ASN1_BROKEN_SEQUENCE_END(stname) ASN1_SEQUENCE_END_ref(stname, stname)
  166. #define ASN1_SEQUENCE_END_enc(stname, tname) ASN1_SEQUENCE_END_ref(stname, tname)
  167. #define ASN1_SEQUENCE_END_cb(stname, tname) ASN1_SEQUENCE_END_ref(stname, tname)
  168. #define ASN1_SEQUENCE_END_ref(stname, tname) 
  169. ;
  170. ASN1_ITEM_start(tname) 
  171. ASN1_ITYPE_SEQUENCE,
  172. V_ASN1_SEQUENCE,
  173. tname##_seq_tt,
  174. sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),
  175. &tname##_aux,
  176. sizeof(stname),
  177. #stname 
  178. ASN1_ITEM_end(tname)
  179. /* This pair helps declare a CHOICE type. We can do:
  180.  *
  181.  *  ASN1_CHOICE(chname) = {
  182.  *  ... CHOICE options ...
  183.  *  ASN1_CHOICE_END(chname)
  184.  *
  185.  *  This will produce an ASN1_ITEM called chname_it
  186.  * for a structure called chname. The structure
  187.  * definition must look like this:
  188.  * typedef struct {
  189.  * int type;
  190.  * union {
  191.  * ASN1_SOMETHING *opt1;
  192.  * ASN1_SOMEOTHER *opt2;
  193.  * } value;
  194.  * } chname;
  195.  *
  196.  * the name of the selector must be 'type'.
  197.  *  to use an alternative selector name use the
  198.  *      ASN1_CHOICE_END_selector() version.
  199.  */
  200. #define ASN1_CHOICE(tname) 
  201. static const ASN1_TEMPLATE tname##_ch_tt[] 
  202. #define ASN1_CHOICE_cb(tname, cb) 
  203. static const ASN1_AUX tname##_aux = {NULL, 0, 0, 0, cb, 0}; 
  204. ASN1_CHOICE(tname)
  205. #define ASN1_CHOICE_END(stname) ASN1_CHOICE_END_name(stname, stname)
  206. #define ASN1_CHOICE_END_name(stname, tname) ASN1_CHOICE_END_selector(stname, tname, type)
  207. #define ASN1_CHOICE_END_selector(stname, tname, selname) 
  208. ;
  209. ASN1_ITEM_start(tname) 
  210. ASN1_ITYPE_CHOICE,
  211. offsetof(stname,selname) ,
  212. tname##_ch_tt,
  213. sizeof(tname##_ch_tt) / sizeof(ASN1_TEMPLATE),
  214. NULL,
  215. sizeof(stname),
  216. #stname 
  217. ASN1_ITEM_end(tname)
  218. #define ASN1_CHOICE_END_cb(stname, tname, selname) 
  219. ;
  220. ASN1_ITEM_start(tname) 
  221. ASN1_ITYPE_CHOICE,
  222. offsetof(stname,selname) ,
  223. tname##_ch_tt,
  224. sizeof(tname##_ch_tt) / sizeof(ASN1_TEMPLATE),
  225. &tname##_aux,
  226. sizeof(stname),
  227. #stname 
  228. ASN1_ITEM_end(tname)
  229. /* This helps with the template wrapper form of ASN1_ITEM */
  230. #define ASN1_EX_TEMPLATE_TYPE(flags, tag, name, type) { 
  231. (flags), (tag), 0,
  232. #name, ASN1_ITEM_ref(type) }
  233. /* These help with SEQUENCE or CHOICE components */
  234. /* used to declare other types */
  235. #define ASN1_EX_TYPE(flags, tag, stname, field, type) { 
  236. (flags), (tag), offsetof(stname, field),
  237. #field, ASN1_ITEM_ref(type) }
  238. /* used when the structure is combined with the parent */
  239. #define ASN1_EX_COMBINE(flags, tag, type) { 
  240. (flags)|ASN1_TFLG_COMBINE, (tag), 0, NULL, ASN1_ITEM_ref(type) }
  241. /* implicit and explicit helper macros */
  242. #define ASN1_IMP_EX(stname, field, type, tag, ex) 
  243. ASN1_EX_TYPE(ASN1_TFLG_IMPLICIT | ex, tag, stname, field, type)
  244. #define ASN1_EXP_EX(stname, field, type, tag, ex) 
  245. ASN1_EX_TYPE(ASN1_TFLG_EXPLICIT | ex, tag, stname, field, type)
  246. /* Any defined by macros: the field used is in the table itself */
  247. #ifndef OPENSSL_EXPORT_VAR_AS_FUNCTION
  248. #define ASN1_ADB_OBJECT(tblname) { ASN1_TFLG_ADB_OID, -1, 0, #tblname, (const ASN1_ITEM *)&(tblname##_adb) }
  249. #define ASN1_ADB_INTEGER(tblname) { ASN1_TFLG_ADB_INT, -1, 0, #tblname, (const ASN1_ITEM *)&(tblname##_adb) }
  250. #else
  251. #define ASN1_ADB_OBJECT(tblname) { ASN1_TFLG_ADB_OID, -1, 0, #tblname, tblname##_adb }
  252. #define ASN1_ADB_INTEGER(tblname) { ASN1_TFLG_ADB_INT, -1, 0, #tblname, tblname##_adb }
  253. #endif
  254. /* Plain simple type */
  255. #define ASN1_SIMPLE(stname, field, type) ASN1_EX_TYPE(0,0, stname, field, type)
  256. /* OPTIONAL simple type */
  257. #define ASN1_OPT(stname, field, type) ASN1_EX_TYPE(ASN1_TFLG_OPTIONAL, 0, stname, field, type)
  258. /* IMPLICIT tagged simple type */
  259. #define ASN1_IMP(stname, field, type, tag) ASN1_IMP_EX(stname, field, type, tag, 0)
  260. /* IMPLICIT tagged OPTIONAL simple type */
  261. #define ASN1_IMP_OPT(stname, field, type, tag) ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL)
  262. /* Same as above but EXPLICIT */
  263. #define ASN1_EXP(stname, field, type, tag) ASN1_EXP_EX(stname, field, type, tag, 0)
  264. #define ASN1_EXP_OPT(stname, field, type, tag) ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL)
  265. /* SEQUENCE OF type */
  266. #define ASN1_SEQUENCE_OF(stname, field, type) 
  267. ASN1_EX_TYPE(ASN1_TFLG_SEQUENCE_OF, 0, stname, field, type)
  268. /* OPTIONAL SEQUENCE OF */
  269. #define ASN1_SEQUENCE_OF_OPT(stname, field, type) 
  270. ASN1_EX_TYPE(ASN1_TFLG_SEQUENCE_OF|ASN1_TFLG_OPTIONAL, 0, stname, field, type)
  271. /* Same as above but for SET OF */
  272. #define ASN1_SET_OF(stname, field, type) 
  273. ASN1_EX_TYPE(ASN1_TFLG_SET_OF, 0, stname, field, type)
  274. #define ASN1_SET_OF_OPT(stname, field, type) 
  275. ASN1_EX_TYPE(ASN1_TFLG_SET_OF|ASN1_TFLG_OPTIONAL, 0, stname, field, type)
  276. /* Finally compound types of SEQUENCE, SET, IMPLICIT, EXPLICIT and OPTIONAL */
  277. #define ASN1_IMP_SET_OF(stname, field, type, tag) 
  278. ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF)
  279. #define ASN1_EXP_SET_OF(stname, field, type, tag) 
  280. ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF)
  281. #define ASN1_IMP_SET_OF_OPT(stname, field, type, tag) 
  282. ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF|ASN1_TFLG_OPTIONAL)
  283. #define ASN1_EXP_SET_OF_OPT(stname, field, type, tag) 
  284. ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF|ASN1_TFLG_OPTIONAL)
  285. #define ASN1_IMP_SEQUENCE_OF(stname, field, type, tag) 
  286. ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF)
  287. #define ASN1_IMP_SEQUENCE_OF_OPT(stname, field, type, tag) 
  288. ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF|ASN1_TFLG_OPTIONAL)
  289. #define ASN1_EXP_SEQUENCE_OF(stname, field, type, tag) 
  290. ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF)
  291. #define ASN1_EXP_SEQUENCE_OF_OPT(stname, field, type, tag) 
  292. ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF|ASN1_TFLG_OPTIONAL)
  293. /* EXPLICIT OPTIONAL using indefinite length constructed form */
  294. #define ASN1_NDEF_EXP_OPT(stname, field, type, tag) 
  295. ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL|ASN1_TFLG_NDEF)
  296. /* Macros for the ASN1_ADB structure */
  297. #define ASN1_ADB(name) 
  298. static const ASN1_ADB_TABLE name##_adbtbl[] 
  299. #ifndef OPENSSL_EXPORT_VAR_AS_FUNCTION
  300. #define ASN1_ADB_END(name, flags, field, app_table, def, none) 
  301. ;
  302. static const ASN1_ADB name##_adb = {
  303. flags,
  304. offsetof(name, field),
  305. app_table,
  306. name##_adbtbl,
  307. sizeof(name##_adbtbl) / sizeof(ASN1_ADB_TABLE),
  308. def,
  309. none
  310. }
  311. #else
  312. #define ASN1_ADB_END(name, flags, field, app_table, def, none) 
  313. ;
  314. static const ASN1_ITEM *name##_adb(void) 
  315. static const ASN1_ADB internal_adb = 
  316. {
  317. flags,
  318. offsetof(name, field),
  319. app_table,
  320. name##_adbtbl,
  321. sizeof(name##_adbtbl) / sizeof(ASN1_ADB_TABLE),
  322. def,
  323. none
  324. }; 
  325. return (const ASN1_ITEM *) &internal_adb; 
  326. void dummy_function(void)
  327. #endif
  328. #define ADB_ENTRY(val, template) {val, template}
  329. #define ASN1_ADB_TEMPLATE(name) 
  330. static const ASN1_TEMPLATE name##_tt 
  331. /* This is the ASN1 template structure that defines
  332.  * a wrapper round the actual type. It determines the
  333.  * actual position of the field in the value structure,
  334.  * various flags such as OPTIONAL and the field name.
  335.  */
  336. struct ASN1_TEMPLATE_st {
  337. unsigned long flags; /* Various flags */
  338. long tag; /* tag, not used if no tagging */
  339. unsigned long offset; /* Offset of this field in structure */
  340. #ifndef NO_ASN1_FIELD_NAMES
  341. const char *field_name; /* Field name */
  342. #endif
  343. ASN1_ITEM_EXP *item; /* Relevant ASN1_ITEM or ASN1_ADB */
  344. };
  345. /* Macro to extract ASN1_ITEM and ASN1_ADB pointer from ASN1_TEMPLATE */
  346. #define ASN1_TEMPLATE_item(t) (t->item_ptr)
  347. #define ASN1_TEMPLATE_adb(t) (t->item_ptr)
  348. typedef struct ASN1_ADB_TABLE_st ASN1_ADB_TABLE;
  349. typedef struct ASN1_ADB_st ASN1_ADB;
  350. struct ASN1_ADB_st {
  351. unsigned long flags; /* Various flags */
  352. unsigned long offset; /* Offset of selector field */
  353. STACK_OF(ASN1_ADB_TABLE) **app_items; /* Application defined items */
  354. const ASN1_ADB_TABLE *tbl; /* Table of possible types */
  355. long tblcount; /* Number of entries in tbl */
  356. const ASN1_TEMPLATE *default_tt;  /* Type to use if no match */
  357. const ASN1_TEMPLATE *null_tt;  /* Type to use if selector is NULL */
  358. };
  359. struct ASN1_ADB_TABLE_st {
  360. long value; /* NID for an object or value for an int */
  361. const ASN1_TEMPLATE tt; /* item for this value */
  362. };
  363. /* template flags */
  364. /* Field is optional */
  365. #define ASN1_TFLG_OPTIONAL (0x1)
  366. /* Field is a SET OF */
  367. #define ASN1_TFLG_SET_OF (0x1 << 1)
  368. /* Field is a SEQUENCE OF */
  369. #define ASN1_TFLG_SEQUENCE_OF (0x2 << 1)
  370. /* Special case: this refers to a SET OF that
  371.  * will be sorted into DER order when encoded *and*
  372.  * the corresponding STACK will be modified to match
  373.  * the new order.
  374.  */
  375. #define ASN1_TFLG_SET_ORDER (0x3 << 1)
  376. /* Mask for SET OF or SEQUENCE OF */
  377. #define ASN1_TFLG_SK_MASK (0x3 << 1)
  378. /* These flags mean the tag should be taken from the
  379.  * tag field. If EXPLICIT then the underlying type
  380.  * is used for the inner tag.
  381.  */
  382. /* IMPLICIT tagging */
  383. #define ASN1_TFLG_IMPTAG (0x1 << 3)
  384. /* EXPLICIT tagging, inner tag from underlying type */
  385. #define ASN1_TFLG_EXPTAG (0x2 << 3)
  386. #define ASN1_TFLG_TAG_MASK (0x3 << 3)
  387. /* context specific IMPLICIT */
  388. #define ASN1_TFLG_IMPLICIT ASN1_TFLG_IMPTAG|ASN1_TFLG_CONTEXT
  389. /* context specific EXPLICIT */
  390. #define ASN1_TFLG_EXPLICIT ASN1_TFLG_EXPTAG|ASN1_TFLG_CONTEXT
  391. /* If tagging is in force these determine the
  392.  * type of tag to use. Otherwise the tag is
  393.  * determined by the underlying type. These 
  394.  * values reflect the actual octet format.
  395.  */
  396. /* Universal tag */ 
  397. #define ASN1_TFLG_UNIVERSAL (0x0<<6)
  398. /* Application tag */ 
  399. #define ASN1_TFLG_APPLICATION (0x1<<6)
  400. /* Context specific tag */ 
  401. #define ASN1_TFLG_CONTEXT (0x2<<6)
  402. /* Private tag */ 
  403. #define ASN1_TFLG_PRIVATE (0x3<<6)
  404. #define ASN1_TFLG_TAG_CLASS (0x3<<6)
  405. /* These are for ANY DEFINED BY type. In this case
  406.  * the 'item' field points to an ASN1_ADB structure
  407.  * which contains a table of values to decode the
  408.  * relevant type
  409.  */
  410. #define ASN1_TFLG_ADB_MASK (0x3<<8)
  411. #define ASN1_TFLG_ADB_OID (0x1<<8)
  412. #define ASN1_TFLG_ADB_INT (0x1<<9)
  413. /* This flag means a parent structure is passed
  414.  * instead of the field: this is useful is a
  415.  * SEQUENCE is being combined with a CHOICE for
  416.  * example. Since this means the structure and
  417.  * item name will differ we need to use the
  418.  * ASN1_CHOICE_END_name() macro for example.
  419.  */
  420. #define ASN1_TFLG_COMBINE (0x1<<10)
  421. /* This flag when present in a SEQUENCE OF, SET OF
  422.  * or EXPLICIT causes indefinite length constructed
  423.  * encoding to be used if required.
  424.  */
  425. #define ASN1_TFLG_NDEF (0x1<<11)
  426. /* This is the actual ASN1 item itself */
  427. struct ASN1_ITEM_st {
  428. char itype; /* The item type, primitive, SEQUENCE, CHOICE or extern */
  429. long utype; /* underlying type */
  430. const ASN1_TEMPLATE *templates; /* If SEQUENCE or CHOICE this contains the contents */
  431. long tcount; /* Number of templates if SEQUENCE or CHOICE */
  432. const void *funcs; /* functions that handle this type */
  433. long size; /* Structure size (usually)*/
  434. #ifndef NO_ASN1_FIELD_NAMES
  435. const char *sname; /* Structure name */
  436. #endif
  437. };
  438. /* These are values for the itype field and
  439.  * determine how the type is interpreted.
  440.  *
  441.  * For PRIMITIVE types the underlying type
  442.  * determines the behaviour if items is NULL.
  443.  *
  444.  * Otherwise templates must contain a single 
  445.  * template and the type is treated in the
  446.  * same way as the type specified in the template.
  447.  *
  448.  * For SEQUENCE types the templates field points
  449.  * to the members, the size field is the
  450.  * structure size.
  451.  *
  452.  * For CHOICE types the templates field points
  453.  * to each possible member (typically a union)
  454.  * and the 'size' field is the offset of the
  455.  * selector.
  456.  *
  457.  * The 'funcs' field is used for application
  458.  * specific functions. 
  459.  *
  460.  * For COMPAT types the funcs field gives a
  461.  * set of functions that handle this type, this
  462.  * supports the old d2i, i2d convention.
  463.  *
  464.  * The EXTERN type uses a new style d2i/i2d.
  465.  * The new style should be used where possible
  466.  * because it avoids things like the d2i IMPLICIT
  467.  * hack.
  468.  *
  469.  * MSTRING is a multiple string type, it is used
  470.  * for a CHOICE of character strings where the
  471.  * actual strings all occupy an ASN1_STRING
  472.  * structure. In this case the 'utype' field
  473.  * has a special meaning, it is used as a mask
  474.  * of acceptable types using the B_ASN1 constants.
  475.  *
  476.  * NDEF_SEQUENCE is the same as SEQUENCE except
  477.  * that it will use indefinite length constructed
  478.  * encoding if requested.
  479.  *
  480.  */
  481. #define ASN1_ITYPE_PRIMITIVE 0x0
  482. #define ASN1_ITYPE_SEQUENCE 0x1
  483. #define ASN1_ITYPE_CHOICE 0x2
  484. #define ASN1_ITYPE_COMPAT 0x3
  485. #define ASN1_ITYPE_EXTERN 0x4
  486. #define ASN1_ITYPE_MSTRING 0x5
  487. #define ASN1_ITYPE_NDEF_SEQUENCE 0x6
  488. /* Cache for ASN1 tag and length, so we
  489.  * don't keep re-reading it for things
  490.  * like CHOICE
  491.  */
  492. struct ASN1_TLC_st{
  493. char valid; /* Values below are valid */
  494. int ret; /* return value */
  495. long plen; /* length */
  496. int ptag; /* class value */
  497. int pclass; /* class value */
  498. int hdrlen; /* header length */
  499. };
  500. /* Typedefs for ASN1 function pointers */
  501. typedef ASN1_VALUE * ASN1_new_func(void);
  502. typedef void ASN1_free_func(ASN1_VALUE *a);
  503. typedef ASN1_VALUE * ASN1_d2i_func(ASN1_VALUE **a, const unsigned char ** in, long length);
  504. typedef int ASN1_i2d_func(ASN1_VALUE * a, unsigned char **in);
  505. typedef int ASN1_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, const ASN1_ITEM *it,
  506. int tag, int aclass, char opt, ASN1_TLC *ctx);
  507. typedef int ASN1_ex_i2d(ASN1_VALUE **pval, unsigned char **out, const ASN1_ITEM *it, int tag, int aclass);
  508. typedef int ASN1_ex_new_func(ASN1_VALUE **pval, const ASN1_ITEM *it);
  509. typedef void ASN1_ex_free_func(ASN1_VALUE **pval, const ASN1_ITEM *it);
  510. typedef int ASN1_primitive_i2c(ASN1_VALUE **pval, unsigned char *cont, int *putype, const ASN1_ITEM *it);
  511. typedef int ASN1_primitive_c2i(ASN1_VALUE **pval, const unsigned char *cont, int len, int utype, char *free_cont, const ASN1_ITEM *it);
  512. typedef struct ASN1_COMPAT_FUNCS_st {
  513. ASN1_new_func *asn1_new;
  514. ASN1_free_func *asn1_free;
  515. ASN1_d2i_func *asn1_d2i;
  516. ASN1_i2d_func *asn1_i2d;
  517. } ASN1_COMPAT_FUNCS;
  518. typedef struct ASN1_EXTERN_FUNCS_st {
  519. void *app_data;
  520. ASN1_ex_new_func *asn1_ex_new;
  521. ASN1_ex_free_func *asn1_ex_free;
  522. ASN1_ex_free_func *asn1_ex_clear;
  523. ASN1_ex_d2i *asn1_ex_d2i;
  524. ASN1_ex_i2d *asn1_ex_i2d;
  525. } ASN1_EXTERN_FUNCS;
  526. typedef struct ASN1_PRIMITIVE_FUNCS_st {
  527. void *app_data;
  528. unsigned long flags;
  529. ASN1_ex_new_func *prim_new;
  530. ASN1_ex_free_func *prim_free;
  531. ASN1_ex_free_func *prim_clear;
  532. ASN1_primitive_c2i *prim_c2i;
  533. ASN1_primitive_i2c *prim_i2c;
  534. } ASN1_PRIMITIVE_FUNCS;
  535. /* This is the ASN1_AUX structure: it handles various
  536.  * miscellaneous requirements. For example the use of
  537.  * reference counts and an informational callback.
  538.  *
  539.  * The "informational callback" is called at various
  540.  * points during the ASN1 encoding and decoding. It can
  541.  * be used to provide minor customisation of the structures
  542.  * used. This is most useful where the supplied routines
  543.  * *almost* do the right thing but need some extra help
  544.  * at a few points. If the callback returns zero then
  545.  * it is assumed a fatal error has occurred and the 
  546.  * main operation should be abandoned.
  547.  *
  548.  * If major changes in the default behaviour are required
  549.  * then an external type is more appropriate.
  550.  */
  551. typedef int ASN1_aux_cb(int operation, ASN1_VALUE **in, const ASN1_ITEM *it);
  552. typedef struct ASN1_AUX_st {
  553. void *app_data;
  554. int flags;
  555. int ref_offset; /* Offset of reference value */
  556. int ref_lock; /* Lock type to use */
  557. ASN1_aux_cb *asn1_cb;
  558. int enc_offset; /* Offset of ASN1_ENCODING structure */
  559. } ASN1_AUX;
  560. /* Flags in ASN1_AUX */
  561. /* Use a reference count */
  562. #define ASN1_AFLG_REFCOUNT 1
  563. /* Save the encoding of structure (useful for signatures) */
  564. #define ASN1_AFLG_ENCODING 2
  565. /* The Sequence length is invalid */
  566. #define ASN1_AFLG_BROKEN 4
  567. /* operation values for asn1_cb */
  568. #define ASN1_OP_NEW_PRE 0
  569. #define ASN1_OP_NEW_POST 1
  570. #define ASN1_OP_FREE_PRE 2
  571. #define ASN1_OP_FREE_POST 3
  572. #define ASN1_OP_D2I_PRE 4
  573. #define ASN1_OP_D2I_POST 5
  574. #define ASN1_OP_I2D_PRE 6
  575. #define ASN1_OP_I2D_POST 7
  576. /* Macro to implement a primitive type */
  577. #define IMPLEMENT_ASN1_TYPE(stname) IMPLEMENT_ASN1_TYPE_ex(stname, stname, 0)
  578. #define IMPLEMENT_ASN1_TYPE_ex(itname, vname, ex) 
  579. ASN1_ITEM_start(itname) 
  580. ASN1_ITYPE_PRIMITIVE, V_##vname, NULL, 0, NULL, ex, #itname 
  581. ASN1_ITEM_end(itname)
  582. /* Macro to implement a multi string type */
  583. #define IMPLEMENT_ASN1_MSTRING(itname, mask) 
  584. ASN1_ITEM_start(itname) 
  585. ASN1_ITYPE_MSTRING, mask, NULL, 0, NULL, sizeof(ASN1_STRING), #itname 
  586. ASN1_ITEM_end(itname)
  587. /* Macro to implement an ASN1_ITEM in terms of old style funcs */
  588. #define IMPLEMENT_COMPAT_ASN1(sname) IMPLEMENT_COMPAT_ASN1_type(sname, V_ASN1_SEQUENCE)
  589. #define IMPLEMENT_COMPAT_ASN1_type(sname, tag) 
  590. static const ASN1_COMPAT_FUNCS sname##_ff = { 
  591. (ASN1_new_func *)sname##_new, 
  592. (ASN1_free_func *)sname##_free, 
  593. (ASN1_d2i_func *)d2i_##sname, 
  594. (ASN1_i2d_func *)i2d_##sname, 
  595. }; 
  596. ASN1_ITEM_start(sname) 
  597. ASN1_ITYPE_COMPAT, 
  598. tag, 
  599. NULL, 
  600. 0, 
  601. &sname##_ff, 
  602. 0, 
  603. #sname 
  604. ASN1_ITEM_end(sname)
  605. #define IMPLEMENT_EXTERN_ASN1(sname, tag, fptrs) 
  606. ASN1_ITEM_start(sname) 
  607. ASN1_ITYPE_EXTERN, 
  608. tag, 
  609. NULL, 
  610. 0, 
  611. &fptrs, 
  612. 0, 
  613. #sname 
  614. ASN1_ITEM_end(sname)
  615. /* Macro to implement standard functions in terms of ASN1_ITEM structures */
  616. #define IMPLEMENT_ASN1_FUNCTIONS(stname) IMPLEMENT_ASN1_FUNCTIONS_fname(stname, stname, stname)
  617. #define IMPLEMENT_ASN1_FUNCTIONS_name(stname, itname) IMPLEMENT_ASN1_FUNCTIONS_fname(stname, itname, itname)
  618. #define IMPLEMENT_ASN1_FUNCTIONS_ENCODE_name(stname, itname) 
  619. IMPLEMENT_ASN1_FUNCTIONS_ENCODE_fname(stname, itname, itname)
  620. #define IMPLEMENT_ASN1_ALLOC_FUNCTIONS(stname) 
  621. IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, stname, stname)
  622. #define IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, itname, fname) 
  623. stname *fname##_new(void) 
  624. return (stname *)ASN1_item_new(ASN1_ITEM_rptr(itname)); 
  625. void fname##_free(stname *a) 
  626. ASN1_item_free((ASN1_VALUE *)a, ASN1_ITEM_rptr(itname)); 
  627. }
  628. #define IMPLEMENT_ASN1_FUNCTIONS_fname(stname, itname, fname) 
  629. IMPLEMENT_ASN1_ENCODE_FUNCTIONS_fname(stname, itname, fname) 
  630. IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, itname, fname)
  631. #define IMPLEMENT_ASN1_ENCODE_FUNCTIONS_fname(stname, itname, fname) 
  632. stname *d2i_##fname(stname **a, const unsigned char **in, long len) 
  633. return (stname *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, ASN1_ITEM_rptr(itname));
  634. int i2d_##fname(stname *a, unsigned char **out) 
  635. return ASN1_item_i2d((ASN1_VALUE *)a, out, ASN1_ITEM_rptr(itname));
  636. #define IMPLEMENT_ASN1_NDEF_FUNCTION(stname) 
  637. int i2d_##stname##_NDEF(stname *a, unsigned char **out) 
  638. return ASN1_item_ndef_i2d((ASN1_VALUE *)a, out, ASN1_ITEM_rptr(stname));
  639. /* This includes evil casts to remove const: they will go away when full
  640.  * ASN1 constification is done.
  641.  */
  642. #define IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(stname, itname, fname) 
  643. stname *d2i_##fname(stname **a, const unsigned char **in, long len) 
  644. return (stname *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, ASN1_ITEM_rptr(itname));
  645. int i2d_##fname(const stname *a, unsigned char **out) 
  646. return ASN1_item_i2d((ASN1_VALUE *)a, out, ASN1_ITEM_rptr(itname));
  647. #define IMPLEMENT_ASN1_DUP_FUNCTION(stname) 
  648. stname * stname##_dup(stname *x) 
  649.         { 
  650.         return ASN1_item_dup(ASN1_ITEM_rptr(stname), x); 
  651.         }
  652. #define IMPLEMENT_ASN1_FUNCTIONS_const(name) 
  653. IMPLEMENT_ASN1_FUNCTIONS_const_fname(name, name, name)
  654. #define IMPLEMENT_ASN1_FUNCTIONS_const_fname(stname, itname, fname) 
  655. IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(stname, itname, fname) 
  656. IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, itname, fname)
  657. /* external definitions for primitive types */
  658. DECLARE_ASN1_ITEM(ASN1_BOOLEAN)
  659. DECLARE_ASN1_ITEM(ASN1_TBOOLEAN)
  660. DECLARE_ASN1_ITEM(ASN1_FBOOLEAN)
  661. DECLARE_ASN1_ITEM(ASN1_SEQUENCE)
  662. DECLARE_ASN1_ITEM(CBIGNUM)
  663. DECLARE_ASN1_ITEM(BIGNUM)
  664. DECLARE_ASN1_ITEM(LONG)
  665. DECLARE_ASN1_ITEM(ZLONG)
  666. DECLARE_STACK_OF(ASN1_VALUE)
  667. /* Functions used internally by the ASN1 code */
  668. int ASN1_item_ex_new(ASN1_VALUE **pval, const ASN1_ITEM *it);
  669. void ASN1_item_ex_free(ASN1_VALUE **pval, const ASN1_ITEM *it);
  670. int ASN1_template_new(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt);
  671. int ASN1_primitive_new(ASN1_VALUE **pval, const ASN1_ITEM *it);
  672. void ASN1_template_free(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt);
  673. int ASN1_template_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, const ASN1_TEMPLATE *tt);
  674. int ASN1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, const ASN1_ITEM *it,
  675. int tag, int aclass, char opt, ASN1_TLC *ctx);
  676. int ASN1_item_ex_i2d(ASN1_VALUE **pval, unsigned char **out, const ASN1_ITEM *it, int tag, int aclass);
  677. int ASN1_template_i2d(ASN1_VALUE **pval, unsigned char **out, const ASN1_TEMPLATE *tt);
  678. void ASN1_primitive_free(ASN1_VALUE **pval, const ASN1_ITEM *it);
  679. int asn1_ex_i2c(ASN1_VALUE **pval, unsigned char *cont, int *putype, const ASN1_ITEM *it);
  680. int asn1_ex_c2i(ASN1_VALUE **pval, const unsigned char *cont, int len, int utype, char *free_cont, const ASN1_ITEM *it);
  681. int asn1_get_choice_selector(ASN1_VALUE **pval, const ASN1_ITEM *it);
  682. int asn1_set_choice_selector(ASN1_VALUE **pval, int value, const ASN1_ITEM *it);
  683. ASN1_VALUE ** asn1_get_field_ptr(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt);
  684. const ASN1_TEMPLATE *asn1_do_adb(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt, int nullerr);
  685. int asn1_do_lock(ASN1_VALUE **pval, int op, const ASN1_ITEM *it);
  686. void asn1_enc_init(ASN1_VALUE **pval, const ASN1_ITEM *it);
  687. void asn1_enc_free(ASN1_VALUE **pval, const ASN1_ITEM *it);
  688. int asn1_enc_restore(int *len, unsigned char **out, ASN1_VALUE **pval, const ASN1_ITEM *it);
  689. int asn1_enc_save(ASN1_VALUE **pval, const unsigned char *in, int inlen, const ASN1_ITEM *it);
  690. #ifdef  __cplusplus
  691. }
  692. #endif
  693. #endif