/*
* The contents of this file are subject to the Mozilla Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is the Netscape security libraries.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1994-2000 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the
* terms of the GNU General Public License Version 2 or later (the
* "GPL"), in which case the provisions of the GPL are applicable
* instead of those above. If you wish to allow use of your
* version of this file only under the terms of the GPL and not to
* allow others to use your version of this file under the MPL,
* indicate your decision by deleting the provisions above and
* replace them with the notice and other provisions required by
* the GPL. If you do not delete the provisions above, a recipient
* may use your version of this file under either the MPL or the
* GPL.
*//*
* Private (SPI) types libsecurity_asn1.h.
*/
#ifndef_SECASN1T_H_
#define_SECASN1T_H_
#include<CoreFoundation/CFBase.h>/* Boolean */
#include<sys/types.h>
#include<Security/SecAsn1Types.h>/* public types *//* default size used for allocation of encoding/decoding stuff */
#defineSEC_ASN1_DEFAULT_ARENA_SIZE (2048)
/*
* Tempalte flags we don't export in the public API in SecAsn1Types.h
*/
#defineSEC_ASN1_MAY_STREAM 0x40000 /* field or one of its sub-fields may
* stream in and so should encode as
* indefinite-length when streaming
* has been indicated; only for
* encoding */
#defineSEC_ASN1_NO_STREAM 0X200000 /* This entry will not stream
* even if the sub-template says
* streaming is possible. Helps
* to solve ambiguities with potential
* streaming entries that are
* optional *//* Maximum depth of nested SEQUENCEs and SETs */
#defineSEC_ASN1D_MAX_DEPTH 32
#defineSEC_ASN1_GET(x) x
#defineSEC_ASN1_SUB(x) x
#defineSEC_ASN1_XTRN 0
#defineSEC_ASN1_MKSUB(x)
#defineSEC_ASN1_CHOOSER_DECLARE(x) \
externconst SecAsn1Template * NSS_Get_##x (void *arg, Boolean enc);
#defineSEC_ASN1_CHOOSER_IMPLEMENT(x) \
const SecAsn1Template * NSS_Get_##x(void * arg, Boolean enc) \
{ return x; }
/*
** Opaque object used by the decoder to store state.
*/typedefstruct sec_DecoderContext_struct SEC_ASN1DecoderContext;
/*
** Opaque object used by the encoder to store state.
*/typedefstruct sec_EncoderContext_struct SEC_ASN1EncoderContext;
/*
* This is used to describe to a filter function the bytes that are
* being passed to it. This is only useful when the filter is an "outer"
* one, meaning it expects to get *all* of the bytes not just the
* contents octets.
*/typedefenum {
SEC_ASN1_Identifier = 0,
SEC_ASN1_Length = 1,
SEC_ASN1_Contents = 2,
SEC_ASN1_EndOfContents = 3
} SEC_ASN1EncodingPart;
/*
* Type of the function pointer used either for decoding or encoding,
* when doing anything "funny" (e.g. manipulating the data stream)
*/typedefvoid (* SEC_ASN1NotifyProc)(void *arg, Boolean before,
void *dest, int real_depth);
/*
* Type of the function pointer used for grabbing encoded bytes.
* This can be used during either encoding or decoding, as follows...
*
* When decoding, this can be used to filter the encoded bytes as they
* are parsed. This is what you would do if you wanted to process the data
* along the way (like to decrypt it, or to perform a hash on it in order
* to do a signature check later). See SEC_ASN1DecoderSetFilterProc().
* When processing only part of the encoded bytes is desired, you "watch"
* for the field(s) you are interested in with a "notify proc" (see
* SEC_ASN1DecoderSetNotifyProc()) and for even finer granularity (e.g. to
* ignore all by the contents bytes) you pay attention to the "data_kind"
* parameter.
*
* When encoding, this is the specification for the output function which
* will receive the bytes as they are encoded. The output function can
* perform any postprocessing necessary (like hashing (some of) the data
* to create a digest that gets included at the end) as well as shoving
* the data off wherever it needs to go. (In order to "tune" any processing,
* you can set a "notify proc" as described above in the decoding case.)
*
* The parameters:
* - "arg" is an opaque pointer that you provided at the same time you
* specified a function of this type
* - "data" is a buffer of length "len", containing the encoded bytes
* - "depth" is how deep in a nested encoding we are (it is not usually
* valuable, but can be useful sometimes so I included it)
* - "data_kind" tells you if these bytes are part of the ASN.1 encoded
* octets for identifier, length, contents, or end-of-contents
*/typedefvoid (* SEC_ASN1WriteProc)(void *arg,
constchar *data, size_t len,
int depth, SEC_ASN1EncodingPart data_kind);
#endif/* _SECASN1T_H_ */