99 lines
2.6 KiB
C
99 lines
2.6 KiB
C
/* Copyright (c) 2005-2007 Apple Inc. All Rights Reserved. */
|
|
|
|
/*
|
|
* DER_Encode.h - DER encoding routines
|
|
*
|
|
* Created Dec. 2 2005 by dmitch
|
|
*/
|
|
|
|
#ifndef _DER_ENCODE_H_
|
|
#define _DER_ENCODE_H_
|
|
|
|
#include <libDER/libDER.h>
|
|
|
|
__BEGIN_DECLS
|
|
|
|
/*
|
|
* Max size of an encoded item given its length.
|
|
* This includes a possible leading zero prepended to a signed integer
|
|
* (see DER_ENC_SIGNED_INT below).
|
|
*/
|
|
#define DER_MAX_ENCODED_SIZE(len) \
|
|
( 1 + /* tag */ \
|
|
5 + /* max length */ \
|
|
1 + /* possible prepended zero */ \
|
|
len)
|
|
|
|
/* calculate size of encoded length */
|
|
DERSize DERLengthOfLength(
|
|
DERSize length);
|
|
|
|
/* encode length */
|
|
DERReturn DEREncodeLength(
|
|
DERSize length,
|
|
DERByte *buf, /* encoded length goes here */
|
|
DERSize *inOutLen); /* IN/OUT */
|
|
|
|
/* calculate size of encoded length */
|
|
DERSize DERLengthOfItem(
|
|
DERTag tag,
|
|
DERSize length);
|
|
|
|
/* encode item */
|
|
DERReturn DEREncodeItem(
|
|
DERTag tag,
|
|
DERSize length,
|
|
const DERByte *src,
|
|
DERByte *derOut, /* encoded item goes here */
|
|
DERSize *inOutLen); /* IN/OUT */
|
|
|
|
/*
|
|
* Per-item encode options.
|
|
*/
|
|
|
|
/* explicit default, no options */
|
|
#define DER_ENC_NO_OPTS 0x0000
|
|
|
|
/* signed integer check: if incoming m.s. bit is 1, prepend a zero */
|
|
#define DER_ENC_SIGNED_INT 0x0100
|
|
|
|
/* DERItem contains fully encoded item - copy, don't encode */
|
|
#define DER_ENC_WRITE_DER 0x0200
|
|
|
|
|
|
/*
|
|
* High-level sequence or set encode support.
|
|
*
|
|
* The outgoing sequence is expressed as an array of DERItemSpecs, each
|
|
* of which corresponds to one item in the encoded sequence.
|
|
*
|
|
* Normally the tag of the encoded item comes from the associated
|
|
* DERItemSpec, and the content comes from the DERItem whose address is
|
|
* the src arg plus the offset value in the associated DERItemSpec.
|
|
*
|
|
* If the DER_ENC_WRITE_DER option is true for a given DERItemSpec then
|
|
* no per-item encoding is done; the DER - with tag, length, and content -
|
|
* is taken en masse from the associated DERItem.
|
|
*/
|
|
DERReturn DEREncodeSequence(
|
|
DERTag topTag, /* ASN1_CONSTR_SEQUENCE, ASN1_CONSTR_SET */
|
|
const void *src, /* generally a ptr to a struct full of
|
|
* DERItems */
|
|
DERShort numItems, /* size of itemSpecs[] */
|
|
const DERItemSpec *itemSpecs,
|
|
DERByte *derOut, /* encoded data written here */
|
|
DERSize *inOutLen); /* IN/OUT */
|
|
|
|
/* precalculate the length of an encoded sequence. */
|
|
DERSize DERLengthOfEncodedSequence(
|
|
DERTag topTag, /* ASN1_CONSTR_SEQUENCE, ASN1_CONSTR_SET */
|
|
const void *src, /* generally a ptr to a struct full of
|
|
* DERItems */
|
|
DERShort numItems, /* size of itemSpecs[] */
|
|
const DERItemSpec *itemSpecs);
|
|
|
|
__END_DECLS
|
|
|
|
#endif /* _DER_DECODE_H_ */
|
|
|