secasn1t.h
上传用户:lyxiangda
上传日期:2007-01-12
资源大小:3042k
文件大小:10k
源码类别:

CA认证

开发平台:

WINDOWS

  1. /*
  2.  * The contents of this file are subject to the Mozilla Public
  3.  * License Version 1.1 (the "License"); you may not use this file
  4.  * except in compliance with the License. You may obtain a copy of
  5.  * the License at http://www.mozilla.org/MPL/
  6.  * 
  7.  * Software distributed under the License is distributed on an "AS
  8.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  9.  * implied. See the License for the specific language governing
  10.  * rights and limitations under the License.
  11.  * 
  12.  * The Original Code is the Netscape security libraries.
  13.  * 
  14.  * The Initial Developer of the Original Code is Netscape
  15.  * Communications Corporation.  Portions created by Netscape are 
  16.  * Copyright (C) 1994-2000 Netscape Communications Corporation.  All
  17.  * Rights Reserved.
  18.  * 
  19.  * Contributor(s):
  20.  * 
  21.  * Alternatively, the contents of this file may be used under the
  22.  * terms of the GNU General Public License Version 2 or later (the
  23.  * "GPL"), in which case the provisions of the GPL are applicable 
  24.  * instead of those above.  If you wish to allow use of your 
  25.  * version of this file only under the terms of the GPL and not to
  26.  * allow others to use your version of this file under the MPL,
  27.  * indicate your decision by deleting the provisions above and
  28.  * replace them with the notice and other provisions required by
  29.  * the GPL.  If you do not delete the provisions above, a recipient
  30.  * may use your version of this file under either the MPL or the
  31.  * GPL.
  32.  */
  33. /*
  34.  * Types for encoding/decoding of ASN.1 using BER/DER (Basic/Distinguished
  35.  * Encoding Rules).
  36.  *
  37.  * $Id: secasn1t.h,v 1.1 2000/03/31 19:39:06 relyea%netscape.com Exp $
  38.  */
  39. #ifndef _SECASN1T_H_
  40. #define _SECASN1T_H_
  41. /*
  42. ** An array of these structures defines a BER/DER encoding for an object.
  43. **
  44. ** The array usually starts with a dummy entry whose kind is SEC_ASN1_SEQUENCE;
  45. ** such an array is terminated with an entry where kind == 0.  (An array
  46. ** which consists of a single component does not require a second dummy
  47. ** entry -- the array is only searched as long as previous component(s)
  48. ** instruct it.)
  49. */
  50. typedef struct sec_ASN1Template_struct {
  51.     /*
  52.     ** Kind of item being decoded/encoded, including tags and modifiers.
  53.     */
  54.     unsigned long kind;
  55.     /*
  56.     ** The value is the offset from the base of the structure to the
  57.     ** field that holds the value being decoded/encoded.
  58.     */
  59.     unsigned long offset;
  60.     /*
  61.     ** When kind suggests it (SEC_ASN1_POINTER, SEC_ASN1_GROUP, SEC_ASN1_INLINE,
  62.     ** or a component that is *not* a SEC_ASN1_UNIVERSAL), this points to
  63.     ** a sub-template for nested encoding/decoding,
  64.     ** OR, iff SEC_ASN1_DYNAMIC is set, then this is a pointer to a pointer
  65.     ** to a function which will return the appropriate template when called
  66.     ** at runtime.  NOTE! that explicit level of indirection, which is
  67.     ** necessary because ANSI does not allow you to store a function
  68.     ** pointer directly as a "void *" so we must store it separately and
  69.     ** dereference it to get at the function pointer itself.
  70.     */
  71.     const void *sub;
  72.     /*
  73.     ** In the first element of a template array, the value is the size
  74.     ** of the structure to allocate when this template is being referenced
  75.     ** by another template via SEC_ASN1_POINTER or SEC_ASN1_GROUP.
  76.     ** In all other cases, the value is ignored.
  77.     */
  78.     unsigned int size;
  79. } SEC_ASN1Template;
  80. /* default size used for allocation of encoding/decoding stuff */
  81. /* XXX what is the best value here? */
  82. #define SEC_ASN1_DEFAULT_ARENA_SIZE (2048)
  83. /*
  84. ** BER/DER values for ASN.1 identifier octets.
  85. */
  86. #define SEC_ASN1_TAG_MASK 0xff
  87. /*
  88.  * BER/DER universal type tag numbers.
  89.  * The values are defined by the X.208 standard; do not change them!
  90.  * NOTE: if you add anything to this list, you must add code to secasn1d.c
  91.  * to accept the tag, and probably also to secasn1e.c to encode it.
  92.  * XXX It appears some have been added recently without being added to
  93.  * the code; so need to go through the list now and double-check them all.
  94.  * (Look especially at those added in revision 1.10.)
  95.  */
  96. #define SEC_ASN1_TAGNUM_MASK 0x1f
  97. #define SEC_ASN1_BOOLEAN 0x01
  98. #define SEC_ASN1_INTEGER 0x02
  99. #define SEC_ASN1_BIT_STRING 0x03
  100. #define SEC_ASN1_OCTET_STRING 0x04
  101. #define SEC_ASN1_NULL 0x05
  102. #define SEC_ASN1_OBJECT_ID 0x06
  103. #define SEC_ASN1_OBJECT_DESCRIPTOR      0x07
  104. /* External type and instance-of type   0x08 */
  105. #define SEC_ASN1_REAL                   0x09
  106. #define SEC_ASN1_ENUMERATED 0x0a
  107. #define SEC_ASN1_EMBEDDED_PDV           0x0b
  108. #define SEC_ASN1_UTF8_STRING 0x0c
  109. #define SEC_ASN1_SEQUENCE 0x10
  110. #define SEC_ASN1_SET 0x11
  111. #define SEC_ASN1_NUMERIC_STRING         0x12
  112. #define SEC_ASN1_PRINTABLE_STRING 0x13
  113. #define SEC_ASN1_T61_STRING 0x14
  114. #define SEC_ASN1_TELETEX_STRING SEC_ASN1_T61_STRING
  115. #define SEC_ASN1_VIDEOTEX_STRING        0x15
  116. #define SEC_ASN1_IA5_STRING 0x16
  117. #define SEC_ASN1_UTC_TIME 0x17
  118. #define SEC_ASN1_GENERALIZED_TIME 0x18
  119. #define SEC_ASN1_GRAPHIC_STRING         0x19
  120. #define SEC_ASN1_VISIBLE_STRING 0x1a
  121. #define SEC_ASN1_GENERAL_STRING         0x1b
  122. #define SEC_ASN1_UNIVERSAL_STRING 0x1c
  123. /*                                      0x1d */
  124. #define SEC_ASN1_BMP_STRING 0x1e
  125. #define SEC_ASN1_HIGH_TAG_NUMBER 0x1f
  126. /*
  127. ** Modifiers to type tags.  These are also specified by a/the
  128. ** standard, and must not be changed.
  129. */
  130. #define SEC_ASN1_METHOD_MASK 0x20
  131. #define SEC_ASN1_PRIMITIVE 0x00
  132. #define SEC_ASN1_CONSTRUCTED 0x20
  133. #define SEC_ASN1_CLASS_MASK 0xc0
  134. #define SEC_ASN1_UNIVERSAL 0x00
  135. #define SEC_ASN1_APPLICATION 0x40
  136. #define SEC_ASN1_CONTEXT_SPECIFIC 0x80
  137. #define SEC_ASN1_PRIVATE 0xc0
  138. /*
  139. ** Our additions, used for templates.
  140. ** These are not defined by any standard; the values are used internally only.
  141. ** Just be careful to keep them out of the low 8 bits.
  142. ** XXX finish comments
  143. */
  144. #define SEC_ASN1_OPTIONAL 0x00100
  145. #define SEC_ASN1_EXPLICIT 0x00200
  146. #define SEC_ASN1_ANY 0x00400
  147. #define SEC_ASN1_INLINE 0x00800
  148. #define SEC_ASN1_POINTER 0x01000
  149. #define SEC_ASN1_GROUP 0x02000 /* with SET or SEQUENCE means
  150.  * SET OF or SEQUENCE OF */
  151. #define SEC_ASN1_DYNAMIC 0x04000 /* subtemplate is found by calling
  152.  * a function at runtime */
  153. #define SEC_ASN1_SKIP 0x08000 /* skip a field; only for decoding */
  154. #define SEC_ASN1_INNER 0x10000 /* with ANY means capture the
  155.  * contents only (not the id, len,
  156.  * or eoc); only for decoding */
  157. #define SEC_ASN1_SAVE 0x20000 /* stash away the encoded bytes first;
  158.  * only for decoding */
  159. #define SEC_ASN1_MAY_STREAM 0x40000 /* field or one of its sub-fields may
  160.  * stream in and so should encode as
  161.  * indefinite-length when streaming
  162.  * has been indicated; only for
  163.  * encoding */
  164. #define SEC_ASN1_SKIP_REST 0x80000 /* skip all following fields;
  165.    only for decoding */
  166. #define SEC_ASN1_CHOICE        0x100000 /* pick one from a template */
  167. /* Shorthand/Aliases */
  168. #define SEC_ASN1_SEQUENCE_OF (SEC_ASN1_GROUP | SEC_ASN1_SEQUENCE)
  169. #define SEC_ASN1_SET_OF (SEC_ASN1_GROUP | SEC_ASN1_SET)
  170. #define SEC_ASN1_ANY_CONTENTS (SEC_ASN1_ANY | SEC_ASN1_INNER)
  171. /*
  172. ** Function used for SEC_ASN1_DYNAMIC.
  173. ** "arg" is a pointer to the structure being encoded/decoded
  174. ** "enc", when true, means that we are encoding (false means decoding)
  175. */
  176. typedef const SEC_ASN1Template * (* SEC_ChooseASN1TemplateFunc)(void *arg,
  177. PRBool enc);
  178. /*
  179. ** Opaque object used by the decoder to store state.
  180. */
  181. typedef struct sec_DecoderContext_struct SEC_ASN1DecoderContext;
  182. /*
  183. ** Opaque object used by the encoder to store state.
  184. */
  185. typedef struct sec_EncoderContext_struct SEC_ASN1EncoderContext;
  186. /*
  187.  * This is used to describe to a filter function the bytes that are
  188.  * being passed to it.  This is only useful when the filter is an "outer"
  189.  * one, meaning it expects to get *all* of the bytes not just the
  190.  * contents octets.
  191.  */
  192. typedef enum {
  193.     SEC_ASN1_Identifier,
  194.     SEC_ASN1_Length,
  195.     SEC_ASN1_Contents,
  196.     SEC_ASN1_EndOfContents
  197. } SEC_ASN1EncodingPart;
  198. /*
  199.  * Type of the function pointer used either for decoding or encoding,
  200.  * when doing anything "funny" (e.g. manipulating the data stream)
  201.  */ 
  202. typedef void (* SEC_ASN1NotifyProc)(void *arg, PRBool before,
  203.     void *dest, int real_depth);
  204. /*
  205.  * Type of the function pointer used for grabbing encoded bytes.
  206.  * This can be used during either encoding or decoding, as follows...
  207.  *
  208.  * When decoding, this can be used to filter the encoded bytes as they
  209.  * are parsed.  This is what you would do if you wanted to process the data
  210.  * along the way (like to decrypt it, or to perform a hash on it in order
  211.  * to do a signature check later).  See SEC_ASN1DecoderSetFilterProc().
  212.  * When processing only part of the encoded bytes is desired, you "watch"
  213.  * for the field(s) you are interested in with a "notify proc" (see
  214.  * SEC_ASN1DecoderSetNotifyProc()) and for even finer granularity (e.g. to
  215.  * ignore all by the contents bytes) you pay attention to the "data_kind"
  216.  * parameter.
  217.  *
  218.  * When encoding, this is the specification for the output function which
  219.  * will receive the bytes as they are encoded.  The output function can
  220.  * perform any postprocessing necessary (like hashing (some of) the data
  221.  * to create a digest that gets included at the end) as well as shoving
  222.  * the data off wherever it needs to go.  (In order to "tune" any processing,
  223.  * you can set a "notify proc" as described above in the decoding case.)
  224.  *
  225.  * The parameters:
  226.  * - "arg" is an opaque pointer that you provided at the same time you
  227.  *   specified a function of this type
  228.  * - "data" is a buffer of length "len", containing the encoded bytes
  229.  * - "depth" is how deep in a nested encoding we are (it is not usually
  230.  *   valuable, but can be useful sometimes so I included it)
  231.  * - "data_kind" tells you if these bytes are part of the ASN.1 encoded
  232.  *   octets for identifier, length, contents, or end-of-contents
  233.  */ 
  234. typedef void (* SEC_ASN1WriteProc)(void *arg,
  235.    const char *data, unsigned long len,
  236.    int depth, SEC_ASN1EncodingPart data_kind);
  237. #endif /* _SECASN1T_H_ */