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

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. #ifndef __secnew_h_
  34. #define __secnew_h_
  35. #include <stdio.h>
  36. typedef struct BERTemplateStr BERTemplate;
  37. typedef struct BERParseStr BERParse;
  38. typedef struct SECArbStr SECArb;
  39. /*
  40.  * An array of these structures define an encoding for an object using
  41.  * DER. The array is terminated with an entry where kind == 0.
  42.  */
  43. struct BERTemplateStr {
  44.     /* Kind of item to decode/encode */
  45.     unsigned long kind;
  46.     /*
  47.      * Offset from base of structure to SECItem that will hold
  48.      * decoded/encoded value.
  49.      */
  50.     unsigned short offset;
  51.     /*
  52.      * Used with DER_SET or DER_SEQUENCE. If not zero then points to a
  53.      * sub-template. The sub-template is filled in and completed before
  54.      * continuing on.
  55.      */
  56.     BERTemplate *sub;
  57.     /*
  58.      * Argument value, dependent on kind.  Size of structure to allocate
  59.      * when kind==DER_POINTER For Context-Specific Implicit types its the
  60.      * underlying type to use.
  61.      */
  62.     unsigned long arg;
  63. };
  64. /*
  65.  * an arbitrary object
  66.  */
  67. struct SECArbStr {
  68.     unsigned long tag; /* NOTE: does not support high tag form */
  69.     unsigned long length; /* as reported in stream */
  70.     union {
  71. SECItem item;
  72. struct {
  73.    int numSubs;
  74.    SECArb **subs;
  75. } cons;
  76.     } body;
  77. };
  78. /*
  79.  * Decode a piece of der encoded data.
  80.  *      "dest" points to a structure that will be filled in with the
  81.  *         decoding results.
  82.  *      "t" is a template structure which defines the shape of the
  83.  *         expected data.
  84.  *      "src" is the ber encoded data.
  85.  */
  86. extern SECStatus BER_Decode(PRArenaPool * arena, void *dest, BERTemplate *t,
  87.                            SECArb *arb);
  88. /*
  89.  * Encode a data structure into DER.
  90.  *  "dest" will be filled in (and memory allocated) to hold the der
  91.  *     encoded structure in "src"
  92.  *  "t" is a template structure which defines the shape of the
  93.  *     stored data
  94.  *  "src" is a pointer to the structure that will be encoded
  95.  */
  96. extern SECStatus BER_Encode(PRArenaPool *arena, SECItem *dest, BERTemplate *t,
  97.    void *src);
  98. /*
  99.  * Client provided function that will get called with all the bytes
  100.  * passing through the parser
  101.  */
  102. typedef void (*BERFilterProc)(void *instance, unsigned char *buf, int length);
  103. /*
  104.  * Client provided function that can will be called after the tag and
  105.  * length information has been collected. It can be set up to be called
  106.  * either before or after the data has been colleced.
  107.  */
  108. typedef void (*BERNotifyProc)(
  109.     void *instance, SECArb *arb, int depth, PRBool before);
  110. extern BERParse *BER_ParseInit(PRArenaPool *arena, PRBool forceDER);
  111. extern SECArb *BER_ParseFini(BERParse *h);
  112. extern SECStatus BER_ParseSome(BERParse *h, unsigned char *buf, int len);
  113. extern void BER_SetFilter(BERParse *h, BERFilterProc proc, void *instance);
  114. extern void BER_SetLeafStorage(BERParse *h, PRBool keep);
  115. extern void BER_SetNotifyProc(BERParse *h, BERNotifyProc proc, void *instance,
  116.       PRBool beforeData);
  117. /*
  118.  * A BERUnparseProc is used as a callback to put the encoded SECArb tree
  119.  * tree to some stream. It returns PR_TRUE if the unparsing is to be
  120.  * aborted.
  121.  */
  122. typedef SECStatus (*BERUnparseProc)(
  123.     void *instance, unsigned char *data, int length, SECArb* arb);
  124. /*
  125.  * BER_Unparse walks the SECArb tree calling the BERUnparseProc with
  126.  * various pieces. It returns SECFailure if there was an error during that
  127.  * tree walk.
  128.  */
  129. extern SECStatus BER_Unparse(SECArb *arb, BERUnparseProc proc, void *instance);
  130. /*
  131.  * BER_ResolveLengths does a recursive walk through the tree generating
  132.  * non-zero entries for the length field of each node. It will fail if it
  133.  * discoveres a non-constructed node with a unknown length data field.
  134.  * Leaves are supposed to be of known length.
  135.  */
  136. extern SECStatus BER_ResolveLengths(SECArb *arb);
  137. /*
  138.  * BER_PRettyPrintArb will write an ASCII version of the tree to the FILE
  139.  * out.
  140.  */
  141. extern SECStatus BER_PrettyPrintArb(FILE *out, SECArb* a);
  142. #endif /* __secnew_h_ */