ber_der.h revision 3433:2971a4d3cf72
1/* 2 * Copyright 2007 Sun Microsystems, Inc. All rights reserved. 3 * Use is subject to license terms. 4 */ 5 6/* 7 * Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 8 * 9 * The contents of this file are subject to the Netscape Public License 10 * Version 1.0(the "NPL"); you may not use this file except in 11 * compliance with the NPL. You may obtain a copy of the NPL at 12 * http:/ /www.mozilla.org/NPL/ 13 * 14 * Software distributed under the NPL is distributed on an "AS IS" basis, 15 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL 16 * for the specific language governing rights and limitations under the 17 * NPL. 18 * 19 * The Initial Developer of this code under the NPL is Netscape 20 * Communications Corporation. Portions created by Netscape are 21 * Copyright(C) 1998 Netscape Communications Corporation. All Rights 22 * Reserved. 23 */ 24 25#pragma ident "%Z%%M% %I% %E% SMI" 26 27/* 28 * This is the header file for some Basic Encoding Rules and Distinguished 29 * Encoding Rules (BER/DER) routines. 30 */ 31 32#ifndef BER_DER_H 33#define BER_DER_H 34 35#include <kmfapi.h> 36 37#define BER_BOOLEAN 1 38#define BER_INTEGER 2 39#define BER_BIT_STRING 3 40#define BER_OCTET_STRING 4 41#define BER_NULL 5 42#define BER_OBJECT_IDENTIFIER 6 43#define BER_ENUMERATED 10 44#define BER_UTF8_STRING 12 45#define BER_SEQUENCE 16 46#define BER_SET 17 47#define BER_PRINTABLE_STRING 19 48#define BER_T61STRING 20 49#define BER_IA5STRING 22 50#define BER_UTCTIME 23 51#define BER_GENTIME 24 52#define BER_UNIVERSAL_STRING 28 53#define BER_BMP_STRING 30 54 55#define BER_CLASS_MASK 0xc0 56#define BER_CLASS_UNIVERSAL 0x00 57#define BER_CLASS_APPLICATION 0x40 58#define BER_CLASS_CONTEXTSPECIFIC 0x80 59#define BER_CLASS_PRIVATE 0xc0 60#define BER_CONSTRUCTED 0x20 61#define BER_CONSTRUCTED_SEQUENCE (BER_CONSTRUCTED | BER_SEQUENCE) 62#define BER_CONSTRUCTED_SET (BER_CONSTRUCTED | BER_SET) 63 64#define KMFBER_BIG_TAG_MASK 0x1f 65#define KMFBER_MORE_TAG_MASK 0x80 66 67#define KMFBER_DEFAULT 0xFFFFFFFF 68#define KMFBER_ERROR 0xFFFFFFFF 69#define KMFBER_END_OF_SEQORSET 0xfffffffe 70 71/* BerElement set/get options */ 72#define KMFBER_OPT_REMAINING_BYTES 0x01 73#define KMFBER_OPT_TOTAL_BYTES 0x02 74#define KMFBER_OPT_USE_DER 0x04 75#define KMFBER_OPT_TRANSLATE_STRINGS 0x08 76#define KMFBER_OPT_BYTES_TO_WRITE 0x10 77#define KMFBER_OPT_DEBUG_LEVEL 0x40 78 79typedef size_t ber_len_t; /* for BER len */ 80typedef long ber_slen_t; /* signed equivalent of ber_len_t */ 81typedef int32_t ber_tag_t; /* for BER tags */ 82typedef int32_t ber_int_t; /* for BER ints, enums, and Booleans */ 83typedef uint32_t ber_uint_t; /* unsigned equivalent of ber_int_t */ 84 85typedef struct berelement BerElement; 86typedef int (*BERTranslateProc)(char **, ber_uint_t *, int); 87 88typedef struct berval { 89 ber_len_t bv_len; 90 char *bv_val; 91} BerValue; 92 93#define SAFEMEMCPY(d, s, n) memmove(d, s, n) 94 95BerElement *kmfder_init(const struct berval *bv); 96BerElement *kmfber_init(const struct berval *bv); 97int kmfber_calc_taglen(ber_tag_t); 98int kmfber_calc_lenlen(ber_int_t); 99int kmfber_put_len(BerElement *, ber_int_t, int); 100 101/* 102 * public decode routines 103 */ 104ber_tag_t kmfber_first_element(BerElement *, ber_len_t *, char **); 105ber_tag_t kmfber_next_element(BerElement *, ber_len_t *, char *); 106ber_tag_t kmfber_scanf(BerElement *, const char *, ...); 107 108void kmfber_bvfree(struct berval *); 109void kmfber_bvecfree(struct berval **); 110struct berval *kmfber_bvdup(const struct berval *); 111 112/* 113 * public encoding routines 114 */ 115extern int kmfber_printf(BerElement *, const char *, ...); 116extern int kmfber_flatten(BerElement *, struct berval **); 117 118/* 119 * miscellaneous public routines 120 */ 121extern void kmfber_free(BerElement *ber, int freebuf); 122extern BerElement* kmfber_alloc(void); 123extern BerElement* kmfder_alloc(void); 124extern BerElement* kmfber_alloc_t(int); 125extern BerElement* kmfber_dup(BerElement *); 126extern ber_int_t kmfber_read(BerElement *, char *, ber_len_t); 127extern ber_int_t kmfber_write(BerElement *, char *, ber_len_t, int); 128extern void kmfber_reset(BerElement *, int); 129 130/* Routines KMF uses to encode/decode Cert objects */ 131extern KMF_RETURN DerDecodeSignedCertificate(const KMF_DATA *, 132 KMF_X509_CERTIFICATE **); 133extern KMF_RETURN DerEncodeSignedCertificate(KMF_X509_CERTIFICATE *, 134 KMF_DATA *); 135 136KMF_RETURN DerDecodeTbsCertificate(const KMF_DATA *, 137 KMF_X509_TBS_CERT **); 138KMF_RETURN DerEncodeTbsCertificate(KMF_X509_TBS_CERT *, KMF_DATA *); 139 140KMF_RETURN DerDecodeSignedCsr(const KMF_DATA *, KMF_CSR_DATA **); 141extern KMF_RETURN DerEncodeSignedCsr(KMF_CSR_DATA *, KMF_DATA *); 142extern KMF_RETURN DerDecodeTbsCsr(const KMF_DATA *, KMF_TBS_CSR **); 143extern KMF_RETURN DerEncodeTbsCsr(KMF_TBS_CSR *, KMF_DATA *); 144 145KMF_RETURN ExtractX509CertParts(KMF_DATA *, KMF_DATA *, KMF_DATA *); 146KMF_RETURN GetKeyFromSpki(KMF_ALGORITHM_INDEX, KMF_X509_SPKI *, 147 KMF_DATA **); 148extern KMF_RETURN DerEncodeName(KMF_X509_NAME *, KMF_DATA *); 149KMF_RETURN DerDecodeName(KMF_DATA *, KMF_X509_NAME *); 150KMF_RETURN DerDecodeExtension(KMF_DATA *, KMF_X509_EXTENSION **); 151KMF_RETURN CopyRDN(KMF_X509_NAME *, KMF_X509_NAME **); 152KMF_RETURN CopySPKI(KMF_X509_SPKI *, 153 KMF_X509_SPKI **); 154extern KMF_RETURN DerDecodeSPKI(KMF_DATA *, KMF_X509_SPKI *); 155extern KMF_RETURN DerDecodeDSASignature(KMF_DATA *, KMF_DATA *); 156extern KMF_RETURN DerEncodeDSASignature(KMF_DATA *, KMF_DATA *); 157KMF_RETURN DerEncodeAlgoid(KMF_DATA *, KMF_DATA *); 158KMF_RETURN DerDecodeSPKI(KMF_DATA *, KMF_X509_SPKI *); 159KMF_RETURN DerEncodeSPKI(KMF_X509_SPKI *, KMF_DATA *); 160extern KMF_RETURN ExtractSPKIData(const KMF_X509_SPKI *, 161 KMF_ALGORITHM_INDEX, KMF_DATA *, uint32_t *); 162extern KMF_RETURN AddRDN(KMF_X509_NAME *, KMF_X509_RDN *); 163KMF_RETURN DerEncodeRSAPrivateKey(KMF_DATA *, KMF_RAW_RSA_KEY *); 164KMF_RETURN DerEncodeDSAPrivateKey(KMF_DATA *, KMF_RAW_DSA_KEY *); 165 166#endif /* BER_DER_H */ 167