From fcf68d1ce49f8330fba9d9febb9634f65b22b230 Mon Sep 17 00:00:00 2001 From: Adam Potolsky Date: Fri, 1 May 2015 16:55:29 -0700 Subject: [PATCH] Adding OSX binaries and headers for compilation from binaries #4587 --- ext/openssl-osx/include/nope/aes.h | 149 + ext/openssl-osx/include/nope/asn1t.h | 973 ++++ ext/openssl-osx/include/nope/blowfish.h | 130 + ext/openssl-osx/include/nope/camellia.h | 132 + ext/openssl-osx/include/nope/cast.h | 107 + ext/openssl-osx/include/nope/cmac.h | 82 + ext/openssl-osx/include/nope/cms.h | 555 +++ ext/openssl-osx/include/nope/conf.h | 267 ++ ext/openssl-osx/include/nope/conf_api.h | 89 + ext/openssl-osx/include/nope/des.h | 257 + ext/openssl-osx/include/nope/des_old.h | 497 ++ ext/openssl-osx/include/nope/dso.h | 451 ++ ext/openssl-osx/include/nope/ebcdic.h | 26 + ext/openssl-osx/include/nope/engine.h | 960 ++++ ext/openssl-osx/include/nope/idea.h | 105 + ext/openssl-osx/include/nope/krb5_asn.h | 240 + ext/openssl-osx/include/nope/md4.h | 119 + ext/openssl-osx/include/nope/md5.h | 119 + ext/openssl-osx/include/nope/mdc2.h | 94 + ext/openssl-osx/include/nope/modes.h | 163 + ext/openssl-osx/include/nope/ocsp.h | 637 +++ ext/openssl-osx/include/nope/pkcs12.h | 342 ++ ext/openssl-osx/include/nope/rand.h | 150 + ext/openssl-osx/include/nope/rc2.h | 103 + ext/openssl-osx/include/nope/rc4.h | 88 + ext/openssl-osx/include/nope/ripemd.h | 105 + ext/openssl-osx/include/nope/seed.h | 149 + ext/openssl-osx/include/nope/srp.h | 169 + ext/openssl-osx/include/nope/ts.h | 862 ++++ ext/openssl-osx/include/nope/txt_db.h | 112 + ext/openssl-osx/include/nope/ui.h | 415 ++ ext/openssl-osx/include/nope/ui_compat.h | 88 + ext/openssl-osx/include/nope/whrlpool.h | 41 + ext/openssl-osx/include/nope/x509v3.h | 1055 +++++ ext/openssl-osx/include/openssl/asn1.h | 1418 ++++++ ext/openssl-osx/include/openssl/asn1_mac.h | 579 +++ ext/openssl-osx/include/openssl/bio.h | 878 ++++ ext/openssl-osx/include/openssl/bn.h | 934 ++++ ext/openssl-osx/include/openssl/buffer.h | 119 + ext/openssl-osx/include/openssl/comp.h | 79 + ext/openssl-osx/include/openssl/crypto.h | 661 +++ ext/openssl-osx/include/openssl/dh.h | 392 ++ ext/openssl-osx/include/openssl/dsa.h | 332 ++ ext/openssl-osx/include/openssl/dtls1.h | 271 ++ ext/openssl-osx/include/openssl/e_os2.h | 322 ++ ext/openssl-osx/include/openssl/ec.h | 1281 +++++ ext/openssl-osx/include/openssl/ecdh.h | 134 + ext/openssl-osx/include/openssl/ecdsa.h | 335 ++ ext/openssl-osx/include/openssl/err.h | 389 ++ ext/openssl-osx/include/openssl/evp.h | 1519 ++++++ ext/openssl-osx/include/openssl/hmac.h | 109 + ext/openssl-osx/include/openssl/kssl.h | 197 + ext/openssl-osx/include/openssl/lhash.h | 240 + ext/openssl-osx/include/openssl/obj_mac.h | 4194 +++++++++++++++++ ext/openssl-osx/include/openssl/objects.h | 1143 +++++ ext/openssl-osx/include/openssl/opensslconf.h | 261 + ext/openssl-osx/include/openssl/opensslv.h | 97 + ext/openssl-osx/include/openssl/ossl_typ.h | 211 + ext/openssl-osx/include/openssl/pem.h | 615 +++ ext/openssl-osx/include/openssl/pem2.h | 70 + ext/openssl-osx/include/openssl/pkcs7.h | 481 ++ ext/openssl-osx/include/openssl/pqueue.h | 99 + ext/openssl-osx/include/openssl/rsa.h | 664 +++ ext/openssl-osx/include/openssl/safestack.h | 2672 +++++++++++ ext/openssl-osx/include/openssl/sha.h | 214 + ext/openssl-osx/include/openssl/srtp.h | 147 + ext/openssl-osx/include/openssl/ssl.h | 3159 +++++++++++++ ext/openssl-osx/include/openssl/ssl2.h | 265 ++ ext/openssl-osx/include/openssl/ssl23.h | 84 + ext/openssl-osx/include/openssl/ssl3.h | 774 +++ ext/openssl-osx/include/openssl/stack.h | 107 + ext/openssl-osx/include/openssl/symhacks.h | 516 ++ ext/openssl-osx/include/openssl/tls1.h | 813 ++++ ext/openssl-osx/include/openssl/x509.h | 1327 ++++++ ext/openssl-osx/include/openssl/x509_vfy.h | 641 +++ ext/openssl-osx/libcrypto.a | Bin 0 -> 2700624 bytes ext/openssl-osx/libssl.a | Bin 0 -> 510536 bytes 77 files changed, 38574 insertions(+) create mode 100644 ext/openssl-osx/include/nope/aes.h create mode 100644 ext/openssl-osx/include/nope/asn1t.h create mode 100644 ext/openssl-osx/include/nope/blowfish.h create mode 100644 ext/openssl-osx/include/nope/camellia.h create mode 100644 ext/openssl-osx/include/nope/cast.h create mode 100644 ext/openssl-osx/include/nope/cmac.h create mode 100644 ext/openssl-osx/include/nope/cms.h create mode 100644 ext/openssl-osx/include/nope/conf.h create mode 100644 ext/openssl-osx/include/nope/conf_api.h create mode 100644 ext/openssl-osx/include/nope/des.h create mode 100644 ext/openssl-osx/include/nope/des_old.h create mode 100644 ext/openssl-osx/include/nope/dso.h create mode 100644 ext/openssl-osx/include/nope/ebcdic.h create mode 100644 ext/openssl-osx/include/nope/engine.h create mode 100644 ext/openssl-osx/include/nope/idea.h create mode 100644 ext/openssl-osx/include/nope/krb5_asn.h create mode 100644 ext/openssl-osx/include/nope/md4.h create mode 100644 ext/openssl-osx/include/nope/md5.h create mode 100644 ext/openssl-osx/include/nope/mdc2.h create mode 100644 ext/openssl-osx/include/nope/modes.h create mode 100644 ext/openssl-osx/include/nope/ocsp.h create mode 100644 ext/openssl-osx/include/nope/pkcs12.h create mode 100644 ext/openssl-osx/include/nope/rand.h create mode 100644 ext/openssl-osx/include/nope/rc2.h create mode 100644 ext/openssl-osx/include/nope/rc4.h create mode 100644 ext/openssl-osx/include/nope/ripemd.h create mode 100644 ext/openssl-osx/include/nope/seed.h create mode 100644 ext/openssl-osx/include/nope/srp.h create mode 100644 ext/openssl-osx/include/nope/ts.h create mode 100644 ext/openssl-osx/include/nope/txt_db.h create mode 100644 ext/openssl-osx/include/nope/ui.h create mode 100644 ext/openssl-osx/include/nope/ui_compat.h create mode 100644 ext/openssl-osx/include/nope/whrlpool.h create mode 100644 ext/openssl-osx/include/nope/x509v3.h create mode 100644 ext/openssl-osx/include/openssl/asn1.h create mode 100644 ext/openssl-osx/include/openssl/asn1_mac.h create mode 100644 ext/openssl-osx/include/openssl/bio.h create mode 100644 ext/openssl-osx/include/openssl/bn.h create mode 100644 ext/openssl-osx/include/openssl/buffer.h create mode 100644 ext/openssl-osx/include/openssl/comp.h create mode 100644 ext/openssl-osx/include/openssl/crypto.h create mode 100644 ext/openssl-osx/include/openssl/dh.h create mode 100644 ext/openssl-osx/include/openssl/dsa.h create mode 100644 ext/openssl-osx/include/openssl/dtls1.h create mode 100644 ext/openssl-osx/include/openssl/e_os2.h create mode 100644 ext/openssl-osx/include/openssl/ec.h create mode 100644 ext/openssl-osx/include/openssl/ecdh.h create mode 100644 ext/openssl-osx/include/openssl/ecdsa.h create mode 100644 ext/openssl-osx/include/openssl/err.h create mode 100644 ext/openssl-osx/include/openssl/evp.h create mode 100644 ext/openssl-osx/include/openssl/hmac.h create mode 100644 ext/openssl-osx/include/openssl/kssl.h create mode 100644 ext/openssl-osx/include/openssl/lhash.h create mode 100644 ext/openssl-osx/include/openssl/obj_mac.h create mode 100644 ext/openssl-osx/include/openssl/objects.h create mode 100644 ext/openssl-osx/include/openssl/opensslconf.h create mode 100644 ext/openssl-osx/include/openssl/opensslv.h create mode 100644 ext/openssl-osx/include/openssl/ossl_typ.h create mode 100644 ext/openssl-osx/include/openssl/pem.h create mode 100644 ext/openssl-osx/include/openssl/pem2.h create mode 100644 ext/openssl-osx/include/openssl/pkcs7.h create mode 100644 ext/openssl-osx/include/openssl/pqueue.h create mode 100644 ext/openssl-osx/include/openssl/rsa.h create mode 100644 ext/openssl-osx/include/openssl/safestack.h create mode 100644 ext/openssl-osx/include/openssl/sha.h create mode 100644 ext/openssl-osx/include/openssl/srtp.h create mode 100644 ext/openssl-osx/include/openssl/ssl.h create mode 100644 ext/openssl-osx/include/openssl/ssl2.h create mode 100644 ext/openssl-osx/include/openssl/ssl23.h create mode 100644 ext/openssl-osx/include/openssl/ssl3.h create mode 100644 ext/openssl-osx/include/openssl/stack.h create mode 100644 ext/openssl-osx/include/openssl/symhacks.h create mode 100644 ext/openssl-osx/include/openssl/tls1.h create mode 100644 ext/openssl-osx/include/openssl/x509.h create mode 100644 ext/openssl-osx/include/openssl/x509_vfy.h create mode 100644 ext/openssl-osx/libcrypto.a create mode 100644 ext/openssl-osx/libssl.a diff --git a/ext/openssl-osx/include/nope/aes.h b/ext/openssl-osx/include/nope/aes.h new file mode 100644 index 00000000..87bf60f6 --- /dev/null +++ b/ext/openssl-osx/include/nope/aes.h @@ -0,0 +1,149 @@ +/* crypto/aes/aes.h -*- mode:C; c-file-style: "eay" -*- */ +/* ==================================================================== + * Copyright (c) 1998-2002 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + */ + +#ifndef HEADER_AES_H +# define HEADER_AES_H + +# include + +# ifdef OPENSSL_NO_AES +# error AES is disabled. +# endif + +# include + +# define AES_ENCRYPT 1 +# define AES_DECRYPT 0 + +/* + * Because array size can't be a const in C, the following two are macros. + * Both sizes are in bytes. + */ +# define AES_MAXNR 14 +# define AES_BLOCK_SIZE 16 + +#ifdef __cplusplus +extern "C" { +#endif + +/* This should be a hidden type, but EVP requires that the size be known */ +struct aes_key_st { +# ifdef AES_LONG + unsigned long rd_key[4 * (AES_MAXNR + 1)]; +# else + unsigned int rd_key[4 * (AES_MAXNR + 1)]; +# endif + int rounds; +}; +typedef struct aes_key_st AES_KEY; + +const char *AES_options(void); + +int AES_set_encrypt_key(const unsigned char *userKey, const int bits, + AES_KEY *key); +int AES_set_decrypt_key(const unsigned char *userKey, const int bits, + AES_KEY *key); + +int private_AES_set_encrypt_key(const unsigned char *userKey, const int bits, + AES_KEY *key); +int private_AES_set_decrypt_key(const unsigned char *userKey, const int bits, + AES_KEY *key); + +void AES_encrypt(const unsigned char *in, unsigned char *out, + const AES_KEY *key); +void AES_decrypt(const unsigned char *in, unsigned char *out, + const AES_KEY *key); + +void AES_ecb_encrypt(const unsigned char *in, unsigned char *out, + const AES_KEY *key, const int enc); +void AES_cbc_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const AES_KEY *key, + unsigned char *ivec, const int enc); +void AES_cfb128_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const AES_KEY *key, + unsigned char *ivec, int *num, const int enc); +void AES_cfb1_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const AES_KEY *key, + unsigned char *ivec, int *num, const int enc); +void AES_cfb8_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const AES_KEY *key, + unsigned char *ivec, int *num, const int enc); +void AES_ofb128_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const AES_KEY *key, + unsigned char *ivec, int *num); +void AES_ctr128_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const AES_KEY *key, + unsigned char ivec[AES_BLOCK_SIZE], + unsigned char ecount_buf[AES_BLOCK_SIZE], + unsigned int *num); +/* NB: the IV is _two_ blocks long */ +void AES_ige_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const AES_KEY *key, + unsigned char *ivec, const int enc); +/* NB: the IV is _four_ blocks long */ +void AES_bi_ige_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const AES_KEY *key, + const AES_KEY *key2, const unsigned char *ivec, + const int enc); + +int AES_wrap_key(AES_KEY *key, const unsigned char *iv, + unsigned char *out, + const unsigned char *in, unsigned int inlen); +int AES_unwrap_key(AES_KEY *key, const unsigned char *iv, + unsigned char *out, + const unsigned char *in, unsigned int inlen); + + +#ifdef __cplusplus +} +#endif + +#endif /* !HEADER_AES_H */ diff --git a/ext/openssl-osx/include/nope/asn1t.h b/ext/openssl-osx/include/nope/asn1t.h new file mode 100644 index 00000000..99bc0eec --- /dev/null +++ b/ext/openssl-osx/include/nope/asn1t.h @@ -0,0 +1,973 @@ +/* asn1t.h */ +/* + * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project + * 2000. + */ +/* ==================================================================== + * Copyright (c) 2000-2005 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +#ifndef HEADER_ASN1T_H +# define HEADER_ASN1T_H + +# include +# include +# include + +# ifdef OPENSSL_BUILD_SHLIBCRYPTO +# undef OPENSSL_EXTERN +# define OPENSSL_EXTERN OPENSSL_EXPORT +# endif + +/* ASN1 template defines, structures and functions */ + +#ifdef __cplusplus +extern "C" { +#endif + +# ifndef OPENSSL_EXPORT_VAR_AS_FUNCTION + +/* Macro to obtain ASN1_ADB pointer from a type (only used internally) */ +# define ASN1_ADB_ptr(iptr) ((const ASN1_ADB *)(iptr)) + +/* Macros for start and end of ASN1_ITEM definition */ + +# define ASN1_ITEM_start(itname) \ + OPENSSL_GLOBAL const ASN1_ITEM itname##_it = { + +# define ASN1_ITEM_end(itname) \ + }; + +# else + +/* Macro to obtain ASN1_ADB pointer from a type (only used internally) */ +# define ASN1_ADB_ptr(iptr) ((const ASN1_ADB *)(iptr())) + +/* Macros for start and end of ASN1_ITEM definition */ + +# define ASN1_ITEM_start(itname) \ + const ASN1_ITEM * itname##_it(void) \ + { \ + static const ASN1_ITEM local_it = { + +# define ASN1_ITEM_end(itname) \ + }; \ + return &local_it; \ + } + +# endif + +/* Macros to aid ASN1 template writing */ + +# define ASN1_ITEM_TEMPLATE(tname) \ + static const ASN1_TEMPLATE tname##_item_tt + +# define ASN1_ITEM_TEMPLATE_END(tname) \ + ;\ + ASN1_ITEM_start(tname) \ + ASN1_ITYPE_PRIMITIVE,\ + -1,\ + &tname##_item_tt,\ + 0,\ + NULL,\ + 0,\ + #tname \ + ASN1_ITEM_end(tname) + +/* This is a ASN1 type which just embeds a template */ + +/*- + * This pair helps declare a SEQUENCE. We can do: + * + * ASN1_SEQUENCE(stname) = { + * ... SEQUENCE components ... + * } ASN1_SEQUENCE_END(stname) + * + * This will produce an ASN1_ITEM called stname_it + * for a structure called stname. + * + * If you want the same structure but a different + * name then use: + * + * ASN1_SEQUENCE(itname) = { + * ... SEQUENCE components ... + * } ASN1_SEQUENCE_END_name(stname, itname) + * + * This will create an item called itname_it using + * a structure called stname. + */ + +# define ASN1_SEQUENCE(tname) \ + static const ASN1_TEMPLATE tname##_seq_tt[] + +# define ASN1_SEQUENCE_END(stname) ASN1_SEQUENCE_END_name(stname, stname) + +# define ASN1_SEQUENCE_END_name(stname, tname) \ + ;\ + ASN1_ITEM_start(tname) \ + ASN1_ITYPE_SEQUENCE,\ + V_ASN1_SEQUENCE,\ + tname##_seq_tt,\ + sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\ + NULL,\ + sizeof(stname),\ + #stname \ + ASN1_ITEM_end(tname) + +# define ASN1_NDEF_SEQUENCE(tname) \ + ASN1_SEQUENCE(tname) + +# define ASN1_NDEF_SEQUENCE_cb(tname, cb) \ + ASN1_SEQUENCE_cb(tname, cb) + +# define ASN1_SEQUENCE_cb(tname, cb) \ + static const ASN1_AUX tname##_aux = {NULL, 0, 0, 0, cb, 0}; \ + ASN1_SEQUENCE(tname) + +# define ASN1_BROKEN_SEQUENCE(tname) \ + static const ASN1_AUX tname##_aux = {NULL, ASN1_AFLG_BROKEN, 0, 0, 0, 0}; \ + ASN1_SEQUENCE(tname) + +# define ASN1_SEQUENCE_ref(tname, cb, lck) \ + static const ASN1_AUX tname##_aux = {NULL, ASN1_AFLG_REFCOUNT, offsetof(tname, references), lck, cb, 0}; \ + ASN1_SEQUENCE(tname) + +# define ASN1_SEQUENCE_enc(tname, enc, cb) \ + static const ASN1_AUX tname##_aux = {NULL, ASN1_AFLG_ENCODING, 0, 0, cb, offsetof(tname, enc)}; \ + ASN1_SEQUENCE(tname) + +# define ASN1_NDEF_SEQUENCE_END(tname) \ + ;\ + ASN1_ITEM_start(tname) \ + ASN1_ITYPE_NDEF_SEQUENCE,\ + V_ASN1_SEQUENCE,\ + tname##_seq_tt,\ + sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\ + NULL,\ + sizeof(tname),\ + #tname \ + ASN1_ITEM_end(tname) + +# define ASN1_BROKEN_SEQUENCE_END(stname) ASN1_SEQUENCE_END_ref(stname, stname) + +# define ASN1_SEQUENCE_END_enc(stname, tname) ASN1_SEQUENCE_END_ref(stname, tname) + +# define ASN1_SEQUENCE_END_cb(stname, tname) ASN1_SEQUENCE_END_ref(stname, tname) + +# define ASN1_SEQUENCE_END_ref(stname, tname) \ + ;\ + ASN1_ITEM_start(tname) \ + ASN1_ITYPE_SEQUENCE,\ + V_ASN1_SEQUENCE,\ + tname##_seq_tt,\ + sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\ + &tname##_aux,\ + sizeof(stname),\ + #stname \ + ASN1_ITEM_end(tname) + +# define ASN1_NDEF_SEQUENCE_END_cb(stname, tname) \ + ;\ + ASN1_ITEM_start(tname) \ + ASN1_ITYPE_NDEF_SEQUENCE,\ + V_ASN1_SEQUENCE,\ + tname##_seq_tt,\ + sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\ + &tname##_aux,\ + sizeof(stname),\ + #stname \ + ASN1_ITEM_end(tname) + +/*- + * This pair helps declare a CHOICE type. We can do: + * + * ASN1_CHOICE(chname) = { + * ... CHOICE options ... + * ASN1_CHOICE_END(chname) + * + * This will produce an ASN1_ITEM called chname_it + * for a structure called chname. The structure + * definition must look like this: + * typedef struct { + * int type; + * union { + * ASN1_SOMETHING *opt1; + * ASN1_SOMEOTHER *opt2; + * } value; + * } chname; + * + * the name of the selector must be 'type'. + * to use an alternative selector name use the + * ASN1_CHOICE_END_selector() version. + */ + +# define ASN1_CHOICE(tname) \ + static const ASN1_TEMPLATE tname##_ch_tt[] + +# define ASN1_CHOICE_cb(tname, cb) \ + static const ASN1_AUX tname##_aux = {NULL, 0, 0, 0, cb, 0}; \ + ASN1_CHOICE(tname) + +# define ASN1_CHOICE_END(stname) ASN1_CHOICE_END_name(stname, stname) + +# define ASN1_CHOICE_END_name(stname, tname) ASN1_CHOICE_END_selector(stname, tname, type) + +# define ASN1_CHOICE_END_selector(stname, tname, selname) \ + ;\ + ASN1_ITEM_start(tname) \ + ASN1_ITYPE_CHOICE,\ + offsetof(stname,selname) ,\ + tname##_ch_tt,\ + sizeof(tname##_ch_tt) / sizeof(ASN1_TEMPLATE),\ + NULL,\ + sizeof(stname),\ + #stname \ + ASN1_ITEM_end(tname) + +# define ASN1_CHOICE_END_cb(stname, tname, selname) \ + ;\ + ASN1_ITEM_start(tname) \ + ASN1_ITYPE_CHOICE,\ + offsetof(stname,selname) ,\ + tname##_ch_tt,\ + sizeof(tname##_ch_tt) / sizeof(ASN1_TEMPLATE),\ + &tname##_aux,\ + sizeof(stname),\ + #stname \ + ASN1_ITEM_end(tname) + +/* This helps with the template wrapper form of ASN1_ITEM */ + +# define ASN1_EX_TEMPLATE_TYPE(flags, tag, name, type) { \ + (flags), (tag), 0,\ + #name, ASN1_ITEM_ref(type) } + +/* These help with SEQUENCE or CHOICE components */ + +/* used to declare other types */ + +# define ASN1_EX_TYPE(flags, tag, stname, field, type) { \ + (flags), (tag), offsetof(stname, field),\ + #field, ASN1_ITEM_ref(type) } + +/* used when the structure is combined with the parent */ + +# define ASN1_EX_COMBINE(flags, tag, type) { \ + (flags)|ASN1_TFLG_COMBINE, (tag), 0, NULL, ASN1_ITEM_ref(type) } + +/* implicit and explicit helper macros */ + +# define ASN1_IMP_EX(stname, field, type, tag, ex) \ + ASN1_EX_TYPE(ASN1_TFLG_IMPLICIT | ex, tag, stname, field, type) + +# define ASN1_EXP_EX(stname, field, type, tag, ex) \ + ASN1_EX_TYPE(ASN1_TFLG_EXPLICIT | ex, tag, stname, field, type) + +/* Any defined by macros: the field used is in the table itself */ + +# ifndef OPENSSL_EXPORT_VAR_AS_FUNCTION +# define ASN1_ADB_OBJECT(tblname) { ASN1_TFLG_ADB_OID, -1, 0, #tblname, (const ASN1_ITEM *)&(tblname##_adb) } +# define ASN1_ADB_INTEGER(tblname) { ASN1_TFLG_ADB_INT, -1, 0, #tblname, (const ASN1_ITEM *)&(tblname##_adb) } +# else +# define ASN1_ADB_OBJECT(tblname) { ASN1_TFLG_ADB_OID, -1, 0, #tblname, tblname##_adb } +# define ASN1_ADB_INTEGER(tblname) { ASN1_TFLG_ADB_INT, -1, 0, #tblname, tblname##_adb } +# endif +/* Plain simple type */ +# define ASN1_SIMPLE(stname, field, type) ASN1_EX_TYPE(0,0, stname, field, type) + +/* OPTIONAL simple type */ +# define ASN1_OPT(stname, field, type) ASN1_EX_TYPE(ASN1_TFLG_OPTIONAL, 0, stname, field, type) + +/* IMPLICIT tagged simple type */ +# define ASN1_IMP(stname, field, type, tag) ASN1_IMP_EX(stname, field, type, tag, 0) + +/* IMPLICIT tagged OPTIONAL simple type */ +# define ASN1_IMP_OPT(stname, field, type, tag) ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL) + +/* Same as above but EXPLICIT */ + +# define ASN1_EXP(stname, field, type, tag) ASN1_EXP_EX(stname, field, type, tag, 0) +# define ASN1_EXP_OPT(stname, field, type, tag) ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL) + +/* SEQUENCE OF type */ +# define ASN1_SEQUENCE_OF(stname, field, type) \ + ASN1_EX_TYPE(ASN1_TFLG_SEQUENCE_OF, 0, stname, field, type) + +/* OPTIONAL SEQUENCE OF */ +# define ASN1_SEQUENCE_OF_OPT(stname, field, type) \ + ASN1_EX_TYPE(ASN1_TFLG_SEQUENCE_OF|ASN1_TFLG_OPTIONAL, 0, stname, field, type) + +/* Same as above but for SET OF */ + +# define ASN1_SET_OF(stname, field, type) \ + ASN1_EX_TYPE(ASN1_TFLG_SET_OF, 0, stname, field, type) + +# define ASN1_SET_OF_OPT(stname, field, type) \ + ASN1_EX_TYPE(ASN1_TFLG_SET_OF|ASN1_TFLG_OPTIONAL, 0, stname, field, type) + +/* Finally compound types of SEQUENCE, SET, IMPLICIT, EXPLICIT and OPTIONAL */ + +# define ASN1_IMP_SET_OF(stname, field, type, tag) \ + ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF) + +# define ASN1_EXP_SET_OF(stname, field, type, tag) \ + ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF) + +# define ASN1_IMP_SET_OF_OPT(stname, field, type, tag) \ + ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF|ASN1_TFLG_OPTIONAL) + +# define ASN1_EXP_SET_OF_OPT(stname, field, type, tag) \ + ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF|ASN1_TFLG_OPTIONAL) + +# define ASN1_IMP_SEQUENCE_OF(stname, field, type, tag) \ + ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF) + +# define ASN1_IMP_SEQUENCE_OF_OPT(stname, field, type, tag) \ + ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF|ASN1_TFLG_OPTIONAL) + +# define ASN1_EXP_SEQUENCE_OF(stname, field, type, tag) \ + ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF) + +# define ASN1_EXP_SEQUENCE_OF_OPT(stname, field, type, tag) \ + ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF|ASN1_TFLG_OPTIONAL) + +/* EXPLICIT using indefinite length constructed form */ +# define ASN1_NDEF_EXP(stname, field, type, tag) \ + ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_NDEF) + +/* EXPLICIT OPTIONAL using indefinite length constructed form */ +# define ASN1_NDEF_EXP_OPT(stname, field, type, tag) \ + ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL|ASN1_TFLG_NDEF) + +/* Macros for the ASN1_ADB structure */ + +# define ASN1_ADB(name) \ + static const ASN1_ADB_TABLE name##_adbtbl[] + +# ifndef OPENSSL_EXPORT_VAR_AS_FUNCTION + +# define ASN1_ADB_END(name, flags, field, app_table, def, none) \ + ;\ + static const ASN1_ADB name##_adb = {\ + flags,\ + offsetof(name, field),\ + app_table,\ + name##_adbtbl,\ + sizeof(name##_adbtbl) / sizeof(ASN1_ADB_TABLE),\ + def,\ + none\ + } + +# else + +# define ASN1_ADB_END(name, flags, field, app_table, def, none) \ + ;\ + static const ASN1_ITEM *name##_adb(void) \ + { \ + static const ASN1_ADB internal_adb = \ + {\ + flags,\ + offsetof(name, field),\ + app_table,\ + name##_adbtbl,\ + sizeof(name##_adbtbl) / sizeof(ASN1_ADB_TABLE),\ + def,\ + none\ + }; \ + return (const ASN1_ITEM *) &internal_adb; \ + } \ + void dummy_function(void) + +# endif + +# define ADB_ENTRY(val, template) {val, template} + +# define ASN1_ADB_TEMPLATE(name) \ + static const ASN1_TEMPLATE name##_tt + +/* + * This is the ASN1 template structure that defines a wrapper round the + * actual type. It determines the actual position of the field in the value + * structure, various flags such as OPTIONAL and the field name. + */ + +struct ASN1_TEMPLATE_st { + unsigned long flags; /* Various flags */ + long tag; /* tag, not used if no tagging */ + unsigned long offset; /* Offset of this field in structure */ +# ifndef NO_ASN1_FIELD_NAMES + const char *field_name; /* Field name */ +# endif + ASN1_ITEM_EXP *item; /* Relevant ASN1_ITEM or ASN1_ADB */ +}; + +/* Macro to extract ASN1_ITEM and ASN1_ADB pointer from ASN1_TEMPLATE */ + +# define ASN1_TEMPLATE_item(t) (t->item_ptr) +# define ASN1_TEMPLATE_adb(t) (t->item_ptr) + +typedef struct ASN1_ADB_TABLE_st ASN1_ADB_TABLE; +typedef struct ASN1_ADB_st ASN1_ADB; + +struct ASN1_ADB_st { + unsigned long flags; /* Various flags */ + unsigned long offset; /* Offset of selector field */ + STACK_OF(ASN1_ADB_TABLE) **app_items; /* Application defined items */ + const ASN1_ADB_TABLE *tbl; /* Table of possible types */ + long tblcount; /* Number of entries in tbl */ + const ASN1_TEMPLATE *default_tt; /* Type to use if no match */ + const ASN1_TEMPLATE *null_tt; /* Type to use if selector is NULL */ +}; + +struct ASN1_ADB_TABLE_st { + long value; /* NID for an object or value for an int */ + const ASN1_TEMPLATE tt; /* item for this value */ +}; + +/* template flags */ + +/* Field is optional */ +# define ASN1_TFLG_OPTIONAL (0x1) + +/* Field is a SET OF */ +# define ASN1_TFLG_SET_OF (0x1 << 1) + +/* Field is a SEQUENCE OF */ +# define ASN1_TFLG_SEQUENCE_OF (0x2 << 1) + +/* + * Special case: this refers to a SET OF that will be sorted into DER order + * when encoded *and* the corresponding STACK will be modified to match the + * new order. + */ +# define ASN1_TFLG_SET_ORDER (0x3 << 1) + +/* Mask for SET OF or SEQUENCE OF */ +# define ASN1_TFLG_SK_MASK (0x3 << 1) + +/* + * These flags mean the tag should be taken from the tag field. If EXPLICIT + * then the underlying type is used for the inner tag. + */ + +/* IMPLICIT tagging */ +# define ASN1_TFLG_IMPTAG (0x1 << 3) + +/* EXPLICIT tagging, inner tag from underlying type */ +# define ASN1_TFLG_EXPTAG (0x2 << 3) + +# define ASN1_TFLG_TAG_MASK (0x3 << 3) + +/* context specific IMPLICIT */ +# define ASN1_TFLG_IMPLICIT ASN1_TFLG_IMPTAG|ASN1_TFLG_CONTEXT + +/* context specific EXPLICIT */ +# define ASN1_TFLG_EXPLICIT ASN1_TFLG_EXPTAG|ASN1_TFLG_CONTEXT + +/* + * If tagging is in force these determine the type of tag to use. Otherwise + * the tag is determined by the underlying type. These values reflect the + * actual octet format. + */ + +/* Universal tag */ +# define ASN1_TFLG_UNIVERSAL (0x0<<6) +/* Application tag */ +# define ASN1_TFLG_APPLICATION (0x1<<6) +/* Context specific tag */ +# define ASN1_TFLG_CONTEXT (0x2<<6) +/* Private tag */ +# define ASN1_TFLG_PRIVATE (0x3<<6) + +# define ASN1_TFLG_TAG_CLASS (0x3<<6) + +/* + * These are for ANY DEFINED BY type. In this case the 'item' field points to + * an ASN1_ADB structure which contains a table of values to decode the + * relevant type + */ + +# define ASN1_TFLG_ADB_MASK (0x3<<8) + +# define ASN1_TFLG_ADB_OID (0x1<<8) + +# define ASN1_TFLG_ADB_INT (0x1<<9) + +/* + * This flag means a parent structure is passed instead of the field: this is + * useful is a SEQUENCE is being combined with a CHOICE for example. Since + * this means the structure and item name will differ we need to use the + * ASN1_CHOICE_END_name() macro for example. + */ + +# define ASN1_TFLG_COMBINE (0x1<<10) + +/* + * This flag when present in a SEQUENCE OF, SET OF or EXPLICIT causes + * indefinite length constructed encoding to be used if required. + */ + +# define ASN1_TFLG_NDEF (0x1<<11) + +/* This is the actual ASN1 item itself */ + +struct ASN1_ITEM_st { + char itype; /* The item type, primitive, SEQUENCE, CHOICE + * or extern */ + long utype; /* underlying type */ + const ASN1_TEMPLATE *templates; /* If SEQUENCE or CHOICE this contains + * the contents */ + long tcount; /* Number of templates if SEQUENCE or CHOICE */ + const void *funcs; /* functions that handle this type */ + long size; /* Structure size (usually) */ +# ifndef NO_ASN1_FIELD_NAMES + const char *sname; /* Structure name */ +# endif +}; + +/*- + * These are values for the itype field and + * determine how the type is interpreted. + * + * For PRIMITIVE types the underlying type + * determines the behaviour if items is NULL. + * + * Otherwise templates must contain a single + * template and the type is treated in the + * same way as the type specified in the template. + * + * For SEQUENCE types the templates field points + * to the members, the size field is the + * structure size. + * + * For CHOICE types the templates field points + * to each possible member (typically a union) + * and the 'size' field is the offset of the + * selector. + * + * The 'funcs' field is used for application + * specific functions. + * + * For COMPAT types the funcs field gives a + * set of functions that handle this type, this + * supports the old d2i, i2d convention. + * + * The EXTERN type uses a new style d2i/i2d. + * The new style should be used where possible + * because it avoids things like the d2i IMPLICIT + * hack. + * + * MSTRING is a multiple string type, it is used + * for a CHOICE of character strings where the + * actual strings all occupy an ASN1_STRING + * structure. In this case the 'utype' field + * has a special meaning, it is used as a mask + * of acceptable types using the B_ASN1 constants. + * + * NDEF_SEQUENCE is the same as SEQUENCE except + * that it will use indefinite length constructed + * encoding if requested. + * + */ + +# define ASN1_ITYPE_PRIMITIVE 0x0 + +# define ASN1_ITYPE_SEQUENCE 0x1 + +# define ASN1_ITYPE_CHOICE 0x2 + +# define ASN1_ITYPE_COMPAT 0x3 + +# define ASN1_ITYPE_EXTERN 0x4 + +# define ASN1_ITYPE_MSTRING 0x5 + +# define ASN1_ITYPE_NDEF_SEQUENCE 0x6 + +/* + * Cache for ASN1 tag and length, so we don't keep re-reading it for things + * like CHOICE + */ + +struct ASN1_TLC_st { + char valid; /* Values below are valid */ + int ret; /* return value */ + long plen; /* length */ + int ptag; /* class value */ + int pclass; /* class value */ + int hdrlen; /* header length */ +}; + +/* Typedefs for ASN1 function pointers */ + +typedef ASN1_VALUE *ASN1_new_func(void); +typedef void ASN1_free_func(ASN1_VALUE *a); +typedef ASN1_VALUE *ASN1_d2i_func(ASN1_VALUE **a, const unsigned char **in, + long length); +typedef int ASN1_i2d_func(ASN1_VALUE *a, unsigned char **in); + +typedef int ASN1_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, + const ASN1_ITEM *it, int tag, int aclass, char opt, + ASN1_TLC *ctx); + +typedef int ASN1_ex_i2d(ASN1_VALUE **pval, unsigned char **out, + const ASN1_ITEM *it, int tag, int aclass); +typedef int ASN1_ex_new_func(ASN1_VALUE **pval, const ASN1_ITEM *it); +typedef void ASN1_ex_free_func(ASN1_VALUE **pval, const ASN1_ITEM *it); + +typedef int ASN1_ex_print_func(BIO *out, ASN1_VALUE **pval, + int indent, const char *fname, + const ASN1_PCTX *pctx); + +typedef int ASN1_primitive_i2c(ASN1_VALUE **pval, unsigned char *cont, + int *putype, const ASN1_ITEM *it); +typedef int ASN1_primitive_c2i(ASN1_VALUE **pval, const unsigned char *cont, + int len, int utype, char *free_cont, + const ASN1_ITEM *it); +typedef int ASN1_primitive_print(BIO *out, ASN1_VALUE **pval, + const ASN1_ITEM *it, int indent, + const ASN1_PCTX *pctx); + +typedef struct ASN1_COMPAT_FUNCS_st { + ASN1_new_func *asn1_new; + ASN1_free_func *asn1_free; + ASN1_d2i_func *asn1_d2i; + ASN1_i2d_func *asn1_i2d; +} ASN1_COMPAT_FUNCS; + +typedef struct ASN1_EXTERN_FUNCS_st { + void *app_data; + ASN1_ex_new_func *asn1_ex_new; + ASN1_ex_free_func *asn1_ex_free; + ASN1_ex_free_func *asn1_ex_clear; + ASN1_ex_d2i *asn1_ex_d2i; + ASN1_ex_i2d *asn1_ex_i2d; + ASN1_ex_print_func *asn1_ex_print; +} ASN1_EXTERN_FUNCS; + +typedef struct ASN1_PRIMITIVE_FUNCS_st { + void *app_data; + unsigned long flags; + ASN1_ex_new_func *prim_new; + ASN1_ex_free_func *prim_free; + ASN1_ex_free_func *prim_clear; + ASN1_primitive_c2i *prim_c2i; + ASN1_primitive_i2c *prim_i2c; + ASN1_primitive_print *prim_print; +} ASN1_PRIMITIVE_FUNCS; + +/* + * This is the ASN1_AUX structure: it handles various miscellaneous + * requirements. For example the use of reference counts and an informational + * callback. The "informational callback" is called at various points during + * the ASN1 encoding and decoding. It can be used to provide minor + * customisation of the structures used. This is most useful where the + * supplied routines *almost* do the right thing but need some extra help at + * a few points. If the callback returns zero then it is assumed a fatal + * error has occurred and the main operation should be abandoned. If major + * changes in the default behaviour are required then an external type is + * more appropriate. + */ + +typedef int ASN1_aux_cb(int operation, ASN1_VALUE **in, const ASN1_ITEM *it, + void *exarg); + +typedef struct ASN1_AUX_st { + void *app_data; + int flags; + int ref_offset; /* Offset of reference value */ + int ref_lock; /* Lock type to use */ + ASN1_aux_cb *asn1_cb; + int enc_offset; /* Offset of ASN1_ENCODING structure */ +} ASN1_AUX; + +/* For print related callbacks exarg points to this structure */ +typedef struct ASN1_PRINT_ARG_st { + BIO *out; + int indent; + const ASN1_PCTX *pctx; +} ASN1_PRINT_ARG; + +/* For streaming related callbacks exarg points to this structure */ +typedef struct ASN1_STREAM_ARG_st { + /* BIO to stream through */ + BIO *out; + /* BIO with filters appended */ + BIO *ndef_bio; + /* Streaming I/O boundary */ + unsigned char **boundary; +} ASN1_STREAM_ARG; + +/* Flags in ASN1_AUX */ + +/* Use a reference count */ +# define ASN1_AFLG_REFCOUNT 1 +/* Save the encoding of structure (useful for signatures) */ +# define ASN1_AFLG_ENCODING 2 +/* The Sequence length is invalid */ +# define ASN1_AFLG_BROKEN 4 + +/* operation values for asn1_cb */ + +# define ASN1_OP_NEW_PRE 0 +# define ASN1_OP_NEW_POST 1 +# define ASN1_OP_FREE_PRE 2 +# define ASN1_OP_FREE_POST 3 +# define ASN1_OP_D2I_PRE 4 +# define ASN1_OP_D2I_POST 5 +# define ASN1_OP_I2D_PRE 6 +# define ASN1_OP_I2D_POST 7 +# define ASN1_OP_PRINT_PRE 8 +# define ASN1_OP_PRINT_POST 9 +# define ASN1_OP_STREAM_PRE 10 +# define ASN1_OP_STREAM_POST 11 +# define ASN1_OP_DETACHED_PRE 12 +# define ASN1_OP_DETACHED_POST 13 + +/* Macro to implement a primitive type */ +# define IMPLEMENT_ASN1_TYPE(stname) IMPLEMENT_ASN1_TYPE_ex(stname, stname, 0) +# define IMPLEMENT_ASN1_TYPE_ex(itname, vname, ex) \ + ASN1_ITEM_start(itname) \ + ASN1_ITYPE_PRIMITIVE, V_##vname, NULL, 0, NULL, ex, #itname \ + ASN1_ITEM_end(itname) + +/* Macro to implement a multi string type */ +# define IMPLEMENT_ASN1_MSTRING(itname, mask) \ + ASN1_ITEM_start(itname) \ + ASN1_ITYPE_MSTRING, mask, NULL, 0, NULL, sizeof(ASN1_STRING), #itname \ + ASN1_ITEM_end(itname) + +/* Macro to implement an ASN1_ITEM in terms of old style funcs */ + +# define IMPLEMENT_COMPAT_ASN1(sname) IMPLEMENT_COMPAT_ASN1_type(sname, V_ASN1_SEQUENCE) + +# define IMPLEMENT_COMPAT_ASN1_type(sname, tag) \ + static const ASN1_COMPAT_FUNCS sname##_ff = { \ + (ASN1_new_func *)sname##_new, \ + (ASN1_free_func *)sname##_free, \ + (ASN1_d2i_func *)d2i_##sname, \ + (ASN1_i2d_func *)i2d_##sname, \ + }; \ + ASN1_ITEM_start(sname) \ + ASN1_ITYPE_COMPAT, \ + tag, \ + NULL, \ + 0, \ + &sname##_ff, \ + 0, \ + #sname \ + ASN1_ITEM_end(sname) + +# define IMPLEMENT_EXTERN_ASN1(sname, tag, fptrs) \ + ASN1_ITEM_start(sname) \ + ASN1_ITYPE_EXTERN, \ + tag, \ + NULL, \ + 0, \ + &fptrs, \ + 0, \ + #sname \ + ASN1_ITEM_end(sname) + +/* Macro to implement standard functions in terms of ASN1_ITEM structures */ + +# define IMPLEMENT_ASN1_FUNCTIONS(stname) IMPLEMENT_ASN1_FUNCTIONS_fname(stname, stname, stname) + +# define IMPLEMENT_ASN1_FUNCTIONS_name(stname, itname) IMPLEMENT_ASN1_FUNCTIONS_fname(stname, itname, itname) + +# define IMPLEMENT_ASN1_FUNCTIONS_ENCODE_name(stname, itname) \ + IMPLEMENT_ASN1_FUNCTIONS_ENCODE_fname(stname, itname, itname) + +# define IMPLEMENT_STATIC_ASN1_ALLOC_FUNCTIONS(stname) \ + IMPLEMENT_ASN1_ALLOC_FUNCTIONS_pfname(static, stname, stname, stname) + +# define IMPLEMENT_ASN1_ALLOC_FUNCTIONS(stname) \ + IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, stname, stname) + +# define IMPLEMENT_ASN1_ALLOC_FUNCTIONS_pfname(pre, stname, itname, fname) \ + pre stname *fname##_new(void) \ + { \ + return (stname *)ASN1_item_new(ASN1_ITEM_rptr(itname)); \ + } \ + pre void fname##_free(stname *a) \ + { \ + ASN1_item_free((ASN1_VALUE *)a, ASN1_ITEM_rptr(itname)); \ + } + +# define IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, itname, fname) \ + stname *fname##_new(void) \ + { \ + return (stname *)ASN1_item_new(ASN1_ITEM_rptr(itname)); \ + } \ + void fname##_free(stname *a) \ + { \ + ASN1_item_free((ASN1_VALUE *)a, ASN1_ITEM_rptr(itname)); \ + } + +# define IMPLEMENT_ASN1_FUNCTIONS_fname(stname, itname, fname) \ + IMPLEMENT_ASN1_ENCODE_FUNCTIONS_fname(stname, itname, fname) \ + IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, itname, fname) + +# define IMPLEMENT_ASN1_ENCODE_FUNCTIONS_fname(stname, itname, fname) \ + stname *d2i_##fname(stname **a, const unsigned char **in, long len) \ + { \ + return (stname *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, ASN1_ITEM_rptr(itname));\ + } \ + int i2d_##fname(stname *a, unsigned char **out) \ + { \ + return ASN1_item_i2d((ASN1_VALUE *)a, out, ASN1_ITEM_rptr(itname));\ + } + +# define IMPLEMENT_ASN1_NDEF_FUNCTION(stname) \ + int i2d_##stname##_NDEF(stname *a, unsigned char **out) \ + { \ + return ASN1_item_ndef_i2d((ASN1_VALUE *)a, out, ASN1_ITEM_rptr(stname));\ + } + +/* + * This includes evil casts to remove const: they will go away when full ASN1 + * constification is done. + */ +# define IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(stname, itname, fname) \ + stname *d2i_##fname(stname **a, const unsigned char **in, long len) \ + { \ + return (stname *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, ASN1_ITEM_rptr(itname));\ + } \ + int i2d_##fname(const stname *a, unsigned char **out) \ + { \ + return ASN1_item_i2d((ASN1_VALUE *)a, out, ASN1_ITEM_rptr(itname));\ + } + +# define IMPLEMENT_ASN1_DUP_FUNCTION(stname) \ + stname * stname##_dup(stname *x) \ + { \ + return ASN1_item_dup(ASN1_ITEM_rptr(stname), x); \ + } + +# define IMPLEMENT_ASN1_PRINT_FUNCTION(stname) \ + IMPLEMENT_ASN1_PRINT_FUNCTION_fname(stname, stname, stname) + +# define IMPLEMENT_ASN1_PRINT_FUNCTION_fname(stname, itname, fname) \ + int fname##_print_ctx(BIO *out, stname *x, int indent, \ + const ASN1_PCTX *pctx) \ + { \ + return ASN1_item_print(out, (ASN1_VALUE *)x, indent, \ + ASN1_ITEM_rptr(itname), pctx); \ + } + +# define IMPLEMENT_ASN1_FUNCTIONS_const(name) \ + IMPLEMENT_ASN1_FUNCTIONS_const_fname(name, name, name) + +# define IMPLEMENT_ASN1_FUNCTIONS_const_fname(stname, itname, fname) \ + IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(stname, itname, fname) \ + IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, itname, fname) + +/* external definitions for primitive types */ + +DECLARE_ASN1_ITEM(ASN1_BOOLEAN) +DECLARE_ASN1_ITEM(ASN1_TBOOLEAN) +DECLARE_ASN1_ITEM(ASN1_FBOOLEAN) +DECLARE_ASN1_ITEM(ASN1_SEQUENCE) +DECLARE_ASN1_ITEM(CBIGNUM) +DECLARE_ASN1_ITEM(BIGNUM) +DECLARE_ASN1_ITEM(LONG) +DECLARE_ASN1_ITEM(ZLONG) + +DECLARE_STACK_OF(ASN1_VALUE) + +/* Functions used internally by the ASN1 code */ + +int ASN1_item_ex_new(ASN1_VALUE **pval, const ASN1_ITEM *it); +void ASN1_item_ex_free(ASN1_VALUE **pval, const ASN1_ITEM *it); +int ASN1_template_new(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt); +int ASN1_primitive_new(ASN1_VALUE **pval, const ASN1_ITEM *it); + +void ASN1_template_free(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt); +int ASN1_template_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, + const ASN1_TEMPLATE *tt); +int ASN1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, + const ASN1_ITEM *it, int tag, int aclass, char opt, + ASN1_TLC *ctx); + +int ASN1_item_ex_i2d(ASN1_VALUE **pval, unsigned char **out, + const ASN1_ITEM *it, int tag, int aclass); +int ASN1_template_i2d(ASN1_VALUE **pval, unsigned char **out, + const ASN1_TEMPLATE *tt); +void ASN1_primitive_free(ASN1_VALUE **pval, const ASN1_ITEM *it); + +int asn1_ex_i2c(ASN1_VALUE **pval, unsigned char *cont, int *putype, + const ASN1_ITEM *it); +int asn1_ex_c2i(ASN1_VALUE **pval, const unsigned char *cont, int len, + int utype, char *free_cont, const ASN1_ITEM *it); + +int asn1_get_choice_selector(ASN1_VALUE **pval, const ASN1_ITEM *it); +int asn1_set_choice_selector(ASN1_VALUE **pval, int value, + const ASN1_ITEM *it); + +ASN1_VALUE **asn1_get_field_ptr(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt); + +const ASN1_TEMPLATE *asn1_do_adb(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt, + int nullerr); + +int asn1_do_lock(ASN1_VALUE **pval, int op, const ASN1_ITEM *it); + +void asn1_enc_init(ASN1_VALUE **pval, const ASN1_ITEM *it); +void asn1_enc_free(ASN1_VALUE **pval, const ASN1_ITEM *it); +int asn1_enc_restore(int *len, unsigned char **out, ASN1_VALUE **pval, + const ASN1_ITEM *it); +int asn1_enc_save(ASN1_VALUE **pval, const unsigned char *in, int inlen, + const ASN1_ITEM *it); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/ext/openssl-osx/include/nope/blowfish.h b/ext/openssl-osx/include/nope/blowfish.h new file mode 100644 index 00000000..83293027 --- /dev/null +++ b/ext/openssl-osx/include/nope/blowfish.h @@ -0,0 +1,130 @@ +/* crypto/bf/blowfish.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_BLOWFISH_H +# define HEADER_BLOWFISH_H + +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# ifdef OPENSSL_NO_BF +# error BF is disabled. +# endif + +# define BF_ENCRYPT 1 +# define BF_DECRYPT 0 + +/*- + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + * ! BF_LONG has to be at least 32 bits wide. If it's wider, then ! + * ! BF_LONG_LOG2 has to be defined along. ! + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + */ + +# if defined(__LP32__) +# define BF_LONG unsigned long +# elif defined(OPENSSL_SYS_CRAY) || defined(__ILP64__) +# define BF_LONG unsigned long +# define BF_LONG_LOG2 3 +/* + * _CRAY note. I could declare short, but I have no idea what impact + * does it have on performance on none-T3E machines. I could declare + * int, but at least on C90 sizeof(int) can be chosen at compile time. + * So I've chosen long... + * + */ +# else +# define BF_LONG unsigned int +# endif + +# define BF_ROUNDS 16 +# define BF_BLOCK 8 + +typedef struct bf_key_st { + BF_LONG P[BF_ROUNDS + 2]; + BF_LONG S[4 * 256]; +} BF_KEY; + +# ifdef OPENSSL_FIPS +void private_BF_set_key(BF_KEY *key, int len, const unsigned char *data); +# endif +void BF_set_key(BF_KEY *key, int len, const unsigned char *data); + +void BF_encrypt(BF_LONG *data, const BF_KEY *key); +void BF_decrypt(BF_LONG *data, const BF_KEY *key); + +void BF_ecb_encrypt(const unsigned char *in, unsigned char *out, + const BF_KEY *key, int enc); +void BF_cbc_encrypt(const unsigned char *in, unsigned char *out, long length, + const BF_KEY *schedule, unsigned char *ivec, int enc); +void BF_cfb64_encrypt(const unsigned char *in, unsigned char *out, + long length, const BF_KEY *schedule, + unsigned char *ivec, int *num, int enc); +void BF_ofb64_encrypt(const unsigned char *in, unsigned char *out, + long length, const BF_KEY *schedule, + unsigned char *ivec, int *num); +const char *BF_options(void); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ext/openssl-osx/include/nope/camellia.h b/ext/openssl-osx/include/nope/camellia.h new file mode 100644 index 00000000..9be7c0fd --- /dev/null +++ b/ext/openssl-osx/include/nope/camellia.h @@ -0,0 +1,132 @@ +/* crypto/camellia/camellia.h -*- mode:C; c-file-style: "eay" -*- */ +/* ==================================================================== + * Copyright (c) 2006 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + */ + +#ifndef HEADER_CAMELLIA_H +# define HEADER_CAMELLIA_H + +# include + +# ifdef OPENSSL_NO_CAMELLIA +# error CAMELLIA is disabled. +# endif + +# include + +# define CAMELLIA_ENCRYPT 1 +# define CAMELLIA_DECRYPT 0 + +/* + * Because array size can't be a const in C, the following two are macros. + * Both sizes are in bytes. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* This should be a hidden type, but EVP requires that the size be known */ + +# define CAMELLIA_BLOCK_SIZE 16 +# define CAMELLIA_TABLE_BYTE_LEN 272 +# define CAMELLIA_TABLE_WORD_LEN (CAMELLIA_TABLE_BYTE_LEN / 4) + +typedef unsigned int KEY_TABLE_TYPE[CAMELLIA_TABLE_WORD_LEN]; /* to match + * with WORD */ + +struct camellia_key_st { + union { + double d; /* ensures 64-bit align */ + KEY_TABLE_TYPE rd_key; + } u; + int grand_rounds; +}; +typedef struct camellia_key_st CAMELLIA_KEY; + +# ifdef OPENSSL_FIPS +int private_Camellia_set_key(const unsigned char *userKey, const int bits, + CAMELLIA_KEY *key); +# endif +int Camellia_set_key(const unsigned char *userKey, const int bits, + CAMELLIA_KEY *key); + +void Camellia_encrypt(const unsigned char *in, unsigned char *out, + const CAMELLIA_KEY *key); +void Camellia_decrypt(const unsigned char *in, unsigned char *out, + const CAMELLIA_KEY *key); + +void Camellia_ecb_encrypt(const unsigned char *in, unsigned char *out, + const CAMELLIA_KEY *key, const int enc); +void Camellia_cbc_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const CAMELLIA_KEY *key, + unsigned char *ivec, const int enc); +void Camellia_cfb128_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const CAMELLIA_KEY *key, + unsigned char *ivec, int *num, const int enc); +void Camellia_cfb1_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const CAMELLIA_KEY *key, + unsigned char *ivec, int *num, const int enc); +void Camellia_cfb8_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const CAMELLIA_KEY *key, + unsigned char *ivec, int *num, const int enc); +void Camellia_ofb128_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const CAMELLIA_KEY *key, + unsigned char *ivec, int *num); +void Camellia_ctr128_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const CAMELLIA_KEY *key, + unsigned char ivec[CAMELLIA_BLOCK_SIZE], + unsigned char ecount_buf[CAMELLIA_BLOCK_SIZE], + unsigned int *num); + +#ifdef __cplusplus +} +#endif + +#endif /* !HEADER_Camellia_H */ diff --git a/ext/openssl-osx/include/nope/cast.h b/ext/openssl-osx/include/nope/cast.h new file mode 100644 index 00000000..0003ec9c --- /dev/null +++ b/ext/openssl-osx/include/nope/cast.h @@ -0,0 +1,107 @@ +/* crypto/cast/cast.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_CAST_H +# define HEADER_CAST_H + +#ifdef __cplusplus +extern "C" { +#endif + +# include + +# ifdef OPENSSL_NO_CAST +# error CAST is disabled. +# endif + +# define CAST_ENCRYPT 1 +# define CAST_DECRYPT 0 + +# define CAST_LONG unsigned int + +# define CAST_BLOCK 8 +# define CAST_KEY_LENGTH 16 + +typedef struct cast_key_st { + CAST_LONG data[32]; + int short_key; /* Use reduced rounds for short key */ +} CAST_KEY; + +# ifdef OPENSSL_FIPS +void private_CAST_set_key(CAST_KEY *key, int len, const unsigned char *data); +# endif +void CAST_set_key(CAST_KEY *key, int len, const unsigned char *data); +void CAST_ecb_encrypt(const unsigned char *in, unsigned char *out, + const CAST_KEY *key, int enc); +void CAST_encrypt(CAST_LONG *data, const CAST_KEY *key); +void CAST_decrypt(CAST_LONG *data, const CAST_KEY *key); +void CAST_cbc_encrypt(const unsigned char *in, unsigned char *out, + long length, const CAST_KEY *ks, unsigned char *iv, + int enc); +void CAST_cfb64_encrypt(const unsigned char *in, unsigned char *out, + long length, const CAST_KEY *schedule, + unsigned char *ivec, int *num, int enc); +void CAST_ofb64_encrypt(const unsigned char *in, unsigned char *out, + long length, const CAST_KEY *schedule, + unsigned char *ivec, int *num); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ext/openssl-osx/include/nope/cmac.h b/ext/openssl-osx/include/nope/cmac.h new file mode 100644 index 00000000..175be834 --- /dev/null +++ b/ext/openssl-osx/include/nope/cmac.h @@ -0,0 +1,82 @@ +/* crypto/cmac/cmac.h */ +/* + * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL + * project. + */ +/* ==================================================================== + * Copyright (c) 2010 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + */ + +#ifndef HEADER_CMAC_H +# define HEADER_CMAC_H + +#ifdef __cplusplus +extern "C" { +#endif + +# include + +/* Opaque */ +typedef struct CMAC_CTX_st CMAC_CTX; + +CMAC_CTX *CMAC_CTX_new(void); +void CMAC_CTX_cleanup(CMAC_CTX *ctx); +void CMAC_CTX_free(CMAC_CTX *ctx); +EVP_CIPHER_CTX *CMAC_CTX_get0_cipher_ctx(CMAC_CTX *ctx); +int CMAC_CTX_copy(CMAC_CTX *out, const CMAC_CTX *in); + +int CMAC_Init(CMAC_CTX *ctx, const void *key, size_t keylen, + const EVP_CIPHER *cipher, ENGINE *impl); +int CMAC_Update(CMAC_CTX *ctx, const void *data, size_t dlen); +int CMAC_Final(CMAC_CTX *ctx, unsigned char *out, size_t *poutlen); +int CMAC_resume(CMAC_CTX *ctx); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/ext/openssl-osx/include/nope/cms.h b/ext/openssl-osx/include/nope/cms.h new file mode 100644 index 00000000..e6c7f964 --- /dev/null +++ b/ext/openssl-osx/include/nope/cms.h @@ -0,0 +1,555 @@ +/* crypto/cms/cms.h */ +/* + * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL + * project. + */ +/* ==================================================================== + * Copyright (c) 2008 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + */ + +#ifndef HEADER_CMS_H +# define HEADER_CMS_H + +# include + +# ifdef OPENSSL_NO_CMS +# error CMS is disabled. +# endif + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct CMS_ContentInfo_st CMS_ContentInfo; +typedef struct CMS_SignerInfo_st CMS_SignerInfo; +typedef struct CMS_CertificateChoices CMS_CertificateChoices; +typedef struct CMS_RevocationInfoChoice_st CMS_RevocationInfoChoice; +typedef struct CMS_RecipientInfo_st CMS_RecipientInfo; +typedef struct CMS_ReceiptRequest_st CMS_ReceiptRequest; +typedef struct CMS_Receipt_st CMS_Receipt; +typedef struct CMS_RecipientEncryptedKey_st CMS_RecipientEncryptedKey; +typedef struct CMS_OtherKeyAttribute_st CMS_OtherKeyAttribute; + +DECLARE_STACK_OF(CMS_SignerInfo) +DECLARE_STACK_OF(GENERAL_NAMES) +DECLARE_STACK_OF(CMS_RecipientEncryptedKey) +DECLARE_ASN1_FUNCTIONS(CMS_ContentInfo) +DECLARE_ASN1_FUNCTIONS(CMS_ReceiptRequest) +DECLARE_ASN1_PRINT_FUNCTION(CMS_ContentInfo) + +# define CMS_SIGNERINFO_ISSUER_SERIAL 0 +# define CMS_SIGNERINFO_KEYIDENTIFIER 1 + +# define CMS_RECIPINFO_NONE -1 +# define CMS_RECIPINFO_TRANS 0 +# define CMS_RECIPINFO_AGREE 1 +# define CMS_RECIPINFO_KEK 2 +# define CMS_RECIPINFO_PASS 3 +# define CMS_RECIPINFO_OTHER 4 + +/* S/MIME related flags */ + +# define CMS_TEXT 0x1 +# define CMS_NOCERTS 0x2 +# define CMS_NO_CONTENT_VERIFY 0x4 +# define CMS_NO_ATTR_VERIFY 0x8 +# define CMS_NOSIGS \ + (CMS_NO_CONTENT_VERIFY|CMS_NO_ATTR_VERIFY) +# define CMS_NOINTERN 0x10 +# define CMS_NO_SIGNER_CERT_VERIFY 0x20 +# define CMS_NOVERIFY 0x20 +# define CMS_DETACHED 0x40 +# define CMS_BINARY 0x80 +# define CMS_NOATTR 0x100 +# define CMS_NOSMIMECAP 0x200 +# define CMS_NOOLDMIMETYPE 0x400 +# define CMS_CRLFEOL 0x800 +# define CMS_STREAM 0x1000 +# define CMS_NOCRL 0x2000 +# define CMS_PARTIAL 0x4000 +# define CMS_REUSE_DIGEST 0x8000 +# define CMS_USE_KEYID 0x10000 +# define CMS_DEBUG_DECRYPT 0x20000 +# define CMS_KEY_PARAM 0x40000 + +const ASN1_OBJECT *CMS_get0_type(CMS_ContentInfo *cms); + +BIO *CMS_dataInit(CMS_ContentInfo *cms, BIO *icont); +int CMS_dataFinal(CMS_ContentInfo *cms, BIO *bio); + +ASN1_OCTET_STRING **CMS_get0_content(CMS_ContentInfo *cms); +int CMS_is_detached(CMS_ContentInfo *cms); +int CMS_set_detached(CMS_ContentInfo *cms, int detached); + +# ifdef HEADER_PEM_H +DECLARE_PEM_rw_const(CMS, CMS_ContentInfo) +# endif +int CMS_stream(unsigned char ***boundary, CMS_ContentInfo *cms); +CMS_ContentInfo *d2i_CMS_bio(BIO *bp, CMS_ContentInfo **cms); +int i2d_CMS_bio(BIO *bp, CMS_ContentInfo *cms); + +BIO *BIO_new_CMS(BIO *out, CMS_ContentInfo *cms); +int i2d_CMS_bio_stream(BIO *out, CMS_ContentInfo *cms, BIO *in, int flags); +int PEM_write_bio_CMS_stream(BIO *out, CMS_ContentInfo *cms, BIO *in, + int flags); +CMS_ContentInfo *SMIME_read_CMS(BIO *bio, BIO **bcont); +int SMIME_write_CMS(BIO *bio, CMS_ContentInfo *cms, BIO *data, int flags); + +int CMS_final(CMS_ContentInfo *cms, BIO *data, BIO *dcont, + unsigned int flags); + +CMS_ContentInfo *CMS_sign(X509 *signcert, EVP_PKEY *pkey, + STACK_OF(X509) *certs, BIO *data, + unsigned int flags); + +CMS_ContentInfo *CMS_sign_receipt(CMS_SignerInfo *si, + X509 *signcert, EVP_PKEY *pkey, + STACK_OF(X509) *certs, unsigned int flags); + +int CMS_data(CMS_ContentInfo *cms, BIO *out, unsigned int flags); +CMS_ContentInfo *CMS_data_create(BIO *in, unsigned int flags); + +int CMS_digest_verify(CMS_ContentInfo *cms, BIO *dcont, BIO *out, + unsigned int flags); +CMS_ContentInfo *CMS_digest_create(BIO *in, const EVP_MD *md, + unsigned int flags); + +int CMS_EncryptedData_decrypt(CMS_ContentInfo *cms, + const unsigned char *key, size_t keylen, + BIO *dcont, BIO *out, unsigned int flags); + +CMS_ContentInfo *CMS_EncryptedData_encrypt(BIO *in, const EVP_CIPHER *cipher, + const unsigned char *key, + size_t keylen, unsigned int flags); + +int CMS_EncryptedData_set1_key(CMS_ContentInfo *cms, const EVP_CIPHER *ciph, + const unsigned char *key, size_t keylen); + +int CMS_verify(CMS_ContentInfo *cms, STACK_OF(X509) *certs, + X509_STORE *store, BIO *dcont, BIO *out, unsigned int flags); + +int CMS_verify_receipt(CMS_ContentInfo *rcms, CMS_ContentInfo *ocms, + STACK_OF(X509) *certs, + X509_STORE *store, unsigned int flags); + +STACK_OF(X509) *CMS_get0_signers(CMS_ContentInfo *cms); + +CMS_ContentInfo *CMS_encrypt(STACK_OF(X509) *certs, BIO *in, + const EVP_CIPHER *cipher, unsigned int flags); + +int CMS_decrypt(CMS_ContentInfo *cms, EVP_PKEY *pkey, X509 *cert, + BIO *dcont, BIO *out, unsigned int flags); + +int CMS_decrypt_set1_pkey(CMS_ContentInfo *cms, EVP_PKEY *pk, X509 *cert); +int CMS_decrypt_set1_key(CMS_ContentInfo *cms, + unsigned char *key, size_t keylen, + unsigned char *id, size_t idlen); +int CMS_decrypt_set1_password(CMS_ContentInfo *cms, + unsigned char *pass, ossl_ssize_t passlen); + +STACK_OF(CMS_RecipientInfo) *CMS_get0_RecipientInfos(CMS_ContentInfo *cms); +int CMS_RecipientInfo_type(CMS_RecipientInfo *ri); +EVP_PKEY_CTX *CMS_RecipientInfo_get0_pkey_ctx(CMS_RecipientInfo *ri); +CMS_ContentInfo *CMS_EnvelopedData_create(const EVP_CIPHER *cipher); +CMS_RecipientInfo *CMS_add1_recipient_cert(CMS_ContentInfo *cms, + X509 *recip, unsigned int flags); +int CMS_RecipientInfo_set0_pkey(CMS_RecipientInfo *ri, EVP_PKEY *pkey); +int CMS_RecipientInfo_ktri_cert_cmp(CMS_RecipientInfo *ri, X509 *cert); +int CMS_RecipientInfo_ktri_get0_algs(CMS_RecipientInfo *ri, + EVP_PKEY **pk, X509 **recip, + X509_ALGOR **palg); +int CMS_RecipientInfo_ktri_get0_signer_id(CMS_RecipientInfo *ri, + ASN1_OCTET_STRING **keyid, + X509_NAME **issuer, + ASN1_INTEGER **sno); + +CMS_RecipientInfo *CMS_add0_recipient_key(CMS_ContentInfo *cms, int nid, + unsigned char *key, size_t keylen, + unsigned char *id, size_t idlen, + ASN1_GENERALIZEDTIME *date, + ASN1_OBJECT *otherTypeId, + ASN1_TYPE *otherType); + +int CMS_RecipientInfo_kekri_get0_id(CMS_RecipientInfo *ri, + X509_ALGOR **palg, + ASN1_OCTET_STRING **pid, + ASN1_GENERALIZEDTIME **pdate, + ASN1_OBJECT **potherid, + ASN1_TYPE **pothertype); + +int CMS_RecipientInfo_set0_key(CMS_RecipientInfo *ri, + unsigned char *key, size_t keylen); + +int CMS_RecipientInfo_kekri_id_cmp(CMS_RecipientInfo *ri, + const unsigned char *id, size_t idlen); + +int CMS_RecipientInfo_set0_password(CMS_RecipientInfo *ri, + unsigned char *pass, + ossl_ssize_t passlen); + +CMS_RecipientInfo *CMS_add0_recipient_password(CMS_ContentInfo *cms, + int iter, int wrap_nid, + int pbe_nid, + unsigned char *pass, + ossl_ssize_t passlen, + const EVP_CIPHER *kekciph); + +int CMS_RecipientInfo_decrypt(CMS_ContentInfo *cms, CMS_RecipientInfo *ri); +int CMS_RecipientInfo_encrypt(CMS_ContentInfo *cms, CMS_RecipientInfo *ri); + +int CMS_uncompress(CMS_ContentInfo *cms, BIO *dcont, BIO *out, + unsigned int flags); +CMS_ContentInfo *CMS_compress(BIO *in, int comp_nid, unsigned int flags); + +int CMS_set1_eContentType(CMS_ContentInfo *cms, const ASN1_OBJECT *oid); +const ASN1_OBJECT *CMS_get0_eContentType(CMS_ContentInfo *cms); + +CMS_CertificateChoices *CMS_add0_CertificateChoices(CMS_ContentInfo *cms); +int CMS_add0_cert(CMS_ContentInfo *cms, X509 *cert); +int CMS_add1_cert(CMS_ContentInfo *cms, X509 *cert); +STACK_OF(X509) *CMS_get1_certs(CMS_ContentInfo *cms); + +CMS_RevocationInfoChoice *CMS_add0_RevocationInfoChoice(CMS_ContentInfo *cms); +int CMS_add0_crl(CMS_ContentInfo *cms, X509_CRL *crl); +int CMS_add1_crl(CMS_ContentInfo *cms, X509_CRL *crl); +STACK_OF(X509_CRL) *CMS_get1_crls(CMS_ContentInfo *cms); + +int CMS_SignedData_init(CMS_ContentInfo *cms); +CMS_SignerInfo *CMS_add1_signer(CMS_ContentInfo *cms, + X509 *signer, EVP_PKEY *pk, const EVP_MD *md, + unsigned int flags); +EVP_PKEY_CTX *CMS_SignerInfo_get0_pkey_ctx(CMS_SignerInfo *si); +EVP_MD_CTX *CMS_SignerInfo_get0_md_ctx(CMS_SignerInfo *si); +STACK_OF(CMS_SignerInfo) *CMS_get0_SignerInfos(CMS_ContentInfo *cms); + +void CMS_SignerInfo_set1_signer_cert(CMS_SignerInfo *si, X509 *signer); +int CMS_SignerInfo_get0_signer_id(CMS_SignerInfo *si, + ASN1_OCTET_STRING **keyid, + X509_NAME **issuer, ASN1_INTEGER **sno); +int CMS_SignerInfo_cert_cmp(CMS_SignerInfo *si, X509 *cert); +int CMS_set1_signers_certs(CMS_ContentInfo *cms, STACK_OF(X509) *certs, + unsigned int flags); +void CMS_SignerInfo_get0_algs(CMS_SignerInfo *si, EVP_PKEY **pk, + X509 **signer, X509_ALGOR **pdig, + X509_ALGOR **psig); +ASN1_OCTET_STRING *CMS_SignerInfo_get0_signature(CMS_SignerInfo *si); +int CMS_SignerInfo_sign(CMS_SignerInfo *si); +int CMS_SignerInfo_verify(CMS_SignerInfo *si); +int CMS_SignerInfo_verify_content(CMS_SignerInfo *si, BIO *chain); + +int CMS_add_smimecap(CMS_SignerInfo *si, STACK_OF(X509_ALGOR) *algs); +int CMS_add_simple_smimecap(STACK_OF(X509_ALGOR) **algs, + int algnid, int keysize); +int CMS_add_standard_smimecap(STACK_OF(X509_ALGOR) **smcap); + +int CMS_signed_get_attr_count(const CMS_SignerInfo *si); +int CMS_signed_get_attr_by_NID(const CMS_SignerInfo *si, int nid, + int lastpos); +int CMS_signed_get_attr_by_OBJ(const CMS_SignerInfo *si, ASN1_OBJECT *obj, + int lastpos); +X509_ATTRIBUTE *CMS_signed_get_attr(const CMS_SignerInfo *si, int loc); +X509_ATTRIBUTE *CMS_signed_delete_attr(CMS_SignerInfo *si, int loc); +int CMS_signed_add1_attr(CMS_SignerInfo *si, X509_ATTRIBUTE *attr); +int CMS_signed_add1_attr_by_OBJ(CMS_SignerInfo *si, + const ASN1_OBJECT *obj, int type, + const void *bytes, int len); +int CMS_signed_add1_attr_by_NID(CMS_SignerInfo *si, + int nid, int type, + const void *bytes, int len); +int CMS_signed_add1_attr_by_txt(CMS_SignerInfo *si, + const char *attrname, int type, + const void *bytes, int len); +void *CMS_signed_get0_data_by_OBJ(CMS_SignerInfo *si, ASN1_OBJECT *oid, + int lastpos, int type); + +int CMS_unsigned_get_attr_count(const CMS_SignerInfo *si); +int CMS_unsigned_get_attr_by_NID(const CMS_SignerInfo *si, int nid, + int lastpos); +int CMS_unsigned_get_attr_by_OBJ(const CMS_SignerInfo *si, ASN1_OBJECT *obj, + int lastpos); +X509_ATTRIBUTE *CMS_unsigned_get_attr(const CMS_SignerInfo *si, int loc); +X509_ATTRIBUTE *CMS_unsigned_delete_attr(CMS_SignerInfo *si, int loc); +int CMS_unsigned_add1_attr(CMS_SignerInfo *si, X509_ATTRIBUTE *attr); +int CMS_unsigned_add1_attr_by_OBJ(CMS_SignerInfo *si, + const ASN1_OBJECT *obj, int type, + const void *bytes, int len); +int CMS_unsigned_add1_attr_by_NID(CMS_SignerInfo *si, + int nid, int type, + const void *bytes, int len); +int CMS_unsigned_add1_attr_by_txt(CMS_SignerInfo *si, + const char *attrname, int type, + const void *bytes, int len); +void *CMS_unsigned_get0_data_by_OBJ(CMS_SignerInfo *si, ASN1_OBJECT *oid, + int lastpos, int type); + +# ifdef HEADER_X509V3_H + +int CMS_get1_ReceiptRequest(CMS_SignerInfo *si, CMS_ReceiptRequest **prr); +CMS_ReceiptRequest *CMS_ReceiptRequest_create0(unsigned char *id, int idlen, + int allorfirst, + STACK_OF(GENERAL_NAMES) + *receiptList, STACK_OF(GENERAL_NAMES) + *receiptsTo); +int CMS_add1_ReceiptRequest(CMS_SignerInfo *si, CMS_ReceiptRequest *rr); +void CMS_ReceiptRequest_get0_values(CMS_ReceiptRequest *rr, + ASN1_STRING **pcid, + int *pallorfirst, + STACK_OF(GENERAL_NAMES) **plist, + STACK_OF(GENERAL_NAMES) **prto); +# endif +int CMS_RecipientInfo_kari_get0_alg(CMS_RecipientInfo *ri, + X509_ALGOR **palg, + ASN1_OCTET_STRING **pukm); +STACK_OF(CMS_RecipientEncryptedKey) +*CMS_RecipientInfo_kari_get0_reks(CMS_RecipientInfo *ri); + +int CMS_RecipientInfo_kari_get0_orig_id(CMS_RecipientInfo *ri, + X509_ALGOR **pubalg, + ASN1_BIT_STRING **pubkey, + ASN1_OCTET_STRING **keyid, + X509_NAME **issuer, + ASN1_INTEGER **sno); + +int CMS_RecipientInfo_kari_orig_id_cmp(CMS_RecipientInfo *ri, X509 *cert); + +int CMS_RecipientEncryptedKey_get0_id(CMS_RecipientEncryptedKey *rek, + ASN1_OCTET_STRING **keyid, + ASN1_GENERALIZEDTIME **tm, + CMS_OtherKeyAttribute **other, + X509_NAME **issuer, ASN1_INTEGER **sno); +int CMS_RecipientEncryptedKey_cert_cmp(CMS_RecipientEncryptedKey *rek, + X509 *cert); +int CMS_RecipientInfo_kari_set0_pkey(CMS_RecipientInfo *ri, EVP_PKEY *pk); +EVP_CIPHER_CTX *CMS_RecipientInfo_kari_get0_ctx(CMS_RecipientInfo *ri); +int CMS_RecipientInfo_kari_decrypt(CMS_ContentInfo *cms, + CMS_RecipientInfo *ri, + CMS_RecipientEncryptedKey *rek); + +int CMS_SharedInfo_encode(unsigned char **pder, X509_ALGOR *kekalg, + ASN1_OCTET_STRING *ukm, int keylen); + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_CMS_strings(void); + +/* Error codes for the CMS functions. */ + +/* Function codes. */ +# define CMS_F_CHECK_CONTENT 99 +# define CMS_F_CMS_ADD0_CERT 164 +# define CMS_F_CMS_ADD0_RECIPIENT_KEY 100 +# define CMS_F_CMS_ADD0_RECIPIENT_PASSWORD 165 +# define CMS_F_CMS_ADD1_RECEIPTREQUEST 158 +# define CMS_F_CMS_ADD1_RECIPIENT_CERT 101 +# define CMS_F_CMS_ADD1_SIGNER 102 +# define CMS_F_CMS_ADD1_SIGNINGTIME 103 +# define CMS_F_CMS_COMPRESS 104 +# define CMS_F_CMS_COMPRESSEDDATA_CREATE 105 +# define CMS_F_CMS_COMPRESSEDDATA_INIT_BIO 106 +# define CMS_F_CMS_COPY_CONTENT 107 +# define CMS_F_CMS_COPY_MESSAGEDIGEST 108 +# define CMS_F_CMS_DATA 109 +# define CMS_F_CMS_DATAFINAL 110 +# define CMS_F_CMS_DATAINIT 111 +# define CMS_F_CMS_DECRYPT 112 +# define CMS_F_CMS_DECRYPT_SET1_KEY 113 +# define CMS_F_CMS_DECRYPT_SET1_PASSWORD 166 +# define CMS_F_CMS_DECRYPT_SET1_PKEY 114 +# define CMS_F_CMS_DIGESTALGORITHM_FIND_CTX 115 +# define CMS_F_CMS_DIGESTALGORITHM_INIT_BIO 116 +# define CMS_F_CMS_DIGESTEDDATA_DO_FINAL 117 +# define CMS_F_CMS_DIGEST_VERIFY 118 +# define CMS_F_CMS_ENCODE_RECEIPT 161 +# define CMS_F_CMS_ENCRYPT 119 +# define CMS_F_CMS_ENCRYPTEDCONTENT_INIT_BIO 120 +# define CMS_F_CMS_ENCRYPTEDDATA_DECRYPT 121 +# define CMS_F_CMS_ENCRYPTEDDATA_ENCRYPT 122 +# define CMS_F_CMS_ENCRYPTEDDATA_SET1_KEY 123 +# define CMS_F_CMS_ENVELOPEDDATA_CREATE 124 +# define CMS_F_CMS_ENVELOPEDDATA_INIT_BIO 125 +# define CMS_F_CMS_ENVELOPED_DATA_INIT 126 +# define CMS_F_CMS_ENV_ASN1_CTRL 171 +# define CMS_F_CMS_FINAL 127 +# define CMS_F_CMS_GET0_CERTIFICATE_CHOICES 128 +# define CMS_F_CMS_GET0_CONTENT 129 +# define CMS_F_CMS_GET0_ECONTENT_TYPE 130 +# define CMS_F_CMS_GET0_ENVELOPED 131 +# define CMS_F_CMS_GET0_REVOCATION_CHOICES 132 +# define CMS_F_CMS_GET0_SIGNED 133 +# define CMS_F_CMS_MSGSIGDIGEST_ADD1 162 +# define CMS_F_CMS_RECEIPTREQUEST_CREATE0 159 +# define CMS_F_CMS_RECEIPT_VERIFY 160 +# define CMS_F_CMS_RECIPIENTINFO_DECRYPT 134 +# define CMS_F_CMS_RECIPIENTINFO_ENCRYPT 169 +# define CMS_F_CMS_RECIPIENTINFO_KARI_ENCRYPT 178 +# define CMS_F_CMS_RECIPIENTINFO_KARI_GET0_ALG 175 +# define CMS_F_CMS_RECIPIENTINFO_KARI_GET0_ORIG_ID 173 +# define CMS_F_CMS_RECIPIENTINFO_KARI_GET0_REKS 172 +# define CMS_F_CMS_RECIPIENTINFO_KARI_ORIG_ID_CMP 174 +# define CMS_F_CMS_RECIPIENTINFO_KEKRI_DECRYPT 135 +# define CMS_F_CMS_RECIPIENTINFO_KEKRI_ENCRYPT 136 +# define CMS_F_CMS_RECIPIENTINFO_KEKRI_GET0_ID 137 +# define CMS_F_CMS_RECIPIENTINFO_KEKRI_ID_CMP 138 +# define CMS_F_CMS_RECIPIENTINFO_KTRI_CERT_CMP 139 +# define CMS_F_CMS_RECIPIENTINFO_KTRI_DECRYPT 140 +# define CMS_F_CMS_RECIPIENTINFO_KTRI_ENCRYPT 141 +# define CMS_F_CMS_RECIPIENTINFO_KTRI_GET0_ALGS 142 +# define CMS_F_CMS_RECIPIENTINFO_KTRI_GET0_SIGNER_ID 143 +# define CMS_F_CMS_RECIPIENTINFO_PWRI_CRYPT 167 +# define CMS_F_CMS_RECIPIENTINFO_SET0_KEY 144 +# define CMS_F_CMS_RECIPIENTINFO_SET0_PASSWORD 168 +# define CMS_F_CMS_RECIPIENTINFO_SET0_PKEY 145 +# define CMS_F_CMS_SD_ASN1_CTRL 170 +# define CMS_F_CMS_SET1_IAS 176 +# define CMS_F_CMS_SET1_KEYID 177 +# define CMS_F_CMS_SET1_SIGNERIDENTIFIER 146 +# define CMS_F_CMS_SET_DETACHED 147 +# define CMS_F_CMS_SIGN 148 +# define CMS_F_CMS_SIGNED_DATA_INIT 149 +# define CMS_F_CMS_SIGNERINFO_CONTENT_SIGN 150 +# define CMS_F_CMS_SIGNERINFO_SIGN 151 +# define CMS_F_CMS_SIGNERINFO_VERIFY 152 +# define CMS_F_CMS_SIGNERINFO_VERIFY_CERT 153 +# define CMS_F_CMS_SIGNERINFO_VERIFY_CONTENT 154 +# define CMS_F_CMS_SIGN_RECEIPT 163 +# define CMS_F_CMS_STREAM 155 +# define CMS_F_CMS_UNCOMPRESS 156 +# define CMS_F_CMS_VERIFY 157 + +/* Reason codes. */ +# define CMS_R_ADD_SIGNER_ERROR 99 +# define CMS_R_CERTIFICATE_ALREADY_PRESENT 175 +# define CMS_R_CERTIFICATE_HAS_NO_KEYID 160 +# define CMS_R_CERTIFICATE_VERIFY_ERROR 100 +# define CMS_R_CIPHER_INITIALISATION_ERROR 101 +# define CMS_R_CIPHER_PARAMETER_INITIALISATION_ERROR 102 +# define CMS_R_CMS_DATAFINAL_ERROR 103 +# define CMS_R_CMS_LIB 104 +# define CMS_R_CONTENTIDENTIFIER_MISMATCH 170 +# define CMS_R_CONTENT_NOT_FOUND 105 +# define CMS_R_CONTENT_TYPE_MISMATCH 171 +# define CMS_R_CONTENT_TYPE_NOT_COMPRESSED_DATA 106 +# define CMS_R_CONTENT_TYPE_NOT_ENVELOPED_DATA 107 +# define CMS_R_CONTENT_TYPE_NOT_SIGNED_DATA 108 +# define CMS_R_CONTENT_VERIFY_ERROR 109 +# define CMS_R_CTRL_ERROR 110 +# define CMS_R_CTRL_FAILURE 111 +# define CMS_R_DECRYPT_ERROR 112 +# define CMS_R_DIGEST_ERROR 161 +# define CMS_R_ERROR_GETTING_PUBLIC_KEY 113 +# define CMS_R_ERROR_READING_MESSAGEDIGEST_ATTRIBUTE 114 +# define CMS_R_ERROR_SETTING_KEY 115 +# define CMS_R_ERROR_SETTING_RECIPIENTINFO 116 +# define CMS_R_INVALID_ENCRYPTED_KEY_LENGTH 117 +# define CMS_R_INVALID_KEY_ENCRYPTION_PARAMETER 176 +# define CMS_R_INVALID_KEY_LENGTH 118 +# define CMS_R_MD_BIO_INIT_ERROR 119 +# define CMS_R_MESSAGEDIGEST_ATTRIBUTE_WRONG_LENGTH 120 +# define CMS_R_MESSAGEDIGEST_WRONG_LENGTH 121 +# define CMS_R_MSGSIGDIGEST_ERROR 172 +# define CMS_R_MSGSIGDIGEST_VERIFICATION_FAILURE 162 +# define CMS_R_MSGSIGDIGEST_WRONG_LENGTH 163 +# define CMS_R_NEED_ONE_SIGNER 164 +# define CMS_R_NOT_A_SIGNED_RECEIPT 165 +# define CMS_R_NOT_ENCRYPTED_DATA 122 +# define CMS_R_NOT_KEK 123 +# define CMS_R_NOT_KEY_AGREEMENT 181 +# define CMS_R_NOT_KEY_TRANSPORT 124 +# define CMS_R_NOT_PWRI 177 +# define CMS_R_NOT_SUPPORTED_FOR_THIS_KEY_TYPE 125 +# define CMS_R_NO_CIPHER 126 +# define CMS_R_NO_CONTENT 127 +# define CMS_R_NO_CONTENT_TYPE 173 +# define CMS_R_NO_DEFAULT_DIGEST 128 +# define CMS_R_NO_DIGEST_SET 129 +# define CMS_R_NO_KEY 130 +# define CMS_R_NO_KEY_OR_CERT 174 +# define CMS_R_NO_MATCHING_DIGEST 131 +# define CMS_R_NO_MATCHING_RECIPIENT 132 +# define CMS_R_NO_MATCHING_SIGNATURE 166 +# define CMS_R_NO_MSGSIGDIGEST 167 +# define CMS_R_NO_PASSWORD 178 +# define CMS_R_NO_PRIVATE_KEY 133 +# define CMS_R_NO_PUBLIC_KEY 134 +# define CMS_R_NO_RECEIPT_REQUEST 168 +# define CMS_R_NO_SIGNERS 135 +# define CMS_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE 136 +# define CMS_R_RECEIPT_DECODE_ERROR 169 +# define CMS_R_RECIPIENT_ERROR 137 +# define CMS_R_SIGNER_CERTIFICATE_NOT_FOUND 138 +# define CMS_R_SIGNFINAL_ERROR 139 +# define CMS_R_SMIME_TEXT_ERROR 140 +# define CMS_R_STORE_INIT_ERROR 141 +# define CMS_R_TYPE_NOT_COMPRESSED_DATA 142 +# define CMS_R_TYPE_NOT_DATA 143 +# define CMS_R_TYPE_NOT_DIGESTED_DATA 144 +# define CMS_R_TYPE_NOT_ENCRYPTED_DATA 145 +# define CMS_R_TYPE_NOT_ENVELOPED_DATA 146 +# define CMS_R_UNABLE_TO_FINALIZE_CONTEXT 147 +# define CMS_R_UNKNOWN_CIPHER 148 +# define CMS_R_UNKNOWN_DIGEST_ALGORIHM 149 +# define CMS_R_UNKNOWN_ID 150 +# define CMS_R_UNSUPPORTED_COMPRESSION_ALGORITHM 151 +# define CMS_R_UNSUPPORTED_CONTENT_TYPE 152 +# define CMS_R_UNSUPPORTED_KEK_ALGORITHM 153 +# define CMS_R_UNSUPPORTED_KEY_ENCRYPTION_ALGORITHM 179 +# define CMS_R_UNSUPPORTED_RECIPIENT_TYPE 154 +# define CMS_R_UNSUPPORTED_RECPIENTINFO_TYPE 155 +# define CMS_R_UNSUPPORTED_TYPE 156 +# define CMS_R_UNWRAP_ERROR 157 +# define CMS_R_UNWRAP_FAILURE 180 +# define CMS_R_VERIFICATION_FAILURE 158 +# define CMS_R_WRAP_ERROR 159 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/ext/openssl-osx/include/nope/conf.h b/ext/openssl-osx/include/nope/conf.h new file mode 100644 index 00000000..8d926d5d --- /dev/null +++ b/ext/openssl-osx/include/nope/conf.h @@ -0,0 +1,267 @@ +/* crypto/conf/conf.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_CONF_H +# define HEADER_CONF_H + +# include +# include +# include +# include +# include + +# include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + char *section; + char *name; + char *value; +} CONF_VALUE; + +DECLARE_STACK_OF(CONF_VALUE) +DECLARE_LHASH_OF(CONF_VALUE); + +struct conf_st; +struct conf_method_st; +typedef struct conf_method_st CONF_METHOD; + +struct conf_method_st { + const char *name; + CONF *(*create) (CONF_METHOD *meth); + int (*init) (CONF *conf); + int (*destroy) (CONF *conf); + int (*destroy_data) (CONF *conf); + int (*load_bio) (CONF *conf, BIO *bp, long *eline); + int (*dump) (const CONF *conf, BIO *bp); + int (*is_number) (const CONF *conf, char c); + int (*to_int) (const CONF *conf, char c); + int (*load) (CONF *conf, const char *name, long *eline); +}; + +/* Module definitions */ + +typedef struct conf_imodule_st CONF_IMODULE; +typedef struct conf_module_st CONF_MODULE; + +DECLARE_STACK_OF(CONF_MODULE) +DECLARE_STACK_OF(CONF_IMODULE) + +/* DSO module function typedefs */ +typedef int conf_init_func (CONF_IMODULE *md, const CONF *cnf); +typedef void conf_finish_func (CONF_IMODULE *md); + +# define CONF_MFLAGS_IGNORE_ERRORS 0x1 +# define CONF_MFLAGS_IGNORE_RETURN_CODES 0x2 +# define CONF_MFLAGS_SILENT 0x4 +# define CONF_MFLAGS_NO_DSO 0x8 +# define CONF_MFLAGS_IGNORE_MISSING_FILE 0x10 +# define CONF_MFLAGS_DEFAULT_SECTION 0x20 + +int CONF_set_default_method(CONF_METHOD *meth); +void CONF_set_nconf(CONF *conf, LHASH_OF(CONF_VALUE) *hash); +LHASH_OF(CONF_VALUE) *CONF_load(LHASH_OF(CONF_VALUE) *conf, const char *file, + long *eline); +# ifndef OPENSSL_NO_FP_API +LHASH_OF(CONF_VALUE) *CONF_load_fp(LHASH_OF(CONF_VALUE) *conf, FILE *fp, + long *eline); +# endif +LHASH_OF(CONF_VALUE) *CONF_load_bio(LHASH_OF(CONF_VALUE) *conf, BIO *bp, + long *eline); +STACK_OF(CONF_VALUE) *CONF_get_section(LHASH_OF(CONF_VALUE) *conf, + const char *section); +char *CONF_get_string(LHASH_OF(CONF_VALUE) *conf, const char *group, + const char *name); +long CONF_get_number(LHASH_OF(CONF_VALUE) *conf, const char *group, + const char *name); +void CONF_free(LHASH_OF(CONF_VALUE) *conf); +int CONF_dump_fp(LHASH_OF(CONF_VALUE) *conf, FILE *out); +int CONF_dump_bio(LHASH_OF(CONF_VALUE) *conf, BIO *out); + +void OPENSSL_config(const char *config_name); +void OPENSSL_no_config(void); + +/* + * New conf code. The semantics are different from the functions above. If + * that wasn't the case, the above functions would have been replaced + */ + +struct conf_st { + CONF_METHOD *meth; + void *meth_data; + LHASH_OF(CONF_VALUE) *data; +}; + +CONF *NCONF_new(CONF_METHOD *meth); +CONF_METHOD *NCONF_default(void); +CONF_METHOD *NCONF_WIN32(void); +# if 0 /* Just to give you an idea of what I have in + * mind */ +CONF_METHOD *NCONF_XML(void); +# endif +void NCONF_free(CONF *conf); +void NCONF_free_data(CONF *conf); + +int NCONF_load(CONF *conf, const char *file, long *eline); +# ifndef OPENSSL_NO_FP_API +int NCONF_load_fp(CONF *conf, FILE *fp, long *eline); +# endif +int NCONF_load_bio(CONF *conf, BIO *bp, long *eline); +STACK_OF(CONF_VALUE) *NCONF_get_section(const CONF *conf, + const char *section); +char *NCONF_get_string(const CONF *conf, const char *group, const char *name); +int NCONF_get_number_e(const CONF *conf, const char *group, const char *name, + long *result); +int NCONF_dump_fp(const CONF *conf, FILE *out); +int NCONF_dump_bio(const CONF *conf, BIO *out); + +# if 0 /* The following function has no error + * checking, and should therefore be avoided */ +long NCONF_get_number(CONF *conf, char *group, char *name); +# else +# define NCONF_get_number(c,g,n,r) NCONF_get_number_e(c,g,n,r) +# endif + +/* Module functions */ + +int CONF_modules_load(const CONF *cnf, const char *appname, + unsigned long flags); +int CONF_modules_load_file(const char *filename, const char *appname, + unsigned long flags); +void CONF_modules_unload(int all); +void CONF_modules_finish(void); +void CONF_modules_free(void); +int CONF_module_add(const char *name, conf_init_func *ifunc, + conf_finish_func *ffunc); + +const char *CONF_imodule_get_name(const CONF_IMODULE *md); +const char *CONF_imodule_get_value(const CONF_IMODULE *md); +void *CONF_imodule_get_usr_data(const CONF_IMODULE *md); +void CONF_imodule_set_usr_data(CONF_IMODULE *md, void *usr_data); +CONF_MODULE *CONF_imodule_get_module(const CONF_IMODULE *md); +unsigned long CONF_imodule_get_flags(const CONF_IMODULE *md); +void CONF_imodule_set_flags(CONF_IMODULE *md, unsigned long flags); +void *CONF_module_get_usr_data(CONF_MODULE *pmod); +void CONF_module_set_usr_data(CONF_MODULE *pmod, void *usr_data); + +char *CONF_get1_default_config_file(void); + +int CONF_parse_list(const char *list, int sep, int nospc, + int (*list_cb) (const char *elem, int len, void *usr), + void *arg); + +void OPENSSL_load_builtin_modules(void); + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_CONF_strings(void); + +/* Error codes for the CONF functions. */ + +/* Function codes. */ +# define CONF_F_CONF_DUMP_FP 104 +# define CONF_F_CONF_LOAD 100 +# define CONF_F_CONF_LOAD_BIO 102 +# define CONF_F_CONF_LOAD_FP 103 +# define CONF_F_CONF_MODULES_LOAD 116 +# define CONF_F_CONF_PARSE_LIST 119 +# define CONF_F_DEF_LOAD 120 +# define CONF_F_DEF_LOAD_BIO 121 +# define CONF_F_MODULE_INIT 115 +# define CONF_F_MODULE_LOAD_DSO 117 +# define CONF_F_MODULE_RUN 118 +# define CONF_F_NCONF_DUMP_BIO 105 +# define CONF_F_NCONF_DUMP_FP 106 +# define CONF_F_NCONF_GET_NUMBER 107 +# define CONF_F_NCONF_GET_NUMBER_E 112 +# define CONF_F_NCONF_GET_SECTION 108 +# define CONF_F_NCONF_GET_STRING 109 +# define CONF_F_NCONF_LOAD 113 +# define CONF_F_NCONF_LOAD_BIO 110 +# define CONF_F_NCONF_LOAD_FP 114 +# define CONF_F_NCONF_NEW 111 +# define CONF_F_STR_COPY 101 + +/* Reason codes. */ +# define CONF_R_ERROR_LOADING_DSO 110 +# define CONF_R_LIST_CANNOT_BE_NULL 115 +# define CONF_R_MISSING_CLOSE_SQUARE_BRACKET 100 +# define CONF_R_MISSING_EQUAL_SIGN 101 +# define CONF_R_MISSING_FINISH_FUNCTION 111 +# define CONF_R_MISSING_INIT_FUNCTION 112 +# define CONF_R_MODULE_INITIALIZATION_ERROR 109 +# define CONF_R_NO_CLOSE_BRACE 102 +# define CONF_R_NO_CONF 105 +# define CONF_R_NO_CONF_OR_ENVIRONMENT_VARIABLE 106 +# define CONF_R_NO_SECTION 107 +# define CONF_R_NO_SUCH_FILE 114 +# define CONF_R_NO_VALUE 108 +# define CONF_R_UNABLE_TO_CREATE_NEW_SECTION 103 +# define CONF_R_UNKNOWN_MODULE_NAME 113 +# define CONF_R_VARIABLE_HAS_NO_VALUE 104 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/ext/openssl-osx/include/nope/conf_api.h b/ext/openssl-osx/include/nope/conf_api.h new file mode 100644 index 00000000..e478f7df --- /dev/null +++ b/ext/openssl-osx/include/nope/conf_api.h @@ -0,0 +1,89 @@ +/* conf_api.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_CONF_API_H +# define HEADER_CONF_API_H + +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Up until OpenSSL 0.9.5a, this was new_section */ +CONF_VALUE *_CONF_new_section(CONF *conf, const char *section); +/* Up until OpenSSL 0.9.5a, this was get_section */ +CONF_VALUE *_CONF_get_section(const CONF *conf, const char *section); +/* Up until OpenSSL 0.9.5a, this was CONF_get_section */ +STACK_OF(CONF_VALUE) *_CONF_get_section_values(const CONF *conf, + const char *section); + +int _CONF_add_string(CONF *conf, CONF_VALUE *section, CONF_VALUE *value); +char *_CONF_get_string(const CONF *conf, const char *section, + const char *name); +long _CONF_get_number(const CONF *conf, const char *section, + const char *name); + +int _CONF_new_data(CONF *conf); +void _CONF_free_data(CONF *conf); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/ext/openssl-osx/include/nope/des.h b/ext/openssl-osx/include/nope/des.h new file mode 100644 index 00000000..1b40144e --- /dev/null +++ b/ext/openssl-osx/include/nope/des.h @@ -0,0 +1,257 @@ +/* crypto/des/des.h */ +/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_NEW_DES_H +# define HEADER_NEW_DES_H + +# include /* OPENSSL_EXTERN, OPENSSL_NO_DES, DES_LONG + * (via openssl/opensslconf.h */ + +# ifdef OPENSSL_NO_DES +# error DES is disabled. +# endif + +# ifdef OPENSSL_BUILD_SHLIBCRYPTO +# undef OPENSSL_EXTERN +# define OPENSSL_EXTERN OPENSSL_EXPORT +# endif + +#ifdef __cplusplus +extern "C" { +#endif + +typedef unsigned char DES_cblock[8]; +typedef /* const */ unsigned char const_DES_cblock[8]; +/* + * With "const", gcc 2.8.1 on Solaris thinks that DES_cblock * and + * const_DES_cblock * are incompatible pointer types. + */ + +typedef struct DES_ks { + union { + DES_cblock cblock; + /* + * make sure things are correct size on machines with 8 byte longs + */ + DES_LONG deslong[2]; + } ks[16]; +} DES_key_schedule; + +# ifndef OPENSSL_DISABLE_OLD_DES_SUPPORT +# ifndef OPENSSL_ENABLE_OLD_DES_SUPPORT +# define OPENSSL_ENABLE_OLD_DES_SUPPORT +# endif +# endif + +# ifdef OPENSSL_ENABLE_OLD_DES_SUPPORT +# include +# endif + +# define DES_KEY_SZ (sizeof(DES_cblock)) +# define DES_SCHEDULE_SZ (sizeof(DES_key_schedule)) + +# define DES_ENCRYPT 1 +# define DES_DECRYPT 0 + +# define DES_CBC_MODE 0 +# define DES_PCBC_MODE 1 + +# define DES_ecb2_encrypt(i,o,k1,k2,e) \ + DES_ecb3_encrypt((i),(o),(k1),(k2),(k1),(e)) + +# define DES_ede2_cbc_encrypt(i,o,l,k1,k2,iv,e) \ + DES_ede3_cbc_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(e)) + +# define DES_ede2_cfb64_encrypt(i,o,l,k1,k2,iv,n,e) \ + DES_ede3_cfb64_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(n),(e)) + +# define DES_ede2_ofb64_encrypt(i,o,l,k1,k2,iv,n) \ + DES_ede3_ofb64_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(n)) + +OPENSSL_DECLARE_GLOBAL(int, DES_check_key); /* defaults to false */ +# define DES_check_key OPENSSL_GLOBAL_REF(DES_check_key) +OPENSSL_DECLARE_GLOBAL(int, DES_rw_mode); /* defaults to DES_PCBC_MODE */ +# define DES_rw_mode OPENSSL_GLOBAL_REF(DES_rw_mode) + +const char *DES_options(void); +void DES_ecb3_encrypt(const_DES_cblock *input, DES_cblock *output, + DES_key_schedule *ks1, DES_key_schedule *ks2, + DES_key_schedule *ks3, int enc); +DES_LONG DES_cbc_cksum(const unsigned char *input, DES_cblock *output, + long length, DES_key_schedule *schedule, + const_DES_cblock *ivec); +/* DES_cbc_encrypt does not update the IV! Use DES_ncbc_encrypt instead. */ +void DES_cbc_encrypt(const unsigned char *input, unsigned char *output, + long length, DES_key_schedule *schedule, + DES_cblock *ivec, int enc); +void DES_ncbc_encrypt(const unsigned char *input, unsigned char *output, + long length, DES_key_schedule *schedule, + DES_cblock *ivec, int enc); +void DES_xcbc_encrypt(const unsigned char *input, unsigned char *output, + long length, DES_key_schedule *schedule, + DES_cblock *ivec, const_DES_cblock *inw, + const_DES_cblock *outw, int enc); +void DES_cfb_encrypt(const unsigned char *in, unsigned char *out, int numbits, + long length, DES_key_schedule *schedule, + DES_cblock *ivec, int enc); +void DES_ecb_encrypt(const_DES_cblock *input, DES_cblock *output, + DES_key_schedule *ks, int enc); + +/* + * This is the DES encryption function that gets called by just about every + * other DES routine in the library. You should not use this function except + * to implement 'modes' of DES. I say this because the functions that call + * this routine do the conversion from 'char *' to long, and this needs to be + * done to make sure 'non-aligned' memory access do not occur. The + * characters are loaded 'little endian'. Data is a pointer to 2 unsigned + * long's and ks is the DES_key_schedule to use. enc, is non zero specifies + * encryption, zero if decryption. + */ +void DES_encrypt1(DES_LONG *data, DES_key_schedule *ks, int enc); + +/* + * This functions is the same as DES_encrypt1() except that the DES initial + * permutation (IP) and final permutation (FP) have been left out. As for + * DES_encrypt1(), you should not use this function. It is used by the + * routines in the library that implement triple DES. IP() DES_encrypt2() + * DES_encrypt2() DES_encrypt2() FP() is the same as DES_encrypt1() + * DES_encrypt1() DES_encrypt1() except faster :-). + */ +void DES_encrypt2(DES_LONG *data, DES_key_schedule *ks, int enc); + +void DES_encrypt3(DES_LONG *data, DES_key_schedule *ks1, + DES_key_schedule *ks2, DES_key_schedule *ks3); +void DES_decrypt3(DES_LONG *data, DES_key_schedule *ks1, + DES_key_schedule *ks2, DES_key_schedule *ks3); +void DES_ede3_cbc_encrypt(const unsigned char *input, unsigned char *output, + long length, + DES_key_schedule *ks1, DES_key_schedule *ks2, + DES_key_schedule *ks3, DES_cblock *ivec, int enc); +void DES_ede3_cbcm_encrypt(const unsigned char *in, unsigned char *out, + long length, + DES_key_schedule *ks1, DES_key_schedule *ks2, + DES_key_schedule *ks3, + DES_cblock *ivec1, DES_cblock *ivec2, int enc); +void DES_ede3_cfb64_encrypt(const unsigned char *in, unsigned char *out, + long length, DES_key_schedule *ks1, + DES_key_schedule *ks2, DES_key_schedule *ks3, + DES_cblock *ivec, int *num, int enc); +void DES_ede3_cfb_encrypt(const unsigned char *in, unsigned char *out, + int numbits, long length, DES_key_schedule *ks1, + DES_key_schedule *ks2, DES_key_schedule *ks3, + DES_cblock *ivec, int enc); +void DES_ede3_ofb64_encrypt(const unsigned char *in, unsigned char *out, + long length, DES_key_schedule *ks1, + DES_key_schedule *ks2, DES_key_schedule *ks3, + DES_cblock *ivec, int *num); +# if 0 +void DES_xwhite_in2out(const_DES_cblock *DES_key, const_DES_cblock *in_white, + DES_cblock *out_white); +# endif + +int DES_enc_read(int fd, void *buf, int len, DES_key_schedule *sched, + DES_cblock *iv); +int DES_enc_write(int fd, const void *buf, int len, DES_key_schedule *sched, + DES_cblock *iv); +char *DES_fcrypt(const char *buf, const char *salt, char *ret); +char *DES_crypt(const char *buf, const char *salt); +void DES_ofb_encrypt(const unsigned char *in, unsigned char *out, int numbits, + long length, DES_key_schedule *schedule, + DES_cblock *ivec); +void DES_pcbc_encrypt(const unsigned char *input, unsigned char *output, + long length, DES_key_schedule *schedule, + DES_cblock *ivec, int enc); +DES_LONG DES_quad_cksum(const unsigned char *input, DES_cblock output[], + long length, int out_count, DES_cblock *seed); +int DES_random_key(DES_cblock *ret); +void DES_set_odd_parity(DES_cblock *key); +int DES_check_key_parity(const_DES_cblock *key); +int DES_is_weak_key(const_DES_cblock *key); +/* + * DES_set_key (= set_key = DES_key_sched = key_sched) calls + * DES_set_key_checked if global variable DES_check_key is set, + * DES_set_key_unchecked otherwise. + */ +int DES_set_key(const_DES_cblock *key, DES_key_schedule *schedule); +int DES_key_sched(const_DES_cblock *key, DES_key_schedule *schedule); +int DES_set_key_checked(const_DES_cblock *key, DES_key_schedule *schedule); +void DES_set_key_unchecked(const_DES_cblock *key, DES_key_schedule *schedule); +# ifdef OPENSSL_FIPS +void private_DES_set_key_unchecked(const_DES_cblock *key, + DES_key_schedule *schedule); +# endif +void DES_string_to_key(const char *str, DES_cblock *key); +void DES_string_to_2keys(const char *str, DES_cblock *key1, DES_cblock *key2); +void DES_cfb64_encrypt(const unsigned char *in, unsigned char *out, + long length, DES_key_schedule *schedule, + DES_cblock *ivec, int *num, int enc); +void DES_ofb64_encrypt(const unsigned char *in, unsigned char *out, + long length, DES_key_schedule *schedule, + DES_cblock *ivec, int *num); + +int DES_read_password(DES_cblock *key, const char *prompt, int verify); +int DES_read_2passwords(DES_cblock *key1, DES_cblock *key2, + const char *prompt, int verify); + +# define DES_fixup_key_parity DES_set_odd_parity + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ext/openssl-osx/include/nope/des_old.h b/ext/openssl-osx/include/nope/des_old.h new file mode 100644 index 00000000..f1e1e2cb --- /dev/null +++ b/ext/openssl-osx/include/nope/des_old.h @@ -0,0 +1,497 @@ +/* crypto/des/des_old.h -*- mode:C; c-file-style: "eay" -*- */ + +/*- + * WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING + * + * The function names in here are deprecated and are only present to + * provide an interface compatible with openssl 0.9.6 and older as + * well as libdes. OpenSSL now provides functions where "des_" has + * been replaced with "DES_" in the names, to make it possible to + * make incompatible changes that are needed for C type security and + * other stuff. + * + * This include files has two compatibility modes: + * + * - If OPENSSL_DES_LIBDES_COMPATIBILITY is defined, you get an API + * that is compatible with libdes and SSLeay. + * - If OPENSSL_DES_LIBDES_COMPATIBILITY isn't defined, you get an + * API that is compatible with OpenSSL 0.9.5x to 0.9.6x. + * + * Note that these modes break earlier snapshots of OpenSSL, where + * libdes compatibility was the only available mode or (later on) the + * prefered compatibility mode. However, after much consideration + * (and more or less violent discussions with external parties), it + * was concluded that OpenSSL should be compatible with earlier versions + * of itself before anything else. Also, in all honesty, libdes is + * an old beast that shouldn't really be used any more. + * + * Please consider starting to use the DES_ functions rather than the + * des_ ones. The des_ functions will disappear completely before + * OpenSSL 1.0! + * + * WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING + */ + +/* + * Written by Richard Levitte (richard@levitte.org) for the OpenSSL project + * 2001. + */ +/* ==================================================================== + * Copyright (c) 1998-2002 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_DES_H +# define HEADER_DES_H + +# include /* OPENSSL_EXTERN, OPENSSL_NO_DES, DES_LONG */ + +# ifdef OPENSSL_NO_DES +# error DES is disabled. +# endif + +# ifndef HEADER_NEW_DES_H +# error You must include des.h, not des_old.h directly. +# endif + +# ifdef _KERBEROS_DES_H +# error replaces . +# endif + +# include + +# ifdef OPENSSL_BUILD_SHLIBCRYPTO +# undef OPENSSL_EXTERN +# define OPENSSL_EXTERN OPENSSL_EXPORT +# endif + +#ifdef __cplusplus +extern "C" { +#endif + +# ifdef _ +# undef _ +# endif + +typedef unsigned char _ossl_old_des_cblock[8]; +typedef struct _ossl_old_des_ks_struct { + union { + _ossl_old_des_cblock _; + /* + * make sure things are correct size on machines with 8 byte longs + */ + DES_LONG pad[2]; + } ks; +} _ossl_old_des_key_schedule[16]; + +# ifndef OPENSSL_DES_LIBDES_COMPATIBILITY +# define des_cblock DES_cblock +# define const_des_cblock const_DES_cblock +# define des_key_schedule DES_key_schedule +# define des_ecb3_encrypt(i,o,k1,k2,k3,e)\ + DES_ecb3_encrypt((i),(o),&(k1),&(k2),&(k3),(e)) +# define des_ede3_cbc_encrypt(i,o,l,k1,k2,k3,iv,e)\ + DES_ede3_cbc_encrypt((i),(o),(l),&(k1),&(k2),&(k3),(iv),(e)) +# define des_ede3_cbcm_encrypt(i,o,l,k1,k2,k3,iv1,iv2,e)\ + DES_ede3_cbcm_encrypt((i),(o),(l),&(k1),&(k2),&(k3),(iv1),(iv2),(e)) +# define des_ede3_cfb64_encrypt(i,o,l,k1,k2,k3,iv,n,e)\ + DES_ede3_cfb64_encrypt((i),(o),(l),&(k1),&(k2),&(k3),(iv),(n),(e)) +# define des_ede3_ofb64_encrypt(i,o,l,k1,k2,k3,iv,n)\ + DES_ede3_ofb64_encrypt((i),(o),(l),&(k1),&(k2),&(k3),(iv),(n)) +# define des_options()\ + DES_options() +# define des_cbc_cksum(i,o,l,k,iv)\ + DES_cbc_cksum((i),(o),(l),&(k),(iv)) +# define des_cbc_encrypt(i,o,l,k,iv,e)\ + DES_cbc_encrypt((i),(o),(l),&(k),(iv),(e)) +# define des_ncbc_encrypt(i,o,l,k,iv,e)\ + DES_ncbc_encrypt((i),(o),(l),&(k),(iv),(e)) +# define des_xcbc_encrypt(i,o,l,k,iv,inw,outw,e)\ + DES_xcbc_encrypt((i),(o),(l),&(k),(iv),(inw),(outw),(e)) +# define des_cfb_encrypt(i,o,n,l,k,iv,e)\ + DES_cfb_encrypt((i),(o),(n),(l),&(k),(iv),(e)) +# define des_ecb_encrypt(i,o,k,e)\ + DES_ecb_encrypt((i),(o),&(k),(e)) +# define des_encrypt1(d,k,e)\ + DES_encrypt1((d),&(k),(e)) +# define des_encrypt2(d,k,e)\ + DES_encrypt2((d),&(k),(e)) +# define des_encrypt3(d,k1,k2,k3)\ + DES_encrypt3((d),&(k1),&(k2),&(k3)) +# define des_decrypt3(d,k1,k2,k3)\ + DES_decrypt3((d),&(k1),&(k2),&(k3)) +# define des_xwhite_in2out(k,i,o)\ + DES_xwhite_in2out((k),(i),(o)) +# define des_enc_read(f,b,l,k,iv)\ + DES_enc_read((f),(b),(l),&(k),(iv)) +# define des_enc_write(f,b,l,k,iv)\ + DES_enc_write((f),(b),(l),&(k),(iv)) +# define des_fcrypt(b,s,r)\ + DES_fcrypt((b),(s),(r)) +# if 0 +# define des_crypt(b,s)\ + DES_crypt((b),(s)) +# if !defined(PERL5) && !defined(__FreeBSD__) && !defined(NeXT) && !defined(__OpenBSD__) +# define crypt(b,s)\ + DES_crypt((b),(s)) +# endif +# endif +# define des_ofb_encrypt(i,o,n,l,k,iv)\ + DES_ofb_encrypt((i),(o),(n),(l),&(k),(iv)) +# define des_pcbc_encrypt(i,o,l,k,iv,e)\ + DES_pcbc_encrypt((i),(o),(l),&(k),(iv),(e)) +# define des_quad_cksum(i,o,l,c,s)\ + DES_quad_cksum((i),(o),(l),(c),(s)) +# define des_random_seed(k)\ + _ossl_096_des_random_seed((k)) +# define des_random_key(r)\ + DES_random_key((r)) +# define des_read_password(k,p,v) \ + DES_read_password((k),(p),(v)) +# define des_read_2passwords(k1,k2,p,v) \ + DES_read_2passwords((k1),(k2),(p),(v)) +# define des_set_odd_parity(k)\ + DES_set_odd_parity((k)) +# define des_check_key_parity(k)\ + DES_check_key_parity((k)) +# define des_is_weak_key(k)\ + DES_is_weak_key((k)) +# define des_set_key(k,ks)\ + DES_set_key((k),&(ks)) +# define des_key_sched(k,ks)\ + DES_key_sched((k),&(ks)) +# define des_set_key_checked(k,ks)\ + DES_set_key_checked((k),&(ks)) +# define des_set_key_unchecked(k,ks)\ + DES_set_key_unchecked((k),&(ks)) +# define des_string_to_key(s,k)\ + DES_string_to_key((s),(k)) +# define des_string_to_2keys(s,k1,k2)\ + DES_string_to_2keys((s),(k1),(k2)) +# define des_cfb64_encrypt(i,o,l,ks,iv,n,e)\ + DES_cfb64_encrypt((i),(o),(l),&(ks),(iv),(n),(e)) +# define des_ofb64_encrypt(i,o,l,ks,iv,n)\ + DES_ofb64_encrypt((i),(o),(l),&(ks),(iv),(n)) + +# define des_ecb2_encrypt(i,o,k1,k2,e) \ + des_ecb3_encrypt((i),(o),(k1),(k2),(k1),(e)) + +# define des_ede2_cbc_encrypt(i,o,l,k1,k2,iv,e) \ + des_ede3_cbc_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(e)) + +# define des_ede2_cfb64_encrypt(i,o,l,k1,k2,iv,n,e) \ + des_ede3_cfb64_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(n),(e)) + +# define des_ede2_ofb64_encrypt(i,o,l,k1,k2,iv,n) \ + des_ede3_ofb64_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(n)) + +# define des_check_key DES_check_key +# define des_rw_mode DES_rw_mode +# else /* libdes compatibility */ +/* + * Map all symbol names to _ossl_old_des_* form, so we avoid all clashes with + * libdes + */ +# define des_cblock _ossl_old_des_cblock +# define des_key_schedule _ossl_old_des_key_schedule +# define des_ecb3_encrypt(i,o,k1,k2,k3,e)\ + _ossl_old_des_ecb3_encrypt((i),(o),(k1),(k2),(k3),(e)) +# define des_ede3_cbc_encrypt(i,o,l,k1,k2,k3,iv,e)\ + _ossl_old_des_ede3_cbc_encrypt((i),(o),(l),(k1),(k2),(k3),(iv),(e)) +# define des_ede3_cfb64_encrypt(i,o,l,k1,k2,k3,iv,n,e)\ + _ossl_old_des_ede3_cfb64_encrypt((i),(o),(l),(k1),(k2),(k3),(iv),(n),(e)) +# define des_ede3_ofb64_encrypt(i,o,l,k1,k2,k3,iv,n)\ + _ossl_old_des_ede3_ofb64_encrypt((i),(o),(l),(k1),(k2),(k3),(iv),(n)) +# define des_options()\ + _ossl_old_des_options() +# define des_cbc_cksum(i,o,l,k,iv)\ + _ossl_old_des_cbc_cksum((i),(o),(l),(k),(iv)) +# define des_cbc_encrypt(i,o,l,k,iv,e)\ + _ossl_old_des_cbc_encrypt((i),(o),(l),(k),(iv),(e)) +# define des_ncbc_encrypt(i,o,l,k,iv,e)\ + _ossl_old_des_ncbc_encrypt((i),(o),(l),(k),(iv),(e)) +# define des_xcbc_encrypt(i,o,l,k,iv,inw,outw,e)\ + _ossl_old_des_xcbc_encrypt((i),(o),(l),(k),(iv),(inw),(outw),(e)) +# define des_cfb_encrypt(i,o,n,l,k,iv,e)\ + _ossl_old_des_cfb_encrypt((i),(o),(n),(l),(k),(iv),(e)) +# define des_ecb_encrypt(i,o,k,e)\ + _ossl_old_des_ecb_encrypt((i),(o),(k),(e)) +# define des_encrypt(d,k,e)\ + _ossl_old_des_encrypt((d),(k),(e)) +# define des_encrypt2(d,k,e)\ + _ossl_old_des_encrypt2((d),(k),(e)) +# define des_encrypt3(d,k1,k2,k3)\ + _ossl_old_des_encrypt3((d),(k1),(k2),(k3)) +# define des_decrypt3(d,k1,k2,k3)\ + _ossl_old_des_decrypt3((d),(k1),(k2),(k3)) +# define des_xwhite_in2out(k,i,o)\ + _ossl_old_des_xwhite_in2out((k),(i),(o)) +# define des_enc_read(f,b,l,k,iv)\ + _ossl_old_des_enc_read((f),(b),(l),(k),(iv)) +# define des_enc_write(f,b,l,k,iv)\ + _ossl_old_des_enc_write((f),(b),(l),(k),(iv)) +# define des_fcrypt(b,s,r)\ + _ossl_old_des_fcrypt((b),(s),(r)) +# define des_crypt(b,s)\ + _ossl_old_des_crypt((b),(s)) +# if 0 +# define crypt(b,s)\ + _ossl_old_crypt((b),(s)) +# endif +# define des_ofb_encrypt(i,o,n,l,k,iv)\ + _ossl_old_des_ofb_encrypt((i),(o),(n),(l),(k),(iv)) +# define des_pcbc_encrypt(i,o,l,k,iv,e)\ + _ossl_old_des_pcbc_encrypt((i),(o),(l),(k),(iv),(e)) +# define des_quad_cksum(i,o,l,c,s)\ + _ossl_old_des_quad_cksum((i),(o),(l),(c),(s)) +# define des_random_seed(k)\ + _ossl_old_des_random_seed((k)) +# define des_random_key(r)\ + _ossl_old_des_random_key((r)) +# define des_read_password(k,p,v) \ + _ossl_old_des_read_password((k),(p),(v)) +# define des_read_2passwords(k1,k2,p,v) \ + _ossl_old_des_read_2passwords((k1),(k2),(p),(v)) +# define des_set_odd_parity(k)\ + _ossl_old_des_set_odd_parity((k)) +# define des_is_weak_key(k)\ + _ossl_old_des_is_weak_key((k)) +# define des_set_key(k,ks)\ + _ossl_old_des_set_key((k),(ks)) +# define des_key_sched(k,ks)\ + _ossl_old_des_key_sched((k),(ks)) +# define des_string_to_key(s,k)\ + _ossl_old_des_string_to_key((s),(k)) +# define des_string_to_2keys(s,k1,k2)\ + _ossl_old_des_string_to_2keys((s),(k1),(k2)) +# define des_cfb64_encrypt(i,o,l,ks,iv,n,e)\ + _ossl_old_des_cfb64_encrypt((i),(o),(l),(ks),(iv),(n),(e)) +# define des_ofb64_encrypt(i,o,l,ks,iv,n)\ + _ossl_old_des_ofb64_encrypt((i),(o),(l),(ks),(iv),(n)) + +# define des_ecb2_encrypt(i,o,k1,k2,e) \ + des_ecb3_encrypt((i),(o),(k1),(k2),(k1),(e)) + +# define des_ede2_cbc_encrypt(i,o,l,k1,k2,iv,e) \ + des_ede3_cbc_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(e)) + +# define des_ede2_cfb64_encrypt(i,o,l,k1,k2,iv,n,e) \ + des_ede3_cfb64_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(n),(e)) + +# define des_ede2_ofb64_encrypt(i,o,l,k1,k2,iv,n) \ + des_ede3_ofb64_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(n)) + +# define des_check_key DES_check_key +# define des_rw_mode DES_rw_mode +# endif + +const char *_ossl_old_des_options(void); +void _ossl_old_des_ecb3_encrypt(_ossl_old_des_cblock *input, + _ossl_old_des_cblock *output, + _ossl_old_des_key_schedule ks1, + _ossl_old_des_key_schedule ks2, + _ossl_old_des_key_schedule ks3, int enc); +DES_LONG _ossl_old_des_cbc_cksum(_ossl_old_des_cblock *input, + _ossl_old_des_cblock *output, long length, + _ossl_old_des_key_schedule schedule, + _ossl_old_des_cblock *ivec); +void _ossl_old_des_cbc_encrypt(_ossl_old_des_cblock *input, + _ossl_old_des_cblock *output, long length, + _ossl_old_des_key_schedule schedule, + _ossl_old_des_cblock *ivec, int enc); +void _ossl_old_des_ncbc_encrypt(_ossl_old_des_cblock *input, + _ossl_old_des_cblock *output, long length, + _ossl_old_des_key_schedule schedule, + _ossl_old_des_cblock *ivec, int enc); +void _ossl_old_des_xcbc_encrypt(_ossl_old_des_cblock *input, + _ossl_old_des_cblock *output, long length, + _ossl_old_des_key_schedule schedule, + _ossl_old_des_cblock *ivec, + _ossl_old_des_cblock *inw, + _ossl_old_des_cblock *outw, int enc); +void _ossl_old_des_cfb_encrypt(unsigned char *in, unsigned char *out, + int numbits, long length, + _ossl_old_des_key_schedule schedule, + _ossl_old_des_cblock *ivec, int enc); +void _ossl_old_des_ecb_encrypt(_ossl_old_des_cblock *input, + _ossl_old_des_cblock *output, + _ossl_old_des_key_schedule ks, int enc); +void _ossl_old_des_encrypt(DES_LONG *data, _ossl_old_des_key_schedule ks, + int enc); +void _ossl_old_des_encrypt2(DES_LONG *data, _ossl_old_des_key_schedule ks, + int enc); +void _ossl_old_des_encrypt3(DES_LONG *data, _ossl_old_des_key_schedule ks1, + _ossl_old_des_key_schedule ks2, + _ossl_old_des_key_schedule ks3); +void _ossl_old_des_decrypt3(DES_LONG *data, _ossl_old_des_key_schedule ks1, + _ossl_old_des_key_schedule ks2, + _ossl_old_des_key_schedule ks3); +void _ossl_old_des_ede3_cbc_encrypt(_ossl_old_des_cblock *input, + _ossl_old_des_cblock *output, long length, + _ossl_old_des_key_schedule ks1, + _ossl_old_des_key_schedule ks2, + _ossl_old_des_key_schedule ks3, + _ossl_old_des_cblock *ivec, int enc); +void _ossl_old_des_ede3_cfb64_encrypt(unsigned char *in, unsigned char *out, + long length, + _ossl_old_des_key_schedule ks1, + _ossl_old_des_key_schedule ks2, + _ossl_old_des_key_schedule ks3, + _ossl_old_des_cblock *ivec, int *num, + int enc); +void _ossl_old_des_ede3_ofb64_encrypt(unsigned char *in, unsigned char *out, + long length, + _ossl_old_des_key_schedule ks1, + _ossl_old_des_key_schedule ks2, + _ossl_old_des_key_schedule ks3, + _ossl_old_des_cblock *ivec, int *num); +# if 0 +void _ossl_old_des_xwhite_in2out(_ossl_old_des_cblock (*des_key), + _ossl_old_des_cblock (*in_white), + _ossl_old_des_cblock (*out_white)); +# endif + +int _ossl_old_des_enc_read(int fd, char *buf, int len, + _ossl_old_des_key_schedule sched, + _ossl_old_des_cblock *iv); +int _ossl_old_des_enc_write(int fd, char *buf, int len, + _ossl_old_des_key_schedule sched, + _ossl_old_des_cblock *iv); +char *_ossl_old_des_fcrypt(const char *buf, const char *salt, char *ret); +char *_ossl_old_des_crypt(const char *buf, const char *salt); +# if !defined(PERL5) && !defined(NeXT) +char *_ossl_old_crypt(const char *buf, const char *salt); +# endif +void _ossl_old_des_ofb_encrypt(unsigned char *in, unsigned char *out, + int numbits, long length, + _ossl_old_des_key_schedule schedule, + _ossl_old_des_cblock *ivec); +void _ossl_old_des_pcbc_encrypt(_ossl_old_des_cblock *input, + _ossl_old_des_cblock *output, long length, + _ossl_old_des_key_schedule schedule, + _ossl_old_des_cblock *ivec, int enc); +DES_LONG _ossl_old_des_quad_cksum(_ossl_old_des_cblock *input, + _ossl_old_des_cblock *output, long length, + int out_count, _ossl_old_des_cblock *seed); +void _ossl_old_des_random_seed(_ossl_old_des_cblock key); +void _ossl_old_des_random_key(_ossl_old_des_cblock ret); +int _ossl_old_des_read_password(_ossl_old_des_cblock *key, const char *prompt, + int verify); +int _ossl_old_des_read_2passwords(_ossl_old_des_cblock *key1, + _ossl_old_des_cblock *key2, + const char *prompt, int verify); +void _ossl_old_des_set_odd_parity(_ossl_old_des_cblock *key); +int _ossl_old_des_is_weak_key(_ossl_old_des_cblock *key); +int _ossl_old_des_set_key(_ossl_old_des_cblock *key, + _ossl_old_des_key_schedule schedule); +int _ossl_old_des_key_sched(_ossl_old_des_cblock *key, + _ossl_old_des_key_schedule schedule); +void _ossl_old_des_string_to_key(char *str, _ossl_old_des_cblock *key); +void _ossl_old_des_string_to_2keys(char *str, _ossl_old_des_cblock *key1, + _ossl_old_des_cblock *key2); +void _ossl_old_des_cfb64_encrypt(unsigned char *in, unsigned char *out, + long length, + _ossl_old_des_key_schedule schedule, + _ossl_old_des_cblock *ivec, int *num, + int enc); +void _ossl_old_des_ofb64_encrypt(unsigned char *in, unsigned char *out, + long length, + _ossl_old_des_key_schedule schedule, + _ossl_old_des_cblock *ivec, int *num); + +void _ossl_096_des_random_seed(des_cblock *key); + +/* + * The following definitions provide compatibility with the MIT Kerberos + * library. The _ossl_old_des_key_schedule structure is not binary + * compatible. + */ + +# define _KERBEROS_DES_H + +# define KRBDES_ENCRYPT DES_ENCRYPT +# define KRBDES_DECRYPT DES_DECRYPT + +# ifdef KERBEROS +# define ENCRYPT DES_ENCRYPT +# define DECRYPT DES_DECRYPT +# endif + +# ifndef NCOMPAT +# define C_Block des_cblock +# define Key_schedule des_key_schedule +# define KEY_SZ DES_KEY_SZ +# define string_to_key des_string_to_key +# define read_pw_string des_read_pw_string +# define random_key des_random_key +# define pcbc_encrypt des_pcbc_encrypt +# define set_key des_set_key +# define key_sched des_key_sched +# define ecb_encrypt des_ecb_encrypt +# define cbc_encrypt des_cbc_encrypt +# define ncbc_encrypt des_ncbc_encrypt +# define xcbc_encrypt des_xcbc_encrypt +# define cbc_cksum des_cbc_cksum +# define quad_cksum des_quad_cksum +# define check_parity des_check_key_parity +# endif + +# define des_fixup_key_parity DES_fixup_key_parity + +#ifdef __cplusplus +} +#endif + +/* for DES_read_pw_string et al */ +# include + +#endif diff --git a/ext/openssl-osx/include/nope/dso.h b/ext/openssl-osx/include/nope/dso.h new file mode 100644 index 00000000..7c4a1dc4 --- /dev/null +++ b/ext/openssl-osx/include/nope/dso.h @@ -0,0 +1,451 @@ +/* dso.h -*- mode:C; c-file-style: "eay" -*- */ +/* + * Written by Geoff Thorpe (geoff@geoffthorpe.net) for the OpenSSL project + * 2000. + */ +/* ==================================================================== + * Copyright (c) 2000 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_DSO_H +# define HEADER_DSO_H + +# include + +#ifdef __cplusplus +extern "C" { +#endif + +/* These values are used as commands to DSO_ctrl() */ +# define DSO_CTRL_GET_FLAGS 1 +# define DSO_CTRL_SET_FLAGS 2 +# define DSO_CTRL_OR_FLAGS 3 + +/* + * By default, DSO_load() will translate the provided filename into a form + * typical for the platform (more specifically the DSO_METHOD) using the + * dso_name_converter function of the method. Eg. win32 will transform "blah" + * into "blah.dll", and dlfcn will transform it into "libblah.so". The + * behaviour can be overriden by setting the name_converter callback in the + * DSO object (using DSO_set_name_converter()). This callback could even + * utilise the DSO_METHOD's converter too if it only wants to override + * behaviour for one or two possible DSO methods. However, the following flag + * can be set in a DSO to prevent *any* native name-translation at all - eg. + * if the caller has prompted the user for a path to a driver library so the + * filename should be interpreted as-is. + */ +# define DSO_FLAG_NO_NAME_TRANSLATION 0x01 +/* + * An extra flag to give if only the extension should be added as + * translation. This is obviously only of importance on Unix and other + * operating systems where the translation also may prefix the name with + * something, like 'lib', and ignored everywhere else. This flag is also + * ignored if DSO_FLAG_NO_NAME_TRANSLATION is used at the same time. + */ +# define DSO_FLAG_NAME_TRANSLATION_EXT_ONLY 0x02 + +/* + * The following flag controls the translation of symbol names to upper case. + * This is currently only being implemented for OpenVMS. + */ +# define DSO_FLAG_UPCASE_SYMBOL 0x10 + +/* + * This flag loads the library with public symbols. Meaning: The exported + * symbols of this library are public to all libraries loaded after this + * library. At the moment only implemented in unix. + */ +# define DSO_FLAG_GLOBAL_SYMBOLS 0x20 + +typedef void (*DSO_FUNC_TYPE) (void); + +typedef struct dso_st DSO; + +/* + * The function prototype used for method functions (or caller-provided + * callbacks) that transform filenames. They are passed a DSO structure + * pointer (or NULL if they are to be used independantly of a DSO object) and + * a filename to transform. They should either return NULL (if there is an + * error condition) or a newly allocated string containing the transformed + * form that the caller will need to free with OPENSSL_free() when done. + */ +typedef char *(*DSO_NAME_CONVERTER_FUNC)(DSO *, const char *); +/* + * The function prototype used for method functions (or caller-provided + * callbacks) that merge two file specifications. They are passed a DSO + * structure pointer (or NULL if they are to be used independantly of a DSO + * object) and two file specifications to merge. They should either return + * NULL (if there is an error condition) or a newly allocated string + * containing the result of merging that the caller will need to free with + * OPENSSL_free() when done. Here, merging means that bits and pieces are + * taken from each of the file specifications and added together in whatever + * fashion that is sensible for the DSO method in question. The only rule + * that really applies is that if the two specification contain pieces of the + * same type, the copy from the first string takes priority. One could see + * it as the first specification is the one given by the user and the second + * being a bunch of defaults to add on if they're missing in the first. + */ +typedef char *(*DSO_MERGER_FUNC)(DSO *, const char *, const char *); + +typedef struct dso_meth_st { + const char *name; + /* + * Loads a shared library, NB: new DSO_METHODs must ensure that a + * successful load populates the loaded_filename field, and likewise a + * successful unload OPENSSL_frees and NULLs it out. + */ + int (*dso_load) (DSO *dso); + /* Unloads a shared library */ + int (*dso_unload) (DSO *dso); + /* Binds a variable */ + void *(*dso_bind_var) (DSO *dso, const char *symname); + /* + * Binds a function - assumes a return type of DSO_FUNC_TYPE. This should + * be cast to the real function prototype by the caller. Platforms that + * don't have compatible representations for different prototypes (this + * is possible within ANSI C) are highly unlikely to have shared + * libraries at all, let alone a DSO_METHOD implemented for them. + */ + DSO_FUNC_TYPE (*dso_bind_func) (DSO *dso, const char *symname); +/* I don't think this would actually be used in any circumstances. */ +# if 0 + /* Unbinds a variable */ + int (*dso_unbind_var) (DSO *dso, char *symname, void *symptr); + /* Unbinds a function */ + int (*dso_unbind_func) (DSO *dso, char *symname, DSO_FUNC_TYPE symptr); +# endif + /* + * The generic (yuck) "ctrl()" function. NB: Negative return values + * (rather than zero) indicate errors. + */ + long (*dso_ctrl) (DSO *dso, int cmd, long larg, void *parg); + /* + * The default DSO_METHOD-specific function for converting filenames to a + * canonical native form. + */ + DSO_NAME_CONVERTER_FUNC dso_name_converter; + /* + * The default DSO_METHOD-specific function for converting filenames to a + * canonical native form. + */ + DSO_MERGER_FUNC dso_merger; + /* [De]Initialisation handlers. */ + int (*init) (DSO *dso); + int (*finish) (DSO *dso); + /* Return pathname of the module containing location */ + int (*pathbyaddr) (void *addr, char *path, int sz); + /* Perform global symbol lookup, i.e. among *all* modules */ + void *(*globallookup) (const char *symname); +} DSO_METHOD; + +/**********************************************************************/ +/* The low-level handle type used to refer to a loaded shared library */ + +struct dso_st { + DSO_METHOD *meth; + /* + * Standard dlopen uses a (void *). Win32 uses a HANDLE. VMS doesn't use + * anything but will need to cache the filename for use in the dso_bind + * handler. All in all, let each method control its own destiny. + * "Handles" and such go in a STACK. + */ + STACK_OF(void) *meth_data; + int references; + int flags; + /* + * For use by applications etc ... use this for your bits'n'pieces, don't + * touch meth_data! + */ + CRYPTO_EX_DATA ex_data; + /* + * If this callback function pointer is set to non-NULL, then it will be + * used in DSO_load() in place of meth->dso_name_converter. NB: This + * should normally set using DSO_set_name_converter(). + */ + DSO_NAME_CONVERTER_FUNC name_converter; + /* + * If this callback function pointer is set to non-NULL, then it will be + * used in DSO_load() in place of meth->dso_merger. NB: This should + * normally set using DSO_set_merger(). + */ + DSO_MERGER_FUNC merger; + /* + * This is populated with (a copy of) the platform-independant filename + * used for this DSO. + */ + char *filename; + /* + * This is populated with (a copy of) the translated filename by which + * the DSO was actually loaded. It is NULL iff the DSO is not currently + * loaded. NB: This is here because the filename translation process may + * involve a callback being invoked more than once not only to convert to + * a platform-specific form, but also to try different filenames in the + * process of trying to perform a load. As such, this variable can be + * used to indicate (a) whether this DSO structure corresponds to a + * loaded library or not, and (b) the filename with which it was actually + * loaded. + */ + char *loaded_filename; +}; + +DSO *DSO_new(void); +DSO *DSO_new_method(DSO_METHOD *method); +int DSO_free(DSO *dso); +int DSO_flags(DSO *dso); +int DSO_up_ref(DSO *dso); +long DSO_ctrl(DSO *dso, int cmd, long larg, void *parg); + +/* + * This function sets the DSO's name_converter callback. If it is non-NULL, + * then it will be used instead of the associated DSO_METHOD's function. If + * oldcb is non-NULL then it is set to the function pointer value being + * replaced. Return value is non-zero for success. + */ +int DSO_set_name_converter(DSO *dso, DSO_NAME_CONVERTER_FUNC cb, + DSO_NAME_CONVERTER_FUNC *oldcb); +/* + * These functions can be used to get/set the platform-independant filename + * used for a DSO. NB: set will fail if the DSO is already loaded. + */ +const char *DSO_get_filename(DSO *dso); +int DSO_set_filename(DSO *dso, const char *filename); +/* + * This function will invoke the DSO's name_converter callback to translate a + * filename, or if the callback isn't set it will instead use the DSO_METHOD's + * converter. If "filename" is NULL, the "filename" in the DSO itself will be + * used. If the DSO_FLAG_NO_NAME_TRANSLATION flag is set, then the filename is + * simply duplicated. NB: This function is usually called from within a + * DSO_METHOD during the processing of a DSO_load() call, and is exposed so + * that caller-created DSO_METHODs can do the same thing. A non-NULL return + * value will need to be OPENSSL_free()'d. + */ +char *DSO_convert_filename(DSO *dso, const char *filename); +/* + * This function will invoke the DSO's merger callback to merge two file + * specifications, or if the callback isn't set it will instead use the + * DSO_METHOD's merger. A non-NULL return value will need to be + * OPENSSL_free()'d. + */ +char *DSO_merge(DSO *dso, const char *filespec1, const char *filespec2); +/* + * If the DSO is currently loaded, this returns the filename that it was + * loaded under, otherwise it returns NULL. So it is also useful as a test as + * to whether the DSO is currently loaded. NB: This will not necessarily + * return the same value as DSO_convert_filename(dso, dso->filename), because + * the DSO_METHOD's load function may have tried a variety of filenames (with + * and/or without the aid of the converters) before settling on the one it + * actually loaded. + */ +const char *DSO_get_loaded_filename(DSO *dso); + +void DSO_set_default_method(DSO_METHOD *meth); +DSO_METHOD *DSO_get_default_method(void); +DSO_METHOD *DSO_get_method(DSO *dso); +DSO_METHOD *DSO_set_method(DSO *dso, DSO_METHOD *meth); + +/* + * The all-singing all-dancing load function, you normally pass NULL for the + * first and third parameters. Use DSO_up and DSO_free for subsequent + * reference count handling. Any flags passed in will be set in the + * constructed DSO after its init() function but before the load operation. + * If 'dso' is non-NULL, 'flags' is ignored. + */ +DSO *DSO_load(DSO *dso, const char *filename, DSO_METHOD *meth, int flags); + +/* This function binds to a variable inside a shared library. */ +void *DSO_bind_var(DSO *dso, const char *symname); + +/* This function binds to a function inside a shared library. */ +DSO_FUNC_TYPE DSO_bind_func(DSO *dso, const char *symname); + +/* + * This method is the default, but will beg, borrow, or steal whatever method + * should be the default on any particular platform (including + * DSO_METH_null() if necessary). + */ +DSO_METHOD *DSO_METHOD_openssl(void); + +/* + * This method is defined for all platforms - if a platform has no DSO + * support then this will be the only method! + */ +DSO_METHOD *DSO_METHOD_null(void); + +/* + * If DSO_DLFCN is defined, the standard dlfcn.h-style functions (dlopen, + * dlclose, dlsym, etc) will be used and incorporated into this method. If + * not, this method will return NULL. + */ +DSO_METHOD *DSO_METHOD_dlfcn(void); + +/* + * If DSO_DL is defined, the standard dl.h-style functions (shl_load, + * shl_unload, shl_findsym, etc) will be used and incorporated into this + * method. If not, this method will return NULL. + */ +DSO_METHOD *DSO_METHOD_dl(void); + +/* If WIN32 is defined, use DLLs. If not, return NULL. */ +DSO_METHOD *DSO_METHOD_win32(void); + +/* If VMS is defined, use shared images. If not, return NULL. */ +DSO_METHOD *DSO_METHOD_vms(void); + +/* + * This function writes null-terminated pathname of DSO module containing + * 'addr' into 'sz' large caller-provided 'path' and returns the number of + * characters [including trailing zero] written to it. If 'sz' is 0 or + * negative, 'path' is ignored and required amount of charachers [including + * trailing zero] to accomodate pathname is returned. If 'addr' is NULL, then + * pathname of cryptolib itself is returned. Negative or zero return value + * denotes error. + */ +int DSO_pathbyaddr(void *addr, char *path, int sz); + +/* + * This function should be used with caution! It looks up symbols in *all* + * loaded modules and if module gets unloaded by somebody else attempt to + * dereference the pointer is doomed to have fatal consequences. Primary + * usage for this function is to probe *core* system functionality, e.g. + * check if getnameinfo(3) is available at run-time without bothering about + * OS-specific details such as libc.so.versioning or where does it actually + * reside: in libc itself or libsocket. + */ +void *DSO_global_lookup(const char *name); + +/* If BeOS is defined, use shared images. If not, return NULL. */ +DSO_METHOD *DSO_METHOD_beos(void); + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_DSO_strings(void); + +/* Error codes for the DSO functions. */ + +/* Function codes. */ +# define DSO_F_BEOS_BIND_FUNC 144 +# define DSO_F_BEOS_BIND_VAR 145 +# define DSO_F_BEOS_LOAD 146 +# define DSO_F_BEOS_NAME_CONVERTER 147 +# define DSO_F_BEOS_UNLOAD 148 +# define DSO_F_DLFCN_BIND_FUNC 100 +# define DSO_F_DLFCN_BIND_VAR 101 +# define DSO_F_DLFCN_LOAD 102 +# define DSO_F_DLFCN_MERGER 130 +# define DSO_F_DLFCN_NAME_CONVERTER 123 +# define DSO_F_DLFCN_UNLOAD 103 +# define DSO_F_DL_BIND_FUNC 104 +# define DSO_F_DL_BIND_VAR 105 +# define DSO_F_DL_LOAD 106 +# define DSO_F_DL_MERGER 131 +# define DSO_F_DL_NAME_CONVERTER 124 +# define DSO_F_DL_UNLOAD 107 +# define DSO_F_DSO_BIND_FUNC 108 +# define DSO_F_DSO_BIND_VAR 109 +# define DSO_F_DSO_CONVERT_FILENAME 126 +# define DSO_F_DSO_CTRL 110 +# define DSO_F_DSO_FREE 111 +# define DSO_F_DSO_GET_FILENAME 127 +# define DSO_F_DSO_GET_LOADED_FILENAME 128 +# define DSO_F_DSO_GLOBAL_LOOKUP 139 +# define DSO_F_DSO_LOAD 112 +# define DSO_F_DSO_MERGE 132 +# define DSO_F_DSO_NEW_METHOD 113 +# define DSO_F_DSO_PATHBYADDR 140 +# define DSO_F_DSO_SET_FILENAME 129 +# define DSO_F_DSO_SET_NAME_CONVERTER 122 +# define DSO_F_DSO_UP_REF 114 +# define DSO_F_GLOBAL_LOOKUP_FUNC 138 +# define DSO_F_PATHBYADDR 137 +# define DSO_F_VMS_BIND_SYM 115 +# define DSO_F_VMS_LOAD 116 +# define DSO_F_VMS_MERGER 133 +# define DSO_F_VMS_UNLOAD 117 +# define DSO_F_WIN32_BIND_FUNC 118 +# define DSO_F_WIN32_BIND_VAR 119 +# define DSO_F_WIN32_GLOBALLOOKUP 142 +# define DSO_F_WIN32_GLOBALLOOKUP_FUNC 143 +# define DSO_F_WIN32_JOINER 135 +# define DSO_F_WIN32_LOAD 120 +# define DSO_F_WIN32_MERGER 134 +# define DSO_F_WIN32_NAME_CONVERTER 125 +# define DSO_F_WIN32_PATHBYADDR 141 +# define DSO_F_WIN32_SPLITTER 136 +# define DSO_F_WIN32_UNLOAD 121 + +/* Reason codes. */ +# define DSO_R_CTRL_FAILED 100 +# define DSO_R_DSO_ALREADY_LOADED 110 +# define DSO_R_EMPTY_FILE_STRUCTURE 113 +# define DSO_R_FAILURE 114 +# define DSO_R_FILENAME_TOO_BIG 101 +# define DSO_R_FINISH_FAILED 102 +# define DSO_R_INCORRECT_FILE_SYNTAX 115 +# define DSO_R_LOAD_FAILED 103 +# define DSO_R_NAME_TRANSLATION_FAILED 109 +# define DSO_R_NO_FILENAME 111 +# define DSO_R_NO_FILE_SPECIFICATION 116 +# define DSO_R_NULL_HANDLE 104 +# define DSO_R_SET_FILENAME_FAILED 112 +# define DSO_R_STACK_ERROR 105 +# define DSO_R_SYM_FAILURE 106 +# define DSO_R_UNLOAD_FAILED 107 +# define DSO_R_UNSUPPORTED 108 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/ext/openssl-osx/include/nope/ebcdic.h b/ext/openssl-osx/include/nope/ebcdic.h new file mode 100644 index 00000000..4cbdfeb7 --- /dev/null +++ b/ext/openssl-osx/include/nope/ebcdic.h @@ -0,0 +1,26 @@ +/* crypto/ebcdic.h */ + +#ifndef HEADER_EBCDIC_H +# define HEADER_EBCDIC_H + +# include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Avoid name clashes with other applications */ +# define os_toascii _openssl_os_toascii +# define os_toebcdic _openssl_os_toebcdic +# define ebcdic2ascii _openssl_ebcdic2ascii +# define ascii2ebcdic _openssl_ascii2ebcdic + +extern const unsigned char os_toascii[256]; +extern const unsigned char os_toebcdic[256]; +void *ebcdic2ascii(void *dest, const void *srce, size_t count); +void *ascii2ebcdic(void *dest, const void *srce, size_t count); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/ext/openssl-osx/include/nope/engine.h b/ext/openssl-osx/include/nope/engine.h new file mode 100644 index 00000000..bd7b5914 --- /dev/null +++ b/ext/openssl-osx/include/nope/engine.h @@ -0,0 +1,960 @@ +/* openssl/engine.h */ +/* + * Written by Geoff Thorpe (geoff@geoffthorpe.net) for the OpenSSL project + * 2000. + */ +/* ==================================================================== + * Copyright (c) 1999-2004 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +/* ==================================================================== + * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. + * ECDH support in OpenSSL originally developed by + * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project. + */ + +#ifndef HEADER_ENGINE_H +# define HEADER_ENGINE_H + +# include + +# ifdef OPENSSL_NO_ENGINE +# error ENGINE is disabled. +# endif + +# ifndef OPENSSL_NO_DEPRECATED +# include +# ifndef OPENSSL_NO_RSA +# include +# endif +# ifndef OPENSSL_NO_DSA +# include +# endif +# ifndef OPENSSL_NO_DH +# include +# endif +# ifndef OPENSSL_NO_ECDH +# include +# endif +# ifndef OPENSSL_NO_ECDSA +# include +# endif +# include +# include +# include +# endif + +# include +# include + +# include + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * These flags are used to control combinations of algorithm (methods) by + * bitwise "OR"ing. + */ +# define ENGINE_METHOD_RSA (unsigned int)0x0001 +# define ENGINE_METHOD_DSA (unsigned int)0x0002 +# define ENGINE_METHOD_DH (unsigned int)0x0004 +# define ENGINE_METHOD_RAND (unsigned int)0x0008 +# define ENGINE_METHOD_ECDH (unsigned int)0x0010 +# define ENGINE_METHOD_ECDSA (unsigned int)0x0020 +# define ENGINE_METHOD_CIPHERS (unsigned int)0x0040 +# define ENGINE_METHOD_DIGESTS (unsigned int)0x0080 +# define ENGINE_METHOD_STORE (unsigned int)0x0100 +# define ENGINE_METHOD_PKEY_METHS (unsigned int)0x0200 +# define ENGINE_METHOD_PKEY_ASN1_METHS (unsigned int)0x0400 +/* Obvious all-or-nothing cases. */ +# define ENGINE_METHOD_ALL (unsigned int)0xFFFF +# define ENGINE_METHOD_NONE (unsigned int)0x0000 + +/* + * This(ese) flag(s) controls behaviour of the ENGINE_TABLE mechanism used + * internally to control registration of ENGINE implementations, and can be + * set by ENGINE_set_table_flags(). The "NOINIT" flag prevents attempts to + * initialise registered ENGINEs if they are not already initialised. + */ +# define ENGINE_TABLE_FLAG_NOINIT (unsigned int)0x0001 + +/* ENGINE flags that can be set by ENGINE_set_flags(). */ +/* Not used */ +/* #define ENGINE_FLAGS_MALLOCED 0x0001 */ + +/* + * This flag is for ENGINEs that wish to handle the various 'CMD'-related + * control commands on their own. Without this flag, ENGINE_ctrl() handles + * these control commands on behalf of the ENGINE using their "cmd_defns" + * data. + */ +# define ENGINE_FLAGS_MANUAL_CMD_CTRL (int)0x0002 + +/* + * This flag is for ENGINEs who return new duplicate structures when found + * via "ENGINE_by_id()". When an ENGINE must store state (eg. if + * ENGINE_ctrl() commands are called in sequence as part of some stateful + * process like key-generation setup and execution), it can set this flag - + * then each attempt to obtain the ENGINE will result in it being copied into + * a new structure. Normally, ENGINEs don't declare this flag so + * ENGINE_by_id() just increments the existing ENGINE's structural reference + * count. + */ +# define ENGINE_FLAGS_BY_ID_COPY (int)0x0004 + +/* + * This flag if for an ENGINE that does not want its methods registered as + * part of ENGINE_register_all_complete() for example if the methods are not + * usable as default methods. + */ + +# define ENGINE_FLAGS_NO_REGISTER_ALL (int)0x0008 + +/* + * ENGINEs can support their own command types, and these flags are used in + * ENGINE_CTRL_GET_CMD_FLAGS to indicate to the caller what kind of input + * each command expects. Currently only numeric and string input is + * supported. If a control command supports none of the _NUMERIC, _STRING, or + * _NO_INPUT options, then it is regarded as an "internal" control command - + * and not for use in config setting situations. As such, they're not + * available to the ENGINE_ctrl_cmd_string() function, only raw ENGINE_ctrl() + * access. Changes to this list of 'command types' should be reflected + * carefully in ENGINE_cmd_is_executable() and ENGINE_ctrl_cmd_string(). + */ + +/* accepts a 'long' input value (3rd parameter to ENGINE_ctrl) */ +# define ENGINE_CMD_FLAG_NUMERIC (unsigned int)0x0001 +/* + * accepts string input (cast from 'void*' to 'const char *', 4th parameter + * to ENGINE_ctrl) + */ +# define ENGINE_CMD_FLAG_STRING (unsigned int)0x0002 +/* + * Indicates that the control command takes *no* input. Ie. the control + * command is unparameterised. + */ +# define ENGINE_CMD_FLAG_NO_INPUT (unsigned int)0x0004 +/* + * Indicates that the control command is internal. This control command won't + * be shown in any output, and is only usable through the ENGINE_ctrl_cmd() + * function. + */ +# define ENGINE_CMD_FLAG_INTERNAL (unsigned int)0x0008 + +/* + * NB: These 3 control commands are deprecated and should not be used. + * ENGINEs relying on these commands should compile conditional support for + * compatibility (eg. if these symbols are defined) but should also migrate + * the same functionality to their own ENGINE-specific control functions that + * can be "discovered" by calling applications. The fact these control + * commands wouldn't be "executable" (ie. usable by text-based config) + * doesn't change the fact that application code can find and use them + * without requiring per-ENGINE hacking. + */ + +/* + * These flags are used to tell the ctrl function what should be done. All + * command numbers are shared between all engines, even if some don't make + * sense to some engines. In such a case, they do nothing but return the + * error ENGINE_R_CTRL_COMMAND_NOT_IMPLEMENTED. + */ +# define ENGINE_CTRL_SET_LOGSTREAM 1 +# define ENGINE_CTRL_SET_PASSWORD_CALLBACK 2 +# define ENGINE_CTRL_HUP 3/* Close and reinitialise + * any handles/connections + * etc. */ +# define ENGINE_CTRL_SET_USER_INTERFACE 4/* Alternative to callback */ +# define ENGINE_CTRL_SET_CALLBACK_DATA 5/* User-specific data, used + * when calling the password + * callback and the user + * interface */ +# define ENGINE_CTRL_LOAD_CONFIGURATION 6/* Load a configuration, + * given a string that + * represents a file name + * or so */ +# define ENGINE_CTRL_LOAD_SECTION 7/* Load data from a given + * section in the already + * loaded configuration */ + +/* + * These control commands allow an application to deal with an arbitrary + * engine in a dynamic way. Warn: Negative return values indicate errors FOR + * THESE COMMANDS because zero is used to indicate 'end-of-list'. Other + * commands, including ENGINE-specific command types, return zero for an + * error. An ENGINE can choose to implement these ctrl functions, and can + * internally manage things however it chooses - it does so by setting the + * ENGINE_FLAGS_MANUAL_CMD_CTRL flag (using ENGINE_set_flags()). Otherwise + * the ENGINE_ctrl() code handles this on the ENGINE's behalf using the + * cmd_defns data (set using ENGINE_set_cmd_defns()). This means an ENGINE's + * ctrl() handler need only implement its own commands - the above "meta" + * commands will be taken care of. + */ + +/* + * Returns non-zero if the supplied ENGINE has a ctrl() handler. If "not", + * then all the remaining control commands will return failure, so it is + * worth checking this first if the caller is trying to "discover" the + * engine's capabilities and doesn't want errors generated unnecessarily. + */ +# define ENGINE_CTRL_HAS_CTRL_FUNCTION 10 +/* + * Returns a positive command number for the first command supported by the + * engine. Returns zero if no ctrl commands are supported. + */ +# define ENGINE_CTRL_GET_FIRST_CMD_TYPE 11 +/* + * The 'long' argument specifies a command implemented by the engine, and the + * return value is the next command supported, or zero if there are no more. + */ +# define ENGINE_CTRL_GET_NEXT_CMD_TYPE 12 +/* + * The 'void*' argument is a command name (cast from 'const char *'), and the + * return value is the command that corresponds to it. + */ +# define ENGINE_CTRL_GET_CMD_FROM_NAME 13 +/* + * The next two allow a command to be converted into its corresponding string + * form. In each case, the 'long' argument supplies the command. In the + * NAME_LEN case, the return value is the length of the command name (not + * counting a trailing EOL). In the NAME case, the 'void*' argument must be a + * string buffer large enough, and it will be populated with the name of the + * command (WITH a trailing EOL). + */ +# define ENGINE_CTRL_GET_NAME_LEN_FROM_CMD 14 +# define ENGINE_CTRL_GET_NAME_FROM_CMD 15 +/* The next two are similar but give a "short description" of a command. */ +# define ENGINE_CTRL_GET_DESC_LEN_FROM_CMD 16 +# define ENGINE_CTRL_GET_DESC_FROM_CMD 17 +/* + * With this command, the return value is the OR'd combination of + * ENGINE_CMD_FLAG_*** values that indicate what kind of input a given + * engine-specific ctrl command expects. + */ +# define ENGINE_CTRL_GET_CMD_FLAGS 18 + +/* + * ENGINE implementations should start the numbering of their own control + * commands from this value. (ie. ENGINE_CMD_BASE, ENGINE_CMD_BASE + 1, etc). + */ +# define ENGINE_CMD_BASE 200 + +/* + * NB: These 2 nCipher "chil" control commands are deprecated, and their + * functionality is now available through ENGINE-specific control commands + * (exposed through the above-mentioned 'CMD'-handling). Code using these 2 + * commands should be migrated to the more general command handling before + * these are removed. + */ + +/* Flags specific to the nCipher "chil" engine */ +# define ENGINE_CTRL_CHIL_SET_FORKCHECK 100 + /* + * Depending on the value of the (long)i argument, this sets or + * unsets the SimpleForkCheck flag in the CHIL API to enable or + * disable checking and workarounds for applications that fork(). + */ +# define ENGINE_CTRL_CHIL_NO_LOCKING 101 + /* + * This prevents the initialisation function from providing mutex + * callbacks to the nCipher library. + */ + +/* + * If an ENGINE supports its own specific control commands and wishes the + * framework to handle the above 'ENGINE_CMD_***'-manipulation commands on + * its behalf, it should supply a null-terminated array of ENGINE_CMD_DEFN + * entries to ENGINE_set_cmd_defns(). It should also implement a ctrl() + * handler that supports the stated commands (ie. the "cmd_num" entries as + * described by the array). NB: The array must be ordered in increasing order + * of cmd_num. "null-terminated" means that the last ENGINE_CMD_DEFN element + * has cmd_num set to zero and/or cmd_name set to NULL. + */ +typedef struct ENGINE_CMD_DEFN_st { + unsigned int cmd_num; /* The command number */ + const char *cmd_name; /* The command name itself */ + const char *cmd_desc; /* A short description of the command */ + unsigned int cmd_flags; /* The input the command expects */ +} ENGINE_CMD_DEFN; + +/* Generic function pointer */ +typedef int (*ENGINE_GEN_FUNC_PTR) (void); +/* Generic function pointer taking no arguments */ +typedef int (*ENGINE_GEN_INT_FUNC_PTR) (ENGINE *); +/* Specific control function pointer */ +typedef int (*ENGINE_CTRL_FUNC_PTR) (ENGINE *, int, long, void *, + void (*f) (void)); +/* Generic load_key function pointer */ +typedef EVP_PKEY *(*ENGINE_LOAD_KEY_PTR)(ENGINE *, const char *, + UI_METHOD *ui_method, + void *callback_data); +typedef int (*ENGINE_SSL_CLIENT_CERT_PTR) (ENGINE *, SSL *ssl, + STACK_OF(X509_NAME) *ca_dn, + X509 **pcert, EVP_PKEY **pkey, + STACK_OF(X509) **pother, + UI_METHOD *ui_method, + void *callback_data); +/*- + * These callback types are for an ENGINE's handler for cipher and digest logic. + * These handlers have these prototypes; + * int foo(ENGINE *e, const EVP_CIPHER **cipher, const int **nids, int nid); + * int foo(ENGINE *e, const EVP_MD **digest, const int **nids, int nid); + * Looking at how to implement these handlers in the case of cipher support, if + * the framework wants the EVP_CIPHER for 'nid', it will call; + * foo(e, &p_evp_cipher, NULL, nid); (return zero for failure) + * If the framework wants a list of supported 'nid's, it will call; + * foo(e, NULL, &p_nids, 0); (returns number of 'nids' or -1 for error) + */ +/* + * Returns to a pointer to the array of supported cipher 'nid's. If the + * second parameter is non-NULL it is set to the size of the returned array. + */ +typedef int (*ENGINE_CIPHERS_PTR) (ENGINE *, const EVP_CIPHER **, + const int **, int); +typedef int (*ENGINE_DIGESTS_PTR) (ENGINE *, const EVP_MD **, const int **, + int); +typedef int (*ENGINE_PKEY_METHS_PTR) (ENGINE *, EVP_PKEY_METHOD **, + const int **, int); +typedef int (*ENGINE_PKEY_ASN1_METHS_PTR) (ENGINE *, EVP_PKEY_ASN1_METHOD **, + const int **, int); +/* + * STRUCTURE functions ... all of these functions deal with pointers to + * ENGINE structures where the pointers have a "structural reference". This + * means that their reference is to allowed access to the structure but it + * does not imply that the structure is functional. To simply increment or + * decrement the structural reference count, use ENGINE_by_id and + * ENGINE_free. NB: This is not required when iterating using ENGINE_get_next + * as it will automatically decrement the structural reference count of the + * "current" ENGINE and increment the structural reference count of the + * ENGINE it returns (unless it is NULL). + */ + +/* Get the first/last "ENGINE" type available. */ +ENGINE *ENGINE_get_first(void); +ENGINE *ENGINE_get_last(void); +/* Iterate to the next/previous "ENGINE" type (NULL = end of the list). */ +ENGINE *ENGINE_get_next(ENGINE *e); +ENGINE *ENGINE_get_prev(ENGINE *e); +/* Add another "ENGINE" type into the array. */ +int ENGINE_add(ENGINE *e); +/* Remove an existing "ENGINE" type from the array. */ +int ENGINE_remove(ENGINE *e); +/* Retrieve an engine from the list by its unique "id" value. */ +ENGINE *ENGINE_by_id(const char *id); +/* Add all the built-in engines. */ +void ENGINE_load_openssl(void); +void ENGINE_load_dynamic(void); +# ifndef OPENSSL_NO_STATIC_ENGINE +void ENGINE_load_4758cca(void); +void ENGINE_load_aep(void); +void ENGINE_load_atalla(void); +void ENGINE_load_chil(void); +void ENGINE_load_cswift(void); +void ENGINE_load_nuron(void); +void ENGINE_load_sureware(void); +void ENGINE_load_ubsec(void); +void ENGINE_load_padlock(void); +void ENGINE_load_capi(void); +# ifndef OPENSSL_NO_GMP +void ENGINE_load_gmp(void); +# endif +# ifndef OPENSSL_NO_GOST +void ENGINE_load_gost(void); +# endif +# endif +void ENGINE_load_cryptodev(void); +void ENGINE_load_rdrand(void); +void ENGINE_load_builtin_engines(void); + +/* + * Get and set global flags (ENGINE_TABLE_FLAG_***) for the implementation + * "registry" handling. + */ +unsigned int ENGINE_get_table_flags(void); +void ENGINE_set_table_flags(unsigned int flags); + +/*- Manage registration of ENGINEs per "table". For each type, there are 3 + * functions; + * ENGINE_register_***(e) - registers the implementation from 'e' (if it has one) + * ENGINE_unregister_***(e) - unregister the implementation from 'e' + * ENGINE_register_all_***() - call ENGINE_register_***() for each 'e' in the list + * Cleanup is automatically registered from each table when required, so + * ENGINE_cleanup() will reverse any "register" operations. + */ + +int ENGINE_register_RSA(ENGINE *e); +void ENGINE_unregister_RSA(ENGINE *e); +void ENGINE_register_all_RSA(void); + +int ENGINE_register_DSA(ENGINE *e); +void ENGINE_unregister_DSA(ENGINE *e); +void ENGINE_register_all_DSA(void); + +int ENGINE_register_ECDH(ENGINE *e); +void ENGINE_unregister_ECDH(ENGINE *e); +void ENGINE_register_all_ECDH(void); + +int ENGINE_register_ECDSA(ENGINE *e); +void ENGINE_unregister_ECDSA(ENGINE *e); +void ENGINE_register_all_ECDSA(void); + +int ENGINE_register_DH(ENGINE *e); +void ENGINE_unregister_DH(ENGINE *e); +void ENGINE_register_all_DH(void); + +int ENGINE_register_RAND(ENGINE *e); +void ENGINE_unregister_RAND(ENGINE *e); +void ENGINE_register_all_RAND(void); + +int ENGINE_register_STORE(ENGINE *e); +void ENGINE_unregister_STORE(ENGINE *e); +void ENGINE_register_all_STORE(void); + +int ENGINE_register_ciphers(ENGINE *e); +void ENGINE_unregister_ciphers(ENGINE *e); +void ENGINE_register_all_ciphers(void); + +int ENGINE_register_digests(ENGINE *e); +void ENGINE_unregister_digests(ENGINE *e); +void ENGINE_register_all_digests(void); + +int ENGINE_register_pkey_meths(ENGINE *e); +void ENGINE_unregister_pkey_meths(ENGINE *e); +void ENGINE_register_all_pkey_meths(void); + +int ENGINE_register_pkey_asn1_meths(ENGINE *e); +void ENGINE_unregister_pkey_asn1_meths(ENGINE *e); +void ENGINE_register_all_pkey_asn1_meths(void); + +/* + * These functions register all support from the above categories. Note, use + * of these functions can result in static linkage of code your application + * may not need. If you only need a subset of functionality, consider using + * more selective initialisation. + */ +int ENGINE_register_complete(ENGINE *e); +int ENGINE_register_all_complete(void); + +/* + * Send parametrised control commands to the engine. The possibilities to + * send down an integer, a pointer to data or a function pointer are + * provided. Any of the parameters may or may not be NULL, depending on the + * command number. In actuality, this function only requires a structural + * (rather than functional) reference to an engine, but many control commands + * may require the engine be functional. The caller should be aware of trying + * commands that require an operational ENGINE, and only use functional + * references in such situations. + */ +int ENGINE_ctrl(ENGINE *e, int cmd, long i, void *p, void (*f) (void)); + +/* + * This function tests if an ENGINE-specific command is usable as a + * "setting". Eg. in an application's config file that gets processed through + * ENGINE_ctrl_cmd_string(). If this returns zero, it is not available to + * ENGINE_ctrl_cmd_string(), only ENGINE_ctrl(). + */ +int ENGINE_cmd_is_executable(ENGINE *e, int cmd); + +/* + * This function works like ENGINE_ctrl() with the exception of taking a + * command name instead of a command number, and can handle optional + * commands. See the comment on ENGINE_ctrl_cmd_string() for an explanation + * on how to use the cmd_name and cmd_optional. + */ +int ENGINE_ctrl_cmd(ENGINE *e, const char *cmd_name, + long i, void *p, void (*f) (void), int cmd_optional); + +/* + * This function passes a command-name and argument to an ENGINE. The + * cmd_name is converted to a command number and the control command is + * called using 'arg' as an argument (unless the ENGINE doesn't support such + * a command, in which case no control command is called). The command is + * checked for input flags, and if necessary the argument will be converted + * to a numeric value. If cmd_optional is non-zero, then if the ENGINE + * doesn't support the given cmd_name the return value will be success + * anyway. This function is intended for applications to use so that users + * (or config files) can supply engine-specific config data to the ENGINE at + * run-time to control behaviour of specific engines. As such, it shouldn't + * be used for calling ENGINE_ctrl() functions that return data, deal with + * binary data, or that are otherwise supposed to be used directly through + * ENGINE_ctrl() in application code. Any "return" data from an ENGINE_ctrl() + * operation in this function will be lost - the return value is interpreted + * as failure if the return value is zero, success otherwise, and this + * function returns a boolean value as a result. In other words, vendors of + * 'ENGINE'-enabled devices should write ENGINE implementations with + * parameterisations that work in this scheme, so that compliant ENGINE-based + * applications can work consistently with the same configuration for the + * same ENGINE-enabled devices, across applications. + */ +int ENGINE_ctrl_cmd_string(ENGINE *e, const char *cmd_name, const char *arg, + int cmd_optional); + +/* + * These functions are useful for manufacturing new ENGINE structures. They + * don't address reference counting at all - one uses them to populate an + * ENGINE structure with personalised implementations of things prior to + * using it directly or adding it to the builtin ENGINE list in OpenSSL. + * These are also here so that the ENGINE structure doesn't have to be + * exposed and break binary compatibility! + */ +ENGINE *ENGINE_new(void); +int ENGINE_free(ENGINE *e); +int ENGINE_up_ref(ENGINE *e); +int ENGINE_set_id(ENGINE *e, const char *id); +int ENGINE_set_name(ENGINE *e, const char *name); +int ENGINE_set_RSA(ENGINE *e, const RSA_METHOD *rsa_meth); +int ENGINE_set_DSA(ENGINE *e, const DSA_METHOD *dsa_meth); +int ENGINE_set_ECDH(ENGINE *e, const ECDH_METHOD *ecdh_meth); +int ENGINE_set_ECDSA(ENGINE *e, const ECDSA_METHOD *ecdsa_meth); +int ENGINE_set_DH(ENGINE *e, const DH_METHOD *dh_meth); +int ENGINE_set_RAND(ENGINE *e, const RAND_METHOD *rand_meth); +int ENGINE_set_STORE(ENGINE *e, const STORE_METHOD *store_meth); +int ENGINE_set_destroy_function(ENGINE *e, ENGINE_GEN_INT_FUNC_PTR destroy_f); +int ENGINE_set_init_function(ENGINE *e, ENGINE_GEN_INT_FUNC_PTR init_f); +int ENGINE_set_finish_function(ENGINE *e, ENGINE_GEN_INT_FUNC_PTR finish_f); +int ENGINE_set_ctrl_function(ENGINE *e, ENGINE_CTRL_FUNC_PTR ctrl_f); +int ENGINE_set_load_privkey_function(ENGINE *e, + ENGINE_LOAD_KEY_PTR loadpriv_f); +int ENGINE_set_load_pubkey_function(ENGINE *e, ENGINE_LOAD_KEY_PTR loadpub_f); +int ENGINE_set_load_ssl_client_cert_function(ENGINE *e, + ENGINE_SSL_CLIENT_CERT_PTR + loadssl_f); +int ENGINE_set_ciphers(ENGINE *e, ENGINE_CIPHERS_PTR f); +int ENGINE_set_digests(ENGINE *e, ENGINE_DIGESTS_PTR f); +int ENGINE_set_pkey_meths(ENGINE *e, ENGINE_PKEY_METHS_PTR f); +int ENGINE_set_pkey_asn1_meths(ENGINE *e, ENGINE_PKEY_ASN1_METHS_PTR f); +int ENGINE_set_flags(ENGINE *e, int flags); +int ENGINE_set_cmd_defns(ENGINE *e, const ENGINE_CMD_DEFN *defns); +/* These functions allow control over any per-structure ENGINE data. */ +int ENGINE_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, + CRYPTO_EX_free *free_func); +int ENGINE_set_ex_data(ENGINE *e, int idx, void *arg); +void *ENGINE_get_ex_data(const ENGINE *e, int idx); + +/* + * This function cleans up anything that needs it. Eg. the ENGINE_add() + * function automatically ensures the list cleanup function is registered to + * be called from ENGINE_cleanup(). Similarly, all ENGINE_register_*** + * functions ensure ENGINE_cleanup() will clean up after them. + */ +void ENGINE_cleanup(void); + +/* + * These return values from within the ENGINE structure. These can be useful + * with functional references as well as structural references - it depends + * which you obtained. Using the result for functional purposes if you only + * obtained a structural reference may be problematic! + */ +const char *ENGINE_get_id(const ENGINE *e); +const char *ENGINE_get_name(const ENGINE *e); +const RSA_METHOD *ENGINE_get_RSA(const ENGINE *e); +const DSA_METHOD *ENGINE_get_DSA(const ENGINE *e); +const ECDH_METHOD *ENGINE_get_ECDH(const ENGINE *e); +const ECDSA_METHOD *ENGINE_get_ECDSA(const ENGINE *e); +const DH_METHOD *ENGINE_get_DH(const ENGINE *e); +const RAND_METHOD *ENGINE_get_RAND(const ENGINE *e); +const STORE_METHOD *ENGINE_get_STORE(const ENGINE *e); +ENGINE_GEN_INT_FUNC_PTR ENGINE_get_destroy_function(const ENGINE *e); +ENGINE_GEN_INT_FUNC_PTR ENGINE_get_init_function(const ENGINE *e); +ENGINE_GEN_INT_FUNC_PTR ENGINE_get_finish_function(const ENGINE *e); +ENGINE_CTRL_FUNC_PTR ENGINE_get_ctrl_function(const ENGINE *e); +ENGINE_LOAD_KEY_PTR ENGINE_get_load_privkey_function(const ENGINE *e); +ENGINE_LOAD_KEY_PTR ENGINE_get_load_pubkey_function(const ENGINE *e); +ENGINE_SSL_CLIENT_CERT_PTR ENGINE_get_ssl_client_cert_function(const ENGINE + *e); +ENGINE_CIPHERS_PTR ENGINE_get_ciphers(const ENGINE *e); +ENGINE_DIGESTS_PTR ENGINE_get_digests(const ENGINE *e); +ENGINE_PKEY_METHS_PTR ENGINE_get_pkey_meths(const ENGINE *e); +ENGINE_PKEY_ASN1_METHS_PTR ENGINE_get_pkey_asn1_meths(const ENGINE *e); +const EVP_CIPHER *ENGINE_get_cipher(ENGINE *e, int nid); +const EVP_MD *ENGINE_get_digest(ENGINE *e, int nid); +const EVP_PKEY_METHOD *ENGINE_get_pkey_meth(ENGINE *e, int nid); +const EVP_PKEY_ASN1_METHOD *ENGINE_get_pkey_asn1_meth(ENGINE *e, int nid); +const EVP_PKEY_ASN1_METHOD *ENGINE_get_pkey_asn1_meth_str(ENGINE *e, + const char *str, + int len); +const EVP_PKEY_ASN1_METHOD *ENGINE_pkey_asn1_find_str(ENGINE **pe, + const char *str, + int len); +const ENGINE_CMD_DEFN *ENGINE_get_cmd_defns(const ENGINE *e); +int ENGINE_get_flags(const ENGINE *e); + +/* + * FUNCTIONAL functions. These functions deal with ENGINE structures that + * have (or will) be initialised for use. Broadly speaking, the structural + * functions are useful for iterating the list of available engine types, + * creating new engine types, and other "list" operations. These functions + * actually deal with ENGINEs that are to be used. As such these functions + * can fail (if applicable) when particular engines are unavailable - eg. if + * a hardware accelerator is not attached or not functioning correctly. Each + * ENGINE has 2 reference counts; structural and functional. Every time a + * functional reference is obtained or released, a corresponding structural + * reference is automatically obtained or released too. + */ + +/* + * Initialise a engine type for use (or up its reference count if it's + * already in use). This will fail if the engine is not currently operational + * and cannot initialise. + */ +int ENGINE_init(ENGINE *e); +/* + * Free a functional reference to a engine type. This does not require a + * corresponding call to ENGINE_free as it also releases a structural + * reference. + */ +int ENGINE_finish(ENGINE *e); + +/* + * The following functions handle keys that are stored in some secondary + * location, handled by the engine. The storage may be on a card or + * whatever. + */ +EVP_PKEY *ENGINE_load_private_key(ENGINE *e, const char *key_id, + UI_METHOD *ui_method, void *callback_data); +EVP_PKEY *ENGINE_load_public_key(ENGINE *e, const char *key_id, + UI_METHOD *ui_method, void *callback_data); +int ENGINE_load_ssl_client_cert(ENGINE *e, SSL *s, + STACK_OF(X509_NAME) *ca_dn, X509 **pcert, + EVP_PKEY **ppkey, STACK_OF(X509) **pother, + UI_METHOD *ui_method, void *callback_data); + +/* + * This returns a pointer for the current ENGINE structure that is (by + * default) performing any RSA operations. The value returned is an + * incremented reference, so it should be free'd (ENGINE_finish) before it is + * discarded. + */ +ENGINE *ENGINE_get_default_RSA(void); +/* Same for the other "methods" */ +ENGINE *ENGINE_get_default_DSA(void); +ENGINE *ENGINE_get_default_ECDH(void); +ENGINE *ENGINE_get_default_ECDSA(void); +ENGINE *ENGINE_get_default_DH(void); +ENGINE *ENGINE_get_default_RAND(void); +/* + * These functions can be used to get a functional reference to perform + * ciphering or digesting corresponding to "nid". + */ +ENGINE *ENGINE_get_cipher_engine(int nid); +ENGINE *ENGINE_get_digest_engine(int nid); +ENGINE *ENGINE_get_pkey_meth_engine(int nid); +ENGINE *ENGINE_get_pkey_asn1_meth_engine(int nid); + +/* + * This sets a new default ENGINE structure for performing RSA operations. If + * the result is non-zero (success) then the ENGINE structure will have had + * its reference count up'd so the caller should still free their own + * reference 'e'. + */ +int ENGINE_set_default_RSA(ENGINE *e); +int ENGINE_set_default_string(ENGINE *e, const char *def_list); +/* Same for the other "methods" */ +int ENGINE_set_default_DSA(ENGINE *e); +int ENGINE_set_default_ECDH(ENGINE *e); +int ENGINE_set_default_ECDSA(ENGINE *e); +int ENGINE_set_default_DH(ENGINE *e); +int ENGINE_set_default_RAND(ENGINE *e); +int ENGINE_set_default_ciphers(ENGINE *e); +int ENGINE_set_default_digests(ENGINE *e); +int ENGINE_set_default_pkey_meths(ENGINE *e); +int ENGINE_set_default_pkey_asn1_meths(ENGINE *e); + +/* + * The combination "set" - the flags are bitwise "OR"d from the + * ENGINE_METHOD_*** defines above. As with the "ENGINE_register_complete()" + * function, this function can result in unnecessary static linkage. If your + * application requires only specific functionality, consider using more + * selective functions. + */ +int ENGINE_set_default(ENGINE *e, unsigned int flags); + +void ENGINE_add_conf_module(void); + +/* Deprecated functions ... */ +/* int ENGINE_clear_defaults(void); */ + +/**************************/ +/* DYNAMIC ENGINE SUPPORT */ +/**************************/ + +/* Binary/behaviour compatibility levels */ +# define OSSL_DYNAMIC_VERSION (unsigned long)0x00020000 +/* + * Binary versions older than this are too old for us (whether we're a loader + * or a loadee) + */ +# define OSSL_DYNAMIC_OLDEST (unsigned long)0x00020000 + +/* + * When compiling an ENGINE entirely as an external shared library, loadable + * by the "dynamic" ENGINE, these types are needed. The 'dynamic_fns' + * structure type provides the calling application's (or library's) error + * functionality and memory management function pointers to the loaded + * library. These should be used/set in the loaded library code so that the + * loading application's 'state' will be used/changed in all operations. The + * 'static_state' pointer allows the loaded library to know if it shares the + * same static data as the calling application (or library), and thus whether + * these callbacks need to be set or not. + */ +typedef void *(*dyn_MEM_malloc_cb) (size_t); +typedef void *(*dyn_MEM_realloc_cb) (void *, size_t); +typedef void (*dyn_MEM_free_cb) (void *); +typedef struct st_dynamic_MEM_fns { + dyn_MEM_malloc_cb malloc_cb; + dyn_MEM_realloc_cb realloc_cb; + dyn_MEM_free_cb free_cb; +} dynamic_MEM_fns; +/* + * FIXME: Perhaps the memory and locking code (crypto.h) should declare and + * use these types so we (and any other dependant code) can simplify a bit?? + */ +typedef void (*dyn_lock_locking_cb) (int, int, const char *, int); +typedef int (*dyn_lock_add_lock_cb) (int *, int, int, const char *, int); +typedef struct CRYPTO_dynlock_value *(*dyn_dynlock_create_cb) (const char *, + int); +typedef void (*dyn_dynlock_lock_cb) (int, struct CRYPTO_dynlock_value *, + const char *, int); +typedef void (*dyn_dynlock_destroy_cb) (struct CRYPTO_dynlock_value *, + const char *, int); +typedef struct st_dynamic_LOCK_fns { + dyn_lock_locking_cb lock_locking_cb; + dyn_lock_add_lock_cb lock_add_lock_cb; + dyn_dynlock_create_cb dynlock_create_cb; + dyn_dynlock_lock_cb dynlock_lock_cb; + dyn_dynlock_destroy_cb dynlock_destroy_cb; +} dynamic_LOCK_fns; +/* The top-level structure */ +typedef struct st_dynamic_fns { + void *static_state; + const ERR_FNS *err_fns; + const CRYPTO_EX_DATA_IMPL *ex_data_fns; + dynamic_MEM_fns mem_fns; + dynamic_LOCK_fns lock_fns; +} dynamic_fns; + +/* + * The version checking function should be of this prototype. NB: The + * ossl_version value passed in is the OSSL_DYNAMIC_VERSION of the loading + * code. If this function returns zero, it indicates a (potential) version + * incompatibility and the loaded library doesn't believe it can proceed. + * Otherwise, the returned value is the (latest) version supported by the + * loading library. The loader may still decide that the loaded code's + * version is unsatisfactory and could veto the load. The function is + * expected to be implemented with the symbol name "v_check", and a default + * implementation can be fully instantiated with + * IMPLEMENT_DYNAMIC_CHECK_FN(). + */ +typedef unsigned long (*dynamic_v_check_fn) (unsigned long ossl_version); +# define IMPLEMENT_DYNAMIC_CHECK_FN() \ + OPENSSL_EXPORT unsigned long v_check(unsigned long v); \ + OPENSSL_EXPORT unsigned long v_check(unsigned long v) { \ + if(v >= OSSL_DYNAMIC_OLDEST) return OSSL_DYNAMIC_VERSION; \ + return 0; } + +/* + * This function is passed the ENGINE structure to initialise with its own + * function and command settings. It should not adjust the structural or + * functional reference counts. If this function returns zero, (a) the load + * will be aborted, (b) the previous ENGINE state will be memcpy'd back onto + * the structure, and (c) the shared library will be unloaded. So + * implementations should do their own internal cleanup in failure + * circumstances otherwise they could leak. The 'id' parameter, if non-NULL, + * represents the ENGINE id that the loader is looking for. If this is NULL, + * the shared library can choose to return failure or to initialise a + * 'default' ENGINE. If non-NULL, the shared library must initialise only an + * ENGINE matching the passed 'id'. The function is expected to be + * implemented with the symbol name "bind_engine". A standard implementation + * can be instantiated with IMPLEMENT_DYNAMIC_BIND_FN(fn) where the parameter + * 'fn' is a callback function that populates the ENGINE structure and + * returns an int value (zero for failure). 'fn' should have prototype; + * [static] int fn(ENGINE *e, const char *id); + */ +typedef int (*dynamic_bind_engine) (ENGINE *e, const char *id, + const dynamic_fns *fns); +# define IMPLEMENT_DYNAMIC_BIND_FN(fn) \ + OPENSSL_EXPORT \ + int bind_engine(ENGINE *e, const char *id, const dynamic_fns *fns); \ + OPENSSL_EXPORT \ + int bind_engine(ENGINE *e, const char *id, const dynamic_fns *fns) { \ + if(ENGINE_get_static_state() == fns->static_state) goto skip_cbs; \ + if(!CRYPTO_set_mem_functions(fns->mem_fns.malloc_cb, \ + fns->mem_fns.realloc_cb, fns->mem_fns.free_cb)) \ + return 0; \ + CRYPTO_set_locking_callback(fns->lock_fns.lock_locking_cb); \ + CRYPTO_set_add_lock_callback(fns->lock_fns.lock_add_lock_cb); \ + CRYPTO_set_dynlock_create_callback(fns->lock_fns.dynlock_create_cb); \ + CRYPTO_set_dynlock_lock_callback(fns->lock_fns.dynlock_lock_cb); \ + CRYPTO_set_dynlock_destroy_callback(fns->lock_fns.dynlock_destroy_cb); \ + if(!CRYPTO_set_ex_data_implementation(fns->ex_data_fns)) \ + return 0; \ + if(!ERR_set_implementation(fns->err_fns)) return 0; \ + skip_cbs: \ + if(!fn(e,id)) return 0; \ + return 1; } + +/* + * If the loading application (or library) and the loaded ENGINE library + * share the same static data (eg. they're both dynamically linked to the + * same libcrypto.so) we need a way to avoid trying to set system callbacks - + * this would fail, and for the same reason that it's unnecessary to try. If + * the loaded ENGINE has (or gets from through the loader) its own copy of + * the libcrypto static data, we will need to set the callbacks. The easiest + * way to detect this is to have a function that returns a pointer to some + * static data and let the loading application and loaded ENGINE compare + * their respective values. + */ +void *ENGINE_get_static_state(void); + +# if defined(__OpenBSD__) || defined(__FreeBSD__) || defined(HAVE_CRYPTODEV) +void ENGINE_setup_bsd_cryptodev(void); +# endif + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_ENGINE_strings(void); + +/* Error codes for the ENGINE functions. */ + +/* Function codes. */ +# define ENGINE_F_DYNAMIC_CTRL 180 +# define ENGINE_F_DYNAMIC_GET_DATA_CTX 181 +# define ENGINE_F_DYNAMIC_LOAD 182 +# define ENGINE_F_DYNAMIC_SET_DATA_CTX 183 +# define ENGINE_F_ENGINE_ADD 105 +# define ENGINE_F_ENGINE_BY_ID 106 +# define ENGINE_F_ENGINE_CMD_IS_EXECUTABLE 170 +# define ENGINE_F_ENGINE_CTRL 142 +# define ENGINE_F_ENGINE_CTRL_CMD 178 +# define ENGINE_F_ENGINE_CTRL_CMD_STRING 171 +# define ENGINE_F_ENGINE_FINISH 107 +# define ENGINE_F_ENGINE_FREE_UTIL 108 +# define ENGINE_F_ENGINE_GET_CIPHER 185 +# define ENGINE_F_ENGINE_GET_DEFAULT_TYPE 177 +# define ENGINE_F_ENGINE_GET_DIGEST 186 +# define ENGINE_F_ENGINE_GET_NEXT 115 +# define ENGINE_F_ENGINE_GET_PKEY_ASN1_METH 193 +# define ENGINE_F_ENGINE_GET_PKEY_METH 192 +# define ENGINE_F_ENGINE_GET_PREV 116 +# define ENGINE_F_ENGINE_INIT 119 +# define ENGINE_F_ENGINE_LIST_ADD 120 +# define ENGINE_F_ENGINE_LIST_REMOVE 121 +# define ENGINE_F_ENGINE_LOAD_PRIVATE_KEY 150 +# define ENGINE_F_ENGINE_LOAD_PUBLIC_KEY 151 +# define ENGINE_F_ENGINE_LOAD_SSL_CLIENT_CERT 194 +# define ENGINE_F_ENGINE_NEW 122 +# define ENGINE_F_ENGINE_REMOVE 123 +# define ENGINE_F_ENGINE_SET_DEFAULT_STRING 189 +# define ENGINE_F_ENGINE_SET_DEFAULT_TYPE 126 +# define ENGINE_F_ENGINE_SET_ID 129 +# define ENGINE_F_ENGINE_SET_NAME 130 +# define ENGINE_F_ENGINE_TABLE_REGISTER 184 +# define ENGINE_F_ENGINE_UNLOAD_KEY 152 +# define ENGINE_F_ENGINE_UNLOCKED_FINISH 191 +# define ENGINE_F_ENGINE_UP_REF 190 +# define ENGINE_F_INT_CTRL_HELPER 172 +# define ENGINE_F_INT_ENGINE_CONFIGURE 188 +# define ENGINE_F_INT_ENGINE_MODULE_INIT 187 +# define ENGINE_F_LOG_MESSAGE 141 + +/* Reason codes. */ +# define ENGINE_R_ALREADY_LOADED 100 +# define ENGINE_R_ARGUMENT_IS_NOT_A_NUMBER 133 +# define ENGINE_R_CMD_NOT_EXECUTABLE 134 +# define ENGINE_R_COMMAND_TAKES_INPUT 135 +# define ENGINE_R_COMMAND_TAKES_NO_INPUT 136 +# define ENGINE_R_CONFLICTING_ENGINE_ID 103 +# define ENGINE_R_CTRL_COMMAND_NOT_IMPLEMENTED 119 +# define ENGINE_R_DH_NOT_IMPLEMENTED 139 +# define ENGINE_R_DSA_NOT_IMPLEMENTED 140 +# define ENGINE_R_DSO_FAILURE 104 +# define ENGINE_R_DSO_NOT_FOUND 132 +# define ENGINE_R_ENGINES_SECTION_ERROR 148 +# define ENGINE_R_ENGINE_CONFIGURATION_ERROR 102 +# define ENGINE_R_ENGINE_IS_NOT_IN_LIST 105 +# define ENGINE_R_ENGINE_SECTION_ERROR 149 +# define ENGINE_R_FAILED_LOADING_PRIVATE_KEY 128 +# define ENGINE_R_FAILED_LOADING_PUBLIC_KEY 129 +# define ENGINE_R_FINISH_FAILED 106 +# define ENGINE_R_GET_HANDLE_FAILED 107 +# define ENGINE_R_ID_OR_NAME_MISSING 108 +# define ENGINE_R_INIT_FAILED 109 +# define ENGINE_R_INTERNAL_LIST_ERROR 110 +# define ENGINE_R_INVALID_ARGUMENT 143 +# define ENGINE_R_INVALID_CMD_NAME 137 +# define ENGINE_R_INVALID_CMD_NUMBER 138 +# define ENGINE_R_INVALID_INIT_VALUE 151 +# define ENGINE_R_INVALID_STRING 150 +# define ENGINE_R_NOT_INITIALISED 117 +# define ENGINE_R_NOT_LOADED 112 +# define ENGINE_R_NO_CONTROL_FUNCTION 120 +# define ENGINE_R_NO_INDEX 144 +# define ENGINE_R_NO_LOAD_FUNCTION 125 +# define ENGINE_R_NO_REFERENCE 130 +# define ENGINE_R_NO_SUCH_ENGINE 116 +# define ENGINE_R_NO_UNLOAD_FUNCTION 126 +# define ENGINE_R_PROVIDE_PARAMETERS 113 +# define ENGINE_R_RSA_NOT_IMPLEMENTED 141 +# define ENGINE_R_UNIMPLEMENTED_CIPHER 146 +# define ENGINE_R_UNIMPLEMENTED_DIGEST 147 +# define ENGINE_R_UNIMPLEMENTED_PUBLIC_KEY_METHOD 101 +# define ENGINE_R_VERSION_INCOMPATIBILITY 145 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/ext/openssl-osx/include/nope/idea.h b/ext/openssl-osx/include/nope/idea.h new file mode 100644 index 00000000..60759840 --- /dev/null +++ b/ext/openssl-osx/include/nope/idea.h @@ -0,0 +1,105 @@ +/* crypto/idea/idea.h */ +/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_IDEA_H +# define HEADER_IDEA_H + +# include /* IDEA_INT, OPENSSL_NO_IDEA */ + +# ifdef OPENSSL_NO_IDEA +# error IDEA is disabled. +# endif + +# define IDEA_ENCRYPT 1 +# define IDEA_DECRYPT 0 + +# define IDEA_BLOCK 8 +# define IDEA_KEY_LENGTH 16 + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct idea_key_st { + IDEA_INT data[9][6]; +} IDEA_KEY_SCHEDULE; + +const char *idea_options(void); +void idea_ecb_encrypt(const unsigned char *in, unsigned char *out, + IDEA_KEY_SCHEDULE *ks); +# ifdef OPENSSL_FIPS +void private_idea_set_encrypt_key(const unsigned char *key, + IDEA_KEY_SCHEDULE *ks); +# endif +void idea_set_encrypt_key(const unsigned char *key, IDEA_KEY_SCHEDULE *ks); +void idea_set_decrypt_key(IDEA_KEY_SCHEDULE *ek, IDEA_KEY_SCHEDULE *dk); +void idea_cbc_encrypt(const unsigned char *in, unsigned char *out, + long length, IDEA_KEY_SCHEDULE *ks, unsigned char *iv, + int enc); +void idea_cfb64_encrypt(const unsigned char *in, unsigned char *out, + long length, IDEA_KEY_SCHEDULE *ks, unsigned char *iv, + int *num, int enc); +void idea_ofb64_encrypt(const unsigned char *in, unsigned char *out, + long length, IDEA_KEY_SCHEDULE *ks, unsigned char *iv, + int *num); +void idea_encrypt(unsigned long *in, IDEA_KEY_SCHEDULE *ks); +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ext/openssl-osx/include/nope/krb5_asn.h b/ext/openssl-osx/include/nope/krb5_asn.h new file mode 100644 index 00000000..9cf5a26d --- /dev/null +++ b/ext/openssl-osx/include/nope/krb5_asn.h @@ -0,0 +1,240 @@ +/* krb5_asn.h */ +/* + * Written by Vern Staats for the OpenSSL project, ** + * using ocsp/{*.h,*asn*.c} as a starting point + */ + +/* ==================================================================== + * Copyright (c) 1998-2000 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_KRB5_ASN_H +# define HEADER_KRB5_ASN_H + +/* + * #include + */ +# include + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * ASN.1 from Kerberos RFC 1510 + */ + +/*- EncryptedData ::= SEQUENCE { + * etype[0] INTEGER, -- EncryptionType + * kvno[1] INTEGER OPTIONAL, + * cipher[2] OCTET STRING -- ciphertext + * } + */ +typedef struct krb5_encdata_st { + ASN1_INTEGER *etype; + ASN1_INTEGER *kvno; + ASN1_OCTET_STRING *cipher; +} KRB5_ENCDATA; + +DECLARE_STACK_OF(KRB5_ENCDATA) + +/*- PrincipalName ::= SEQUENCE { + * name-type[0] INTEGER, + * name-string[1] SEQUENCE OF GeneralString + * } + */ +typedef struct krb5_princname_st { + ASN1_INTEGER *nametype; + STACK_OF(ASN1_GENERALSTRING) *namestring; +} KRB5_PRINCNAME; + +DECLARE_STACK_OF(KRB5_PRINCNAME) + +/*- Ticket ::= [APPLICATION 1] SEQUENCE { + * tkt-vno[0] INTEGER, + * realm[1] Realm, + * sname[2] PrincipalName, + * enc-part[3] EncryptedData + * } + */ +typedef struct krb5_tktbody_st { + ASN1_INTEGER *tktvno; + ASN1_GENERALSTRING *realm; + KRB5_PRINCNAME *sname; + KRB5_ENCDATA *encdata; +} KRB5_TKTBODY; + +typedef STACK_OF(KRB5_TKTBODY) KRB5_TICKET; +DECLARE_STACK_OF(KRB5_TKTBODY) + +/*- AP-REQ ::= [APPLICATION 14] SEQUENCE { + * pvno[0] INTEGER, + * msg-type[1] INTEGER, + * ap-options[2] APOptions, + * ticket[3] Ticket, + * authenticator[4] EncryptedData + * } + * + * APOptions ::= BIT STRING { + * reserved(0), use-session-key(1), mutual-required(2) } + */ +typedef struct krb5_ap_req_st { + ASN1_INTEGER *pvno; + ASN1_INTEGER *msgtype; + ASN1_BIT_STRING *apoptions; + KRB5_TICKET *ticket; + KRB5_ENCDATA *authenticator; +} KRB5_APREQBODY; + +typedef STACK_OF(KRB5_APREQBODY) KRB5_APREQ; +DECLARE_STACK_OF(KRB5_APREQBODY) + +/* Authenticator Stuff */ + +/*- Checksum ::= SEQUENCE { + * cksumtype[0] INTEGER, + * checksum[1] OCTET STRING + * } + */ +typedef struct krb5_checksum_st { + ASN1_INTEGER *ctype; + ASN1_OCTET_STRING *checksum; +} KRB5_CHECKSUM; + +DECLARE_STACK_OF(KRB5_CHECKSUM) + +/*- EncryptionKey ::= SEQUENCE { + * keytype[0] INTEGER, + * keyvalue[1] OCTET STRING + * } + */ +typedef struct krb5_encryptionkey_st { + ASN1_INTEGER *ktype; + ASN1_OCTET_STRING *keyvalue; +} KRB5_ENCKEY; + +DECLARE_STACK_OF(KRB5_ENCKEY) + +/*- AuthorizationData ::= SEQUENCE OF SEQUENCE { + * ad-type[0] INTEGER, + * ad-data[1] OCTET STRING + * } + */ +typedef struct krb5_authorization_st { + ASN1_INTEGER *adtype; + ASN1_OCTET_STRING *addata; +} KRB5_AUTHDATA; + +DECLARE_STACK_OF(KRB5_AUTHDATA) + +/*- -- Unencrypted authenticator + * Authenticator ::= [APPLICATION 2] SEQUENCE { + * authenticator-vno[0] INTEGER, + * crealm[1] Realm, + * cname[2] PrincipalName, + * cksum[3] Checksum OPTIONAL, + * cusec[4] INTEGER, + * ctime[5] KerberosTime, + * subkey[6] EncryptionKey OPTIONAL, + * seq-number[7] INTEGER OPTIONAL, + * authorization-data[8] AuthorizationData OPTIONAL + * } + */ +typedef struct krb5_authenticator_st { + ASN1_INTEGER *avno; + ASN1_GENERALSTRING *crealm; + KRB5_PRINCNAME *cname; + KRB5_CHECKSUM *cksum; + ASN1_INTEGER *cusec; + ASN1_GENERALIZEDTIME *ctime; + KRB5_ENCKEY *subkey; + ASN1_INTEGER *seqnum; + KRB5_AUTHDATA *authorization; +} KRB5_AUTHENTBODY; + +typedef STACK_OF(KRB5_AUTHENTBODY) KRB5_AUTHENT; +DECLARE_STACK_OF(KRB5_AUTHENTBODY) + +/*- DECLARE_ASN1_FUNCTIONS(type) = DECLARE_ASN1_FUNCTIONS_name(type, type) = + * type *name##_new(void); + * void name##_free(type *a); + * DECLARE_ASN1_ENCODE_FUNCTIONS(type, name, name) = + * DECLARE_ASN1_ENCODE_FUNCTIONS(type, itname, name) = + * type *d2i_##name(type **a, const unsigned char **in, long len); + * int i2d_##name(type *a, unsigned char **out); + * DECLARE_ASN1_ITEM(itname) = OPENSSL_EXTERN const ASN1_ITEM itname##_it + */ + +DECLARE_ASN1_FUNCTIONS(KRB5_ENCDATA) +DECLARE_ASN1_FUNCTIONS(KRB5_PRINCNAME) +DECLARE_ASN1_FUNCTIONS(KRB5_TKTBODY) +DECLARE_ASN1_FUNCTIONS(KRB5_APREQBODY) +DECLARE_ASN1_FUNCTIONS(KRB5_TICKET) +DECLARE_ASN1_FUNCTIONS(KRB5_APREQ) + +DECLARE_ASN1_FUNCTIONS(KRB5_CHECKSUM) +DECLARE_ASN1_FUNCTIONS(KRB5_ENCKEY) +DECLARE_ASN1_FUNCTIONS(KRB5_AUTHDATA) +DECLARE_ASN1_FUNCTIONS(KRB5_AUTHENTBODY) +DECLARE_ASN1_FUNCTIONS(KRB5_AUTHENT) + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ + +#ifdef __cplusplus +} +#endif +#endif diff --git a/ext/openssl-osx/include/nope/md4.h b/ext/openssl-osx/include/nope/md4.h new file mode 100644 index 00000000..11fd7129 --- /dev/null +++ b/ext/openssl-osx/include/nope/md4.h @@ -0,0 +1,119 @@ +/* crypto/md4/md4.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_MD4_H +# define HEADER_MD4_H + +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# ifdef OPENSSL_NO_MD4 +# error MD4 is disabled. +# endif + +/*- + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + * ! MD4_LONG has to be at least 32 bits wide. If it's wider, then ! + * ! MD4_LONG_LOG2 has to be defined along. ! + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + */ + +# if defined(__LP32__) +# define MD4_LONG unsigned long +# elif defined(OPENSSL_SYS_CRAY) || defined(__ILP64__) +# define MD4_LONG unsigned long +# define MD4_LONG_LOG2 3 +/* + * _CRAY note. I could declare short, but I have no idea what impact + * does it have on performance on none-T3E machines. I could declare + * int, but at least on C90 sizeof(int) can be chosen at compile time. + * So I've chosen long... + * + */ +# else +# define MD4_LONG unsigned int +# endif + +# define MD4_CBLOCK 64 +# define MD4_LBLOCK (MD4_CBLOCK/4) +# define MD4_DIGEST_LENGTH 16 + +typedef struct MD4state_st { + MD4_LONG A, B, C, D; + MD4_LONG Nl, Nh; + MD4_LONG data[MD4_LBLOCK]; + unsigned int num; +} MD4_CTX; + +# ifdef OPENSSL_FIPS +int private_MD4_Init(MD4_CTX *c); +# endif +int MD4_Init(MD4_CTX *c); +int MD4_Update(MD4_CTX *c, const void *data, size_t len); +int MD4_Final(unsigned char *md, MD4_CTX *c); +unsigned char *MD4(const unsigned char *d, size_t n, unsigned char *md); +void MD4_Transform(MD4_CTX *c, const unsigned char *b); +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ext/openssl-osx/include/nope/md5.h b/ext/openssl-osx/include/nope/md5.h new file mode 100644 index 00000000..2659038a --- /dev/null +++ b/ext/openssl-osx/include/nope/md5.h @@ -0,0 +1,119 @@ +/* crypto/md5/md5.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_MD5_H +# define HEADER_MD5_H + +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# ifdef OPENSSL_NO_MD5 +# error MD5 is disabled. +# endif + +/* + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + * ! MD5_LONG has to be at least 32 bits wide. If it's wider, then ! + * ! MD5_LONG_LOG2 has to be defined along. ! + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + */ + +# if defined(__LP32__) +# define MD5_LONG unsigned long +# elif defined(OPENSSL_SYS_CRAY) || defined(__ILP64__) +# define MD5_LONG unsigned long +# define MD5_LONG_LOG2 3 +/* + * _CRAY note. I could declare short, but I have no idea what impact + * does it have on performance on none-T3E machines. I could declare + * int, but at least on C90 sizeof(int) can be chosen at compile time. + * So I've chosen long... + * + */ +# else +# define MD5_LONG unsigned int +# endif + +# define MD5_CBLOCK 64 +# define MD5_LBLOCK (MD5_CBLOCK/4) +# define MD5_DIGEST_LENGTH 16 + +typedef struct MD5state_st { + MD5_LONG A, B, C, D; + MD5_LONG Nl, Nh; + MD5_LONG data[MD5_LBLOCK]; + unsigned int num; +} MD5_CTX; + +# ifdef OPENSSL_FIPS +int private_MD5_Init(MD5_CTX *c); +# endif +int MD5_Init(MD5_CTX *c); +int MD5_Update(MD5_CTX *c, const void *data, size_t len); +int MD5_Final(unsigned char *md, MD5_CTX *c); +unsigned char *MD5(const unsigned char *d, size_t n, unsigned char *md); +void MD5_Transform(MD5_CTX *c, const unsigned char *b); +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ext/openssl-osx/include/nope/mdc2.h b/ext/openssl-osx/include/nope/mdc2.h new file mode 100644 index 00000000..7efe53bc --- /dev/null +++ b/ext/openssl-osx/include/nope/mdc2.h @@ -0,0 +1,94 @@ +/* crypto/mdc2/mdc2.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_MDC2_H +# define HEADER_MDC2_H + +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# ifdef OPENSSL_NO_MDC2 +# error MDC2 is disabled. +# endif + +# define MDC2_BLOCK 8 +# define MDC2_DIGEST_LENGTH 16 + +typedef struct mdc2_ctx_st { + unsigned int num; + unsigned char data[MDC2_BLOCK]; + DES_cblock h, hh; + int pad_type; /* either 1 or 2, default 1 */ +} MDC2_CTX; + +# ifdef OPENSSL_FIPS +int private_MDC2_Init(MDC2_CTX *c); +# endif +int MDC2_Init(MDC2_CTX *c); +int MDC2_Update(MDC2_CTX *c, const unsigned char *data, size_t len); +int MDC2_Final(unsigned char *md, MDC2_CTX *c); +unsigned char *MDC2(const unsigned char *d, size_t n, unsigned char *md); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ext/openssl-osx/include/nope/modes.h b/ext/openssl-osx/include/nope/modes.h new file mode 100644 index 00000000..fd488499 --- /dev/null +++ b/ext/openssl-osx/include/nope/modes.h @@ -0,0 +1,163 @@ +/* ==================================================================== + * Copyright (c) 2008 The OpenSSL Project. All rights reserved. + * + * Rights for redistribution and usage in source and binary + * forms are granted according to the OpenSSL license. + */ + +#include + +#ifdef __cplusplus +extern "C" { +#endif +typedef void (*block128_f) (const unsigned char in[16], + unsigned char out[16], const void *key); + +typedef void (*cbc128_f) (const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], int enc); + +typedef void (*ctr128_f) (const unsigned char *in, unsigned char *out, + size_t blocks, const void *key, + const unsigned char ivec[16]); + +typedef void (*ccm128_f) (const unsigned char *in, unsigned char *out, + size_t blocks, const void *key, + const unsigned char ivec[16], + unsigned char cmac[16]); + +void CRYPTO_cbc128_encrypt(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], block128_f block); +void CRYPTO_cbc128_decrypt(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], block128_f block); + +void CRYPTO_ctr128_encrypt(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], + unsigned char ecount_buf[16], unsigned int *num, + block128_f block); + +void CRYPTO_ctr128_encrypt_ctr32(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], + unsigned char ecount_buf[16], + unsigned int *num, ctr128_f ctr); + +void CRYPTO_ofb128_encrypt(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], int *num, + block128_f block); + +void CRYPTO_cfb128_encrypt(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], int *num, + int enc, block128_f block); +void CRYPTO_cfb128_8_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const void *key, + unsigned char ivec[16], int *num, + int enc, block128_f block); +void CRYPTO_cfb128_1_encrypt(const unsigned char *in, unsigned char *out, + size_t bits, const void *key, + unsigned char ivec[16], int *num, + int enc, block128_f block); + +size_t CRYPTO_cts128_encrypt_block(const unsigned char *in, + unsigned char *out, size_t len, + const void *key, unsigned char ivec[16], + block128_f block); +size_t CRYPTO_cts128_encrypt(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], cbc128_f cbc); +size_t CRYPTO_cts128_decrypt_block(const unsigned char *in, + unsigned char *out, size_t len, + const void *key, unsigned char ivec[16], + block128_f block); +size_t CRYPTO_cts128_decrypt(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], cbc128_f cbc); + +size_t CRYPTO_nistcts128_encrypt_block(const unsigned char *in, + unsigned char *out, size_t len, + const void *key, + unsigned char ivec[16], + block128_f block); +size_t CRYPTO_nistcts128_encrypt(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], cbc128_f cbc); +size_t CRYPTO_nistcts128_decrypt_block(const unsigned char *in, + unsigned char *out, size_t len, + const void *key, + unsigned char ivec[16], + block128_f block); +size_t CRYPTO_nistcts128_decrypt(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], cbc128_f cbc); + +typedef struct gcm128_context GCM128_CONTEXT; + +GCM128_CONTEXT *CRYPTO_gcm128_new(void *key, block128_f block); +void CRYPTO_gcm128_init(GCM128_CONTEXT *ctx, void *key, block128_f block); +void CRYPTO_gcm128_setiv(GCM128_CONTEXT *ctx, const unsigned char *iv, + size_t len); +int CRYPTO_gcm128_aad(GCM128_CONTEXT *ctx, const unsigned char *aad, + size_t len); +int CRYPTO_gcm128_encrypt(GCM128_CONTEXT *ctx, + const unsigned char *in, unsigned char *out, + size_t len); +int CRYPTO_gcm128_decrypt(GCM128_CONTEXT *ctx, + const unsigned char *in, unsigned char *out, + size_t len); +int CRYPTO_gcm128_encrypt_ctr32(GCM128_CONTEXT *ctx, + const unsigned char *in, unsigned char *out, + size_t len, ctr128_f stream); +int CRYPTO_gcm128_decrypt_ctr32(GCM128_CONTEXT *ctx, + const unsigned char *in, unsigned char *out, + size_t len, ctr128_f stream); +int CRYPTO_gcm128_finish(GCM128_CONTEXT *ctx, const unsigned char *tag, + size_t len); +void CRYPTO_gcm128_tag(GCM128_CONTEXT *ctx, unsigned char *tag, size_t len); +void CRYPTO_gcm128_release(GCM128_CONTEXT *ctx); + +typedef struct ccm128_context CCM128_CONTEXT; + +void CRYPTO_ccm128_init(CCM128_CONTEXT *ctx, + unsigned int M, unsigned int L, void *key, + block128_f block); +int CRYPTO_ccm128_setiv(CCM128_CONTEXT *ctx, const unsigned char *nonce, + size_t nlen, size_t mlen); +void CRYPTO_ccm128_aad(CCM128_CONTEXT *ctx, const unsigned char *aad, + size_t alen); +int CRYPTO_ccm128_encrypt(CCM128_CONTEXT *ctx, const unsigned char *inp, + unsigned char *out, size_t len); +int CRYPTO_ccm128_decrypt(CCM128_CONTEXT *ctx, const unsigned char *inp, + unsigned char *out, size_t len); +int CRYPTO_ccm128_encrypt_ccm64(CCM128_CONTEXT *ctx, const unsigned char *inp, + unsigned char *out, size_t len, + ccm128_f stream); +int CRYPTO_ccm128_decrypt_ccm64(CCM128_CONTEXT *ctx, const unsigned char *inp, + unsigned char *out, size_t len, + ccm128_f stream); +size_t CRYPTO_ccm128_tag(CCM128_CONTEXT *ctx, unsigned char *tag, size_t len); + +typedef struct xts128_context XTS128_CONTEXT; + +int CRYPTO_xts128_encrypt(const XTS128_CONTEXT *ctx, + const unsigned char iv[16], + const unsigned char *inp, unsigned char *out, + size_t len, int enc); + +size_t CRYPTO_128_wrap(void *key, const unsigned char *iv, + unsigned char *out, + const unsigned char *in, size_t inlen, + block128_f block); + +size_t CRYPTO_128_unwrap(void *key, const unsigned char *iv, + unsigned char *out, + const unsigned char *in, size_t inlen, + block128_f block); + +#ifdef __cplusplus +} +#endif diff --git a/ext/openssl-osx/include/nope/ocsp.h b/ext/openssl-osx/include/nope/ocsp.h new file mode 100644 index 00000000..ca2ee76d --- /dev/null +++ b/ext/openssl-osx/include/nope/ocsp.h @@ -0,0 +1,637 @@ +/* ocsp.h */ +/* + * Written by Tom Titchener for the OpenSSL + * project. + */ + +/* + * History: This file was transfered to Richard Levitte from CertCo by Kathy + * Weinhold in mid-spring 2000 to be included in OpenSSL or released as a + * patch kit. + */ + +/* ==================================================================== + * Copyright (c) 1998-2000 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_OCSP_H +# define HEADER_OCSP_H + +# include +# include +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Various flags and values */ + +# define OCSP_DEFAULT_NONCE_LENGTH 16 + +# define OCSP_NOCERTS 0x1 +# define OCSP_NOINTERN 0x2 +# define OCSP_NOSIGS 0x4 +# define OCSP_NOCHAIN 0x8 +# define OCSP_NOVERIFY 0x10 +# define OCSP_NOEXPLICIT 0x20 +# define OCSP_NOCASIGN 0x40 +# define OCSP_NODELEGATED 0x80 +# define OCSP_NOCHECKS 0x100 +# define OCSP_TRUSTOTHER 0x200 +# define OCSP_RESPID_KEY 0x400 +# define OCSP_NOTIME 0x800 + +/*- CertID ::= SEQUENCE { + * hashAlgorithm AlgorithmIdentifier, + * issuerNameHash OCTET STRING, -- Hash of Issuer's DN + * issuerKeyHash OCTET STRING, -- Hash of Issuers public key (excluding the tag & length fields) + * serialNumber CertificateSerialNumber } + */ +typedef struct ocsp_cert_id_st { + X509_ALGOR *hashAlgorithm; + ASN1_OCTET_STRING *issuerNameHash; + ASN1_OCTET_STRING *issuerKeyHash; + ASN1_INTEGER *serialNumber; +} OCSP_CERTID; + +DECLARE_STACK_OF(OCSP_CERTID) + +/*- Request ::= SEQUENCE { + * reqCert CertID, + * singleRequestExtensions [0] EXPLICIT Extensions OPTIONAL } + */ +typedef struct ocsp_one_request_st { + OCSP_CERTID *reqCert; + STACK_OF(X509_EXTENSION) *singleRequestExtensions; +} OCSP_ONEREQ; + +DECLARE_STACK_OF(OCSP_ONEREQ) +DECLARE_ASN1_SET_OF(OCSP_ONEREQ) + +/*- TBSRequest ::= SEQUENCE { + * version [0] EXPLICIT Version DEFAULT v1, + * requestorName [1] EXPLICIT GeneralName OPTIONAL, + * requestList SEQUENCE OF Request, + * requestExtensions [2] EXPLICIT Extensions OPTIONAL } + */ +typedef struct ocsp_req_info_st { + ASN1_INTEGER *version; + GENERAL_NAME *requestorName; + STACK_OF(OCSP_ONEREQ) *requestList; + STACK_OF(X509_EXTENSION) *requestExtensions; +} OCSP_REQINFO; + +/*- Signature ::= SEQUENCE { + * signatureAlgorithm AlgorithmIdentifier, + * signature BIT STRING, + * certs [0] EXPLICIT SEQUENCE OF Certificate OPTIONAL } + */ +typedef struct ocsp_signature_st { + X509_ALGOR *signatureAlgorithm; + ASN1_BIT_STRING *signature; + STACK_OF(X509) *certs; +} OCSP_SIGNATURE; + +/*- OCSPRequest ::= SEQUENCE { + * tbsRequest TBSRequest, + * optionalSignature [0] EXPLICIT Signature OPTIONAL } + */ +typedef struct ocsp_request_st { + OCSP_REQINFO *tbsRequest; + OCSP_SIGNATURE *optionalSignature; /* OPTIONAL */ +} OCSP_REQUEST; + +/*- OCSPResponseStatus ::= ENUMERATED { + * successful (0), --Response has valid confirmations + * malformedRequest (1), --Illegal confirmation request + * internalError (2), --Internal error in issuer + * tryLater (3), --Try again later + * --(4) is not used + * sigRequired (5), --Must sign the request + * unauthorized (6) --Request unauthorized + * } + */ +# define OCSP_RESPONSE_STATUS_SUCCESSFUL 0 +# define OCSP_RESPONSE_STATUS_MALFORMEDREQUEST 1 +# define OCSP_RESPONSE_STATUS_INTERNALERROR 2 +# define OCSP_RESPONSE_STATUS_TRYLATER 3 +# define OCSP_RESPONSE_STATUS_SIGREQUIRED 5 +# define OCSP_RESPONSE_STATUS_UNAUTHORIZED 6 + +/*- ResponseBytes ::= SEQUENCE { + * responseType OBJECT IDENTIFIER, + * response OCTET STRING } + */ +typedef struct ocsp_resp_bytes_st { + ASN1_OBJECT *responseType; + ASN1_OCTET_STRING *response; +} OCSP_RESPBYTES; + +/*- OCSPResponse ::= SEQUENCE { + * responseStatus OCSPResponseStatus, + * responseBytes [0] EXPLICIT ResponseBytes OPTIONAL } + */ +struct ocsp_response_st { + ASN1_ENUMERATED *responseStatus; + OCSP_RESPBYTES *responseBytes; +}; + +/*- ResponderID ::= CHOICE { + * byName [1] Name, + * byKey [2] KeyHash } + */ +# define V_OCSP_RESPID_NAME 0 +# define V_OCSP_RESPID_KEY 1 +struct ocsp_responder_id_st { + int type; + union { + X509_NAME *byName; + ASN1_OCTET_STRING *byKey; + } value; +}; + +DECLARE_STACK_OF(OCSP_RESPID) +DECLARE_ASN1_FUNCTIONS(OCSP_RESPID) + +/*- KeyHash ::= OCTET STRING --SHA-1 hash of responder's public key + * --(excluding the tag and length fields) + */ + +/*- RevokedInfo ::= SEQUENCE { + * revocationTime GeneralizedTime, + * revocationReason [0] EXPLICIT CRLReason OPTIONAL } + */ +typedef struct ocsp_revoked_info_st { + ASN1_GENERALIZEDTIME *revocationTime; + ASN1_ENUMERATED *revocationReason; +} OCSP_REVOKEDINFO; + +/*- CertStatus ::= CHOICE { + * good [0] IMPLICIT NULL, + * revoked [1] IMPLICIT RevokedInfo, + * unknown [2] IMPLICIT UnknownInfo } + */ +# define V_OCSP_CERTSTATUS_GOOD 0 +# define V_OCSP_CERTSTATUS_REVOKED 1 +# define V_OCSP_CERTSTATUS_UNKNOWN 2 +typedef struct ocsp_cert_status_st { + int type; + union { + ASN1_NULL *good; + OCSP_REVOKEDINFO *revoked; + ASN1_NULL *unknown; + } value; +} OCSP_CERTSTATUS; + +/*- SingleResponse ::= SEQUENCE { + * certID CertID, + * certStatus CertStatus, + * thisUpdate GeneralizedTime, + * nextUpdate [0] EXPLICIT GeneralizedTime OPTIONAL, + * singleExtensions [1] EXPLICIT Extensions OPTIONAL } + */ +typedef struct ocsp_single_response_st { + OCSP_CERTID *certId; + OCSP_CERTSTATUS *certStatus; + ASN1_GENERALIZEDTIME *thisUpdate; + ASN1_GENERALIZEDTIME *nextUpdate; + STACK_OF(X509_EXTENSION) *singleExtensions; +} OCSP_SINGLERESP; + +DECLARE_STACK_OF(OCSP_SINGLERESP) +DECLARE_ASN1_SET_OF(OCSP_SINGLERESP) + +/*- ResponseData ::= SEQUENCE { + * version [0] EXPLICIT Version DEFAULT v1, + * responderID ResponderID, + * producedAt GeneralizedTime, + * responses SEQUENCE OF SingleResponse, + * responseExtensions [1] EXPLICIT Extensions OPTIONAL } + */ +typedef struct ocsp_response_data_st { + ASN1_INTEGER *version; + OCSP_RESPID *responderId; + ASN1_GENERALIZEDTIME *producedAt; + STACK_OF(OCSP_SINGLERESP) *responses; + STACK_OF(X509_EXTENSION) *responseExtensions; +} OCSP_RESPDATA; + +/*- BasicOCSPResponse ::= SEQUENCE { + * tbsResponseData ResponseData, + * signatureAlgorithm AlgorithmIdentifier, + * signature BIT STRING, + * certs [0] EXPLICIT SEQUENCE OF Certificate OPTIONAL } + */ + /* + * Note 1: The value for "signature" is specified in the OCSP rfc2560 as + * follows: "The value for the signature SHALL be computed on the hash of + * the DER encoding ResponseData." This means that you must hash the + * DER-encoded tbsResponseData, and then run it through a crypto-signing + * function, which will (at least w/RSA) do a hash-'n'-private-encrypt + * operation. This seems a bit odd, but that's the spec. Also note that + * the data structures do not leave anywhere to independently specify the + * algorithm used for the initial hash. So, we look at the + * signature-specification algorithm, and try to do something intelligent. + * -- Kathy Weinhold, CertCo + */ + /* + * Note 2: It seems that the mentioned passage from RFC 2560 (section + * 4.2.1) is open for interpretation. I've done tests against another + * responder, and found that it doesn't do the double hashing that the RFC + * seems to say one should. Therefore, all relevant functions take a flag + * saying which variant should be used. -- Richard Levitte, OpenSSL team + * and CeloCom + */ +typedef struct ocsp_basic_response_st { + OCSP_RESPDATA *tbsResponseData; + X509_ALGOR *signatureAlgorithm; + ASN1_BIT_STRING *signature; + STACK_OF(X509) *certs; +} OCSP_BASICRESP; + +/*- + * CRLReason ::= ENUMERATED { + * unspecified (0), + * keyCompromise (1), + * cACompromise (2), + * affiliationChanged (3), + * superseded (4), + * cessationOfOperation (5), + * certificateHold (6), + * removeFromCRL (8) } + */ +# define OCSP_REVOKED_STATUS_NOSTATUS -1 +# define OCSP_REVOKED_STATUS_UNSPECIFIED 0 +# define OCSP_REVOKED_STATUS_KEYCOMPROMISE 1 +# define OCSP_REVOKED_STATUS_CACOMPROMISE 2 +# define OCSP_REVOKED_STATUS_AFFILIATIONCHANGED 3 +# define OCSP_REVOKED_STATUS_SUPERSEDED 4 +# define OCSP_REVOKED_STATUS_CESSATIONOFOPERATION 5 +# define OCSP_REVOKED_STATUS_CERTIFICATEHOLD 6 +# define OCSP_REVOKED_STATUS_REMOVEFROMCRL 8 + +/*- + * CrlID ::= SEQUENCE { + * crlUrl [0] EXPLICIT IA5String OPTIONAL, + * crlNum [1] EXPLICIT INTEGER OPTIONAL, + * crlTime [2] EXPLICIT GeneralizedTime OPTIONAL } + */ +typedef struct ocsp_crl_id_st { + ASN1_IA5STRING *crlUrl; + ASN1_INTEGER *crlNum; + ASN1_GENERALIZEDTIME *crlTime; +} OCSP_CRLID; + +/*- + * ServiceLocator ::= SEQUENCE { + * issuer Name, + * locator AuthorityInfoAccessSyntax OPTIONAL } + */ +typedef struct ocsp_service_locator_st { + X509_NAME *issuer; + STACK_OF(ACCESS_DESCRIPTION) *locator; +} OCSP_SERVICELOC; + +# define PEM_STRING_OCSP_REQUEST "OCSP REQUEST" +# define PEM_STRING_OCSP_RESPONSE "OCSP RESPONSE" + +# define d2i_OCSP_REQUEST_bio(bp,p) ASN1_d2i_bio_of(OCSP_REQUEST,OCSP_REQUEST_new,d2i_OCSP_REQUEST,bp,p) + +# define d2i_OCSP_RESPONSE_bio(bp,p) ASN1_d2i_bio_of(OCSP_RESPONSE,OCSP_RESPONSE_new,d2i_OCSP_RESPONSE,bp,p) + +# define PEM_read_bio_OCSP_REQUEST(bp,x,cb) (OCSP_REQUEST *)PEM_ASN1_read_bio( \ + (char *(*)())d2i_OCSP_REQUEST,PEM_STRING_OCSP_REQUEST,bp,(char **)x,cb,NULL) + +# define PEM_read_bio_OCSP_RESPONSE(bp,x,cb)(OCSP_RESPONSE *)PEM_ASN1_read_bio(\ + (char *(*)())d2i_OCSP_RESPONSE,PEM_STRING_OCSP_RESPONSE,bp,(char **)x,cb,NULL) + +# define PEM_write_bio_OCSP_REQUEST(bp,o) \ + PEM_ASN1_write_bio((int (*)())i2d_OCSP_REQUEST,PEM_STRING_OCSP_REQUEST,\ + bp,(char *)o, NULL,NULL,0,NULL,NULL) + +# define PEM_write_bio_OCSP_RESPONSE(bp,o) \ + PEM_ASN1_write_bio((int (*)())i2d_OCSP_RESPONSE,PEM_STRING_OCSP_RESPONSE,\ + bp,(char *)o, NULL,NULL,0,NULL,NULL) + +# define i2d_OCSP_RESPONSE_bio(bp,o) ASN1_i2d_bio_of(OCSP_RESPONSE,i2d_OCSP_RESPONSE,bp,o) + +# define i2d_OCSP_REQUEST_bio(bp,o) ASN1_i2d_bio_of(OCSP_REQUEST,i2d_OCSP_REQUEST,bp,o) + +# define OCSP_REQUEST_sign(o,pkey,md) \ + ASN1_item_sign(ASN1_ITEM_rptr(OCSP_REQINFO),\ + o->optionalSignature->signatureAlgorithm,NULL,\ + o->optionalSignature->signature,o->tbsRequest,pkey,md) + +# define OCSP_BASICRESP_sign(o,pkey,md,d) \ + ASN1_item_sign(ASN1_ITEM_rptr(OCSP_RESPDATA),o->signatureAlgorithm,NULL,\ + o->signature,o->tbsResponseData,pkey,md) + +# define OCSP_REQUEST_verify(a,r) ASN1_item_verify(ASN1_ITEM_rptr(OCSP_REQINFO),\ + a->optionalSignature->signatureAlgorithm,\ + a->optionalSignature->signature,a->tbsRequest,r) + +# define OCSP_BASICRESP_verify(a,r,d) ASN1_item_verify(ASN1_ITEM_rptr(OCSP_RESPDATA),\ + a->signatureAlgorithm,a->signature,a->tbsResponseData,r) + +# define ASN1_BIT_STRING_digest(data,type,md,len) \ + ASN1_item_digest(ASN1_ITEM_rptr(ASN1_BIT_STRING),type,data,md,len) + +# define OCSP_CERTSTATUS_dup(cs)\ + (OCSP_CERTSTATUS*)ASN1_dup((int(*)())i2d_OCSP_CERTSTATUS,\ + (char *(*)())d2i_OCSP_CERTSTATUS,(char *)(cs)) + +OCSP_CERTID *OCSP_CERTID_dup(OCSP_CERTID *id); + +OCSP_RESPONSE *OCSP_sendreq_bio(BIO *b, const char *path, OCSP_REQUEST *req); +OCSP_REQ_CTX *OCSP_sendreq_new(BIO *io, const char *path, OCSP_REQUEST *req, + int maxline); +int OCSP_REQ_CTX_nbio(OCSP_REQ_CTX *rctx); +int OCSP_sendreq_nbio(OCSP_RESPONSE **presp, OCSP_REQ_CTX *rctx); +OCSP_REQ_CTX *OCSP_REQ_CTX_new(BIO *io, int maxline); +void OCSP_REQ_CTX_free(OCSP_REQ_CTX *rctx); +void OCSP_set_max_response_length(OCSP_REQ_CTX *rctx, unsigned long len); +int OCSP_REQ_CTX_i2d(OCSP_REQ_CTX *rctx, const ASN1_ITEM *it, + ASN1_VALUE *val); +int OCSP_REQ_CTX_nbio_d2i(OCSP_REQ_CTX *rctx, ASN1_VALUE **pval, + const ASN1_ITEM *it); +BIO *OCSP_REQ_CTX_get0_mem_bio(OCSP_REQ_CTX *rctx); +int OCSP_REQ_CTX_i2d(OCSP_REQ_CTX *rctx, const ASN1_ITEM *it, + ASN1_VALUE *val); +int OCSP_REQ_CTX_http(OCSP_REQ_CTX *rctx, const char *op, const char *path); +int OCSP_REQ_CTX_set1_req(OCSP_REQ_CTX *rctx, OCSP_REQUEST *req); +int OCSP_REQ_CTX_add1_header(OCSP_REQ_CTX *rctx, + const char *name, const char *value); + +OCSP_CERTID *OCSP_cert_to_id(const EVP_MD *dgst, X509 *subject, X509 *issuer); + +OCSP_CERTID *OCSP_cert_id_new(const EVP_MD *dgst, + X509_NAME *issuerName, + ASN1_BIT_STRING *issuerKey, + ASN1_INTEGER *serialNumber); + +OCSP_ONEREQ *OCSP_request_add0_id(OCSP_REQUEST *req, OCSP_CERTID *cid); + +int OCSP_request_add1_nonce(OCSP_REQUEST *req, unsigned char *val, int len); +int OCSP_basic_add1_nonce(OCSP_BASICRESP *resp, unsigned char *val, int len); +int OCSP_check_nonce(OCSP_REQUEST *req, OCSP_BASICRESP *bs); +int OCSP_copy_nonce(OCSP_BASICRESP *resp, OCSP_REQUEST *req); + +int OCSP_request_set1_name(OCSP_REQUEST *req, X509_NAME *nm); +int OCSP_request_add1_cert(OCSP_REQUEST *req, X509 *cert); + +int OCSP_request_sign(OCSP_REQUEST *req, + X509 *signer, + EVP_PKEY *key, + const EVP_MD *dgst, + STACK_OF(X509) *certs, unsigned long flags); + +int OCSP_response_status(OCSP_RESPONSE *resp); +OCSP_BASICRESP *OCSP_response_get1_basic(OCSP_RESPONSE *resp); + +int OCSP_resp_count(OCSP_BASICRESP *bs); +OCSP_SINGLERESP *OCSP_resp_get0(OCSP_BASICRESP *bs, int idx); +int OCSP_resp_find(OCSP_BASICRESP *bs, OCSP_CERTID *id, int last); +int OCSP_single_get0_status(OCSP_SINGLERESP *single, int *reason, + ASN1_GENERALIZEDTIME **revtime, + ASN1_GENERALIZEDTIME **thisupd, + ASN1_GENERALIZEDTIME **nextupd); +int OCSP_resp_find_status(OCSP_BASICRESP *bs, OCSP_CERTID *id, int *status, + int *reason, + ASN1_GENERALIZEDTIME **revtime, + ASN1_GENERALIZEDTIME **thisupd, + ASN1_GENERALIZEDTIME **nextupd); +int OCSP_check_validity(ASN1_GENERALIZEDTIME *thisupd, + ASN1_GENERALIZEDTIME *nextupd, long sec, long maxsec); + +int OCSP_request_verify(OCSP_REQUEST *req, STACK_OF(X509) *certs, + X509_STORE *store, unsigned long flags); + +int OCSP_parse_url(const char *url, char **phost, char **pport, char **ppath, + int *pssl); + +int OCSP_id_issuer_cmp(OCSP_CERTID *a, OCSP_CERTID *b); +int OCSP_id_cmp(OCSP_CERTID *a, OCSP_CERTID *b); + +int OCSP_request_onereq_count(OCSP_REQUEST *req); +OCSP_ONEREQ *OCSP_request_onereq_get0(OCSP_REQUEST *req, int i); +OCSP_CERTID *OCSP_onereq_get0_id(OCSP_ONEREQ *one); +int OCSP_id_get0_info(ASN1_OCTET_STRING **piNameHash, ASN1_OBJECT **pmd, + ASN1_OCTET_STRING **pikeyHash, + ASN1_INTEGER **pserial, OCSP_CERTID *cid); +int OCSP_request_is_signed(OCSP_REQUEST *req); +OCSP_RESPONSE *OCSP_response_create(int status, OCSP_BASICRESP *bs); +OCSP_SINGLERESP *OCSP_basic_add1_status(OCSP_BASICRESP *rsp, + OCSP_CERTID *cid, + int status, int reason, + ASN1_TIME *revtime, + ASN1_TIME *thisupd, + ASN1_TIME *nextupd); +int OCSP_basic_add1_cert(OCSP_BASICRESP *resp, X509 *cert); +int OCSP_basic_sign(OCSP_BASICRESP *brsp, + X509 *signer, EVP_PKEY *key, const EVP_MD *dgst, + STACK_OF(X509) *certs, unsigned long flags); + +X509_EXTENSION *OCSP_crlID_new(char *url, long *n, char *tim); + +X509_EXTENSION *OCSP_accept_responses_new(char **oids); + +X509_EXTENSION *OCSP_archive_cutoff_new(char *tim); + +X509_EXTENSION *OCSP_url_svcloc_new(X509_NAME *issuer, char **urls); + +int OCSP_REQUEST_get_ext_count(OCSP_REQUEST *x); +int OCSP_REQUEST_get_ext_by_NID(OCSP_REQUEST *x, int nid, int lastpos); +int OCSP_REQUEST_get_ext_by_OBJ(OCSP_REQUEST *x, ASN1_OBJECT *obj, + int lastpos); +int OCSP_REQUEST_get_ext_by_critical(OCSP_REQUEST *x, int crit, int lastpos); +X509_EXTENSION *OCSP_REQUEST_get_ext(OCSP_REQUEST *x, int loc); +X509_EXTENSION *OCSP_REQUEST_delete_ext(OCSP_REQUEST *x, int loc); +void *OCSP_REQUEST_get1_ext_d2i(OCSP_REQUEST *x, int nid, int *crit, + int *idx); +int OCSP_REQUEST_add1_ext_i2d(OCSP_REQUEST *x, int nid, void *value, int crit, + unsigned long flags); +int OCSP_REQUEST_add_ext(OCSP_REQUEST *x, X509_EXTENSION *ex, int loc); + +int OCSP_ONEREQ_get_ext_count(OCSP_ONEREQ *x); +int OCSP_ONEREQ_get_ext_by_NID(OCSP_ONEREQ *x, int nid, int lastpos); +int OCSP_ONEREQ_get_ext_by_OBJ(OCSP_ONEREQ *x, ASN1_OBJECT *obj, int lastpos); +int OCSP_ONEREQ_get_ext_by_critical(OCSP_ONEREQ *x, int crit, int lastpos); +X509_EXTENSION *OCSP_ONEREQ_get_ext(OCSP_ONEREQ *x, int loc); +X509_EXTENSION *OCSP_ONEREQ_delete_ext(OCSP_ONEREQ *x, int loc); +void *OCSP_ONEREQ_get1_ext_d2i(OCSP_ONEREQ *x, int nid, int *crit, int *idx); +int OCSP_ONEREQ_add1_ext_i2d(OCSP_ONEREQ *x, int nid, void *value, int crit, + unsigned long flags); +int OCSP_ONEREQ_add_ext(OCSP_ONEREQ *x, X509_EXTENSION *ex, int loc); + +int OCSP_BASICRESP_get_ext_count(OCSP_BASICRESP *x); +int OCSP_BASICRESP_get_ext_by_NID(OCSP_BASICRESP *x, int nid, int lastpos); +int OCSP_BASICRESP_get_ext_by_OBJ(OCSP_BASICRESP *x, ASN1_OBJECT *obj, + int lastpos); +int OCSP_BASICRESP_get_ext_by_critical(OCSP_BASICRESP *x, int crit, + int lastpos); +X509_EXTENSION *OCSP_BASICRESP_get_ext(OCSP_BASICRESP *x, int loc); +X509_EXTENSION *OCSP_BASICRESP_delete_ext(OCSP_BASICRESP *x, int loc); +void *OCSP_BASICRESP_get1_ext_d2i(OCSP_BASICRESP *x, int nid, int *crit, + int *idx); +int OCSP_BASICRESP_add1_ext_i2d(OCSP_BASICRESP *x, int nid, void *value, + int crit, unsigned long flags); +int OCSP_BASICRESP_add_ext(OCSP_BASICRESP *x, X509_EXTENSION *ex, int loc); + +int OCSP_SINGLERESP_get_ext_count(OCSP_SINGLERESP *x); +int OCSP_SINGLERESP_get_ext_by_NID(OCSP_SINGLERESP *x, int nid, int lastpos); +int OCSP_SINGLERESP_get_ext_by_OBJ(OCSP_SINGLERESP *x, ASN1_OBJECT *obj, + int lastpos); +int OCSP_SINGLERESP_get_ext_by_critical(OCSP_SINGLERESP *x, int crit, + int lastpos); +X509_EXTENSION *OCSP_SINGLERESP_get_ext(OCSP_SINGLERESP *x, int loc); +X509_EXTENSION *OCSP_SINGLERESP_delete_ext(OCSP_SINGLERESP *x, int loc); +void *OCSP_SINGLERESP_get1_ext_d2i(OCSP_SINGLERESP *x, int nid, int *crit, + int *idx); +int OCSP_SINGLERESP_add1_ext_i2d(OCSP_SINGLERESP *x, int nid, void *value, + int crit, unsigned long flags); +int OCSP_SINGLERESP_add_ext(OCSP_SINGLERESP *x, X509_EXTENSION *ex, int loc); + +DECLARE_ASN1_FUNCTIONS(OCSP_SINGLERESP) +DECLARE_ASN1_FUNCTIONS(OCSP_CERTSTATUS) +DECLARE_ASN1_FUNCTIONS(OCSP_REVOKEDINFO) +DECLARE_ASN1_FUNCTIONS(OCSP_BASICRESP) +DECLARE_ASN1_FUNCTIONS(OCSP_RESPDATA) +DECLARE_ASN1_FUNCTIONS(OCSP_RESPID) +DECLARE_ASN1_FUNCTIONS(OCSP_RESPONSE) +DECLARE_ASN1_FUNCTIONS(OCSP_RESPBYTES) +DECLARE_ASN1_FUNCTIONS(OCSP_ONEREQ) +DECLARE_ASN1_FUNCTIONS(OCSP_CERTID) +DECLARE_ASN1_FUNCTIONS(OCSP_REQUEST) +DECLARE_ASN1_FUNCTIONS(OCSP_SIGNATURE) +DECLARE_ASN1_FUNCTIONS(OCSP_REQINFO) +DECLARE_ASN1_FUNCTIONS(OCSP_CRLID) +DECLARE_ASN1_FUNCTIONS(OCSP_SERVICELOC) + +const char *OCSP_response_status_str(long s); +const char *OCSP_cert_status_str(long s); +const char *OCSP_crl_reason_str(long s); + +int OCSP_REQUEST_print(BIO *bp, OCSP_REQUEST *a, unsigned long flags); +int OCSP_RESPONSE_print(BIO *bp, OCSP_RESPONSE *o, unsigned long flags); + +int OCSP_basic_verify(OCSP_BASICRESP *bs, STACK_OF(X509) *certs, + X509_STORE *st, unsigned long flags); + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_OCSP_strings(void); + +/* Error codes for the OCSP functions. */ + +/* Function codes. */ +# define OCSP_F_ASN1_STRING_ENCODE 100 +# define OCSP_F_D2I_OCSP_NONCE 102 +# define OCSP_F_OCSP_BASIC_ADD1_STATUS 103 +# define OCSP_F_OCSP_BASIC_SIGN 104 +# define OCSP_F_OCSP_BASIC_VERIFY 105 +# define OCSP_F_OCSP_CERT_ID_NEW 101 +# define OCSP_F_OCSP_CHECK_DELEGATED 106 +# define OCSP_F_OCSP_CHECK_IDS 107 +# define OCSP_F_OCSP_CHECK_ISSUER 108 +# define OCSP_F_OCSP_CHECK_VALIDITY 115 +# define OCSP_F_OCSP_MATCH_ISSUERID 109 +# define OCSP_F_OCSP_PARSE_URL 114 +# define OCSP_F_OCSP_REQUEST_SIGN 110 +# define OCSP_F_OCSP_REQUEST_VERIFY 116 +# define OCSP_F_OCSP_RESPONSE_GET1_BASIC 111 +# define OCSP_F_OCSP_SENDREQ_BIO 112 +# define OCSP_F_OCSP_SENDREQ_NBIO 117 +# define OCSP_F_PARSE_HTTP_LINE1 118 +# define OCSP_F_REQUEST_VERIFY 113 + +/* Reason codes. */ +# define OCSP_R_BAD_DATA 100 +# define OCSP_R_CERTIFICATE_VERIFY_ERROR 101 +# define OCSP_R_DIGEST_ERR 102 +# define OCSP_R_ERROR_IN_NEXTUPDATE_FIELD 122 +# define OCSP_R_ERROR_IN_THISUPDATE_FIELD 123 +# define OCSP_R_ERROR_PARSING_URL 121 +# define OCSP_R_MISSING_OCSPSIGNING_USAGE 103 +# define OCSP_R_NEXTUPDATE_BEFORE_THISUPDATE 124 +# define OCSP_R_NOT_BASIC_RESPONSE 104 +# define OCSP_R_NO_CERTIFICATES_IN_CHAIN 105 +# define OCSP_R_NO_CONTENT 106 +# define OCSP_R_NO_PUBLIC_KEY 107 +# define OCSP_R_NO_RESPONSE_DATA 108 +# define OCSP_R_NO_REVOKED_TIME 109 +# define OCSP_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE 110 +# define OCSP_R_REQUEST_NOT_SIGNED 128 +# define OCSP_R_RESPONSE_CONTAINS_NO_REVOCATION_DATA 111 +# define OCSP_R_ROOT_CA_NOT_TRUSTED 112 +# define OCSP_R_SERVER_READ_ERROR 113 +# define OCSP_R_SERVER_RESPONSE_ERROR 114 +# define OCSP_R_SERVER_RESPONSE_PARSE_ERROR 115 +# define OCSP_R_SERVER_WRITE_ERROR 116 +# define OCSP_R_SIGNATURE_FAILURE 117 +# define OCSP_R_SIGNER_CERTIFICATE_NOT_FOUND 118 +# define OCSP_R_STATUS_EXPIRED 125 +# define OCSP_R_STATUS_NOT_YET_VALID 126 +# define OCSP_R_STATUS_TOO_OLD 127 +# define OCSP_R_UNKNOWN_MESSAGE_DIGEST 119 +# define OCSP_R_UNKNOWN_NID 120 +# define OCSP_R_UNSUPPORTED_REQUESTORNAME_TYPE 129 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/ext/openssl-osx/include/nope/pkcs12.h b/ext/openssl-osx/include/nope/pkcs12.h new file mode 100644 index 00000000..a39adf5e --- /dev/null +++ b/ext/openssl-osx/include/nope/pkcs12.h @@ -0,0 +1,342 @@ +/* pkcs12.h */ +/* + * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project + * 1999. + */ +/* ==================================================================== + * Copyright (c) 1999 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_PKCS12_H +# define HEADER_PKCS12_H + +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# define PKCS12_KEY_ID 1 +# define PKCS12_IV_ID 2 +# define PKCS12_MAC_ID 3 + +/* Default iteration count */ +# ifndef PKCS12_DEFAULT_ITER +# define PKCS12_DEFAULT_ITER PKCS5_DEFAULT_ITER +# endif + +# define PKCS12_MAC_KEY_LENGTH 20 + +# define PKCS12_SALT_LEN 8 + +/* Uncomment out next line for unicode password and names, otherwise ASCII */ + +/* + * #define PBE_UNICODE + */ + +# ifdef PBE_UNICODE +# define PKCS12_key_gen PKCS12_key_gen_uni +# define PKCS12_add_friendlyname PKCS12_add_friendlyname_uni +# else +# define PKCS12_key_gen PKCS12_key_gen_asc +# define PKCS12_add_friendlyname PKCS12_add_friendlyname_asc +# endif + +/* MS key usage constants */ + +# define KEY_EX 0x10 +# define KEY_SIG 0x80 + +typedef struct { + X509_SIG *dinfo; + ASN1_OCTET_STRING *salt; + ASN1_INTEGER *iter; /* defaults to 1 */ +} PKCS12_MAC_DATA; + +typedef struct { + ASN1_INTEGER *version; + PKCS12_MAC_DATA *mac; + PKCS7 *authsafes; +} PKCS12; + +typedef struct { + ASN1_OBJECT *type; + union { + struct pkcs12_bag_st *bag; /* secret, crl and certbag */ + struct pkcs8_priv_key_info_st *keybag; /* keybag */ + X509_SIG *shkeybag; /* shrouded key bag */ + STACK_OF(PKCS12_SAFEBAG) *safes; + ASN1_TYPE *other; + } value; + STACK_OF(X509_ATTRIBUTE) *attrib; +} PKCS12_SAFEBAG; + +DECLARE_STACK_OF(PKCS12_SAFEBAG) +DECLARE_ASN1_SET_OF(PKCS12_SAFEBAG) +DECLARE_PKCS12_STACK_OF(PKCS12_SAFEBAG) + +typedef struct pkcs12_bag_st { + ASN1_OBJECT *type; + union { + ASN1_OCTET_STRING *x509cert; + ASN1_OCTET_STRING *x509crl; + ASN1_OCTET_STRING *octet; + ASN1_IA5STRING *sdsicert; + ASN1_TYPE *other; /* Secret or other bag */ + } value; +} PKCS12_BAGS; + +# define PKCS12_ERROR 0 +# define PKCS12_OK 1 + +/* Compatibility macros */ + +# define M_PKCS12_x5092certbag PKCS12_x5092certbag +# define M_PKCS12_x509crl2certbag PKCS12_x509crl2certbag + +# define M_PKCS12_certbag2x509 PKCS12_certbag2x509 +# define M_PKCS12_certbag2x509crl PKCS12_certbag2x509crl + +# define M_PKCS12_unpack_p7data PKCS12_unpack_p7data +# define M_PKCS12_pack_authsafes PKCS12_pack_authsafes +# define M_PKCS12_unpack_authsafes PKCS12_unpack_authsafes +# define M_PKCS12_unpack_p7encdata PKCS12_unpack_p7encdata + +# define M_PKCS12_decrypt_skey PKCS12_decrypt_skey +# define M_PKCS8_decrypt PKCS8_decrypt + +# define M_PKCS12_bag_type(bg) OBJ_obj2nid((bg)->type) +# define M_PKCS12_cert_bag_type(bg) OBJ_obj2nid((bg)->value.bag->type) +# define M_PKCS12_crl_bag_type M_PKCS12_cert_bag_type + +# define PKCS12_get_attr(bag, attr_nid) \ + PKCS12_get_attr_gen(bag->attrib, attr_nid) + +# define PKCS8_get_attr(p8, attr_nid) \ + PKCS12_get_attr_gen(p8->attributes, attr_nid) + +# define PKCS12_mac_present(p12) ((p12)->mac ? 1 : 0) + +PKCS12_SAFEBAG *PKCS12_x5092certbag(X509 *x509); +PKCS12_SAFEBAG *PKCS12_x509crl2certbag(X509_CRL *crl); +X509 *PKCS12_certbag2x509(PKCS12_SAFEBAG *bag); +X509_CRL *PKCS12_certbag2x509crl(PKCS12_SAFEBAG *bag); + +PKCS12_SAFEBAG *PKCS12_item_pack_safebag(void *obj, const ASN1_ITEM *it, + int nid1, int nid2); +PKCS12_SAFEBAG *PKCS12_MAKE_KEYBAG(PKCS8_PRIV_KEY_INFO *p8); +PKCS8_PRIV_KEY_INFO *PKCS8_decrypt(X509_SIG *p8, const char *pass, + int passlen); +PKCS8_PRIV_KEY_INFO *PKCS12_decrypt_skey(PKCS12_SAFEBAG *bag, + const char *pass, int passlen); +X509_SIG *PKCS8_encrypt(int pbe_nid, const EVP_CIPHER *cipher, + const char *pass, int passlen, unsigned char *salt, + int saltlen, int iter, PKCS8_PRIV_KEY_INFO *p8); +PKCS12_SAFEBAG *PKCS12_MAKE_SHKEYBAG(int pbe_nid, const char *pass, + int passlen, unsigned char *salt, + int saltlen, int iter, + PKCS8_PRIV_KEY_INFO *p8); +PKCS7 *PKCS12_pack_p7data(STACK_OF(PKCS12_SAFEBAG) *sk); +STACK_OF(PKCS12_SAFEBAG) *PKCS12_unpack_p7data(PKCS7 *p7); +PKCS7 *PKCS12_pack_p7encdata(int pbe_nid, const char *pass, int passlen, + unsigned char *salt, int saltlen, int iter, + STACK_OF(PKCS12_SAFEBAG) *bags); +STACK_OF(PKCS12_SAFEBAG) *PKCS12_unpack_p7encdata(PKCS7 *p7, const char *pass, + int passlen); + +int PKCS12_pack_authsafes(PKCS12 *p12, STACK_OF(PKCS7) *safes); +STACK_OF(PKCS7) *PKCS12_unpack_authsafes(PKCS12 *p12); + +int PKCS12_add_localkeyid(PKCS12_SAFEBAG *bag, unsigned char *name, + int namelen); +int PKCS12_add_friendlyname_asc(PKCS12_SAFEBAG *bag, const char *name, + int namelen); +int PKCS12_add_CSPName_asc(PKCS12_SAFEBAG *bag, const char *name, + int namelen); +int PKCS12_add_friendlyname_uni(PKCS12_SAFEBAG *bag, + const unsigned char *name, int namelen); +int PKCS8_add_keyusage(PKCS8_PRIV_KEY_INFO *p8, int usage); +ASN1_TYPE *PKCS12_get_attr_gen(STACK_OF(X509_ATTRIBUTE) *attrs, int attr_nid); +char *PKCS12_get_friendlyname(PKCS12_SAFEBAG *bag); +unsigned char *PKCS12_pbe_crypt(X509_ALGOR *algor, const char *pass, + int passlen, unsigned char *in, int inlen, + unsigned char **data, int *datalen, + int en_de); +void *PKCS12_item_decrypt_d2i(X509_ALGOR *algor, const ASN1_ITEM *it, + const char *pass, int passlen, + ASN1_OCTET_STRING *oct, int zbuf); +ASN1_OCTET_STRING *PKCS12_item_i2d_encrypt(X509_ALGOR *algor, + const ASN1_ITEM *it, + const char *pass, int passlen, + void *obj, int zbuf); +PKCS12 *PKCS12_init(int mode); +int PKCS12_key_gen_asc(const char *pass, int passlen, unsigned char *salt, + int saltlen, int id, int iter, int n, + unsigned char *out, const EVP_MD *md_type); +int PKCS12_key_gen_uni(unsigned char *pass, int passlen, unsigned char *salt, + int saltlen, int id, int iter, int n, + unsigned char *out, const EVP_MD *md_type); +int PKCS12_PBE_keyivgen(EVP_CIPHER_CTX *ctx, const char *pass, int passlen, + ASN1_TYPE *param, const EVP_CIPHER *cipher, + const EVP_MD *md_type, int en_de); +int PKCS12_gen_mac(PKCS12 *p12, const char *pass, int passlen, + unsigned char *mac, unsigned int *maclen); +int PKCS12_verify_mac(PKCS12 *p12, const char *pass, int passlen); +int PKCS12_set_mac(PKCS12 *p12, const char *pass, int passlen, + unsigned char *salt, int saltlen, int iter, + const EVP_MD *md_type); +int PKCS12_setup_mac(PKCS12 *p12, int iter, unsigned char *salt, + int saltlen, const EVP_MD *md_type); +unsigned char *OPENSSL_asc2uni(const char *asc, int asclen, + unsigned char **uni, int *unilen); +char *OPENSSL_uni2asc(unsigned char *uni, int unilen); + +DECLARE_ASN1_FUNCTIONS(PKCS12) +DECLARE_ASN1_FUNCTIONS(PKCS12_MAC_DATA) +DECLARE_ASN1_FUNCTIONS(PKCS12_SAFEBAG) +DECLARE_ASN1_FUNCTIONS(PKCS12_BAGS) + +DECLARE_ASN1_ITEM(PKCS12_SAFEBAGS) +DECLARE_ASN1_ITEM(PKCS12_AUTHSAFES) + +void PKCS12_PBE_add(void); +int PKCS12_parse(PKCS12 *p12, const char *pass, EVP_PKEY **pkey, X509 **cert, + STACK_OF(X509) **ca); +PKCS12 *PKCS12_create(char *pass, char *name, EVP_PKEY *pkey, X509 *cert, + STACK_OF(X509) *ca, int nid_key, int nid_cert, int iter, + int mac_iter, int keytype); + +PKCS12_SAFEBAG *PKCS12_add_cert(STACK_OF(PKCS12_SAFEBAG) **pbags, X509 *cert); +PKCS12_SAFEBAG *PKCS12_add_key(STACK_OF(PKCS12_SAFEBAG) **pbags, + EVP_PKEY *key, int key_usage, int iter, + int key_nid, char *pass); +int PKCS12_add_safe(STACK_OF(PKCS7) **psafes, STACK_OF(PKCS12_SAFEBAG) *bags, + int safe_nid, int iter, char *pass); +PKCS12 *PKCS12_add_safes(STACK_OF(PKCS7) *safes, int p7_nid); + +int i2d_PKCS12_bio(BIO *bp, PKCS12 *p12); +int i2d_PKCS12_fp(FILE *fp, PKCS12 *p12); +PKCS12 *d2i_PKCS12_bio(BIO *bp, PKCS12 **p12); +PKCS12 *d2i_PKCS12_fp(FILE *fp, PKCS12 **p12); +int PKCS12_newpass(PKCS12 *p12, char *oldpass, char *newpass); + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_PKCS12_strings(void); + +/* Error codes for the PKCS12 functions. */ + +/* Function codes. */ +# define PKCS12_F_PARSE_BAG 129 +# define PKCS12_F_PARSE_BAGS 103 +# define PKCS12_F_PKCS12_ADD_FRIENDLYNAME 100 +# define PKCS12_F_PKCS12_ADD_FRIENDLYNAME_ASC 127 +# define PKCS12_F_PKCS12_ADD_FRIENDLYNAME_UNI 102 +# define PKCS12_F_PKCS12_ADD_LOCALKEYID 104 +# define PKCS12_F_PKCS12_CREATE 105 +# define PKCS12_F_PKCS12_GEN_MAC 107 +# define PKCS12_F_PKCS12_INIT 109 +# define PKCS12_F_PKCS12_ITEM_DECRYPT_D2I 106 +# define PKCS12_F_PKCS12_ITEM_I2D_ENCRYPT 108 +# define PKCS12_F_PKCS12_ITEM_PACK_SAFEBAG 117 +# define PKCS12_F_PKCS12_KEY_GEN_ASC 110 +# define PKCS12_F_PKCS12_KEY_GEN_UNI 111 +# define PKCS12_F_PKCS12_MAKE_KEYBAG 112 +# define PKCS12_F_PKCS12_MAKE_SHKEYBAG 113 +# define PKCS12_F_PKCS12_NEWPASS 128 +# define PKCS12_F_PKCS12_PACK_P7DATA 114 +# define PKCS12_F_PKCS12_PACK_P7ENCDATA 115 +# define PKCS12_F_PKCS12_PARSE 118 +# define PKCS12_F_PKCS12_PBE_CRYPT 119 +# define PKCS12_F_PKCS12_PBE_KEYIVGEN 120 +# define PKCS12_F_PKCS12_SETUP_MAC 122 +# define PKCS12_F_PKCS12_SET_MAC 123 +# define PKCS12_F_PKCS12_UNPACK_AUTHSAFES 130 +# define PKCS12_F_PKCS12_UNPACK_P7DATA 131 +# define PKCS12_F_PKCS12_VERIFY_MAC 126 +# define PKCS12_F_PKCS8_ADD_KEYUSAGE 124 +# define PKCS12_F_PKCS8_ENCRYPT 125 + +/* Reason codes. */ +# define PKCS12_R_CANT_PACK_STRUCTURE 100 +# define PKCS12_R_CONTENT_TYPE_NOT_DATA 121 +# define PKCS12_R_DECODE_ERROR 101 +# define PKCS12_R_ENCODE_ERROR 102 +# define PKCS12_R_ENCRYPT_ERROR 103 +# define PKCS12_R_ERROR_SETTING_ENCRYPTED_DATA_TYPE 120 +# define PKCS12_R_INVALID_NULL_ARGUMENT 104 +# define PKCS12_R_INVALID_NULL_PKCS12_POINTER 105 +# define PKCS12_R_IV_GEN_ERROR 106 +# define PKCS12_R_KEY_GEN_ERROR 107 +# define PKCS12_R_MAC_ABSENT 108 +# define PKCS12_R_MAC_GENERATION_ERROR 109 +# define PKCS12_R_MAC_SETUP_ERROR 110 +# define PKCS12_R_MAC_STRING_SET_ERROR 111 +# define PKCS12_R_MAC_VERIFY_ERROR 112 +# define PKCS12_R_MAC_VERIFY_FAILURE 113 +# define PKCS12_R_PARSE_ERROR 114 +# define PKCS12_R_PKCS12_ALGOR_CIPHERINIT_ERROR 115 +# define PKCS12_R_PKCS12_CIPHERFINAL_ERROR 116 +# define PKCS12_R_PKCS12_PBE_CRYPT_ERROR 117 +# define PKCS12_R_UNKNOWN_DIGEST_ALGORITHM 118 +# define PKCS12_R_UNSUPPORTED_PKCS12_MODE 119 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/ext/openssl-osx/include/nope/rand.h b/ext/openssl-osx/include/nope/rand.h new file mode 100644 index 00000000..2553afda --- /dev/null +++ b/ext/openssl-osx/include/nope/rand.h @@ -0,0 +1,150 @@ +/* crypto/rand/rand.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_RAND_H +# define HEADER_RAND_H + +# include +# include +# include + +# if defined(OPENSSL_SYS_WINDOWS) +# include +# endif + +#ifdef __cplusplus +extern "C" { +#endif + +# if defined(OPENSSL_FIPS) +# define FIPS_RAND_SIZE_T size_t +# endif + +/* Already defined in ossl_typ.h */ +/* typedef struct rand_meth_st RAND_METHOD; */ + +struct rand_meth_st { + void (*seed) (const void *buf, int num); + int (*bytes) (unsigned char *buf, int num); + void (*cleanup) (void); + void (*add) (const void *buf, int num, double entropy); + int (*pseudorand) (unsigned char *buf, int num); + int (*status) (void); +}; + +# ifdef BN_DEBUG +extern int rand_predictable; +# endif + +int RAND_set_rand_method(const RAND_METHOD *meth); +const RAND_METHOD *RAND_get_rand_method(void); +# ifndef OPENSSL_NO_ENGINE +int RAND_set_rand_engine(ENGINE *engine); +# endif +RAND_METHOD *RAND_SSLeay(void); +void RAND_cleanup(void); +int RAND_bytes(unsigned char *buf, int num); +int RAND_pseudo_bytes(unsigned char *buf, int num); +void RAND_seed(const void *buf, int num); +void RAND_add(const void *buf, int num, double entropy); +int RAND_load_file(const char *file, long max_bytes); +int RAND_write_file(const char *file); +const char *RAND_file_name(char *file, size_t num); +int RAND_status(void); +int RAND_query_egd_bytes(const char *path, unsigned char *buf, int bytes); +int RAND_egd(const char *path); +int RAND_egd_bytes(const char *path, int bytes); +int RAND_poll(void); + +# if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_WIN32) + +void RAND_screen(void); +int RAND_event(UINT, WPARAM, LPARAM); + +# endif + +# ifdef OPENSSL_FIPS +void RAND_set_fips_drbg_type(int type, int flags); +int RAND_init_fips(void); +# endif + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_RAND_strings(void); + +/* Error codes for the RAND functions. */ + +/* Function codes. */ +# define RAND_F_RAND_GET_RAND_METHOD 101 +# define RAND_F_RAND_INIT_FIPS 102 +# define RAND_F_SSLEAY_RAND_BYTES 100 + +/* Reason codes. */ +# define RAND_R_DUAL_EC_DRBG_DISABLED 104 +# define RAND_R_ERROR_INITIALISING_DRBG 102 +# define RAND_R_ERROR_INSTANTIATING_DRBG 103 +# define RAND_R_NO_FIPS_RANDOM_METHOD_SET 101 +# define RAND_R_PRNG_NOT_SEEDED 100 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/ext/openssl-osx/include/nope/rc2.h b/ext/openssl-osx/include/nope/rc2.h new file mode 100644 index 00000000..29d02d73 --- /dev/null +++ b/ext/openssl-osx/include/nope/rc2.h @@ -0,0 +1,103 @@ +/* crypto/rc2/rc2.h */ +/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_RC2_H +# define HEADER_RC2_H + +# include /* OPENSSL_NO_RC2, RC2_INT */ +# ifdef OPENSSL_NO_RC2 +# error RC2 is disabled. +# endif + +# define RC2_ENCRYPT 1 +# define RC2_DECRYPT 0 + +# define RC2_BLOCK 8 +# define RC2_KEY_LENGTH 16 + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct rc2_key_st { + RC2_INT data[64]; +} RC2_KEY; + +# ifdef OPENSSL_FIPS +void private_RC2_set_key(RC2_KEY *key, int len, const unsigned char *data, + int bits); +# endif +void RC2_set_key(RC2_KEY *key, int len, const unsigned char *data, int bits); +void RC2_ecb_encrypt(const unsigned char *in, unsigned char *out, + RC2_KEY *key, int enc); +void RC2_encrypt(unsigned long *data, RC2_KEY *key); +void RC2_decrypt(unsigned long *data, RC2_KEY *key); +void RC2_cbc_encrypt(const unsigned char *in, unsigned char *out, long length, + RC2_KEY *ks, unsigned char *iv, int enc); +void RC2_cfb64_encrypt(const unsigned char *in, unsigned char *out, + long length, RC2_KEY *schedule, unsigned char *ivec, + int *num, int enc); +void RC2_ofb64_encrypt(const unsigned char *in, unsigned char *out, + long length, RC2_KEY *schedule, unsigned char *ivec, + int *num); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ext/openssl-osx/include/nope/rc4.h b/ext/openssl-osx/include/nope/rc4.h new file mode 100644 index 00000000..39162b16 --- /dev/null +++ b/ext/openssl-osx/include/nope/rc4.h @@ -0,0 +1,88 @@ +/* crypto/rc4/rc4.h */ +/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_RC4_H +# define HEADER_RC4_H + +# include /* OPENSSL_NO_RC4, RC4_INT */ +# ifdef OPENSSL_NO_RC4 +# error RC4 is disabled. +# endif + +# include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct rc4_key_st { + RC4_INT x, y; + RC4_INT data[256]; +} RC4_KEY; + +const char *RC4_options(void); +void RC4_set_key(RC4_KEY *key, int len, const unsigned char *data); +void private_RC4_set_key(RC4_KEY *key, int len, const unsigned char *data); +void RC4(RC4_KEY *key, size_t len, const unsigned char *indata, + unsigned char *outdata); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ext/openssl-osx/include/nope/ripemd.h b/ext/openssl-osx/include/nope/ripemd.h new file mode 100644 index 00000000..b88ef25e --- /dev/null +++ b/ext/openssl-osx/include/nope/ripemd.h @@ -0,0 +1,105 @@ +/* crypto/ripemd/ripemd.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_RIPEMD_H +# define HEADER_RIPEMD_H + +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# ifdef OPENSSL_NO_RIPEMD +# error RIPEMD is disabled. +# endif + +# if defined(__LP32__) +# define RIPEMD160_LONG unsigned long +# elif defined(OPENSSL_SYS_CRAY) || defined(__ILP64__) +# define RIPEMD160_LONG unsigned long +# define RIPEMD160_LONG_LOG2 3 +# else +# define RIPEMD160_LONG unsigned int +# endif + +# define RIPEMD160_CBLOCK 64 +# define RIPEMD160_LBLOCK (RIPEMD160_CBLOCK/4) +# define RIPEMD160_DIGEST_LENGTH 20 + +typedef struct RIPEMD160state_st { + RIPEMD160_LONG A, B, C, D, E; + RIPEMD160_LONG Nl, Nh; + RIPEMD160_LONG data[RIPEMD160_LBLOCK]; + unsigned int num; +} RIPEMD160_CTX; + +# ifdef OPENSSL_FIPS +int private_RIPEMD160_Init(RIPEMD160_CTX *c); +# endif +int RIPEMD160_Init(RIPEMD160_CTX *c); +int RIPEMD160_Update(RIPEMD160_CTX *c, const void *data, size_t len); +int RIPEMD160_Final(unsigned char *md, RIPEMD160_CTX *c); +unsigned char *RIPEMD160(const unsigned char *d, size_t n, unsigned char *md); +void RIPEMD160_Transform(RIPEMD160_CTX *c, const unsigned char *b); +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ext/openssl-osx/include/nope/seed.h b/ext/openssl-osx/include/nope/seed.h new file mode 100644 index 00000000..8cbf0d92 --- /dev/null +++ b/ext/openssl-osx/include/nope/seed.h @@ -0,0 +1,149 @@ +/* + * Copyright (c) 2007 KISA(Korea Information Security Agency). All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Neither the name of author nor the names of its contributors may + * be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ +/* ==================================================================== + * Copyright (c) 1998-2007 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_SEED_H +# define HEADER_SEED_H + +# include +# include +# include + +# ifdef OPENSSL_NO_SEED +# error SEED is disabled. +# endif + +/* look whether we need 'long' to get 32 bits */ +# ifdef AES_LONG +# ifndef SEED_LONG +# define SEED_LONG 1 +# endif +# endif + +# if !defined(NO_SYS_TYPES_H) +# include +# endif + +# define SEED_BLOCK_SIZE 16 +# define SEED_KEY_LENGTH 16 + + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct seed_key_st { +# ifdef SEED_LONG + unsigned long data[32]; +# else + unsigned int data[32]; +# endif +} SEED_KEY_SCHEDULE; + +# ifdef OPENSSL_FIPS +void private_SEED_set_key(const unsigned char rawkey[SEED_KEY_LENGTH], + SEED_KEY_SCHEDULE *ks); +# endif +void SEED_set_key(const unsigned char rawkey[SEED_KEY_LENGTH], + SEED_KEY_SCHEDULE *ks); + +void SEED_encrypt(const unsigned char s[SEED_BLOCK_SIZE], + unsigned char d[SEED_BLOCK_SIZE], + const SEED_KEY_SCHEDULE *ks); +void SEED_decrypt(const unsigned char s[SEED_BLOCK_SIZE], + unsigned char d[SEED_BLOCK_SIZE], + const SEED_KEY_SCHEDULE *ks); + +void SEED_ecb_encrypt(const unsigned char *in, unsigned char *out, + const SEED_KEY_SCHEDULE *ks, int enc); +void SEED_cbc_encrypt(const unsigned char *in, unsigned char *out, size_t len, + const SEED_KEY_SCHEDULE *ks, + unsigned char ivec[SEED_BLOCK_SIZE], int enc); +void SEED_cfb128_encrypt(const unsigned char *in, unsigned char *out, + size_t len, const SEED_KEY_SCHEDULE *ks, + unsigned char ivec[SEED_BLOCK_SIZE], int *num, + int enc); +void SEED_ofb128_encrypt(const unsigned char *in, unsigned char *out, + size_t len, const SEED_KEY_SCHEDULE *ks, + unsigned char ivec[SEED_BLOCK_SIZE], int *num); + +#ifdef __cplusplus +} +#endif + +#endif /* HEADER_SEED_H */ diff --git a/ext/openssl-osx/include/nope/srp.h b/ext/openssl-osx/include/nope/srp.h new file mode 100644 index 00000000..d072536f --- /dev/null +++ b/ext/openssl-osx/include/nope/srp.h @@ -0,0 +1,169 @@ +/* crypto/srp/srp.h */ +/* + * Written by Christophe Renou (christophe.renou@edelweb.fr) with the + * precious help of Peter Sylvester (peter.sylvester@edelweb.fr) for the + * EdelKey project and contributed to the OpenSSL project 2004. + */ +/* ==================================================================== + * Copyright (c) 2004 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +#ifndef __SRP_H__ +# define __SRP_H__ + +# ifndef OPENSSL_NO_SRP + +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# include +# include +# include + +typedef struct SRP_gN_cache_st { + char *b64_bn; + BIGNUM *bn; +} SRP_gN_cache; + + +DECLARE_STACK_OF(SRP_gN_cache) + +typedef struct SRP_user_pwd_st { + char *id; + BIGNUM *s; + BIGNUM *v; + const BIGNUM *g; + const BIGNUM *N; + char *info; +} SRP_user_pwd; + +DECLARE_STACK_OF(SRP_user_pwd) + +typedef struct SRP_VBASE_st { + STACK_OF(SRP_user_pwd) *users_pwd; + STACK_OF(SRP_gN_cache) *gN_cache; +/* to simulate a user */ + char *seed_key; + BIGNUM *default_g; + BIGNUM *default_N; +} SRP_VBASE; + +/* + * Structure interne pour retenir les couples N et g + */ +typedef struct SRP_gN_st { + char *id; + BIGNUM *g; + BIGNUM *N; +} SRP_gN; + +DECLARE_STACK_OF(SRP_gN) + +SRP_VBASE *SRP_VBASE_new(char *seed_key); +int SRP_VBASE_free(SRP_VBASE *vb); +int SRP_VBASE_init(SRP_VBASE *vb, char *verifier_file); +SRP_user_pwd *SRP_VBASE_get_by_user(SRP_VBASE *vb, char *username); +char *SRP_create_verifier(const char *user, const char *pass, char **salt, + char **verifier, const char *N, const char *g); +int SRP_create_verifier_BN(const char *user, const char *pass, BIGNUM **salt, + BIGNUM **verifier, BIGNUM *N, BIGNUM *g); + +# define SRP_NO_ERROR 0 +# define SRP_ERR_VBASE_INCOMPLETE_FILE 1 +# define SRP_ERR_VBASE_BN_LIB 2 +# define SRP_ERR_OPEN_FILE 3 +# define SRP_ERR_MEMORY 4 + +# define DB_srptype 0 +# define DB_srpverifier 1 +# define DB_srpsalt 2 +# define DB_srpid 3 +# define DB_srpgN 4 +# define DB_srpinfo 5 +# undef DB_NUMBER +# define DB_NUMBER 6 + +# define DB_SRP_INDEX 'I' +# define DB_SRP_VALID 'V' +# define DB_SRP_REVOKED 'R' +# define DB_SRP_MODIF 'v' + +/* see srp.c */ +char *SRP_check_known_gN_param(BIGNUM *g, BIGNUM *N); +SRP_gN *SRP_get_default_gN(const char *id); + +/* server side .... */ +BIGNUM *SRP_Calc_server_key(BIGNUM *A, BIGNUM *v, BIGNUM *u, BIGNUM *b, + BIGNUM *N); +BIGNUM *SRP_Calc_B(BIGNUM *b, BIGNUM *N, BIGNUM *g, BIGNUM *v); +int SRP_Verify_A_mod_N(BIGNUM *A, BIGNUM *N); +BIGNUM *SRP_Calc_u(BIGNUM *A, BIGNUM *B, BIGNUM *N); + +/* client side .... */ +BIGNUM *SRP_Calc_x(BIGNUM *s, const char *user, const char *pass); +BIGNUM *SRP_Calc_A(BIGNUM *a, BIGNUM *N, BIGNUM *g); +BIGNUM *SRP_Calc_client_key(BIGNUM *N, BIGNUM *B, BIGNUM *g, BIGNUM *x, + BIGNUM *a, BIGNUM *u); +int SRP_Verify_B_mod_N(BIGNUM *B, BIGNUM *N); + +# define SRP_MINIMAL_N 1024 + +#ifdef __cplusplus +} +#endif + +# endif +#endif diff --git a/ext/openssl-osx/include/nope/ts.h b/ext/openssl-osx/include/nope/ts.h new file mode 100644 index 00000000..16eccbb3 --- /dev/null +++ b/ext/openssl-osx/include/nope/ts.h @@ -0,0 +1,862 @@ +/* crypto/ts/ts.h */ +/* + * Written by Zoltan Glozik (zglozik@opentsa.org) for the OpenSSL project + * 2002, 2003, 2004. + */ +/* ==================================================================== + * Copyright (c) 2006 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_TS_H +# define HEADER_TS_H + +# include +# include +# ifndef OPENSSL_NO_BUFFER +# include +# endif +# ifndef OPENSSL_NO_EVP +# include +# endif +# ifndef OPENSSL_NO_BIO +# include +# endif +# include +# include +# include + +# ifndef OPENSSL_NO_RSA +# include +# endif + +# ifndef OPENSSL_NO_DSA +# include +# endif + +# ifndef OPENSSL_NO_DH +# include +# endif + +#ifdef __cplusplus +extern "C" { +#endif + +# ifdef WIN32 +/* Under Win32 this is defined in wincrypt.h */ +# undef X509_NAME +# endif + +# include +# include + +/*- +MessageImprint ::= SEQUENCE { + hashAlgorithm AlgorithmIdentifier, + hashedMessage OCTET STRING } +*/ + +typedef struct TS_msg_imprint_st { + X509_ALGOR *hash_algo; + ASN1_OCTET_STRING *hashed_msg; +} TS_MSG_IMPRINT; + +/*- +TimeStampReq ::= SEQUENCE { + version INTEGER { v1(1) }, + messageImprint MessageImprint, + --a hash algorithm OID and the hash value of the data to be + --time-stamped + reqPolicy TSAPolicyId OPTIONAL, + nonce INTEGER OPTIONAL, + certReq BOOLEAN DEFAULT FALSE, + extensions [0] IMPLICIT Extensions OPTIONAL } +*/ + +typedef struct TS_req_st { + ASN1_INTEGER *version; + TS_MSG_IMPRINT *msg_imprint; + ASN1_OBJECT *policy_id; /* OPTIONAL */ + ASN1_INTEGER *nonce; /* OPTIONAL */ + ASN1_BOOLEAN cert_req; /* DEFAULT FALSE */ + STACK_OF(X509_EXTENSION) *extensions; /* [0] OPTIONAL */ +} TS_REQ; + +/*- +Accuracy ::= SEQUENCE { + seconds INTEGER OPTIONAL, + millis [0] INTEGER (1..999) OPTIONAL, + micros [1] INTEGER (1..999) OPTIONAL } +*/ + +typedef struct TS_accuracy_st { + ASN1_INTEGER *seconds; + ASN1_INTEGER *millis; + ASN1_INTEGER *micros; +} TS_ACCURACY; + +/*- +TSTInfo ::= SEQUENCE { + version INTEGER { v1(1) }, + policy TSAPolicyId, + messageImprint MessageImprint, + -- MUST have the same value as the similar field in + -- TimeStampReq + serialNumber INTEGER, + -- Time-Stamping users MUST be ready to accommodate integers + -- up to 160 bits. + genTime GeneralizedTime, + accuracy Accuracy OPTIONAL, + ordering BOOLEAN DEFAULT FALSE, + nonce INTEGER OPTIONAL, + -- MUST be present if the similar field was present + -- in TimeStampReq. In that case it MUST have the same value. + tsa [0] GeneralName OPTIONAL, + extensions [1] IMPLICIT Extensions OPTIONAL } +*/ + +typedef struct TS_tst_info_st { + ASN1_INTEGER *version; + ASN1_OBJECT *policy_id; + TS_MSG_IMPRINT *msg_imprint; + ASN1_INTEGER *serial; + ASN1_GENERALIZEDTIME *time; + TS_ACCURACY *accuracy; + ASN1_BOOLEAN ordering; + ASN1_INTEGER *nonce; + GENERAL_NAME *tsa; + STACK_OF(X509_EXTENSION) *extensions; +} TS_TST_INFO; + +/*- +PKIStatusInfo ::= SEQUENCE { + status PKIStatus, + statusString PKIFreeText OPTIONAL, + failInfo PKIFailureInfo OPTIONAL } + +From RFC 1510 - section 3.1.1: +PKIFreeText ::= SEQUENCE SIZE (1..MAX) OF UTF8String + -- text encoded as UTF-8 String (note: each UTF8String SHOULD + -- include an RFC 1766 language tag to indicate the language + -- of the contained text) +*/ + +/* Possible values for status. See ts_resp_print.c && ts_resp_verify.c. */ + +# define TS_STATUS_GRANTED 0 +# define TS_STATUS_GRANTED_WITH_MODS 1 +# define TS_STATUS_REJECTION 2 +# define TS_STATUS_WAITING 3 +# define TS_STATUS_REVOCATION_WARNING 4 +# define TS_STATUS_REVOCATION_NOTIFICATION 5 + +/* + * Possible values for failure_info. See ts_resp_print.c && ts_resp_verify.c + */ + +# define TS_INFO_BAD_ALG 0 +# define TS_INFO_BAD_REQUEST 2 +# define TS_INFO_BAD_DATA_FORMAT 5 +# define TS_INFO_TIME_NOT_AVAILABLE 14 +# define TS_INFO_UNACCEPTED_POLICY 15 +# define TS_INFO_UNACCEPTED_EXTENSION 16 +# define TS_INFO_ADD_INFO_NOT_AVAILABLE 17 +# define TS_INFO_SYSTEM_FAILURE 25 + +typedef struct TS_status_info_st { + ASN1_INTEGER *status; + STACK_OF(ASN1_UTF8STRING) *text; + ASN1_BIT_STRING *failure_info; +} TS_STATUS_INFO; + +DECLARE_STACK_OF(ASN1_UTF8STRING) +DECLARE_ASN1_SET_OF(ASN1_UTF8STRING) + +/*- +TimeStampResp ::= SEQUENCE { + status PKIStatusInfo, + timeStampToken TimeStampToken OPTIONAL } +*/ + +typedef struct TS_resp_st { + TS_STATUS_INFO *status_info; + PKCS7 *token; + TS_TST_INFO *tst_info; +} TS_RESP; + +/* The structure below would belong to the ESS component. */ + +/*- +IssuerSerial ::= SEQUENCE { + issuer GeneralNames, + serialNumber CertificateSerialNumber + } +*/ + +typedef struct ESS_issuer_serial { + STACK_OF(GENERAL_NAME) *issuer; + ASN1_INTEGER *serial; +} ESS_ISSUER_SERIAL; + +/*- +ESSCertID ::= SEQUENCE { + certHash Hash, + issuerSerial IssuerSerial OPTIONAL +} +*/ + +typedef struct ESS_cert_id { + ASN1_OCTET_STRING *hash; /* Always SHA-1 digest. */ + ESS_ISSUER_SERIAL *issuer_serial; +} ESS_CERT_ID; + +DECLARE_STACK_OF(ESS_CERT_ID) +DECLARE_ASN1_SET_OF(ESS_CERT_ID) + +/*- +SigningCertificate ::= SEQUENCE { + certs SEQUENCE OF ESSCertID, + policies SEQUENCE OF PolicyInformation OPTIONAL +} +*/ + +typedef struct ESS_signing_cert { + STACK_OF(ESS_CERT_ID) *cert_ids; + STACK_OF(POLICYINFO) *policy_info; +} ESS_SIGNING_CERT; + +TS_REQ *TS_REQ_new(void); +void TS_REQ_free(TS_REQ *a); +int i2d_TS_REQ(const TS_REQ *a, unsigned char **pp); +TS_REQ *d2i_TS_REQ(TS_REQ **a, const unsigned char **pp, long length); + +TS_REQ *TS_REQ_dup(TS_REQ *a); + +TS_REQ *d2i_TS_REQ_fp(FILE *fp, TS_REQ **a); +int i2d_TS_REQ_fp(FILE *fp, TS_REQ *a); +TS_REQ *d2i_TS_REQ_bio(BIO *fp, TS_REQ **a); +int i2d_TS_REQ_bio(BIO *fp, TS_REQ *a); + +TS_MSG_IMPRINT *TS_MSG_IMPRINT_new(void); +void TS_MSG_IMPRINT_free(TS_MSG_IMPRINT *a); +int i2d_TS_MSG_IMPRINT(const TS_MSG_IMPRINT *a, unsigned char **pp); +TS_MSG_IMPRINT *d2i_TS_MSG_IMPRINT(TS_MSG_IMPRINT **a, + const unsigned char **pp, long length); + +TS_MSG_IMPRINT *TS_MSG_IMPRINT_dup(TS_MSG_IMPRINT *a); + +TS_MSG_IMPRINT *d2i_TS_MSG_IMPRINT_fp(FILE *fp, TS_MSG_IMPRINT **a); +int i2d_TS_MSG_IMPRINT_fp(FILE *fp, TS_MSG_IMPRINT *a); +TS_MSG_IMPRINT *d2i_TS_MSG_IMPRINT_bio(BIO *fp, TS_MSG_IMPRINT **a); +int i2d_TS_MSG_IMPRINT_bio(BIO *fp, TS_MSG_IMPRINT *a); + +TS_RESP *TS_RESP_new(void); +void TS_RESP_free(TS_RESP *a); +int i2d_TS_RESP(const TS_RESP *a, unsigned char **pp); +TS_RESP *d2i_TS_RESP(TS_RESP **a, const unsigned char **pp, long length); +TS_TST_INFO *PKCS7_to_TS_TST_INFO(PKCS7 *token); +TS_RESP *TS_RESP_dup(TS_RESP *a); + +TS_RESP *d2i_TS_RESP_fp(FILE *fp, TS_RESP **a); +int i2d_TS_RESP_fp(FILE *fp, TS_RESP *a); +TS_RESP *d2i_TS_RESP_bio(BIO *fp, TS_RESP **a); +int i2d_TS_RESP_bio(BIO *fp, TS_RESP *a); + +TS_STATUS_INFO *TS_STATUS_INFO_new(void); +void TS_STATUS_INFO_free(TS_STATUS_INFO *a); +int i2d_TS_STATUS_INFO(const TS_STATUS_INFO *a, unsigned char **pp); +TS_STATUS_INFO *d2i_TS_STATUS_INFO(TS_STATUS_INFO **a, + const unsigned char **pp, long length); +TS_STATUS_INFO *TS_STATUS_INFO_dup(TS_STATUS_INFO *a); + +TS_TST_INFO *TS_TST_INFO_new(void); +void TS_TST_INFO_free(TS_TST_INFO *a); +int i2d_TS_TST_INFO(const TS_TST_INFO *a, unsigned char **pp); +TS_TST_INFO *d2i_TS_TST_INFO(TS_TST_INFO **a, const unsigned char **pp, + long length); +TS_TST_INFO *TS_TST_INFO_dup(TS_TST_INFO *a); + +TS_TST_INFO *d2i_TS_TST_INFO_fp(FILE *fp, TS_TST_INFO **a); +int i2d_TS_TST_INFO_fp(FILE *fp, TS_TST_INFO *a); +TS_TST_INFO *d2i_TS_TST_INFO_bio(BIO *fp, TS_TST_INFO **a); +int i2d_TS_TST_INFO_bio(BIO *fp, TS_TST_INFO *a); + +TS_ACCURACY *TS_ACCURACY_new(void); +void TS_ACCURACY_free(TS_ACCURACY *a); +int i2d_TS_ACCURACY(const TS_ACCURACY *a, unsigned char **pp); +TS_ACCURACY *d2i_TS_ACCURACY(TS_ACCURACY **a, const unsigned char **pp, + long length); +TS_ACCURACY *TS_ACCURACY_dup(TS_ACCURACY *a); + +ESS_ISSUER_SERIAL *ESS_ISSUER_SERIAL_new(void); +void ESS_ISSUER_SERIAL_free(ESS_ISSUER_SERIAL *a); +int i2d_ESS_ISSUER_SERIAL(const ESS_ISSUER_SERIAL *a, unsigned char **pp); +ESS_ISSUER_SERIAL *d2i_ESS_ISSUER_SERIAL(ESS_ISSUER_SERIAL **a, + const unsigned char **pp, + long length); +ESS_ISSUER_SERIAL *ESS_ISSUER_SERIAL_dup(ESS_ISSUER_SERIAL *a); + +ESS_CERT_ID *ESS_CERT_ID_new(void); +void ESS_CERT_ID_free(ESS_CERT_ID *a); +int i2d_ESS_CERT_ID(const ESS_CERT_ID *a, unsigned char **pp); +ESS_CERT_ID *d2i_ESS_CERT_ID(ESS_CERT_ID **a, const unsigned char **pp, + long length); +ESS_CERT_ID *ESS_CERT_ID_dup(ESS_CERT_ID *a); + +ESS_SIGNING_CERT *ESS_SIGNING_CERT_new(void); +void ESS_SIGNING_CERT_free(ESS_SIGNING_CERT *a); +int i2d_ESS_SIGNING_CERT(const ESS_SIGNING_CERT *a, unsigned char **pp); +ESS_SIGNING_CERT *d2i_ESS_SIGNING_CERT(ESS_SIGNING_CERT **a, + const unsigned char **pp, long length); +ESS_SIGNING_CERT *ESS_SIGNING_CERT_dup(ESS_SIGNING_CERT *a); + +void ERR_load_TS_strings(void); + +int TS_REQ_set_version(TS_REQ *a, long version); +long TS_REQ_get_version(const TS_REQ *a); + +int TS_REQ_set_msg_imprint(TS_REQ *a, TS_MSG_IMPRINT *msg_imprint); +TS_MSG_IMPRINT *TS_REQ_get_msg_imprint(TS_REQ *a); + +int TS_MSG_IMPRINT_set_algo(TS_MSG_IMPRINT *a, X509_ALGOR *alg); +X509_ALGOR *TS_MSG_IMPRINT_get_algo(TS_MSG_IMPRINT *a); + +int TS_MSG_IMPRINT_set_msg(TS_MSG_IMPRINT *a, unsigned char *d, int len); +ASN1_OCTET_STRING *TS_MSG_IMPRINT_get_msg(TS_MSG_IMPRINT *a); + +int TS_REQ_set_policy_id(TS_REQ *a, ASN1_OBJECT *policy); +ASN1_OBJECT *TS_REQ_get_policy_id(TS_REQ *a); + +int TS_REQ_set_nonce(TS_REQ *a, const ASN1_INTEGER *nonce); +const ASN1_INTEGER *TS_REQ_get_nonce(const TS_REQ *a); + +int TS_REQ_set_cert_req(TS_REQ *a, int cert_req); +int TS_REQ_get_cert_req(const TS_REQ *a); + +STACK_OF(X509_EXTENSION) *TS_REQ_get_exts(TS_REQ *a); +void TS_REQ_ext_free(TS_REQ *a); +int TS_REQ_get_ext_count(TS_REQ *a); +int TS_REQ_get_ext_by_NID(TS_REQ *a, int nid, int lastpos); +int TS_REQ_get_ext_by_OBJ(TS_REQ *a, ASN1_OBJECT *obj, int lastpos); +int TS_REQ_get_ext_by_critical(TS_REQ *a, int crit, int lastpos); +X509_EXTENSION *TS_REQ_get_ext(TS_REQ *a, int loc); +X509_EXTENSION *TS_REQ_delete_ext(TS_REQ *a, int loc); +int TS_REQ_add_ext(TS_REQ *a, X509_EXTENSION *ex, int loc); +void *TS_REQ_get_ext_d2i(TS_REQ *a, int nid, int *crit, int *idx); + +/* Function declarations for TS_REQ defined in ts/ts_req_print.c */ + +int TS_REQ_print_bio(BIO *bio, TS_REQ *a); + +/* Function declarations for TS_RESP defined in ts/ts_resp_utils.c */ + +int TS_RESP_set_status_info(TS_RESP *a, TS_STATUS_INFO *info); +TS_STATUS_INFO *TS_RESP_get_status_info(TS_RESP *a); + +/* Caller loses ownership of PKCS7 and TS_TST_INFO objects. */ +void TS_RESP_set_tst_info(TS_RESP *a, PKCS7 *p7, TS_TST_INFO *tst_info); +PKCS7 *TS_RESP_get_token(TS_RESP *a); +TS_TST_INFO *TS_RESP_get_tst_info(TS_RESP *a); + +int TS_TST_INFO_set_version(TS_TST_INFO *a, long version); +long TS_TST_INFO_get_version(const TS_TST_INFO *a); + +int TS_TST_INFO_set_policy_id(TS_TST_INFO *a, ASN1_OBJECT *policy_id); +ASN1_OBJECT *TS_TST_INFO_get_policy_id(TS_TST_INFO *a); + +int TS_TST_INFO_set_msg_imprint(TS_TST_INFO *a, TS_MSG_IMPRINT *msg_imprint); +TS_MSG_IMPRINT *TS_TST_INFO_get_msg_imprint(TS_TST_INFO *a); + +int TS_TST_INFO_set_serial(TS_TST_INFO *a, const ASN1_INTEGER *serial); +const ASN1_INTEGER *TS_TST_INFO_get_serial(const TS_TST_INFO *a); + +int TS_TST_INFO_set_time(TS_TST_INFO *a, const ASN1_GENERALIZEDTIME *gtime); +const ASN1_GENERALIZEDTIME *TS_TST_INFO_get_time(const TS_TST_INFO *a); + +int TS_TST_INFO_set_accuracy(TS_TST_INFO *a, TS_ACCURACY *accuracy); +TS_ACCURACY *TS_TST_INFO_get_accuracy(TS_TST_INFO *a); + +int TS_ACCURACY_set_seconds(TS_ACCURACY *a, const ASN1_INTEGER *seconds); +const ASN1_INTEGER *TS_ACCURACY_get_seconds(const TS_ACCURACY *a); + +int TS_ACCURACY_set_millis(TS_ACCURACY *a, const ASN1_INTEGER *millis); +const ASN1_INTEGER *TS_ACCURACY_get_millis(const TS_ACCURACY *a); + +int TS_ACCURACY_set_micros(TS_ACCURACY *a, const ASN1_INTEGER *micros); +const ASN1_INTEGER *TS_ACCURACY_get_micros(const TS_ACCURACY *a); + +int TS_TST_INFO_set_ordering(TS_TST_INFO *a, int ordering); +int TS_TST_INFO_get_ordering(const TS_TST_INFO *a); + +int TS_TST_INFO_set_nonce(TS_TST_INFO *a, const ASN1_INTEGER *nonce); +const ASN1_INTEGER *TS_TST_INFO_get_nonce(const TS_TST_INFO *a); + +int TS_TST_INFO_set_tsa(TS_TST_INFO *a, GENERAL_NAME *tsa); +GENERAL_NAME *TS_TST_INFO_get_tsa(TS_TST_INFO *a); + +STACK_OF(X509_EXTENSION) *TS_TST_INFO_get_exts(TS_TST_INFO *a); +void TS_TST_INFO_ext_free(TS_TST_INFO *a); +int TS_TST_INFO_get_ext_count(TS_TST_INFO *a); +int TS_TST_INFO_get_ext_by_NID(TS_TST_INFO *a, int nid, int lastpos); +int TS_TST_INFO_get_ext_by_OBJ(TS_TST_INFO *a, ASN1_OBJECT *obj, int lastpos); +int TS_TST_INFO_get_ext_by_critical(TS_TST_INFO *a, int crit, int lastpos); +X509_EXTENSION *TS_TST_INFO_get_ext(TS_TST_INFO *a, int loc); +X509_EXTENSION *TS_TST_INFO_delete_ext(TS_TST_INFO *a, int loc); +int TS_TST_INFO_add_ext(TS_TST_INFO *a, X509_EXTENSION *ex, int loc); +void *TS_TST_INFO_get_ext_d2i(TS_TST_INFO *a, int nid, int *crit, int *idx); + +/* + * Declarations related to response generation, defined in ts/ts_resp_sign.c. + */ + +/* Optional flags for response generation. */ + +/* Don't include the TSA name in response. */ +# define TS_TSA_NAME 0x01 + +/* Set ordering to true in response. */ +# define TS_ORDERING 0x02 + +/* + * Include the signer certificate and the other specified certificates in + * the ESS signing certificate attribute beside the PKCS7 signed data. + * Only the signer certificates is included by default. + */ +# define TS_ESS_CERT_ID_CHAIN 0x04 + +/* Forward declaration. */ +struct TS_resp_ctx; + +/* This must return a unique number less than 160 bits long. */ +typedef ASN1_INTEGER *(*TS_serial_cb) (struct TS_resp_ctx *, void *); + +/* + * This must return the seconds and microseconds since Jan 1, 1970 in the sec + * and usec variables allocated by the caller. Return non-zero for success + * and zero for failure. + */ +typedef int (*TS_time_cb) (struct TS_resp_ctx *, void *, long *sec, + long *usec); + +/* + * This must process the given extension. It can modify the TS_TST_INFO + * object of the context. Return values: !0 (processed), 0 (error, it must + * set the status info/failure info of the response). + */ +typedef int (*TS_extension_cb) (struct TS_resp_ctx *, X509_EXTENSION *, + void *); + +typedef struct TS_resp_ctx { + X509 *signer_cert; + EVP_PKEY *signer_key; + STACK_OF(X509) *certs; /* Certs to include in signed data. */ + STACK_OF(ASN1_OBJECT) *policies; /* Acceptable policies. */ + ASN1_OBJECT *default_policy; /* It may appear in policies, too. */ + STACK_OF(EVP_MD) *mds; /* Acceptable message digests. */ + ASN1_INTEGER *seconds; /* accuracy, 0 means not specified. */ + ASN1_INTEGER *millis; /* accuracy, 0 means not specified. */ + ASN1_INTEGER *micros; /* accuracy, 0 means not specified. */ + unsigned clock_precision_digits; /* fraction of seconds in time stamp + * token. */ + unsigned flags; /* Optional info, see values above. */ + /* Callback functions. */ + TS_serial_cb serial_cb; + void *serial_cb_data; /* User data for serial_cb. */ + TS_time_cb time_cb; + void *time_cb_data; /* User data for time_cb. */ + TS_extension_cb extension_cb; + void *extension_cb_data; /* User data for extension_cb. */ + /* These members are used only while creating the response. */ + TS_REQ *request; + TS_RESP *response; + TS_TST_INFO *tst_info; +} TS_RESP_CTX; + +DECLARE_STACK_OF(EVP_MD) +DECLARE_ASN1_SET_OF(EVP_MD) + +/* Creates a response context that can be used for generating responses. */ +TS_RESP_CTX *TS_RESP_CTX_new(void); +void TS_RESP_CTX_free(TS_RESP_CTX *ctx); + +/* This parameter must be set. */ +int TS_RESP_CTX_set_signer_cert(TS_RESP_CTX *ctx, X509 *signer); + +/* This parameter must be set. */ +int TS_RESP_CTX_set_signer_key(TS_RESP_CTX *ctx, EVP_PKEY *key); + +/* This parameter must be set. */ +int TS_RESP_CTX_set_def_policy(TS_RESP_CTX *ctx, ASN1_OBJECT *def_policy); + +/* No additional certs are included in the response by default. */ +int TS_RESP_CTX_set_certs(TS_RESP_CTX *ctx, STACK_OF(X509) *certs); + +/* + * Adds a new acceptable policy, only the default policy is accepted by + * default. + */ +int TS_RESP_CTX_add_policy(TS_RESP_CTX *ctx, ASN1_OBJECT *policy); + +/* + * Adds a new acceptable message digest. Note that no message digests are + * accepted by default. The md argument is shared with the caller. + */ +int TS_RESP_CTX_add_md(TS_RESP_CTX *ctx, const EVP_MD *md); + +/* Accuracy is not included by default. */ +int TS_RESP_CTX_set_accuracy(TS_RESP_CTX *ctx, + int secs, int millis, int micros); + +/* + * Clock precision digits, i.e. the number of decimal digits: '0' means sec, + * '3' msec, '6' usec, and so on. Default is 0. + */ +int TS_RESP_CTX_set_clock_precision_digits(TS_RESP_CTX *ctx, + unsigned clock_precision_digits); +/* At most we accept usec precision. */ +# define TS_MAX_CLOCK_PRECISION_DIGITS 6 + +/* No flags are set by default. */ +void TS_RESP_CTX_add_flags(TS_RESP_CTX *ctx, int flags); + +/* Default callback always returns a constant. */ +void TS_RESP_CTX_set_serial_cb(TS_RESP_CTX *ctx, TS_serial_cb cb, void *data); + +/* Default callback uses the gettimeofday() and gmtime() system calls. */ +void TS_RESP_CTX_set_time_cb(TS_RESP_CTX *ctx, TS_time_cb cb, void *data); + +/* + * Default callback rejects all extensions. The extension callback is called + * when the TS_TST_INFO object is already set up and not signed yet. + */ +/* FIXME: extension handling is not tested yet. */ +void TS_RESP_CTX_set_extension_cb(TS_RESP_CTX *ctx, + TS_extension_cb cb, void *data); + +/* The following methods can be used in the callbacks. */ +int TS_RESP_CTX_set_status_info(TS_RESP_CTX *ctx, + int status, const char *text); + +/* Sets the status info only if it is still TS_STATUS_GRANTED. */ +int TS_RESP_CTX_set_status_info_cond(TS_RESP_CTX *ctx, + int status, const char *text); + +int TS_RESP_CTX_add_failure_info(TS_RESP_CTX *ctx, int failure); + +/* The get methods below can be used in the extension callback. */ +TS_REQ *TS_RESP_CTX_get_request(TS_RESP_CTX *ctx); + +TS_TST_INFO *TS_RESP_CTX_get_tst_info(TS_RESP_CTX *ctx); + +/* + * Creates the signed TS_TST_INFO and puts it in TS_RESP. + * In case of errors it sets the status info properly. + * Returns NULL only in case of memory allocation/fatal error. + */ +TS_RESP *TS_RESP_create_response(TS_RESP_CTX *ctx, BIO *req_bio); + +/* + * Declarations related to response verification, + * they are defined in ts/ts_resp_verify.c. + */ + +int TS_RESP_verify_signature(PKCS7 *token, STACK_OF(X509) *certs, + X509_STORE *store, X509 **signer_out); + +/* Context structure for the generic verify method. */ + +/* Verify the signer's certificate and the signature of the response. */ +# define TS_VFY_SIGNATURE (1u << 0) +/* Verify the version number of the response. */ +# define TS_VFY_VERSION (1u << 1) +/* Verify if the policy supplied by the user matches the policy of the TSA. */ +# define TS_VFY_POLICY (1u << 2) +/* + * Verify the message imprint provided by the user. This flag should not be + * specified with TS_VFY_DATA. + */ +# define TS_VFY_IMPRINT (1u << 3) +/* + * Verify the message imprint computed by the verify method from the user + * provided data and the MD algorithm of the response. This flag should not + * be specified with TS_VFY_IMPRINT. + */ +# define TS_VFY_DATA (1u << 4) +/* Verify the nonce value. */ +# define TS_VFY_NONCE (1u << 5) +/* Verify if the TSA name field matches the signer certificate. */ +# define TS_VFY_SIGNER (1u << 6) +/* Verify if the TSA name field equals to the user provided name. */ +# define TS_VFY_TSA_NAME (1u << 7) + +/* You can use the following convenience constants. */ +# define TS_VFY_ALL_IMPRINT (TS_VFY_SIGNATURE \ + | TS_VFY_VERSION \ + | TS_VFY_POLICY \ + | TS_VFY_IMPRINT \ + | TS_VFY_NONCE \ + | TS_VFY_SIGNER \ + | TS_VFY_TSA_NAME) +# define TS_VFY_ALL_DATA (TS_VFY_SIGNATURE \ + | TS_VFY_VERSION \ + | TS_VFY_POLICY \ + | TS_VFY_DATA \ + | TS_VFY_NONCE \ + | TS_VFY_SIGNER \ + | TS_VFY_TSA_NAME) + +typedef struct TS_verify_ctx { + /* Set this to the union of TS_VFY_... flags you want to carry out. */ + unsigned flags; + /* Must be set only with TS_VFY_SIGNATURE. certs is optional. */ + X509_STORE *store; + STACK_OF(X509) *certs; + /* Must be set only with TS_VFY_POLICY. */ + ASN1_OBJECT *policy; + /* + * Must be set only with TS_VFY_IMPRINT. If md_alg is NULL, the + * algorithm from the response is used. + */ + X509_ALGOR *md_alg; + unsigned char *imprint; + unsigned imprint_len; + /* Must be set only with TS_VFY_DATA. */ + BIO *data; + /* Must be set only with TS_VFY_TSA_NAME. */ + ASN1_INTEGER *nonce; + /* Must be set only with TS_VFY_TSA_NAME. */ + GENERAL_NAME *tsa_name; +} TS_VERIFY_CTX; + +int TS_RESP_verify_response(TS_VERIFY_CTX *ctx, TS_RESP *response); +int TS_RESP_verify_token(TS_VERIFY_CTX *ctx, PKCS7 *token); + +/* + * Declarations related to response verification context, + * they are defined in ts/ts_verify_ctx.c. + */ + +/* Set all fields to zero. */ +TS_VERIFY_CTX *TS_VERIFY_CTX_new(void); +void TS_VERIFY_CTX_init(TS_VERIFY_CTX *ctx); +void TS_VERIFY_CTX_free(TS_VERIFY_CTX *ctx); +void TS_VERIFY_CTX_cleanup(TS_VERIFY_CTX *ctx); + +/*- + * If ctx is NULL, it allocates and returns a new object, otherwise + * it returns ctx. It initialises all the members as follows: + * flags = TS_VFY_ALL_IMPRINT & ~(TS_VFY_TSA_NAME | TS_VFY_SIGNATURE) + * certs = NULL + * store = NULL + * policy = policy from the request or NULL if absent (in this case + * TS_VFY_POLICY is cleared from flags as well) + * md_alg = MD algorithm from request + * imprint, imprint_len = imprint from request + * data = NULL + * nonce, nonce_len = nonce from the request or NULL if absent (in this case + * TS_VFY_NONCE is cleared from flags as well) + * tsa_name = NULL + * Important: after calling this method TS_VFY_SIGNATURE should be added! + */ +TS_VERIFY_CTX *TS_REQ_to_TS_VERIFY_CTX(TS_REQ *req, TS_VERIFY_CTX *ctx); + +/* Function declarations for TS_RESP defined in ts/ts_resp_print.c */ + +int TS_RESP_print_bio(BIO *bio, TS_RESP *a); +int TS_STATUS_INFO_print_bio(BIO *bio, TS_STATUS_INFO *a); +int TS_TST_INFO_print_bio(BIO *bio, TS_TST_INFO *a); + +/* Common utility functions defined in ts/ts_lib.c */ + +int TS_ASN1_INTEGER_print_bio(BIO *bio, const ASN1_INTEGER *num); +int TS_OBJ_print_bio(BIO *bio, const ASN1_OBJECT *obj); +int TS_ext_print_bio(BIO *bio, const STACK_OF(X509_EXTENSION) *extensions); +int TS_X509_ALGOR_print_bio(BIO *bio, const X509_ALGOR *alg); +int TS_MSG_IMPRINT_print_bio(BIO *bio, TS_MSG_IMPRINT *msg); + +/* + * Function declarations for handling configuration options, defined in + * ts/ts_conf.c + */ + +X509 *TS_CONF_load_cert(const char *file); +STACK_OF(X509) *TS_CONF_load_certs(const char *file); +EVP_PKEY *TS_CONF_load_key(const char *file, const char *pass); +const char *TS_CONF_get_tsa_section(CONF *conf, const char *section); +int TS_CONF_set_serial(CONF *conf, const char *section, TS_serial_cb cb, + TS_RESP_CTX *ctx); +int TS_CONF_set_crypto_device(CONF *conf, const char *section, + const char *device); +int TS_CONF_set_default_engine(const char *name); +int TS_CONF_set_signer_cert(CONF *conf, const char *section, + const char *cert, TS_RESP_CTX *ctx); +int TS_CONF_set_certs(CONF *conf, const char *section, const char *certs, + TS_RESP_CTX *ctx); +int TS_CONF_set_signer_key(CONF *conf, const char *section, + const char *key, const char *pass, + TS_RESP_CTX *ctx); +int TS_CONF_set_def_policy(CONF *conf, const char *section, + const char *policy, TS_RESP_CTX *ctx); +int TS_CONF_set_policies(CONF *conf, const char *section, TS_RESP_CTX *ctx); +int TS_CONF_set_digests(CONF *conf, const char *section, TS_RESP_CTX *ctx); +int TS_CONF_set_accuracy(CONF *conf, const char *section, TS_RESP_CTX *ctx); +int TS_CONF_set_clock_precision_digits(CONF *conf, const char *section, + TS_RESP_CTX *ctx); +int TS_CONF_set_ordering(CONF *conf, const char *section, TS_RESP_CTX *ctx); +int TS_CONF_set_tsa_name(CONF *conf, const char *section, TS_RESP_CTX *ctx); +int TS_CONF_set_ess_cert_id_chain(CONF *conf, const char *section, + TS_RESP_CTX *ctx); + +/* -------------------------------------------------- */ +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_TS_strings(void); + +/* Error codes for the TS functions. */ + +/* Function codes. */ +# define TS_F_D2I_TS_RESP 147 +# define TS_F_DEF_SERIAL_CB 110 +# define TS_F_DEF_TIME_CB 111 +# define TS_F_ESS_ADD_SIGNING_CERT 112 +# define TS_F_ESS_CERT_ID_NEW_INIT 113 +# define TS_F_ESS_SIGNING_CERT_NEW_INIT 114 +# define TS_F_INT_TS_RESP_VERIFY_TOKEN 149 +# define TS_F_PKCS7_TO_TS_TST_INFO 148 +# define TS_F_TS_ACCURACY_SET_MICROS 115 +# define TS_F_TS_ACCURACY_SET_MILLIS 116 +# define TS_F_TS_ACCURACY_SET_SECONDS 117 +# define TS_F_TS_CHECK_IMPRINTS 100 +# define TS_F_TS_CHECK_NONCES 101 +# define TS_F_TS_CHECK_POLICY 102 +# define TS_F_TS_CHECK_SIGNING_CERTS 103 +# define TS_F_TS_CHECK_STATUS_INFO 104 +# define TS_F_TS_COMPUTE_IMPRINT 145 +# define TS_F_TS_CONF_SET_DEFAULT_ENGINE 146 +# define TS_F_TS_GET_STATUS_TEXT 105 +# define TS_F_TS_MSG_IMPRINT_SET_ALGO 118 +# define TS_F_TS_REQ_SET_MSG_IMPRINT 119 +# define TS_F_TS_REQ_SET_NONCE 120 +# define TS_F_TS_REQ_SET_POLICY_ID 121 +# define TS_F_TS_RESP_CREATE_RESPONSE 122 +# define TS_F_TS_RESP_CREATE_TST_INFO 123 +# define TS_F_TS_RESP_CTX_ADD_FAILURE_INFO 124 +# define TS_F_TS_RESP_CTX_ADD_MD 125 +# define TS_F_TS_RESP_CTX_ADD_POLICY 126 +# define TS_F_TS_RESP_CTX_NEW 127 +# define TS_F_TS_RESP_CTX_SET_ACCURACY 128 +# define TS_F_TS_RESP_CTX_SET_CERTS 129 +# define TS_F_TS_RESP_CTX_SET_DEF_POLICY 130 +# define TS_F_TS_RESP_CTX_SET_SIGNER_CERT 131 +# define TS_F_TS_RESP_CTX_SET_STATUS_INFO 132 +# define TS_F_TS_RESP_GET_POLICY 133 +# define TS_F_TS_RESP_SET_GENTIME_WITH_PRECISION 134 +# define TS_F_TS_RESP_SET_STATUS_INFO 135 +# define TS_F_TS_RESP_SET_TST_INFO 150 +# define TS_F_TS_RESP_SIGN 136 +# define TS_F_TS_RESP_VERIFY_SIGNATURE 106 +# define TS_F_TS_RESP_VERIFY_TOKEN 107 +# define TS_F_TS_TST_INFO_SET_ACCURACY 137 +# define TS_F_TS_TST_INFO_SET_MSG_IMPRINT 138 +# define TS_F_TS_TST_INFO_SET_NONCE 139 +# define TS_F_TS_TST_INFO_SET_POLICY_ID 140 +# define TS_F_TS_TST_INFO_SET_SERIAL 141 +# define TS_F_TS_TST_INFO_SET_TIME 142 +# define TS_F_TS_TST_INFO_SET_TSA 143 +# define TS_F_TS_VERIFY 108 +# define TS_F_TS_VERIFY_CERT 109 +# define TS_F_TS_VERIFY_CTX_NEW 144 + +/* Reason codes. */ +# define TS_R_BAD_PKCS7_TYPE 132 +# define TS_R_BAD_TYPE 133 +# define TS_R_CERTIFICATE_VERIFY_ERROR 100 +# define TS_R_COULD_NOT_SET_ENGINE 127 +# define TS_R_COULD_NOT_SET_TIME 115 +# define TS_R_D2I_TS_RESP_INT_FAILED 128 +# define TS_R_DETACHED_CONTENT 134 +# define TS_R_ESS_ADD_SIGNING_CERT_ERROR 116 +# define TS_R_ESS_SIGNING_CERTIFICATE_ERROR 101 +# define TS_R_INVALID_NULL_POINTER 102 +# define TS_R_INVALID_SIGNER_CERTIFICATE_PURPOSE 117 +# define TS_R_MESSAGE_IMPRINT_MISMATCH 103 +# define TS_R_NONCE_MISMATCH 104 +# define TS_R_NONCE_NOT_RETURNED 105 +# define TS_R_NO_CONTENT 106 +# define TS_R_NO_TIME_STAMP_TOKEN 107 +# define TS_R_PKCS7_ADD_SIGNATURE_ERROR 118 +# define TS_R_PKCS7_ADD_SIGNED_ATTR_ERROR 119 +# define TS_R_PKCS7_TO_TS_TST_INFO_FAILED 129 +# define TS_R_POLICY_MISMATCH 108 +# define TS_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE 120 +# define TS_R_RESPONSE_SETUP_ERROR 121 +# define TS_R_SIGNATURE_FAILURE 109 +# define TS_R_THERE_MUST_BE_ONE_SIGNER 110 +# define TS_R_TIME_SYSCALL_ERROR 122 +# define TS_R_TOKEN_NOT_PRESENT 130 +# define TS_R_TOKEN_PRESENT 131 +# define TS_R_TSA_NAME_MISMATCH 111 +# define TS_R_TSA_UNTRUSTED 112 +# define TS_R_TST_INFO_SETUP_ERROR 123 +# define TS_R_TS_DATASIGN 124 +# define TS_R_UNACCEPTABLE_POLICY 125 +# define TS_R_UNSUPPORTED_MD_ALGORITHM 126 +# define TS_R_UNSUPPORTED_VERSION 113 +# define TS_R_WRONG_CONTENT_TYPE 114 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/ext/openssl-osx/include/nope/txt_db.h b/ext/openssl-osx/include/nope/txt_db.h new file mode 100644 index 00000000..98e23a20 --- /dev/null +++ b/ext/openssl-osx/include/nope/txt_db.h @@ -0,0 +1,112 @@ +/* crypto/txt_db/txt_db.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_TXT_DB_H +# define HEADER_TXT_DB_H + +# include +# ifndef OPENSSL_NO_BIO +# include +# endif +# include +# include + +# define DB_ERROR_OK 0 +# define DB_ERROR_MALLOC 1 +# define DB_ERROR_INDEX_CLASH 2 +# define DB_ERROR_INDEX_OUT_OF_RANGE 3 +# define DB_ERROR_NO_INDEX 4 +# define DB_ERROR_INSERT_INDEX_CLASH 5 + +#ifdef __cplusplus +extern "C" { +#endif + +typedef OPENSSL_STRING *OPENSSL_PSTRING; +DECLARE_SPECIAL_STACK_OF(OPENSSL_PSTRING, OPENSSL_STRING) + +typedef struct txt_db_st { + int num_fields; + STACK_OF(OPENSSL_PSTRING) *data; + LHASH_OF(OPENSSL_STRING) **index; + int (**qual) (OPENSSL_STRING *); + long error; + long arg1; + long arg2; + OPENSSL_STRING *arg_row; +} TXT_DB; + +# ifndef OPENSSL_NO_BIO +TXT_DB *TXT_DB_read(BIO *in, int num); +long TXT_DB_write(BIO *out, TXT_DB *db); +# else +TXT_DB *TXT_DB_read(char *in, int num); +long TXT_DB_write(char *out, TXT_DB *db); +# endif +int TXT_DB_create_index(TXT_DB *db, int field, int (*qual) (OPENSSL_STRING *), + LHASH_HASH_FN_TYPE hash, LHASH_COMP_FN_TYPE cmp); +void TXT_DB_free(TXT_DB *db); +OPENSSL_STRING *TXT_DB_get_by_index(TXT_DB *db, int idx, + OPENSSL_STRING *value); +int TXT_DB_insert(TXT_DB *db, OPENSSL_STRING *value); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ext/openssl-osx/include/nope/ui.h b/ext/openssl-osx/include/nope/ui.h new file mode 100644 index 00000000..b917edab --- /dev/null +++ b/ext/openssl-osx/include/nope/ui.h @@ -0,0 +1,415 @@ +/* crypto/ui/ui.h -*- mode:C; c-file-style: "eay" -*- */ +/* + * Written by Richard Levitte (richard@levitte.org) for the OpenSSL project + * 2001. + */ +/* ==================================================================== + * Copyright (c) 2001 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_UI_H +# define HEADER_UI_H + +# ifndef OPENSSL_NO_DEPRECATED +# include +# endif +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Declared already in ossl_typ.h */ +/* typedef struct ui_st UI; */ +/* typedef struct ui_method_st UI_METHOD; */ + +/* + * All the following functions return -1 or NULL on error and in some cases + * (UI_process()) -2 if interrupted or in some other way cancelled. When + * everything is fine, they return 0, a positive value or a non-NULL pointer, + * all depending on their purpose. + */ + +/* Creators and destructor. */ +UI *UI_new(void); +UI *UI_new_method(const UI_METHOD *method); +void UI_free(UI *ui); + +/*- + The following functions are used to add strings to be printed and prompt + strings to prompt for data. The names are UI_{add,dup}__string + and UI_{add,dup}_input_boolean. + + UI_{add,dup}__string have the following meanings: + add add a text or prompt string. The pointers given to these + functions are used verbatim, no copying is done. + dup make a copy of the text or prompt string, then add the copy + to the collection of strings in the user interface. + + The function is a name for the functionality that the given + string shall be used for. It can be one of: + input use the string as data prompt. + verify use the string as verification prompt. This + is used to verify a previous input. + info use the string for informational output. + error use the string for error output. + Honestly, there's currently no difference between info and error for the + moment. + + UI_{add,dup}_input_boolean have the same semantics for "add" and "dup", + and are typically used when one wants to prompt for a yes/no response. + + All of the functions in this group take a UI and a prompt string. + The string input and verify addition functions also take a flag argument, + a buffer for the result to end up with, a minimum input size and a maximum + input size (the result buffer MUST be large enough to be able to contain + the maximum number of characters). Additionally, the verify addition + functions takes another buffer to compare the result against. + The boolean input functions take an action description string (which should + be safe to ignore if the expected user action is obvious, for example with + a dialog box with an OK button and a Cancel button), a string of acceptable + characters to mean OK and to mean Cancel. The two last strings are checked + to make sure they don't have common characters. Additionally, the same + flag argument as for the string input is taken, as well as a result buffer. + The result buffer is required to be at least one byte long. Depending on + the answer, the first character from the OK or the Cancel character strings + will be stored in the first byte of the result buffer. No NUL will be + added, so the result is *not* a string. + + On success, the all return an index of the added information. That index + is usefull when retrieving results with UI_get0_result(). */ +int UI_add_input_string(UI *ui, const char *prompt, int flags, + char *result_buf, int minsize, int maxsize); +int UI_dup_input_string(UI *ui, const char *prompt, int flags, + char *result_buf, int minsize, int maxsize); +int UI_add_verify_string(UI *ui, const char *prompt, int flags, + char *result_buf, int minsize, int maxsize, + const char *test_buf); +int UI_dup_verify_string(UI *ui, const char *prompt, int flags, + char *result_buf, int minsize, int maxsize, + const char *test_buf); +int UI_add_input_boolean(UI *ui, const char *prompt, const char *action_desc, + const char *ok_chars, const char *cancel_chars, + int flags, char *result_buf); +int UI_dup_input_boolean(UI *ui, const char *prompt, const char *action_desc, + const char *ok_chars, const char *cancel_chars, + int flags, char *result_buf); +int UI_add_info_string(UI *ui, const char *text); +int UI_dup_info_string(UI *ui, const char *text); +int UI_add_error_string(UI *ui, const char *text); +int UI_dup_error_string(UI *ui, const char *text); + +/* These are the possible flags. They can be or'ed together. */ +/* Use to have echoing of input */ +# define UI_INPUT_FLAG_ECHO 0x01 +/* + * Use a default password. Where that password is found is completely up to + * the application, it might for example be in the user data set with + * UI_add_user_data(). It is not recommended to have more than one input in + * each UI being marked with this flag, or the application might get + * confused. + */ +# define UI_INPUT_FLAG_DEFAULT_PWD 0x02 + +/*- + * The user of these routines may want to define flags of their own. The core + * UI won't look at those, but will pass them on to the method routines. They + * must use higher bits so they don't get confused with the UI bits above. + * UI_INPUT_FLAG_USER_BASE tells which is the lowest bit to use. A good + * example of use is this: + * + * #define MY_UI_FLAG1 (0x01 << UI_INPUT_FLAG_USER_BASE) + * +*/ +# define UI_INPUT_FLAG_USER_BASE 16 + +/*- + * The following function helps construct a prompt. object_desc is a + * textual short description of the object, for example "pass phrase", + * and object_name is the name of the object (might be a card name or + * a file name. + * The returned string shall always be allocated on the heap with + * OPENSSL_malloc(), and need to be free'd with OPENSSL_free(). + * + * If the ui_method doesn't contain a pointer to a user-defined prompt + * constructor, a default string is built, looking like this: + * + * "Enter {object_desc} for {object_name}:" + * + * So, if object_desc has the value "pass phrase" and object_name has + * the value "foo.key", the resulting string is: + * + * "Enter pass phrase for foo.key:" +*/ +char *UI_construct_prompt(UI *ui_method, + const char *object_desc, const char *object_name); + +/* + * The following function is used to store a pointer to user-specific data. + * Any previous such pointer will be returned and replaced. + * + * For callback purposes, this function makes a lot more sense than using + * ex_data, since the latter requires that different parts of OpenSSL or + * applications share the same ex_data index. + * + * Note that the UI_OpenSSL() method completely ignores the user data. Other + * methods may not, however. + */ +void *UI_add_user_data(UI *ui, void *user_data); +/* We need a user data retrieving function as well. */ +void *UI_get0_user_data(UI *ui); + +/* Return the result associated with a prompt given with the index i. */ +const char *UI_get0_result(UI *ui, int i); + +/* When all strings have been added, process the whole thing. */ +int UI_process(UI *ui); + +/* + * Give a user interface parametrised control commands. This can be used to + * send down an integer, a data pointer or a function pointer, as well as be + * used to get information from a UI. + */ +int UI_ctrl(UI *ui, int cmd, long i, void *p, void (*f) (void)); + +/* The commands */ +/* + * Use UI_CONTROL_PRINT_ERRORS with the value 1 to have UI_process print the + * OpenSSL error stack before printing any info or added error messages and + * before any prompting. + */ +# define UI_CTRL_PRINT_ERRORS 1 +/* + * Check if a UI_process() is possible to do again with the same instance of + * a user interface. This makes UI_ctrl() return 1 if it is redoable, and 0 + * if not. + */ +# define UI_CTRL_IS_REDOABLE 2 + +/* Some methods may use extra data */ +# define UI_set_app_data(s,arg) UI_set_ex_data(s,0,arg) +# define UI_get_app_data(s) UI_get_ex_data(s,0) +int UI_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func); +int UI_set_ex_data(UI *r, int idx, void *arg); +void *UI_get_ex_data(UI *r, int idx); + +/* Use specific methods instead of the built-in one */ +void UI_set_default_method(const UI_METHOD *meth); +const UI_METHOD *UI_get_default_method(void); +const UI_METHOD *UI_get_method(UI *ui); +const UI_METHOD *UI_set_method(UI *ui, const UI_METHOD *meth); + +/* The method with all the built-in thingies */ +UI_METHOD *UI_OpenSSL(void); + +/* ---------- For method writers ---------- */ +/*- + A method contains a number of functions that implement the low level + of the User Interface. The functions are: + + an opener This function starts a session, maybe by opening + a channel to a tty, or by opening a window. + a writer This function is called to write a given string, + maybe to the tty, maybe as a field label in a + window. + a flusher This function is called to flush everything that + has been output so far. It can be used to actually + display a dialog box after it has been built. + a reader This function is called to read a given prompt, + maybe from the tty, maybe from a field in a + window. Note that it's called wth all string + structures, not only the prompt ones, so it must + check such things itself. + a closer This function closes the session, maybe by closing + the channel to the tty, or closing the window. + + All these functions are expected to return: + + 0 on error. + 1 on success. + -1 on out-of-band events, for example if some prompting has + been canceled (by pressing Ctrl-C, for example). This is + only checked when returned by the flusher or the reader. + + The way this is used, the opener is first called, then the writer for all + strings, then the flusher, then the reader for all strings and finally the + closer. Note that if you want to prompt from a terminal or other command + line interface, the best is to have the reader also write the prompts + instead of having the writer do it. If you want to prompt from a dialog + box, the writer can be used to build up the contents of the box, and the + flusher to actually display the box and run the event loop until all data + has been given, after which the reader only grabs the given data and puts + them back into the UI strings. + + All method functions take a UI as argument. Additionally, the writer and + the reader take a UI_STRING. +*/ + +/* + * The UI_STRING type is the data structure that contains all the needed info + * about a string or a prompt, including test data for a verification prompt. + */ +typedef struct ui_string_st UI_STRING; +DECLARE_STACK_OF(UI_STRING) + +/* + * The different types of strings that are currently supported. This is only + * needed by method authors. + */ +enum UI_string_types { + UIT_NONE = 0, + UIT_PROMPT, /* Prompt for a string */ + UIT_VERIFY, /* Prompt for a string and verify */ + UIT_BOOLEAN, /* Prompt for a yes/no response */ + UIT_INFO, /* Send info to the user */ + UIT_ERROR /* Send an error message to the user */ +}; + +/* Create and manipulate methods */ +UI_METHOD *UI_create_method(char *name); +void UI_destroy_method(UI_METHOD *ui_method); +int UI_method_set_opener(UI_METHOD *method, int (*opener) (UI *ui)); +int UI_method_set_writer(UI_METHOD *method, + int (*writer) (UI *ui, UI_STRING *uis)); +int UI_method_set_flusher(UI_METHOD *method, int (*flusher) (UI *ui)); +int UI_method_set_reader(UI_METHOD *method, + int (*reader) (UI *ui, UI_STRING *uis)); +int UI_method_set_closer(UI_METHOD *method, int (*closer) (UI *ui)); +int UI_method_set_prompt_constructor(UI_METHOD *method, + char *(*prompt_constructor) (UI *ui, + const char + *object_desc, + const char + *object_name)); +int (*UI_method_get_opener(UI_METHOD *method)) (UI *); +int (*UI_method_get_writer(UI_METHOD *method)) (UI *, UI_STRING *); +int (*UI_method_get_flusher(UI_METHOD *method)) (UI *); +int (*UI_method_get_reader(UI_METHOD *method)) (UI *, UI_STRING *); +int (*UI_method_get_closer(UI_METHOD *method)) (UI *); +char *(*UI_method_get_prompt_constructor(UI_METHOD *method)) (UI *, + const char *, + const char *); + +/* + * The following functions are helpers for method writers to access relevant + * data from a UI_STRING. + */ + +/* Return type of the UI_STRING */ +enum UI_string_types UI_get_string_type(UI_STRING *uis); +/* Return input flags of the UI_STRING */ +int UI_get_input_flags(UI_STRING *uis); +/* Return the actual string to output (the prompt, info or error) */ +const char *UI_get0_output_string(UI_STRING *uis); +/* + * Return the optional action string to output (the boolean promtp + * instruction) + */ +const char *UI_get0_action_string(UI_STRING *uis); +/* Return the result of a prompt */ +const char *UI_get0_result_string(UI_STRING *uis); +/* + * Return the string to test the result against. Only useful with verifies. + */ +const char *UI_get0_test_string(UI_STRING *uis); +/* Return the required minimum size of the result */ +int UI_get_result_minsize(UI_STRING *uis); +/* Return the required maximum size of the result */ +int UI_get_result_maxsize(UI_STRING *uis); +/* Set the result of a UI_STRING. */ +int UI_set_result(UI *ui, UI_STRING *uis, const char *result); + +/* A couple of popular utility functions */ +int UI_UTIL_read_pw_string(char *buf, int length, const char *prompt, + int verify); +int UI_UTIL_read_pw(char *buf, char *buff, int size, const char *prompt, + int verify); + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_UI_strings(void); + +/* Error codes for the UI functions. */ + +/* Function codes. */ +# define UI_F_GENERAL_ALLOCATE_BOOLEAN 108 +# define UI_F_GENERAL_ALLOCATE_PROMPT 109 +# define UI_F_GENERAL_ALLOCATE_STRING 100 +# define UI_F_UI_CTRL 111 +# define UI_F_UI_DUP_ERROR_STRING 101 +# define UI_F_UI_DUP_INFO_STRING 102 +# define UI_F_UI_DUP_INPUT_BOOLEAN 110 +# define UI_F_UI_DUP_INPUT_STRING 103 +# define UI_F_UI_DUP_VERIFY_STRING 106 +# define UI_F_UI_GET0_RESULT 107 +# define UI_F_UI_NEW_METHOD 104 +# define UI_F_UI_SET_RESULT 105 + +/* Reason codes. */ +# define UI_R_COMMON_OK_AND_CANCEL_CHARACTERS 104 +# define UI_R_INDEX_TOO_LARGE 102 +# define UI_R_INDEX_TOO_SMALL 103 +# define UI_R_NO_RESULT_BUFFER 105 +# define UI_R_RESULT_TOO_LARGE 100 +# define UI_R_RESULT_TOO_SMALL 101 +# define UI_R_UNKNOWN_CONTROL_COMMAND 106 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/ext/openssl-osx/include/nope/ui_compat.h b/ext/openssl-osx/include/nope/ui_compat.h new file mode 100644 index 00000000..42fb9ff6 --- /dev/null +++ b/ext/openssl-osx/include/nope/ui_compat.h @@ -0,0 +1,88 @@ +/* crypto/ui/ui.h -*- mode:C; c-file-style: "eay" -*- */ +/* + * Written by Richard Levitte (richard@levitte.org) for the OpenSSL project + * 2001. + */ +/* ==================================================================== + * Copyright (c) 2001 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_UI_COMPAT_H +# define HEADER_UI_COMPAT_H + +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * The following functions were previously part of the DES section, and are + * provided here for backward compatibility reasons. + */ + +# define des_read_pw_string(b,l,p,v) \ + _ossl_old_des_read_pw_string((b),(l),(p),(v)) +# define des_read_pw(b,bf,s,p,v) \ + _ossl_old_des_read_pw((b),(bf),(s),(p),(v)) + +int _ossl_old_des_read_pw_string(char *buf, int length, const char *prompt, + int verify); +int _ossl_old_des_read_pw(char *buf, char *buff, int size, const char *prompt, + int verify); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/ext/openssl-osx/include/nope/whrlpool.h b/ext/openssl-osx/include/nope/whrlpool.h new file mode 100644 index 00000000..73c749da --- /dev/null +++ b/ext/openssl-osx/include/nope/whrlpool.h @@ -0,0 +1,41 @@ +#ifndef HEADER_WHRLPOOL_H +# define HEADER_WHRLPOOL_H + +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# define WHIRLPOOL_DIGEST_LENGTH (512/8) +# define WHIRLPOOL_BBLOCK 512 +# define WHIRLPOOL_COUNTER (256/8) + +typedef struct { + union { + unsigned char c[WHIRLPOOL_DIGEST_LENGTH]; + /* double q is here to ensure 64-bit alignment */ + double q[WHIRLPOOL_DIGEST_LENGTH / sizeof(double)]; + } H; + unsigned char data[WHIRLPOOL_BBLOCK / 8]; + unsigned int bitoff; + size_t bitlen[WHIRLPOOL_COUNTER / sizeof(size_t)]; +} WHIRLPOOL_CTX; + +# ifndef OPENSSL_NO_WHIRLPOOL +# ifdef OPENSSL_FIPS +int private_WHIRLPOOL_Init(WHIRLPOOL_CTX *c); +# endif +int WHIRLPOOL_Init(WHIRLPOOL_CTX *c); +int WHIRLPOOL_Update(WHIRLPOOL_CTX *c, const void *inp, size_t bytes); +void WHIRLPOOL_BitUpdate(WHIRLPOOL_CTX *c, const void *inp, size_t bits); +int WHIRLPOOL_Final(unsigned char *md, WHIRLPOOL_CTX *c); +unsigned char *WHIRLPOOL(const void *inp, size_t bytes, unsigned char *md); +# endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ext/openssl-osx/include/nope/x509v3.h b/ext/openssl-osx/include/nope/x509v3.h new file mode 100644 index 00000000..f5c61560 --- /dev/null +++ b/ext/openssl-osx/include/nope/x509v3.h @@ -0,0 +1,1055 @@ +/* x509v3.h */ +/* + * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project + * 1999. + */ +/* ==================================================================== + * Copyright (c) 1999-2004 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +#ifndef HEADER_X509V3_H +# define HEADER_X509V3_H + +# include +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# ifdef OPENSSL_SYS_WIN32 +/* Under Win32 these are defined in wincrypt.h */ +# undef X509_NAME +# undef X509_CERT_PAIR +# undef X509_EXTENSIONS +# endif + +/* Forward reference */ +struct v3_ext_method; +struct v3_ext_ctx; + +/* Useful typedefs */ + +typedef void *(*X509V3_EXT_NEW)(void); +typedef void (*X509V3_EXT_FREE) (void *); +typedef void *(*X509V3_EXT_D2I)(void *, const unsigned char **, long); +typedef int (*X509V3_EXT_I2D) (void *, unsigned char **); +typedef STACK_OF(CONF_VALUE) * + (*X509V3_EXT_I2V) (const struct v3_ext_method *method, void *ext, + STACK_OF(CONF_VALUE) *extlist); +typedef void *(*X509V3_EXT_V2I)(const struct v3_ext_method *method, + struct v3_ext_ctx *ctx, + STACK_OF(CONF_VALUE) *values); +typedef char *(*X509V3_EXT_I2S)(const struct v3_ext_method *method, + void *ext); +typedef void *(*X509V3_EXT_S2I)(const struct v3_ext_method *method, + struct v3_ext_ctx *ctx, const char *str); +typedef int (*X509V3_EXT_I2R) (const struct v3_ext_method *method, void *ext, + BIO *out, int indent); +typedef void *(*X509V3_EXT_R2I)(const struct v3_ext_method *method, + struct v3_ext_ctx *ctx, const char *str); + +/* V3 extension structure */ + +struct v3_ext_method { + int ext_nid; + int ext_flags; +/* If this is set the following four fields are ignored */ + ASN1_ITEM_EXP *it; +/* Old style ASN1 calls */ + X509V3_EXT_NEW ext_new; + X509V3_EXT_FREE ext_free; + X509V3_EXT_D2I d2i; + X509V3_EXT_I2D i2d; +/* The following pair is used for string extensions */ + X509V3_EXT_I2S i2s; + X509V3_EXT_S2I s2i; +/* The following pair is used for multi-valued extensions */ + X509V3_EXT_I2V i2v; + X509V3_EXT_V2I v2i; +/* The following are used for raw extensions */ + X509V3_EXT_I2R i2r; + X509V3_EXT_R2I r2i; + void *usr_data; /* Any extension specific data */ +}; + +typedef struct X509V3_CONF_METHOD_st { + char *(*get_string) (void *db, char *section, char *value); + STACK_OF(CONF_VALUE) *(*get_section) (void *db, char *section); + void (*free_string) (void *db, char *string); + void (*free_section) (void *db, STACK_OF(CONF_VALUE) *section); +} X509V3_CONF_METHOD; + +/* Context specific info */ +struct v3_ext_ctx { +# define CTX_TEST 0x1 + int flags; + X509 *issuer_cert; + X509 *subject_cert; + X509_REQ *subject_req; + X509_CRL *crl; + X509V3_CONF_METHOD *db_meth; + void *db; +/* Maybe more here */ +}; + +typedef struct v3_ext_method X509V3_EXT_METHOD; + +DECLARE_STACK_OF(X509V3_EXT_METHOD) + +/* ext_flags values */ +# define X509V3_EXT_DYNAMIC 0x1 +# define X509V3_EXT_CTX_DEP 0x2 +# define X509V3_EXT_MULTILINE 0x4 + +typedef BIT_STRING_BITNAME ENUMERATED_NAMES; + +typedef struct BASIC_CONSTRAINTS_st { + int ca; + ASN1_INTEGER *pathlen; +} BASIC_CONSTRAINTS; + +typedef struct PKEY_USAGE_PERIOD_st { + ASN1_GENERALIZEDTIME *notBefore; + ASN1_GENERALIZEDTIME *notAfter; +} PKEY_USAGE_PERIOD; + +typedef struct otherName_st { + ASN1_OBJECT *type_id; + ASN1_TYPE *value; +} OTHERNAME; + +typedef struct EDIPartyName_st { + ASN1_STRING *nameAssigner; + ASN1_STRING *partyName; +} EDIPARTYNAME; + +typedef struct GENERAL_NAME_st { +# define GEN_OTHERNAME 0 +# define GEN_EMAIL 1 +# define GEN_DNS 2 +# define GEN_X400 3 +# define GEN_DIRNAME 4 +# define GEN_EDIPARTY 5 +# define GEN_URI 6 +# define GEN_IPADD 7 +# define GEN_RID 8 + int type; + union { + char *ptr; + OTHERNAME *otherName; /* otherName */ + ASN1_IA5STRING *rfc822Name; + ASN1_IA5STRING *dNSName; + ASN1_TYPE *x400Address; + X509_NAME *directoryName; + EDIPARTYNAME *ediPartyName; + ASN1_IA5STRING *uniformResourceIdentifier; + ASN1_OCTET_STRING *iPAddress; + ASN1_OBJECT *registeredID; + /* Old names */ + ASN1_OCTET_STRING *ip; /* iPAddress */ + X509_NAME *dirn; /* dirn */ + ASN1_IA5STRING *ia5; /* rfc822Name, dNSName, + * uniformResourceIdentifier */ + ASN1_OBJECT *rid; /* registeredID */ + ASN1_TYPE *other; /* x400Address */ + } d; +} GENERAL_NAME; + +typedef STACK_OF(GENERAL_NAME) GENERAL_NAMES; + +typedef struct ACCESS_DESCRIPTION_st { + ASN1_OBJECT *method; + GENERAL_NAME *location; +} ACCESS_DESCRIPTION; + +typedef STACK_OF(ACCESS_DESCRIPTION) AUTHORITY_INFO_ACCESS; + +typedef STACK_OF(ASN1_OBJECT) EXTENDED_KEY_USAGE; + +DECLARE_STACK_OF(GENERAL_NAME) +DECLARE_ASN1_SET_OF(GENERAL_NAME) + +DECLARE_STACK_OF(ACCESS_DESCRIPTION) +DECLARE_ASN1_SET_OF(ACCESS_DESCRIPTION) + +typedef struct DIST_POINT_NAME_st { + int type; + union { + GENERAL_NAMES *fullname; + STACK_OF(X509_NAME_ENTRY) *relativename; + } name; +/* If relativename then this contains the full distribution point name */ + X509_NAME *dpname; +} DIST_POINT_NAME; +/* All existing reasons */ +# define CRLDP_ALL_REASONS 0x807f + +# define CRL_REASON_NONE -1 +# define CRL_REASON_UNSPECIFIED 0 +# define CRL_REASON_KEY_COMPROMISE 1 +# define CRL_REASON_CA_COMPROMISE 2 +# define CRL_REASON_AFFILIATION_CHANGED 3 +# define CRL_REASON_SUPERSEDED 4 +# define CRL_REASON_CESSATION_OF_OPERATION 5 +# define CRL_REASON_CERTIFICATE_HOLD 6 +# define CRL_REASON_REMOVE_FROM_CRL 8 +# define CRL_REASON_PRIVILEGE_WITHDRAWN 9 +# define CRL_REASON_AA_COMPROMISE 10 + +struct DIST_POINT_st { + DIST_POINT_NAME *distpoint; + ASN1_BIT_STRING *reasons; + GENERAL_NAMES *CRLissuer; + int dp_reasons; +}; + +typedef STACK_OF(DIST_POINT) CRL_DIST_POINTS; + +DECLARE_STACK_OF(DIST_POINT) +DECLARE_ASN1_SET_OF(DIST_POINT) + +struct AUTHORITY_KEYID_st { + ASN1_OCTET_STRING *keyid; + GENERAL_NAMES *issuer; + ASN1_INTEGER *serial; +}; + +/* Strong extranet structures */ + +typedef struct SXNET_ID_st { + ASN1_INTEGER *zone; + ASN1_OCTET_STRING *user; +} SXNETID; + +DECLARE_STACK_OF(SXNETID) +DECLARE_ASN1_SET_OF(SXNETID) + +typedef struct SXNET_st { + ASN1_INTEGER *version; + STACK_OF(SXNETID) *ids; +} SXNET; + +typedef struct NOTICEREF_st { + ASN1_STRING *organization; + STACK_OF(ASN1_INTEGER) *noticenos; +} NOTICEREF; + +typedef struct USERNOTICE_st { + NOTICEREF *noticeref; + ASN1_STRING *exptext; +} USERNOTICE; + +typedef struct POLICYQUALINFO_st { + ASN1_OBJECT *pqualid; + union { + ASN1_IA5STRING *cpsuri; + USERNOTICE *usernotice; + ASN1_TYPE *other; + } d; +} POLICYQUALINFO; + +DECLARE_STACK_OF(POLICYQUALINFO) +DECLARE_ASN1_SET_OF(POLICYQUALINFO) + +typedef struct POLICYINFO_st { + ASN1_OBJECT *policyid; + STACK_OF(POLICYQUALINFO) *qualifiers; +} POLICYINFO; + +typedef STACK_OF(POLICYINFO) CERTIFICATEPOLICIES; + +DECLARE_STACK_OF(POLICYINFO) +DECLARE_ASN1_SET_OF(POLICYINFO) + +typedef struct POLICY_MAPPING_st { + ASN1_OBJECT *issuerDomainPolicy; + ASN1_OBJECT *subjectDomainPolicy; +} POLICY_MAPPING; + +DECLARE_STACK_OF(POLICY_MAPPING) + +typedef STACK_OF(POLICY_MAPPING) POLICY_MAPPINGS; + +typedef struct GENERAL_SUBTREE_st { + GENERAL_NAME *base; + ASN1_INTEGER *minimum; + ASN1_INTEGER *maximum; +} GENERAL_SUBTREE; + +DECLARE_STACK_OF(GENERAL_SUBTREE) + +struct NAME_CONSTRAINTS_st { + STACK_OF(GENERAL_SUBTREE) *permittedSubtrees; + STACK_OF(GENERAL_SUBTREE) *excludedSubtrees; +}; + +typedef struct POLICY_CONSTRAINTS_st { + ASN1_INTEGER *requireExplicitPolicy; + ASN1_INTEGER *inhibitPolicyMapping; +} POLICY_CONSTRAINTS; + +/* Proxy certificate structures, see RFC 3820 */ +typedef struct PROXY_POLICY_st { + ASN1_OBJECT *policyLanguage; + ASN1_OCTET_STRING *policy; +} PROXY_POLICY; + +typedef struct PROXY_CERT_INFO_EXTENSION_st { + ASN1_INTEGER *pcPathLengthConstraint; + PROXY_POLICY *proxyPolicy; +} PROXY_CERT_INFO_EXTENSION; + +DECLARE_ASN1_FUNCTIONS(PROXY_POLICY) +DECLARE_ASN1_FUNCTIONS(PROXY_CERT_INFO_EXTENSION) + +struct ISSUING_DIST_POINT_st { + DIST_POINT_NAME *distpoint; + int onlyuser; + int onlyCA; + ASN1_BIT_STRING *onlysomereasons; + int indirectCRL; + int onlyattr; +}; + +/* Values in idp_flags field */ +/* IDP present */ +# define IDP_PRESENT 0x1 +/* IDP values inconsistent */ +# define IDP_INVALID 0x2 +/* onlyuser true */ +# define IDP_ONLYUSER 0x4 +/* onlyCA true */ +# define IDP_ONLYCA 0x8 +/* onlyattr true */ +# define IDP_ONLYATTR 0x10 +/* indirectCRL true */ +# define IDP_INDIRECT 0x20 +/* onlysomereasons present */ +# define IDP_REASONS 0x40 + +# define X509V3_conf_err(val) ERR_add_error_data(6, "section:", val->section, \ +",name:", val->name, ",value:", val->value); + +# define X509V3_set_ctx_test(ctx) \ + X509V3_set_ctx(ctx, NULL, NULL, NULL, NULL, CTX_TEST) +# define X509V3_set_ctx_nodb(ctx) (ctx)->db = NULL; + +# define EXT_BITSTRING(nid, table) { nid, 0, ASN1_ITEM_ref(ASN1_BIT_STRING), \ + 0,0,0,0, \ + 0,0, \ + (X509V3_EXT_I2V)i2v_ASN1_BIT_STRING, \ + (X509V3_EXT_V2I)v2i_ASN1_BIT_STRING, \ + NULL, NULL, \ + table} + +# define EXT_IA5STRING(nid) { nid, 0, ASN1_ITEM_ref(ASN1_IA5STRING), \ + 0,0,0,0, \ + (X509V3_EXT_I2S)i2s_ASN1_IA5STRING, \ + (X509V3_EXT_S2I)s2i_ASN1_IA5STRING, \ + 0,0,0,0, \ + NULL} + +# define EXT_END { -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} + +/* X509_PURPOSE stuff */ + +# define EXFLAG_BCONS 0x1 +# define EXFLAG_KUSAGE 0x2 +# define EXFLAG_XKUSAGE 0x4 +# define EXFLAG_NSCERT 0x8 + +# define EXFLAG_CA 0x10 +/* Really self issued not necessarily self signed */ +# define EXFLAG_SI 0x20 +# define EXFLAG_V1 0x40 +# define EXFLAG_INVALID 0x80 +# define EXFLAG_SET 0x100 +# define EXFLAG_CRITICAL 0x200 +# define EXFLAG_PROXY 0x400 + +# define EXFLAG_INVALID_POLICY 0x800 +# define EXFLAG_FRESHEST 0x1000 +/* Self signed */ +# define EXFLAG_SS 0x2000 + +# define KU_DIGITAL_SIGNATURE 0x0080 +# define KU_NON_REPUDIATION 0x0040 +# define KU_KEY_ENCIPHERMENT 0x0020 +# define KU_DATA_ENCIPHERMENT 0x0010 +# define KU_KEY_AGREEMENT 0x0008 +# define KU_KEY_CERT_SIGN 0x0004 +# define KU_CRL_SIGN 0x0002 +# define KU_ENCIPHER_ONLY 0x0001 +# define KU_DECIPHER_ONLY 0x8000 + +# define NS_SSL_CLIENT 0x80 +# define NS_SSL_SERVER 0x40 +# define NS_SMIME 0x20 +# define NS_OBJSIGN 0x10 +# define NS_SSL_CA 0x04 +# define NS_SMIME_CA 0x02 +# define NS_OBJSIGN_CA 0x01 +# define NS_ANY_CA (NS_SSL_CA|NS_SMIME_CA|NS_OBJSIGN_CA) + +# define XKU_SSL_SERVER 0x1 +# define XKU_SSL_CLIENT 0x2 +# define XKU_SMIME 0x4 +# define XKU_CODE_SIGN 0x8 +# define XKU_SGC 0x10 +# define XKU_OCSP_SIGN 0x20 +# define XKU_TIMESTAMP 0x40 +# define XKU_DVCS 0x80 +# define XKU_ANYEKU 0x100 + +# define X509_PURPOSE_DYNAMIC 0x1 +# define X509_PURPOSE_DYNAMIC_NAME 0x2 + +typedef struct x509_purpose_st { + int purpose; + int trust; /* Default trust ID */ + int flags; + int (*check_purpose) (const struct x509_purpose_st *, const X509 *, int); + char *name; + char *sname; + void *usr_data; +} X509_PURPOSE; + +# define X509_PURPOSE_SSL_CLIENT 1 +# define X509_PURPOSE_SSL_SERVER 2 +# define X509_PURPOSE_NS_SSL_SERVER 3 +# define X509_PURPOSE_SMIME_SIGN 4 +# define X509_PURPOSE_SMIME_ENCRYPT 5 +# define X509_PURPOSE_CRL_SIGN 6 +# define X509_PURPOSE_ANY 7 +# define X509_PURPOSE_OCSP_HELPER 8 +# define X509_PURPOSE_TIMESTAMP_SIGN 9 + +# define X509_PURPOSE_MIN 1 +# define X509_PURPOSE_MAX 9 + +/* Flags for X509V3_EXT_print() */ + +# define X509V3_EXT_UNKNOWN_MASK (0xfL << 16) +/* Return error for unknown extensions */ +# define X509V3_EXT_DEFAULT 0 +/* Print error for unknown extensions */ +# define X509V3_EXT_ERROR_UNKNOWN (1L << 16) +/* ASN1 parse unknown extensions */ +# define X509V3_EXT_PARSE_UNKNOWN (2L << 16) +/* BIO_dump unknown extensions */ +# define X509V3_EXT_DUMP_UNKNOWN (3L << 16) + +/* Flags for X509V3_add1_i2d */ + +# define X509V3_ADD_OP_MASK 0xfL +# define X509V3_ADD_DEFAULT 0L +# define X509V3_ADD_APPEND 1L +# define X509V3_ADD_REPLACE 2L +# define X509V3_ADD_REPLACE_EXISTING 3L +# define X509V3_ADD_KEEP_EXISTING 4L +# define X509V3_ADD_DELETE 5L +# define X509V3_ADD_SILENT 0x10 + +DECLARE_STACK_OF(X509_PURPOSE) + +DECLARE_ASN1_FUNCTIONS(BASIC_CONSTRAINTS) + +DECLARE_ASN1_FUNCTIONS(SXNET) +DECLARE_ASN1_FUNCTIONS(SXNETID) + +int SXNET_add_id_asc(SXNET **psx, char *zone, char *user, int userlen); +int SXNET_add_id_ulong(SXNET **psx, unsigned long lzone, char *user, + int userlen); +int SXNET_add_id_INTEGER(SXNET **psx, ASN1_INTEGER *izone, char *user, + int userlen); + +ASN1_OCTET_STRING *SXNET_get_id_asc(SXNET *sx, char *zone); +ASN1_OCTET_STRING *SXNET_get_id_ulong(SXNET *sx, unsigned long lzone); +ASN1_OCTET_STRING *SXNET_get_id_INTEGER(SXNET *sx, ASN1_INTEGER *zone); + +DECLARE_ASN1_FUNCTIONS(AUTHORITY_KEYID) + +DECLARE_ASN1_FUNCTIONS(PKEY_USAGE_PERIOD) + +DECLARE_ASN1_FUNCTIONS(GENERAL_NAME) +GENERAL_NAME *GENERAL_NAME_dup(GENERAL_NAME *a); +int GENERAL_NAME_cmp(GENERAL_NAME *a, GENERAL_NAME *b); + +ASN1_BIT_STRING *v2i_ASN1_BIT_STRING(X509V3_EXT_METHOD *method, + X509V3_CTX *ctx, + STACK_OF(CONF_VALUE) *nval); +STACK_OF(CONF_VALUE) *i2v_ASN1_BIT_STRING(X509V3_EXT_METHOD *method, + ASN1_BIT_STRING *bits, + STACK_OF(CONF_VALUE) *extlist); + +STACK_OF(CONF_VALUE) *i2v_GENERAL_NAME(X509V3_EXT_METHOD *method, + GENERAL_NAME *gen, + STACK_OF(CONF_VALUE) *ret); +int GENERAL_NAME_print(BIO *out, GENERAL_NAME *gen); + +DECLARE_ASN1_FUNCTIONS(GENERAL_NAMES) + +STACK_OF(CONF_VALUE) *i2v_GENERAL_NAMES(X509V3_EXT_METHOD *method, + GENERAL_NAMES *gen, + STACK_OF(CONF_VALUE) *extlist); +GENERAL_NAMES *v2i_GENERAL_NAMES(const X509V3_EXT_METHOD *method, + X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval); + +DECLARE_ASN1_FUNCTIONS(OTHERNAME) +DECLARE_ASN1_FUNCTIONS(EDIPARTYNAME) +int OTHERNAME_cmp(OTHERNAME *a, OTHERNAME *b); +void GENERAL_NAME_set0_value(GENERAL_NAME *a, int type, void *value); +void *GENERAL_NAME_get0_value(GENERAL_NAME *a, int *ptype); +int GENERAL_NAME_set0_othername(GENERAL_NAME *gen, + ASN1_OBJECT *oid, ASN1_TYPE *value); +int GENERAL_NAME_get0_otherName(GENERAL_NAME *gen, + ASN1_OBJECT **poid, ASN1_TYPE **pvalue); + +char *i2s_ASN1_OCTET_STRING(X509V3_EXT_METHOD *method, + ASN1_OCTET_STRING *ia5); +ASN1_OCTET_STRING *s2i_ASN1_OCTET_STRING(X509V3_EXT_METHOD *method, + X509V3_CTX *ctx, char *str); + +DECLARE_ASN1_FUNCTIONS(EXTENDED_KEY_USAGE) +int i2a_ACCESS_DESCRIPTION(BIO *bp, ACCESS_DESCRIPTION *a); + +DECLARE_ASN1_FUNCTIONS(CERTIFICATEPOLICIES) +DECLARE_ASN1_FUNCTIONS(POLICYINFO) +DECLARE_ASN1_FUNCTIONS(POLICYQUALINFO) +DECLARE_ASN1_FUNCTIONS(USERNOTICE) +DECLARE_ASN1_FUNCTIONS(NOTICEREF) + +DECLARE_ASN1_FUNCTIONS(CRL_DIST_POINTS) +DECLARE_ASN1_FUNCTIONS(DIST_POINT) +DECLARE_ASN1_FUNCTIONS(DIST_POINT_NAME) +DECLARE_ASN1_FUNCTIONS(ISSUING_DIST_POINT) + +int DIST_POINT_set_dpname(DIST_POINT_NAME *dpn, X509_NAME *iname); + +int NAME_CONSTRAINTS_check(X509 *x, NAME_CONSTRAINTS *nc); + +DECLARE_ASN1_FUNCTIONS(ACCESS_DESCRIPTION) +DECLARE_ASN1_FUNCTIONS(AUTHORITY_INFO_ACCESS) + +DECLARE_ASN1_ITEM(POLICY_MAPPING) +DECLARE_ASN1_ALLOC_FUNCTIONS(POLICY_MAPPING) +DECLARE_ASN1_ITEM(POLICY_MAPPINGS) + +DECLARE_ASN1_ITEM(GENERAL_SUBTREE) +DECLARE_ASN1_ALLOC_FUNCTIONS(GENERAL_SUBTREE) + +DECLARE_ASN1_ITEM(NAME_CONSTRAINTS) +DECLARE_ASN1_ALLOC_FUNCTIONS(NAME_CONSTRAINTS) + +DECLARE_ASN1_ALLOC_FUNCTIONS(POLICY_CONSTRAINTS) +DECLARE_ASN1_ITEM(POLICY_CONSTRAINTS) + +GENERAL_NAME *a2i_GENERAL_NAME(GENERAL_NAME *out, + const X509V3_EXT_METHOD *method, + X509V3_CTX *ctx, int gen_type, char *value, + int is_nc); + +# ifdef HEADER_CONF_H +GENERAL_NAME *v2i_GENERAL_NAME(const X509V3_EXT_METHOD *method, + X509V3_CTX *ctx, CONF_VALUE *cnf); +GENERAL_NAME *v2i_GENERAL_NAME_ex(GENERAL_NAME *out, + const X509V3_EXT_METHOD *method, + X509V3_CTX *ctx, CONF_VALUE *cnf, + int is_nc); +void X509V3_conf_free(CONF_VALUE *val); + +X509_EXTENSION *X509V3_EXT_nconf_nid(CONF *conf, X509V3_CTX *ctx, int ext_nid, + char *value); +X509_EXTENSION *X509V3_EXT_nconf(CONF *conf, X509V3_CTX *ctx, char *name, + char *value); +int X509V3_EXT_add_nconf_sk(CONF *conf, X509V3_CTX *ctx, char *section, + STACK_OF(X509_EXTENSION) **sk); +int X509V3_EXT_add_nconf(CONF *conf, X509V3_CTX *ctx, char *section, + X509 *cert); +int X509V3_EXT_REQ_add_nconf(CONF *conf, X509V3_CTX *ctx, char *section, + X509_REQ *req); +int X509V3_EXT_CRL_add_nconf(CONF *conf, X509V3_CTX *ctx, char *section, + X509_CRL *crl); + +X509_EXTENSION *X509V3_EXT_conf_nid(LHASH_OF(CONF_VALUE) *conf, + X509V3_CTX *ctx, int ext_nid, + char *value); +X509_EXTENSION *X509V3_EXT_conf(LHASH_OF(CONF_VALUE) *conf, X509V3_CTX *ctx, + char *name, char *value); +int X509V3_EXT_add_conf(LHASH_OF(CONF_VALUE) *conf, X509V3_CTX *ctx, + char *section, X509 *cert); +int X509V3_EXT_REQ_add_conf(LHASH_OF(CONF_VALUE) *conf, X509V3_CTX *ctx, + char *section, X509_REQ *req); +int X509V3_EXT_CRL_add_conf(LHASH_OF(CONF_VALUE) *conf, X509V3_CTX *ctx, + char *section, X509_CRL *crl); + +int X509V3_add_value_bool_nf(char *name, int asn1_bool, + STACK_OF(CONF_VALUE) **extlist); +int X509V3_get_value_bool(CONF_VALUE *value, int *asn1_bool); +int X509V3_get_value_int(CONF_VALUE *value, ASN1_INTEGER **aint); +void X509V3_set_nconf(X509V3_CTX *ctx, CONF *conf); +void X509V3_set_conf_lhash(X509V3_CTX *ctx, LHASH_OF(CONF_VALUE) *lhash); +# endif + +char *X509V3_get_string(X509V3_CTX *ctx, char *name, char *section); +STACK_OF(CONF_VALUE) *X509V3_get_section(X509V3_CTX *ctx, char *section); +void X509V3_string_free(X509V3_CTX *ctx, char *str); +void X509V3_section_free(X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *section); +void X509V3_set_ctx(X509V3_CTX *ctx, X509 *issuer, X509 *subject, + X509_REQ *req, X509_CRL *crl, int flags); + +int X509V3_add_value(const char *name, const char *value, + STACK_OF(CONF_VALUE) **extlist); +int X509V3_add_value_uchar(const char *name, const unsigned char *value, + STACK_OF(CONF_VALUE) **extlist); +int X509V3_add_value_bool(const char *name, int asn1_bool, + STACK_OF(CONF_VALUE) **extlist); +int X509V3_add_value_int(const char *name, ASN1_INTEGER *aint, + STACK_OF(CONF_VALUE) **extlist); +char *i2s_ASN1_INTEGER(X509V3_EXT_METHOD *meth, ASN1_INTEGER *aint); +ASN1_INTEGER *s2i_ASN1_INTEGER(X509V3_EXT_METHOD *meth, char *value); +char *i2s_ASN1_ENUMERATED(X509V3_EXT_METHOD *meth, ASN1_ENUMERATED *aint); +char *i2s_ASN1_ENUMERATED_TABLE(X509V3_EXT_METHOD *meth, + ASN1_ENUMERATED *aint); +int X509V3_EXT_add(X509V3_EXT_METHOD *ext); +int X509V3_EXT_add_list(X509V3_EXT_METHOD *extlist); +int X509V3_EXT_add_alias(int nid_to, int nid_from); +void X509V3_EXT_cleanup(void); + +const X509V3_EXT_METHOD *X509V3_EXT_get(X509_EXTENSION *ext); +const X509V3_EXT_METHOD *X509V3_EXT_get_nid(int nid); +int X509V3_add_standard_extensions(void); +STACK_OF(CONF_VALUE) *X509V3_parse_list(const char *line); +void *X509V3_EXT_d2i(X509_EXTENSION *ext); +void *X509V3_get_d2i(STACK_OF(X509_EXTENSION) *x, int nid, int *crit, + int *idx); +int X509V3_EXT_free(int nid, void *ext_data); + +X509_EXTENSION *X509V3_EXT_i2d(int ext_nid, int crit, void *ext_struc); +int X509V3_add1_i2d(STACK_OF(X509_EXTENSION) **x, int nid, void *value, + int crit, unsigned long flags); + +char *hex_to_string(const unsigned char *buffer, long len); +unsigned char *string_to_hex(const char *str, long *len); +int name_cmp(const char *name, const char *cmp); + +void X509V3_EXT_val_prn(BIO *out, STACK_OF(CONF_VALUE) *val, int indent, + int ml); +int X509V3_EXT_print(BIO *out, X509_EXTENSION *ext, unsigned long flag, + int indent); +int X509V3_EXT_print_fp(FILE *out, X509_EXTENSION *ext, int flag, int indent); + +int X509V3_extensions_print(BIO *out, char *title, + STACK_OF(X509_EXTENSION) *exts, + unsigned long flag, int indent); + +int X509_check_ca(X509 *x); +int X509_check_purpose(X509 *x, int id, int ca); +int X509_supported_extension(X509_EXTENSION *ex); +int X509_PURPOSE_set(int *p, int purpose); +int X509_check_issued(X509 *issuer, X509 *subject); +int X509_check_akid(X509 *issuer, AUTHORITY_KEYID *akid); +int X509_PURPOSE_get_count(void); +X509_PURPOSE *X509_PURPOSE_get0(int idx); +int X509_PURPOSE_get_by_sname(char *sname); +int X509_PURPOSE_get_by_id(int id); +int X509_PURPOSE_add(int id, int trust, int flags, + int (*ck) (const X509_PURPOSE *, const X509 *, int), + char *name, char *sname, void *arg); +char *X509_PURPOSE_get0_name(X509_PURPOSE *xp); +char *X509_PURPOSE_get0_sname(X509_PURPOSE *xp); +int X509_PURPOSE_get_trust(X509_PURPOSE *xp); +void X509_PURPOSE_cleanup(void); +int X509_PURPOSE_get_id(X509_PURPOSE *); + +STACK_OF(OPENSSL_STRING) *X509_get1_email(X509 *x); +STACK_OF(OPENSSL_STRING) *X509_REQ_get1_email(X509_REQ *x); +void X509_email_free(STACK_OF(OPENSSL_STRING) *sk); +STACK_OF(OPENSSL_STRING) *X509_get1_ocsp(X509 *x); +/* Flags for X509_check_* functions */ + +/* + * Always check subject name for host match even if subject alt names present + */ +# define X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT 0x1 +/* Disable wildcard matching for dnsName fields and common name. */ +# define X509_CHECK_FLAG_NO_WILDCARDS 0x2 +/* Wildcards must not match a partial label. */ +# define X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS 0x4 +/* Allow (non-partial) wildcards to match multiple labels. */ +# define X509_CHECK_FLAG_MULTI_LABEL_WILDCARDS 0x8 +/* Constraint verifier subdomain patterns to match a single labels. */ +# define X509_CHECK_FLAG_SINGLE_LABEL_SUBDOMAINS 0x10 +/* + * Match reference identifiers starting with "." to any sub-domain. + * This is a non-public flag, turned on implicitly when the subject + * reference identity is a DNS name. + */ +# define _X509_CHECK_FLAG_DOT_SUBDOMAINS 0x8000 + +int X509_check_host(X509 *x, const char *chk, size_t chklen, + unsigned int flags, char **peername); +int X509_check_email(X509 *x, const char *chk, size_t chklen, + unsigned int flags); +int X509_check_ip(X509 *x, const unsigned char *chk, size_t chklen, + unsigned int flags); +int X509_check_ip_asc(X509 *x, const char *ipasc, unsigned int flags); + +ASN1_OCTET_STRING *a2i_IPADDRESS(const char *ipasc); +ASN1_OCTET_STRING *a2i_IPADDRESS_NC(const char *ipasc); +int a2i_ipadd(unsigned char *ipout, const char *ipasc); +int X509V3_NAME_from_section(X509_NAME *nm, STACK_OF(CONF_VALUE) *dn_sk, + unsigned long chtype); + +void X509_POLICY_NODE_print(BIO *out, X509_POLICY_NODE *node, int indent); +DECLARE_STACK_OF(X509_POLICY_NODE) + +# ifndef OPENSSL_NO_RFC3779 + +typedef struct ASRange_st { + ASN1_INTEGER *min, *max; +} ASRange; + +# define ASIdOrRange_id 0 +# define ASIdOrRange_range 1 + +typedef struct ASIdOrRange_st { + int type; + union { + ASN1_INTEGER *id; + ASRange *range; + } u; +} ASIdOrRange; + +typedef STACK_OF(ASIdOrRange) ASIdOrRanges; +DECLARE_STACK_OF(ASIdOrRange) + +# define ASIdentifierChoice_inherit 0 +# define ASIdentifierChoice_asIdsOrRanges 1 + +typedef struct ASIdentifierChoice_st { + int type; + union { + ASN1_NULL *inherit; + ASIdOrRanges *asIdsOrRanges; + } u; +} ASIdentifierChoice; + +typedef struct ASIdentifiers_st { + ASIdentifierChoice *asnum, *rdi; +} ASIdentifiers; + +DECLARE_ASN1_FUNCTIONS(ASRange) +DECLARE_ASN1_FUNCTIONS(ASIdOrRange) +DECLARE_ASN1_FUNCTIONS(ASIdentifierChoice) +DECLARE_ASN1_FUNCTIONS(ASIdentifiers) + +typedef struct IPAddressRange_st { + ASN1_BIT_STRING *min, *max; +} IPAddressRange; + +# define IPAddressOrRange_addressPrefix 0 +# define IPAddressOrRange_addressRange 1 + +typedef struct IPAddressOrRange_st { + int type; + union { + ASN1_BIT_STRING *addressPrefix; + IPAddressRange *addressRange; + } u; +} IPAddressOrRange; + +typedef STACK_OF(IPAddressOrRange) IPAddressOrRanges; +DECLARE_STACK_OF(IPAddressOrRange) + +# define IPAddressChoice_inherit 0 +# define IPAddressChoice_addressesOrRanges 1 + +typedef struct IPAddressChoice_st { + int type; + union { + ASN1_NULL *inherit; + IPAddressOrRanges *addressesOrRanges; + } u; +} IPAddressChoice; + +typedef struct IPAddressFamily_st { + ASN1_OCTET_STRING *addressFamily; + IPAddressChoice *ipAddressChoice; +} IPAddressFamily; + +typedef STACK_OF(IPAddressFamily) IPAddrBlocks; +DECLARE_STACK_OF(IPAddressFamily) + +DECLARE_ASN1_FUNCTIONS(IPAddressRange) +DECLARE_ASN1_FUNCTIONS(IPAddressOrRange) +DECLARE_ASN1_FUNCTIONS(IPAddressChoice) +DECLARE_ASN1_FUNCTIONS(IPAddressFamily) + +/* + * API tag for elements of the ASIdentifer SEQUENCE. + */ +# define V3_ASID_ASNUM 0 +# define V3_ASID_RDI 1 + +/* + * AFI values, assigned by IANA. It'd be nice to make the AFI + * handling code totally generic, but there are too many little things + * that would need to be defined for other address families for it to + * be worth the trouble. + */ +# define IANA_AFI_IPV4 1 +# define IANA_AFI_IPV6 2 + +/* + * Utilities to construct and extract values from RFC3779 extensions, + * since some of the encodings (particularly for IP address prefixes + * and ranges) are a bit tedious to work with directly. + */ +int v3_asid_add_inherit(ASIdentifiers *asid, int which); +int v3_asid_add_id_or_range(ASIdentifiers *asid, int which, + ASN1_INTEGER *min, ASN1_INTEGER *max); +int v3_addr_add_inherit(IPAddrBlocks *addr, + const unsigned afi, const unsigned *safi); +int v3_addr_add_prefix(IPAddrBlocks *addr, + const unsigned afi, const unsigned *safi, + unsigned char *a, const int prefixlen); +int v3_addr_add_range(IPAddrBlocks *addr, + const unsigned afi, const unsigned *safi, + unsigned char *min, unsigned char *max); +unsigned v3_addr_get_afi(const IPAddressFamily *f); +int v3_addr_get_range(IPAddressOrRange *aor, const unsigned afi, + unsigned char *min, unsigned char *max, + const int length); + +/* + * Canonical forms. + */ +int v3_asid_is_canonical(ASIdentifiers *asid); +int v3_addr_is_canonical(IPAddrBlocks *addr); +int v3_asid_canonize(ASIdentifiers *asid); +int v3_addr_canonize(IPAddrBlocks *addr); + +/* + * Tests for inheritance and containment. + */ +int v3_asid_inherits(ASIdentifiers *asid); +int v3_addr_inherits(IPAddrBlocks *addr); +int v3_asid_subset(ASIdentifiers *a, ASIdentifiers *b); +int v3_addr_subset(IPAddrBlocks *a, IPAddrBlocks *b); + +/* + * Check whether RFC 3779 extensions nest properly in chains. + */ +int v3_asid_validate_path(X509_STORE_CTX *); +int v3_addr_validate_path(X509_STORE_CTX *); +int v3_asid_validate_resource_set(STACK_OF(X509) *chain, + ASIdentifiers *ext, int allow_inheritance); +int v3_addr_validate_resource_set(STACK_OF(X509) *chain, + IPAddrBlocks *ext, int allow_inheritance); + +# endif /* OPENSSL_NO_RFC3779 */ + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_X509V3_strings(void); + +/* Error codes for the X509V3 functions. */ + +/* Function codes. */ +# define X509V3_F_A2I_GENERAL_NAME 164 +# define X509V3_F_ASIDENTIFIERCHOICE_CANONIZE 161 +# define X509V3_F_ASIDENTIFIERCHOICE_IS_CANONICAL 162 +# define X509V3_F_COPY_EMAIL 122 +# define X509V3_F_COPY_ISSUER 123 +# define X509V3_F_DO_DIRNAME 144 +# define X509V3_F_DO_EXT_CONF 124 +# define X509V3_F_DO_EXT_I2D 135 +# define X509V3_F_DO_EXT_NCONF 151 +# define X509V3_F_DO_I2V_NAME_CONSTRAINTS 148 +# define X509V3_F_GNAMES_FROM_SECTNAME 156 +# define X509V3_F_HEX_TO_STRING 111 +# define X509V3_F_I2S_ASN1_ENUMERATED 121 +# define X509V3_F_I2S_ASN1_IA5STRING 149 +# define X509V3_F_I2S_ASN1_INTEGER 120 +# define X509V3_F_I2V_AUTHORITY_INFO_ACCESS 138 +# define X509V3_F_NOTICE_SECTION 132 +# define X509V3_F_NREF_NOS 133 +# define X509V3_F_POLICY_SECTION 131 +# define X509V3_F_PROCESS_PCI_VALUE 150 +# define X509V3_F_R2I_CERTPOL 130 +# define X509V3_F_R2I_PCI 155 +# define X509V3_F_S2I_ASN1_IA5STRING 100 +# define X509V3_F_S2I_ASN1_INTEGER 108 +# define X509V3_F_S2I_ASN1_OCTET_STRING 112 +# define X509V3_F_S2I_ASN1_SKEY_ID 114 +# define X509V3_F_S2I_SKEY_ID 115 +# define X509V3_F_SET_DIST_POINT_NAME 158 +# define X509V3_F_STRING_TO_HEX 113 +# define X509V3_F_SXNET_ADD_ID_ASC 125 +# define X509V3_F_SXNET_ADD_ID_INTEGER 126 +# define X509V3_F_SXNET_ADD_ID_ULONG 127 +# define X509V3_F_SXNET_GET_ID_ASC 128 +# define X509V3_F_SXNET_GET_ID_ULONG 129 +# define X509V3_F_V2I_ASIDENTIFIERS 163 +# define X509V3_F_V2I_ASN1_BIT_STRING 101 +# define X509V3_F_V2I_AUTHORITY_INFO_ACCESS 139 +# define X509V3_F_V2I_AUTHORITY_KEYID 119 +# define X509V3_F_V2I_BASIC_CONSTRAINTS 102 +# define X509V3_F_V2I_CRLD 134 +# define X509V3_F_V2I_EXTENDED_KEY_USAGE 103 +# define X509V3_F_V2I_GENERAL_NAMES 118 +# define X509V3_F_V2I_GENERAL_NAME_EX 117 +# define X509V3_F_V2I_IDP 157 +# define X509V3_F_V2I_IPADDRBLOCKS 159 +# define X509V3_F_V2I_ISSUER_ALT 153 +# define X509V3_F_V2I_NAME_CONSTRAINTS 147 +# define X509V3_F_V2I_POLICY_CONSTRAINTS 146 +# define X509V3_F_V2I_POLICY_MAPPINGS 145 +# define X509V3_F_V2I_SUBJECT_ALT 154 +# define X509V3_F_V3_ADDR_VALIDATE_PATH_INTERNAL 160 +# define X509V3_F_V3_GENERIC_EXTENSION 116 +# define X509V3_F_X509V3_ADD1_I2D 140 +# define X509V3_F_X509V3_ADD_VALUE 105 +# define X509V3_F_X509V3_EXT_ADD 104 +# define X509V3_F_X509V3_EXT_ADD_ALIAS 106 +# define X509V3_F_X509V3_EXT_CONF 107 +# define X509V3_F_X509V3_EXT_FREE 165 +# define X509V3_F_X509V3_EXT_I2D 136 +# define X509V3_F_X509V3_EXT_NCONF 152 +# define X509V3_F_X509V3_GET_SECTION 142 +# define X509V3_F_X509V3_GET_STRING 143 +# define X509V3_F_X509V3_GET_VALUE_BOOL 110 +# define X509V3_F_X509V3_PARSE_LIST 109 +# define X509V3_F_X509_PURPOSE_ADD 137 +# define X509V3_F_X509_PURPOSE_SET 141 + +/* Reason codes. */ +# define X509V3_R_BAD_IP_ADDRESS 118 +# define X509V3_R_BAD_OBJECT 119 +# define X509V3_R_BN_DEC2BN_ERROR 100 +# define X509V3_R_BN_TO_ASN1_INTEGER_ERROR 101 +# define X509V3_R_CANNOT_FIND_FREE_FUNCTION 168 +# define X509V3_R_DIRNAME_ERROR 149 +# define X509V3_R_DISTPOINT_ALREADY_SET 160 +# define X509V3_R_DUPLICATE_ZONE_ID 133 +# define X509V3_R_ERROR_CONVERTING_ZONE 131 +# define X509V3_R_ERROR_CREATING_EXTENSION 144 +# define X509V3_R_ERROR_IN_EXTENSION 128 +# define X509V3_R_EXPECTED_A_SECTION_NAME 137 +# define X509V3_R_EXTENSION_EXISTS 145 +# define X509V3_R_EXTENSION_NAME_ERROR 115 +# define X509V3_R_EXTENSION_NOT_FOUND 102 +# define X509V3_R_EXTENSION_SETTING_NOT_SUPPORTED 103 +# define X509V3_R_EXTENSION_VALUE_ERROR 116 +# define X509V3_R_ILLEGAL_EMPTY_EXTENSION 151 +# define X509V3_R_ILLEGAL_HEX_DIGIT 113 +# define X509V3_R_INCORRECT_POLICY_SYNTAX_TAG 152 +# define X509V3_R_INVALID_ASNUMBER 162 +# define X509V3_R_INVALID_ASRANGE 163 +# define X509V3_R_INVALID_BOOLEAN_STRING 104 +# define X509V3_R_INVALID_EXTENSION_STRING 105 +# define X509V3_R_INVALID_INHERITANCE 165 +# define X509V3_R_INVALID_IPADDRESS 166 +# define X509V3_R_INVALID_MULTIPLE_RDNS 161 +# define X509V3_R_INVALID_NAME 106 +# define X509V3_R_INVALID_NULL_ARGUMENT 107 +# define X509V3_R_INVALID_NULL_NAME 108 +# define X509V3_R_INVALID_NULL_VALUE 109 +# define X509V3_R_INVALID_NUMBER 140 +# define X509V3_R_INVALID_NUMBERS 141 +# define X509V3_R_INVALID_OBJECT_IDENTIFIER 110 +# define X509V3_R_INVALID_OPTION 138 +# define X509V3_R_INVALID_POLICY_IDENTIFIER 134 +# define X509V3_R_INVALID_PROXY_POLICY_SETTING 153 +# define X509V3_R_INVALID_PURPOSE 146 +# define X509V3_R_INVALID_SAFI 164 +# define X509V3_R_INVALID_SECTION 135 +# define X509V3_R_INVALID_SYNTAX 143 +# define X509V3_R_ISSUER_DECODE_ERROR 126 +# define X509V3_R_MISSING_VALUE 124 +# define X509V3_R_NEED_ORGANIZATION_AND_NUMBERS 142 +# define X509V3_R_NO_CONFIG_DATABASE 136 +# define X509V3_R_NO_ISSUER_CERTIFICATE 121 +# define X509V3_R_NO_ISSUER_DETAILS 127 +# define X509V3_R_NO_POLICY_IDENTIFIER 139 +# define X509V3_R_NO_PROXY_CERT_POLICY_LANGUAGE_DEFINED 154 +# define X509V3_R_NO_PUBLIC_KEY 114 +# define X509V3_R_NO_SUBJECT_DETAILS 125 +# define X509V3_R_ODD_NUMBER_OF_DIGITS 112 +# define X509V3_R_OPERATION_NOT_DEFINED 148 +# define X509V3_R_OTHERNAME_ERROR 147 +# define X509V3_R_POLICY_LANGUAGE_ALREADY_DEFINED 155 +# define X509V3_R_POLICY_PATH_LENGTH 156 +# define X509V3_R_POLICY_PATH_LENGTH_ALREADY_DEFINED 157 +# define X509V3_R_POLICY_SYNTAX_NOT_CURRENTLY_SUPPORTED 158 +# define X509V3_R_POLICY_WHEN_PROXY_LANGUAGE_REQUIRES_NO_POLICY 159 +# define X509V3_R_SECTION_NOT_FOUND 150 +# define X509V3_R_UNABLE_TO_GET_ISSUER_DETAILS 122 +# define X509V3_R_UNABLE_TO_GET_ISSUER_KEYID 123 +# define X509V3_R_UNKNOWN_BIT_STRING_ARGUMENT 111 +# define X509V3_R_UNKNOWN_EXTENSION 129 +# define X509V3_R_UNKNOWN_EXTENSION_NAME 130 +# define X509V3_R_UNKNOWN_OPTION 120 +# define X509V3_R_UNSUPPORTED_OPTION 117 +# define X509V3_R_UNSUPPORTED_TYPE 167 +# define X509V3_R_USER_TOO_LONG 132 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/ext/openssl-osx/include/openssl/asn1.h b/ext/openssl-osx/include/openssl/asn1.h new file mode 100644 index 00000000..bb6ac95b --- /dev/null +++ b/ext/openssl-osx/include/openssl/asn1.h @@ -0,0 +1,1418 @@ +/* crypto/asn1/asn1.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_ASN1_H +# define HEADER_ASN1_H + +# include +# include +# ifndef OPENSSL_NO_BIO +# include +# endif +# include +# include + +# include + +# include +# ifndef OPENSSL_NO_DEPRECATED +# include +# endif + +# ifdef OPENSSL_BUILD_SHLIBCRYPTO +# undef OPENSSL_EXTERN +# define OPENSSL_EXTERN OPENSSL_EXPORT +# endif + +#ifdef __cplusplus +extern "C" { +#endif + +# define V_ASN1_UNIVERSAL 0x00 +# define V_ASN1_APPLICATION 0x40 +# define V_ASN1_CONTEXT_SPECIFIC 0x80 +# define V_ASN1_PRIVATE 0xc0 + +# define V_ASN1_CONSTRUCTED 0x20 +# define V_ASN1_PRIMITIVE_TAG 0x1f +# define V_ASN1_PRIMATIVE_TAG 0x1f + +# define V_ASN1_APP_CHOOSE -2/* let the recipient choose */ +# define V_ASN1_OTHER -3/* used in ASN1_TYPE */ +# define V_ASN1_ANY -4/* used in ASN1 template code */ + +# define V_ASN1_NEG 0x100/* negative flag */ + +# define V_ASN1_UNDEF -1 +# define V_ASN1_EOC 0 +# define V_ASN1_BOOLEAN 1 /**/ +# define V_ASN1_INTEGER 2 +# define V_ASN1_NEG_INTEGER (2 | V_ASN1_NEG) +# define V_ASN1_BIT_STRING 3 +# define V_ASN1_OCTET_STRING 4 +# define V_ASN1_NULL 5 +# define V_ASN1_OBJECT 6 +# define V_ASN1_OBJECT_DESCRIPTOR 7 +# define V_ASN1_EXTERNAL 8 +# define V_ASN1_REAL 9 +# define V_ASN1_ENUMERATED 10 +# define V_ASN1_NEG_ENUMERATED (10 | V_ASN1_NEG) +# define V_ASN1_UTF8STRING 12 +# define V_ASN1_SEQUENCE 16 +# define V_ASN1_SET 17 +# define V_ASN1_NUMERICSTRING 18 /**/ +# define V_ASN1_PRINTABLESTRING 19 +# define V_ASN1_T61STRING 20 +# define V_ASN1_TELETEXSTRING 20/* alias */ +# define V_ASN1_VIDEOTEXSTRING 21 /**/ +# define V_ASN1_IA5STRING 22 +# define V_ASN1_UTCTIME 23 +# define V_ASN1_GENERALIZEDTIME 24 /**/ +# define V_ASN1_GRAPHICSTRING 25 /**/ +# define V_ASN1_ISO64STRING 26 /**/ +# define V_ASN1_VISIBLESTRING 26/* alias */ +# define V_ASN1_GENERALSTRING 27 /**/ +# define V_ASN1_UNIVERSALSTRING 28 /**/ +# define V_ASN1_BMPSTRING 30 +/* For use with d2i_ASN1_type_bytes() */ +# define B_ASN1_NUMERICSTRING 0x0001 +# define B_ASN1_PRINTABLESTRING 0x0002 +# define B_ASN1_T61STRING 0x0004 +# define B_ASN1_TELETEXSTRING 0x0004 +# define B_ASN1_VIDEOTEXSTRING 0x0008 +# define B_ASN1_IA5STRING 0x0010 +# define B_ASN1_GRAPHICSTRING 0x0020 +# define B_ASN1_ISO64STRING 0x0040 +# define B_ASN1_VISIBLESTRING 0x0040 +# define B_ASN1_GENERALSTRING 0x0080 +# define B_ASN1_UNIVERSALSTRING 0x0100 +# define B_ASN1_OCTET_STRING 0x0200 +# define B_ASN1_BIT_STRING 0x0400 +# define B_ASN1_BMPSTRING 0x0800 +# define B_ASN1_UNKNOWN 0x1000 +# define B_ASN1_UTF8STRING 0x2000 +# define B_ASN1_UTCTIME 0x4000 +# define B_ASN1_GENERALIZEDTIME 0x8000 +# define B_ASN1_SEQUENCE 0x10000 +/* For use with ASN1_mbstring_copy() */ +# define MBSTRING_FLAG 0x1000 +# define MBSTRING_UTF8 (MBSTRING_FLAG) +# define MBSTRING_ASC (MBSTRING_FLAG|1) +# define MBSTRING_BMP (MBSTRING_FLAG|2) +# define MBSTRING_UNIV (MBSTRING_FLAG|4) +# define SMIME_OLDMIME 0x400 +# define SMIME_CRLFEOL 0x800 +# define SMIME_STREAM 0x1000 + struct X509_algor_st; +DECLARE_STACK_OF(X509_ALGOR) + +# define DECLARE_ASN1_SET_OF(type)/* filled in by mkstack.pl */ +# define IMPLEMENT_ASN1_SET_OF(type)/* nothing, no longer needed */ + +/* + * We MUST make sure that, except for constness, asn1_ctx_st and + * asn1_const_ctx are exactly the same. Fortunately, as soon as the old ASN1 + * parsing macros are gone, we can throw this away as well... + */ +typedef struct asn1_ctx_st { + unsigned char *p; /* work char pointer */ + int eos; /* end of sequence read for indefinite + * encoding */ + int error; /* error code to use when returning an error */ + int inf; /* constructed if 0x20, indefinite is 0x21 */ + int tag; /* tag from last 'get object' */ + int xclass; /* class from last 'get object' */ + long slen; /* length of last 'get object' */ + unsigned char *max; /* largest value of p allowed */ + unsigned char *q; /* temporary variable */ + unsigned char **pp; /* variable */ + int line; /* used in error processing */ +} ASN1_CTX; + +typedef struct asn1_const_ctx_st { + const unsigned char *p; /* work char pointer */ + int eos; /* end of sequence read for indefinite + * encoding */ + int error; /* error code to use when returning an error */ + int inf; /* constructed if 0x20, indefinite is 0x21 */ + int tag; /* tag from last 'get object' */ + int xclass; /* class from last 'get object' */ + long slen; /* length of last 'get object' */ + const unsigned char *max; /* largest value of p allowed */ + const unsigned char *q; /* temporary variable */ + const unsigned char **pp; /* variable */ + int line; /* used in error processing */ +} ASN1_const_CTX; + +/* + * These are used internally in the ASN1_OBJECT to keep track of whether the + * names and data need to be free()ed + */ +# define ASN1_OBJECT_FLAG_DYNAMIC 0x01/* internal use */ +# define ASN1_OBJECT_FLAG_CRITICAL 0x02/* critical x509v3 object id */ +# define ASN1_OBJECT_FLAG_DYNAMIC_STRINGS 0x04/* internal use */ +# define ASN1_OBJECT_FLAG_DYNAMIC_DATA 0x08/* internal use */ +struct asn1_object_st { + const char *sn, *ln; + int nid; + int length; + const unsigned char *data; /* data remains const after init */ + int flags; /* Should we free this one */ +}; + +# define ASN1_STRING_FLAG_BITS_LEFT 0x08/* Set if 0x07 has bits left value */ +/* + * This indicates that the ASN1_STRING is not a real value but just a place + * holder for the location where indefinite length constructed data should be + * inserted in the memory buffer + */ +# define ASN1_STRING_FLAG_NDEF 0x010 + +/* + * This flag is used by the CMS code to indicate that a string is not + * complete and is a place holder for content when it had all been accessed. + * The flag will be reset when content has been written to it. + */ + +# define ASN1_STRING_FLAG_CONT 0x020 +/* + * This flag is used by ASN1 code to indicate an ASN1_STRING is an MSTRING + * type. + */ +# define ASN1_STRING_FLAG_MSTRING 0x040 +/* This is the base type that holds just about everything :-) */ +struct asn1_string_st { + int length; + int type; + unsigned char *data; + /* + * The value of the following field depends on the type being held. It + * is mostly being used for BIT_STRING so if the input data has a + * non-zero 'unused bits' value, it will be handled correctly + */ + long flags; +}; + +/* + * ASN1_ENCODING structure: this is used to save the received encoding of an + * ASN1 type. This is useful to get round problems with invalid encodings + * which can break signatures. + */ + +typedef struct ASN1_ENCODING_st { + unsigned char *enc; /* DER encoding */ + long len; /* Length of encoding */ + int modified; /* set to 1 if 'enc' is invalid */ +} ASN1_ENCODING; + +/* Used with ASN1 LONG type: if a long is set to this it is omitted */ +# define ASN1_LONG_UNDEF 0x7fffffffL + +# define STABLE_FLAGS_MALLOC 0x01 +# define STABLE_NO_MASK 0x02 +# define DIRSTRING_TYPE \ + (B_ASN1_PRINTABLESTRING|B_ASN1_T61STRING|B_ASN1_BMPSTRING|B_ASN1_UTF8STRING) +# define PKCS9STRING_TYPE (DIRSTRING_TYPE|B_ASN1_IA5STRING) + +typedef struct asn1_string_table_st { + int nid; + long minsize; + long maxsize; + unsigned long mask; + unsigned long flags; +} ASN1_STRING_TABLE; + +DECLARE_STACK_OF(ASN1_STRING_TABLE) + +/* size limits: this stuff is taken straight from RFC2459 */ + +# define ub_name 32768 +# define ub_common_name 64 +# define ub_locality_name 128 +# define ub_state_name 128 +# define ub_organization_name 64 +# define ub_organization_unit_name 64 +# define ub_title 64 +# define ub_email_address 128 + +/* + * Declarations for template structures: for full definitions see asn1t.h + */ +typedef struct ASN1_TEMPLATE_st ASN1_TEMPLATE; +typedef struct ASN1_TLC_st ASN1_TLC; +/* This is just an opaque pointer */ +typedef struct ASN1_VALUE_st ASN1_VALUE; + +/* Declare ASN1 functions: the implement macro in in asn1t.h */ + +# define DECLARE_ASN1_FUNCTIONS(type) DECLARE_ASN1_FUNCTIONS_name(type, type) + +# define DECLARE_ASN1_ALLOC_FUNCTIONS(type) \ + DECLARE_ASN1_ALLOC_FUNCTIONS_name(type, type) + +# define DECLARE_ASN1_FUNCTIONS_name(type, name) \ + DECLARE_ASN1_ALLOC_FUNCTIONS_name(type, name) \ + DECLARE_ASN1_ENCODE_FUNCTIONS(type, name, name) + +# define DECLARE_ASN1_FUNCTIONS_fname(type, itname, name) \ + DECLARE_ASN1_ALLOC_FUNCTIONS_name(type, name) \ + DECLARE_ASN1_ENCODE_FUNCTIONS(type, itname, name) + +# define DECLARE_ASN1_ENCODE_FUNCTIONS(type, itname, name) \ + type *d2i_##name(type **a, const unsigned char **in, long len); \ + int i2d_##name(type *a, unsigned char **out); \ + DECLARE_ASN1_ITEM(itname) + +# define DECLARE_ASN1_ENCODE_FUNCTIONS_const(type, name) \ + type *d2i_##name(type **a, const unsigned char **in, long len); \ + int i2d_##name(const type *a, unsigned char **out); \ + DECLARE_ASN1_ITEM(name) + +# define DECLARE_ASN1_NDEF_FUNCTION(name) \ + int i2d_##name##_NDEF(name *a, unsigned char **out); + +# define DECLARE_ASN1_FUNCTIONS_const(name) \ + DECLARE_ASN1_ALLOC_FUNCTIONS(name) \ + DECLARE_ASN1_ENCODE_FUNCTIONS_const(name, name) + +# define DECLARE_ASN1_ALLOC_FUNCTIONS_name(type, name) \ + type *name##_new(void); \ + void name##_free(type *a); + +# define DECLARE_ASN1_PRINT_FUNCTION(stname) \ + DECLARE_ASN1_PRINT_FUNCTION_fname(stname, stname) + +# define DECLARE_ASN1_PRINT_FUNCTION_fname(stname, fname) \ + int fname##_print_ctx(BIO *out, stname *x, int indent, \ + const ASN1_PCTX *pctx); + +# define D2I_OF(type) type *(*)(type **,const unsigned char **,long) +# define I2D_OF(type) int (*)(type *,unsigned char **) +# define I2D_OF_const(type) int (*)(const type *,unsigned char **) + +# define CHECKED_D2I_OF(type, d2i) \ + ((d2i_of_void*) (1 ? d2i : ((D2I_OF(type))0))) +# define CHECKED_I2D_OF(type, i2d) \ + ((i2d_of_void*) (1 ? i2d : ((I2D_OF(type))0))) +# define CHECKED_NEW_OF(type, xnew) \ + ((void *(*)(void)) (1 ? xnew : ((type *(*)(void))0))) +# define CHECKED_PTR_OF(type, p) \ + ((void*) (1 ? p : (type*)0)) +# define CHECKED_PPTR_OF(type, p) \ + ((void**) (1 ? p : (type**)0)) + +# define TYPEDEF_D2I_OF(type) typedef type *d2i_of_##type(type **,const unsigned char **,long) +# define TYPEDEF_I2D_OF(type) typedef int i2d_of_##type(type *,unsigned char **) +# define TYPEDEF_D2I2D_OF(type) TYPEDEF_D2I_OF(type); TYPEDEF_I2D_OF(type) + +TYPEDEF_D2I2D_OF(void); + +/*- + * The following macros and typedefs allow an ASN1_ITEM + * to be embedded in a structure and referenced. Since + * the ASN1_ITEM pointers need to be globally accessible + * (possibly from shared libraries) they may exist in + * different forms. On platforms that support it the + * ASN1_ITEM structure itself will be globally exported. + * Other platforms will export a function that returns + * an ASN1_ITEM pointer. + * + * To handle both cases transparently the macros below + * should be used instead of hard coding an ASN1_ITEM + * pointer in a structure. + * + * The structure will look like this: + * + * typedef struct SOMETHING_st { + * ... + * ASN1_ITEM_EXP *iptr; + * ... + * } SOMETHING; + * + * It would be initialised as e.g.: + * + * SOMETHING somevar = {...,ASN1_ITEM_ref(X509),...}; + * + * and the actual pointer extracted with: + * + * const ASN1_ITEM *it = ASN1_ITEM_ptr(somevar.iptr); + * + * Finally an ASN1_ITEM pointer can be extracted from an + * appropriate reference with: ASN1_ITEM_rptr(X509). This + * would be used when a function takes an ASN1_ITEM * argument. + * + */ + +# ifndef OPENSSL_EXPORT_VAR_AS_FUNCTION + +/* ASN1_ITEM pointer exported type */ +typedef const ASN1_ITEM ASN1_ITEM_EXP; + +/* Macro to obtain ASN1_ITEM pointer from exported type */ +# define ASN1_ITEM_ptr(iptr) (iptr) + +/* Macro to include ASN1_ITEM pointer from base type */ +# define ASN1_ITEM_ref(iptr) (&(iptr##_it)) + +# define ASN1_ITEM_rptr(ref) (&(ref##_it)) + +# define DECLARE_ASN1_ITEM(name) \ + OPENSSL_EXTERN const ASN1_ITEM name##_it; + +# else + +/* + * Platforms that can't easily handle shared global variables are declared as + * functions returning ASN1_ITEM pointers. + */ + +/* ASN1_ITEM pointer exported type */ +typedef const ASN1_ITEM *ASN1_ITEM_EXP (void); + +/* Macro to obtain ASN1_ITEM pointer from exported type */ +# define ASN1_ITEM_ptr(iptr) (iptr()) + +/* Macro to include ASN1_ITEM pointer from base type */ +# define ASN1_ITEM_ref(iptr) (iptr##_it) + +# define ASN1_ITEM_rptr(ref) (ref##_it()) + +# define DECLARE_ASN1_ITEM(name) \ + const ASN1_ITEM * name##_it(void); + +# endif + +/* Parameters used by ASN1_STRING_print_ex() */ + +/* + * These determine which characters to escape: RFC2253 special characters, + * control characters and MSB set characters + */ + +# define ASN1_STRFLGS_ESC_2253 1 +# define ASN1_STRFLGS_ESC_CTRL 2 +# define ASN1_STRFLGS_ESC_MSB 4 + +/* + * This flag determines how we do escaping: normally RC2253 backslash only, + * set this to use backslash and quote. + */ + +# define ASN1_STRFLGS_ESC_QUOTE 8 + +/* These three flags are internal use only. */ + +/* Character is a valid PrintableString character */ +# define CHARTYPE_PRINTABLESTRING 0x10 +/* Character needs escaping if it is the first character */ +# define CHARTYPE_FIRST_ESC_2253 0x20 +/* Character needs escaping if it is the last character */ +# define CHARTYPE_LAST_ESC_2253 0x40 + +/* + * NB the internal flags are safely reused below by flags handled at the top + * level. + */ + +/* + * If this is set we convert all character strings to UTF8 first + */ + +# define ASN1_STRFLGS_UTF8_CONVERT 0x10 + +/* + * If this is set we don't attempt to interpret content: just assume all + * strings are 1 byte per character. This will produce some pretty odd + * looking output! + */ + +# define ASN1_STRFLGS_IGNORE_TYPE 0x20 + +/* If this is set we include the string type in the output */ +# define ASN1_STRFLGS_SHOW_TYPE 0x40 + +/* + * This determines which strings to display and which to 'dump' (hex dump of + * content octets or DER encoding). We can only dump non character strings or + * everything. If we don't dump 'unknown' they are interpreted as character + * strings with 1 octet per character and are subject to the usual escaping + * options. + */ + +# define ASN1_STRFLGS_DUMP_ALL 0x80 +# define ASN1_STRFLGS_DUMP_UNKNOWN 0x100 + +/* + * These determine what 'dumping' does, we can dump the content octets or the + * DER encoding: both use the RFC2253 #XXXXX notation. + */ + +# define ASN1_STRFLGS_DUMP_DER 0x200 + +/* + * All the string flags consistent with RFC2253, escaping control characters + * isn't essential in RFC2253 but it is advisable anyway. + */ + +# define ASN1_STRFLGS_RFC2253 (ASN1_STRFLGS_ESC_2253 | \ + ASN1_STRFLGS_ESC_CTRL | \ + ASN1_STRFLGS_ESC_MSB | \ + ASN1_STRFLGS_UTF8_CONVERT | \ + ASN1_STRFLGS_DUMP_UNKNOWN | \ + ASN1_STRFLGS_DUMP_DER) + +DECLARE_STACK_OF(ASN1_INTEGER) +DECLARE_ASN1_SET_OF(ASN1_INTEGER) + +DECLARE_STACK_OF(ASN1_GENERALSTRING) + +typedef struct asn1_type_st { + int type; + union { + char *ptr; + ASN1_BOOLEAN boolean; + ASN1_STRING *asn1_string; + ASN1_OBJECT *object; + ASN1_INTEGER *integer; + ASN1_ENUMERATED *enumerated; + ASN1_BIT_STRING *bit_string; + ASN1_OCTET_STRING *octet_string; + ASN1_PRINTABLESTRING *printablestring; + ASN1_T61STRING *t61string; + ASN1_IA5STRING *ia5string; + ASN1_GENERALSTRING *generalstring; + ASN1_BMPSTRING *bmpstring; + ASN1_UNIVERSALSTRING *universalstring; + ASN1_UTCTIME *utctime; + ASN1_GENERALIZEDTIME *generalizedtime; + ASN1_VISIBLESTRING *visiblestring; + ASN1_UTF8STRING *utf8string; + /* + * set and sequence are left complete and still contain the set or + * sequence bytes + */ + ASN1_STRING *set; + ASN1_STRING *sequence; + ASN1_VALUE *asn1_value; + } value; +} ASN1_TYPE; + +DECLARE_STACK_OF(ASN1_TYPE) +DECLARE_ASN1_SET_OF(ASN1_TYPE) + +typedef STACK_OF(ASN1_TYPE) ASN1_SEQUENCE_ANY; + +DECLARE_ASN1_ENCODE_FUNCTIONS_const(ASN1_SEQUENCE_ANY, ASN1_SEQUENCE_ANY) +DECLARE_ASN1_ENCODE_FUNCTIONS_const(ASN1_SEQUENCE_ANY, ASN1_SET_ANY) + +typedef struct NETSCAPE_X509_st { + ASN1_OCTET_STRING *header; + X509 *cert; +} NETSCAPE_X509; + +/* This is used to contain a list of bit names */ +typedef struct BIT_STRING_BITNAME_st { + int bitnum; + const char *lname; + const char *sname; +} BIT_STRING_BITNAME; + +# define M_ASN1_STRING_length(x) ((x)->length) +# define M_ASN1_STRING_length_set(x, n) ((x)->length = (n)) +# define M_ASN1_STRING_type(x) ((x)->type) +# define M_ASN1_STRING_data(x) ((x)->data) + +/* Macros for string operations */ +# define M_ASN1_BIT_STRING_new() (ASN1_BIT_STRING *)\ + ASN1_STRING_type_new(V_ASN1_BIT_STRING) +# define M_ASN1_BIT_STRING_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_ASN1_BIT_STRING_dup(a) (ASN1_BIT_STRING *)\ + ASN1_STRING_dup((const ASN1_STRING *)a) +# define M_ASN1_BIT_STRING_cmp(a,b) ASN1_STRING_cmp(\ + (const ASN1_STRING *)a,(const ASN1_STRING *)b) +# define M_ASN1_BIT_STRING_set(a,b,c) ASN1_STRING_set((ASN1_STRING *)a,b,c) + +# define M_ASN1_INTEGER_new() (ASN1_INTEGER *)\ + ASN1_STRING_type_new(V_ASN1_INTEGER) +# define M_ASN1_INTEGER_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_ASN1_INTEGER_dup(a) (ASN1_INTEGER *)\ + ASN1_STRING_dup((const ASN1_STRING *)a) +# define M_ASN1_INTEGER_cmp(a,b) ASN1_STRING_cmp(\ + (const ASN1_STRING *)a,(const ASN1_STRING *)b) + +# define M_ASN1_ENUMERATED_new() (ASN1_ENUMERATED *)\ + ASN1_STRING_type_new(V_ASN1_ENUMERATED) +# define M_ASN1_ENUMERATED_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_ASN1_ENUMERATED_dup(a) (ASN1_ENUMERATED *)\ + ASN1_STRING_dup((const ASN1_STRING *)a) +# define M_ASN1_ENUMERATED_cmp(a,b) ASN1_STRING_cmp(\ + (const ASN1_STRING *)a,(const ASN1_STRING *)b) + +# define M_ASN1_OCTET_STRING_new() (ASN1_OCTET_STRING *)\ + ASN1_STRING_type_new(V_ASN1_OCTET_STRING) +# define M_ASN1_OCTET_STRING_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_ASN1_OCTET_STRING_dup(a) (ASN1_OCTET_STRING *)\ + ASN1_STRING_dup((const ASN1_STRING *)a) +# define M_ASN1_OCTET_STRING_cmp(a,b) ASN1_STRING_cmp(\ + (const ASN1_STRING *)a,(const ASN1_STRING *)b) +# define M_ASN1_OCTET_STRING_set(a,b,c) ASN1_STRING_set((ASN1_STRING *)a,b,c) +# define M_ASN1_OCTET_STRING_print(a,b) ASN1_STRING_print(a,(ASN1_STRING *)b) +# define M_i2d_ASN1_OCTET_STRING(a,pp) \ + i2d_ASN1_bytes((ASN1_STRING *)a,pp,V_ASN1_OCTET_STRING,\ + V_ASN1_UNIVERSAL) + +# define B_ASN1_TIME \ + B_ASN1_UTCTIME | \ + B_ASN1_GENERALIZEDTIME + +# define B_ASN1_PRINTABLE \ + B_ASN1_NUMERICSTRING| \ + B_ASN1_PRINTABLESTRING| \ + B_ASN1_T61STRING| \ + B_ASN1_IA5STRING| \ + B_ASN1_BIT_STRING| \ + B_ASN1_UNIVERSALSTRING|\ + B_ASN1_BMPSTRING|\ + B_ASN1_UTF8STRING|\ + B_ASN1_SEQUENCE|\ + B_ASN1_UNKNOWN + +# define B_ASN1_DIRECTORYSTRING \ + B_ASN1_PRINTABLESTRING| \ + B_ASN1_TELETEXSTRING|\ + B_ASN1_BMPSTRING|\ + B_ASN1_UNIVERSALSTRING|\ + B_ASN1_UTF8STRING + +# define B_ASN1_DISPLAYTEXT \ + B_ASN1_IA5STRING| \ + B_ASN1_VISIBLESTRING| \ + B_ASN1_BMPSTRING|\ + B_ASN1_UTF8STRING + +# define M_ASN1_PRINTABLE_new() ASN1_STRING_type_new(V_ASN1_T61STRING) +# define M_ASN1_PRINTABLE_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_i2d_ASN1_PRINTABLE(a,pp) i2d_ASN1_bytes((ASN1_STRING *)a,\ + pp,a->type,V_ASN1_UNIVERSAL) +# define M_d2i_ASN1_PRINTABLE(a,pp,l) \ + d2i_ASN1_type_bytes((ASN1_STRING **)a,pp,l, \ + B_ASN1_PRINTABLE) + +# define M_DIRECTORYSTRING_new() ASN1_STRING_type_new(V_ASN1_PRINTABLESTRING) +# define M_DIRECTORYSTRING_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_i2d_DIRECTORYSTRING(a,pp) i2d_ASN1_bytes((ASN1_STRING *)a,\ + pp,a->type,V_ASN1_UNIVERSAL) +# define M_d2i_DIRECTORYSTRING(a,pp,l) \ + d2i_ASN1_type_bytes((ASN1_STRING **)a,pp,l, \ + B_ASN1_DIRECTORYSTRING) + +# define M_DISPLAYTEXT_new() ASN1_STRING_type_new(V_ASN1_VISIBLESTRING) +# define M_DISPLAYTEXT_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_i2d_DISPLAYTEXT(a,pp) i2d_ASN1_bytes((ASN1_STRING *)a,\ + pp,a->type,V_ASN1_UNIVERSAL) +# define M_d2i_DISPLAYTEXT(a,pp,l) \ + d2i_ASN1_type_bytes((ASN1_STRING **)a,pp,l, \ + B_ASN1_DISPLAYTEXT) + +# define M_ASN1_PRINTABLESTRING_new() (ASN1_PRINTABLESTRING *)\ + ASN1_STRING_type_new(V_ASN1_PRINTABLESTRING) +# define M_ASN1_PRINTABLESTRING_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_i2d_ASN1_PRINTABLESTRING(a,pp) \ + i2d_ASN1_bytes((ASN1_STRING *)a,pp,V_ASN1_PRINTABLESTRING,\ + V_ASN1_UNIVERSAL) +# define M_d2i_ASN1_PRINTABLESTRING(a,pp,l) \ + (ASN1_PRINTABLESTRING *)d2i_ASN1_type_bytes\ + ((ASN1_STRING **)a,pp,l,B_ASN1_PRINTABLESTRING) + +# define M_ASN1_T61STRING_new() (ASN1_T61STRING *)\ + ASN1_STRING_type_new(V_ASN1_T61STRING) +# define M_ASN1_T61STRING_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_i2d_ASN1_T61STRING(a,pp) \ + i2d_ASN1_bytes((ASN1_STRING *)a,pp,V_ASN1_T61STRING,\ + V_ASN1_UNIVERSAL) +# define M_d2i_ASN1_T61STRING(a,pp,l) \ + (ASN1_T61STRING *)d2i_ASN1_type_bytes\ + ((ASN1_STRING **)a,pp,l,B_ASN1_T61STRING) + +# define M_ASN1_IA5STRING_new() (ASN1_IA5STRING *)\ + ASN1_STRING_type_new(V_ASN1_IA5STRING) +# define M_ASN1_IA5STRING_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_ASN1_IA5STRING_dup(a) \ + (ASN1_IA5STRING *)ASN1_STRING_dup((const ASN1_STRING *)a) +# define M_i2d_ASN1_IA5STRING(a,pp) \ + i2d_ASN1_bytes((ASN1_STRING *)a,pp,V_ASN1_IA5STRING,\ + V_ASN1_UNIVERSAL) +# define M_d2i_ASN1_IA5STRING(a,pp,l) \ + (ASN1_IA5STRING *)d2i_ASN1_type_bytes((ASN1_STRING **)a,pp,l,\ + B_ASN1_IA5STRING) + +# define M_ASN1_UTCTIME_new() (ASN1_UTCTIME *)\ + ASN1_STRING_type_new(V_ASN1_UTCTIME) +# define M_ASN1_UTCTIME_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_ASN1_UTCTIME_dup(a) (ASN1_UTCTIME *)\ + ASN1_STRING_dup((const ASN1_STRING *)a) + +# define M_ASN1_GENERALIZEDTIME_new() (ASN1_GENERALIZEDTIME *)\ + ASN1_STRING_type_new(V_ASN1_GENERALIZEDTIME) +# define M_ASN1_GENERALIZEDTIME_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_ASN1_GENERALIZEDTIME_dup(a) (ASN1_GENERALIZEDTIME *)ASN1_STRING_dup(\ + (const ASN1_STRING *)a) + +# define M_ASN1_TIME_new() (ASN1_TIME *)\ + ASN1_STRING_type_new(V_ASN1_UTCTIME) +# define M_ASN1_TIME_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_ASN1_TIME_dup(a) (ASN1_TIME *)\ + ASN1_STRING_dup((const ASN1_STRING *)a) + +# define M_ASN1_GENERALSTRING_new() (ASN1_GENERALSTRING *)\ + ASN1_STRING_type_new(V_ASN1_GENERALSTRING) +# define M_ASN1_GENERALSTRING_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_i2d_ASN1_GENERALSTRING(a,pp) \ + i2d_ASN1_bytes((ASN1_STRING *)a,pp,V_ASN1_GENERALSTRING,\ + V_ASN1_UNIVERSAL) +# define M_d2i_ASN1_GENERALSTRING(a,pp,l) \ + (ASN1_GENERALSTRING *)d2i_ASN1_type_bytes\ + ((ASN1_STRING **)a,pp,l,B_ASN1_GENERALSTRING) + +# define M_ASN1_UNIVERSALSTRING_new() (ASN1_UNIVERSALSTRING *)\ + ASN1_STRING_type_new(V_ASN1_UNIVERSALSTRING) +# define M_ASN1_UNIVERSALSTRING_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_i2d_ASN1_UNIVERSALSTRING(a,pp) \ + i2d_ASN1_bytes((ASN1_STRING *)a,pp,V_ASN1_UNIVERSALSTRING,\ + V_ASN1_UNIVERSAL) +# define M_d2i_ASN1_UNIVERSALSTRING(a,pp,l) \ + (ASN1_UNIVERSALSTRING *)d2i_ASN1_type_bytes\ + ((ASN1_STRING **)a,pp,l,B_ASN1_UNIVERSALSTRING) + +# define M_ASN1_BMPSTRING_new() (ASN1_BMPSTRING *)\ + ASN1_STRING_type_new(V_ASN1_BMPSTRING) +# define M_ASN1_BMPSTRING_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_i2d_ASN1_BMPSTRING(a,pp) \ + i2d_ASN1_bytes((ASN1_STRING *)a,pp,V_ASN1_BMPSTRING,\ + V_ASN1_UNIVERSAL) +# define M_d2i_ASN1_BMPSTRING(a,pp,l) \ + (ASN1_BMPSTRING *)d2i_ASN1_type_bytes\ + ((ASN1_STRING **)a,pp,l,B_ASN1_BMPSTRING) + +# define M_ASN1_VISIBLESTRING_new() (ASN1_VISIBLESTRING *)\ + ASN1_STRING_type_new(V_ASN1_VISIBLESTRING) +# define M_ASN1_VISIBLESTRING_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_i2d_ASN1_VISIBLESTRING(a,pp) \ + i2d_ASN1_bytes((ASN1_STRING *)a,pp,V_ASN1_VISIBLESTRING,\ + V_ASN1_UNIVERSAL) +# define M_d2i_ASN1_VISIBLESTRING(a,pp,l) \ + (ASN1_VISIBLESTRING *)d2i_ASN1_type_bytes\ + ((ASN1_STRING **)a,pp,l,B_ASN1_VISIBLESTRING) + +# define M_ASN1_UTF8STRING_new() (ASN1_UTF8STRING *)\ + ASN1_STRING_type_new(V_ASN1_UTF8STRING) +# define M_ASN1_UTF8STRING_free(a) ASN1_STRING_free((ASN1_STRING *)a) +# define M_i2d_ASN1_UTF8STRING(a,pp) \ + i2d_ASN1_bytes((ASN1_STRING *)a,pp,V_ASN1_UTF8STRING,\ + V_ASN1_UNIVERSAL) +# define M_d2i_ASN1_UTF8STRING(a,pp,l) \ + (ASN1_UTF8STRING *)d2i_ASN1_type_bytes\ + ((ASN1_STRING **)a,pp,l,B_ASN1_UTF8STRING) + + /* for the is_set parameter to i2d_ASN1_SET */ +# define IS_SEQUENCE 0 +# define IS_SET 1 + +DECLARE_ASN1_FUNCTIONS_fname(ASN1_TYPE, ASN1_ANY, ASN1_TYPE) + +int ASN1_TYPE_get(ASN1_TYPE *a); +void ASN1_TYPE_set(ASN1_TYPE *a, int type, void *value); +int ASN1_TYPE_set1(ASN1_TYPE *a, int type, const void *value); +int ASN1_TYPE_cmp(const ASN1_TYPE *a, const ASN1_TYPE *b); + +ASN1_OBJECT *ASN1_OBJECT_new(void); +void ASN1_OBJECT_free(ASN1_OBJECT *a); +int i2d_ASN1_OBJECT(ASN1_OBJECT *a, unsigned char **pp); +ASN1_OBJECT *c2i_ASN1_OBJECT(ASN1_OBJECT **a, const unsigned char **pp, + long length); +ASN1_OBJECT *d2i_ASN1_OBJECT(ASN1_OBJECT **a, const unsigned char **pp, + long length); + +DECLARE_ASN1_ITEM(ASN1_OBJECT) + +DECLARE_STACK_OF(ASN1_OBJECT) +DECLARE_ASN1_SET_OF(ASN1_OBJECT) + +ASN1_STRING *ASN1_STRING_new(void); +void ASN1_STRING_free(ASN1_STRING *a); +int ASN1_STRING_copy(ASN1_STRING *dst, const ASN1_STRING *str); +ASN1_STRING *ASN1_STRING_dup(const ASN1_STRING *a); +ASN1_STRING *ASN1_STRING_type_new(int type); +int ASN1_STRING_cmp(const ASN1_STRING *a, const ASN1_STRING *b); + /* + * Since this is used to store all sorts of things, via macros, for now, + * make its data void * + */ +int ASN1_STRING_set(ASN1_STRING *str, const void *data, int len); +void ASN1_STRING_set0(ASN1_STRING *str, void *data, int len); +int ASN1_STRING_length(const ASN1_STRING *x); +void ASN1_STRING_length_set(ASN1_STRING *x, int n); +int ASN1_STRING_type(ASN1_STRING *x); +unsigned char *ASN1_STRING_data(ASN1_STRING *x); + +DECLARE_ASN1_FUNCTIONS(ASN1_BIT_STRING) +int i2c_ASN1_BIT_STRING(ASN1_BIT_STRING *a, unsigned char **pp); +ASN1_BIT_STRING *c2i_ASN1_BIT_STRING(ASN1_BIT_STRING **a, + const unsigned char **pp, long length); +int ASN1_BIT_STRING_set(ASN1_BIT_STRING *a, unsigned char *d, int length); +int ASN1_BIT_STRING_set_bit(ASN1_BIT_STRING *a, int n, int value); +int ASN1_BIT_STRING_get_bit(ASN1_BIT_STRING *a, int n); +int ASN1_BIT_STRING_check(ASN1_BIT_STRING *a, + unsigned char *flags, int flags_len); + +# ifndef OPENSSL_NO_BIO +int ASN1_BIT_STRING_name_print(BIO *out, ASN1_BIT_STRING *bs, + BIT_STRING_BITNAME *tbl, int indent); +# endif +int ASN1_BIT_STRING_num_asc(char *name, BIT_STRING_BITNAME *tbl); +int ASN1_BIT_STRING_set_asc(ASN1_BIT_STRING *bs, char *name, int value, + BIT_STRING_BITNAME *tbl); + +int i2d_ASN1_BOOLEAN(int a, unsigned char **pp); +int d2i_ASN1_BOOLEAN(int *a, const unsigned char **pp, long length); + +DECLARE_ASN1_FUNCTIONS(ASN1_INTEGER) +int i2c_ASN1_INTEGER(ASN1_INTEGER *a, unsigned char **pp); +ASN1_INTEGER *c2i_ASN1_INTEGER(ASN1_INTEGER **a, const unsigned char **pp, + long length); +ASN1_INTEGER *d2i_ASN1_UINTEGER(ASN1_INTEGER **a, const unsigned char **pp, + long length); +ASN1_INTEGER *ASN1_INTEGER_dup(const ASN1_INTEGER *x); +int ASN1_INTEGER_cmp(const ASN1_INTEGER *x, const ASN1_INTEGER *y); + +DECLARE_ASN1_FUNCTIONS(ASN1_ENUMERATED) + +int ASN1_UTCTIME_check(const ASN1_UTCTIME *a); +ASN1_UTCTIME *ASN1_UTCTIME_set(ASN1_UTCTIME *s, time_t t); +ASN1_UTCTIME *ASN1_UTCTIME_adj(ASN1_UTCTIME *s, time_t t, + int offset_day, long offset_sec); +int ASN1_UTCTIME_set_string(ASN1_UTCTIME *s, const char *str); +int ASN1_UTCTIME_cmp_time_t(const ASN1_UTCTIME *s, time_t t); +# if 0 +time_t ASN1_UTCTIME_get(const ASN1_UTCTIME *s); +# endif + +int ASN1_GENERALIZEDTIME_check(const ASN1_GENERALIZEDTIME *a); +ASN1_GENERALIZEDTIME *ASN1_GENERALIZEDTIME_set(ASN1_GENERALIZEDTIME *s, + time_t t); +ASN1_GENERALIZEDTIME *ASN1_GENERALIZEDTIME_adj(ASN1_GENERALIZEDTIME *s, + time_t t, int offset_day, + long offset_sec); +int ASN1_GENERALIZEDTIME_set_string(ASN1_GENERALIZEDTIME *s, const char *str); +int ASN1_TIME_diff(int *pday, int *psec, + const ASN1_TIME *from, const ASN1_TIME *to); + +DECLARE_ASN1_FUNCTIONS(ASN1_OCTET_STRING) +ASN1_OCTET_STRING *ASN1_OCTET_STRING_dup(const ASN1_OCTET_STRING *a); +int ASN1_OCTET_STRING_cmp(const ASN1_OCTET_STRING *a, + const ASN1_OCTET_STRING *b); +int ASN1_OCTET_STRING_set(ASN1_OCTET_STRING *str, const unsigned char *data, + int len); + +DECLARE_ASN1_FUNCTIONS(ASN1_VISIBLESTRING) +DECLARE_ASN1_FUNCTIONS(ASN1_UNIVERSALSTRING) +DECLARE_ASN1_FUNCTIONS(ASN1_UTF8STRING) +DECLARE_ASN1_FUNCTIONS(ASN1_NULL) +DECLARE_ASN1_FUNCTIONS(ASN1_BMPSTRING) + +int UTF8_getc(const unsigned char *str, int len, unsigned long *val); +int UTF8_putc(unsigned char *str, int len, unsigned long value); + +DECLARE_ASN1_FUNCTIONS_name(ASN1_STRING, ASN1_PRINTABLE) + +DECLARE_ASN1_FUNCTIONS_name(ASN1_STRING, DIRECTORYSTRING) +DECLARE_ASN1_FUNCTIONS_name(ASN1_STRING, DISPLAYTEXT) +DECLARE_ASN1_FUNCTIONS(ASN1_PRINTABLESTRING) +DECLARE_ASN1_FUNCTIONS(ASN1_T61STRING) +DECLARE_ASN1_FUNCTIONS(ASN1_IA5STRING) +DECLARE_ASN1_FUNCTIONS(ASN1_GENERALSTRING) +DECLARE_ASN1_FUNCTIONS(ASN1_UTCTIME) +DECLARE_ASN1_FUNCTIONS(ASN1_GENERALIZEDTIME) +DECLARE_ASN1_FUNCTIONS(ASN1_TIME) + +DECLARE_ASN1_ITEM(ASN1_OCTET_STRING_NDEF) + +ASN1_TIME *ASN1_TIME_set(ASN1_TIME *s, time_t t); +ASN1_TIME *ASN1_TIME_adj(ASN1_TIME *s, time_t t, + int offset_day, long offset_sec); +int ASN1_TIME_check(ASN1_TIME *t); +ASN1_GENERALIZEDTIME *ASN1_TIME_to_generalizedtime(ASN1_TIME *t, ASN1_GENERALIZEDTIME + **out); +int ASN1_TIME_set_string(ASN1_TIME *s, const char *str); + +int i2d_ASN1_SET(STACK_OF(OPENSSL_BLOCK) *a, unsigned char **pp, + i2d_of_void *i2d, int ex_tag, int ex_class, int is_set); +STACK_OF(OPENSSL_BLOCK) *d2i_ASN1_SET(STACK_OF(OPENSSL_BLOCK) **a, + const unsigned char **pp, + long length, d2i_of_void *d2i, + void (*free_func) (OPENSSL_BLOCK), + int ex_tag, int ex_class); + +# ifndef OPENSSL_NO_BIO +int i2a_ASN1_INTEGER(BIO *bp, ASN1_INTEGER *a); +int a2i_ASN1_INTEGER(BIO *bp, ASN1_INTEGER *bs, char *buf, int size); +int i2a_ASN1_ENUMERATED(BIO *bp, ASN1_ENUMERATED *a); +int a2i_ASN1_ENUMERATED(BIO *bp, ASN1_ENUMERATED *bs, char *buf, int size); +int i2a_ASN1_OBJECT(BIO *bp, ASN1_OBJECT *a); +int a2i_ASN1_STRING(BIO *bp, ASN1_STRING *bs, char *buf, int size); +int i2a_ASN1_STRING(BIO *bp, ASN1_STRING *a, int type); +# endif +int i2t_ASN1_OBJECT(char *buf, int buf_len, ASN1_OBJECT *a); + +int a2d_ASN1_OBJECT(unsigned char *out, int olen, const char *buf, int num); +ASN1_OBJECT *ASN1_OBJECT_create(int nid, unsigned char *data, int len, + const char *sn, const char *ln); + +int ASN1_INTEGER_set(ASN1_INTEGER *a, long v); +long ASN1_INTEGER_get(const ASN1_INTEGER *a); +ASN1_INTEGER *BN_to_ASN1_INTEGER(const BIGNUM *bn, ASN1_INTEGER *ai); +BIGNUM *ASN1_INTEGER_to_BN(const ASN1_INTEGER *ai, BIGNUM *bn); + +int ASN1_ENUMERATED_set(ASN1_ENUMERATED *a, long v); +long ASN1_ENUMERATED_get(ASN1_ENUMERATED *a); +ASN1_ENUMERATED *BN_to_ASN1_ENUMERATED(BIGNUM *bn, ASN1_ENUMERATED *ai); +BIGNUM *ASN1_ENUMERATED_to_BN(ASN1_ENUMERATED *ai, BIGNUM *bn); + +/* General */ +/* given a string, return the correct type, max is the maximum length */ +int ASN1_PRINTABLE_type(const unsigned char *s, int max); + +int i2d_ASN1_bytes(ASN1_STRING *a, unsigned char **pp, int tag, int xclass); +ASN1_STRING *d2i_ASN1_bytes(ASN1_STRING **a, const unsigned char **pp, + long length, int Ptag, int Pclass); +unsigned long ASN1_tag2bit(int tag); +/* type is one or more of the B_ASN1_ values. */ +ASN1_STRING *d2i_ASN1_type_bytes(ASN1_STRING **a, const unsigned char **pp, + long length, int type); + +/* PARSING */ +int asn1_Finish(ASN1_CTX *c); +int asn1_const_Finish(ASN1_const_CTX *c); + +/* SPECIALS */ +int ASN1_get_object(const unsigned char **pp, long *plength, int *ptag, + int *pclass, long omax); +int ASN1_check_infinite_end(unsigned char **p, long len); +int ASN1_const_check_infinite_end(const unsigned char **p, long len); +void ASN1_put_object(unsigned char **pp, int constructed, int length, + int tag, int xclass); +int ASN1_put_eoc(unsigned char **pp); +int ASN1_object_size(int constructed, int length, int tag); + +/* Used to implement other functions */ +void *ASN1_dup(i2d_of_void *i2d, d2i_of_void *d2i, void *x); + +# define ASN1_dup_of(type,i2d,d2i,x) \ + ((type*)ASN1_dup(CHECKED_I2D_OF(type, i2d), \ + CHECKED_D2I_OF(type, d2i), \ + CHECKED_PTR_OF(type, x))) + +# define ASN1_dup_of_const(type,i2d,d2i,x) \ + ((type*)ASN1_dup(CHECKED_I2D_OF(const type, i2d), \ + CHECKED_D2I_OF(type, d2i), \ + CHECKED_PTR_OF(const type, x))) + +void *ASN1_item_dup(const ASN1_ITEM *it, void *x); + +/* ASN1 alloc/free macros for when a type is only used internally */ + +# define M_ASN1_new_of(type) (type *)ASN1_item_new(ASN1_ITEM_rptr(type)) +# define M_ASN1_free_of(x, type) \ + ASN1_item_free(CHECKED_PTR_OF(type, x), ASN1_ITEM_rptr(type)) + +# ifndef OPENSSL_NO_FP_API +void *ASN1_d2i_fp(void *(*xnew) (void), d2i_of_void *d2i, FILE *in, void **x); + +# define ASN1_d2i_fp_of(type,xnew,d2i,in,x) \ + ((type*)ASN1_d2i_fp(CHECKED_NEW_OF(type, xnew), \ + CHECKED_D2I_OF(type, d2i), \ + in, \ + CHECKED_PPTR_OF(type, x))) + +void *ASN1_item_d2i_fp(const ASN1_ITEM *it, FILE *in, void *x); +int ASN1_i2d_fp(i2d_of_void *i2d, FILE *out, void *x); + +# define ASN1_i2d_fp_of(type,i2d,out,x) \ + (ASN1_i2d_fp(CHECKED_I2D_OF(type, i2d), \ + out, \ + CHECKED_PTR_OF(type, x))) + +# define ASN1_i2d_fp_of_const(type,i2d,out,x) \ + (ASN1_i2d_fp(CHECKED_I2D_OF(const type, i2d), \ + out, \ + CHECKED_PTR_OF(const type, x))) + +int ASN1_item_i2d_fp(const ASN1_ITEM *it, FILE *out, void *x); +int ASN1_STRING_print_ex_fp(FILE *fp, ASN1_STRING *str, unsigned long flags); +# endif + +int ASN1_STRING_to_UTF8(unsigned char **out, ASN1_STRING *in); + +# ifndef OPENSSL_NO_BIO +void *ASN1_d2i_bio(void *(*xnew) (void), d2i_of_void *d2i, BIO *in, void **x); + +# define ASN1_d2i_bio_of(type,xnew,d2i,in,x) \ + ((type*)ASN1_d2i_bio( CHECKED_NEW_OF(type, xnew), \ + CHECKED_D2I_OF(type, d2i), \ + in, \ + CHECKED_PPTR_OF(type, x))) + +void *ASN1_item_d2i_bio(const ASN1_ITEM *it, BIO *in, void *x); +int ASN1_i2d_bio(i2d_of_void *i2d, BIO *out, unsigned char *x); + +# define ASN1_i2d_bio_of(type,i2d,out,x) \ + (ASN1_i2d_bio(CHECKED_I2D_OF(type, i2d), \ + out, \ + CHECKED_PTR_OF(type, x))) + +# define ASN1_i2d_bio_of_const(type,i2d,out,x) \ + (ASN1_i2d_bio(CHECKED_I2D_OF(const type, i2d), \ + out, \ + CHECKED_PTR_OF(const type, x))) + +int ASN1_item_i2d_bio(const ASN1_ITEM *it, BIO *out, void *x); +int ASN1_UTCTIME_print(BIO *fp, const ASN1_UTCTIME *a); +int ASN1_GENERALIZEDTIME_print(BIO *fp, const ASN1_GENERALIZEDTIME *a); +int ASN1_TIME_print(BIO *fp, const ASN1_TIME *a); +int ASN1_STRING_print(BIO *bp, const ASN1_STRING *v); +int ASN1_STRING_print_ex(BIO *out, ASN1_STRING *str, unsigned long flags); +int ASN1_bn_print(BIO *bp, const char *number, const BIGNUM *num, + unsigned char *buf, int off); +int ASN1_parse(BIO *bp, const unsigned char *pp, long len, int indent); +int ASN1_parse_dump(BIO *bp, const unsigned char *pp, long len, int indent, + int dump); +# endif +const char *ASN1_tag2str(int tag); + +/* Used to load and write netscape format cert */ + +DECLARE_ASN1_FUNCTIONS(NETSCAPE_X509) + +int ASN1_UNIVERSALSTRING_to_string(ASN1_UNIVERSALSTRING *s); + +int ASN1_TYPE_set_octetstring(ASN1_TYPE *a, unsigned char *data, int len); +int ASN1_TYPE_get_octetstring(ASN1_TYPE *a, unsigned char *data, int max_len); +int ASN1_TYPE_set_int_octetstring(ASN1_TYPE *a, long num, + unsigned char *data, int len); +int ASN1_TYPE_get_int_octetstring(ASN1_TYPE *a, long *num, + unsigned char *data, int max_len); + +STACK_OF(OPENSSL_BLOCK) *ASN1_seq_unpack(const unsigned char *buf, int len, + d2i_of_void *d2i, + void (*free_func) (OPENSSL_BLOCK)); +unsigned char *ASN1_seq_pack(STACK_OF(OPENSSL_BLOCK) *safes, i2d_of_void *i2d, + unsigned char **buf, int *len); +void *ASN1_unpack_string(ASN1_STRING *oct, d2i_of_void *d2i); +void *ASN1_item_unpack(ASN1_STRING *oct, const ASN1_ITEM *it); +ASN1_STRING *ASN1_pack_string(void *obj, i2d_of_void *i2d, + ASN1_OCTET_STRING **oct); + +# define ASN1_pack_string_of(type,obj,i2d,oct) \ + (ASN1_pack_string(CHECKED_PTR_OF(type, obj), \ + CHECKED_I2D_OF(type, i2d), \ + oct)) + +ASN1_STRING *ASN1_item_pack(void *obj, const ASN1_ITEM *it, + ASN1_OCTET_STRING **oct); + +void ASN1_STRING_set_default_mask(unsigned long mask); +int ASN1_STRING_set_default_mask_asc(const char *p); +unsigned long ASN1_STRING_get_default_mask(void); +int ASN1_mbstring_copy(ASN1_STRING **out, const unsigned char *in, int len, + int inform, unsigned long mask); +int ASN1_mbstring_ncopy(ASN1_STRING **out, const unsigned char *in, int len, + int inform, unsigned long mask, + long minsize, long maxsize); + +ASN1_STRING *ASN1_STRING_set_by_NID(ASN1_STRING **out, + const unsigned char *in, int inlen, + int inform, int nid); +ASN1_STRING_TABLE *ASN1_STRING_TABLE_get(int nid); +int ASN1_STRING_TABLE_add(int, long, long, unsigned long, unsigned long); +void ASN1_STRING_TABLE_cleanup(void); + +/* ASN1 template functions */ + +/* Old API compatible functions */ +ASN1_VALUE *ASN1_item_new(const ASN1_ITEM *it); +void ASN1_item_free(ASN1_VALUE *val, const ASN1_ITEM *it); +ASN1_VALUE *ASN1_item_d2i(ASN1_VALUE **val, const unsigned char **in, + long len, const ASN1_ITEM *it); +int ASN1_item_i2d(ASN1_VALUE *val, unsigned char **out, const ASN1_ITEM *it); +int ASN1_item_ndef_i2d(ASN1_VALUE *val, unsigned char **out, + const ASN1_ITEM *it); + +void ASN1_add_oid_module(void); + +ASN1_TYPE *ASN1_generate_nconf(char *str, CONF *nconf); +ASN1_TYPE *ASN1_generate_v3(char *str, X509V3_CTX *cnf); + +/* ASN1 Print flags */ + +/* Indicate missing OPTIONAL fields */ +# define ASN1_PCTX_FLAGS_SHOW_ABSENT 0x001 +/* Mark start and end of SEQUENCE */ +# define ASN1_PCTX_FLAGS_SHOW_SEQUENCE 0x002 +/* Mark start and end of SEQUENCE/SET OF */ +# define ASN1_PCTX_FLAGS_SHOW_SSOF 0x004 +/* Show the ASN1 type of primitives */ +# define ASN1_PCTX_FLAGS_SHOW_TYPE 0x008 +/* Don't show ASN1 type of ANY */ +# define ASN1_PCTX_FLAGS_NO_ANY_TYPE 0x010 +/* Don't show ASN1 type of MSTRINGs */ +# define ASN1_PCTX_FLAGS_NO_MSTRING_TYPE 0x020 +/* Don't show field names in SEQUENCE */ +# define ASN1_PCTX_FLAGS_NO_FIELD_NAME 0x040 +/* Show structure names of each SEQUENCE field */ +# define ASN1_PCTX_FLAGS_SHOW_FIELD_STRUCT_NAME 0x080 +/* Don't show structure name even at top level */ +# define ASN1_PCTX_FLAGS_NO_STRUCT_NAME 0x100 + +int ASN1_item_print(BIO *out, ASN1_VALUE *ifld, int indent, + const ASN1_ITEM *it, const ASN1_PCTX *pctx); +ASN1_PCTX *ASN1_PCTX_new(void); +void ASN1_PCTX_free(ASN1_PCTX *p); +unsigned long ASN1_PCTX_get_flags(ASN1_PCTX *p); +void ASN1_PCTX_set_flags(ASN1_PCTX *p, unsigned long flags); +unsigned long ASN1_PCTX_get_nm_flags(ASN1_PCTX *p); +void ASN1_PCTX_set_nm_flags(ASN1_PCTX *p, unsigned long flags); +unsigned long ASN1_PCTX_get_cert_flags(ASN1_PCTX *p); +void ASN1_PCTX_set_cert_flags(ASN1_PCTX *p, unsigned long flags); +unsigned long ASN1_PCTX_get_oid_flags(ASN1_PCTX *p); +void ASN1_PCTX_set_oid_flags(ASN1_PCTX *p, unsigned long flags); +unsigned long ASN1_PCTX_get_str_flags(ASN1_PCTX *p); +void ASN1_PCTX_set_str_flags(ASN1_PCTX *p, unsigned long flags); + +BIO_METHOD *BIO_f_asn1(void); + +BIO *BIO_new_NDEF(BIO *out, ASN1_VALUE *val, const ASN1_ITEM *it); + +int i2d_ASN1_bio_stream(BIO *out, ASN1_VALUE *val, BIO *in, int flags, + const ASN1_ITEM *it); +int PEM_write_bio_ASN1_stream(BIO *out, ASN1_VALUE *val, BIO *in, int flags, + const char *hdr, const ASN1_ITEM *it); +int SMIME_write_ASN1(BIO *bio, ASN1_VALUE *val, BIO *data, int flags, + int ctype_nid, int econt_nid, + STACK_OF(X509_ALGOR) *mdalgs, const ASN1_ITEM *it); +ASN1_VALUE *SMIME_read_ASN1(BIO *bio, BIO **bcont, const ASN1_ITEM *it); +int SMIME_crlf_copy(BIO *in, BIO *out, int flags); +int SMIME_text(BIO *in, BIO *out); + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_ASN1_strings(void); + +/* Error codes for the ASN1 functions. */ + +/* Function codes. */ +# define ASN1_F_A2D_ASN1_OBJECT 100 +# define ASN1_F_A2I_ASN1_ENUMERATED 101 +# define ASN1_F_A2I_ASN1_INTEGER 102 +# define ASN1_F_A2I_ASN1_STRING 103 +# define ASN1_F_APPEND_EXP 176 +# define ASN1_F_ASN1_BIT_STRING_SET_BIT 183 +# define ASN1_F_ASN1_CB 177 +# define ASN1_F_ASN1_CHECK_TLEN 104 +# define ASN1_F_ASN1_COLLATE_PRIMITIVE 105 +# define ASN1_F_ASN1_COLLECT 106 +# define ASN1_F_ASN1_D2I_EX_PRIMITIVE 108 +# define ASN1_F_ASN1_D2I_FP 109 +# define ASN1_F_ASN1_D2I_READ_BIO 107 +# define ASN1_F_ASN1_DIGEST 184 +# define ASN1_F_ASN1_DO_ADB 110 +# define ASN1_F_ASN1_DUP 111 +# define ASN1_F_ASN1_ENUMERATED_SET 112 +# define ASN1_F_ASN1_ENUMERATED_TO_BN 113 +# define ASN1_F_ASN1_EX_C2I 204 +# define ASN1_F_ASN1_FIND_END 190 +# define ASN1_F_ASN1_GENERALIZEDTIME_ADJ 216 +# define ASN1_F_ASN1_GENERALIZEDTIME_SET 185 +# define ASN1_F_ASN1_GENERATE_V3 178 +# define ASN1_F_ASN1_GET_OBJECT 114 +# define ASN1_F_ASN1_HEADER_NEW 115 +# define ASN1_F_ASN1_I2D_BIO 116 +# define ASN1_F_ASN1_I2D_FP 117 +# define ASN1_F_ASN1_INTEGER_SET 118 +# define ASN1_F_ASN1_INTEGER_TO_BN 119 +# define ASN1_F_ASN1_ITEM_D2I_FP 206 +# define ASN1_F_ASN1_ITEM_DUP 191 +# define ASN1_F_ASN1_ITEM_EX_COMBINE_NEW 121 +# define ASN1_F_ASN1_ITEM_EX_D2I 120 +# define ASN1_F_ASN1_ITEM_I2D_BIO 192 +# define ASN1_F_ASN1_ITEM_I2D_FP 193 +# define ASN1_F_ASN1_ITEM_PACK 198 +# define ASN1_F_ASN1_ITEM_SIGN 195 +# define ASN1_F_ASN1_ITEM_SIGN_CTX 220 +# define ASN1_F_ASN1_ITEM_UNPACK 199 +# define ASN1_F_ASN1_ITEM_VERIFY 197 +# define ASN1_F_ASN1_MBSTRING_NCOPY 122 +# define ASN1_F_ASN1_OBJECT_NEW 123 +# define ASN1_F_ASN1_OUTPUT_DATA 214 +# define ASN1_F_ASN1_PACK_STRING 124 +# define ASN1_F_ASN1_PCTX_NEW 205 +# define ASN1_F_ASN1_PKCS5_PBE_SET 125 +# define ASN1_F_ASN1_SEQ_PACK 126 +# define ASN1_F_ASN1_SEQ_UNPACK 127 +# define ASN1_F_ASN1_SIGN 128 +# define ASN1_F_ASN1_STR2TYPE 179 +# define ASN1_F_ASN1_STRING_SET 186 +# define ASN1_F_ASN1_STRING_TABLE_ADD 129 +# define ASN1_F_ASN1_STRING_TYPE_NEW 130 +# define ASN1_F_ASN1_TEMPLATE_EX_D2I 132 +# define ASN1_F_ASN1_TEMPLATE_NEW 133 +# define ASN1_F_ASN1_TEMPLATE_NOEXP_D2I 131 +# define ASN1_F_ASN1_TIME_ADJ 217 +# define ASN1_F_ASN1_TIME_SET 175 +# define ASN1_F_ASN1_TYPE_GET_INT_OCTETSTRING 134 +# define ASN1_F_ASN1_TYPE_GET_OCTETSTRING 135 +# define ASN1_F_ASN1_UNPACK_STRING 136 +# define ASN1_F_ASN1_UTCTIME_ADJ 218 +# define ASN1_F_ASN1_UTCTIME_SET 187 +# define ASN1_F_ASN1_VERIFY 137 +# define ASN1_F_B64_READ_ASN1 209 +# define ASN1_F_B64_WRITE_ASN1 210 +# define ASN1_F_BIO_NEW_NDEF 208 +# define ASN1_F_BITSTR_CB 180 +# define ASN1_F_BN_TO_ASN1_ENUMERATED 138 +# define ASN1_F_BN_TO_ASN1_INTEGER 139 +# define ASN1_F_C2I_ASN1_BIT_STRING 189 +# define ASN1_F_C2I_ASN1_INTEGER 194 +# define ASN1_F_C2I_ASN1_OBJECT 196 +# define ASN1_F_COLLECT_DATA 140 +# define ASN1_F_D2I_ASN1_BIT_STRING 141 +# define ASN1_F_D2I_ASN1_BOOLEAN 142 +# define ASN1_F_D2I_ASN1_BYTES 143 +# define ASN1_F_D2I_ASN1_GENERALIZEDTIME 144 +# define ASN1_F_D2I_ASN1_HEADER 145 +# define ASN1_F_D2I_ASN1_INTEGER 146 +# define ASN1_F_D2I_ASN1_OBJECT 147 +# define ASN1_F_D2I_ASN1_SET 148 +# define ASN1_F_D2I_ASN1_TYPE_BYTES 149 +# define ASN1_F_D2I_ASN1_UINTEGER 150 +# define ASN1_F_D2I_ASN1_UTCTIME 151 +# define ASN1_F_D2I_AUTOPRIVATEKEY 207 +# define ASN1_F_D2I_NETSCAPE_RSA 152 +# define ASN1_F_D2I_NETSCAPE_RSA_2 153 +# define ASN1_F_D2I_PRIVATEKEY 154 +# define ASN1_F_D2I_PUBLICKEY 155 +# define ASN1_F_D2I_RSA_NET 200 +# define ASN1_F_D2I_RSA_NET_2 201 +# define ASN1_F_D2I_X509 156 +# define ASN1_F_D2I_X509_CINF 157 +# define ASN1_F_D2I_X509_PKEY 159 +# define ASN1_F_I2D_ASN1_BIO_STREAM 211 +# define ASN1_F_I2D_ASN1_SET 188 +# define ASN1_F_I2D_ASN1_TIME 160 +# define ASN1_F_I2D_DSA_PUBKEY 161 +# define ASN1_F_I2D_EC_PUBKEY 181 +# define ASN1_F_I2D_PRIVATEKEY 163 +# define ASN1_F_I2D_PUBLICKEY 164 +# define ASN1_F_I2D_RSA_NET 162 +# define ASN1_F_I2D_RSA_PUBKEY 165 +# define ASN1_F_LONG_C2I 166 +# define ASN1_F_OID_MODULE_INIT 174 +# define ASN1_F_PARSE_TAGGING 182 +# define ASN1_F_PKCS5_PBE2_SET_IV 167 +# define ASN1_F_PKCS5_PBE_SET 202 +# define ASN1_F_PKCS5_PBE_SET0_ALGOR 215 +# define ASN1_F_PKCS5_PBKDF2_SET 219 +# define ASN1_F_SMIME_READ_ASN1 212 +# define ASN1_F_SMIME_TEXT 213 +# define ASN1_F_X509_CINF_NEW 168 +# define ASN1_F_X509_CRL_ADD0_REVOKED 169 +# define ASN1_F_X509_INFO_NEW 170 +# define ASN1_F_X509_NAME_ENCODE 203 +# define ASN1_F_X509_NAME_EX_D2I 158 +# define ASN1_F_X509_NAME_EX_NEW 171 +# define ASN1_F_X509_NEW 172 +# define ASN1_F_X509_PKEY_NEW 173 + +/* Reason codes. */ +# define ASN1_R_ADDING_OBJECT 171 +# define ASN1_R_ASN1_PARSE_ERROR 203 +# define ASN1_R_ASN1_SIG_PARSE_ERROR 204 +# define ASN1_R_AUX_ERROR 100 +# define ASN1_R_BAD_CLASS 101 +# define ASN1_R_BAD_OBJECT_HEADER 102 +# define ASN1_R_BAD_PASSWORD_READ 103 +# define ASN1_R_BAD_TAG 104 +# define ASN1_R_BMPSTRING_IS_WRONG_LENGTH 214 +# define ASN1_R_BN_LIB 105 +# define ASN1_R_BOOLEAN_IS_WRONG_LENGTH 106 +# define ASN1_R_BUFFER_TOO_SMALL 107 +# define ASN1_R_CIPHER_HAS_NO_OBJECT_IDENTIFIER 108 +# define ASN1_R_CONTEXT_NOT_INITIALISED 217 +# define ASN1_R_DATA_IS_WRONG 109 +# define ASN1_R_DECODE_ERROR 110 +# define ASN1_R_DECODING_ERROR 111 +# define ASN1_R_DEPTH_EXCEEDED 174 +# define ASN1_R_DIGEST_AND_KEY_TYPE_NOT_SUPPORTED 198 +# define ASN1_R_ENCODE_ERROR 112 +# define ASN1_R_ERROR_GETTING_TIME 173 +# define ASN1_R_ERROR_LOADING_SECTION 172 +# define ASN1_R_ERROR_PARSING_SET_ELEMENT 113 +# define ASN1_R_ERROR_SETTING_CIPHER_PARAMS 114 +# define ASN1_R_EXPECTING_AN_INTEGER 115 +# define ASN1_R_EXPECTING_AN_OBJECT 116 +# define ASN1_R_EXPECTING_A_BOOLEAN 117 +# define ASN1_R_EXPECTING_A_TIME 118 +# define ASN1_R_EXPLICIT_LENGTH_MISMATCH 119 +# define ASN1_R_EXPLICIT_TAG_NOT_CONSTRUCTED 120 +# define ASN1_R_FIELD_MISSING 121 +# define ASN1_R_FIRST_NUM_TOO_LARGE 122 +# define ASN1_R_HEADER_TOO_LONG 123 +# define ASN1_R_ILLEGAL_BITSTRING_FORMAT 175 +# define ASN1_R_ILLEGAL_BOOLEAN 176 +# define ASN1_R_ILLEGAL_CHARACTERS 124 +# define ASN1_R_ILLEGAL_FORMAT 177 +# define ASN1_R_ILLEGAL_HEX 178 +# define ASN1_R_ILLEGAL_IMPLICIT_TAG 179 +# define ASN1_R_ILLEGAL_INTEGER 180 +# define ASN1_R_ILLEGAL_NESTED_TAGGING 181 +# define ASN1_R_ILLEGAL_NULL 125 +# define ASN1_R_ILLEGAL_NULL_VALUE 182 +# define ASN1_R_ILLEGAL_OBJECT 183 +# define ASN1_R_ILLEGAL_OPTIONAL_ANY 126 +# define ASN1_R_ILLEGAL_OPTIONS_ON_ITEM_TEMPLATE 170 +# define ASN1_R_ILLEGAL_TAGGED_ANY 127 +# define ASN1_R_ILLEGAL_TIME_VALUE 184 +# define ASN1_R_INTEGER_NOT_ASCII_FORMAT 185 +# define ASN1_R_INTEGER_TOO_LARGE_FOR_LONG 128 +# define ASN1_R_INVALID_BIT_STRING_BITS_LEFT 220 +# define ASN1_R_INVALID_BMPSTRING_LENGTH 129 +# define ASN1_R_INVALID_DIGIT 130 +# define ASN1_R_INVALID_MIME_TYPE 205 +# define ASN1_R_INVALID_MODIFIER 186 +# define ASN1_R_INVALID_NUMBER 187 +# define ASN1_R_INVALID_OBJECT_ENCODING 216 +# define ASN1_R_INVALID_SEPARATOR 131 +# define ASN1_R_INVALID_TIME_FORMAT 132 +# define ASN1_R_INVALID_UNIVERSALSTRING_LENGTH 133 +# define ASN1_R_INVALID_UTF8STRING 134 +# define ASN1_R_IV_TOO_LARGE 135 +# define ASN1_R_LENGTH_ERROR 136 +# define ASN1_R_LIST_ERROR 188 +# define ASN1_R_MIME_NO_CONTENT_TYPE 206 +# define ASN1_R_MIME_PARSE_ERROR 207 +# define ASN1_R_MIME_SIG_PARSE_ERROR 208 +# define ASN1_R_MISSING_EOC 137 +# define ASN1_R_MISSING_SECOND_NUMBER 138 +# define ASN1_R_MISSING_VALUE 189 +# define ASN1_R_MSTRING_NOT_UNIVERSAL 139 +# define ASN1_R_MSTRING_WRONG_TAG 140 +# define ASN1_R_NESTED_ASN1_STRING 197 +# define ASN1_R_NON_HEX_CHARACTERS 141 +# define ASN1_R_NOT_ASCII_FORMAT 190 +# define ASN1_R_NOT_ENOUGH_DATA 142 +# define ASN1_R_NO_CONTENT_TYPE 209 +# define ASN1_R_NO_DEFAULT_DIGEST 201 +# define ASN1_R_NO_MATCHING_CHOICE_TYPE 143 +# define ASN1_R_NO_MULTIPART_BODY_FAILURE 210 +# define ASN1_R_NO_MULTIPART_BOUNDARY 211 +# define ASN1_R_NO_SIG_CONTENT_TYPE 212 +# define ASN1_R_NULL_IS_WRONG_LENGTH 144 +# define ASN1_R_OBJECT_NOT_ASCII_FORMAT 191 +# define ASN1_R_ODD_NUMBER_OF_CHARS 145 +# define ASN1_R_PRIVATE_KEY_HEADER_MISSING 146 +# define ASN1_R_SECOND_NUMBER_TOO_LARGE 147 +# define ASN1_R_SEQUENCE_LENGTH_MISMATCH 148 +# define ASN1_R_SEQUENCE_NOT_CONSTRUCTED 149 +# define ASN1_R_SEQUENCE_OR_SET_NEEDS_CONFIG 192 +# define ASN1_R_SHORT_LINE 150 +# define ASN1_R_SIG_INVALID_MIME_TYPE 213 +# define ASN1_R_STREAMING_NOT_SUPPORTED 202 +# define ASN1_R_STRING_TOO_LONG 151 +# define ASN1_R_STRING_TOO_SHORT 152 +# define ASN1_R_TAG_VALUE_TOO_HIGH 153 +# define ASN1_R_THE_ASN1_OBJECT_IDENTIFIER_IS_NOT_KNOWN_FOR_THIS_MD 154 +# define ASN1_R_TIME_NOT_ASCII_FORMAT 193 +# define ASN1_R_TOO_LONG 155 +# define ASN1_R_TYPE_NOT_CONSTRUCTED 156 +# define ASN1_R_TYPE_NOT_PRIMITIVE 218 +# define ASN1_R_UNABLE_TO_DECODE_RSA_KEY 157 +# define ASN1_R_UNABLE_TO_DECODE_RSA_PRIVATE_KEY 158 +# define ASN1_R_UNEXPECTED_EOC 159 +# define ASN1_R_UNIVERSALSTRING_IS_WRONG_LENGTH 215 +# define ASN1_R_UNKNOWN_FORMAT 160 +# define ASN1_R_UNKNOWN_MESSAGE_DIGEST_ALGORITHM 161 +# define ASN1_R_UNKNOWN_OBJECT_TYPE 162 +# define ASN1_R_UNKNOWN_PUBLIC_KEY_TYPE 163 +# define ASN1_R_UNKNOWN_SIGNATURE_ALGORITHM 199 +# define ASN1_R_UNKNOWN_TAG 194 +# define ASN1_R_UNKOWN_FORMAT 195 +# define ASN1_R_UNSUPPORTED_ANY_DEFINED_BY_TYPE 164 +# define ASN1_R_UNSUPPORTED_CIPHER 165 +# define ASN1_R_UNSUPPORTED_ENCRYPTION_ALGORITHM 166 +# define ASN1_R_UNSUPPORTED_PUBLIC_KEY_TYPE 167 +# define ASN1_R_UNSUPPORTED_TYPE 196 +# define ASN1_R_WRONG_PUBLIC_KEY_TYPE 200 +# define ASN1_R_WRONG_TAG 168 +# define ASN1_R_WRONG_TYPE 169 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/ext/openssl-osx/include/openssl/asn1_mac.h b/ext/openssl-osx/include/openssl/asn1_mac.h new file mode 100644 index 00000000..abc6dc35 --- /dev/null +++ b/ext/openssl-osx/include/openssl/asn1_mac.h @@ -0,0 +1,579 @@ +/* crypto/asn1/asn1_mac.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_ASN1_MAC_H +# define HEADER_ASN1_MAC_H + +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# ifndef ASN1_MAC_ERR_LIB +# define ASN1_MAC_ERR_LIB ERR_LIB_ASN1 +# endif + +# define ASN1_MAC_H_err(f,r,line) \ + ERR_PUT_error(ASN1_MAC_ERR_LIB,(f),(r),__FILE__,(line)) + +# define M_ASN1_D2I_vars(a,type,func) \ + ASN1_const_CTX c; \ + type ret=NULL; \ + \ + c.pp=(const unsigned char **)pp; \ + c.q= *(const unsigned char **)pp; \ + c.error=ERR_R_NESTED_ASN1_ERROR; \ + if ((a == NULL) || ((*a) == NULL)) \ + { if ((ret=(type)func()) == NULL) \ + { c.line=__LINE__; goto err; } } \ + else ret=(*a); + +# define M_ASN1_D2I_Init() \ + c.p= *(const unsigned char **)pp; \ + c.max=(length == 0)?0:(c.p+length); + +# define M_ASN1_D2I_Finish_2(a) \ + if (!asn1_const_Finish(&c)) \ + { c.line=__LINE__; goto err; } \ + *(const unsigned char **)pp=c.p; \ + if (a != NULL) (*a)=ret; \ + return(ret); + +# define M_ASN1_D2I_Finish(a,func,e) \ + M_ASN1_D2I_Finish_2(a); \ +err:\ + ASN1_MAC_H_err((e),c.error,c.line); \ + asn1_add_error(*(const unsigned char **)pp,(int)(c.q- *pp)); \ + if ((ret != NULL) && ((a == NULL) || (*a != ret))) func(ret); \ + return(NULL) + +# define M_ASN1_D2I_start_sequence() \ + if (!asn1_GetSequence(&c,&length)) \ + { c.line=__LINE__; goto err; } +/* Begin reading ASN1 without a surrounding sequence */ +# define M_ASN1_D2I_begin() \ + c.slen = length; + +/* End reading ASN1 with no check on length */ +# define M_ASN1_D2I_Finish_nolen(a, func, e) \ + *pp=c.p; \ + if (a != NULL) (*a)=ret; \ + return(ret); \ +err:\ + ASN1_MAC_H_err((e),c.error,c.line); \ + asn1_add_error(*pp,(int)(c.q- *pp)); \ + if ((ret != NULL) && ((a == NULL) || (*a != ret))) func(ret); \ + return(NULL) + +# define M_ASN1_D2I_end_sequence() \ + (((c.inf&1) == 0)?(c.slen <= 0): \ + (c.eos=ASN1_const_check_infinite_end(&c.p,c.slen))) + +/* Don't use this with d2i_ASN1_BOOLEAN() */ +# define M_ASN1_D2I_get(b, func) \ + c.q=c.p; \ + if (func(&(b),&c.p,c.slen) == NULL) \ + {c.line=__LINE__; goto err; } \ + c.slen-=(c.p-c.q); + +/* Don't use this with d2i_ASN1_BOOLEAN() */ +# define M_ASN1_D2I_get_x(type,b,func) \ + c.q=c.p; \ + if (((D2I_OF(type))func)(&(b),&c.p,c.slen) == NULL) \ + {c.line=__LINE__; goto err; } \ + c.slen-=(c.p-c.q); + +/* use this instead () */ +# define M_ASN1_D2I_get_int(b,func) \ + c.q=c.p; \ + if (func(&(b),&c.p,c.slen) < 0) \ + {c.line=__LINE__; goto err; } \ + c.slen-=(c.p-c.q); + +# define M_ASN1_D2I_get_opt(b,func,type) \ + if ((c.slen != 0) && ((M_ASN1_next & (~V_ASN1_CONSTRUCTED)) \ + == (V_ASN1_UNIVERSAL|(type)))) \ + { \ + M_ASN1_D2I_get(b,func); \ + } + +# define M_ASN1_D2I_get_int_opt(b,func,type) \ + if ((c.slen != 0) && ((M_ASN1_next & (~V_ASN1_CONSTRUCTED)) \ + == (V_ASN1_UNIVERSAL|(type)))) \ + { \ + M_ASN1_D2I_get_int(b,func); \ + } + +# define M_ASN1_D2I_get_imp(b,func, type) \ + M_ASN1_next=(_tmp& V_ASN1_CONSTRUCTED)|type; \ + c.q=c.p; \ + if (func(&(b),&c.p,c.slen) == NULL) \ + {c.line=__LINE__; M_ASN1_next_prev = _tmp; goto err; } \ + c.slen-=(c.p-c.q);\ + M_ASN1_next_prev=_tmp; + +# define M_ASN1_D2I_get_IMP_opt(b,func,tag,type) \ + if ((c.slen != 0) && ((M_ASN1_next & (~V_ASN1_CONSTRUCTED)) == \ + (V_ASN1_CONTEXT_SPECIFIC|(tag)))) \ + { \ + unsigned char _tmp = M_ASN1_next; \ + M_ASN1_D2I_get_imp(b,func, type);\ + } + +# define M_ASN1_D2I_get_set(r,func,free_func) \ + M_ASN1_D2I_get_imp_set(r,func,free_func, \ + V_ASN1_SET,V_ASN1_UNIVERSAL); + +# define M_ASN1_D2I_get_set_type(type,r,func,free_func) \ + M_ASN1_D2I_get_imp_set_type(type,r,func,free_func, \ + V_ASN1_SET,V_ASN1_UNIVERSAL); + +# define M_ASN1_D2I_get_set_opt(r,func,free_func) \ + if ((c.slen != 0) && (M_ASN1_next == (V_ASN1_UNIVERSAL| \ + V_ASN1_CONSTRUCTED|V_ASN1_SET)))\ + { M_ASN1_D2I_get_set(r,func,free_func); } + +# define M_ASN1_D2I_get_set_opt_type(type,r,func,free_func) \ + if ((c.slen != 0) && (M_ASN1_next == (V_ASN1_UNIVERSAL| \ + V_ASN1_CONSTRUCTED|V_ASN1_SET)))\ + { M_ASN1_D2I_get_set_type(type,r,func,free_func); } + +# define M_ASN1_I2D_len_SET_opt(a,f) \ + if ((a != NULL) && (sk_num(a) != 0)) \ + M_ASN1_I2D_len_SET(a,f); + +# define M_ASN1_I2D_put_SET_opt(a,f) \ + if ((a != NULL) && (sk_num(a) != 0)) \ + M_ASN1_I2D_put_SET(a,f); + +# define M_ASN1_I2D_put_SEQUENCE_opt(a,f) \ + if ((a != NULL) && (sk_num(a) != 0)) \ + M_ASN1_I2D_put_SEQUENCE(a,f); + +# define M_ASN1_I2D_put_SEQUENCE_opt_type(type,a,f) \ + if ((a != NULL) && (sk_##type##_num(a) != 0)) \ + M_ASN1_I2D_put_SEQUENCE_type(type,a,f); + +# define M_ASN1_D2I_get_IMP_set_opt(b,func,free_func,tag) \ + if ((c.slen != 0) && \ + (M_ASN1_next == \ + (V_ASN1_CONTEXT_SPECIFIC|V_ASN1_CONSTRUCTED|(tag))))\ + { \ + M_ASN1_D2I_get_imp_set(b,func,free_func,\ + tag,V_ASN1_CONTEXT_SPECIFIC); \ + } + +# define M_ASN1_D2I_get_IMP_set_opt_type(type,b,func,free_func,tag) \ + if ((c.slen != 0) && \ + (M_ASN1_next == \ + (V_ASN1_CONTEXT_SPECIFIC|V_ASN1_CONSTRUCTED|(tag))))\ + { \ + M_ASN1_D2I_get_imp_set_type(type,b,func,free_func,\ + tag,V_ASN1_CONTEXT_SPECIFIC); \ + } + +# define M_ASN1_D2I_get_seq(r,func,free_func) \ + M_ASN1_D2I_get_imp_set(r,func,free_func,\ + V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL); + +# define M_ASN1_D2I_get_seq_type(type,r,func,free_func) \ + M_ASN1_D2I_get_imp_set_type(type,r,func,free_func,\ + V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL) + +# define M_ASN1_D2I_get_seq_opt(r,func,free_func) \ + if ((c.slen != 0) && (M_ASN1_next == (V_ASN1_UNIVERSAL| \ + V_ASN1_CONSTRUCTED|V_ASN1_SEQUENCE)))\ + { M_ASN1_D2I_get_seq(r,func,free_func); } + +# define M_ASN1_D2I_get_seq_opt_type(type,r,func,free_func) \ + if ((c.slen != 0) && (M_ASN1_next == (V_ASN1_UNIVERSAL| \ + V_ASN1_CONSTRUCTED|V_ASN1_SEQUENCE)))\ + { M_ASN1_D2I_get_seq_type(type,r,func,free_func); } + +# define M_ASN1_D2I_get_IMP_set(r,func,free_func,x) \ + M_ASN1_D2I_get_imp_set(r,func,free_func,\ + x,V_ASN1_CONTEXT_SPECIFIC); + +# define M_ASN1_D2I_get_IMP_set_type(type,r,func,free_func,x) \ + M_ASN1_D2I_get_imp_set_type(type,r,func,free_func,\ + x,V_ASN1_CONTEXT_SPECIFIC); + +# define M_ASN1_D2I_get_imp_set(r,func,free_func,a,b) \ + c.q=c.p; \ + if (d2i_ASN1_SET(&(r),&c.p,c.slen,(char *(*)())func,\ + (void (*)())free_func,a,b) == NULL) \ + { c.line=__LINE__; goto err; } \ + c.slen-=(c.p-c.q); + +# define M_ASN1_D2I_get_imp_set_type(type,r,func,free_func,a,b) \ + c.q=c.p; \ + if (d2i_ASN1_SET_OF_##type(&(r),&c.p,c.slen,func,\ + free_func,a,b) == NULL) \ + { c.line=__LINE__; goto err; } \ + c.slen-=(c.p-c.q); + +# define M_ASN1_D2I_get_set_strings(r,func,a,b) \ + c.q=c.p; \ + if (d2i_ASN1_STRING_SET(&(r),&c.p,c.slen,a,b) == NULL) \ + { c.line=__LINE__; goto err; } \ + c.slen-=(c.p-c.q); + +# define M_ASN1_D2I_get_EXP_opt(r,func,tag) \ + if ((c.slen != 0L) && (M_ASN1_next == \ + (V_ASN1_CONSTRUCTED|V_ASN1_CONTEXT_SPECIFIC|tag))) \ + { \ + int Tinf,Ttag,Tclass; \ + long Tlen; \ + \ + c.q=c.p; \ + Tinf=ASN1_get_object(&c.p,&Tlen,&Ttag,&Tclass,c.slen); \ + if (Tinf & 0x80) \ + { c.error=ERR_R_BAD_ASN1_OBJECT_HEADER; \ + c.line=__LINE__; goto err; } \ + if (Tinf == (V_ASN1_CONSTRUCTED+1)) \ + Tlen = c.slen - (c.p - c.q) - 2; \ + if (func(&(r),&c.p,Tlen) == NULL) \ + { c.line=__LINE__; goto err; } \ + if (Tinf == (V_ASN1_CONSTRUCTED+1)) { \ + Tlen = c.slen - (c.p - c.q); \ + if(!ASN1_const_check_infinite_end(&c.p, Tlen)) \ + { c.error=ERR_R_MISSING_ASN1_EOS; \ + c.line=__LINE__; goto err; } \ + }\ + c.slen-=(c.p-c.q); \ + } + +# define M_ASN1_D2I_get_EXP_set_opt(r,func,free_func,tag,b) \ + if ((c.slen != 0) && (M_ASN1_next == \ + (V_ASN1_CONSTRUCTED|V_ASN1_CONTEXT_SPECIFIC|tag))) \ + { \ + int Tinf,Ttag,Tclass; \ + long Tlen; \ + \ + c.q=c.p; \ + Tinf=ASN1_get_object(&c.p,&Tlen,&Ttag,&Tclass,c.slen); \ + if (Tinf & 0x80) \ + { c.error=ERR_R_BAD_ASN1_OBJECT_HEADER; \ + c.line=__LINE__; goto err; } \ + if (Tinf == (V_ASN1_CONSTRUCTED+1)) \ + Tlen = c.slen - (c.p - c.q) - 2; \ + if (d2i_ASN1_SET(&(r),&c.p,Tlen,(char *(*)())func, \ + (void (*)())free_func, \ + b,V_ASN1_UNIVERSAL) == NULL) \ + { c.line=__LINE__; goto err; } \ + if (Tinf == (V_ASN1_CONSTRUCTED+1)) { \ + Tlen = c.slen - (c.p - c.q); \ + if(!ASN1_check_infinite_end(&c.p, Tlen)) \ + { c.error=ERR_R_MISSING_ASN1_EOS; \ + c.line=__LINE__; goto err; } \ + }\ + c.slen-=(c.p-c.q); \ + } + +# define M_ASN1_D2I_get_EXP_set_opt_type(type,r,func,free_func,tag,b) \ + if ((c.slen != 0) && (M_ASN1_next == \ + (V_ASN1_CONSTRUCTED|V_ASN1_CONTEXT_SPECIFIC|tag))) \ + { \ + int Tinf,Ttag,Tclass; \ + long Tlen; \ + \ + c.q=c.p; \ + Tinf=ASN1_get_object(&c.p,&Tlen,&Ttag,&Tclass,c.slen); \ + if (Tinf & 0x80) \ + { c.error=ERR_R_BAD_ASN1_OBJECT_HEADER; \ + c.line=__LINE__; goto err; } \ + if (Tinf == (V_ASN1_CONSTRUCTED+1)) \ + Tlen = c.slen - (c.p - c.q) - 2; \ + if (d2i_ASN1_SET_OF_##type(&(r),&c.p,Tlen,func, \ + free_func,b,V_ASN1_UNIVERSAL) == NULL) \ + { c.line=__LINE__; goto err; } \ + if (Tinf == (V_ASN1_CONSTRUCTED+1)) { \ + Tlen = c.slen - (c.p - c.q); \ + if(!ASN1_check_infinite_end(&c.p, Tlen)) \ + { c.error=ERR_R_MISSING_ASN1_EOS; \ + c.line=__LINE__; goto err; } \ + }\ + c.slen-=(c.p-c.q); \ + } + +/* New macros */ +# define M_ASN1_New_Malloc(ret,type) \ + if ((ret=(type *)OPENSSL_malloc(sizeof(type))) == NULL) \ + { c.line=__LINE__; goto err2; } + +# define M_ASN1_New(arg,func) \ + if (((arg)=func()) == NULL) return(NULL) + +# define M_ASN1_New_Error(a) \ +/*- err: ASN1_MAC_H_err((a),ERR_R_NESTED_ASN1_ERROR,c.line); \ + return(NULL);*/ \ + err2: ASN1_MAC_H_err((a),ERR_R_MALLOC_FAILURE,c.line); \ + return(NULL) + +/* + * BIG UGLY WARNING! This is so damn ugly I wanna puke. Unfortunately, some + * macros that use ASN1_const_CTX still insist on writing in the input + * stream. ARGH! ARGH! ARGH! Let's get rid of this macro package. Please? -- + * Richard Levitte + */ +# define M_ASN1_next (*((unsigned char *)(c.p))) +# define M_ASN1_next_prev (*((unsigned char *)(c.q))) + +/*************************************************/ + +# define M_ASN1_I2D_vars(a) int r=0,ret=0; \ + unsigned char *p; \ + if (a == NULL) return(0) + +/* Length Macros */ +# define M_ASN1_I2D_len(a,f) ret+=f(a,NULL) +# define M_ASN1_I2D_len_IMP_opt(a,f) if (a != NULL) M_ASN1_I2D_len(a,f) + +# define M_ASN1_I2D_len_SET(a,f) \ + ret+=i2d_ASN1_SET(a,NULL,f,V_ASN1_SET,V_ASN1_UNIVERSAL,IS_SET); + +# define M_ASN1_I2D_len_SET_type(type,a,f) \ + ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,V_ASN1_SET, \ + V_ASN1_UNIVERSAL,IS_SET); + +# define M_ASN1_I2D_len_SEQUENCE(a,f) \ + ret+=i2d_ASN1_SET(a,NULL,f,V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL, \ + IS_SEQUENCE); + +# define M_ASN1_I2D_len_SEQUENCE_type(type,a,f) \ + ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,V_ASN1_SEQUENCE, \ + V_ASN1_UNIVERSAL,IS_SEQUENCE) + +# define M_ASN1_I2D_len_SEQUENCE_opt(a,f) \ + if ((a != NULL) && (sk_num(a) != 0)) \ + M_ASN1_I2D_len_SEQUENCE(a,f); + +# define M_ASN1_I2D_len_SEQUENCE_opt_type(type,a,f) \ + if ((a != NULL) && (sk_##type##_num(a) != 0)) \ + M_ASN1_I2D_len_SEQUENCE_type(type,a,f); + +# define M_ASN1_I2D_len_IMP_SET(a,f,x) \ + ret+=i2d_ASN1_SET(a,NULL,f,x,V_ASN1_CONTEXT_SPECIFIC,IS_SET); + +# define M_ASN1_I2D_len_IMP_SET_type(type,a,f,x) \ + ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,x, \ + V_ASN1_CONTEXT_SPECIFIC,IS_SET); + +# define M_ASN1_I2D_len_IMP_SET_opt(a,f,x) \ + if ((a != NULL) && (sk_num(a) != 0)) \ + ret+=i2d_ASN1_SET(a,NULL,f,x,V_ASN1_CONTEXT_SPECIFIC, \ + IS_SET); + +# define M_ASN1_I2D_len_IMP_SET_opt_type(type,a,f,x) \ + if ((a != NULL) && (sk_##type##_num(a) != 0)) \ + ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,x, \ + V_ASN1_CONTEXT_SPECIFIC,IS_SET); + +# define M_ASN1_I2D_len_IMP_SEQUENCE(a,f,x) \ + ret+=i2d_ASN1_SET(a,NULL,f,x,V_ASN1_CONTEXT_SPECIFIC, \ + IS_SEQUENCE); + +# define M_ASN1_I2D_len_IMP_SEQUENCE_opt(a,f,x) \ + if ((a != NULL) && (sk_num(a) != 0)) \ + ret+=i2d_ASN1_SET(a,NULL,f,x,V_ASN1_CONTEXT_SPECIFIC, \ + IS_SEQUENCE); + +# define M_ASN1_I2D_len_IMP_SEQUENCE_opt_type(type,a,f,x) \ + if ((a != NULL) && (sk_##type##_num(a) != 0)) \ + ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,x, \ + V_ASN1_CONTEXT_SPECIFIC, \ + IS_SEQUENCE); + +# define M_ASN1_I2D_len_EXP_opt(a,f,mtag,v) \ + if (a != NULL)\ + { \ + v=f(a,NULL); \ + ret+=ASN1_object_size(1,v,mtag); \ + } + +# define M_ASN1_I2D_len_EXP_SET_opt(a,f,mtag,tag,v) \ + if ((a != NULL) && (sk_num(a) != 0))\ + { \ + v=i2d_ASN1_SET(a,NULL,f,tag,V_ASN1_UNIVERSAL,IS_SET); \ + ret+=ASN1_object_size(1,v,mtag); \ + } + +# define M_ASN1_I2D_len_EXP_SEQUENCE_opt(a,f,mtag,tag,v) \ + if ((a != NULL) && (sk_num(a) != 0))\ + { \ + v=i2d_ASN1_SET(a,NULL,f,tag,V_ASN1_UNIVERSAL, \ + IS_SEQUENCE); \ + ret+=ASN1_object_size(1,v,mtag); \ + } + +# define M_ASN1_I2D_len_EXP_SEQUENCE_opt_type(type,a,f,mtag,tag,v) \ + if ((a != NULL) && (sk_##type##_num(a) != 0))\ + { \ + v=i2d_ASN1_SET_OF_##type(a,NULL,f,tag, \ + V_ASN1_UNIVERSAL, \ + IS_SEQUENCE); \ + ret+=ASN1_object_size(1,v,mtag); \ + } + +/* Put Macros */ +# define M_ASN1_I2D_put(a,f) f(a,&p) + +# define M_ASN1_I2D_put_IMP_opt(a,f,t) \ + if (a != NULL) \ + { \ + unsigned char *q=p; \ + f(a,&p); \ + *q=(V_ASN1_CONTEXT_SPECIFIC|t|(*q&V_ASN1_CONSTRUCTED));\ + } + +# define M_ASN1_I2D_put_SET(a,f) i2d_ASN1_SET(a,&p,f,V_ASN1_SET,\ + V_ASN1_UNIVERSAL,IS_SET) +# define M_ASN1_I2D_put_SET_type(type,a,f) \ + i2d_ASN1_SET_OF_##type(a,&p,f,V_ASN1_SET,V_ASN1_UNIVERSAL,IS_SET) +# define M_ASN1_I2D_put_IMP_SET(a,f,x) i2d_ASN1_SET(a,&p,f,x,\ + V_ASN1_CONTEXT_SPECIFIC,IS_SET) +# define M_ASN1_I2D_put_IMP_SET_type(type,a,f,x) \ + i2d_ASN1_SET_OF_##type(a,&p,f,x,V_ASN1_CONTEXT_SPECIFIC,IS_SET) +# define M_ASN1_I2D_put_IMP_SEQUENCE(a,f,x) i2d_ASN1_SET(a,&p,f,x,\ + V_ASN1_CONTEXT_SPECIFIC,IS_SEQUENCE) + +# define M_ASN1_I2D_put_SEQUENCE(a,f) i2d_ASN1_SET(a,&p,f,V_ASN1_SEQUENCE,\ + V_ASN1_UNIVERSAL,IS_SEQUENCE) + +# define M_ASN1_I2D_put_SEQUENCE_type(type,a,f) \ + i2d_ASN1_SET_OF_##type(a,&p,f,V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL, \ + IS_SEQUENCE) + +# define M_ASN1_I2D_put_SEQUENCE_opt(a,f) \ + if ((a != NULL) && (sk_num(a) != 0)) \ + M_ASN1_I2D_put_SEQUENCE(a,f); + +# define M_ASN1_I2D_put_IMP_SET_opt(a,f,x) \ + if ((a != NULL) && (sk_num(a) != 0)) \ + { i2d_ASN1_SET(a,&p,f,x,V_ASN1_CONTEXT_SPECIFIC, \ + IS_SET); } + +# define M_ASN1_I2D_put_IMP_SET_opt_type(type,a,f,x) \ + if ((a != NULL) && (sk_##type##_num(a) != 0)) \ + { i2d_ASN1_SET_OF_##type(a,&p,f,x, \ + V_ASN1_CONTEXT_SPECIFIC, \ + IS_SET); } + +# define M_ASN1_I2D_put_IMP_SEQUENCE_opt(a,f,x) \ + if ((a != NULL) && (sk_num(a) != 0)) \ + { i2d_ASN1_SET(a,&p,f,x,V_ASN1_CONTEXT_SPECIFIC, \ + IS_SEQUENCE); } + +# define M_ASN1_I2D_put_IMP_SEQUENCE_opt_type(type,a,f,x) \ + if ((a != NULL) && (sk_##type##_num(a) != 0)) \ + { i2d_ASN1_SET_OF_##type(a,&p,f,x, \ + V_ASN1_CONTEXT_SPECIFIC, \ + IS_SEQUENCE); } + +# define M_ASN1_I2D_put_EXP_opt(a,f,tag,v) \ + if (a != NULL) \ + { \ + ASN1_put_object(&p,1,v,tag,V_ASN1_CONTEXT_SPECIFIC); \ + f(a,&p); \ + } + +# define M_ASN1_I2D_put_EXP_SET_opt(a,f,mtag,tag,v) \ + if ((a != NULL) && (sk_num(a) != 0)) \ + { \ + ASN1_put_object(&p,1,v,mtag,V_ASN1_CONTEXT_SPECIFIC); \ + i2d_ASN1_SET(a,&p,f,tag,V_ASN1_UNIVERSAL,IS_SET); \ + } + +# define M_ASN1_I2D_put_EXP_SEQUENCE_opt(a,f,mtag,tag,v) \ + if ((a != NULL) && (sk_num(a) != 0)) \ + { \ + ASN1_put_object(&p,1,v,mtag,V_ASN1_CONTEXT_SPECIFIC); \ + i2d_ASN1_SET(a,&p,f,tag,V_ASN1_UNIVERSAL,IS_SEQUENCE); \ + } + +# define M_ASN1_I2D_put_EXP_SEQUENCE_opt_type(type,a,f,mtag,tag,v) \ + if ((a != NULL) && (sk_##type##_num(a) != 0)) \ + { \ + ASN1_put_object(&p,1,v,mtag,V_ASN1_CONTEXT_SPECIFIC); \ + i2d_ASN1_SET_OF_##type(a,&p,f,tag,V_ASN1_UNIVERSAL, \ + IS_SEQUENCE); \ + } + +# define M_ASN1_I2D_seq_total() \ + r=ASN1_object_size(1,ret,V_ASN1_SEQUENCE); \ + if (pp == NULL) return(r); \ + p= *pp; \ + ASN1_put_object(&p,1,ret,V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL) + +# define M_ASN1_I2D_INF_seq_start(tag,ctx) \ + *(p++)=(V_ASN1_CONSTRUCTED|(tag)|(ctx)); \ + *(p++)=0x80 + +# define M_ASN1_I2D_INF_seq_end() *(p++)=0x00; *(p++)=0x00 + +# define M_ASN1_I2D_finish() *pp=p; \ + return(r); + +int asn1_GetSequence(ASN1_const_CTX *c, long *length); +void asn1_add_error(const unsigned char *address, int offset); +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ext/openssl-osx/include/openssl/bio.h b/ext/openssl-osx/include/openssl/bio.h new file mode 100644 index 00000000..60083bfd --- /dev/null +++ b/ext/openssl-osx/include/openssl/bio.h @@ -0,0 +1,878 @@ +/* crypto/bio/bio.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_BIO_H +# define HEADER_BIO_H + +# include + +# ifndef OPENSSL_NO_FP_API +# include +# endif +# include + +# include + +# ifndef OPENSSL_NO_SCTP +# ifndef OPENSSL_SYS_VMS +# include +# else +# include +# endif +# endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* These are the 'types' of BIOs */ +# define BIO_TYPE_NONE 0 +# define BIO_TYPE_MEM (1|0x0400) +# define BIO_TYPE_FILE (2|0x0400) + +# define BIO_TYPE_FD (4|0x0400|0x0100) +# define BIO_TYPE_SOCKET (5|0x0400|0x0100) +# define BIO_TYPE_NULL (6|0x0400) +# define BIO_TYPE_SSL (7|0x0200) +# define BIO_TYPE_MD (8|0x0200)/* passive filter */ +# define BIO_TYPE_BUFFER (9|0x0200)/* filter */ +# define BIO_TYPE_CIPHER (10|0x0200)/* filter */ +# define BIO_TYPE_BASE64 (11|0x0200)/* filter */ +# define BIO_TYPE_CONNECT (12|0x0400|0x0100)/* socket - connect */ +# define BIO_TYPE_ACCEPT (13|0x0400|0x0100)/* socket for accept */ +# define BIO_TYPE_PROXY_CLIENT (14|0x0200)/* client proxy BIO */ +# define BIO_TYPE_PROXY_SERVER (15|0x0200)/* server proxy BIO */ +# define BIO_TYPE_NBIO_TEST (16|0x0200)/* server proxy BIO */ +# define BIO_TYPE_NULL_FILTER (17|0x0200) +# define BIO_TYPE_BER (18|0x0200)/* BER -> bin filter */ +# define BIO_TYPE_BIO (19|0x0400)/* (half a) BIO pair */ +# define BIO_TYPE_LINEBUFFER (20|0x0200)/* filter */ +# define BIO_TYPE_DGRAM (21|0x0400|0x0100) +# ifndef OPENSSL_NO_SCTP +# define BIO_TYPE_DGRAM_SCTP (24|0x0400|0x0100) +# endif +# define BIO_TYPE_ASN1 (22|0x0200)/* filter */ +# define BIO_TYPE_COMP (23|0x0200)/* filter */ + +# define BIO_TYPE_DESCRIPTOR 0x0100/* socket, fd, connect or accept */ +# define BIO_TYPE_FILTER 0x0200 +# define BIO_TYPE_SOURCE_SINK 0x0400 + +/* + * BIO_FILENAME_READ|BIO_CLOSE to open or close on free. + * BIO_set_fp(in,stdin,BIO_NOCLOSE); + */ +# define BIO_NOCLOSE 0x00 +# define BIO_CLOSE 0x01 + +/* + * These are used in the following macros and are passed to BIO_ctrl() + */ +# define BIO_CTRL_RESET 1/* opt - rewind/zero etc */ +# define BIO_CTRL_EOF 2/* opt - are we at the eof */ +# define BIO_CTRL_INFO 3/* opt - extra tit-bits */ +# define BIO_CTRL_SET 4/* man - set the 'IO' type */ +# define BIO_CTRL_GET 5/* man - get the 'IO' type */ +# define BIO_CTRL_PUSH 6/* opt - internal, used to signify change */ +# define BIO_CTRL_POP 7/* opt - internal, used to signify change */ +# define BIO_CTRL_GET_CLOSE 8/* man - set the 'close' on free */ +# define BIO_CTRL_SET_CLOSE 9/* man - set the 'close' on free */ +# define BIO_CTRL_PENDING 10/* opt - is their more data buffered */ +# define BIO_CTRL_FLUSH 11/* opt - 'flush' buffered output */ +# define BIO_CTRL_DUP 12/* man - extra stuff for 'duped' BIO */ +# define BIO_CTRL_WPENDING 13/* opt - number of bytes still to write */ +/* callback is int cb(BIO *bio,state,ret); */ +# define BIO_CTRL_SET_CALLBACK 14/* opt - set callback function */ +# define BIO_CTRL_GET_CALLBACK 15/* opt - set callback function */ + +# define BIO_CTRL_SET_FILENAME 30/* BIO_s_file special */ + +/* dgram BIO stuff */ +# define BIO_CTRL_DGRAM_CONNECT 31/* BIO dgram special */ +# define BIO_CTRL_DGRAM_SET_CONNECTED 32/* allow for an externally connected + * socket to be passed in */ +# define BIO_CTRL_DGRAM_SET_RECV_TIMEOUT 33/* setsockopt, essentially */ +# define BIO_CTRL_DGRAM_GET_RECV_TIMEOUT 34/* getsockopt, essentially */ +# define BIO_CTRL_DGRAM_SET_SEND_TIMEOUT 35/* setsockopt, essentially */ +# define BIO_CTRL_DGRAM_GET_SEND_TIMEOUT 36/* getsockopt, essentially */ + +# define BIO_CTRL_DGRAM_GET_RECV_TIMER_EXP 37/* flag whether the last */ +# define BIO_CTRL_DGRAM_GET_SEND_TIMER_EXP 38/* I/O operation tiemd out */ + +/* #ifdef IP_MTU_DISCOVER */ +# define BIO_CTRL_DGRAM_MTU_DISCOVER 39/* set DF bit on egress packets */ +/* #endif */ + +# define BIO_CTRL_DGRAM_QUERY_MTU 40/* as kernel for current MTU */ +# define BIO_CTRL_DGRAM_GET_FALLBACK_MTU 47 +# define BIO_CTRL_DGRAM_GET_MTU 41/* get cached value for MTU */ +# define BIO_CTRL_DGRAM_SET_MTU 42/* set cached value for MTU. + * want to use this if asking + * the kernel fails */ + +# define BIO_CTRL_DGRAM_MTU_EXCEEDED 43/* check whether the MTU was + * exceed in the previous write + * operation */ + +# define BIO_CTRL_DGRAM_GET_PEER 46 +# define BIO_CTRL_DGRAM_SET_PEER 44/* Destination for the data */ + +# define BIO_CTRL_DGRAM_SET_NEXT_TIMEOUT 45/* Next DTLS handshake timeout + * to adjust socket timeouts */ +# define BIO_CTRL_DGRAM_SET_DONT_FRAG 48 + +# define BIO_CTRL_DGRAM_GET_MTU_OVERHEAD 49 + +# ifndef OPENSSL_NO_SCTP +/* SCTP stuff */ +# define BIO_CTRL_DGRAM_SCTP_SET_IN_HANDSHAKE 50 +# define BIO_CTRL_DGRAM_SCTP_ADD_AUTH_KEY 51 +# define BIO_CTRL_DGRAM_SCTP_NEXT_AUTH_KEY 52 +# define BIO_CTRL_DGRAM_SCTP_AUTH_CCS_RCVD 53 +# define BIO_CTRL_DGRAM_SCTP_GET_SNDINFO 60 +# define BIO_CTRL_DGRAM_SCTP_SET_SNDINFO 61 +# define BIO_CTRL_DGRAM_SCTP_GET_RCVINFO 62 +# define BIO_CTRL_DGRAM_SCTP_SET_RCVINFO 63 +# define BIO_CTRL_DGRAM_SCTP_GET_PRINFO 64 +# define BIO_CTRL_DGRAM_SCTP_SET_PRINFO 65 +# define BIO_CTRL_DGRAM_SCTP_SAVE_SHUTDOWN 70 +# endif + +/* modifiers */ +# define BIO_FP_READ 0x02 +# define BIO_FP_WRITE 0x04 +# define BIO_FP_APPEND 0x08 +# define BIO_FP_TEXT 0x10 + +# define BIO_FLAGS_READ 0x01 +# define BIO_FLAGS_WRITE 0x02 +# define BIO_FLAGS_IO_SPECIAL 0x04 +# define BIO_FLAGS_RWS (BIO_FLAGS_READ|BIO_FLAGS_WRITE|BIO_FLAGS_IO_SPECIAL) +# define BIO_FLAGS_SHOULD_RETRY 0x08 +# ifndef BIO_FLAGS_UPLINK +/* + * "UPLINK" flag denotes file descriptors provided by application. It + * defaults to 0, as most platforms don't require UPLINK interface. + */ +# define BIO_FLAGS_UPLINK 0 +# endif + +/* Used in BIO_gethostbyname() */ +# define BIO_GHBN_CTRL_HITS 1 +# define BIO_GHBN_CTRL_MISSES 2 +# define BIO_GHBN_CTRL_CACHE_SIZE 3 +# define BIO_GHBN_CTRL_GET_ENTRY 4 +# define BIO_GHBN_CTRL_FLUSH 5 + +/* Mostly used in the SSL BIO */ +/*- + * Not used anymore + * #define BIO_FLAGS_PROTOCOL_DELAYED_READ 0x10 + * #define BIO_FLAGS_PROTOCOL_DELAYED_WRITE 0x20 + * #define BIO_FLAGS_PROTOCOL_STARTUP 0x40 + */ + +# define BIO_FLAGS_BASE64_NO_NL 0x100 + +/* + * This is used with memory BIOs: it means we shouldn't free up or change the + * data in any way. + */ +# define BIO_FLAGS_MEM_RDONLY 0x200 + +typedef struct bio_st BIO; + +void BIO_set_flags(BIO *b, int flags); +int BIO_test_flags(const BIO *b, int flags); +void BIO_clear_flags(BIO *b, int flags); + +# define BIO_get_flags(b) BIO_test_flags(b, ~(0x0)) +# define BIO_set_retry_special(b) \ + BIO_set_flags(b, (BIO_FLAGS_IO_SPECIAL|BIO_FLAGS_SHOULD_RETRY)) +# define BIO_set_retry_read(b) \ + BIO_set_flags(b, (BIO_FLAGS_READ|BIO_FLAGS_SHOULD_RETRY)) +# define BIO_set_retry_write(b) \ + BIO_set_flags(b, (BIO_FLAGS_WRITE|BIO_FLAGS_SHOULD_RETRY)) + +/* These are normally used internally in BIOs */ +# define BIO_clear_retry_flags(b) \ + BIO_clear_flags(b, (BIO_FLAGS_RWS|BIO_FLAGS_SHOULD_RETRY)) +# define BIO_get_retry_flags(b) \ + BIO_test_flags(b, (BIO_FLAGS_RWS|BIO_FLAGS_SHOULD_RETRY)) + +/* These should be used by the application to tell why we should retry */ +# define BIO_should_read(a) BIO_test_flags(a, BIO_FLAGS_READ) +# define BIO_should_write(a) BIO_test_flags(a, BIO_FLAGS_WRITE) +# define BIO_should_io_special(a) BIO_test_flags(a, BIO_FLAGS_IO_SPECIAL) +# define BIO_retry_type(a) BIO_test_flags(a, BIO_FLAGS_RWS) +# define BIO_should_retry(a) BIO_test_flags(a, BIO_FLAGS_SHOULD_RETRY) + +/* + * The next three are used in conjunction with the BIO_should_io_special() + * condition. After this returns true, BIO *BIO_get_retry_BIO(BIO *bio, int + * *reason); will walk the BIO stack and return the 'reason' for the special + * and the offending BIO. Given a BIO, BIO_get_retry_reason(bio) will return + * the code. + */ +/* + * Returned from the SSL bio when the certificate retrieval code had an error + */ +# define BIO_RR_SSL_X509_LOOKUP 0x01 +/* Returned from the connect BIO when a connect would have blocked */ +# define BIO_RR_CONNECT 0x02 +/* Returned from the accept BIO when an accept would have blocked */ +# define BIO_RR_ACCEPT 0x03 + +/* These are passed by the BIO callback */ +# define BIO_CB_FREE 0x01 +# define BIO_CB_READ 0x02 +# define BIO_CB_WRITE 0x03 +# define BIO_CB_PUTS 0x04 +# define BIO_CB_GETS 0x05 +# define BIO_CB_CTRL 0x06 + +/* + * The callback is called before and after the underling operation, The + * BIO_CB_RETURN flag indicates if it is after the call + */ +# define BIO_CB_RETURN 0x80 +# define BIO_CB_return(a) ((a)|BIO_CB_RETURN)) +# define BIO_cb_pre(a) (!((a)&BIO_CB_RETURN)) +# define BIO_cb_post(a) ((a)&BIO_CB_RETURN) + +long (*BIO_get_callback(const BIO *b)) (struct bio_st *, int, const char *, + int, long, long); +void BIO_set_callback(BIO *b, + long (*callback) (struct bio_st *, int, const char *, + int, long, long)); +char *BIO_get_callback_arg(const BIO *b); +void BIO_set_callback_arg(BIO *b, char *arg); + +const char *BIO_method_name(const BIO *b); +int BIO_method_type(const BIO *b); + +typedef void bio_info_cb (struct bio_st *, int, const char *, int, long, + long); + +typedef struct bio_method_st { + int type; + const char *name; + int (*bwrite) (BIO *, const char *, int); + int (*bread) (BIO *, char *, int); + int (*bputs) (BIO *, const char *); + int (*bgets) (BIO *, char *, int); + long (*ctrl) (BIO *, int, long, void *); + int (*create) (BIO *); + int (*destroy) (BIO *); + long (*callback_ctrl) (BIO *, int, bio_info_cb *); +} BIO_METHOD; + +struct bio_st { + BIO_METHOD *method; + /* bio, mode, argp, argi, argl, ret */ + long (*callback) (struct bio_st *, int, const char *, int, long, long); + char *cb_arg; /* first argument for the callback */ + int init; + int shutdown; + int flags; /* extra storage */ + int retry_reason; + int num; + void *ptr; + struct bio_st *next_bio; /* used by filter BIOs */ + struct bio_st *prev_bio; /* used by filter BIOs */ + int references; + unsigned long num_read; + unsigned long num_write; + CRYPTO_EX_DATA ex_data; +}; + +DECLARE_STACK_OF(BIO) + +typedef struct bio_f_buffer_ctx_struct { + /*- + * Buffers are setup like this: + * + * <---------------------- size -----------------------> + * +---------------------------------------------------+ + * | consumed | remaining | free space | + * +---------------------------------------------------+ + * <-- off --><------- len -------> + */ + /*- BIO *bio; *//* + * this is now in the BIO struct + */ + int ibuf_size; /* how big is the input buffer */ + int obuf_size; /* how big is the output buffer */ + char *ibuf; /* the char array */ + int ibuf_len; /* how many bytes are in it */ + int ibuf_off; /* write/read offset */ + char *obuf; /* the char array */ + int obuf_len; /* how many bytes are in it */ + int obuf_off; /* write/read offset */ +} BIO_F_BUFFER_CTX; + +/* Prefix and suffix callback in ASN1 BIO */ +typedef int asn1_ps_func (BIO *b, unsigned char **pbuf, int *plen, + void *parg); + +# ifndef OPENSSL_NO_SCTP +/* SCTP parameter structs */ +struct bio_dgram_sctp_sndinfo { + uint16_t snd_sid; + uint16_t snd_flags; + uint32_t snd_ppid; + uint32_t snd_context; +}; + +struct bio_dgram_sctp_rcvinfo { + uint16_t rcv_sid; + uint16_t rcv_ssn; + uint16_t rcv_flags; + uint32_t rcv_ppid; + uint32_t rcv_tsn; + uint32_t rcv_cumtsn; + uint32_t rcv_context; +}; + +struct bio_dgram_sctp_prinfo { + uint16_t pr_policy; + uint32_t pr_value; +}; +# endif + +/* connect BIO stuff */ +# define BIO_CONN_S_BEFORE 1 +# define BIO_CONN_S_GET_IP 2 +# define BIO_CONN_S_GET_PORT 3 +# define BIO_CONN_S_CREATE_SOCKET 4 +# define BIO_CONN_S_CONNECT 5 +# define BIO_CONN_S_OK 6 +# define BIO_CONN_S_BLOCKED_CONNECT 7 +# define BIO_CONN_S_NBIO 8 +/* + * #define BIO_CONN_get_param_hostname BIO_ctrl + */ + +# define BIO_C_SET_CONNECT 100 +# define BIO_C_DO_STATE_MACHINE 101 +# define BIO_C_SET_NBIO 102 +# define BIO_C_SET_PROXY_PARAM 103 +# define BIO_C_SET_FD 104 +# define BIO_C_GET_FD 105 +# define BIO_C_SET_FILE_PTR 106 +# define BIO_C_GET_FILE_PTR 107 +# define BIO_C_SET_FILENAME 108 +# define BIO_C_SET_SSL 109 +# define BIO_C_GET_SSL 110 +# define BIO_C_SET_MD 111 +# define BIO_C_GET_MD 112 +# define BIO_C_GET_CIPHER_STATUS 113 +# define BIO_C_SET_BUF_MEM 114 +# define BIO_C_GET_BUF_MEM_PTR 115 +# define BIO_C_GET_BUFF_NUM_LINES 116 +# define BIO_C_SET_BUFF_SIZE 117 +# define BIO_C_SET_ACCEPT 118 +# define BIO_C_SSL_MODE 119 +# define BIO_C_GET_MD_CTX 120 +# define BIO_C_GET_PROXY_PARAM 121 +# define BIO_C_SET_BUFF_READ_DATA 122/* data to read first */ +# define BIO_C_GET_CONNECT 123 +# define BIO_C_GET_ACCEPT 124 +# define BIO_C_SET_SSL_RENEGOTIATE_BYTES 125 +# define BIO_C_GET_SSL_NUM_RENEGOTIATES 126 +# define BIO_C_SET_SSL_RENEGOTIATE_TIMEOUT 127 +# define BIO_C_FILE_SEEK 128 +# define BIO_C_GET_CIPHER_CTX 129 +# define BIO_C_SET_BUF_MEM_EOF_RETURN 130/* return end of input + * value */ +# define BIO_C_SET_BIND_MODE 131 +# define BIO_C_GET_BIND_MODE 132 +# define BIO_C_FILE_TELL 133 +# define BIO_C_GET_SOCKS 134 +# define BIO_C_SET_SOCKS 135 + +# define BIO_C_SET_WRITE_BUF_SIZE 136/* for BIO_s_bio */ +# define BIO_C_GET_WRITE_BUF_SIZE 137 +# define BIO_C_MAKE_BIO_PAIR 138 +# define BIO_C_DESTROY_BIO_PAIR 139 +# define BIO_C_GET_WRITE_GUARANTEE 140 +# define BIO_C_GET_READ_REQUEST 141 +# define BIO_C_SHUTDOWN_WR 142 +# define BIO_C_NREAD0 143 +# define BIO_C_NREAD 144 +# define BIO_C_NWRITE0 145 +# define BIO_C_NWRITE 146 +# define BIO_C_RESET_READ_REQUEST 147 +# define BIO_C_SET_MD_CTX 148 + +# define BIO_C_SET_PREFIX 149 +# define BIO_C_GET_PREFIX 150 +# define BIO_C_SET_SUFFIX 151 +# define BIO_C_GET_SUFFIX 152 + +# define BIO_C_SET_EX_ARG 153 +# define BIO_C_GET_EX_ARG 154 + +# define BIO_set_app_data(s,arg) BIO_set_ex_data(s,0,arg) +# define BIO_get_app_data(s) BIO_get_ex_data(s,0) + +/* BIO_s_connect() and BIO_s_socks4a_connect() */ +# define BIO_set_conn_hostname(b,name) BIO_ctrl(b,BIO_C_SET_CONNECT,0,(char *)name) +# define BIO_set_conn_port(b,port) BIO_ctrl(b,BIO_C_SET_CONNECT,1,(char *)port) +# define BIO_set_conn_ip(b,ip) BIO_ctrl(b,BIO_C_SET_CONNECT,2,(char *)ip) +# define BIO_set_conn_int_port(b,port) BIO_ctrl(b,BIO_C_SET_CONNECT,3,(char *)port) +# define BIO_get_conn_hostname(b) BIO_ptr_ctrl(b,BIO_C_GET_CONNECT,0) +# define BIO_get_conn_port(b) BIO_ptr_ctrl(b,BIO_C_GET_CONNECT,1) +# define BIO_get_conn_ip(b) BIO_ptr_ctrl(b,BIO_C_GET_CONNECT,2) +# define BIO_get_conn_int_port(b) BIO_int_ctrl(b,BIO_C_GET_CONNECT,3,0) + +# define BIO_set_nbio(b,n) BIO_ctrl(b,BIO_C_SET_NBIO,(n),NULL) + +/* BIO_s_accept_socket() */ +# define BIO_set_accept_port(b,name) BIO_ctrl(b,BIO_C_SET_ACCEPT,0,(char *)name) +# define BIO_get_accept_port(b) BIO_ptr_ctrl(b,BIO_C_GET_ACCEPT,0) +/* #define BIO_set_nbio(b,n) BIO_ctrl(b,BIO_C_SET_NBIO,(n),NULL) */ +# define BIO_set_nbio_accept(b,n) BIO_ctrl(b,BIO_C_SET_ACCEPT,1,(n)?(void *)"a":NULL) +# define BIO_set_accept_bios(b,bio) BIO_ctrl(b,BIO_C_SET_ACCEPT,2,(char *)bio) + +# define BIO_BIND_NORMAL 0 +# define BIO_BIND_REUSEADDR_IF_UNUSED 1 +# define BIO_BIND_REUSEADDR 2 +# define BIO_set_bind_mode(b,mode) BIO_ctrl(b,BIO_C_SET_BIND_MODE,mode,NULL) +# define BIO_get_bind_mode(b,mode) BIO_ctrl(b,BIO_C_GET_BIND_MODE,0,NULL) + +# define BIO_do_connect(b) BIO_do_handshake(b) +# define BIO_do_accept(b) BIO_do_handshake(b) +# define BIO_do_handshake(b) BIO_ctrl(b,BIO_C_DO_STATE_MACHINE,0,NULL) + +/* BIO_s_proxy_client() */ +# define BIO_set_url(b,url) BIO_ctrl(b,BIO_C_SET_PROXY_PARAM,0,(char *)(url)) +# define BIO_set_proxies(b,p) BIO_ctrl(b,BIO_C_SET_PROXY_PARAM,1,(char *)(p)) +/* BIO_set_nbio(b,n) */ +# define BIO_set_filter_bio(b,s) BIO_ctrl(b,BIO_C_SET_PROXY_PARAM,2,(char *)(s)) +/* BIO *BIO_get_filter_bio(BIO *bio); */ +# define BIO_set_proxy_cb(b,cb) BIO_callback_ctrl(b,BIO_C_SET_PROXY_PARAM,3,(void *(*cb)())) +# define BIO_set_proxy_header(b,sk) BIO_ctrl(b,BIO_C_SET_PROXY_PARAM,4,(char *)sk) +# define BIO_set_no_connect_return(b,bool) BIO_int_ctrl(b,BIO_C_SET_PROXY_PARAM,5,bool) + +# define BIO_get_proxy_header(b,skp) BIO_ctrl(b,BIO_C_GET_PROXY_PARAM,0,(char *)skp) +# define BIO_get_proxies(b,pxy_p) BIO_ctrl(b,BIO_C_GET_PROXY_PARAM,1,(char *)(pxy_p)) +# define BIO_get_url(b,url) BIO_ctrl(b,BIO_C_GET_PROXY_PARAM,2,(char *)(url)) +# define BIO_get_no_connect_return(b) BIO_ctrl(b,BIO_C_GET_PROXY_PARAM,5,NULL) + +# define BIO_set_fd(b,fd,c) BIO_int_ctrl(b,BIO_C_SET_FD,c,fd) +# define BIO_get_fd(b,c) BIO_ctrl(b,BIO_C_GET_FD,0,(char *)c) + +# define BIO_set_fp(b,fp,c) BIO_ctrl(b,BIO_C_SET_FILE_PTR,c,(char *)fp) +# define BIO_get_fp(b,fpp) BIO_ctrl(b,BIO_C_GET_FILE_PTR,0,(char *)fpp) + +# define BIO_seek(b,ofs) (int)BIO_ctrl(b,BIO_C_FILE_SEEK,ofs,NULL) +# define BIO_tell(b) (int)BIO_ctrl(b,BIO_C_FILE_TELL,0,NULL) + +/* + * name is cast to lose const, but might be better to route through a + * function so we can do it safely + */ +# ifdef CONST_STRICT +/* + * If you are wondering why this isn't defined, its because CONST_STRICT is + * purely a compile-time kludge to allow const to be checked. + */ +int BIO_read_filename(BIO *b, const char *name); +# else +# define BIO_read_filename(b,name) BIO_ctrl(b,BIO_C_SET_FILENAME, \ + BIO_CLOSE|BIO_FP_READ,(char *)name) +# endif +# define BIO_write_filename(b,name) BIO_ctrl(b,BIO_C_SET_FILENAME, \ + BIO_CLOSE|BIO_FP_WRITE,name) +# define BIO_append_filename(b,name) BIO_ctrl(b,BIO_C_SET_FILENAME, \ + BIO_CLOSE|BIO_FP_APPEND,name) +# define BIO_rw_filename(b,name) BIO_ctrl(b,BIO_C_SET_FILENAME, \ + BIO_CLOSE|BIO_FP_READ|BIO_FP_WRITE,name) + +/* + * WARNING WARNING, this ups the reference count on the read bio of the SSL + * structure. This is because the ssl read BIO is now pointed to by the + * next_bio field in the bio. So when you free the BIO, make sure you are + * doing a BIO_free_all() to catch the underlying BIO. + */ +# define BIO_set_ssl(b,ssl,c) BIO_ctrl(b,BIO_C_SET_SSL,c,(char *)ssl) +# define BIO_get_ssl(b,sslp) BIO_ctrl(b,BIO_C_GET_SSL,0,(char *)sslp) +# define BIO_set_ssl_mode(b,client) BIO_ctrl(b,BIO_C_SSL_MODE,client,NULL) +# define BIO_set_ssl_renegotiate_bytes(b,num) \ + BIO_ctrl(b,BIO_C_SET_SSL_RENEGOTIATE_BYTES,num,NULL); +# define BIO_get_num_renegotiates(b) \ + BIO_ctrl(b,BIO_C_GET_SSL_NUM_RENEGOTIATES,0,NULL); +# define BIO_set_ssl_renegotiate_timeout(b,seconds) \ + BIO_ctrl(b,BIO_C_SET_SSL_RENEGOTIATE_TIMEOUT,seconds,NULL); + +/* defined in evp.h */ +/* #define BIO_set_md(b,md) BIO_ctrl(b,BIO_C_SET_MD,1,(char *)md) */ + +# define BIO_get_mem_data(b,pp) BIO_ctrl(b,BIO_CTRL_INFO,0,(char *)pp) +# define BIO_set_mem_buf(b,bm,c) BIO_ctrl(b,BIO_C_SET_BUF_MEM,c,(char *)bm) +# define BIO_get_mem_ptr(b,pp) BIO_ctrl(b,BIO_C_GET_BUF_MEM_PTR,0,(char *)pp) +# define BIO_set_mem_eof_return(b,v) \ + BIO_ctrl(b,BIO_C_SET_BUF_MEM_EOF_RETURN,v,NULL) + +/* For the BIO_f_buffer() type */ +# define BIO_get_buffer_num_lines(b) BIO_ctrl(b,BIO_C_GET_BUFF_NUM_LINES,0,NULL) +# define BIO_set_buffer_size(b,size) BIO_ctrl(b,BIO_C_SET_BUFF_SIZE,size,NULL) +# define BIO_set_read_buffer_size(b,size) BIO_int_ctrl(b,BIO_C_SET_BUFF_SIZE,size,0) +# define BIO_set_write_buffer_size(b,size) BIO_int_ctrl(b,BIO_C_SET_BUFF_SIZE,size,1) +# define BIO_set_buffer_read_data(b,buf,num) BIO_ctrl(b,BIO_C_SET_BUFF_READ_DATA,num,buf) + +/* Don't use the next one unless you know what you are doing :-) */ +# define BIO_dup_state(b,ret) BIO_ctrl(b,BIO_CTRL_DUP,0,(char *)(ret)) + +# define BIO_reset(b) (int)BIO_ctrl(b,BIO_CTRL_RESET,0,NULL) +# define BIO_eof(b) (int)BIO_ctrl(b,BIO_CTRL_EOF,0,NULL) +# define BIO_set_close(b,c) (int)BIO_ctrl(b,BIO_CTRL_SET_CLOSE,(c),NULL) +# define BIO_get_close(b) (int)BIO_ctrl(b,BIO_CTRL_GET_CLOSE,0,NULL) +# define BIO_pending(b) (int)BIO_ctrl(b,BIO_CTRL_PENDING,0,NULL) +# define BIO_wpending(b) (int)BIO_ctrl(b,BIO_CTRL_WPENDING,0,NULL) +/* ...pending macros have inappropriate return type */ +size_t BIO_ctrl_pending(BIO *b); +size_t BIO_ctrl_wpending(BIO *b); +# define BIO_flush(b) (int)BIO_ctrl(b,BIO_CTRL_FLUSH,0,NULL) +# define BIO_get_info_callback(b,cbp) (int)BIO_ctrl(b,BIO_CTRL_GET_CALLBACK,0, \ + cbp) +# define BIO_set_info_callback(b,cb) (int)BIO_callback_ctrl(b,BIO_CTRL_SET_CALLBACK,cb) + +/* For the BIO_f_buffer() type */ +# define BIO_buffer_get_num_lines(b) BIO_ctrl(b,BIO_CTRL_GET,0,NULL) + +/* For BIO_s_bio() */ +# define BIO_set_write_buf_size(b,size) (int)BIO_ctrl(b,BIO_C_SET_WRITE_BUF_SIZE,size,NULL) +# define BIO_get_write_buf_size(b,size) (size_t)BIO_ctrl(b,BIO_C_GET_WRITE_BUF_SIZE,size,NULL) +# define BIO_make_bio_pair(b1,b2) (int)BIO_ctrl(b1,BIO_C_MAKE_BIO_PAIR,0,b2) +# define BIO_destroy_bio_pair(b) (int)BIO_ctrl(b,BIO_C_DESTROY_BIO_PAIR,0,NULL) +# define BIO_shutdown_wr(b) (int)BIO_ctrl(b, BIO_C_SHUTDOWN_WR, 0, NULL) +/* macros with inappropriate type -- but ...pending macros use int too: */ +# define BIO_get_write_guarantee(b) (int)BIO_ctrl(b,BIO_C_GET_WRITE_GUARANTEE,0,NULL) +# define BIO_get_read_request(b) (int)BIO_ctrl(b,BIO_C_GET_READ_REQUEST,0,NULL) +size_t BIO_ctrl_get_write_guarantee(BIO *b); +size_t BIO_ctrl_get_read_request(BIO *b); +int BIO_ctrl_reset_read_request(BIO *b); + +/* ctrl macros for dgram */ +# define BIO_ctrl_dgram_connect(b,peer) \ + (int)BIO_ctrl(b,BIO_CTRL_DGRAM_CONNECT,0, (char *)peer) +# define BIO_ctrl_set_connected(b, state, peer) \ + (int)BIO_ctrl(b, BIO_CTRL_DGRAM_SET_CONNECTED, state, (char *)peer) +# define BIO_dgram_recv_timedout(b) \ + (int)BIO_ctrl(b, BIO_CTRL_DGRAM_GET_RECV_TIMER_EXP, 0, NULL) +# define BIO_dgram_send_timedout(b) \ + (int)BIO_ctrl(b, BIO_CTRL_DGRAM_GET_SEND_TIMER_EXP, 0, NULL) +# define BIO_dgram_get_peer(b,peer) \ + (int)BIO_ctrl(b, BIO_CTRL_DGRAM_GET_PEER, 0, (char *)peer) +# define BIO_dgram_set_peer(b,peer) \ + (int)BIO_ctrl(b, BIO_CTRL_DGRAM_SET_PEER, 0, (char *)peer) +# define BIO_dgram_get_mtu_overhead(b) \ + (unsigned int)BIO_ctrl((b), BIO_CTRL_DGRAM_GET_MTU_OVERHEAD, 0, NULL) + +/* These two aren't currently implemented */ +/* int BIO_get_ex_num(BIO *bio); */ +/* void BIO_set_ex_free_func(BIO *bio,int idx,void (*cb)()); */ +int BIO_set_ex_data(BIO *bio, int idx, void *data); +void *BIO_get_ex_data(BIO *bio, int idx); +int BIO_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func); +unsigned long BIO_number_read(BIO *bio); +unsigned long BIO_number_written(BIO *bio); + +/* For BIO_f_asn1() */ +int BIO_asn1_set_prefix(BIO *b, asn1_ps_func *prefix, + asn1_ps_func *prefix_free); +int BIO_asn1_get_prefix(BIO *b, asn1_ps_func **pprefix, + asn1_ps_func **pprefix_free); +int BIO_asn1_set_suffix(BIO *b, asn1_ps_func *suffix, + asn1_ps_func *suffix_free); +int BIO_asn1_get_suffix(BIO *b, asn1_ps_func **psuffix, + asn1_ps_func **psuffix_free); + +# ifndef OPENSSL_NO_FP_API +BIO_METHOD *BIO_s_file(void); +BIO *BIO_new_file(const char *filename, const char *mode); +BIO *BIO_new_fp(FILE *stream, int close_flag); +# define BIO_s_file_internal BIO_s_file +# endif +BIO *BIO_new(BIO_METHOD *type); +int BIO_set(BIO *a, BIO_METHOD *type); +int BIO_free(BIO *a); +void BIO_vfree(BIO *a); +int BIO_read(BIO *b, void *data, int len); +int BIO_gets(BIO *bp, char *buf, int size); +int BIO_write(BIO *b, const void *data, int len); +int BIO_puts(BIO *bp, const char *buf); +int BIO_indent(BIO *b, int indent, int max); +long BIO_ctrl(BIO *bp, int cmd, long larg, void *parg); +long BIO_callback_ctrl(BIO *b, int cmd, + void (*fp) (struct bio_st *, int, const char *, int, + long, long)); +char *BIO_ptr_ctrl(BIO *bp, int cmd, long larg); +long BIO_int_ctrl(BIO *bp, int cmd, long larg, int iarg); +BIO *BIO_push(BIO *b, BIO *append); +BIO *BIO_pop(BIO *b); +void BIO_free_all(BIO *a); +BIO *BIO_find_type(BIO *b, int bio_type); +BIO *BIO_next(BIO *b); +BIO *BIO_get_retry_BIO(BIO *bio, int *reason); +int BIO_get_retry_reason(BIO *bio); +BIO *BIO_dup_chain(BIO *in); + +int BIO_nread0(BIO *bio, char **buf); +int BIO_nread(BIO *bio, char **buf, int num); +int BIO_nwrite0(BIO *bio, char **buf); +int BIO_nwrite(BIO *bio, char **buf, int num); + +long BIO_debug_callback(BIO *bio, int cmd, const char *argp, int argi, + long argl, long ret); + +BIO_METHOD *BIO_s_mem(void); +BIO *BIO_new_mem_buf(void *buf, int len); +BIO_METHOD *BIO_s_socket(void); +BIO_METHOD *BIO_s_connect(void); +BIO_METHOD *BIO_s_accept(void); +BIO_METHOD *BIO_s_fd(void); +# ifndef OPENSSL_SYS_OS2 +BIO_METHOD *BIO_s_log(void); +# endif +BIO_METHOD *BIO_s_bio(void); +BIO_METHOD *BIO_s_null(void); +BIO_METHOD *BIO_f_null(void); +BIO_METHOD *BIO_f_buffer(void); +# ifdef OPENSSL_SYS_VMS +BIO_METHOD *BIO_f_linebuffer(void); +# endif +BIO_METHOD *BIO_f_nbio_test(void); +# ifndef OPENSSL_NO_DGRAM +BIO_METHOD *BIO_s_datagram(void); +# ifndef OPENSSL_NO_SCTP +BIO_METHOD *BIO_s_datagram_sctp(void); +# endif +# endif + +/* BIO_METHOD *BIO_f_ber(void); */ + +int BIO_sock_should_retry(int i); +int BIO_sock_non_fatal_error(int error); +int BIO_dgram_non_fatal_error(int error); + +int BIO_fd_should_retry(int i); +int BIO_fd_non_fatal_error(int error); +int BIO_dump_cb(int (*cb) (const void *data, size_t len, void *u), + void *u, const char *s, int len); +int BIO_dump_indent_cb(int (*cb) (const void *data, size_t len, void *u), + void *u, const char *s, int len, int indent); +int BIO_dump(BIO *b, const char *bytes, int len); +int BIO_dump_indent(BIO *b, const char *bytes, int len, int indent); +# ifndef OPENSSL_NO_FP_API +int BIO_dump_fp(FILE *fp, const char *s, int len); +int BIO_dump_indent_fp(FILE *fp, const char *s, int len, int indent); +# endif +int BIO_hex_string(BIO *out, int indent, int width, unsigned char *data, + int datalen); + +struct hostent *BIO_gethostbyname(const char *name); +/*- + * We might want a thread-safe interface too: + * struct hostent *BIO_gethostbyname_r(const char *name, + * struct hostent *result, void *buffer, size_t buflen); + * or something similar (caller allocates a struct hostent, + * pointed to by "result", and additional buffer space for the various + * substructures; if the buffer does not suffice, NULL is returned + * and an appropriate error code is set). + */ +int BIO_sock_error(int sock); +int BIO_socket_ioctl(int fd, long type, void *arg); +int BIO_socket_nbio(int fd, int mode); +int BIO_get_port(const char *str, unsigned short *port_ptr); +int BIO_get_host_ip(const char *str, unsigned char *ip); +int BIO_get_accept_socket(char *host_port, int mode); +int BIO_accept(int sock, char **ip_port); +int BIO_sock_init(void); +void BIO_sock_cleanup(void); +int BIO_set_tcp_ndelay(int sock, int turn_on); + +BIO *BIO_new_socket(int sock, int close_flag); +BIO *BIO_new_dgram(int fd, int close_flag); +# ifndef OPENSSL_NO_SCTP +BIO *BIO_new_dgram_sctp(int fd, int close_flag); +int BIO_dgram_is_sctp(BIO *bio); +int BIO_dgram_sctp_notification_cb(BIO *b, + void (*handle_notifications) (BIO *bio, + void + *context, + void *buf), + void *context); +int BIO_dgram_sctp_wait_for_dry(BIO *b); +int BIO_dgram_sctp_msg_waiting(BIO *b); +# endif +BIO *BIO_new_fd(int fd, int close_flag); +BIO *BIO_new_connect(const char *host_port); +BIO *BIO_new_accept(const char *host_port); + +int BIO_new_bio_pair(BIO **bio1, size_t writebuf1, + BIO **bio2, size_t writebuf2); +/* + * If successful, returns 1 and in *bio1, *bio2 two BIO pair endpoints. + * Otherwise returns 0 and sets *bio1 and *bio2 to NULL. Size 0 uses default + * value. + */ + +void BIO_copy_next_retry(BIO *b); + +/* + * long BIO_ghbn_ctrl(int cmd,int iarg,char *parg); + */ + +# ifdef __GNUC__ +# define __bio_h__attr__ __attribute__ +# else +# define __bio_h__attr__(x) +# endif +int BIO_printf(BIO *bio, const char *format, ...) +__bio_h__attr__((__format__(__printf__, 2, 3))); +int BIO_vprintf(BIO *bio, const char *format, va_list args) +__bio_h__attr__((__format__(__printf__, 2, 0))); +int BIO_snprintf(char *buf, size_t n, const char *format, ...) +__bio_h__attr__((__format__(__printf__, 3, 4))); +int BIO_vsnprintf(char *buf, size_t n, const char *format, va_list args) +__bio_h__attr__((__format__(__printf__, 3, 0))); +# undef __bio_h__attr__ + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_BIO_strings(void); + +/* Error codes for the BIO functions. */ + +/* Function codes. */ +# define BIO_F_ACPT_STATE 100 +# define BIO_F_BIO_ACCEPT 101 +# define BIO_F_BIO_BER_GET_HEADER 102 +# define BIO_F_BIO_CALLBACK_CTRL 131 +# define BIO_F_BIO_CTRL 103 +# define BIO_F_BIO_GETHOSTBYNAME 120 +# define BIO_F_BIO_GETS 104 +# define BIO_F_BIO_GET_ACCEPT_SOCKET 105 +# define BIO_F_BIO_GET_HOST_IP 106 +# define BIO_F_BIO_GET_PORT 107 +# define BIO_F_BIO_MAKE_PAIR 121 +# define BIO_F_BIO_NEW 108 +# define BIO_F_BIO_NEW_FILE 109 +# define BIO_F_BIO_NEW_MEM_BUF 126 +# define BIO_F_BIO_NREAD 123 +# define BIO_F_BIO_NREAD0 124 +# define BIO_F_BIO_NWRITE 125 +# define BIO_F_BIO_NWRITE0 122 +# define BIO_F_BIO_PUTS 110 +# define BIO_F_BIO_READ 111 +# define BIO_F_BIO_SOCK_INIT 112 +# define BIO_F_BIO_WRITE 113 +# define BIO_F_BUFFER_CTRL 114 +# define BIO_F_CONN_CTRL 127 +# define BIO_F_CONN_STATE 115 +# define BIO_F_DGRAM_SCTP_READ 132 +# define BIO_F_FILE_CTRL 116 +# define BIO_F_FILE_READ 130 +# define BIO_F_LINEBUFFER_CTRL 129 +# define BIO_F_MEM_READ 128 +# define BIO_F_MEM_WRITE 117 +# define BIO_F_SSL_NEW 118 +# define BIO_F_WSASTARTUP 119 + +/* Reason codes. */ +# define BIO_R_ACCEPT_ERROR 100 +# define BIO_R_BAD_FOPEN_MODE 101 +# define BIO_R_BAD_HOSTNAME_LOOKUP 102 +# define BIO_R_BROKEN_PIPE 124 +# define BIO_R_CONNECT_ERROR 103 +# define BIO_R_EOF_ON_MEMORY_BIO 127 +# define BIO_R_ERROR_SETTING_NBIO 104 +# define BIO_R_ERROR_SETTING_NBIO_ON_ACCEPTED_SOCKET 105 +# define BIO_R_ERROR_SETTING_NBIO_ON_ACCEPT_SOCKET 106 +# define BIO_R_GETHOSTBYNAME_ADDR_IS_NOT_AF_INET 107 +# define BIO_R_INVALID_ARGUMENT 125 +# define BIO_R_INVALID_IP_ADDRESS 108 +# define BIO_R_IN_USE 123 +# define BIO_R_KEEPALIVE 109 +# define BIO_R_NBIO_CONNECT_ERROR 110 +# define BIO_R_NO_ACCEPT_PORT_SPECIFIED 111 +# define BIO_R_NO_HOSTNAME_SPECIFIED 112 +# define BIO_R_NO_PORT_DEFINED 113 +# define BIO_R_NO_PORT_SPECIFIED 114 +# define BIO_R_NO_SUCH_FILE 128 +# define BIO_R_NULL_PARAMETER 115 +# define BIO_R_TAG_MISMATCH 116 +# define BIO_R_UNABLE_TO_BIND_SOCKET 117 +# define BIO_R_UNABLE_TO_CREATE_SOCKET 118 +# define BIO_R_UNABLE_TO_LISTEN_SOCKET 119 +# define BIO_R_UNINITIALIZED 120 +# define BIO_R_UNSUPPORTED_METHOD 121 +# define BIO_R_WRITE_TO_READ_ONLY_BIO 126 +# define BIO_R_WSASTARTUP 122 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/ext/openssl-osx/include/openssl/bn.h b/ext/openssl-osx/include/openssl/bn.h new file mode 100644 index 00000000..78709d38 --- /dev/null +++ b/ext/openssl-osx/include/openssl/bn.h @@ -0,0 +1,934 @@ +/* crypto/bn/bn.h */ +/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ +/* ==================================================================== + * Copyright (c) 1998-2006 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +/* ==================================================================== + * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. + * + * Portions of the attached software ("Contribution") are developed by + * SUN MICROSYSTEMS, INC., and are contributed to the OpenSSL project. + * + * The Contribution is licensed pursuant to the Eric Young open source + * license provided above. + * + * The binary polynomial arithmetic software is originally written by + * Sheueling Chang Shantz and Douglas Stebila of Sun Microsystems Laboratories. + * + */ + +#ifndef HEADER_BN_H +# define HEADER_BN_H + +# include +# ifndef OPENSSL_NO_FP_API +# include /* FILE */ +# endif +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * These preprocessor symbols control various aspects of the bignum headers + * and library code. They're not defined by any "normal" configuration, as + * they are intended for development and testing purposes. NB: defining all + * three can be useful for debugging application code as well as openssl + * itself. BN_DEBUG - turn on various debugging alterations to the bignum + * code BN_DEBUG_RAND - uses random poisoning of unused words to trip up + * mismanagement of bignum internals. You must also define BN_DEBUG. + */ +/* #define BN_DEBUG */ +/* #define BN_DEBUG_RAND */ + +# ifndef OPENSSL_SMALL_FOOTPRINT +# define BN_MUL_COMBA +# define BN_SQR_COMBA +# define BN_RECURSION +# endif + +/* + * This next option uses the C libraries (2 word)/(1 word) function. If it is + * not defined, I use my C version (which is slower). The reason for this + * flag is that when the particular C compiler library routine is used, and + * the library is linked with a different compiler, the library is missing. + * This mostly happens when the library is built with gcc and then linked + * using normal cc. This would be a common occurrence because gcc normally + * produces code that is 2 times faster than system compilers for the big + * number stuff. For machines with only one compiler (or shared libraries), + * this should be on. Again this in only really a problem on machines using + * "long long's", are 32bit, and are not using my assembler code. + */ +# if defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_WINDOWS) || \ + defined(OPENSSL_SYS_WIN32) || defined(linux) +# ifndef BN_DIV2W +# define BN_DIV2W +# endif +# endif + +/* + * assuming long is 64bit - this is the DEC Alpha unsigned long long is only + * 64 bits :-(, don't define BN_LLONG for the DEC Alpha + */ +# ifdef SIXTY_FOUR_BIT_LONG +# define BN_ULLONG unsigned long long +# define BN_ULONG unsigned long +# define BN_LONG long +# define BN_BITS 128 +# define BN_BYTES 8 +# define BN_BITS2 64 +# define BN_BITS4 32 +# define BN_MASK (0xffffffffffffffffffffffffffffffffLL) +# define BN_MASK2 (0xffffffffffffffffL) +# define BN_MASK2l (0xffffffffL) +# define BN_MASK2h (0xffffffff00000000L) +# define BN_MASK2h1 (0xffffffff80000000L) +# define BN_TBIT (0x8000000000000000L) +# define BN_DEC_CONV (10000000000000000000UL) +# define BN_DEC_FMT1 "%lu" +# define BN_DEC_FMT2 "%019lu" +# define BN_DEC_NUM 19 +# define BN_HEX_FMT1 "%lX" +# define BN_HEX_FMT2 "%016lX" +# endif + +/* + * This is where the long long data type is 64 bits, but long is 32. For + * machines where there are 64bit registers, this is the mode to use. IRIX, + * on R4000 and above should use this mode, along with the relevant assembler + * code :-). Do NOT define BN_LLONG. + */ +# ifdef SIXTY_FOUR_BIT +# undef BN_LLONG +# undef BN_ULLONG +# define BN_ULONG unsigned long long +# define BN_LONG long long +# define BN_BITS 128 +# define BN_BYTES 8 +# define BN_BITS2 64 +# define BN_BITS4 32 +# define BN_MASK2 (0xffffffffffffffffLL) +# define BN_MASK2l (0xffffffffL) +# define BN_MASK2h (0xffffffff00000000LL) +# define BN_MASK2h1 (0xffffffff80000000LL) +# define BN_TBIT (0x8000000000000000LL) +# define BN_DEC_CONV (10000000000000000000ULL) +# define BN_DEC_FMT1 "%llu" +# define BN_DEC_FMT2 "%019llu" +# define BN_DEC_NUM 19 +# define BN_HEX_FMT1 "%llX" +# define BN_HEX_FMT2 "%016llX" +# endif + +# ifdef THIRTY_TWO_BIT +# ifdef BN_LLONG +# if defined(_WIN32) && !defined(__GNUC__) +# define BN_ULLONG unsigned __int64 +# define BN_MASK (0xffffffffffffffffI64) +# else +# define BN_ULLONG unsigned long long +# define BN_MASK (0xffffffffffffffffLL) +# endif +# endif +# define BN_ULONG unsigned int +# define BN_LONG int +# define BN_BITS 64 +# define BN_BYTES 4 +# define BN_BITS2 32 +# define BN_BITS4 16 +# define BN_MASK2 (0xffffffffL) +# define BN_MASK2l (0xffff) +# define BN_MASK2h1 (0xffff8000L) +# define BN_MASK2h (0xffff0000L) +# define BN_TBIT (0x80000000L) +# define BN_DEC_CONV (1000000000L) +# define BN_DEC_FMT1 "%u" +# define BN_DEC_FMT2 "%09u" +# define BN_DEC_NUM 9 +# define BN_HEX_FMT1 "%X" +# define BN_HEX_FMT2 "%08X" +# endif + +# define BN_DEFAULT_BITS 1280 + +# define BN_FLG_MALLOCED 0x01 +# define BN_FLG_STATIC_DATA 0x02 + +/* + * avoid leaking exponent information through timing, + * BN_mod_exp_mont() will call BN_mod_exp_mont_consttime, + * BN_div() will call BN_div_no_branch, + * BN_mod_inverse() will call BN_mod_inverse_no_branch. + */ +# define BN_FLG_CONSTTIME 0x04 + +# ifdef OPENSSL_NO_DEPRECATED +/* deprecated name for the flag */ +# define BN_FLG_EXP_CONSTTIME BN_FLG_CONSTTIME +/* + * avoid leaking exponent information through timings + * (BN_mod_exp_mont() will call BN_mod_exp_mont_consttime) + */ +# endif + +# ifndef OPENSSL_NO_DEPRECATED +# define BN_FLG_FREE 0x8000 + /* used for debuging */ +# endif +# define BN_set_flags(b,n) ((b)->flags|=(n)) +# define BN_get_flags(b,n) ((b)->flags&(n)) + +/* + * get a clone of a BIGNUM with changed flags, for *temporary* use only (the + * two BIGNUMs cannot not be used in parallel!) + */ +# define BN_with_flags(dest,b,n) ((dest)->d=(b)->d, \ + (dest)->top=(b)->top, \ + (dest)->dmax=(b)->dmax, \ + (dest)->neg=(b)->neg, \ + (dest)->flags=(((dest)->flags & BN_FLG_MALLOCED) \ + | ((b)->flags & ~BN_FLG_MALLOCED) \ + | BN_FLG_STATIC_DATA \ + | (n))) + +/* Already declared in ossl_typ.h */ +# if 0 +typedef struct bignum_st BIGNUM; +/* Used for temp variables (declaration hidden in bn_lcl.h) */ +typedef struct bignum_ctx BN_CTX; +typedef struct bn_blinding_st BN_BLINDING; +typedef struct bn_mont_ctx_st BN_MONT_CTX; +typedef struct bn_recp_ctx_st BN_RECP_CTX; +typedef struct bn_gencb_st BN_GENCB; +# endif + +struct bignum_st { + BN_ULONG *d; /* Pointer to an array of 'BN_BITS2' bit + * chunks. */ + int top; /* Index of last used d +1. */ + /* The next are internal book keeping for bn_expand. */ + int dmax; /* Size of the d array. */ + int neg; /* one if the number is negative */ + int flags; +}; + +/* Used for montgomery multiplication */ +struct bn_mont_ctx_st { + int ri; /* number of bits in R */ + BIGNUM RR; /* used to convert to montgomery form */ + BIGNUM N; /* The modulus */ + BIGNUM Ni; /* R*(1/R mod N) - N*Ni = 1 (Ni is only + * stored for bignum algorithm) */ + BN_ULONG n0[2]; /* least significant word(s) of Ni; (type + * changed with 0.9.9, was "BN_ULONG n0;" + * before) */ + int flags; +}; + +/* + * Used for reciprocal division/mod functions It cannot be shared between + * threads + */ +struct bn_recp_ctx_st { + BIGNUM N; /* the divisor */ + BIGNUM Nr; /* the reciprocal */ + int num_bits; + int shift; + int flags; +}; + +/* Used for slow "generation" functions. */ +struct bn_gencb_st { + unsigned int ver; /* To handle binary (in)compatibility */ + void *arg; /* callback-specific data */ + union { + /* if(ver==1) - handles old style callbacks */ + void (*cb_1) (int, int, void *); + /* if(ver==2) - new callback style */ + int (*cb_2) (int, int, BN_GENCB *); + } cb; +}; +/* Wrapper function to make using BN_GENCB easier, */ +int BN_GENCB_call(BN_GENCB *cb, int a, int b); +/* Macro to populate a BN_GENCB structure with an "old"-style callback */ +# define BN_GENCB_set_old(gencb, callback, cb_arg) { \ + BN_GENCB *tmp_gencb = (gencb); \ + tmp_gencb->ver = 1; \ + tmp_gencb->arg = (cb_arg); \ + tmp_gencb->cb.cb_1 = (callback); } +/* Macro to populate a BN_GENCB structure with a "new"-style callback */ +# define BN_GENCB_set(gencb, callback, cb_arg) { \ + BN_GENCB *tmp_gencb = (gencb); \ + tmp_gencb->ver = 2; \ + tmp_gencb->arg = (cb_arg); \ + tmp_gencb->cb.cb_2 = (callback); } + +# define BN_prime_checks 0 /* default: select number of iterations based + * on the size of the number */ + +/* + * number of Miller-Rabin iterations for an error rate of less than 2^-80 for + * random 'b'-bit input, b >= 100 (taken from table 4.4 in the Handbook of + * Applied Cryptography [Menezes, van Oorschot, Vanstone; CRC Press 1996]; + * original paper: Damgaard, Landrock, Pomerance: Average case error + * estimates for the strong probable prime test. -- Math. Comp. 61 (1993) + * 177-194) + */ +# define BN_prime_checks_for_size(b) ((b) >= 1300 ? 2 : \ + (b) >= 850 ? 3 : \ + (b) >= 650 ? 4 : \ + (b) >= 550 ? 5 : \ + (b) >= 450 ? 6 : \ + (b) >= 400 ? 7 : \ + (b) >= 350 ? 8 : \ + (b) >= 300 ? 9 : \ + (b) >= 250 ? 12 : \ + (b) >= 200 ? 15 : \ + (b) >= 150 ? 18 : \ + /* b >= 100 */ 27) + +# define BN_num_bytes(a) ((BN_num_bits(a)+7)/8) + +/* Note that BN_abs_is_word didn't work reliably for w == 0 until 0.9.8 */ +# define BN_abs_is_word(a,w) ((((a)->top == 1) && ((a)->d[0] == (BN_ULONG)(w))) || \ + (((w) == 0) && ((a)->top == 0))) +# define BN_is_zero(a) ((a)->top == 0) +# define BN_is_one(a) (BN_abs_is_word((a),1) && !(a)->neg) +# define BN_is_word(a,w) (BN_abs_is_word((a),(w)) && (!(w) || !(a)->neg)) +# define BN_is_odd(a) (((a)->top > 0) && ((a)->d[0] & 1)) + +# define BN_one(a) (BN_set_word((a),1)) +# define BN_zero_ex(a) \ + do { \ + BIGNUM *_tmp_bn = (a); \ + _tmp_bn->top = 0; \ + _tmp_bn->neg = 0; \ + } while(0) +# ifdef OPENSSL_NO_DEPRECATED +# define BN_zero(a) BN_zero_ex(a) +# else +# define BN_zero(a) (BN_set_word((a),0)) +# endif + +const BIGNUM *BN_value_one(void); +char *BN_options(void); +BN_CTX *BN_CTX_new(void); +# ifndef OPENSSL_NO_DEPRECATED +void BN_CTX_init(BN_CTX *c); +# endif +void BN_CTX_free(BN_CTX *c); +void BN_CTX_start(BN_CTX *ctx); +BIGNUM *BN_CTX_get(BN_CTX *ctx); +void BN_CTX_end(BN_CTX *ctx); +int BN_rand(BIGNUM *rnd, int bits, int top, int bottom); +int BN_pseudo_rand(BIGNUM *rnd, int bits, int top, int bottom); +int BN_rand_range(BIGNUM *rnd, const BIGNUM *range); +int BN_pseudo_rand_range(BIGNUM *rnd, const BIGNUM *range); +int BN_num_bits(const BIGNUM *a); +int BN_num_bits_word(BN_ULONG); +BIGNUM *BN_new(void); +void BN_init(BIGNUM *); +void BN_clear_free(BIGNUM *a); +BIGNUM *BN_copy(BIGNUM *a, const BIGNUM *b); +void BN_swap(BIGNUM *a, BIGNUM *b); +BIGNUM *BN_bin2bn(const unsigned char *s, int len, BIGNUM *ret); +int BN_bn2bin(const BIGNUM *a, unsigned char *to); +BIGNUM *BN_mpi2bn(const unsigned char *s, int len, BIGNUM *ret); +int BN_bn2mpi(const BIGNUM *a, unsigned char *to); +int BN_sub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b); +int BN_usub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b); +int BN_uadd(BIGNUM *r, const BIGNUM *a, const BIGNUM *b); +int BN_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b); +int BN_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx); +int BN_sqr(BIGNUM *r, const BIGNUM *a, BN_CTX *ctx); +/** BN_set_negative sets sign of a BIGNUM + * \param b pointer to the BIGNUM object + * \param n 0 if the BIGNUM b should be positive and a value != 0 otherwise + */ +void BN_set_negative(BIGNUM *b, int n); +/** BN_is_negative returns 1 if the BIGNUM is negative + * \param a pointer to the BIGNUM object + * \return 1 if a < 0 and 0 otherwise + */ +# define BN_is_negative(a) ((a)->neg != 0) + +int BN_div(BIGNUM *dv, BIGNUM *rem, const BIGNUM *m, const BIGNUM *d, + BN_CTX *ctx); +# define BN_mod(rem,m,d,ctx) BN_div(NULL,(rem),(m),(d),(ctx)) +int BN_nnmod(BIGNUM *r, const BIGNUM *m, const BIGNUM *d, BN_CTX *ctx); +int BN_mod_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m, + BN_CTX *ctx); +int BN_mod_add_quick(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + const BIGNUM *m); +int BN_mod_sub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m, + BN_CTX *ctx); +int BN_mod_sub_quick(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + const BIGNUM *m); +int BN_mod_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m, + BN_CTX *ctx); +int BN_mod_sqr(BIGNUM *r, const BIGNUM *a, const BIGNUM *m, BN_CTX *ctx); +int BN_mod_lshift1(BIGNUM *r, const BIGNUM *a, const BIGNUM *m, BN_CTX *ctx); +int BN_mod_lshift1_quick(BIGNUM *r, const BIGNUM *a, const BIGNUM *m); +int BN_mod_lshift(BIGNUM *r, const BIGNUM *a, int n, const BIGNUM *m, + BN_CTX *ctx); +int BN_mod_lshift_quick(BIGNUM *r, const BIGNUM *a, int n, const BIGNUM *m); + +BN_ULONG BN_mod_word(const BIGNUM *a, BN_ULONG w); +BN_ULONG BN_div_word(BIGNUM *a, BN_ULONG w); +int BN_mul_word(BIGNUM *a, BN_ULONG w); +int BN_add_word(BIGNUM *a, BN_ULONG w); +int BN_sub_word(BIGNUM *a, BN_ULONG w); +int BN_set_word(BIGNUM *a, BN_ULONG w); +BN_ULONG BN_get_word(const BIGNUM *a); + +int BN_cmp(const BIGNUM *a, const BIGNUM *b); +void BN_free(BIGNUM *a); +int BN_is_bit_set(const BIGNUM *a, int n); +int BN_lshift(BIGNUM *r, const BIGNUM *a, int n); +int BN_lshift1(BIGNUM *r, const BIGNUM *a); +int BN_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx); + +int BN_mod_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, + const BIGNUM *m, BN_CTX *ctx); +int BN_mod_exp_mont(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, + const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx); +int BN_mod_exp_mont_consttime(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p, + const BIGNUM *m, BN_CTX *ctx, + BN_MONT_CTX *in_mont); +int BN_mod_exp_mont_word(BIGNUM *r, BN_ULONG a, const BIGNUM *p, + const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx); +int BN_mod_exp2_mont(BIGNUM *r, const BIGNUM *a1, const BIGNUM *p1, + const BIGNUM *a2, const BIGNUM *p2, const BIGNUM *m, + BN_CTX *ctx, BN_MONT_CTX *m_ctx); +int BN_mod_exp_simple(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, + const BIGNUM *m, BN_CTX *ctx); + +int BN_mask_bits(BIGNUM *a, int n); +# ifndef OPENSSL_NO_FP_API +int BN_print_fp(FILE *fp, const BIGNUM *a); +# endif +# ifdef HEADER_BIO_H +int BN_print(BIO *fp, const BIGNUM *a); +# else +int BN_print(void *fp, const BIGNUM *a); +# endif +int BN_reciprocal(BIGNUM *r, const BIGNUM *m, int len, BN_CTX *ctx); +int BN_rshift(BIGNUM *r, const BIGNUM *a, int n); +int BN_rshift1(BIGNUM *r, const BIGNUM *a); +void BN_clear(BIGNUM *a); +BIGNUM *BN_dup(const BIGNUM *a); +int BN_ucmp(const BIGNUM *a, const BIGNUM *b); +int BN_set_bit(BIGNUM *a, int n); +int BN_clear_bit(BIGNUM *a, int n); +char *BN_bn2hex(const BIGNUM *a); +char *BN_bn2dec(const BIGNUM *a); +int BN_hex2bn(BIGNUM **a, const char *str); +int BN_dec2bn(BIGNUM **a, const char *str); +int BN_asc2bn(BIGNUM **a, const char *str); +int BN_gcd(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx); +int BN_kronecker(const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx); /* returns + * -2 for + * error */ +BIGNUM *BN_mod_inverse(BIGNUM *ret, + const BIGNUM *a, const BIGNUM *n, BN_CTX *ctx); +BIGNUM *BN_mod_sqrt(BIGNUM *ret, + const BIGNUM *a, const BIGNUM *n, BN_CTX *ctx); + +void BN_consttime_swap(BN_ULONG swap, BIGNUM *a, BIGNUM *b, int nwords); + +/* Deprecated versions */ +# ifndef OPENSSL_NO_DEPRECATED +BIGNUM *BN_generate_prime(BIGNUM *ret, int bits, int safe, + const BIGNUM *add, const BIGNUM *rem, + void (*callback) (int, int, void *), void *cb_arg); +int BN_is_prime(const BIGNUM *p, int nchecks, + void (*callback) (int, int, void *), + BN_CTX *ctx, void *cb_arg); +int BN_is_prime_fasttest(const BIGNUM *p, int nchecks, + void (*callback) (int, int, void *), BN_CTX *ctx, + void *cb_arg, int do_trial_division); +# endif /* !defined(OPENSSL_NO_DEPRECATED) */ + +/* Newer versions */ +int BN_generate_prime_ex(BIGNUM *ret, int bits, int safe, const BIGNUM *add, + const BIGNUM *rem, BN_GENCB *cb); +int BN_is_prime_ex(const BIGNUM *p, int nchecks, BN_CTX *ctx, BN_GENCB *cb); +int BN_is_prime_fasttest_ex(const BIGNUM *p, int nchecks, BN_CTX *ctx, + int do_trial_division, BN_GENCB *cb); + +int BN_X931_generate_Xpq(BIGNUM *Xp, BIGNUM *Xq, int nbits, BN_CTX *ctx); + +int BN_X931_derive_prime_ex(BIGNUM *p, BIGNUM *p1, BIGNUM *p2, + const BIGNUM *Xp, const BIGNUM *Xp1, + const BIGNUM *Xp2, const BIGNUM *e, BN_CTX *ctx, + BN_GENCB *cb); +int BN_X931_generate_prime_ex(BIGNUM *p, BIGNUM *p1, BIGNUM *p2, BIGNUM *Xp1, + BIGNUM *Xp2, const BIGNUM *Xp, const BIGNUM *e, + BN_CTX *ctx, BN_GENCB *cb); + +BN_MONT_CTX *BN_MONT_CTX_new(void); +void BN_MONT_CTX_init(BN_MONT_CTX *ctx); +int BN_mod_mul_montgomery(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + BN_MONT_CTX *mont, BN_CTX *ctx); +# define BN_to_montgomery(r,a,mont,ctx) BN_mod_mul_montgomery(\ + (r),(a),&((mont)->RR),(mont),(ctx)) +int BN_from_montgomery(BIGNUM *r, const BIGNUM *a, + BN_MONT_CTX *mont, BN_CTX *ctx); +void BN_MONT_CTX_free(BN_MONT_CTX *mont); +int BN_MONT_CTX_set(BN_MONT_CTX *mont, const BIGNUM *mod, BN_CTX *ctx); +BN_MONT_CTX *BN_MONT_CTX_copy(BN_MONT_CTX *to, BN_MONT_CTX *from); +BN_MONT_CTX *BN_MONT_CTX_set_locked(BN_MONT_CTX **pmont, int lock, + const BIGNUM *mod, BN_CTX *ctx); + +/* BN_BLINDING flags */ +# define BN_BLINDING_NO_UPDATE 0x00000001 +# define BN_BLINDING_NO_RECREATE 0x00000002 + +BN_BLINDING *BN_BLINDING_new(const BIGNUM *A, const BIGNUM *Ai, BIGNUM *mod); +void BN_BLINDING_free(BN_BLINDING *b); +int BN_BLINDING_update(BN_BLINDING *b, BN_CTX *ctx); +int BN_BLINDING_convert(BIGNUM *n, BN_BLINDING *b, BN_CTX *ctx); +int BN_BLINDING_invert(BIGNUM *n, BN_BLINDING *b, BN_CTX *ctx); +int BN_BLINDING_convert_ex(BIGNUM *n, BIGNUM *r, BN_BLINDING *b, BN_CTX *); +int BN_BLINDING_invert_ex(BIGNUM *n, const BIGNUM *r, BN_BLINDING *b, + BN_CTX *); +# ifndef OPENSSL_NO_DEPRECATED +unsigned long BN_BLINDING_get_thread_id(const BN_BLINDING *); +void BN_BLINDING_set_thread_id(BN_BLINDING *, unsigned long); +# endif +CRYPTO_THREADID *BN_BLINDING_thread_id(BN_BLINDING *); +unsigned long BN_BLINDING_get_flags(const BN_BLINDING *); +void BN_BLINDING_set_flags(BN_BLINDING *, unsigned long); +BN_BLINDING *BN_BLINDING_create_param(BN_BLINDING *b, + const BIGNUM *e, BIGNUM *m, BN_CTX *ctx, + int (*bn_mod_exp) (BIGNUM *r, + const BIGNUM *a, + const BIGNUM *p, + const BIGNUM *m, + BN_CTX *ctx, + BN_MONT_CTX *m_ctx), + BN_MONT_CTX *m_ctx); + +# ifndef OPENSSL_NO_DEPRECATED +void BN_set_params(int mul, int high, int low, int mont); +int BN_get_params(int which); /* 0, mul, 1 high, 2 low, 3 mont */ +# endif + +void BN_RECP_CTX_init(BN_RECP_CTX *recp); +BN_RECP_CTX *BN_RECP_CTX_new(void); +void BN_RECP_CTX_free(BN_RECP_CTX *recp); +int BN_RECP_CTX_set(BN_RECP_CTX *recp, const BIGNUM *rdiv, BN_CTX *ctx); +int BN_mod_mul_reciprocal(BIGNUM *r, const BIGNUM *x, const BIGNUM *y, + BN_RECP_CTX *recp, BN_CTX *ctx); +int BN_mod_exp_recp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, + const BIGNUM *m, BN_CTX *ctx); +int BN_div_recp(BIGNUM *dv, BIGNUM *rem, const BIGNUM *m, + BN_RECP_CTX *recp, BN_CTX *ctx); + +# ifndef OPENSSL_NO_EC2M + +/* + * Functions for arithmetic over binary polynomials represented by BIGNUMs. + * The BIGNUM::neg property of BIGNUMs representing binary polynomials is + * ignored. Note that input arguments are not const so that their bit arrays + * can be expanded to the appropriate size if needed. + */ + +/* + * r = a + b + */ +int BN_GF2m_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b); +# define BN_GF2m_sub(r, a, b) BN_GF2m_add(r, a, b) +/* + * r=a mod p + */ +int BN_GF2m_mod(BIGNUM *r, const BIGNUM *a, const BIGNUM *p); +/* r = (a * b) mod p */ +int BN_GF2m_mod_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + const BIGNUM *p, BN_CTX *ctx); +/* r = (a * a) mod p */ +int BN_GF2m_mod_sqr(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx); +/* r = (1 / b) mod p */ +int BN_GF2m_mod_inv(BIGNUM *r, const BIGNUM *b, const BIGNUM *p, BN_CTX *ctx); +/* r = (a / b) mod p */ +int BN_GF2m_mod_div(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + const BIGNUM *p, BN_CTX *ctx); +/* r = (a ^ b) mod p */ +int BN_GF2m_mod_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + const BIGNUM *p, BN_CTX *ctx); +/* r = sqrt(a) mod p */ +int BN_GF2m_mod_sqrt(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, + BN_CTX *ctx); +/* r^2 + r = a mod p */ +int BN_GF2m_mod_solve_quad(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, + BN_CTX *ctx); +# define BN_GF2m_cmp(a, b) BN_ucmp((a), (b)) +/*- + * Some functions allow for representation of the irreducible polynomials + * as an unsigned int[], say p. The irreducible f(t) is then of the form: + * t^p[0] + t^p[1] + ... + t^p[k] + * where m = p[0] > p[1] > ... > p[k] = 0. + */ +/* r = a mod p */ +int BN_GF2m_mod_arr(BIGNUM *r, const BIGNUM *a, const int p[]); +/* r = (a * b) mod p */ +int BN_GF2m_mod_mul_arr(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + const int p[], BN_CTX *ctx); +/* r = (a * a) mod p */ +int BN_GF2m_mod_sqr_arr(BIGNUM *r, const BIGNUM *a, const int p[], + BN_CTX *ctx); +/* r = (1 / b) mod p */ +int BN_GF2m_mod_inv_arr(BIGNUM *r, const BIGNUM *b, const int p[], + BN_CTX *ctx); +/* r = (a / b) mod p */ +int BN_GF2m_mod_div_arr(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + const int p[], BN_CTX *ctx); +/* r = (a ^ b) mod p */ +int BN_GF2m_mod_exp_arr(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + const int p[], BN_CTX *ctx); +/* r = sqrt(a) mod p */ +int BN_GF2m_mod_sqrt_arr(BIGNUM *r, const BIGNUM *a, + const int p[], BN_CTX *ctx); +/* r^2 + r = a mod p */ +int BN_GF2m_mod_solve_quad_arr(BIGNUM *r, const BIGNUM *a, + const int p[], BN_CTX *ctx); +int BN_GF2m_poly2arr(const BIGNUM *a, int p[], int max); +int BN_GF2m_arr2poly(const int p[], BIGNUM *a); + +# endif + +/* + * faster mod functions for the 'NIST primes' 0 <= a < p^2 + */ +int BN_nist_mod_192(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx); +int BN_nist_mod_224(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx); +int BN_nist_mod_256(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx); +int BN_nist_mod_384(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx); +int BN_nist_mod_521(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx); + +const BIGNUM *BN_get0_nist_prime_192(void); +const BIGNUM *BN_get0_nist_prime_224(void); +const BIGNUM *BN_get0_nist_prime_256(void); +const BIGNUM *BN_get0_nist_prime_384(void); +const BIGNUM *BN_get0_nist_prime_521(void); + +/* library internal functions */ + +# define bn_expand(a,bits) ((((((bits+BN_BITS2-1))/BN_BITS2)) <= (a)->dmax)?\ + (a):bn_expand2((a),(bits+BN_BITS2-1)/BN_BITS2)) +# define bn_wexpand(a,words) (((words) <= (a)->dmax)?(a):bn_expand2((a),(words))) +BIGNUM *bn_expand2(BIGNUM *a, int words); +# ifndef OPENSSL_NO_DEPRECATED +BIGNUM *bn_dup_expand(const BIGNUM *a, int words); /* unused */ +# endif + +/*- + * Bignum consistency macros + * There is one "API" macro, bn_fix_top(), for stripping leading zeroes from + * bignum data after direct manipulations on the data. There is also an + * "internal" macro, bn_check_top(), for verifying that there are no leading + * zeroes. Unfortunately, some auditing is required due to the fact that + * bn_fix_top() has become an overabused duct-tape because bignum data is + * occasionally passed around in an inconsistent state. So the following + * changes have been made to sort this out; + * - bn_fix_top()s implementation has been moved to bn_correct_top() + * - if BN_DEBUG isn't defined, bn_fix_top() maps to bn_correct_top(), and + * bn_check_top() is as before. + * - if BN_DEBUG *is* defined; + * - bn_check_top() tries to pollute unused words even if the bignum 'top' is + * consistent. (ed: only if BN_DEBUG_RAND is defined) + * - bn_fix_top() maps to bn_check_top() rather than "fixing" anything. + * The idea is to have debug builds flag up inconsistent bignums when they + * occur. If that occurs in a bn_fix_top(), we examine the code in question; if + * the use of bn_fix_top() was appropriate (ie. it follows directly after code + * that manipulates the bignum) it is converted to bn_correct_top(), and if it + * was not appropriate, we convert it permanently to bn_check_top() and track + * down the cause of the bug. Eventually, no internal code should be using the + * bn_fix_top() macro. External applications and libraries should try this with + * their own code too, both in terms of building against the openssl headers + * with BN_DEBUG defined *and* linking with a version of OpenSSL built with it + * defined. This not only improves external code, it provides more test + * coverage for openssl's own code. + */ + +# ifdef BN_DEBUG + +/* We only need assert() when debugging */ +# include + +# ifdef BN_DEBUG_RAND +/* To avoid "make update" cvs wars due to BN_DEBUG, use some tricks */ +# ifndef RAND_pseudo_bytes +int RAND_pseudo_bytes(unsigned char *buf, int num); +# define BN_DEBUG_TRIX +# endif +# define bn_pollute(a) \ + do { \ + const BIGNUM *_bnum1 = (a); \ + if(_bnum1->top < _bnum1->dmax) { \ + unsigned char _tmp_char; \ + /* We cast away const without the compiler knowing, any \ + * *genuinely* constant variables that aren't mutable \ + * wouldn't be constructed with top!=dmax. */ \ + BN_ULONG *_not_const; \ + memcpy(&_not_const, &_bnum1->d, sizeof(BN_ULONG*)); \ + RAND_pseudo_bytes(&_tmp_char, 1); \ + memset((unsigned char *)(_not_const + _bnum1->top), _tmp_char, \ + (_bnum1->dmax - _bnum1->top) * sizeof(BN_ULONG)); \ + } \ + } while(0) +# ifdef BN_DEBUG_TRIX +# undef RAND_pseudo_bytes +# endif +# else +# define bn_pollute(a) +# endif +# define bn_check_top(a) \ + do { \ + const BIGNUM *_bnum2 = (a); \ + if (_bnum2 != NULL) { \ + assert((_bnum2->top == 0) || \ + (_bnum2->d[_bnum2->top - 1] != 0)); \ + bn_pollute(_bnum2); \ + } \ + } while(0) + +# define bn_fix_top(a) bn_check_top(a) + +# define bn_check_size(bn, bits) bn_wcheck_size(bn, ((bits+BN_BITS2-1))/BN_BITS2) +# define bn_wcheck_size(bn, words) \ + do { \ + const BIGNUM *_bnum2 = (bn); \ + assert((words) <= (_bnum2)->dmax && (words) >= (_bnum2)->top); \ + /* avoid unused variable warning with NDEBUG */ \ + (void)(_bnum2); \ + } while(0) + +# else /* !BN_DEBUG */ + +# define bn_pollute(a) +# define bn_check_top(a) +# define bn_fix_top(a) bn_correct_top(a) +# define bn_check_size(bn, bits) +# define bn_wcheck_size(bn, words) + +# endif + +# define bn_correct_top(a) \ + { \ + BN_ULONG *ftl; \ + int tmp_top = (a)->top; \ + if (tmp_top > 0) \ + { \ + for (ftl= &((a)->d[tmp_top-1]); tmp_top > 0; tmp_top--) \ + if (*(ftl--)) break; \ + (a)->top = tmp_top; \ + } \ + bn_pollute(a); \ + } + +BN_ULONG bn_mul_add_words(BN_ULONG *rp, const BN_ULONG *ap, int num, + BN_ULONG w); +BN_ULONG bn_mul_words(BN_ULONG *rp, const BN_ULONG *ap, int num, BN_ULONG w); +void bn_sqr_words(BN_ULONG *rp, const BN_ULONG *ap, int num); +BN_ULONG bn_div_words(BN_ULONG h, BN_ULONG l, BN_ULONG d); +BN_ULONG bn_add_words(BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp, + int num); +BN_ULONG bn_sub_words(BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp, + int num); + +/* Primes from RFC 2409 */ +BIGNUM *get_rfc2409_prime_768(BIGNUM *bn); +BIGNUM *get_rfc2409_prime_1024(BIGNUM *bn); + +/* Primes from RFC 3526 */ +BIGNUM *get_rfc3526_prime_1536(BIGNUM *bn); +BIGNUM *get_rfc3526_prime_2048(BIGNUM *bn); +BIGNUM *get_rfc3526_prime_3072(BIGNUM *bn); +BIGNUM *get_rfc3526_prime_4096(BIGNUM *bn); +BIGNUM *get_rfc3526_prime_6144(BIGNUM *bn); +BIGNUM *get_rfc3526_prime_8192(BIGNUM *bn); + +int BN_bntest_rand(BIGNUM *rnd, int bits, int top, int bottom); + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_BN_strings(void); + +/* Error codes for the BN functions. */ + +/* Function codes. */ +# define BN_F_BNRAND 127 +# define BN_F_BN_BLINDING_CONVERT_EX 100 +# define BN_F_BN_BLINDING_CREATE_PARAM 128 +# define BN_F_BN_BLINDING_INVERT_EX 101 +# define BN_F_BN_BLINDING_NEW 102 +# define BN_F_BN_BLINDING_UPDATE 103 +# define BN_F_BN_BN2DEC 104 +# define BN_F_BN_BN2HEX 105 +# define BN_F_BN_CTX_GET 116 +# define BN_F_BN_CTX_NEW 106 +# define BN_F_BN_CTX_START 129 +# define BN_F_BN_DIV 107 +# define BN_F_BN_DIV_NO_BRANCH 138 +# define BN_F_BN_DIV_RECP 130 +# define BN_F_BN_EXP 123 +# define BN_F_BN_EXPAND2 108 +# define BN_F_BN_EXPAND_INTERNAL 120 +# define BN_F_BN_GF2M_MOD 131 +# define BN_F_BN_GF2M_MOD_EXP 132 +# define BN_F_BN_GF2M_MOD_MUL 133 +# define BN_F_BN_GF2M_MOD_SOLVE_QUAD 134 +# define BN_F_BN_GF2M_MOD_SOLVE_QUAD_ARR 135 +# define BN_F_BN_GF2M_MOD_SQR 136 +# define BN_F_BN_GF2M_MOD_SQRT 137 +# define BN_F_BN_MOD_EXP2_MONT 118 +# define BN_F_BN_MOD_EXP_MONT 109 +# define BN_F_BN_MOD_EXP_MONT_CONSTTIME 124 +# define BN_F_BN_MOD_EXP_MONT_WORD 117 +# define BN_F_BN_MOD_EXP_RECP 125 +# define BN_F_BN_MOD_EXP_SIMPLE 126 +# define BN_F_BN_MOD_INVERSE 110 +# define BN_F_BN_MOD_INVERSE_NO_BRANCH 139 +# define BN_F_BN_MOD_LSHIFT_QUICK 119 +# define BN_F_BN_MOD_MUL_RECIPROCAL 111 +# define BN_F_BN_MOD_SQRT 121 +# define BN_F_BN_MPI2BN 112 +# define BN_F_BN_NEW 113 +# define BN_F_BN_RAND 114 +# define BN_F_BN_RAND_RANGE 122 +# define BN_F_BN_USUB 115 + +/* Reason codes. */ +# define BN_R_ARG2_LT_ARG3 100 +# define BN_R_BAD_RECIPROCAL 101 +# define BN_R_BIGNUM_TOO_LONG 114 +# define BN_R_CALLED_WITH_EVEN_MODULUS 102 +# define BN_R_DIV_BY_ZERO 103 +# define BN_R_ENCODING_ERROR 104 +# define BN_R_EXPAND_ON_STATIC_BIGNUM_DATA 105 +# define BN_R_INPUT_NOT_REDUCED 110 +# define BN_R_INVALID_LENGTH 106 +# define BN_R_INVALID_RANGE 115 +# define BN_R_NOT_A_SQUARE 111 +# define BN_R_NOT_INITIALIZED 107 +# define BN_R_NO_INVERSE 108 +# define BN_R_NO_SOLUTION 116 +# define BN_R_P_IS_NOT_PRIME 112 +# define BN_R_TOO_MANY_ITERATIONS 113 +# define BN_R_TOO_MANY_TEMPORARY_VARIABLES 109 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/ext/openssl-osx/include/openssl/buffer.h b/ext/openssl-osx/include/openssl/buffer.h new file mode 100644 index 00000000..c343dd77 --- /dev/null +++ b/ext/openssl-osx/include/openssl/buffer.h @@ -0,0 +1,119 @@ +/* crypto/buffer/buffer.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_BUFFER_H +# define HEADER_BUFFER_H + +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# include + +# if !defined(NO_SYS_TYPES_H) +# include +# endif + +/* Already declared in ossl_typ.h */ +/* typedef struct buf_mem_st BUF_MEM; */ + +struct buf_mem_st { + size_t length; /* current number of bytes */ + char *data; + size_t max; /* size of buffer */ +}; + +BUF_MEM *BUF_MEM_new(void); +void BUF_MEM_free(BUF_MEM *a); +int BUF_MEM_grow(BUF_MEM *str, size_t len); +int BUF_MEM_grow_clean(BUF_MEM *str, size_t len); +size_t BUF_strnlen(const char *str, size_t maxlen); +char *BUF_strdup(const char *str); +char *BUF_strndup(const char *str, size_t siz); +void *BUF_memdup(const void *data, size_t siz); +void BUF_reverse(unsigned char *out, const unsigned char *in, size_t siz); + +/* safe string functions */ +size_t BUF_strlcpy(char *dst, const char *src, size_t siz); +size_t BUF_strlcat(char *dst, const char *src, size_t siz); + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_BUF_strings(void); + +/* Error codes for the BUF functions. */ + +/* Function codes. */ +# define BUF_F_BUF_MEMDUP 103 +# define BUF_F_BUF_MEM_GROW 100 +# define BUF_F_BUF_MEM_GROW_CLEAN 105 +# define BUF_F_BUF_MEM_NEW 101 +# define BUF_F_BUF_STRDUP 102 +# define BUF_F_BUF_STRNDUP 104 + +/* Reason codes. */ + +#ifdef __cplusplus +} +#endif +#endif diff --git a/ext/openssl-osx/include/openssl/comp.h b/ext/openssl-osx/include/openssl/comp.h new file mode 100644 index 00000000..406c428a --- /dev/null +++ b/ext/openssl-osx/include/openssl/comp.h @@ -0,0 +1,79 @@ + +#ifndef HEADER_COMP_H +# define HEADER_COMP_H + +# include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct comp_ctx_st COMP_CTX; + +typedef struct comp_method_st { + int type; /* NID for compression library */ + const char *name; /* A text string to identify the library */ + int (*init) (COMP_CTX *ctx); + void (*finish) (COMP_CTX *ctx); + int (*compress) (COMP_CTX *ctx, + unsigned char *out, unsigned int olen, + unsigned char *in, unsigned int ilen); + int (*expand) (COMP_CTX *ctx, + unsigned char *out, unsigned int olen, + unsigned char *in, unsigned int ilen); + /* + * The following two do NOTHING, but are kept for backward compatibility + */ + long (*ctrl) (void); + long (*callback_ctrl) (void); +} COMP_METHOD; + +struct comp_ctx_st { + COMP_METHOD *meth; + unsigned long compress_in; + unsigned long compress_out; + unsigned long expand_in; + unsigned long expand_out; + CRYPTO_EX_DATA ex_data; +}; + +COMP_CTX *COMP_CTX_new(COMP_METHOD *meth); +void COMP_CTX_free(COMP_CTX *ctx); +int COMP_compress_block(COMP_CTX *ctx, unsigned char *out, int olen, + unsigned char *in, int ilen); +int COMP_expand_block(COMP_CTX *ctx, unsigned char *out, int olen, + unsigned char *in, int ilen); +COMP_METHOD *COMP_rle(void); +COMP_METHOD *COMP_zlib(void); +void COMP_zlib_cleanup(void); + +# ifdef HEADER_BIO_H +# ifdef ZLIB +BIO_METHOD *BIO_f_zlib(void); +# endif +# endif + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_COMP_strings(void); + +/* Error codes for the COMP functions. */ + +/* Function codes. */ +# define COMP_F_BIO_ZLIB_FLUSH 99 +# define COMP_F_BIO_ZLIB_NEW 100 +# define COMP_F_BIO_ZLIB_READ 101 +# define COMP_F_BIO_ZLIB_WRITE 102 + +/* Reason codes. */ +# define COMP_R_ZLIB_DEFLATE_ERROR 99 +# define COMP_R_ZLIB_INFLATE_ERROR 100 +# define COMP_R_ZLIB_NOT_SUPPORTED 101 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/ext/openssl-osx/include/openssl/crypto.h b/ext/openssl-osx/include/openssl/crypto.h new file mode 100644 index 00000000..c450d7a3 --- /dev/null +++ b/ext/openssl-osx/include/openssl/crypto.h @@ -0,0 +1,661 @@ +/* crypto/crypto.h */ +/* ==================================================================== + * Copyright (c) 1998-2006 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ +/* ==================================================================== + * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. + * ECDH support in OpenSSL originally developed by + * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project. + */ + +#ifndef HEADER_CRYPTO_H +# define HEADER_CRYPTO_H + +# include + +# include + +# ifndef OPENSSL_NO_FP_API +# include +# endif + +# include +# include +# include +# include + +# ifdef CHARSET_EBCDIC +# include +# endif + +/* + * Resolve problems on some operating systems with symbol names that clash + * one way or another + */ +# include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Backward compatibility to SSLeay */ +/* + * This is more to be used to check the correct DLL is being used in the MS + * world. + */ +# define SSLEAY_VERSION_NUMBER OPENSSL_VERSION_NUMBER +# define SSLEAY_VERSION 0 +/* #define SSLEAY_OPTIONS 1 no longer supported */ +# define SSLEAY_CFLAGS 2 +# define SSLEAY_BUILT_ON 3 +# define SSLEAY_PLATFORM 4 +# define SSLEAY_DIR 5 + +/* Already declared in ossl_typ.h */ +# if 0 +typedef struct crypto_ex_data_st CRYPTO_EX_DATA; +/* Called when a new object is created */ +typedef int CRYPTO_EX_new (void *parent, void *ptr, CRYPTO_EX_DATA *ad, + int idx, long argl, void *argp); +/* Called when an object is free()ed */ +typedef void CRYPTO_EX_free (void *parent, void *ptr, CRYPTO_EX_DATA *ad, + int idx, long argl, void *argp); +/* Called when we need to dup an object */ +typedef int CRYPTO_EX_dup (CRYPTO_EX_DATA *to, CRYPTO_EX_DATA *from, + void *from_d, int idx, long argl, void *argp); +# endif + +/* A generic structure to pass assorted data in a expandable way */ +typedef struct openssl_item_st { + int code; + void *value; /* Not used for flag attributes */ + size_t value_size; /* Max size of value for output, length for + * input */ + size_t *value_length; /* Returned length of value for output */ +} OPENSSL_ITEM; + +/* + * When changing the CRYPTO_LOCK_* list, be sure to maintin the text lock + * names in cryptlib.c + */ + +# define CRYPTO_LOCK_ERR 1 +# define CRYPTO_LOCK_EX_DATA 2 +# define CRYPTO_LOCK_X509 3 +# define CRYPTO_LOCK_X509_INFO 4 +# define CRYPTO_LOCK_X509_PKEY 5 +# define CRYPTO_LOCK_X509_CRL 6 +# define CRYPTO_LOCK_X509_REQ 7 +# define CRYPTO_LOCK_DSA 8 +# define CRYPTO_LOCK_RSA 9 +# define CRYPTO_LOCK_EVP_PKEY 10 +# define CRYPTO_LOCK_X509_STORE 11 +# define CRYPTO_LOCK_SSL_CTX 12 +# define CRYPTO_LOCK_SSL_CERT 13 +# define CRYPTO_LOCK_SSL_SESSION 14 +# define CRYPTO_LOCK_SSL_SESS_CERT 15 +# define CRYPTO_LOCK_SSL 16 +# define CRYPTO_LOCK_SSL_METHOD 17 +# define CRYPTO_LOCK_RAND 18 +# define CRYPTO_LOCK_RAND2 19 +# define CRYPTO_LOCK_MALLOC 20 +# define CRYPTO_LOCK_BIO 21 +# define CRYPTO_LOCK_GETHOSTBYNAME 22 +# define CRYPTO_LOCK_GETSERVBYNAME 23 +# define CRYPTO_LOCK_READDIR 24 +# define CRYPTO_LOCK_RSA_BLINDING 25 +# define CRYPTO_LOCK_DH 26 +# define CRYPTO_LOCK_MALLOC2 27 +# define CRYPTO_LOCK_DSO 28 +# define CRYPTO_LOCK_DYNLOCK 29 +# define CRYPTO_LOCK_ENGINE 30 +# define CRYPTO_LOCK_UI 31 +# define CRYPTO_LOCK_ECDSA 32 +# define CRYPTO_LOCK_EC 33 +# define CRYPTO_LOCK_ECDH 34 +# define CRYPTO_LOCK_BN 35 +# define CRYPTO_LOCK_EC_PRE_COMP 36 +# define CRYPTO_LOCK_STORE 37 +# define CRYPTO_LOCK_COMP 38 +# define CRYPTO_LOCK_FIPS 39 +# define CRYPTO_LOCK_FIPS2 40 +# define CRYPTO_NUM_LOCKS 41 + +# define CRYPTO_LOCK 1 +# define CRYPTO_UNLOCK 2 +# define CRYPTO_READ 4 +# define CRYPTO_WRITE 8 + +# ifndef OPENSSL_NO_LOCKING +# ifndef CRYPTO_w_lock +# define CRYPTO_w_lock(type) \ + CRYPTO_lock(CRYPTO_LOCK|CRYPTO_WRITE,type,__FILE__,__LINE__) +# define CRYPTO_w_unlock(type) \ + CRYPTO_lock(CRYPTO_UNLOCK|CRYPTO_WRITE,type,__FILE__,__LINE__) +# define CRYPTO_r_lock(type) \ + CRYPTO_lock(CRYPTO_LOCK|CRYPTO_READ,type,__FILE__,__LINE__) +# define CRYPTO_r_unlock(type) \ + CRYPTO_lock(CRYPTO_UNLOCK|CRYPTO_READ,type,__FILE__,__LINE__) +# define CRYPTO_add(addr,amount,type) \ + CRYPTO_add_lock(addr,amount,type,__FILE__,__LINE__) +# endif +# else +# define CRYPTO_w_lock(a) +# define CRYPTO_w_unlock(a) +# define CRYPTO_r_lock(a) +# define CRYPTO_r_unlock(a) +# define CRYPTO_add(a,b,c) ((*(a))+=(b)) +# endif + +/* + * Some applications as well as some parts of OpenSSL need to allocate and + * deallocate locks in a dynamic fashion. The following typedef makes this + * possible in a type-safe manner. + */ +/* struct CRYPTO_dynlock_value has to be defined by the application. */ +typedef struct { + int references; + struct CRYPTO_dynlock_value *data; +} CRYPTO_dynlock; + +/* + * The following can be used to detect memory leaks in the SSLeay library. It + * used, it turns on malloc checking + */ + +# define CRYPTO_MEM_CHECK_OFF 0x0/* an enume */ +# define CRYPTO_MEM_CHECK_ON 0x1/* a bit */ +# define CRYPTO_MEM_CHECK_ENABLE 0x2/* a bit */ +# define CRYPTO_MEM_CHECK_DISABLE 0x3/* an enume */ + +/* + * The following are bit values to turn on or off options connected to the + * malloc checking functionality + */ + +/* Adds time to the memory checking information */ +# define V_CRYPTO_MDEBUG_TIME 0x1/* a bit */ +/* Adds thread number to the memory checking information */ +# define V_CRYPTO_MDEBUG_THREAD 0x2/* a bit */ + +# define V_CRYPTO_MDEBUG_ALL (V_CRYPTO_MDEBUG_TIME | V_CRYPTO_MDEBUG_THREAD) + +/* predec of the BIO type */ +typedef struct bio_st BIO_dummy; + +struct crypto_ex_data_st { + STACK_OF(void) *sk; + /* gcc is screwing up this data structure :-( */ + int dummy; +}; +DECLARE_STACK_OF(void) + +/* + * This stuff is basically class callback functions The current classes are + * SSL_CTX, SSL, SSL_SESSION, and a few more + */ + +typedef struct crypto_ex_data_func_st { + long argl; /* Arbitary long */ + void *argp; /* Arbitary void * */ + CRYPTO_EX_new *new_func; + CRYPTO_EX_free *free_func; + CRYPTO_EX_dup *dup_func; +} CRYPTO_EX_DATA_FUNCS; + +DECLARE_STACK_OF(CRYPTO_EX_DATA_FUNCS) + +/* + * Per class, we have a STACK of CRYPTO_EX_DATA_FUNCS for each CRYPTO_EX_DATA + * entry. + */ + +# define CRYPTO_EX_INDEX_BIO 0 +# define CRYPTO_EX_INDEX_SSL 1 +# define CRYPTO_EX_INDEX_SSL_CTX 2 +# define CRYPTO_EX_INDEX_SSL_SESSION 3 +# define CRYPTO_EX_INDEX_X509_STORE 4 +# define CRYPTO_EX_INDEX_X509_STORE_CTX 5 +# define CRYPTO_EX_INDEX_RSA 6 +# define CRYPTO_EX_INDEX_DSA 7 +# define CRYPTO_EX_INDEX_DH 8 +# define CRYPTO_EX_INDEX_ENGINE 9 +# define CRYPTO_EX_INDEX_X509 10 +# define CRYPTO_EX_INDEX_UI 11 +# define CRYPTO_EX_INDEX_ECDSA 12 +# define CRYPTO_EX_INDEX_ECDH 13 +# define CRYPTO_EX_INDEX_COMP 14 +# define CRYPTO_EX_INDEX_STORE 15 + +/* + * Dynamically assigned indexes start from this value (don't use directly, + * use via CRYPTO_ex_data_new_class). + */ +# define CRYPTO_EX_INDEX_USER 100 + +/* + * This is the default callbacks, but we can have others as well: this is + * needed in Win32 where the application malloc and the library malloc may + * not be the same. + */ +# define CRYPTO_malloc_init() CRYPTO_set_mem_functions(\ + malloc, realloc, free) + +# if defined CRYPTO_MDEBUG_ALL || defined CRYPTO_MDEBUG_TIME || defined CRYPTO_MDEBUG_THREAD +# ifndef CRYPTO_MDEBUG /* avoid duplicate #define */ +# define CRYPTO_MDEBUG +# endif +# endif + +/* + * Set standard debugging functions (not done by default unless CRYPTO_MDEBUG + * is defined) + */ +# define CRYPTO_malloc_debug_init() do {\ + CRYPTO_set_mem_debug_functions(\ + CRYPTO_dbg_malloc,\ + CRYPTO_dbg_realloc,\ + CRYPTO_dbg_free,\ + CRYPTO_dbg_set_options,\ + CRYPTO_dbg_get_options);\ + } while(0) + +int CRYPTO_mem_ctrl(int mode); +int CRYPTO_is_mem_check_on(void); + +/* for applications */ +# define MemCheck_start() CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON) +# define MemCheck_stop() CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_OFF) + +/* for library-internal use */ +# define MemCheck_on() CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ENABLE) +# define MemCheck_off() CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_DISABLE) +# define is_MemCheck_on() CRYPTO_is_mem_check_on() + +# define OPENSSL_malloc(num) CRYPTO_malloc((int)num,__FILE__,__LINE__) +# define OPENSSL_strdup(str) CRYPTO_strdup((str),__FILE__,__LINE__) +# define OPENSSL_realloc(addr,num) \ + CRYPTO_realloc((char *)addr,(int)num,__FILE__,__LINE__) +# define OPENSSL_realloc_clean(addr,old_num,num) \ + CRYPTO_realloc_clean(addr,old_num,num,__FILE__,__LINE__) +# define OPENSSL_remalloc(addr,num) \ + CRYPTO_remalloc((char **)addr,(int)num,__FILE__,__LINE__) +# define OPENSSL_freeFunc CRYPTO_free +# define OPENSSL_free(addr) CRYPTO_free(addr) + +# define OPENSSL_malloc_locked(num) \ + CRYPTO_malloc_locked((int)num,__FILE__,__LINE__) +# define OPENSSL_free_locked(addr) CRYPTO_free_locked(addr) + +const char *SSLeay_version(int type); +unsigned long SSLeay(void); + +int OPENSSL_issetugid(void); + +/* An opaque type representing an implementation of "ex_data" support */ +typedef struct st_CRYPTO_EX_DATA_IMPL CRYPTO_EX_DATA_IMPL; +/* Return an opaque pointer to the current "ex_data" implementation */ +const CRYPTO_EX_DATA_IMPL *CRYPTO_get_ex_data_implementation(void); +/* Sets the "ex_data" implementation to be used (if it's not too late) */ +int CRYPTO_set_ex_data_implementation(const CRYPTO_EX_DATA_IMPL *i); +/* Get a new "ex_data" class, and return the corresponding "class_index" */ +int CRYPTO_ex_data_new_class(void); +/* Within a given class, get/register a new index */ +int CRYPTO_get_ex_new_index(int class_index, long argl, void *argp, + CRYPTO_EX_new *new_func, CRYPTO_EX_dup *dup_func, + CRYPTO_EX_free *free_func); +/* + * Initialise/duplicate/free CRYPTO_EX_DATA variables corresponding to a + * given class (invokes whatever per-class callbacks are applicable) + */ +int CRYPTO_new_ex_data(int class_index, void *obj, CRYPTO_EX_DATA *ad); +int CRYPTO_dup_ex_data(int class_index, CRYPTO_EX_DATA *to, + CRYPTO_EX_DATA *from); +void CRYPTO_free_ex_data(int class_index, void *obj, CRYPTO_EX_DATA *ad); +/* + * Get/set data in a CRYPTO_EX_DATA variable corresponding to a particular + * index (relative to the class type involved) + */ +int CRYPTO_set_ex_data(CRYPTO_EX_DATA *ad, int idx, void *val); +void *CRYPTO_get_ex_data(const CRYPTO_EX_DATA *ad, int idx); +/* + * This function cleans up all "ex_data" state. It mustn't be called under + * potential race-conditions. + */ +void CRYPTO_cleanup_all_ex_data(void); + +int CRYPTO_get_new_lockid(char *name); + +int CRYPTO_num_locks(void); /* return CRYPTO_NUM_LOCKS (shared libs!) */ +void CRYPTO_lock(int mode, int type, const char *file, int line); +void CRYPTO_set_locking_callback(void (*func) (int mode, int type, + const char *file, int line)); +void (*CRYPTO_get_locking_callback(void)) (int mode, int type, + const char *file, int line); +void CRYPTO_set_add_lock_callback(int (*func) + (int *num, int mount, int type, + const char *file, int line)); +int (*CRYPTO_get_add_lock_callback(void)) (int *num, int mount, int type, + const char *file, int line); + +/* Don't use this structure directly. */ +typedef struct crypto_threadid_st { + void *ptr; + unsigned long val; +} CRYPTO_THREADID; +/* Only use CRYPTO_THREADID_set_[numeric|pointer]() within callbacks */ +void CRYPTO_THREADID_set_numeric(CRYPTO_THREADID *id, unsigned long val); +void CRYPTO_THREADID_set_pointer(CRYPTO_THREADID *id, void *ptr); +int CRYPTO_THREADID_set_callback(void (*threadid_func) (CRYPTO_THREADID *)); +void (*CRYPTO_THREADID_get_callback(void)) (CRYPTO_THREADID *); +void CRYPTO_THREADID_current(CRYPTO_THREADID *id); +int CRYPTO_THREADID_cmp(const CRYPTO_THREADID *a, const CRYPTO_THREADID *b); +void CRYPTO_THREADID_cpy(CRYPTO_THREADID *dest, const CRYPTO_THREADID *src); +unsigned long CRYPTO_THREADID_hash(const CRYPTO_THREADID *id); +# ifndef OPENSSL_NO_DEPRECATED +void CRYPTO_set_id_callback(unsigned long (*func) (void)); +unsigned long (*CRYPTO_get_id_callback(void)) (void); +unsigned long CRYPTO_thread_id(void); +# endif + +const char *CRYPTO_get_lock_name(int type); +int CRYPTO_add_lock(int *pointer, int amount, int type, const char *file, + int line); + +int CRYPTO_get_new_dynlockid(void); +void CRYPTO_destroy_dynlockid(int i); +struct CRYPTO_dynlock_value *CRYPTO_get_dynlock_value(int i); +void CRYPTO_set_dynlock_create_callback(struct CRYPTO_dynlock_value + *(*dyn_create_function) (const char + *file, + int line)); +void CRYPTO_set_dynlock_lock_callback(void (*dyn_lock_function) + (int mode, + struct CRYPTO_dynlock_value *l, + const char *file, int line)); +void CRYPTO_set_dynlock_destroy_callback(void (*dyn_destroy_function) + (struct CRYPTO_dynlock_value *l, + const char *file, int line)); +struct CRYPTO_dynlock_value +*(*CRYPTO_get_dynlock_create_callback(void)) (const char *file, int line); +void (*CRYPTO_get_dynlock_lock_callback(void)) (int mode, + struct CRYPTO_dynlock_value + *l, const char *file, + int line); +void (*CRYPTO_get_dynlock_destroy_callback(void)) (struct CRYPTO_dynlock_value + *l, const char *file, + int line); + +/* + * CRYPTO_set_mem_functions includes CRYPTO_set_locked_mem_functions -- call + * the latter last if you need different functions + */ +int CRYPTO_set_mem_functions(void *(*m) (size_t), void *(*r) (void *, size_t), + void (*f) (void *)); +int CRYPTO_set_locked_mem_functions(void *(*m) (size_t), + void (*free_func) (void *)); +int CRYPTO_set_mem_ex_functions(void *(*m) (size_t, const char *, int), + void *(*r) (void *, size_t, const char *, + int), void (*f) (void *)); +int CRYPTO_set_locked_mem_ex_functions(void *(*m) (size_t, const char *, int), + void (*free_func) (void *)); +int CRYPTO_set_mem_debug_functions(void (*m) + (void *, int, const char *, int, int), + void (*r) (void *, void *, int, + const char *, int, int), + void (*f) (void *, int), void (*so) (long), + long (*go) (void)); +void CRYPTO_get_mem_functions(void *(**m) (size_t), + void *(**r) (void *, size_t), + void (**f) (void *)); +void CRYPTO_get_locked_mem_functions(void *(**m) (size_t), + void (**f) (void *)); +void CRYPTO_get_mem_ex_functions(void *(**m) (size_t, const char *, int), + void *(**r) (void *, size_t, const char *, + int), void (**f) (void *)); +void CRYPTO_get_locked_mem_ex_functions(void + *(**m) (size_t, const char *, int), + void (**f) (void *)); +void CRYPTO_get_mem_debug_functions(void (**m) + (void *, int, const char *, int, int), + void (**r) (void *, void *, int, + const char *, int, int), + void (**f) (void *, int), + void (**so) (long), long (**go) (void)); + +void *CRYPTO_malloc_locked(int num, const char *file, int line); +void CRYPTO_free_locked(void *ptr); +void *CRYPTO_malloc(int num, const char *file, int line); +char *CRYPTO_strdup(const char *str, const char *file, int line); +void CRYPTO_free(void *ptr); +void *CRYPTO_realloc(void *addr, int num, const char *file, int line); +void *CRYPTO_realloc_clean(void *addr, int old_num, int num, const char *file, + int line); +void *CRYPTO_remalloc(void *addr, int num, const char *file, int line); + +void OPENSSL_cleanse(void *ptr, size_t len); + +void CRYPTO_set_mem_debug_options(long bits); +long CRYPTO_get_mem_debug_options(void); + +# define CRYPTO_push_info(info) \ + CRYPTO_push_info_(info, __FILE__, __LINE__); +int CRYPTO_push_info_(const char *info, const char *file, int line); +int CRYPTO_pop_info(void); +int CRYPTO_remove_all_info(void); + +/* + * Default debugging functions (enabled by CRYPTO_malloc_debug_init() macro; + * used as default in CRYPTO_MDEBUG compilations): + */ +/*- + * The last argument has the following significance: + * + * 0: called before the actual memory allocation has taken place + * 1: called after the actual memory allocation has taken place + */ +void CRYPTO_dbg_malloc(void *addr, int num, const char *file, int line, + int before_p); +void CRYPTO_dbg_realloc(void *addr1, void *addr2, int num, const char *file, + int line, int before_p); +void CRYPTO_dbg_free(void *addr, int before_p); +/*- + * Tell the debugging code about options. By default, the following values + * apply: + * + * 0: Clear all options. + * V_CRYPTO_MDEBUG_TIME (1): Set the "Show Time" option. + * V_CRYPTO_MDEBUG_THREAD (2): Set the "Show Thread Number" option. + * V_CRYPTO_MDEBUG_ALL (3): 1 + 2 + */ +void CRYPTO_dbg_set_options(long bits); +long CRYPTO_dbg_get_options(void); + +# ifndef OPENSSL_NO_FP_API +void CRYPTO_mem_leaks_fp(FILE *); +# endif +void CRYPTO_mem_leaks(struct bio_st *bio); +/* unsigned long order, char *file, int line, int num_bytes, char *addr */ +typedef void *CRYPTO_MEM_LEAK_CB (unsigned long, const char *, int, int, + void *); +void CRYPTO_mem_leaks_cb(CRYPTO_MEM_LEAK_CB *cb); + +/* die if we have to */ +void OpenSSLDie(const char *file, int line, const char *assertion); +# define OPENSSL_assert(e) (void)((e) ? 0 : (OpenSSLDie(__FILE__, __LINE__, #e),1)) + +unsigned long *OPENSSL_ia32cap_loc(void); +# define OPENSSL_ia32cap (*(OPENSSL_ia32cap_loc())) +int OPENSSL_isservice(void); + +int FIPS_mode(void); +int FIPS_mode_set(int r); + +void OPENSSL_init(void); + +# define fips_md_init(alg) fips_md_init_ctx(alg, alg) + +# ifdef OPENSSL_FIPS +# define fips_md_init_ctx(alg, cx) \ + int alg##_Init(cx##_CTX *c) \ + { \ + if (FIPS_mode()) OpenSSLDie(__FILE__, __LINE__, \ + "Low level API call to digest " #alg " forbidden in FIPS mode!"); \ + return private_##alg##_Init(c); \ + } \ + int private_##alg##_Init(cx##_CTX *c) + +# define fips_cipher_abort(alg) \ + if (FIPS_mode()) OpenSSLDie(__FILE__, __LINE__, \ + "Low level API call to cipher " #alg " forbidden in FIPS mode!") + +# else +# define fips_md_init_ctx(alg, cx) \ + int alg##_Init(cx##_CTX *c) +# define fips_cipher_abort(alg) while(0) +# endif + +/* + * CRYPTO_memcmp returns zero iff the |len| bytes at |a| and |b| are equal. + * It takes an amount of time dependent on |len|, but independent of the + * contents of |a| and |b|. Unlike memcmp, it cannot be used to put elements + * into a defined order as the return value when a != b is undefined, other + * than to be non-zero. + */ +int CRYPTO_memcmp(const void *a, const void *b, size_t len); + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_CRYPTO_strings(void); + +/* Error codes for the CRYPTO functions. */ + +/* Function codes. */ +# define CRYPTO_F_CRYPTO_GET_EX_NEW_INDEX 100 +# define CRYPTO_F_CRYPTO_GET_NEW_DYNLOCKID 103 +# define CRYPTO_F_CRYPTO_GET_NEW_LOCKID 101 +# define CRYPTO_F_CRYPTO_SET_EX_DATA 102 +# define CRYPTO_F_DEF_ADD_INDEX 104 +# define CRYPTO_F_DEF_GET_CLASS 105 +# define CRYPTO_F_FIPS_MODE_SET 109 +# define CRYPTO_F_INT_DUP_EX_DATA 106 +# define CRYPTO_F_INT_FREE_EX_DATA 107 +# define CRYPTO_F_INT_NEW_EX_DATA 108 + +/* Reason codes. */ +# define CRYPTO_R_FIPS_MODE_NOT_SUPPORTED 101 +# define CRYPTO_R_NO_DYNLOCK_CREATE_CALLBACK 100 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/ext/openssl-osx/include/openssl/dh.h b/ext/openssl-osx/include/openssl/dh.h new file mode 100644 index 00000000..0502f1a9 --- /dev/null +++ b/ext/openssl-osx/include/openssl/dh.h @@ -0,0 +1,392 @@ +/* crypto/dh/dh.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_DH_H +# define HEADER_DH_H + +# include + +# ifdef OPENSSL_NO_DH +# error DH is disabled. +# endif + +# ifndef OPENSSL_NO_BIO +# include +# endif +# include +# ifndef OPENSSL_NO_DEPRECATED +# include +# endif + +# ifndef OPENSSL_DH_MAX_MODULUS_BITS +# define OPENSSL_DH_MAX_MODULUS_BITS 10000 +# endif + +# define DH_FLAG_CACHE_MONT_P 0x01 + +/* + * new with 0.9.7h; the built-in DH + * implementation now uses constant time + * modular exponentiation for secret exponents + * by default. This flag causes the + * faster variable sliding window method to + * be used for all exponents. + */ +# define DH_FLAG_NO_EXP_CONSTTIME 0x02 + +/* + * If this flag is set the DH method is FIPS compliant and can be used in + * FIPS mode. This is set in the validated module method. If an application + * sets this flag in its own methods it is its reposibility to ensure the + * result is compliant. + */ + +# define DH_FLAG_FIPS_METHOD 0x0400 + +/* + * If this flag is set the operations normally disabled in FIPS mode are + * permitted it is then the applications responsibility to ensure that the + * usage is compliant. + */ + +# define DH_FLAG_NON_FIPS_ALLOW 0x0400 + +#ifdef __cplusplus +extern "C" { +#endif + +/* Already defined in ossl_typ.h */ +/* typedef struct dh_st DH; */ +/* typedef struct dh_method DH_METHOD; */ + +struct dh_method { + const char *name; + /* Methods here */ + int (*generate_key) (DH *dh); + int (*compute_key) (unsigned char *key, const BIGNUM *pub_key, DH *dh); + /* Can be null */ + int (*bn_mod_exp) (const DH *dh, BIGNUM *r, const BIGNUM *a, + const BIGNUM *p, const BIGNUM *m, BN_CTX *ctx, + BN_MONT_CTX *m_ctx); + int (*init) (DH *dh); + int (*finish) (DH *dh); + int flags; + char *app_data; + /* If this is non-NULL, it will be used to generate parameters */ + int (*generate_params) (DH *dh, int prime_len, int generator, + BN_GENCB *cb); +}; + +struct dh_st { + /* + * This first argument is used to pick up errors when a DH is passed + * instead of a EVP_PKEY + */ + int pad; + int version; + BIGNUM *p; + BIGNUM *g; + long length; /* optional */ + BIGNUM *pub_key; /* g^x */ + BIGNUM *priv_key; /* x */ + int flags; + BN_MONT_CTX *method_mont_p; + /* Place holders if we want to do X9.42 DH */ + BIGNUM *q; + BIGNUM *j; + unsigned char *seed; + int seedlen; + BIGNUM *counter; + int references; + CRYPTO_EX_DATA ex_data; + const DH_METHOD *meth; + ENGINE *engine; +}; + +# define DH_GENERATOR_2 2 +/* #define DH_GENERATOR_3 3 */ +# define DH_GENERATOR_5 5 + +/* DH_check error codes */ +# define DH_CHECK_P_NOT_PRIME 0x01 +# define DH_CHECK_P_NOT_SAFE_PRIME 0x02 +# define DH_UNABLE_TO_CHECK_GENERATOR 0x04 +# define DH_NOT_SUITABLE_GENERATOR 0x08 +# define DH_CHECK_Q_NOT_PRIME 0x10 +# define DH_CHECK_INVALID_Q_VALUE 0x20 +# define DH_CHECK_INVALID_J_VALUE 0x40 + +/* DH_check_pub_key error codes */ +# define DH_CHECK_PUBKEY_TOO_SMALL 0x01 +# define DH_CHECK_PUBKEY_TOO_LARGE 0x02 + +/* + * primes p where (p-1)/2 is prime too are called "safe"; we define this for + * backward compatibility: + */ +# define DH_CHECK_P_NOT_STRONG_PRIME DH_CHECK_P_NOT_SAFE_PRIME + +# define d2i_DHparams_fp(fp,x) (DH *)ASN1_d2i_fp((char *(*)())DH_new, \ + (char *(*)())d2i_DHparams,(fp),(unsigned char **)(x)) +# define i2d_DHparams_fp(fp,x) ASN1_i2d_fp(i2d_DHparams,(fp), \ + (unsigned char *)(x)) +# define d2i_DHparams_bio(bp,x) ASN1_d2i_bio_of(DH,DH_new,d2i_DHparams,bp,x) +# define i2d_DHparams_bio(bp,x) ASN1_i2d_bio_of_const(DH,i2d_DHparams,bp,x) + +DH *DHparams_dup(DH *); + +const DH_METHOD *DH_OpenSSL(void); + +void DH_set_default_method(const DH_METHOD *meth); +const DH_METHOD *DH_get_default_method(void); +int DH_set_method(DH *dh, const DH_METHOD *meth); +DH *DH_new_method(ENGINE *engine); + +DH *DH_new(void); +void DH_free(DH *dh); +int DH_up_ref(DH *dh); +int DH_size(const DH *dh); +int DH_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func); +int DH_set_ex_data(DH *d, int idx, void *arg); +void *DH_get_ex_data(DH *d, int idx); + +/* Deprecated version */ +# ifndef OPENSSL_NO_DEPRECATED +DH *DH_generate_parameters(int prime_len, int generator, + void (*callback) (int, int, void *), void *cb_arg); +# endif /* !defined(OPENSSL_NO_DEPRECATED) */ + +/* New version */ +int DH_generate_parameters_ex(DH *dh, int prime_len, int generator, + BN_GENCB *cb); + +int DH_check(const DH *dh, int *codes); +int DH_check_pub_key(const DH *dh, const BIGNUM *pub_key, int *codes); +int DH_generate_key(DH *dh); +int DH_compute_key(unsigned char *key, const BIGNUM *pub_key, DH *dh); +int DH_compute_key_padded(unsigned char *key, const BIGNUM *pub_key, DH *dh); +DH *d2i_DHparams(DH **a, const unsigned char **pp, long length); +int i2d_DHparams(const DH *a, unsigned char **pp); +DH *d2i_DHxparams(DH **a, const unsigned char **pp, long length); +int i2d_DHxparams(const DH *a, unsigned char **pp); +# ifndef OPENSSL_NO_FP_API +int DHparams_print_fp(FILE *fp, const DH *x); +# endif +# ifndef OPENSSL_NO_BIO +int DHparams_print(BIO *bp, const DH *x); +# else +int DHparams_print(char *bp, const DH *x); +# endif + +/* RFC 5114 parameters */ +DH *DH_get_1024_160(void); +DH *DH_get_2048_224(void); +DH *DH_get_2048_256(void); + +/* RFC2631 KDF */ +int DH_KDF_X9_42(unsigned char *out, size_t outlen, + const unsigned char *Z, size_t Zlen, + ASN1_OBJECT *key_oid, + const unsigned char *ukm, size_t ukmlen, const EVP_MD *md); + +# define EVP_PKEY_CTX_set_dh_paramgen_prime_len(ctx, len) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DH, EVP_PKEY_OP_PARAMGEN, \ + EVP_PKEY_CTRL_DH_PARAMGEN_PRIME_LEN, len, NULL) + +# define EVP_PKEY_CTX_set_dh_paramgen_subprime_len(ctx, len) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DH, EVP_PKEY_OP_PARAMGEN, \ + EVP_PKEY_CTRL_DH_PARAMGEN_SUBPRIME_LEN, len, NULL) + +# define EVP_PKEY_CTX_set_dh_paramgen_type(ctx, typ) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DH, EVP_PKEY_OP_PARAMGEN, \ + EVP_PKEY_CTRL_DH_PARAMGEN_TYPE, typ, NULL) + +# define EVP_PKEY_CTX_set_dh_paramgen_generator(ctx, gen) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DH, EVP_PKEY_OP_PARAMGEN, \ + EVP_PKEY_CTRL_DH_PARAMGEN_GENERATOR, gen, NULL) + +# define EVP_PKEY_CTX_set_dh_rfc5114(ctx, gen) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, EVP_PKEY_OP_PARAMGEN, \ + EVP_PKEY_CTRL_DH_RFC5114, gen, NULL) + +# define EVP_PKEY_CTX_set_dhx_rfc5114(ctx, gen) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, EVP_PKEY_OP_PARAMGEN, \ + EVP_PKEY_CTRL_DH_RFC5114, gen, NULL) + +# define EVP_PKEY_CTX_set_dh_kdf_type(ctx, kdf) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_DH_KDF_TYPE, kdf, NULL) + +# define EVP_PKEY_CTX_get_dh_kdf_type(ctx) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_DH_KDF_TYPE, -2, NULL) + +# define EVP_PKEY_CTX_set0_dh_kdf_oid(ctx, oid) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_DH_KDF_OID, 0, (void *)oid) + +# define EVP_PKEY_CTX_get0_dh_kdf_oid(ctx, poid) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_GET_DH_KDF_OID, 0, (void *)poid) + +# define EVP_PKEY_CTX_set_dh_kdf_md(ctx, md) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_DH_KDF_MD, 0, (void *)md) + +# define EVP_PKEY_CTX_get_dh_kdf_md(ctx, pmd) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_GET_DH_KDF_MD, 0, (void *)pmd) + +# define EVP_PKEY_CTX_set_dh_kdf_outlen(ctx, len) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_DH_KDF_OUTLEN, len, NULL) + +# define EVP_PKEY_CTX_get_dh_kdf_outlen(ctx, plen) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_GET_DH_KDF_OUTLEN, 0, (void *)plen) + +# define EVP_PKEY_CTX_set0_dh_kdf_ukm(ctx, p, plen) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_DH_KDF_UKM, plen, (void *)p) + +# define EVP_PKEY_CTX_get0_dh_kdf_ukm(ctx, p) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_GET_DH_KDF_UKM, 0, (void *)p) + +# define EVP_PKEY_CTRL_DH_PARAMGEN_PRIME_LEN (EVP_PKEY_ALG_CTRL + 1) +# define EVP_PKEY_CTRL_DH_PARAMGEN_GENERATOR (EVP_PKEY_ALG_CTRL + 2) +# define EVP_PKEY_CTRL_DH_RFC5114 (EVP_PKEY_ALG_CTRL + 3) +# define EVP_PKEY_CTRL_DH_PARAMGEN_SUBPRIME_LEN (EVP_PKEY_ALG_CTRL + 4) +# define EVP_PKEY_CTRL_DH_PARAMGEN_TYPE (EVP_PKEY_ALG_CTRL + 5) +# define EVP_PKEY_CTRL_DH_KDF_TYPE (EVP_PKEY_ALG_CTRL + 6) +# define EVP_PKEY_CTRL_DH_KDF_MD (EVP_PKEY_ALG_CTRL + 7) +# define EVP_PKEY_CTRL_GET_DH_KDF_MD (EVP_PKEY_ALG_CTRL + 8) +# define EVP_PKEY_CTRL_DH_KDF_OUTLEN (EVP_PKEY_ALG_CTRL + 9) +# define EVP_PKEY_CTRL_GET_DH_KDF_OUTLEN (EVP_PKEY_ALG_CTRL + 10) +# define EVP_PKEY_CTRL_DH_KDF_UKM (EVP_PKEY_ALG_CTRL + 11) +# define EVP_PKEY_CTRL_GET_DH_KDF_UKM (EVP_PKEY_ALG_CTRL + 12) +# define EVP_PKEY_CTRL_DH_KDF_OID (EVP_PKEY_ALG_CTRL + 13) +# define EVP_PKEY_CTRL_GET_DH_KDF_OID (EVP_PKEY_ALG_CTRL + 14) + +/* KDF types */ +# define EVP_PKEY_DH_KDF_NONE 1 +# define EVP_PKEY_DH_KDF_X9_42 2 + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_DH_strings(void); + +/* Error codes for the DH functions. */ + +/* Function codes. */ +# define DH_F_COMPUTE_KEY 102 +# define DH_F_DHPARAMS_PRINT_FP 101 +# define DH_F_DH_BUILTIN_GENPARAMS 106 +# define DH_F_DH_CMS_DECRYPT 117 +# define DH_F_DH_CMS_SET_PEERKEY 118 +# define DH_F_DH_CMS_SET_SHARED_INFO 119 +# define DH_F_DH_COMPUTE_KEY 114 +# define DH_F_DH_GENERATE_KEY 115 +# define DH_F_DH_GENERATE_PARAMETERS_EX 116 +# define DH_F_DH_NEW_METHOD 105 +# define DH_F_DH_PARAM_DECODE 107 +# define DH_F_DH_PRIV_DECODE 110 +# define DH_F_DH_PRIV_ENCODE 111 +# define DH_F_DH_PUB_DECODE 108 +# define DH_F_DH_PUB_ENCODE 109 +# define DH_F_DO_DH_PRINT 100 +# define DH_F_GENERATE_KEY 103 +# define DH_F_GENERATE_PARAMETERS 104 +# define DH_F_PKEY_DH_DERIVE 112 +# define DH_F_PKEY_DH_KEYGEN 113 + +/* Reason codes. */ +# define DH_R_BAD_GENERATOR 101 +# define DH_R_BN_DECODE_ERROR 109 +# define DH_R_BN_ERROR 106 +# define DH_R_DECODE_ERROR 104 +# define DH_R_INVALID_PUBKEY 102 +# define DH_R_KDF_PARAMETER_ERROR 112 +# define DH_R_KEYS_NOT_SET 108 +# define DH_R_KEY_SIZE_TOO_SMALL 110 +# define DH_R_MODULUS_TOO_LARGE 103 +# define DH_R_NON_FIPS_METHOD 111 +# define DH_R_NO_PARAMETERS_SET 107 +# define DH_R_NO_PRIVATE_VALUE 100 +# define DH_R_PARAMETER_ENCODING_ERROR 105 +# define DH_R_PEER_KEY_ERROR 113 +# define DH_R_SHARED_INFO_ERROR 114 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/ext/openssl-osx/include/openssl/dsa.h b/ext/openssl-osx/include/openssl/dsa.h new file mode 100644 index 00000000..545358fd --- /dev/null +++ b/ext/openssl-osx/include/openssl/dsa.h @@ -0,0 +1,332 @@ +/* crypto/dsa/dsa.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +/* + * The DSS routines are based on patches supplied by + * Steven Schoch . He basically did the + * work and I have just tweaked them a little to fit into my + * stylistic vision for SSLeay :-) */ + +#ifndef HEADER_DSA_H +# define HEADER_DSA_H + +# include + +# ifdef OPENSSL_NO_DSA +# error DSA is disabled. +# endif + +# ifndef OPENSSL_NO_BIO +# include +# endif +# include +# include + +# ifndef OPENSSL_NO_DEPRECATED +# include +# ifndef OPENSSL_NO_DH +# include +# endif +# endif + +# ifndef OPENSSL_DSA_MAX_MODULUS_BITS +# define OPENSSL_DSA_MAX_MODULUS_BITS 10000 +# endif + +# define DSA_FLAG_CACHE_MONT_P 0x01 +/* + * new with 0.9.7h; the built-in DSA implementation now uses constant time + * modular exponentiation for secret exponents by default. This flag causes + * the faster variable sliding window method to be used for all exponents. + */ +# define DSA_FLAG_NO_EXP_CONSTTIME 0x02 + +/* + * If this flag is set the DSA method is FIPS compliant and can be used in + * FIPS mode. This is set in the validated module method. If an application + * sets this flag in its own methods it is its reposibility to ensure the + * result is compliant. + */ + +# define DSA_FLAG_FIPS_METHOD 0x0400 + +/* + * If this flag is set the operations normally disabled in FIPS mode are + * permitted it is then the applications responsibility to ensure that the + * usage is compliant. + */ + +# define DSA_FLAG_NON_FIPS_ALLOW 0x0400 + +#ifdef __cplusplus +extern "C" { +#endif + +/* Already defined in ossl_typ.h */ +/* typedef struct dsa_st DSA; */ +/* typedef struct dsa_method DSA_METHOD; */ + +typedef struct DSA_SIG_st { + BIGNUM *r; + BIGNUM *s; +} DSA_SIG; + +struct dsa_method { + const char *name; + DSA_SIG *(*dsa_do_sign) (const unsigned char *dgst, int dlen, DSA *dsa); + int (*dsa_sign_setup) (DSA *dsa, BN_CTX *ctx_in, BIGNUM **kinvp, + BIGNUM **rp); + int (*dsa_do_verify) (const unsigned char *dgst, int dgst_len, + DSA_SIG *sig, DSA *dsa); + int (*dsa_mod_exp) (DSA *dsa, BIGNUM *rr, BIGNUM *a1, BIGNUM *p1, + BIGNUM *a2, BIGNUM *p2, BIGNUM *m, BN_CTX *ctx, + BN_MONT_CTX *in_mont); + /* Can be null */ + int (*bn_mod_exp) (DSA *dsa, BIGNUM *r, BIGNUM *a, const BIGNUM *p, + const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx); + int (*init) (DSA *dsa); + int (*finish) (DSA *dsa); + int flags; + char *app_data; + /* If this is non-NULL, it is used to generate DSA parameters */ + int (*dsa_paramgen) (DSA *dsa, int bits, + const unsigned char *seed, int seed_len, + int *counter_ret, unsigned long *h_ret, + BN_GENCB *cb); + /* If this is non-NULL, it is used to generate DSA keys */ + int (*dsa_keygen) (DSA *dsa); +}; + +struct dsa_st { + /* + * This first variable is used to pick up errors where a DSA is passed + * instead of of a EVP_PKEY + */ + int pad; + long version; + int write_params; + BIGNUM *p; + BIGNUM *q; /* == 20 */ + BIGNUM *g; + BIGNUM *pub_key; /* y public key */ + BIGNUM *priv_key; /* x private key */ + BIGNUM *kinv; /* Signing pre-calc */ + BIGNUM *r; /* Signing pre-calc */ + int flags; + /* Normally used to cache montgomery values */ + BN_MONT_CTX *method_mont_p; + int references; + CRYPTO_EX_DATA ex_data; + const DSA_METHOD *meth; + /* functional reference if 'meth' is ENGINE-provided */ + ENGINE *engine; +}; + +# define d2i_DSAparams_fp(fp,x) (DSA *)ASN1_d2i_fp((char *(*)())DSA_new, \ + (char *(*)())d2i_DSAparams,(fp),(unsigned char **)(x)) +# define i2d_DSAparams_fp(fp,x) ASN1_i2d_fp(i2d_DSAparams,(fp), \ + (unsigned char *)(x)) +# define d2i_DSAparams_bio(bp,x) ASN1_d2i_bio_of(DSA,DSA_new,d2i_DSAparams,bp,x) +# define i2d_DSAparams_bio(bp,x) ASN1_i2d_bio_of_const(DSA,i2d_DSAparams,bp,x) + +DSA *DSAparams_dup(DSA *x); +DSA_SIG *DSA_SIG_new(void); +void DSA_SIG_free(DSA_SIG *a); +int i2d_DSA_SIG(const DSA_SIG *a, unsigned char **pp); +DSA_SIG *d2i_DSA_SIG(DSA_SIG **v, const unsigned char **pp, long length); + +DSA_SIG *DSA_do_sign(const unsigned char *dgst, int dlen, DSA *dsa); +int DSA_do_verify(const unsigned char *dgst, int dgst_len, + DSA_SIG *sig, DSA *dsa); + +const DSA_METHOD *DSA_OpenSSL(void); + +void DSA_set_default_method(const DSA_METHOD *); +const DSA_METHOD *DSA_get_default_method(void); +int DSA_set_method(DSA *dsa, const DSA_METHOD *); + +DSA *DSA_new(void); +DSA *DSA_new_method(ENGINE *engine); +void DSA_free(DSA *r); +/* "up" the DSA object's reference count */ +int DSA_up_ref(DSA *r); +int DSA_size(const DSA *); + /* next 4 return -1 on error */ +int DSA_sign_setup(DSA *dsa, BN_CTX *ctx_in, BIGNUM **kinvp, BIGNUM **rp); +int DSA_sign(int type, const unsigned char *dgst, int dlen, + unsigned char *sig, unsigned int *siglen, DSA *dsa); +int DSA_verify(int type, const unsigned char *dgst, int dgst_len, + const unsigned char *sigbuf, int siglen, DSA *dsa); +int DSA_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func); +int DSA_set_ex_data(DSA *d, int idx, void *arg); +void *DSA_get_ex_data(DSA *d, int idx); + +DSA *d2i_DSAPublicKey(DSA **a, const unsigned char **pp, long length); +DSA *d2i_DSAPrivateKey(DSA **a, const unsigned char **pp, long length); +DSA *d2i_DSAparams(DSA **a, const unsigned char **pp, long length); + +/* Deprecated version */ +# ifndef OPENSSL_NO_DEPRECATED +DSA *DSA_generate_parameters(int bits, + unsigned char *seed, int seed_len, + int *counter_ret, unsigned long *h_ret, void + (*callback) (int, int, void *), void *cb_arg); +# endif /* !defined(OPENSSL_NO_DEPRECATED) */ + +/* New version */ +int DSA_generate_parameters_ex(DSA *dsa, int bits, + const unsigned char *seed, int seed_len, + int *counter_ret, unsigned long *h_ret, + BN_GENCB *cb); + +int DSA_generate_key(DSA *a); +int i2d_DSAPublicKey(const DSA *a, unsigned char **pp); +int i2d_DSAPrivateKey(const DSA *a, unsigned char **pp); +int i2d_DSAparams(const DSA *a, unsigned char **pp); + +# ifndef OPENSSL_NO_BIO +int DSAparams_print(BIO *bp, const DSA *x); +int DSA_print(BIO *bp, const DSA *x, int off); +# endif +# ifndef OPENSSL_NO_FP_API +int DSAparams_print_fp(FILE *fp, const DSA *x); +int DSA_print_fp(FILE *bp, const DSA *x, int off); +# endif + +# define DSS_prime_checks 50 +/* + * Primality test according to FIPS PUB 186[-1], Appendix 2.1: 50 rounds of + * Rabin-Miller + */ +# define DSA_is_prime(n, callback, cb_arg) \ + BN_is_prime(n, DSS_prime_checks, callback, NULL, cb_arg) + +# ifndef OPENSSL_NO_DH +/* + * Convert DSA structure (key or just parameters) into DH structure (be + * careful to avoid small subgroup attacks when using this!) + */ +DH *DSA_dup_DH(const DSA *r); +# endif + +# define EVP_PKEY_CTX_set_dsa_paramgen_bits(ctx, nbits) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DSA, EVP_PKEY_OP_PARAMGEN, \ + EVP_PKEY_CTRL_DSA_PARAMGEN_BITS, nbits, NULL) + +# define EVP_PKEY_CTRL_DSA_PARAMGEN_BITS (EVP_PKEY_ALG_CTRL + 1) +# define EVP_PKEY_CTRL_DSA_PARAMGEN_Q_BITS (EVP_PKEY_ALG_CTRL + 2) +# define EVP_PKEY_CTRL_DSA_PARAMGEN_MD (EVP_PKEY_ALG_CTRL + 3) + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_DSA_strings(void); + +/* Error codes for the DSA functions. */ + +/* Function codes. */ +# define DSA_F_D2I_DSA_SIG 110 +# define DSA_F_DO_DSA_PRINT 104 +# define DSA_F_DSAPARAMS_PRINT 100 +# define DSA_F_DSAPARAMS_PRINT_FP 101 +# define DSA_F_DSA_BUILTIN_PARAMGEN2 126 +# define DSA_F_DSA_DO_SIGN 112 +# define DSA_F_DSA_DO_VERIFY 113 +# define DSA_F_DSA_GENERATE_KEY 124 +# define DSA_F_DSA_GENERATE_PARAMETERS_EX 123 +# define DSA_F_DSA_NEW_METHOD 103 +# define DSA_F_DSA_PARAM_DECODE 119 +# define DSA_F_DSA_PRINT_FP 105 +# define DSA_F_DSA_PRIV_DECODE 115 +# define DSA_F_DSA_PRIV_ENCODE 116 +# define DSA_F_DSA_PUB_DECODE 117 +# define DSA_F_DSA_PUB_ENCODE 118 +# define DSA_F_DSA_SIGN 106 +# define DSA_F_DSA_SIGN_SETUP 107 +# define DSA_F_DSA_SIG_NEW 109 +# define DSA_F_DSA_SIG_PRINT 125 +# define DSA_F_DSA_VERIFY 108 +# define DSA_F_I2D_DSA_SIG 111 +# define DSA_F_OLD_DSA_PRIV_DECODE 122 +# define DSA_F_PKEY_DSA_CTRL 120 +# define DSA_F_PKEY_DSA_KEYGEN 121 +# define DSA_F_SIG_CB 114 + +/* Reason codes. */ +# define DSA_R_BAD_Q_VALUE 102 +# define DSA_R_BN_DECODE_ERROR 108 +# define DSA_R_BN_ERROR 109 +# define DSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE 100 +# define DSA_R_DECODE_ERROR 104 +# define DSA_R_INVALID_DIGEST_TYPE 106 +# define DSA_R_INVALID_PARAMETERS 112 +# define DSA_R_MISSING_PARAMETERS 101 +# define DSA_R_MODULUS_TOO_LARGE 103 +# define DSA_R_NEED_NEW_SETUP_VALUES 110 +# define DSA_R_NON_FIPS_DSA_METHOD 111 +# define DSA_R_NO_PARAMETERS_SET 107 +# define DSA_R_PARAMETER_ENCODING_ERROR 105 +# define DSA_R_Q_NOT_PRIME 113 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/ext/openssl-osx/include/openssl/dtls1.h b/ext/openssl-osx/include/openssl/dtls1.h new file mode 100644 index 00000000..4af7e4a7 --- /dev/null +++ b/ext/openssl-osx/include/openssl/dtls1.h @@ -0,0 +1,271 @@ +/* ssl/dtls1.h */ +/* + * DTLS implementation written by Nagendra Modadugu + * (nagendra@cs.stanford.edu) for the OpenSSL project 2005. + */ +/* ==================================================================== + * Copyright (c) 1999-2005 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_DTLS1_H +# define HEADER_DTLS1_H + +# include +# include +# ifdef OPENSSL_SYS_VMS +# include +# include +# endif +# ifdef OPENSSL_SYS_WIN32 +/* Needed for struct timeval */ +# include +# elif defined(OPENSSL_SYS_NETWARE) && !defined(_WINSOCK2API_) +# include +# else +# if defined(OPENSSL_SYS_VXWORKS) +# include +# else +# include +# endif +# endif + +#ifdef __cplusplus +extern "C" { +#endif + +# define DTLS1_VERSION 0xFEFF +# define DTLS1_2_VERSION 0xFEFD +# define DTLS_MAX_VERSION DTLS1_2_VERSION + +# define DTLS1_BAD_VER 0x0100 + +/* Special value for method supporting multiple versions */ +# define DTLS_ANY_VERSION 0x1FFFF + +# if 0 +/* this alert description is not specified anywhere... */ +# define DTLS1_AD_MISSING_HANDSHAKE_MESSAGE 110 +# endif + +/* lengths of messages */ +# define DTLS1_COOKIE_LENGTH 256 + +# define DTLS1_RT_HEADER_LENGTH 13 + +# define DTLS1_HM_HEADER_LENGTH 12 + +# define DTLS1_HM_BAD_FRAGMENT -2 +# define DTLS1_HM_FRAGMENT_RETRY -3 + +# define DTLS1_CCS_HEADER_LENGTH 1 + +# ifdef DTLS1_AD_MISSING_HANDSHAKE_MESSAGE +# define DTLS1_AL_HEADER_LENGTH 7 +# else +# define DTLS1_AL_HEADER_LENGTH 2 +# endif + +# ifndef OPENSSL_NO_SSL_INTERN + +# ifndef OPENSSL_NO_SCTP +# define DTLS1_SCTP_AUTH_LABEL "EXPORTER_DTLS_OVER_SCTP" +# endif + +/* Max MTU overhead we know about so far is 40 for IPv6 + 8 for UDP */ +# define DTLS1_MAX_MTU_OVERHEAD 48 + +typedef struct dtls1_bitmap_st { + unsigned long map; /* track 32 packets on 32-bit systems and 64 + * - on 64-bit systems */ + unsigned char max_seq_num[8]; /* max record number seen so far, 64-bit + * value in big-endian encoding */ +} DTLS1_BITMAP; + +struct dtls1_retransmit_state { + EVP_CIPHER_CTX *enc_write_ctx; /* cryptographic state */ + EVP_MD_CTX *write_hash; /* used for mac generation */ +# ifndef OPENSSL_NO_COMP + COMP_CTX *compress; /* compression */ +# else + char *compress; +# endif + SSL_SESSION *session; + unsigned short epoch; +}; + +struct hm_header_st { + unsigned char type; + unsigned long msg_len; + unsigned short seq; + unsigned long frag_off; + unsigned long frag_len; + unsigned int is_ccs; + struct dtls1_retransmit_state saved_retransmit_state; +}; + +struct ccs_header_st { + unsigned char type; + unsigned short seq; +}; + +struct dtls1_timeout_st { + /* Number of read timeouts so far */ + unsigned int read_timeouts; + /* Number of write timeouts so far */ + unsigned int write_timeouts; + /* Number of alerts received so far */ + unsigned int num_alerts; +}; + +typedef struct record_pqueue_st { + unsigned short epoch; + pqueue q; +} record_pqueue; + +typedef struct hm_fragment_st { + struct hm_header_st msg_header; + unsigned char *fragment; + unsigned char *reassembly; +} hm_fragment; + +typedef struct dtls1_state_st { + unsigned int send_cookie; + unsigned char cookie[DTLS1_COOKIE_LENGTH]; + unsigned char rcvd_cookie[DTLS1_COOKIE_LENGTH]; + unsigned int cookie_len; + /* + * The current data and handshake epoch. This is initially + * undefined, and starts at zero once the initial handshake is + * completed + */ + unsigned short r_epoch; + unsigned short w_epoch; + /* records being received in the current epoch */ + DTLS1_BITMAP bitmap; + /* renegotiation starts a new set of sequence numbers */ + DTLS1_BITMAP next_bitmap; + /* handshake message numbers */ + unsigned short handshake_write_seq; + unsigned short next_handshake_write_seq; + unsigned short handshake_read_seq; + /* save last sequence number for retransmissions */ + unsigned char last_write_sequence[8]; + /* Received handshake records (processed and unprocessed) */ + record_pqueue unprocessed_rcds; + record_pqueue processed_rcds; + /* Buffered handshake messages */ + pqueue buffered_messages; + /* Buffered (sent) handshake records */ + pqueue sent_messages; + /* + * Buffered application records. Only for records between CCS and + * Finished to prevent either protocol violation or unnecessary message + * loss. + */ + record_pqueue buffered_app_data; + /* Is set when listening for new connections with dtls1_listen() */ + unsigned int listen; + unsigned int link_mtu; /* max on-the-wire DTLS packet size */ + unsigned int mtu; /* max DTLS packet size */ + struct hm_header_st w_msg_hdr; + struct hm_header_st r_msg_hdr; + struct dtls1_timeout_st timeout; + /* + * Indicates when the last handshake msg or heartbeat sent will timeout + */ + struct timeval next_timeout; + /* Timeout duration */ + unsigned short timeout_duration; + /* + * storage for Alert/Handshake protocol data received but not yet + * processed by ssl3_read_bytes: + */ + unsigned char alert_fragment[DTLS1_AL_HEADER_LENGTH]; + unsigned int alert_fragment_len; + unsigned char handshake_fragment[DTLS1_HM_HEADER_LENGTH]; + unsigned int handshake_fragment_len; + unsigned int retransmitting; + /* + * Set when the handshake is ready to process peer's ChangeCipherSpec message. + * Cleared after the message has been processed. + */ + unsigned int change_cipher_spec_ok; +# ifndef OPENSSL_NO_SCTP + /* used when SSL_ST_XX_FLUSH is entered */ + int next_state; + int shutdown_received; +# endif +} DTLS1_STATE; + +typedef struct dtls1_record_data_st { + unsigned char *packet; + unsigned int packet_length; + SSL3_BUFFER rbuf; + SSL3_RECORD rrec; +# ifndef OPENSSL_NO_SCTP + struct bio_dgram_sctp_rcvinfo recordinfo; +# endif +} DTLS1_RECORD_DATA; + +# endif + +/* Timeout multipliers (timeout slice is defined in apps/timeouts.h */ +# define DTLS1_TMO_READ_COUNT 2 +# define DTLS1_TMO_WRITE_COUNT 2 + +# define DTLS1_TMO_ALERT_COUNT 12 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/ext/openssl-osx/include/openssl/e_os2.h b/ext/openssl-osx/include/openssl/e_os2.h new file mode 100644 index 00000000..613607f8 --- /dev/null +++ b/ext/openssl-osx/include/openssl/e_os2.h @@ -0,0 +1,322 @@ +/* e_os2.h */ +/* ==================================================================== + * Copyright (c) 1998-2000 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#include + +#ifndef HEADER_E_OS2_H +# define HEADER_E_OS2_H + +#ifdef __cplusplus +extern "C" { +#endif + +/****************************************************************************** + * Detect operating systems. This probably needs completing. + * The result is that at least one OPENSSL_SYS_os macro should be defined. + * However, if none is defined, Unix is assumed. + **/ + +# define OPENSSL_SYS_UNIX + +/* ---------------------- Macintosh, before MacOS X ----------------------- */ +# if defined(__MWERKS__) && defined(macintosh) || defined(OPENSSL_SYSNAME_MAC) +# undef OPENSSL_SYS_UNIX +# define OPENSSL_SYS_MACINTOSH_CLASSIC +# endif + +/* ---------------------- NetWare ----------------------------------------- */ +# if defined(NETWARE) || defined(OPENSSL_SYSNAME_NETWARE) +# undef OPENSSL_SYS_UNIX +# define OPENSSL_SYS_NETWARE +# endif + +/* --------------------- Microsoft operating systems ---------------------- */ + +/* + * Note that MSDOS actually denotes 32-bit environments running on top of + * MS-DOS, such as DJGPP one. + */ +# if defined(OPENSSL_SYSNAME_MSDOS) +# undef OPENSSL_SYS_UNIX +# define OPENSSL_SYS_MSDOS +# endif + +/* + * For 32 bit environment, there seems to be the CygWin environment and then + * all the others that try to do the same thing Microsoft does... + */ +# if defined(OPENSSL_SYSNAME_UWIN) +# undef OPENSSL_SYS_UNIX +# define OPENSSL_SYS_WIN32_UWIN +# else +# if defined(__CYGWIN__) || defined(OPENSSL_SYSNAME_CYGWIN) +# undef OPENSSL_SYS_UNIX +# define OPENSSL_SYS_WIN32_CYGWIN +# else +# if defined(_WIN32) || defined(OPENSSL_SYSNAME_WIN32) +# undef OPENSSL_SYS_UNIX +# define OPENSSL_SYS_WIN32 +# endif +# if defined(OPENSSL_SYSNAME_WINNT) +# undef OPENSSL_SYS_UNIX +# define OPENSSL_SYS_WINNT +# endif +# if defined(OPENSSL_SYSNAME_WINCE) +# undef OPENSSL_SYS_UNIX +# define OPENSSL_SYS_WINCE +# endif +# endif +# endif + +/* Anything that tries to look like Microsoft is "Windows" */ +# if defined(OPENSSL_SYS_WIN32) || defined(OPENSSL_SYS_WINNT) || defined(OPENSSL_SYS_WINCE) +# undef OPENSSL_SYS_UNIX +# define OPENSSL_SYS_WINDOWS +# ifndef OPENSSL_SYS_MSDOS +# define OPENSSL_SYS_MSDOS +# endif +# endif + +/* + * DLL settings. This part is a bit tough, because it's up to the + * application implementor how he or she will link the application, so it + * requires some macro to be used. + */ +# ifdef OPENSSL_SYS_WINDOWS +# ifndef OPENSSL_OPT_WINDLL +# if defined(_WINDLL) /* This is used when building OpenSSL to + * indicate that DLL linkage should be used */ +# define OPENSSL_OPT_WINDLL +# endif +# endif +# endif + +/* ------------------------------- OpenVMS -------------------------------- */ +# if defined(__VMS) || defined(VMS) || defined(OPENSSL_SYSNAME_VMS) +# undef OPENSSL_SYS_UNIX +# define OPENSSL_SYS_VMS +# if defined(__DECC) +# define OPENSSL_SYS_VMS_DECC +# elif defined(__DECCXX) +# define OPENSSL_SYS_VMS_DECC +# define OPENSSL_SYS_VMS_DECCXX +# else +# define OPENSSL_SYS_VMS_NODECC +# endif +# endif + +/* -------------------------------- OS/2 ---------------------------------- */ +# if defined(__EMX__) || defined(__OS2__) +# undef OPENSSL_SYS_UNIX +# define OPENSSL_SYS_OS2 +# endif + +/* -------------------------------- Unix ---------------------------------- */ +# ifdef OPENSSL_SYS_UNIX +# if defined(linux) || defined(__linux__) || defined(OPENSSL_SYSNAME_LINUX) +# define OPENSSL_SYS_LINUX +# endif +# ifdef OPENSSL_SYSNAME_MPE +# define OPENSSL_SYS_MPE +# endif +# ifdef OPENSSL_SYSNAME_SNI +# define OPENSSL_SYS_SNI +# endif +# ifdef OPENSSL_SYSNAME_ULTRASPARC +# define OPENSSL_SYS_ULTRASPARC +# endif +# ifdef OPENSSL_SYSNAME_NEWS4 +# define OPENSSL_SYS_NEWS4 +# endif +# ifdef OPENSSL_SYSNAME_MACOSX +# define OPENSSL_SYS_MACOSX +# endif +# ifdef OPENSSL_SYSNAME_MACOSX_RHAPSODY +# define OPENSSL_SYS_MACOSX_RHAPSODY +# define OPENSSL_SYS_MACOSX +# endif +# ifdef OPENSSL_SYSNAME_SUNOS +# define OPENSSL_SYS_SUNOS +# endif +# if defined(_CRAY) || defined(OPENSSL_SYSNAME_CRAY) +# define OPENSSL_SYS_CRAY +# endif +# if defined(_AIX) || defined(OPENSSL_SYSNAME_AIX) +# define OPENSSL_SYS_AIX +# endif +# endif + +/* -------------------------------- VOS ----------------------------------- */ +# if defined(__VOS__) || defined(OPENSSL_SYSNAME_VOS) +# define OPENSSL_SYS_VOS +# ifdef __HPPA__ +# define OPENSSL_SYS_VOS_HPPA +# endif +# ifdef __IA32__ +# define OPENSSL_SYS_VOS_IA32 +# endif +# endif + +/* ------------------------------ VxWorks --------------------------------- */ +# ifdef OPENSSL_SYSNAME_VXWORKS +# define OPENSSL_SYS_VXWORKS +# endif + +/* -------------------------------- BeOS ---------------------------------- */ +# if defined(__BEOS__) +# define OPENSSL_SYS_BEOS +# include +# if defined(BONE_VERSION) +# define OPENSSL_SYS_BEOS_BONE +# else +# define OPENSSL_SYS_BEOS_R5 +# endif +# endif + +/** + * That's it for OS-specific stuff + *****************************************************************************/ + +/* Specials for I/O an exit */ +# ifdef OPENSSL_SYS_MSDOS +# define OPENSSL_UNISTD_IO +# define OPENSSL_DECLARE_EXIT extern void exit(int); +# else +# define OPENSSL_UNISTD_IO OPENSSL_UNISTD +# define OPENSSL_DECLARE_EXIT /* declared in unistd.h */ +# endif + +/*- + * Definitions of OPENSSL_GLOBAL and OPENSSL_EXTERN, to define and declare + * certain global symbols that, with some compilers under VMS, have to be + * defined and declared explicitely with globaldef and globalref. + * Definitions of OPENSSL_EXPORT and OPENSSL_IMPORT, to define and declare + * DLL exports and imports for compilers under Win32. These are a little + * more complicated to use. Basically, for any library that exports some + * global variables, the following code must be present in the header file + * that declares them, before OPENSSL_EXTERN is used: + * + * #ifdef SOME_BUILD_FLAG_MACRO + * # undef OPENSSL_EXTERN + * # define OPENSSL_EXTERN OPENSSL_EXPORT + * #endif + * + * The default is to have OPENSSL_EXPORT, OPENSSL_IMPORT and OPENSSL_GLOBAL + * have some generally sensible values, and for OPENSSL_EXTERN to have the + * value OPENSSL_IMPORT. + */ + +# if defined(OPENSSL_SYS_VMS_NODECC) +# define OPENSSL_EXPORT globalref +# define OPENSSL_IMPORT globalref +# define OPENSSL_GLOBAL globaldef +# elif defined(OPENSSL_SYS_WINDOWS) && defined(OPENSSL_OPT_WINDLL) +# define OPENSSL_EXPORT extern __declspec(dllexport) +# define OPENSSL_IMPORT extern __declspec(dllimport) +# define OPENSSL_GLOBAL +# else +# define OPENSSL_EXPORT extern +# define OPENSSL_IMPORT extern +# define OPENSSL_GLOBAL +# endif +# define OPENSSL_EXTERN OPENSSL_IMPORT + +/*- + * Macros to allow global variables to be reached through function calls when + * required (if a shared library version requires it, for example. + * The way it's done allows definitions like this: + * + * // in foobar.c + * OPENSSL_IMPLEMENT_GLOBAL(int,foobar,0) + * // in foobar.h + * OPENSSL_DECLARE_GLOBAL(int,foobar); + * #define foobar OPENSSL_GLOBAL_REF(foobar) + */ +# ifdef OPENSSL_EXPORT_VAR_AS_FUNCTION +# define OPENSSL_IMPLEMENT_GLOBAL(type,name,value) \ + type *_shadow_##name(void) \ + { static type _hide_##name=value; return &_hide_##name; } +# define OPENSSL_DECLARE_GLOBAL(type,name) type *_shadow_##name(void) +# define OPENSSL_GLOBAL_REF(name) (*(_shadow_##name())) +# else +# define OPENSSL_IMPLEMENT_GLOBAL(type,name,value) OPENSSL_GLOBAL type _shadow_##name=value; +# define OPENSSL_DECLARE_GLOBAL(type,name) OPENSSL_EXPORT type _shadow_##name +# define OPENSSL_GLOBAL_REF(name) _shadow_##name +# endif + +# if defined(OPENSSL_SYS_MACINTOSH_CLASSIC) && macintosh==1 && !defined(MAC_OS_GUSI_SOURCE) +# define ossl_ssize_t long +# endif + +# ifdef OPENSSL_SYS_MSDOS +# define ossl_ssize_t long +# endif + +# if defined(NeXT) || defined(OPENSSL_SYS_NEWS4) || defined(OPENSSL_SYS_SUNOS) +# define ssize_t int +# endif + +# if defined(__ultrix) && !defined(ssize_t) +# define ossl_ssize_t int +# endif + +# ifndef ossl_ssize_t +# define ossl_ssize_t ssize_t +# endif + +#ifdef __cplusplus +} +#endif +#endif diff --git a/ext/openssl-osx/include/openssl/ec.h b/ext/openssl-osx/include/openssl/ec.h new file mode 100644 index 00000000..98edfdf8 --- /dev/null +++ b/ext/openssl-osx/include/openssl/ec.h @@ -0,0 +1,1281 @@ +/* crypto/ec/ec.h */ +/* + * Originally written by Bodo Moeller for the OpenSSL project. + */ +/** + * \file crypto/ec/ec.h Include file for the OpenSSL EC functions + * \author Originally written by Bodo Moeller for the OpenSSL project + */ +/* ==================================================================== + * Copyright (c) 1998-2005 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +/* ==================================================================== + * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. + * + * Portions of the attached software ("Contribution") are developed by + * SUN MICROSYSTEMS, INC., and are contributed to the OpenSSL project. + * + * The Contribution is licensed pursuant to the OpenSSL open source + * license provided above. + * + * The elliptic curve binary polynomial software is originally written by + * Sheueling Chang Shantz and Douglas Stebila of Sun Microsystems Laboratories. + * + */ + +#ifndef HEADER_EC_H +# define HEADER_EC_H + +# include + +# ifdef OPENSSL_NO_EC +# error EC is disabled. +# endif + +# include +# include +# ifndef OPENSSL_NO_DEPRECATED +# include +# endif + +# ifdef __cplusplus +extern "C" { +# elif defined(__SUNPRO_C) +# if __SUNPRO_C >= 0x520 +# pragma error_messages (off,E_ARRAY_OF_INCOMPLETE_NONAME,E_ARRAY_OF_INCOMPLETE) +# endif +# endif + +# ifndef OPENSSL_ECC_MAX_FIELD_BITS +# define OPENSSL_ECC_MAX_FIELD_BITS 661 +# endif + +/** Enum for the point conversion form as defined in X9.62 (ECDSA) + * for the encoding of a elliptic curve point (x,y) */ +typedef enum { + /** the point is encoded as z||x, where the octet z specifies + * which solution of the quadratic equation y is */ + POINT_CONVERSION_COMPRESSED = 2, + /** the point is encoded as z||x||y, where z is the octet 0x02 */ + POINT_CONVERSION_UNCOMPRESSED = 4, + /** the point is encoded as z||x||y, where the octet z specifies + * which solution of the quadratic equation y is */ + POINT_CONVERSION_HYBRID = 6 +} point_conversion_form_t; + +typedef struct ec_method_st EC_METHOD; + +typedef struct ec_group_st + /*- + EC_METHOD *meth; + -- field definition + -- curve coefficients + -- optional generator with associated information (order, cofactor) + -- optional extra data (precomputed table for fast computation of multiples of generator) + -- ASN1 stuff + */ + EC_GROUP; + +typedef struct ec_point_st EC_POINT; + +/********************************************************************/ +/* EC_METHODs for curves over GF(p) */ +/********************************************************************/ + +/** Returns the basic GFp ec methods which provides the basis for the + * optimized methods. + * \return EC_METHOD object + */ +const EC_METHOD *EC_GFp_simple_method(void); + +/** Returns GFp methods using montgomery multiplication. + * \return EC_METHOD object + */ +const EC_METHOD *EC_GFp_mont_method(void); + +/** Returns GFp methods using optimized methods for NIST recommended curves + * \return EC_METHOD object + */ +const EC_METHOD *EC_GFp_nist_method(void); + +# ifndef OPENSSL_NO_EC_NISTP_64_GCC_128 +/** Returns 64-bit optimized methods for nistp224 + * \return EC_METHOD object + */ +const EC_METHOD *EC_GFp_nistp224_method(void); + +/** Returns 64-bit optimized methods for nistp256 + * \return EC_METHOD object + */ +const EC_METHOD *EC_GFp_nistp256_method(void); + +/** Returns 64-bit optimized methods for nistp521 + * \return EC_METHOD object + */ +const EC_METHOD *EC_GFp_nistp521_method(void); +# endif + +# ifndef OPENSSL_NO_EC2M +/********************************************************************/ +/* EC_METHOD for curves over GF(2^m) */ +/********************************************************************/ + +/** Returns the basic GF2m ec method + * \return EC_METHOD object + */ +const EC_METHOD *EC_GF2m_simple_method(void); + +# endif + +/********************************************************************/ +/* EC_GROUP functions */ +/********************************************************************/ + +/** Creates a new EC_GROUP object + * \param meth EC_METHOD to use + * \return newly created EC_GROUP object or NULL in case of an error. + */ +EC_GROUP *EC_GROUP_new(const EC_METHOD *meth); + +/** Frees a EC_GROUP object + * \param group EC_GROUP object to be freed. + */ +void EC_GROUP_free(EC_GROUP *group); + +/** Clears and frees a EC_GROUP object + * \param group EC_GROUP object to be cleared and freed. + */ +void EC_GROUP_clear_free(EC_GROUP *group); + +/** Copies EC_GROUP objects. Note: both EC_GROUPs must use the same EC_METHOD. + * \param dst destination EC_GROUP object + * \param src source EC_GROUP object + * \return 1 on success and 0 if an error occurred. + */ +int EC_GROUP_copy(EC_GROUP *dst, const EC_GROUP *src); + +/** Creates a new EC_GROUP object and copies the copies the content + * form src to the newly created EC_KEY object + * \param src source EC_GROUP object + * \return newly created EC_GROUP object or NULL in case of an error. + */ +EC_GROUP *EC_GROUP_dup(const EC_GROUP *src); + +/** Returns the EC_METHOD of the EC_GROUP object. + * \param group EC_GROUP object + * \return EC_METHOD used in this EC_GROUP object. + */ +const EC_METHOD *EC_GROUP_method_of(const EC_GROUP *group); + +/** Returns the field type of the EC_METHOD. + * \param meth EC_METHOD object + * \return NID of the underlying field type OID. + */ +int EC_METHOD_get_field_type(const EC_METHOD *meth); + +/** Sets the generator and it's order/cofactor of a EC_GROUP object. + * \param group EC_GROUP object + * \param generator EC_POINT object with the generator. + * \param order the order of the group generated by the generator. + * \param cofactor the index of the sub-group generated by the generator + * in the group of all points on the elliptic curve. + * \return 1 on success and 0 if an error occured + */ +int EC_GROUP_set_generator(EC_GROUP *group, const EC_POINT *generator, + const BIGNUM *order, const BIGNUM *cofactor); + +/** Returns the generator of a EC_GROUP object. + * \param group EC_GROUP object + * \return the currently used generator (possibly NULL). + */ +const EC_POINT *EC_GROUP_get0_generator(const EC_GROUP *group); + +/** Returns the montgomery data for order(Generator) + * \param group EC_GROUP object + * \return the currently used generator (possibly NULL). +*/ +BN_MONT_CTX *EC_GROUP_get_mont_data(const EC_GROUP *group); + +/** Gets the order of a EC_GROUP + * \param group EC_GROUP object + * \param order BIGNUM to which the order is copied + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_GROUP_get_order(const EC_GROUP *group, BIGNUM *order, BN_CTX *ctx); + +/** Gets the cofactor of a EC_GROUP + * \param group EC_GROUP object + * \param cofactor BIGNUM to which the cofactor is copied + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_GROUP_get_cofactor(const EC_GROUP *group, BIGNUM *cofactor, + BN_CTX *ctx); + +/** Sets the name of a EC_GROUP object + * \param group EC_GROUP object + * \param nid NID of the curve name OID + */ +void EC_GROUP_set_curve_name(EC_GROUP *group, int nid); + +/** Returns the curve name of a EC_GROUP object + * \param group EC_GROUP object + * \return NID of the curve name OID or 0 if not set. + */ +int EC_GROUP_get_curve_name(const EC_GROUP *group); + +void EC_GROUP_set_asn1_flag(EC_GROUP *group, int flag); +int EC_GROUP_get_asn1_flag(const EC_GROUP *group); + +void EC_GROUP_set_point_conversion_form(EC_GROUP *group, + point_conversion_form_t form); +point_conversion_form_t EC_GROUP_get_point_conversion_form(const EC_GROUP *); + +unsigned char *EC_GROUP_get0_seed(const EC_GROUP *x); +size_t EC_GROUP_get_seed_len(const EC_GROUP *); +size_t EC_GROUP_set_seed(EC_GROUP *, const unsigned char *, size_t len); + +/** Sets the parameter of a ec over GFp defined by y^2 = x^3 + a*x + b + * \param group EC_GROUP object + * \param p BIGNUM with the prime number + * \param a BIGNUM with parameter a of the equation + * \param b BIGNUM with parameter b of the equation + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_GROUP_set_curve_GFp(EC_GROUP *group, const BIGNUM *p, const BIGNUM *a, + const BIGNUM *b, BN_CTX *ctx); + +/** Gets the parameter of the ec over GFp defined by y^2 = x^3 + a*x + b + * \param group EC_GROUP object + * \param p BIGNUM for the prime number + * \param a BIGNUM for parameter a of the equation + * \param b BIGNUM for parameter b of the equation + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_GROUP_get_curve_GFp(const EC_GROUP *group, BIGNUM *p, BIGNUM *a, + BIGNUM *b, BN_CTX *ctx); + +# ifndef OPENSSL_NO_EC2M +/** Sets the parameter of a ec over GF2m defined by y^2 + x*y = x^3 + a*x^2 + b + * \param group EC_GROUP object + * \param p BIGNUM with the polynomial defining the underlying field + * \param a BIGNUM with parameter a of the equation + * \param b BIGNUM with parameter b of the equation + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_GROUP_set_curve_GF2m(EC_GROUP *group, const BIGNUM *p, const BIGNUM *a, + const BIGNUM *b, BN_CTX *ctx); + +/** Gets the parameter of the ec over GF2m defined by y^2 + x*y = x^3 + a*x^2 + b + * \param group EC_GROUP object + * \param p BIGNUM for the polynomial defining the underlying field + * \param a BIGNUM for parameter a of the equation + * \param b BIGNUM for parameter b of the equation + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_GROUP_get_curve_GF2m(const EC_GROUP *group, BIGNUM *p, BIGNUM *a, + BIGNUM *b, BN_CTX *ctx); +# endif +/** Returns the number of bits needed to represent a field element + * \param group EC_GROUP object + * \return number of bits needed to represent a field element + */ +int EC_GROUP_get_degree(const EC_GROUP *group); + +/** Checks whether the parameter in the EC_GROUP define a valid ec group + * \param group EC_GROUP object + * \param ctx BN_CTX object (optional) + * \return 1 if group is a valid ec group and 0 otherwise + */ +int EC_GROUP_check(const EC_GROUP *group, BN_CTX *ctx); + +/** Checks whether the discriminant of the elliptic curve is zero or not + * \param group EC_GROUP object + * \param ctx BN_CTX object (optional) + * \return 1 if the discriminant is not zero and 0 otherwise + */ +int EC_GROUP_check_discriminant(const EC_GROUP *group, BN_CTX *ctx); + +/** Compares two EC_GROUP objects + * \param a first EC_GROUP object + * \param b second EC_GROUP object + * \param ctx BN_CTX object (optional) + * \return 0 if both groups are equal and 1 otherwise + */ +int EC_GROUP_cmp(const EC_GROUP *a, const EC_GROUP *b, BN_CTX *ctx); + +/* + * EC_GROUP_new_GF*() calls EC_GROUP_new() and EC_GROUP_set_GF*() after + * choosing an appropriate EC_METHOD + */ + +/** Creates a new EC_GROUP object with the specified parameters defined + * over GFp (defined by the equation y^2 = x^3 + a*x + b) + * \param p BIGNUM with the prime number + * \param a BIGNUM with the parameter a of the equation + * \param b BIGNUM with the parameter b of the equation + * \param ctx BN_CTX object (optional) + * \return newly created EC_GROUP object with the specified parameters + */ +EC_GROUP *EC_GROUP_new_curve_GFp(const BIGNUM *p, const BIGNUM *a, + const BIGNUM *b, BN_CTX *ctx); +# ifndef OPENSSL_NO_EC2M +/** Creates a new EC_GROUP object with the specified parameters defined + * over GF2m (defined by the equation y^2 + x*y = x^3 + a*x^2 + b) + * \param p BIGNUM with the polynomial defining the underlying field + * \param a BIGNUM with the parameter a of the equation + * \param b BIGNUM with the parameter b of the equation + * \param ctx BN_CTX object (optional) + * \return newly created EC_GROUP object with the specified parameters + */ +EC_GROUP *EC_GROUP_new_curve_GF2m(const BIGNUM *p, const BIGNUM *a, + const BIGNUM *b, BN_CTX *ctx); +# endif +/** Creates a EC_GROUP object with a curve specified by a NID + * \param nid NID of the OID of the curve name + * \return newly created EC_GROUP object with specified curve or NULL + * if an error occurred + */ +EC_GROUP *EC_GROUP_new_by_curve_name(int nid); + +/********************************************************************/ +/* handling of internal curves */ +/********************************************************************/ + +typedef struct { + int nid; + const char *comment; +} EC_builtin_curve; + +/* + * EC_builtin_curves(EC_builtin_curve *r, size_t size) returns number of all + * available curves or zero if a error occurred. In case r ist not zero + * nitems EC_builtin_curve structures are filled with the data of the first + * nitems internal groups + */ +size_t EC_get_builtin_curves(EC_builtin_curve *r, size_t nitems); + +const char *EC_curve_nid2nist(int nid); +int EC_curve_nist2nid(const char *name); + +/********************************************************************/ +/* EC_POINT functions */ +/********************************************************************/ + +/** Creates a new EC_POINT object for the specified EC_GROUP + * \param group EC_GROUP the underlying EC_GROUP object + * \return newly created EC_POINT object or NULL if an error occurred + */ +EC_POINT *EC_POINT_new(const EC_GROUP *group); + +/** Frees a EC_POINT object + * \param point EC_POINT object to be freed + */ +void EC_POINT_free(EC_POINT *point); + +/** Clears and frees a EC_POINT object + * \param point EC_POINT object to be cleared and freed + */ +void EC_POINT_clear_free(EC_POINT *point); + +/** Copies EC_POINT object + * \param dst destination EC_POINT object + * \param src source EC_POINT object + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_copy(EC_POINT *dst, const EC_POINT *src); + +/** Creates a new EC_POINT object and copies the content of the supplied + * EC_POINT + * \param src source EC_POINT object + * \param group underlying the EC_GROUP object + * \return newly created EC_POINT object or NULL if an error occurred + */ +EC_POINT *EC_POINT_dup(const EC_POINT *src, const EC_GROUP *group); + +/** Returns the EC_METHOD used in EC_POINT object + * \param point EC_POINT object + * \return the EC_METHOD used + */ +const EC_METHOD *EC_POINT_method_of(const EC_POINT *point); + +/** Sets a point to infinity (neutral element) + * \param group underlying EC_GROUP object + * \param point EC_POINT to set to infinity + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_set_to_infinity(const EC_GROUP *group, EC_POINT *point); + +/** Sets the jacobian projective coordinates of a EC_POINT over GFp + * \param group underlying EC_GROUP object + * \param p EC_POINT object + * \param x BIGNUM with the x-coordinate + * \param y BIGNUM with the y-coordinate + * \param z BIGNUM with the z-coordinate + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_set_Jprojective_coordinates_GFp(const EC_GROUP *group, + EC_POINT *p, const BIGNUM *x, + const BIGNUM *y, const BIGNUM *z, + BN_CTX *ctx); + +/** Gets the jacobian projective coordinates of a EC_POINT over GFp + * \param group underlying EC_GROUP object + * \param p EC_POINT object + * \param x BIGNUM for the x-coordinate + * \param y BIGNUM for the y-coordinate + * \param z BIGNUM for the z-coordinate + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_get_Jprojective_coordinates_GFp(const EC_GROUP *group, + const EC_POINT *p, BIGNUM *x, + BIGNUM *y, BIGNUM *z, + BN_CTX *ctx); + +/** Sets the affine coordinates of a EC_POINT over GFp + * \param group underlying EC_GROUP object + * \param p EC_POINT object + * \param x BIGNUM with the x-coordinate + * \param y BIGNUM with the y-coordinate + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_set_affine_coordinates_GFp(const EC_GROUP *group, EC_POINT *p, + const BIGNUM *x, const BIGNUM *y, + BN_CTX *ctx); + +/** Gets the affine coordinates of a EC_POINT over GFp + * \param group underlying EC_GROUP object + * \param p EC_POINT object + * \param x BIGNUM for the x-coordinate + * \param y BIGNUM for the y-coordinate + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_get_affine_coordinates_GFp(const EC_GROUP *group, + const EC_POINT *p, BIGNUM *x, + BIGNUM *y, BN_CTX *ctx); + +/** Sets the x9.62 compressed coordinates of a EC_POINT over GFp + * \param group underlying EC_GROUP object + * \param p EC_POINT object + * \param x BIGNUM with x-coordinate + * \param y_bit integer with the y-Bit (either 0 or 1) + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_set_compressed_coordinates_GFp(const EC_GROUP *group, + EC_POINT *p, const BIGNUM *x, + int y_bit, BN_CTX *ctx); +# ifndef OPENSSL_NO_EC2M +/** Sets the affine coordinates of a EC_POINT over GF2m + * \param group underlying EC_GROUP object + * \param p EC_POINT object + * \param x BIGNUM with the x-coordinate + * \param y BIGNUM with the y-coordinate + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_set_affine_coordinates_GF2m(const EC_GROUP *group, EC_POINT *p, + const BIGNUM *x, const BIGNUM *y, + BN_CTX *ctx); + +/** Gets the affine coordinates of a EC_POINT over GF2m + * \param group underlying EC_GROUP object + * \param p EC_POINT object + * \param x BIGNUM for the x-coordinate + * \param y BIGNUM for the y-coordinate + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_get_affine_coordinates_GF2m(const EC_GROUP *group, + const EC_POINT *p, BIGNUM *x, + BIGNUM *y, BN_CTX *ctx); + +/** Sets the x9.62 compressed coordinates of a EC_POINT over GF2m + * \param group underlying EC_GROUP object + * \param p EC_POINT object + * \param x BIGNUM with x-coordinate + * \param y_bit integer with the y-Bit (either 0 or 1) + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_set_compressed_coordinates_GF2m(const EC_GROUP *group, + EC_POINT *p, const BIGNUM *x, + int y_bit, BN_CTX *ctx); +# endif +/** Encodes a EC_POINT object to a octet string + * \param group underlying EC_GROUP object + * \param p EC_POINT object + * \param form point conversion form + * \param buf memory buffer for the result. If NULL the function returns + * required buffer size. + * \param len length of the memory buffer + * \param ctx BN_CTX object (optional) + * \return the length of the encoded octet string or 0 if an error occurred + */ +size_t EC_POINT_point2oct(const EC_GROUP *group, const EC_POINT *p, + point_conversion_form_t form, + unsigned char *buf, size_t len, BN_CTX *ctx); + +/** Decodes a EC_POINT from a octet string + * \param group underlying EC_GROUP object + * \param p EC_POINT object + * \param buf memory buffer with the encoded ec point + * \param len length of the encoded ec point + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_oct2point(const EC_GROUP *group, EC_POINT *p, + const unsigned char *buf, size_t len, BN_CTX *ctx); + +/* other interfaces to point2oct/oct2point: */ +BIGNUM *EC_POINT_point2bn(const EC_GROUP *, const EC_POINT *, + point_conversion_form_t form, BIGNUM *, BN_CTX *); +EC_POINT *EC_POINT_bn2point(const EC_GROUP *, const BIGNUM *, + EC_POINT *, BN_CTX *); +char *EC_POINT_point2hex(const EC_GROUP *, const EC_POINT *, + point_conversion_form_t form, BN_CTX *); +EC_POINT *EC_POINT_hex2point(const EC_GROUP *, const char *, + EC_POINT *, BN_CTX *); + +/********************************************************************/ +/* functions for doing EC_POINT arithmetic */ +/********************************************************************/ + +/** Computes the sum of two EC_POINT + * \param group underlying EC_GROUP object + * \param r EC_POINT object for the result (r = a + b) + * \param a EC_POINT object with the first summand + * \param b EC_POINT object with the second summand + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_add(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, + const EC_POINT *b, BN_CTX *ctx); + +/** Computes the double of a EC_POINT + * \param group underlying EC_GROUP object + * \param r EC_POINT object for the result (r = 2 * a) + * \param a EC_POINT object + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_dbl(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, + BN_CTX *ctx); + +/** Computes the inverse of a EC_POINT + * \param group underlying EC_GROUP object + * \param a EC_POINT object to be inverted (it's used for the result as well) + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_invert(const EC_GROUP *group, EC_POINT *a, BN_CTX *ctx); + +/** Checks whether the point is the neutral element of the group + * \param group the underlying EC_GROUP object + * \param p EC_POINT object + * \return 1 if the point is the neutral element and 0 otherwise + */ +int EC_POINT_is_at_infinity(const EC_GROUP *group, const EC_POINT *p); + +/** Checks whether the point is on the curve + * \param group underlying EC_GROUP object + * \param point EC_POINT object to check + * \param ctx BN_CTX object (optional) + * \return 1 if point if on the curve and 0 otherwise + */ +int EC_POINT_is_on_curve(const EC_GROUP *group, const EC_POINT *point, + BN_CTX *ctx); + +/** Compares two EC_POINTs + * \param group underlying EC_GROUP object + * \param a first EC_POINT object + * \param b second EC_POINT object + * \param ctx BN_CTX object (optional) + * \return 0 if both points are equal and a value != 0 otherwise + */ +int EC_POINT_cmp(const EC_GROUP *group, const EC_POINT *a, const EC_POINT *b, + BN_CTX *ctx); + +int EC_POINT_make_affine(const EC_GROUP *group, EC_POINT *point, BN_CTX *ctx); +int EC_POINTs_make_affine(const EC_GROUP *group, size_t num, + EC_POINT *points[], BN_CTX *ctx); + +/** Computes r = generator * n sum_{i=0}^{num-1} p[i] * m[i] + * \param group underlying EC_GROUP object + * \param r EC_POINT object for the result + * \param n BIGNUM with the multiplier for the group generator (optional) + * \param num number futher summands + * \param p array of size num of EC_POINT objects + * \param m array of size num of BIGNUM objects + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINTs_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *n, + size_t num, const EC_POINT *p[], const BIGNUM *m[], + BN_CTX *ctx); + +/** Computes r = generator * n + q * m + * \param group underlying EC_GROUP object + * \param r EC_POINT object for the result + * \param n BIGNUM with the multiplier for the group generator (optional) + * \param q EC_POINT object with the first factor of the second summand + * \param m BIGNUM with the second factor of the second summand + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *n, + const EC_POINT *q, const BIGNUM *m, BN_CTX *ctx); + +/** Stores multiples of generator for faster point multiplication + * \param group EC_GROUP object + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_GROUP_precompute_mult(EC_GROUP *group, BN_CTX *ctx); + +/** Reports whether a precomputation has been done + * \param group EC_GROUP object + * \return 1 if a pre-computation has been done and 0 otherwise + */ +int EC_GROUP_have_precompute_mult(const EC_GROUP *group); + +/********************************************************************/ +/* ASN1 stuff */ +/********************************************************************/ + +/* + * EC_GROUP_get_basis_type() returns the NID of the basis type used to + * represent the field elements + */ +int EC_GROUP_get_basis_type(const EC_GROUP *); +# ifndef OPENSSL_NO_EC2M +int EC_GROUP_get_trinomial_basis(const EC_GROUP *, unsigned int *k); +int EC_GROUP_get_pentanomial_basis(const EC_GROUP *, unsigned int *k1, + unsigned int *k2, unsigned int *k3); +# endif + +# define OPENSSL_EC_NAMED_CURVE 0x001 + +typedef struct ecpk_parameters_st ECPKPARAMETERS; + +EC_GROUP *d2i_ECPKParameters(EC_GROUP **, const unsigned char **in, long len); +int i2d_ECPKParameters(const EC_GROUP *, unsigned char **out); + +# define d2i_ECPKParameters_bio(bp,x) ASN1_d2i_bio_of(EC_GROUP,NULL,d2i_ECPKParameters,bp,x) +# define i2d_ECPKParameters_bio(bp,x) ASN1_i2d_bio_of_const(EC_GROUP,i2d_ECPKParameters,bp,x) +# define d2i_ECPKParameters_fp(fp,x) (EC_GROUP *)ASN1_d2i_fp(NULL, \ + (char *(*)())d2i_ECPKParameters,(fp),(unsigned char **)(x)) +# define i2d_ECPKParameters_fp(fp,x) ASN1_i2d_fp(i2d_ECPKParameters,(fp), \ + (unsigned char *)(x)) + +# ifndef OPENSSL_NO_BIO +int ECPKParameters_print(BIO *bp, const EC_GROUP *x, int off); +# endif +# ifndef OPENSSL_NO_FP_API +int ECPKParameters_print_fp(FILE *fp, const EC_GROUP *x, int off); +# endif + +/********************************************************************/ +/* EC_KEY functions */ +/********************************************************************/ + +typedef struct ec_key_st EC_KEY; + +/* some values for the encoding_flag */ +# define EC_PKEY_NO_PARAMETERS 0x001 +# define EC_PKEY_NO_PUBKEY 0x002 + +/* some values for the flags field */ +# define EC_FLAG_NON_FIPS_ALLOW 0x1 +# define EC_FLAG_FIPS_CHECKED 0x2 + +/** Creates a new EC_KEY object. + * \return EC_KEY object or NULL if an error occurred. + */ +EC_KEY *EC_KEY_new(void); + +int EC_KEY_get_flags(const EC_KEY *key); + +void EC_KEY_set_flags(EC_KEY *key, int flags); + +void EC_KEY_clear_flags(EC_KEY *key, int flags); + +/** Creates a new EC_KEY object using a named curve as underlying + * EC_GROUP object. + * \param nid NID of the named curve. + * \return EC_KEY object or NULL if an error occurred. + */ +EC_KEY *EC_KEY_new_by_curve_name(int nid); + +/** Frees a EC_KEY object. + * \param key EC_KEY object to be freed. + */ +void EC_KEY_free(EC_KEY *key); + +/** Copies a EC_KEY object. + * \param dst destination EC_KEY object + * \param src src EC_KEY object + * \return dst or NULL if an error occurred. + */ +EC_KEY *EC_KEY_copy(EC_KEY *dst, const EC_KEY *src); + +/** Creates a new EC_KEY object and copies the content from src to it. + * \param src the source EC_KEY object + * \return newly created EC_KEY object or NULL if an error occurred. + */ +EC_KEY *EC_KEY_dup(const EC_KEY *src); + +/** Increases the internal reference count of a EC_KEY object. + * \param key EC_KEY object + * \return 1 on success and 0 if an error occurred. + */ +int EC_KEY_up_ref(EC_KEY *key); + +/** Returns the EC_GROUP object of a EC_KEY object + * \param key EC_KEY object + * \return the EC_GROUP object (possibly NULL). + */ +const EC_GROUP *EC_KEY_get0_group(const EC_KEY *key); + +/** Sets the EC_GROUP of a EC_KEY object. + * \param key EC_KEY object + * \param group EC_GROUP to use in the EC_KEY object (note: the EC_KEY + * object will use an own copy of the EC_GROUP). + * \return 1 on success and 0 if an error occurred. + */ +int EC_KEY_set_group(EC_KEY *key, const EC_GROUP *group); + +/** Returns the private key of a EC_KEY object. + * \param key EC_KEY object + * \return a BIGNUM with the private key (possibly NULL). + */ +const BIGNUM *EC_KEY_get0_private_key(const EC_KEY *key); + +/** Sets the private key of a EC_KEY object. + * \param key EC_KEY object + * \param prv BIGNUM with the private key (note: the EC_KEY object + * will use an own copy of the BIGNUM). + * \return 1 on success and 0 if an error occurred. + */ +int EC_KEY_set_private_key(EC_KEY *key, const BIGNUM *prv); + +/** Returns the public key of a EC_KEY object. + * \param key the EC_KEY object + * \return a EC_POINT object with the public key (possibly NULL) + */ +const EC_POINT *EC_KEY_get0_public_key(const EC_KEY *key); + +/** Sets the public key of a EC_KEY object. + * \param key EC_KEY object + * \param pub EC_POINT object with the public key (note: the EC_KEY object + * will use an own copy of the EC_POINT object). + * \return 1 on success and 0 if an error occurred. + */ +int EC_KEY_set_public_key(EC_KEY *key, const EC_POINT *pub); + +unsigned EC_KEY_get_enc_flags(const EC_KEY *key); +void EC_KEY_set_enc_flags(EC_KEY *eckey, unsigned int flags); +point_conversion_form_t EC_KEY_get_conv_form(const EC_KEY *key); +void EC_KEY_set_conv_form(EC_KEY *eckey, point_conversion_form_t cform); +/* functions to set/get method specific data */ +void *EC_KEY_get_key_method_data(EC_KEY *key, + void *(*dup_func) (void *), + void (*free_func) (void *), + void (*clear_free_func) (void *)); +/** Sets the key method data of an EC_KEY object, if none has yet been set. + * \param key EC_KEY object + * \param data opaque data to install. + * \param dup_func a function that duplicates |data|. + * \param free_func a function that frees |data|. + * \param clear_free_func a function that wipes and frees |data|. + * \return the previously set data pointer, or NULL if |data| was inserted. + */ +void *EC_KEY_insert_key_method_data(EC_KEY *key, void *data, + void *(*dup_func) (void *), + void (*free_func) (void *), + void (*clear_free_func) (void *)); +/* wrapper functions for the underlying EC_GROUP object */ +void EC_KEY_set_asn1_flag(EC_KEY *eckey, int asn1_flag); + +/** Creates a table of pre-computed multiples of the generator to + * accelerate further EC_KEY operations. + * \param key EC_KEY object + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occurred. + */ +int EC_KEY_precompute_mult(EC_KEY *key, BN_CTX *ctx); + +/** Creates a new ec private (and optional a new public) key. + * \param key EC_KEY object + * \return 1 on success and 0 if an error occurred. + */ +int EC_KEY_generate_key(EC_KEY *key); + +/** Verifies that a private and/or public key is valid. + * \param key the EC_KEY object + * \return 1 on success and 0 otherwise. + */ +int EC_KEY_check_key(const EC_KEY *key); + +/** Sets a public key from affine coordindates performing + * neccessary NIST PKV tests. + * \param key the EC_KEY object + * \param x public key x coordinate + * \param y public key y coordinate + * \return 1 on success and 0 otherwise. + */ +int EC_KEY_set_public_key_affine_coordinates(EC_KEY *key, BIGNUM *x, + BIGNUM *y); + +/********************************************************************/ +/* de- and encoding functions for SEC1 ECPrivateKey */ +/********************************************************************/ + +/** Decodes a private key from a memory buffer. + * \param key a pointer to a EC_KEY object which should be used (or NULL) + * \param in pointer to memory with the DER encoded private key + * \param len length of the DER encoded private key + * \return the decoded private key or NULL if an error occurred. + */ +EC_KEY *d2i_ECPrivateKey(EC_KEY **key, const unsigned char **in, long len); + +/** Encodes a private key object and stores the result in a buffer. + * \param key the EC_KEY object to encode + * \param out the buffer for the result (if NULL the function returns number + * of bytes needed). + * \return 1 on success and 0 if an error occurred. + */ +int i2d_ECPrivateKey(EC_KEY *key, unsigned char **out); + +/********************************************************************/ +/* de- and encoding functions for EC parameters */ +/********************************************************************/ + +/** Decodes ec parameter from a memory buffer. + * \param key a pointer to a EC_KEY object which should be used (or NULL) + * \param in pointer to memory with the DER encoded ec parameters + * \param len length of the DER encoded ec parameters + * \return a EC_KEY object with the decoded parameters or NULL if an error + * occurred. + */ +EC_KEY *d2i_ECParameters(EC_KEY **key, const unsigned char **in, long len); + +/** Encodes ec parameter and stores the result in a buffer. + * \param key the EC_KEY object with ec paramters to encode + * \param out the buffer for the result (if NULL the function returns number + * of bytes needed). + * \return 1 on success and 0 if an error occurred. + */ +int i2d_ECParameters(EC_KEY *key, unsigned char **out); + +/********************************************************************/ +/* de- and encoding functions for EC public key */ +/* (octet string, not DER -- hence 'o2i' and 'i2o') */ +/********************************************************************/ + +/** Decodes a ec public key from a octet string. + * \param key a pointer to a EC_KEY object which should be used + * \param in memory buffer with the encoded public key + * \param len length of the encoded public key + * \return EC_KEY object with decoded public key or NULL if an error + * occurred. + */ +EC_KEY *o2i_ECPublicKey(EC_KEY **key, const unsigned char **in, long len); + +/** Encodes a ec public key in an octet string. + * \param key the EC_KEY object with the public key + * \param out the buffer for the result (if NULL the function returns number + * of bytes needed). + * \return 1 on success and 0 if an error occurred + */ +int i2o_ECPublicKey(EC_KEY *key, unsigned char **out); + +# ifndef OPENSSL_NO_BIO +/** Prints out the ec parameters on human readable form. + * \param bp BIO object to which the information is printed + * \param key EC_KEY object + * \return 1 on success and 0 if an error occurred + */ +int ECParameters_print(BIO *bp, const EC_KEY *key); + +/** Prints out the contents of a EC_KEY object + * \param bp BIO object to which the information is printed + * \param key EC_KEY object + * \param off line offset + * \return 1 on success and 0 if an error occurred + */ +int EC_KEY_print(BIO *bp, const EC_KEY *key, int off); + +# endif +# ifndef OPENSSL_NO_FP_API +/** Prints out the ec parameters on human readable form. + * \param fp file descriptor to which the information is printed + * \param key EC_KEY object + * \return 1 on success and 0 if an error occurred + */ +int ECParameters_print_fp(FILE *fp, const EC_KEY *key); + +/** Prints out the contents of a EC_KEY object + * \param fp file descriptor to which the information is printed + * \param key EC_KEY object + * \param off line offset + * \return 1 on success and 0 if an error occurred + */ +int EC_KEY_print_fp(FILE *fp, const EC_KEY *key, int off); + +# endif + +# define ECParameters_dup(x) ASN1_dup_of(EC_KEY,i2d_ECParameters,d2i_ECParameters,x) + +# ifndef __cplusplus +# if defined(__SUNPRO_C) +# if __SUNPRO_C >= 0x520 +# pragma error_messages (default,E_ARRAY_OF_INCOMPLETE_NONAME,E_ARRAY_OF_INCOMPLETE) +# endif +# endif +# endif + +# define EVP_PKEY_CTX_set_ec_paramgen_curve_nid(ctx, nid) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ + EVP_PKEY_OP_PARAMGEN|EVP_PKEY_OP_KEYGEN, \ + EVP_PKEY_CTRL_EC_PARAMGEN_CURVE_NID, nid, NULL) + +# define EVP_PKEY_CTX_set_ec_param_enc(ctx, flag) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ + EVP_PKEY_OP_PARAMGEN|EVP_PKEY_OP_KEYGEN, \ + EVP_PKEY_CTRL_EC_PARAM_ENC, flag, NULL) + +# define EVP_PKEY_CTX_set_ecdh_cofactor_mode(ctx, flag) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_EC_ECDH_COFACTOR, flag, NULL) + +# define EVP_PKEY_CTX_get_ecdh_cofactor_mode(ctx) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_EC_ECDH_COFACTOR, -2, NULL) + +# define EVP_PKEY_CTX_set_ecdh_kdf_type(ctx, kdf) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_EC_KDF_TYPE, kdf, NULL) + +# define EVP_PKEY_CTX_get_ecdh_kdf_type(ctx) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_EC_KDF_TYPE, -2, NULL) + +# define EVP_PKEY_CTX_set_ecdh_kdf_md(ctx, md) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_EC_KDF_MD, 0, (void *)md) + +# define EVP_PKEY_CTX_get_ecdh_kdf_md(ctx, pmd) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_GET_EC_KDF_MD, 0, (void *)pmd) + +# define EVP_PKEY_CTX_set_ecdh_kdf_outlen(ctx, len) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_EC_KDF_OUTLEN, len, NULL) + +# define EVP_PKEY_CTX_get_ecdh_kdf_outlen(ctx, plen) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_GET_EC_KDF_OUTLEN, 0, (void *)plen) + +# define EVP_PKEY_CTX_set0_ecdh_kdf_ukm(ctx, p, plen) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_EC_KDF_UKM, plen, (void *)p) + +# define EVP_PKEY_CTX_get0_ecdh_kdf_ukm(ctx, p) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_GET_EC_KDF_UKM, 0, (void *)p) + +# define EVP_PKEY_CTRL_EC_PARAMGEN_CURVE_NID (EVP_PKEY_ALG_CTRL + 1) +# define EVP_PKEY_CTRL_EC_PARAM_ENC (EVP_PKEY_ALG_CTRL + 2) +# define EVP_PKEY_CTRL_EC_ECDH_COFACTOR (EVP_PKEY_ALG_CTRL + 3) +# define EVP_PKEY_CTRL_EC_KDF_TYPE (EVP_PKEY_ALG_CTRL + 4) +# define EVP_PKEY_CTRL_EC_KDF_MD (EVP_PKEY_ALG_CTRL + 5) +# define EVP_PKEY_CTRL_GET_EC_KDF_MD (EVP_PKEY_ALG_CTRL + 6) +# define EVP_PKEY_CTRL_EC_KDF_OUTLEN (EVP_PKEY_ALG_CTRL + 7) +# define EVP_PKEY_CTRL_GET_EC_KDF_OUTLEN (EVP_PKEY_ALG_CTRL + 8) +# define EVP_PKEY_CTRL_EC_KDF_UKM (EVP_PKEY_ALG_CTRL + 9) +# define EVP_PKEY_CTRL_GET_EC_KDF_UKM (EVP_PKEY_ALG_CTRL + 10) +/* KDF types */ +# define EVP_PKEY_ECDH_KDF_NONE 1 +# define EVP_PKEY_ECDH_KDF_X9_62 2 + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_EC_strings(void); + +/* Error codes for the EC functions. */ + +/* Function codes. */ +# define EC_F_BN_TO_FELEM 224 +# define EC_F_COMPUTE_WNAF 143 +# define EC_F_D2I_ECPARAMETERS 144 +# define EC_F_D2I_ECPKPARAMETERS 145 +# define EC_F_D2I_ECPRIVATEKEY 146 +# define EC_F_DO_EC_KEY_PRINT 221 +# define EC_F_ECDH_CMS_DECRYPT 238 +# define EC_F_ECDH_CMS_SET_SHARED_INFO 239 +# define EC_F_ECKEY_PARAM2TYPE 223 +# define EC_F_ECKEY_PARAM_DECODE 212 +# define EC_F_ECKEY_PRIV_DECODE 213 +# define EC_F_ECKEY_PRIV_ENCODE 214 +# define EC_F_ECKEY_PUB_DECODE 215 +# define EC_F_ECKEY_PUB_ENCODE 216 +# define EC_F_ECKEY_TYPE2PARAM 220 +# define EC_F_ECPARAMETERS_PRINT 147 +# define EC_F_ECPARAMETERS_PRINT_FP 148 +# define EC_F_ECPKPARAMETERS_PRINT 149 +# define EC_F_ECPKPARAMETERS_PRINT_FP 150 +# define EC_F_ECP_NIST_MOD_192 203 +# define EC_F_ECP_NIST_MOD_224 204 +# define EC_F_ECP_NIST_MOD_256 205 +# define EC_F_ECP_NIST_MOD_521 206 +# define EC_F_EC_ASN1_GROUP2CURVE 153 +# define EC_F_EC_ASN1_GROUP2FIELDID 154 +# define EC_F_EC_ASN1_GROUP2PARAMETERS 155 +# define EC_F_EC_ASN1_GROUP2PKPARAMETERS 156 +# define EC_F_EC_ASN1_PARAMETERS2GROUP 157 +# define EC_F_EC_ASN1_PKPARAMETERS2GROUP 158 +# define EC_F_EC_EX_DATA_SET_DATA 211 +# define EC_F_EC_GF2M_MONTGOMERY_POINT_MULTIPLY 208 +# define EC_F_EC_GF2M_SIMPLE_GROUP_CHECK_DISCRIMINANT 159 +# define EC_F_EC_GF2M_SIMPLE_GROUP_SET_CURVE 195 +# define EC_F_EC_GF2M_SIMPLE_OCT2POINT 160 +# define EC_F_EC_GF2M_SIMPLE_POINT2OCT 161 +# define EC_F_EC_GF2M_SIMPLE_POINT_GET_AFFINE_COORDINATES 162 +# define EC_F_EC_GF2M_SIMPLE_POINT_SET_AFFINE_COORDINATES 163 +# define EC_F_EC_GF2M_SIMPLE_SET_COMPRESSED_COORDINATES 164 +# define EC_F_EC_GFP_MONT_FIELD_DECODE 133 +# define EC_F_EC_GFP_MONT_FIELD_ENCODE 134 +# define EC_F_EC_GFP_MONT_FIELD_MUL 131 +# define EC_F_EC_GFP_MONT_FIELD_SET_TO_ONE 209 +# define EC_F_EC_GFP_MONT_FIELD_SQR 132 +# define EC_F_EC_GFP_MONT_GROUP_SET_CURVE 189 +# define EC_F_EC_GFP_MONT_GROUP_SET_CURVE_GFP 135 +# define EC_F_EC_GFP_NISTP224_GROUP_SET_CURVE 225 +# define EC_F_EC_GFP_NISTP224_POINTS_MUL 228 +# define EC_F_EC_GFP_NISTP224_POINT_GET_AFFINE_COORDINATES 226 +# define EC_F_EC_GFP_NISTP256_GROUP_SET_CURVE 230 +# define EC_F_EC_GFP_NISTP256_POINTS_MUL 231 +# define EC_F_EC_GFP_NISTP256_POINT_GET_AFFINE_COORDINATES 232 +# define EC_F_EC_GFP_NISTP521_GROUP_SET_CURVE 233 +# define EC_F_EC_GFP_NISTP521_POINTS_MUL 234 +# define EC_F_EC_GFP_NISTP521_POINT_GET_AFFINE_COORDINATES 235 +# define EC_F_EC_GFP_NIST_FIELD_MUL 200 +# define EC_F_EC_GFP_NIST_FIELD_SQR 201 +# define EC_F_EC_GFP_NIST_GROUP_SET_CURVE 202 +# define EC_F_EC_GFP_SIMPLE_GROUP_CHECK_DISCRIMINANT 165 +# define EC_F_EC_GFP_SIMPLE_GROUP_SET_CURVE 166 +# define EC_F_EC_GFP_SIMPLE_GROUP_SET_CURVE_GFP 100 +# define EC_F_EC_GFP_SIMPLE_GROUP_SET_GENERATOR 101 +# define EC_F_EC_GFP_SIMPLE_MAKE_AFFINE 102 +# define EC_F_EC_GFP_SIMPLE_OCT2POINT 103 +# define EC_F_EC_GFP_SIMPLE_POINT2OCT 104 +# define EC_F_EC_GFP_SIMPLE_POINTS_MAKE_AFFINE 137 +# define EC_F_EC_GFP_SIMPLE_POINT_GET_AFFINE_COORDINATES 167 +# define EC_F_EC_GFP_SIMPLE_POINT_GET_AFFINE_COORDINATES_GFP 105 +# define EC_F_EC_GFP_SIMPLE_POINT_SET_AFFINE_COORDINATES 168 +# define EC_F_EC_GFP_SIMPLE_POINT_SET_AFFINE_COORDINATES_GFP 128 +# define EC_F_EC_GFP_SIMPLE_SET_COMPRESSED_COORDINATES 169 +# define EC_F_EC_GFP_SIMPLE_SET_COMPRESSED_COORDINATES_GFP 129 +# define EC_F_EC_GROUP_CHECK 170 +# define EC_F_EC_GROUP_CHECK_DISCRIMINANT 171 +# define EC_F_EC_GROUP_COPY 106 +# define EC_F_EC_GROUP_GET0_GENERATOR 139 +# define EC_F_EC_GROUP_GET_COFACTOR 140 +# define EC_F_EC_GROUP_GET_CURVE_GF2M 172 +# define EC_F_EC_GROUP_GET_CURVE_GFP 130 +# define EC_F_EC_GROUP_GET_DEGREE 173 +# define EC_F_EC_GROUP_GET_ORDER 141 +# define EC_F_EC_GROUP_GET_PENTANOMIAL_BASIS 193 +# define EC_F_EC_GROUP_GET_TRINOMIAL_BASIS 194 +# define EC_F_EC_GROUP_NEW 108 +# define EC_F_EC_GROUP_NEW_BY_CURVE_NAME 174 +# define EC_F_EC_GROUP_NEW_FROM_DATA 175 +# define EC_F_EC_GROUP_PRECOMPUTE_MULT 142 +# define EC_F_EC_GROUP_SET_CURVE_GF2M 176 +# define EC_F_EC_GROUP_SET_CURVE_GFP 109 +# define EC_F_EC_GROUP_SET_EXTRA_DATA 110 +# define EC_F_EC_GROUP_SET_GENERATOR 111 +# define EC_F_EC_KEY_CHECK_KEY 177 +# define EC_F_EC_KEY_COPY 178 +# define EC_F_EC_KEY_GENERATE_KEY 179 +# define EC_F_EC_KEY_NEW 182 +# define EC_F_EC_KEY_PRINT 180 +# define EC_F_EC_KEY_PRINT_FP 181 +# define EC_F_EC_KEY_SET_PUBLIC_KEY_AFFINE_COORDINATES 229 +# define EC_F_EC_POINTS_MAKE_AFFINE 136 +# define EC_F_EC_POINT_ADD 112 +# define EC_F_EC_POINT_CMP 113 +# define EC_F_EC_POINT_COPY 114 +# define EC_F_EC_POINT_DBL 115 +# define EC_F_EC_POINT_GET_AFFINE_COORDINATES_GF2M 183 +# define EC_F_EC_POINT_GET_AFFINE_COORDINATES_GFP 116 +# define EC_F_EC_POINT_GET_JPROJECTIVE_COORDINATES_GFP 117 +# define EC_F_EC_POINT_INVERT 210 +# define EC_F_EC_POINT_IS_AT_INFINITY 118 +# define EC_F_EC_POINT_IS_ON_CURVE 119 +# define EC_F_EC_POINT_MAKE_AFFINE 120 +# define EC_F_EC_POINT_MUL 184 +# define EC_F_EC_POINT_NEW 121 +# define EC_F_EC_POINT_OCT2POINT 122 +# define EC_F_EC_POINT_POINT2OCT 123 +# define EC_F_EC_POINT_SET_AFFINE_COORDINATES_GF2M 185 +# define EC_F_EC_POINT_SET_AFFINE_COORDINATES_GFP 124 +# define EC_F_EC_POINT_SET_COMPRESSED_COORDINATES_GF2M 186 +# define EC_F_EC_POINT_SET_COMPRESSED_COORDINATES_GFP 125 +# define EC_F_EC_POINT_SET_JPROJECTIVE_COORDINATES_GFP 126 +# define EC_F_EC_POINT_SET_TO_INFINITY 127 +# define EC_F_EC_PRE_COMP_DUP 207 +# define EC_F_EC_PRE_COMP_NEW 196 +# define EC_F_EC_WNAF_MUL 187 +# define EC_F_EC_WNAF_PRECOMPUTE_MULT 188 +# define EC_F_I2D_ECPARAMETERS 190 +# define EC_F_I2D_ECPKPARAMETERS 191 +# define EC_F_I2D_ECPRIVATEKEY 192 +# define EC_F_I2O_ECPUBLICKEY 151 +# define EC_F_NISTP224_PRE_COMP_NEW 227 +# define EC_F_NISTP256_PRE_COMP_NEW 236 +# define EC_F_NISTP521_PRE_COMP_NEW 237 +# define EC_F_ECP_NISTZ256_GET_AFFINE 240 +# define EC_F_ECP_NISTZ256_POINTS_MUL 241 +# define EC_F_ECP_NISTZ256_WINDOWED_MUL 242 +# define EC_F_ECP_NISTZ256_MULT_PRECOMPUTE 243 +# define EC_F_ECP_NISTZ256_PRE_COMP_NEW 244 +# define EC_F_O2I_ECPUBLICKEY 152 +# define EC_F_OLD_EC_PRIV_DECODE 222 +# define EC_F_PKEY_EC_CTRL 197 +# define EC_F_PKEY_EC_CTRL_STR 198 +# define EC_F_PKEY_EC_DERIVE 217 +# define EC_F_PKEY_EC_KEYGEN 199 +# define EC_F_PKEY_EC_PARAMGEN 219 +# define EC_F_PKEY_EC_SIGN 218 + +/* Reason codes. */ +# define EC_R_ASN1_ERROR 115 +# define EC_R_ASN1_UNKNOWN_FIELD 116 +# define EC_R_BIGNUM_OUT_OF_RANGE 144 +# define EC_R_BUFFER_TOO_SMALL 100 +# define EC_R_COORDINATES_OUT_OF_RANGE 146 +# define EC_R_D2I_ECPKPARAMETERS_FAILURE 117 +# define EC_R_DECODE_ERROR 142 +# define EC_R_DISCRIMINANT_IS_ZERO 118 +# define EC_R_EC_GROUP_NEW_BY_NAME_FAILURE 119 +# define EC_R_FIELD_TOO_LARGE 143 +# define EC_R_GF2M_NOT_SUPPORTED 147 +# define EC_R_GROUP2PKPARAMETERS_FAILURE 120 +# define EC_R_I2D_ECPKPARAMETERS_FAILURE 121 +# define EC_R_INCOMPATIBLE_OBJECTS 101 +# define EC_R_INVALID_ARGUMENT 112 +# define EC_R_INVALID_COMPRESSED_POINT 110 +# define EC_R_INVALID_COMPRESSION_BIT 109 +# define EC_R_INVALID_CURVE 141 +# define EC_R_INVALID_DIGEST 151 +# define EC_R_INVALID_DIGEST_TYPE 138 +# define EC_R_INVALID_ENCODING 102 +# define EC_R_INVALID_FIELD 103 +# define EC_R_INVALID_FORM 104 +# define EC_R_INVALID_GROUP_ORDER 122 +# define EC_R_INVALID_PENTANOMIAL_BASIS 132 +# define EC_R_INVALID_PRIVATE_KEY 123 +# define EC_R_INVALID_TRINOMIAL_BASIS 137 +# define EC_R_KDF_PARAMETER_ERROR 148 +# define EC_R_KEYS_NOT_SET 140 +# define EC_R_MISSING_PARAMETERS 124 +# define EC_R_MISSING_PRIVATE_KEY 125 +# define EC_R_NOT_A_NIST_PRIME 135 +# define EC_R_NOT_A_SUPPORTED_NIST_PRIME 136 +# define EC_R_NOT_IMPLEMENTED 126 +# define EC_R_NOT_INITIALIZED 111 +# define EC_R_NO_FIELD_MOD 133 +# define EC_R_NO_PARAMETERS_SET 139 +# define EC_R_PASSED_NULL_PARAMETER 134 +# define EC_R_PEER_KEY_ERROR 149 +# define EC_R_PKPARAMETERS2GROUP_FAILURE 127 +# define EC_R_POINT_AT_INFINITY 106 +# define EC_R_POINT_IS_NOT_ON_CURVE 107 +# define EC_R_SHARED_INFO_ERROR 150 +# define EC_R_SLOT_FULL 108 +# define EC_R_UNDEFINED_GENERATOR 113 +# define EC_R_UNDEFINED_ORDER 128 +# define EC_R_UNKNOWN_GROUP 129 +# define EC_R_UNKNOWN_ORDER 114 +# define EC_R_UNSUPPORTED_FIELD 131 +# define EC_R_WRONG_CURVE_PARAMETERS 145 +# define EC_R_WRONG_ORDER 130 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/ext/openssl-osx/include/openssl/ecdh.h b/ext/openssl-osx/include/openssl/ecdh.h new file mode 100644 index 00000000..25348b30 --- /dev/null +++ b/ext/openssl-osx/include/openssl/ecdh.h @@ -0,0 +1,134 @@ +/* crypto/ecdh/ecdh.h */ +/* ==================================================================== + * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. + * + * The Elliptic Curve Public-Key Crypto Library (ECC Code) included + * herein is developed by SUN MICROSYSTEMS, INC., and is contributed + * to the OpenSSL project. + * + * The ECC Code is licensed pursuant to the OpenSSL open source + * license provided below. + * + * The ECDH software is originally written by Douglas Stebila of + * Sun Microsystems Laboratories. + * + */ +/* ==================================================================== + * Copyright (c) 2000-2002 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +#ifndef HEADER_ECDH_H +# define HEADER_ECDH_H + +# include + +# ifdef OPENSSL_NO_ECDH +# error ECDH is disabled. +# endif + +# include +# include +# ifndef OPENSSL_NO_DEPRECATED +# include +# endif + +#ifdef __cplusplus +extern "C" { +#endif + +# define EC_FLAG_COFACTOR_ECDH 0x1000 + +const ECDH_METHOD *ECDH_OpenSSL(void); + +void ECDH_set_default_method(const ECDH_METHOD *); +const ECDH_METHOD *ECDH_get_default_method(void); +int ECDH_set_method(EC_KEY *, const ECDH_METHOD *); + +int ECDH_compute_key(void *out, size_t outlen, const EC_POINT *pub_key, + EC_KEY *ecdh, void *(*KDF) (const void *in, size_t inlen, + void *out, size_t *outlen)); + +int ECDH_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new + *new_func, CRYPTO_EX_dup *dup_func, + CRYPTO_EX_free *free_func); +int ECDH_set_ex_data(EC_KEY *d, int idx, void *arg); +void *ECDH_get_ex_data(EC_KEY *d, int idx); + +int ECDH_KDF_X9_62(unsigned char *out, size_t outlen, + const unsigned char *Z, size_t Zlen, + const unsigned char *sinfo, size_t sinfolen, + const EVP_MD *md); + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_ECDH_strings(void); + +/* Error codes for the ECDH functions. */ + +/* Function codes. */ +# define ECDH_F_ECDH_CHECK 102 +# define ECDH_F_ECDH_COMPUTE_KEY 100 +# define ECDH_F_ECDH_DATA_NEW_METHOD 101 + +/* Reason codes. */ +# define ECDH_R_KDF_FAILED 102 +# define ECDH_R_NON_FIPS_METHOD 103 +# define ECDH_R_NO_PRIVATE_VALUE 100 +# define ECDH_R_POINT_ARITHMETIC_FAILURE 101 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/ext/openssl-osx/include/openssl/ecdsa.h b/ext/openssl-osx/include/openssl/ecdsa.h new file mode 100644 index 00000000..c4016ac3 --- /dev/null +++ b/ext/openssl-osx/include/openssl/ecdsa.h @@ -0,0 +1,335 @@ +/* crypto/ecdsa/ecdsa.h */ +/** + * \file crypto/ecdsa/ecdsa.h Include file for the OpenSSL ECDSA functions + * \author Written by Nils Larsch for the OpenSSL project + */ +/* ==================================================================== + * Copyright (c) 2000-2005 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +#ifndef HEADER_ECDSA_H +# define HEADER_ECDSA_H + +# include + +# ifdef OPENSSL_NO_ECDSA +# error ECDSA is disabled. +# endif + +# include +# include +# ifndef OPENSSL_NO_DEPRECATED +# include +# endif + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct ECDSA_SIG_st { + BIGNUM *r; + BIGNUM *s; +} ECDSA_SIG; + +/** Allocates and initialize a ECDSA_SIG structure + * \return pointer to a ECDSA_SIG structure or NULL if an error occurred + */ +ECDSA_SIG *ECDSA_SIG_new(void); + +/** frees a ECDSA_SIG structure + * \param sig pointer to the ECDSA_SIG structure + */ +void ECDSA_SIG_free(ECDSA_SIG *sig); + +/** DER encode content of ECDSA_SIG object (note: this function modifies *pp + * (*pp += length of the DER encoded signature)). + * \param sig pointer to the ECDSA_SIG object + * \param pp pointer to a unsigned char pointer for the output or NULL + * \return the length of the DER encoded ECDSA_SIG object or 0 + */ +int i2d_ECDSA_SIG(const ECDSA_SIG *sig, unsigned char **pp); + +/** Decodes a DER encoded ECDSA signature (note: this function changes *pp + * (*pp += len)). + * \param sig pointer to ECDSA_SIG pointer (may be NULL) + * \param pp memory buffer with the DER encoded signature + * \param len length of the buffer + * \return pointer to the decoded ECDSA_SIG structure (or NULL) + */ +ECDSA_SIG *d2i_ECDSA_SIG(ECDSA_SIG **sig, const unsigned char **pp, long len); + +/** Computes the ECDSA signature of the given hash value using + * the supplied private key and returns the created signature. + * \param dgst pointer to the hash value + * \param dgst_len length of the hash value + * \param eckey EC_KEY object containing a private EC key + * \return pointer to a ECDSA_SIG structure or NULL if an error occurred + */ +ECDSA_SIG *ECDSA_do_sign(const unsigned char *dgst, int dgst_len, + EC_KEY *eckey); + +/** Computes ECDSA signature of a given hash value using the supplied + * private key (note: sig must point to ECDSA_size(eckey) bytes of memory). + * \param dgst pointer to the hash value to sign + * \param dgstlen length of the hash value + * \param kinv BIGNUM with a pre-computed inverse k (optional) + * \param rp BIGNUM with a pre-computed rp value (optioanl), + * see ECDSA_sign_setup + * \param eckey EC_KEY object containing a private EC key + * \return pointer to a ECDSA_SIG structure or NULL if an error occurred + */ +ECDSA_SIG *ECDSA_do_sign_ex(const unsigned char *dgst, int dgstlen, + const BIGNUM *kinv, const BIGNUM *rp, + EC_KEY *eckey); + +/** Verifies that the supplied signature is a valid ECDSA + * signature of the supplied hash value using the supplied public key. + * \param dgst pointer to the hash value + * \param dgst_len length of the hash value + * \param sig ECDSA_SIG structure + * \param eckey EC_KEY object containing a public EC key + * \return 1 if the signature is valid, 0 if the signature is invalid + * and -1 on error + */ +int ECDSA_do_verify(const unsigned char *dgst, int dgst_len, + const ECDSA_SIG *sig, EC_KEY *eckey); + +const ECDSA_METHOD *ECDSA_OpenSSL(void); + +/** Sets the default ECDSA method + * \param meth new default ECDSA_METHOD + */ +void ECDSA_set_default_method(const ECDSA_METHOD *meth); + +/** Returns the default ECDSA method + * \return pointer to ECDSA_METHOD structure containing the default method + */ +const ECDSA_METHOD *ECDSA_get_default_method(void); + +/** Sets method to be used for the ECDSA operations + * \param eckey EC_KEY object + * \param meth new method + * \return 1 on success and 0 otherwise + */ +int ECDSA_set_method(EC_KEY *eckey, const ECDSA_METHOD *meth); + +/** Returns the maximum length of the DER encoded signature + * \param eckey EC_KEY object + * \return numbers of bytes required for the DER encoded signature + */ +int ECDSA_size(const EC_KEY *eckey); + +/** Precompute parts of the signing operation + * \param eckey EC_KEY object containing a private EC key + * \param ctx BN_CTX object (optional) + * \param kinv BIGNUM pointer for the inverse of k + * \param rp BIGNUM pointer for x coordinate of k * generator + * \return 1 on success and 0 otherwise + */ +int ECDSA_sign_setup(EC_KEY *eckey, BN_CTX *ctx, BIGNUM **kinv, BIGNUM **rp); + +/** Computes ECDSA signature of a given hash value using the supplied + * private key (note: sig must point to ECDSA_size(eckey) bytes of memory). + * \param type this parameter is ignored + * \param dgst pointer to the hash value to sign + * \param dgstlen length of the hash value + * \param sig memory for the DER encoded created signature + * \param siglen pointer to the length of the returned signature + * \param eckey EC_KEY object containing a private EC key + * \return 1 on success and 0 otherwise + */ +int ECDSA_sign(int type, const unsigned char *dgst, int dgstlen, + unsigned char *sig, unsigned int *siglen, EC_KEY *eckey); + +/** Computes ECDSA signature of a given hash value using the supplied + * private key (note: sig must point to ECDSA_size(eckey) bytes of memory). + * \param type this parameter is ignored + * \param dgst pointer to the hash value to sign + * \param dgstlen length of the hash value + * \param sig buffer to hold the DER encoded signature + * \param siglen pointer to the length of the returned signature + * \param kinv BIGNUM with a pre-computed inverse k (optional) + * \param rp BIGNUM with a pre-computed rp value (optioanl), + * see ECDSA_sign_setup + * \param eckey EC_KEY object containing a private EC key + * \return 1 on success and 0 otherwise + */ +int ECDSA_sign_ex(int type, const unsigned char *dgst, int dgstlen, + unsigned char *sig, unsigned int *siglen, + const BIGNUM *kinv, const BIGNUM *rp, EC_KEY *eckey); + +/** Verifies that the given signature is valid ECDSA signature + * of the supplied hash value using the specified public key. + * \param type this parameter is ignored + * \param dgst pointer to the hash value + * \param dgstlen length of the hash value + * \param sig pointer to the DER encoded signature + * \param siglen length of the DER encoded signature + * \param eckey EC_KEY object containing a public EC key + * \return 1 if the signature is valid, 0 if the signature is invalid + * and -1 on error + */ +int ECDSA_verify(int type, const unsigned char *dgst, int dgstlen, + const unsigned char *sig, int siglen, EC_KEY *eckey); + +/* the standard ex_data functions */ +int ECDSA_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new + *new_func, CRYPTO_EX_dup *dup_func, + CRYPTO_EX_free *free_func); +int ECDSA_set_ex_data(EC_KEY *d, int idx, void *arg); +void *ECDSA_get_ex_data(EC_KEY *d, int idx); + +/** Allocates and initialize a ECDSA_METHOD structure + * \param ecdsa_method pointer to ECDSA_METHOD to copy. (May be NULL) + * \return pointer to a ECDSA_METHOD structure or NULL if an error occurred + */ + +ECDSA_METHOD *ECDSA_METHOD_new(ECDSA_METHOD *ecdsa_method); + +/** frees a ECDSA_METHOD structure + * \param ecdsa_method pointer to the ECDSA_METHOD structure + */ +void ECDSA_METHOD_free(ECDSA_METHOD *ecdsa_method); + +/** Sets application specific data in the ECDSA_METHOD + * \param ecdsa_method pointer to existing ECDSA_METHOD + * \param app application specific data to set + */ + +void ECDSA_METHOD_set_app_data(ECDSA_METHOD *ecdsa_method, void *app); + +/** Returns application specific data from a ECDSA_METHOD structure + * \param ecdsa_method pointer to ECDSA_METHOD structure + * \return pointer to application specific data. + */ + +void *ECDSA_METHOD_get_app_data(ECDSA_METHOD *ecdsa_method); + +/** Set the ECDSA_do_sign function in the ECDSA_METHOD + * \param ecdsa_method pointer to existing ECDSA_METHOD + * \param ecdsa_do_sign a funtion of type ECDSA_do_sign + */ + +void ECDSA_METHOD_set_sign(ECDSA_METHOD *ecdsa_method, + ECDSA_SIG *(*ecdsa_do_sign) (const unsigned char + *dgst, int dgst_len, + const BIGNUM *inv, + const BIGNUM *rp, + EC_KEY *eckey)); + +/** Set the ECDSA_sign_setup function in the ECDSA_METHOD + * \param ecdsa_method pointer to existing ECDSA_METHOD + * \param ecdsa_sign_setup a funtion of type ECDSA_sign_setup + */ + +void ECDSA_METHOD_set_sign_setup(ECDSA_METHOD *ecdsa_method, + int (*ecdsa_sign_setup) (EC_KEY *eckey, + BN_CTX *ctx, + BIGNUM **kinv, + BIGNUM **r)); + +/** Set the ECDSA_do_verify function in the ECDSA_METHOD + * \param ecdsa_method pointer to existing ECDSA_METHOD + * \param ecdsa_do_verify a funtion of type ECDSA_do_verify + */ + +void ECDSA_METHOD_set_verify(ECDSA_METHOD *ecdsa_method, + int (*ecdsa_do_verify) (const unsigned char + *dgst, int dgst_len, + const ECDSA_SIG *sig, + EC_KEY *eckey)); + +void ECDSA_METHOD_set_flags(ECDSA_METHOD *ecdsa_method, int flags); + +/** Set the flags field in the ECDSA_METHOD + * \param ecdsa_method pointer to existing ECDSA_METHOD + * \param flags flags value to set + */ + +void ECDSA_METHOD_set_name(ECDSA_METHOD *ecdsa_method, char *name); + +/** Set the name field in the ECDSA_METHOD + * \param ecdsa_method pointer to existing ECDSA_METHOD + * \param name name to set + */ + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_ECDSA_strings(void); + +/* Error codes for the ECDSA functions. */ + +/* Function codes. */ +# define ECDSA_F_ECDSA_CHECK 104 +# define ECDSA_F_ECDSA_DATA_NEW_METHOD 100 +# define ECDSA_F_ECDSA_DO_SIGN 101 +# define ECDSA_F_ECDSA_DO_VERIFY 102 +# define ECDSA_F_ECDSA_METHOD_NEW 105 +# define ECDSA_F_ECDSA_SIGN_SETUP 103 + +/* Reason codes. */ +# define ECDSA_R_BAD_SIGNATURE 100 +# define ECDSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE 101 +# define ECDSA_R_ERR_EC_LIB 102 +# define ECDSA_R_MISSING_PARAMETERS 103 +# define ECDSA_R_NEED_NEW_SETUP_VALUES 106 +# define ECDSA_R_NON_FIPS_METHOD 107 +# define ECDSA_R_RANDOM_NUMBER_GENERATION_FAILED 104 +# define ECDSA_R_SIGNATURE_MALLOC_FAILED 105 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/ext/openssl-osx/include/openssl/err.h b/ext/openssl-osx/include/openssl/err.h new file mode 100644 index 00000000..585aa8ba --- /dev/null +++ b/ext/openssl-osx/include/openssl/err.h @@ -0,0 +1,389 @@ +/* crypto/err/err.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ +/* ==================================================================== + * Copyright (c) 1998-2006 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_ERR_H +# define HEADER_ERR_H + +# include + +# ifndef OPENSSL_NO_FP_API +# include +# include +# endif + +# include +# ifndef OPENSSL_NO_BIO +# include +# endif +# ifndef OPENSSL_NO_LHASH +# include +# endif + +#ifdef __cplusplus +extern "C" { +#endif + +# ifndef OPENSSL_NO_ERR +# define ERR_PUT_error(a,b,c,d,e) ERR_put_error(a,b,c,d,e) +# else +# define ERR_PUT_error(a,b,c,d,e) ERR_put_error(a,b,c,NULL,0) +# endif + +# include + +# define ERR_TXT_MALLOCED 0x01 +# define ERR_TXT_STRING 0x02 + +# define ERR_FLAG_MARK 0x01 + +# define ERR_NUM_ERRORS 16 +typedef struct err_state_st { + CRYPTO_THREADID tid; + int err_flags[ERR_NUM_ERRORS]; + unsigned long err_buffer[ERR_NUM_ERRORS]; + char *err_data[ERR_NUM_ERRORS]; + int err_data_flags[ERR_NUM_ERRORS]; + const char *err_file[ERR_NUM_ERRORS]; + int err_line[ERR_NUM_ERRORS]; + int top, bottom; +} ERR_STATE; + +/* library */ +# define ERR_LIB_NONE 1 +# define ERR_LIB_SYS 2 +# define ERR_LIB_BN 3 +# define ERR_LIB_RSA 4 +# define ERR_LIB_DH 5 +# define ERR_LIB_EVP 6 +# define ERR_LIB_BUF 7 +# define ERR_LIB_OBJ 8 +# define ERR_LIB_PEM 9 +# define ERR_LIB_DSA 10 +# define ERR_LIB_X509 11 +/* #define ERR_LIB_METH 12 */ +# define ERR_LIB_ASN1 13 +# define ERR_LIB_CONF 14 +# define ERR_LIB_CRYPTO 15 +# define ERR_LIB_EC 16 +# define ERR_LIB_SSL 20 +/* #define ERR_LIB_SSL23 21 */ +/* #define ERR_LIB_SSL2 22 */ +/* #define ERR_LIB_SSL3 23 */ +/* #define ERR_LIB_RSAREF 30 */ +/* #define ERR_LIB_PROXY 31 */ +# define ERR_LIB_BIO 32 +# define ERR_LIB_PKCS7 33 +# define ERR_LIB_X509V3 34 +# define ERR_LIB_PKCS12 35 +# define ERR_LIB_RAND 36 +# define ERR_LIB_DSO 37 +# define ERR_LIB_ENGINE 38 +# define ERR_LIB_OCSP 39 +# define ERR_LIB_UI 40 +# define ERR_LIB_COMP 41 +# define ERR_LIB_ECDSA 42 +# define ERR_LIB_ECDH 43 +# define ERR_LIB_STORE 44 +# define ERR_LIB_FIPS 45 +# define ERR_LIB_CMS 46 +# define ERR_LIB_TS 47 +# define ERR_LIB_HMAC 48 +# define ERR_LIB_JPAKE 49 + +# define ERR_LIB_USER 128 + +# define SYSerr(f,r) ERR_PUT_error(ERR_LIB_SYS,(f),(r),__FILE__,__LINE__) +# define BNerr(f,r) ERR_PUT_error(ERR_LIB_BN,(f),(r),__FILE__,__LINE__) +# define RSAerr(f,r) ERR_PUT_error(ERR_LIB_RSA,(f),(r),__FILE__,__LINE__) +# define DHerr(f,r) ERR_PUT_error(ERR_LIB_DH,(f),(r),__FILE__,__LINE__) +# define EVPerr(f,r) ERR_PUT_error(ERR_LIB_EVP,(f),(r),__FILE__,__LINE__) +# define BUFerr(f,r) ERR_PUT_error(ERR_LIB_BUF,(f),(r),__FILE__,__LINE__) +# define OBJerr(f,r) ERR_PUT_error(ERR_LIB_OBJ,(f),(r),__FILE__,__LINE__) +# define PEMerr(f,r) ERR_PUT_error(ERR_LIB_PEM,(f),(r),__FILE__,__LINE__) +# define DSAerr(f,r) ERR_PUT_error(ERR_LIB_DSA,(f),(r),__FILE__,__LINE__) +# define X509err(f,r) ERR_PUT_error(ERR_LIB_X509,(f),(r),__FILE__,__LINE__) +# define ASN1err(f,r) ERR_PUT_error(ERR_LIB_ASN1,(f),(r),__FILE__,__LINE__) +# define CONFerr(f,r) ERR_PUT_error(ERR_LIB_CONF,(f),(r),__FILE__,__LINE__) +# define CRYPTOerr(f,r) ERR_PUT_error(ERR_LIB_CRYPTO,(f),(r),__FILE__,__LINE__) +# define ECerr(f,r) ERR_PUT_error(ERR_LIB_EC,(f),(r),__FILE__,__LINE__) +# define SSLerr(f,r) ERR_PUT_error(ERR_LIB_SSL,(f),(r),__FILE__,__LINE__) +# define BIOerr(f,r) ERR_PUT_error(ERR_LIB_BIO,(f),(r),__FILE__,__LINE__) +# define PKCS7err(f,r) ERR_PUT_error(ERR_LIB_PKCS7,(f),(r),__FILE__,__LINE__) +# define X509V3err(f,r) ERR_PUT_error(ERR_LIB_X509V3,(f),(r),__FILE__,__LINE__) +# define PKCS12err(f,r) ERR_PUT_error(ERR_LIB_PKCS12,(f),(r),__FILE__,__LINE__) +# define RANDerr(f,r) ERR_PUT_error(ERR_LIB_RAND,(f),(r),__FILE__,__LINE__) +# define DSOerr(f,r) ERR_PUT_error(ERR_LIB_DSO,(f),(r),__FILE__,__LINE__) +# define ENGINEerr(f,r) ERR_PUT_error(ERR_LIB_ENGINE,(f),(r),__FILE__,__LINE__) +# define OCSPerr(f,r) ERR_PUT_error(ERR_LIB_OCSP,(f),(r),__FILE__,__LINE__) +# define UIerr(f,r) ERR_PUT_error(ERR_LIB_UI,(f),(r),__FILE__,__LINE__) +# define COMPerr(f,r) ERR_PUT_error(ERR_LIB_COMP,(f),(r),__FILE__,__LINE__) +# define ECDSAerr(f,r) ERR_PUT_error(ERR_LIB_ECDSA,(f),(r),__FILE__,__LINE__) +# define ECDHerr(f,r) ERR_PUT_error(ERR_LIB_ECDH,(f),(r),__FILE__,__LINE__) +# define STOREerr(f,r) ERR_PUT_error(ERR_LIB_STORE,(f),(r),__FILE__,__LINE__) +# define FIPSerr(f,r) ERR_PUT_error(ERR_LIB_FIPS,(f),(r),__FILE__,__LINE__) +# define CMSerr(f,r) ERR_PUT_error(ERR_LIB_CMS,(f),(r),__FILE__,__LINE__) +# define TSerr(f,r) ERR_PUT_error(ERR_LIB_TS,(f),(r),__FILE__,__LINE__) +# define HMACerr(f,r) ERR_PUT_error(ERR_LIB_HMAC,(f),(r),__FILE__,__LINE__) +# define JPAKEerr(f,r) ERR_PUT_error(ERR_LIB_JPAKE,(f),(r),__FILE__,__LINE__) + +/* + * Borland C seems too stupid to be able to shift and do longs in the + * pre-processor :-( + */ +# define ERR_PACK(l,f,r) (((((unsigned long)l)&0xffL)*0x1000000)| \ + ((((unsigned long)f)&0xfffL)*0x1000)| \ + ((((unsigned long)r)&0xfffL))) +# define ERR_GET_LIB(l) (int)((((unsigned long)l)>>24L)&0xffL) +# define ERR_GET_FUNC(l) (int)((((unsigned long)l)>>12L)&0xfffL) +# define ERR_GET_REASON(l) (int)((l)&0xfffL) +# define ERR_FATAL_ERROR(l) (int)((l)&ERR_R_FATAL) + +/* OS functions */ +# define SYS_F_FOPEN 1 +# define SYS_F_CONNECT 2 +# define SYS_F_GETSERVBYNAME 3 +# define SYS_F_SOCKET 4 +# define SYS_F_IOCTLSOCKET 5 +# define SYS_F_BIND 6 +# define SYS_F_LISTEN 7 +# define SYS_F_ACCEPT 8 +# define SYS_F_WSASTARTUP 9/* Winsock stuff */ +# define SYS_F_OPENDIR 10 +# define SYS_F_FREAD 11 + +/* reasons */ +# define ERR_R_SYS_LIB ERR_LIB_SYS/* 2 */ +# define ERR_R_BN_LIB ERR_LIB_BN/* 3 */ +# define ERR_R_RSA_LIB ERR_LIB_RSA/* 4 */ +# define ERR_R_DH_LIB ERR_LIB_DH/* 5 */ +# define ERR_R_EVP_LIB ERR_LIB_EVP/* 6 */ +# define ERR_R_BUF_LIB ERR_LIB_BUF/* 7 */ +# define ERR_R_OBJ_LIB ERR_LIB_OBJ/* 8 */ +# define ERR_R_PEM_LIB ERR_LIB_PEM/* 9 */ +# define ERR_R_DSA_LIB ERR_LIB_DSA/* 10 */ +# define ERR_R_X509_LIB ERR_LIB_X509/* 11 */ +# define ERR_R_ASN1_LIB ERR_LIB_ASN1/* 13 */ +# define ERR_R_CONF_LIB ERR_LIB_CONF/* 14 */ +# define ERR_R_CRYPTO_LIB ERR_LIB_CRYPTO/* 15 */ +# define ERR_R_EC_LIB ERR_LIB_EC/* 16 */ +# define ERR_R_SSL_LIB ERR_LIB_SSL/* 20 */ +# define ERR_R_BIO_LIB ERR_LIB_BIO/* 32 */ +# define ERR_R_PKCS7_LIB ERR_LIB_PKCS7/* 33 */ +# define ERR_R_X509V3_LIB ERR_LIB_X509V3/* 34 */ +# define ERR_R_PKCS12_LIB ERR_LIB_PKCS12/* 35 */ +# define ERR_R_RAND_LIB ERR_LIB_RAND/* 36 */ +# define ERR_R_DSO_LIB ERR_LIB_DSO/* 37 */ +# define ERR_R_ENGINE_LIB ERR_LIB_ENGINE/* 38 */ +# define ERR_R_OCSP_LIB ERR_LIB_OCSP/* 39 */ +# define ERR_R_UI_LIB ERR_LIB_UI/* 40 */ +# define ERR_R_COMP_LIB ERR_LIB_COMP/* 41 */ +# define ERR_R_ECDSA_LIB ERR_LIB_ECDSA/* 42 */ +# define ERR_R_ECDH_LIB ERR_LIB_ECDH/* 43 */ +# define ERR_R_STORE_LIB ERR_LIB_STORE/* 44 */ +# define ERR_R_TS_LIB ERR_LIB_TS/* 45 */ + +# define ERR_R_NESTED_ASN1_ERROR 58 +# define ERR_R_BAD_ASN1_OBJECT_HEADER 59 +# define ERR_R_BAD_GET_ASN1_OBJECT_CALL 60 +# define ERR_R_EXPECTING_AN_ASN1_SEQUENCE 61 +# define ERR_R_ASN1_LENGTH_MISMATCH 62 +# define ERR_R_MISSING_ASN1_EOS 63 + +/* fatal error */ +# define ERR_R_FATAL 64 +# define ERR_R_MALLOC_FAILURE (1|ERR_R_FATAL) +# define ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED (2|ERR_R_FATAL) +# define ERR_R_PASSED_NULL_PARAMETER (3|ERR_R_FATAL) +# define ERR_R_INTERNAL_ERROR (4|ERR_R_FATAL) +# define ERR_R_DISABLED (5|ERR_R_FATAL) + +/* + * 99 is the maximum possible ERR_R_... code, higher values are reserved for + * the individual libraries + */ + +typedef struct ERR_string_data_st { + unsigned long error; + const char *string; +} ERR_STRING_DATA; + +void ERR_put_error(int lib, int func, int reason, const char *file, int line); +void ERR_set_error_data(char *data, int flags); + +unsigned long ERR_get_error(void); +unsigned long ERR_get_error_line(const char **file, int *line); +unsigned long ERR_get_error_line_data(const char **file, int *line, + const char **data, int *flags); +unsigned long ERR_peek_error(void); +unsigned long ERR_peek_error_line(const char **file, int *line); +unsigned long ERR_peek_error_line_data(const char **file, int *line, + const char **data, int *flags); +unsigned long ERR_peek_last_error(void); +unsigned long ERR_peek_last_error_line(const char **file, int *line); +unsigned long ERR_peek_last_error_line_data(const char **file, int *line, + const char **data, int *flags); +void ERR_clear_error(void); +char *ERR_error_string(unsigned long e, char *buf); +void ERR_error_string_n(unsigned long e, char *buf, size_t len); +const char *ERR_lib_error_string(unsigned long e); +const char *ERR_func_error_string(unsigned long e); +const char *ERR_reason_error_string(unsigned long e); +void ERR_print_errors_cb(int (*cb) (const char *str, size_t len, void *u), + void *u); +# ifndef OPENSSL_NO_FP_API +void ERR_print_errors_fp(FILE *fp); +# endif +# ifndef OPENSSL_NO_BIO +void ERR_print_errors(BIO *bp); +# endif +void ERR_add_error_data(int num, ...); +void ERR_add_error_vdata(int num, va_list args); +void ERR_load_strings(int lib, ERR_STRING_DATA str[]); +void ERR_unload_strings(int lib, ERR_STRING_DATA str[]); +void ERR_load_ERR_strings(void); +void ERR_load_crypto_strings(void); +void ERR_free_strings(void); + +void ERR_remove_thread_state(const CRYPTO_THREADID *tid); +# ifndef OPENSSL_NO_DEPRECATED +void ERR_remove_state(unsigned long pid); /* if zero we look it up */ +# endif +ERR_STATE *ERR_get_state(void); + +# ifndef OPENSSL_NO_LHASH +LHASH_OF(ERR_STRING_DATA) *ERR_get_string_table(void); +LHASH_OF(ERR_STATE) *ERR_get_err_state_table(void); +void ERR_release_err_state_table(LHASH_OF(ERR_STATE) **hash); +# endif + +int ERR_get_next_error_library(void); + +int ERR_set_mark(void); +int ERR_pop_to_mark(void); + +/* Already defined in ossl_typ.h */ +/* typedef struct st_ERR_FNS ERR_FNS; */ +/* + * An application can use this function and provide the return value to + * loaded modules that should use the application's ERR state/functionality + */ +const ERR_FNS *ERR_get_implementation(void); +/* + * A loaded module should call this function prior to any ERR operations + * using the application's "ERR_FNS". + */ +int ERR_set_implementation(const ERR_FNS *fns); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ext/openssl-osx/include/openssl/evp.h b/ext/openssl-osx/include/openssl/evp.h new file mode 100644 index 00000000..47abbac4 --- /dev/null +++ b/ext/openssl-osx/include/openssl/evp.h @@ -0,0 +1,1519 @@ +/* crypto/evp/evp.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_ENVELOPE_H +# define HEADER_ENVELOPE_H + +# ifdef OPENSSL_ALGORITHM_DEFINES +# include +# else +# define OPENSSL_ALGORITHM_DEFINES +# include +# undef OPENSSL_ALGORITHM_DEFINES +# endif + +# include + +# include + +# ifndef OPENSSL_NO_BIO +# include +# endif + +/*- +#define EVP_RC2_KEY_SIZE 16 +#define EVP_RC4_KEY_SIZE 16 +#define EVP_BLOWFISH_KEY_SIZE 16 +#define EVP_CAST5_KEY_SIZE 16 +#define EVP_RC5_32_12_16_KEY_SIZE 16 +*/ +# define EVP_MAX_MD_SIZE 64/* longest known is SHA512 */ +# define EVP_MAX_KEY_LENGTH 64 +# define EVP_MAX_IV_LENGTH 16 +# define EVP_MAX_BLOCK_LENGTH 32 + +# define PKCS5_SALT_LEN 8 +/* Default PKCS#5 iteration count */ +# define PKCS5_DEFAULT_ITER 2048 + +# include + +# define EVP_PK_RSA 0x0001 +# define EVP_PK_DSA 0x0002 +# define EVP_PK_DH 0x0004 +# define EVP_PK_EC 0x0008 +# define EVP_PKT_SIGN 0x0010 +# define EVP_PKT_ENC 0x0020 +# define EVP_PKT_EXCH 0x0040 +# define EVP_PKS_RSA 0x0100 +# define EVP_PKS_DSA 0x0200 +# define EVP_PKS_EC 0x0400 +# define EVP_PKT_EXP 0x1000 /* <= 512 bit key */ + +# define EVP_PKEY_NONE NID_undef +# define EVP_PKEY_RSA NID_rsaEncryption +# define EVP_PKEY_RSA2 NID_rsa +# define EVP_PKEY_DSA NID_dsa +# define EVP_PKEY_DSA1 NID_dsa_2 +# define EVP_PKEY_DSA2 NID_dsaWithSHA +# define EVP_PKEY_DSA3 NID_dsaWithSHA1 +# define EVP_PKEY_DSA4 NID_dsaWithSHA1_2 +# define EVP_PKEY_DH NID_dhKeyAgreement +# define EVP_PKEY_DHX NID_dhpublicnumber +# define EVP_PKEY_EC NID_X9_62_id_ecPublicKey +# define EVP_PKEY_HMAC NID_hmac +# define EVP_PKEY_CMAC NID_cmac + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Type needs to be a bit field Sub-type needs to be for variations on the + * method, as in, can it do arbitrary encryption.... + */ +struct evp_pkey_st { + int type; + int save_type; + int references; + const EVP_PKEY_ASN1_METHOD *ameth; + ENGINE *engine; + union { + char *ptr; +# ifndef OPENSSL_NO_RSA + struct rsa_st *rsa; /* RSA */ +# endif +# ifndef OPENSSL_NO_DSA + struct dsa_st *dsa; /* DSA */ +# endif +# ifndef OPENSSL_NO_DH + struct dh_st *dh; /* DH */ +# endif +# ifndef OPENSSL_NO_EC + struct ec_key_st *ec; /* ECC */ +# endif + } pkey; + int save_parameters; + STACK_OF(X509_ATTRIBUTE) *attributes; /* [ 0 ] */ +} /* EVP_PKEY */ ; + +# define EVP_PKEY_MO_SIGN 0x0001 +# define EVP_PKEY_MO_VERIFY 0x0002 +# define EVP_PKEY_MO_ENCRYPT 0x0004 +# define EVP_PKEY_MO_DECRYPT 0x0008 + +# ifndef EVP_MD +struct env_md_st { + int type; + int pkey_type; + int md_size; + unsigned long flags; + int (*init) (EVP_MD_CTX *ctx); + int (*update) (EVP_MD_CTX *ctx, const void *data, size_t count); + int (*final) (EVP_MD_CTX *ctx, unsigned char *md); + int (*copy) (EVP_MD_CTX *to, const EVP_MD_CTX *from); + int (*cleanup) (EVP_MD_CTX *ctx); + /* FIXME: prototype these some day */ + int (*sign) (int type, const unsigned char *m, unsigned int m_length, + unsigned char *sigret, unsigned int *siglen, void *key); + int (*verify) (int type, const unsigned char *m, unsigned int m_length, + const unsigned char *sigbuf, unsigned int siglen, + void *key); + int required_pkey_type[5]; /* EVP_PKEY_xxx */ + int block_size; + int ctx_size; /* how big does the ctx->md_data need to be */ + /* control function */ + int (*md_ctrl) (EVP_MD_CTX *ctx, int cmd, int p1, void *p2); +} /* EVP_MD */ ; + +typedef int evp_sign_method(int type, const unsigned char *m, + unsigned int m_length, unsigned char *sigret, + unsigned int *siglen, void *key); +typedef int evp_verify_method(int type, const unsigned char *m, + unsigned int m_length, + const unsigned char *sigbuf, + unsigned int siglen, void *key); + +/* digest can only handle a single block */ +# define EVP_MD_FLAG_ONESHOT 0x0001 + +/* + * digest is a "clone" digest used + * which is a copy of an existing + * one for a specific public key type. + * EVP_dss1() etc + */ +# define EVP_MD_FLAG_PKEY_DIGEST 0x0002 + +/* Digest uses EVP_PKEY_METHOD for signing instead of MD specific signing */ + +# define EVP_MD_FLAG_PKEY_METHOD_SIGNATURE 0x0004 + +/* DigestAlgorithmIdentifier flags... */ + +# define EVP_MD_FLAG_DIGALGID_MASK 0x0018 + +/* NULL or absent parameter accepted. Use NULL */ + +# define EVP_MD_FLAG_DIGALGID_NULL 0x0000 + +/* NULL or absent parameter accepted. Use NULL for PKCS#1 otherwise absent */ + +# define EVP_MD_FLAG_DIGALGID_ABSENT 0x0008 + +/* Custom handling via ctrl */ + +# define EVP_MD_FLAG_DIGALGID_CUSTOM 0x0018 + +/* Note if suitable for use in FIPS mode */ +# define EVP_MD_FLAG_FIPS 0x0400 + +/* Digest ctrls */ + +# define EVP_MD_CTRL_DIGALGID 0x1 +# define EVP_MD_CTRL_MICALG 0x2 + +/* Minimum Algorithm specific ctrl value */ + +# define EVP_MD_CTRL_ALG_CTRL 0x1000 + +# define EVP_PKEY_NULL_method NULL,NULL,{0,0,0,0} + +# ifndef OPENSSL_NO_DSA +# define EVP_PKEY_DSA_method (evp_sign_method *)DSA_sign, \ + (evp_verify_method *)DSA_verify, \ + {EVP_PKEY_DSA,EVP_PKEY_DSA2,EVP_PKEY_DSA3, \ + EVP_PKEY_DSA4,0} +# else +# define EVP_PKEY_DSA_method EVP_PKEY_NULL_method +# endif + +# ifndef OPENSSL_NO_ECDSA +# define EVP_PKEY_ECDSA_method (evp_sign_method *)ECDSA_sign, \ + (evp_verify_method *)ECDSA_verify, \ + {EVP_PKEY_EC,0,0,0} +# else +# define EVP_PKEY_ECDSA_method EVP_PKEY_NULL_method +# endif + +# ifndef OPENSSL_NO_RSA +# define EVP_PKEY_RSA_method (evp_sign_method *)RSA_sign, \ + (evp_verify_method *)RSA_verify, \ + {EVP_PKEY_RSA,EVP_PKEY_RSA2,0,0} +# define EVP_PKEY_RSA_ASN1_OCTET_STRING_method \ + (evp_sign_method *)RSA_sign_ASN1_OCTET_STRING, \ + (evp_verify_method *)RSA_verify_ASN1_OCTET_STRING, \ + {EVP_PKEY_RSA,EVP_PKEY_RSA2,0,0} +# else +# define EVP_PKEY_RSA_method EVP_PKEY_NULL_method +# define EVP_PKEY_RSA_ASN1_OCTET_STRING_method EVP_PKEY_NULL_method +# endif + +# endif /* !EVP_MD */ + +struct env_md_ctx_st { + const EVP_MD *digest; + ENGINE *engine; /* functional reference if 'digest' is + * ENGINE-provided */ + unsigned long flags; + void *md_data; + /* Public key context for sign/verify */ + EVP_PKEY_CTX *pctx; + /* Update function: usually copied from EVP_MD */ + int (*update) (EVP_MD_CTX *ctx, const void *data, size_t count); +} /* EVP_MD_CTX */ ; + +/* values for EVP_MD_CTX flags */ + +# define EVP_MD_CTX_FLAG_ONESHOT 0x0001/* digest update will be + * called once only */ +# define EVP_MD_CTX_FLAG_CLEANED 0x0002/* context has already been + * cleaned */ +# define EVP_MD_CTX_FLAG_REUSE 0x0004/* Don't free up ctx->md_data + * in EVP_MD_CTX_cleanup */ +/* + * FIPS and pad options are ignored in 1.0.0, definitions are here so we + * don't accidentally reuse the values for other purposes. + */ + +# define EVP_MD_CTX_FLAG_NON_FIPS_ALLOW 0x0008/* Allow use of non FIPS + * digest in FIPS mode */ + +/* + * The following PAD options are also currently ignored in 1.0.0, digest + * parameters are handled through EVP_DigestSign*() and EVP_DigestVerify*() + * instead. + */ +# define EVP_MD_CTX_FLAG_PAD_MASK 0xF0/* RSA mode to use */ +# define EVP_MD_CTX_FLAG_PAD_PKCS1 0x00/* PKCS#1 v1.5 mode */ +# define EVP_MD_CTX_FLAG_PAD_X931 0x10/* X9.31 mode */ +# define EVP_MD_CTX_FLAG_PAD_PSS 0x20/* PSS mode */ + +# define EVP_MD_CTX_FLAG_NO_INIT 0x0100/* Don't initialize md_data */ + +struct evp_cipher_st { + int nid; + int block_size; + /* Default value for variable length ciphers */ + int key_len; + int iv_len; + /* Various flags */ + unsigned long flags; + /* init key */ + int (*init) (EVP_CIPHER_CTX *ctx, const unsigned char *key, + const unsigned char *iv, int enc); + /* encrypt/decrypt data */ + int (*do_cipher) (EVP_CIPHER_CTX *ctx, unsigned char *out, + const unsigned char *in, size_t inl); + /* cleanup ctx */ + int (*cleanup) (EVP_CIPHER_CTX *); + /* how big ctx->cipher_data needs to be */ + int ctx_size; + /* Populate a ASN1_TYPE with parameters */ + int (*set_asn1_parameters) (EVP_CIPHER_CTX *, ASN1_TYPE *); + /* Get parameters from a ASN1_TYPE */ + int (*get_asn1_parameters) (EVP_CIPHER_CTX *, ASN1_TYPE *); + /* Miscellaneous operations */ + int (*ctrl) (EVP_CIPHER_CTX *, int type, int arg, void *ptr); + /* Application data */ + void *app_data; +} /* EVP_CIPHER */ ; + +/* Values for cipher flags */ + +/* Modes for ciphers */ + +# define EVP_CIPH_STREAM_CIPHER 0x0 +# define EVP_CIPH_ECB_MODE 0x1 +# define EVP_CIPH_CBC_MODE 0x2 +# define EVP_CIPH_CFB_MODE 0x3 +# define EVP_CIPH_OFB_MODE 0x4 +# define EVP_CIPH_CTR_MODE 0x5 +# define EVP_CIPH_GCM_MODE 0x6 +# define EVP_CIPH_CCM_MODE 0x7 +# define EVP_CIPH_XTS_MODE 0x10001 +# define EVP_CIPH_WRAP_MODE 0x10002 +# define EVP_CIPH_MODE 0xF0007 +/* Set if variable length cipher */ +# define EVP_CIPH_VARIABLE_LENGTH 0x8 +/* Set if the iv handling should be done by the cipher itself */ +# define EVP_CIPH_CUSTOM_IV 0x10 +/* Set if the cipher's init() function should be called if key is NULL */ +# define EVP_CIPH_ALWAYS_CALL_INIT 0x20 +/* Call ctrl() to init cipher parameters */ +# define EVP_CIPH_CTRL_INIT 0x40 +/* Don't use standard key length function */ +# define EVP_CIPH_CUSTOM_KEY_LENGTH 0x80 +/* Don't use standard block padding */ +# define EVP_CIPH_NO_PADDING 0x100 +/* cipher handles random key generation */ +# define EVP_CIPH_RAND_KEY 0x200 +/* cipher has its own additional copying logic */ +# define EVP_CIPH_CUSTOM_COPY 0x400 +/* Allow use default ASN1 get/set iv */ +# define EVP_CIPH_FLAG_DEFAULT_ASN1 0x1000 +/* Buffer length in bits not bytes: CFB1 mode only */ +# define EVP_CIPH_FLAG_LENGTH_BITS 0x2000 +/* Note if suitable for use in FIPS mode */ +# define EVP_CIPH_FLAG_FIPS 0x4000 +/* Allow non FIPS cipher in FIPS mode */ +# define EVP_CIPH_FLAG_NON_FIPS_ALLOW 0x8000 +/* + * Cipher handles any and all padding logic as well as finalisation. + */ +# define EVP_CIPH_FLAG_CUSTOM_CIPHER 0x100000 +# define EVP_CIPH_FLAG_AEAD_CIPHER 0x200000 +# define EVP_CIPH_FLAG_TLS1_1_MULTIBLOCK 0x400000 + +/* + * Cipher context flag to indicate we can handle wrap mode: if allowed in + * older applications it could overflow buffers. + */ + +# define EVP_CIPHER_CTX_FLAG_WRAP_ALLOW 0x1 + +/* ctrl() values */ + +# define EVP_CTRL_INIT 0x0 +# define EVP_CTRL_SET_KEY_LENGTH 0x1 +# define EVP_CTRL_GET_RC2_KEY_BITS 0x2 +# define EVP_CTRL_SET_RC2_KEY_BITS 0x3 +# define EVP_CTRL_GET_RC5_ROUNDS 0x4 +# define EVP_CTRL_SET_RC5_ROUNDS 0x5 +# define EVP_CTRL_RAND_KEY 0x6 +# define EVP_CTRL_PBE_PRF_NID 0x7 +# define EVP_CTRL_COPY 0x8 +# define EVP_CTRL_GCM_SET_IVLEN 0x9 +# define EVP_CTRL_GCM_GET_TAG 0x10 +# define EVP_CTRL_GCM_SET_TAG 0x11 +# define EVP_CTRL_GCM_SET_IV_FIXED 0x12 +# define EVP_CTRL_GCM_IV_GEN 0x13 +# define EVP_CTRL_CCM_SET_IVLEN EVP_CTRL_GCM_SET_IVLEN +# define EVP_CTRL_CCM_GET_TAG EVP_CTRL_GCM_GET_TAG +# define EVP_CTRL_CCM_SET_TAG EVP_CTRL_GCM_SET_TAG +# define EVP_CTRL_CCM_SET_L 0x14 +# define EVP_CTRL_CCM_SET_MSGLEN 0x15 +/* + * AEAD cipher deduces payload length and returns number of bytes required to + * store MAC and eventual padding. Subsequent call to EVP_Cipher even + * appends/verifies MAC. + */ +# define EVP_CTRL_AEAD_TLS1_AAD 0x16 +/* Used by composite AEAD ciphers, no-op in GCM, CCM... */ +# define EVP_CTRL_AEAD_SET_MAC_KEY 0x17 +/* Set the GCM invocation field, decrypt only */ +# define EVP_CTRL_GCM_SET_IV_INV 0x18 + +# define EVP_CTRL_TLS1_1_MULTIBLOCK_AAD 0x19 +# define EVP_CTRL_TLS1_1_MULTIBLOCK_ENCRYPT 0x1a +# define EVP_CTRL_TLS1_1_MULTIBLOCK_DECRYPT 0x1b +# define EVP_CTRL_TLS1_1_MULTIBLOCK_MAX_BUFSIZE 0x1c + +typedef struct { + unsigned char *out; + const unsigned char *inp; + size_t len; + unsigned int interleave; +} EVP_CTRL_TLS1_1_MULTIBLOCK_PARAM; + +/* GCM TLS constants */ +/* Length of fixed part of IV derived from PRF */ +# define EVP_GCM_TLS_FIXED_IV_LEN 4 +/* Length of explicit part of IV part of TLS records */ +# define EVP_GCM_TLS_EXPLICIT_IV_LEN 8 +/* Length of tag for TLS */ +# define EVP_GCM_TLS_TAG_LEN 16 + +typedef struct evp_cipher_info_st { + const EVP_CIPHER *cipher; + unsigned char iv[EVP_MAX_IV_LENGTH]; +} EVP_CIPHER_INFO; + +struct evp_cipher_ctx_st { + const EVP_CIPHER *cipher; + ENGINE *engine; /* functional reference if 'cipher' is + * ENGINE-provided */ + int encrypt; /* encrypt or decrypt */ + int buf_len; /* number we have left */ + unsigned char oiv[EVP_MAX_IV_LENGTH]; /* original iv */ + unsigned char iv[EVP_MAX_IV_LENGTH]; /* working iv */ + unsigned char buf[EVP_MAX_BLOCK_LENGTH]; /* saved partial block */ + int num; /* used by cfb/ofb/ctr mode */ + void *app_data; /* application stuff */ + int key_len; /* May change for variable length cipher */ + unsigned long flags; /* Various flags */ + void *cipher_data; /* per EVP data */ + int final_used; + int block_mask; + unsigned char final[EVP_MAX_BLOCK_LENGTH]; /* possible final block */ +} /* EVP_CIPHER_CTX */ ; + +typedef struct evp_Encode_Ctx_st { + /* number saved in a partial encode/decode */ + int num; + /* + * The length is either the output line length (in input bytes) or the + * shortest input line length that is ok. Once decoding begins, the + * length is adjusted up each time a longer line is decoded + */ + int length; + /* data to encode */ + unsigned char enc_data[80]; + /* number read on current line */ + int line_num; + int expect_nl; +} EVP_ENCODE_CTX; + +/* Password based encryption function */ +typedef int (EVP_PBE_KEYGEN) (EVP_CIPHER_CTX *ctx, const char *pass, + int passlen, ASN1_TYPE *param, + const EVP_CIPHER *cipher, const EVP_MD *md, + int en_de); + +# ifndef OPENSSL_NO_RSA +# define EVP_PKEY_assign_RSA(pkey,rsa) EVP_PKEY_assign((pkey),EVP_PKEY_RSA,\ + (char *)(rsa)) +# endif + +# ifndef OPENSSL_NO_DSA +# define EVP_PKEY_assign_DSA(pkey,dsa) EVP_PKEY_assign((pkey),EVP_PKEY_DSA,\ + (char *)(dsa)) +# endif + +# ifndef OPENSSL_NO_DH +# define EVP_PKEY_assign_DH(pkey,dh) EVP_PKEY_assign((pkey),EVP_PKEY_DH,\ + (char *)(dh)) +# endif + +# ifndef OPENSSL_NO_EC +# define EVP_PKEY_assign_EC_KEY(pkey,eckey) EVP_PKEY_assign((pkey),EVP_PKEY_EC,\ + (char *)(eckey)) +# endif + +/* Add some extra combinations */ +# define EVP_get_digestbynid(a) EVP_get_digestbyname(OBJ_nid2sn(a)) +# define EVP_get_digestbyobj(a) EVP_get_digestbynid(OBJ_obj2nid(a)) +# define EVP_get_cipherbynid(a) EVP_get_cipherbyname(OBJ_nid2sn(a)) +# define EVP_get_cipherbyobj(a) EVP_get_cipherbynid(OBJ_obj2nid(a)) + +int EVP_MD_type(const EVP_MD *md); +# define EVP_MD_nid(e) EVP_MD_type(e) +# define EVP_MD_name(e) OBJ_nid2sn(EVP_MD_nid(e)) +int EVP_MD_pkey_type(const EVP_MD *md); +int EVP_MD_size(const EVP_MD *md); +int EVP_MD_block_size(const EVP_MD *md); +unsigned long EVP_MD_flags(const EVP_MD *md); + +const EVP_MD *EVP_MD_CTX_md(const EVP_MD_CTX *ctx); +# define EVP_MD_CTX_size(e) EVP_MD_size(EVP_MD_CTX_md(e)) +# define EVP_MD_CTX_block_size(e) EVP_MD_block_size(EVP_MD_CTX_md(e)) +# define EVP_MD_CTX_type(e) EVP_MD_type(EVP_MD_CTX_md(e)) + +int EVP_CIPHER_nid(const EVP_CIPHER *cipher); +# define EVP_CIPHER_name(e) OBJ_nid2sn(EVP_CIPHER_nid(e)) +int EVP_CIPHER_block_size(const EVP_CIPHER *cipher); +int EVP_CIPHER_key_length(const EVP_CIPHER *cipher); +int EVP_CIPHER_iv_length(const EVP_CIPHER *cipher); +unsigned long EVP_CIPHER_flags(const EVP_CIPHER *cipher); +# define EVP_CIPHER_mode(e) (EVP_CIPHER_flags(e) & EVP_CIPH_MODE) + +const EVP_CIPHER *EVP_CIPHER_CTX_cipher(const EVP_CIPHER_CTX *ctx); +int EVP_CIPHER_CTX_nid(const EVP_CIPHER_CTX *ctx); +int EVP_CIPHER_CTX_block_size(const EVP_CIPHER_CTX *ctx); +int EVP_CIPHER_CTX_key_length(const EVP_CIPHER_CTX *ctx); +int EVP_CIPHER_CTX_iv_length(const EVP_CIPHER_CTX *ctx); +int EVP_CIPHER_CTX_copy(EVP_CIPHER_CTX *out, const EVP_CIPHER_CTX *in); +void *EVP_CIPHER_CTX_get_app_data(const EVP_CIPHER_CTX *ctx); +void EVP_CIPHER_CTX_set_app_data(EVP_CIPHER_CTX *ctx, void *data); +# define EVP_CIPHER_CTX_type(c) EVP_CIPHER_type(EVP_CIPHER_CTX_cipher(c)) +unsigned long EVP_CIPHER_CTX_flags(const EVP_CIPHER_CTX *ctx); +# define EVP_CIPHER_CTX_mode(e) (EVP_CIPHER_CTX_flags(e) & EVP_CIPH_MODE) + +# define EVP_ENCODE_LENGTH(l) (((l+2)/3*4)+(l/48+1)*2+80) +# define EVP_DECODE_LENGTH(l) ((l+3)/4*3+80) + +# define EVP_SignInit_ex(a,b,c) EVP_DigestInit_ex(a,b,c) +# define EVP_SignInit(a,b) EVP_DigestInit(a,b) +# define EVP_SignUpdate(a,b,c) EVP_DigestUpdate(a,b,c) +# define EVP_VerifyInit_ex(a,b,c) EVP_DigestInit_ex(a,b,c) +# define EVP_VerifyInit(a,b) EVP_DigestInit(a,b) +# define EVP_VerifyUpdate(a,b,c) EVP_DigestUpdate(a,b,c) +# define EVP_OpenUpdate(a,b,c,d,e) EVP_DecryptUpdate(a,b,c,d,e) +# define EVP_SealUpdate(a,b,c,d,e) EVP_EncryptUpdate(a,b,c,d,e) +# define EVP_DigestSignUpdate(a,b,c) EVP_DigestUpdate(a,b,c) +# define EVP_DigestVerifyUpdate(a,b,c) EVP_DigestUpdate(a,b,c) + +# ifdef CONST_STRICT +void BIO_set_md(BIO *, const EVP_MD *md); +# else +# define BIO_set_md(b,md) BIO_ctrl(b,BIO_C_SET_MD,0,(char *)md) +# endif +# define BIO_get_md(b,mdp) BIO_ctrl(b,BIO_C_GET_MD,0,(char *)mdp) +# define BIO_get_md_ctx(b,mdcp) BIO_ctrl(b,BIO_C_GET_MD_CTX,0,(char *)mdcp) +# define BIO_set_md_ctx(b,mdcp) BIO_ctrl(b,BIO_C_SET_MD_CTX,0,(char *)mdcp) +# define BIO_get_cipher_status(b) BIO_ctrl(b,BIO_C_GET_CIPHER_STATUS,0,NULL) +# define BIO_get_cipher_ctx(b,c_pp) BIO_ctrl(b,BIO_C_GET_CIPHER_CTX,0,(char *)c_pp) + +int EVP_Cipher(EVP_CIPHER_CTX *c, + unsigned char *out, const unsigned char *in, unsigned int inl); + +# define EVP_add_cipher_alias(n,alias) \ + OBJ_NAME_add((alias),OBJ_NAME_TYPE_CIPHER_METH|OBJ_NAME_ALIAS,(n)) +# define EVP_add_digest_alias(n,alias) \ + OBJ_NAME_add((alias),OBJ_NAME_TYPE_MD_METH|OBJ_NAME_ALIAS,(n)) +# define EVP_delete_cipher_alias(alias) \ + OBJ_NAME_remove(alias,OBJ_NAME_TYPE_CIPHER_METH|OBJ_NAME_ALIAS); +# define EVP_delete_digest_alias(alias) \ + OBJ_NAME_remove(alias,OBJ_NAME_TYPE_MD_METH|OBJ_NAME_ALIAS); + +void EVP_MD_CTX_init(EVP_MD_CTX *ctx); +int EVP_MD_CTX_cleanup(EVP_MD_CTX *ctx); +EVP_MD_CTX *EVP_MD_CTX_create(void); +void EVP_MD_CTX_destroy(EVP_MD_CTX *ctx); +int EVP_MD_CTX_copy_ex(EVP_MD_CTX *out, const EVP_MD_CTX *in); +void EVP_MD_CTX_set_flags(EVP_MD_CTX *ctx, int flags); +void EVP_MD_CTX_clear_flags(EVP_MD_CTX *ctx, int flags); +int EVP_MD_CTX_test_flags(const EVP_MD_CTX *ctx, int flags); +int EVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *type, ENGINE *impl); +int EVP_DigestUpdate(EVP_MD_CTX *ctx, const void *d, size_t cnt); +int EVP_DigestFinal_ex(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *s); +int EVP_Digest(const void *data, size_t count, + unsigned char *md, unsigned int *size, const EVP_MD *type, + ENGINE *impl); + +int EVP_MD_CTX_copy(EVP_MD_CTX *out, const EVP_MD_CTX *in); +int EVP_DigestInit(EVP_MD_CTX *ctx, const EVP_MD *type); +int EVP_DigestFinal(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *s); + +int EVP_read_pw_string(char *buf, int length, const char *prompt, int verify); +int EVP_read_pw_string_min(char *buf, int minlen, int maxlen, + const char *prompt, int verify); +void EVP_set_pw_prompt(const char *prompt); +char *EVP_get_pw_prompt(void); + +int EVP_BytesToKey(const EVP_CIPHER *type, const EVP_MD *md, + const unsigned char *salt, const unsigned char *data, + int datal, int count, unsigned char *key, + unsigned char *iv); + +void EVP_CIPHER_CTX_set_flags(EVP_CIPHER_CTX *ctx, int flags); +void EVP_CIPHER_CTX_clear_flags(EVP_CIPHER_CTX *ctx, int flags); +int EVP_CIPHER_CTX_test_flags(const EVP_CIPHER_CTX *ctx, int flags); + +int EVP_EncryptInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, + const unsigned char *key, const unsigned char *iv); +int EVP_EncryptInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, + ENGINE *impl, const unsigned char *key, + const unsigned char *iv); +int EVP_EncryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl, + const unsigned char *in, int inl); +int EVP_EncryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl); +int EVP_EncryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl); + +int EVP_DecryptInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, + const unsigned char *key, const unsigned char *iv); +int EVP_DecryptInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, + ENGINE *impl, const unsigned char *key, + const unsigned char *iv); +int EVP_DecryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl, + const unsigned char *in, int inl); +int EVP_DecryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *outm, int *outl); +int EVP_DecryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *outm, int *outl); + +int EVP_CipherInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, + const unsigned char *key, const unsigned char *iv, + int enc); +int EVP_CipherInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, + ENGINE *impl, const unsigned char *key, + const unsigned char *iv, int enc); +int EVP_CipherUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl, + const unsigned char *in, int inl); +int EVP_CipherFinal(EVP_CIPHER_CTX *ctx, unsigned char *outm, int *outl); +int EVP_CipherFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *outm, int *outl); + +int EVP_SignFinal(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *s, + EVP_PKEY *pkey); + +int EVP_VerifyFinal(EVP_MD_CTX *ctx, const unsigned char *sigbuf, + unsigned int siglen, EVP_PKEY *pkey); + +int EVP_DigestSignInit(EVP_MD_CTX *ctx, EVP_PKEY_CTX **pctx, + const EVP_MD *type, ENGINE *e, EVP_PKEY *pkey); +int EVP_DigestSignFinal(EVP_MD_CTX *ctx, + unsigned char *sigret, size_t *siglen); + +int EVP_DigestVerifyInit(EVP_MD_CTX *ctx, EVP_PKEY_CTX **pctx, + const EVP_MD *type, ENGINE *e, EVP_PKEY *pkey); +int EVP_DigestVerifyFinal(EVP_MD_CTX *ctx, + const unsigned char *sig, size_t siglen); + +int EVP_OpenInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *type, + const unsigned char *ek, int ekl, const unsigned char *iv, + EVP_PKEY *priv); +int EVP_OpenFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl); + +int EVP_SealInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *type, + unsigned char **ek, int *ekl, unsigned char *iv, + EVP_PKEY **pubk, int npubk); +int EVP_SealFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl); + +void EVP_EncodeInit(EVP_ENCODE_CTX *ctx); +void EVP_EncodeUpdate(EVP_ENCODE_CTX *ctx, unsigned char *out, int *outl, + const unsigned char *in, int inl); +void EVP_EncodeFinal(EVP_ENCODE_CTX *ctx, unsigned char *out, int *outl); +int EVP_EncodeBlock(unsigned char *t, const unsigned char *f, int n); + +void EVP_DecodeInit(EVP_ENCODE_CTX *ctx); +int EVP_DecodeUpdate(EVP_ENCODE_CTX *ctx, unsigned char *out, int *outl, + const unsigned char *in, int inl); +int EVP_DecodeFinal(EVP_ENCODE_CTX *ctx, unsigned + char *out, int *outl); +int EVP_DecodeBlock(unsigned char *t, const unsigned char *f, int n); + +void EVP_CIPHER_CTX_init(EVP_CIPHER_CTX *a); +int EVP_CIPHER_CTX_cleanup(EVP_CIPHER_CTX *a); +EVP_CIPHER_CTX *EVP_CIPHER_CTX_new(void); +void EVP_CIPHER_CTX_free(EVP_CIPHER_CTX *a); +int EVP_CIPHER_CTX_set_key_length(EVP_CIPHER_CTX *x, int keylen); +int EVP_CIPHER_CTX_set_padding(EVP_CIPHER_CTX *c, int pad); +int EVP_CIPHER_CTX_ctrl(EVP_CIPHER_CTX *ctx, int type, int arg, void *ptr); +int EVP_CIPHER_CTX_rand_key(EVP_CIPHER_CTX *ctx, unsigned char *key); + +# ifndef OPENSSL_NO_BIO +BIO_METHOD *BIO_f_md(void); +BIO_METHOD *BIO_f_base64(void); +BIO_METHOD *BIO_f_cipher(void); +BIO_METHOD *BIO_f_reliable(void); +void BIO_set_cipher(BIO *b, const EVP_CIPHER *c, const unsigned char *k, + const unsigned char *i, int enc); +# endif + +const EVP_MD *EVP_md_null(void); +# ifndef OPENSSL_NO_MD2 +const EVP_MD *EVP_md2(void); +# endif +# ifndef OPENSSL_NO_MD4 +const EVP_MD *EVP_md4(void); +# endif +# ifndef OPENSSL_NO_MD5 +const EVP_MD *EVP_md5(void); +# endif +# ifndef OPENSSL_NO_SHA +const EVP_MD *EVP_sha(void); +const EVP_MD *EVP_sha1(void); +const EVP_MD *EVP_dss(void); +const EVP_MD *EVP_dss1(void); +const EVP_MD *EVP_ecdsa(void); +# endif +# ifndef OPENSSL_NO_SHA256 +const EVP_MD *EVP_sha224(void); +const EVP_MD *EVP_sha256(void); +# endif +# ifndef OPENSSL_NO_SHA512 +const EVP_MD *EVP_sha384(void); +const EVP_MD *EVP_sha512(void); +# endif +# ifndef OPENSSL_NO_MDC2 +const EVP_MD *EVP_mdc2(void); +# endif +# ifndef OPENSSL_NO_RIPEMD +const EVP_MD *EVP_ripemd160(void); +# endif +# ifndef OPENSSL_NO_WHIRLPOOL +const EVP_MD *EVP_whirlpool(void); +# endif +const EVP_CIPHER *EVP_enc_null(void); /* does nothing :-) */ +# ifndef OPENSSL_NO_DES +const EVP_CIPHER *EVP_des_ecb(void); +const EVP_CIPHER *EVP_des_ede(void); +const EVP_CIPHER *EVP_des_ede3(void); +const EVP_CIPHER *EVP_des_ede_ecb(void); +const EVP_CIPHER *EVP_des_ede3_ecb(void); +const EVP_CIPHER *EVP_des_cfb64(void); +# define EVP_des_cfb EVP_des_cfb64 +const EVP_CIPHER *EVP_des_cfb1(void); +const EVP_CIPHER *EVP_des_cfb8(void); +const EVP_CIPHER *EVP_des_ede_cfb64(void); +# define EVP_des_ede_cfb EVP_des_ede_cfb64 +# if 0 +const EVP_CIPHER *EVP_des_ede_cfb1(void); +const EVP_CIPHER *EVP_des_ede_cfb8(void); +# endif +const EVP_CIPHER *EVP_des_ede3_cfb64(void); +# define EVP_des_ede3_cfb EVP_des_ede3_cfb64 +const EVP_CIPHER *EVP_des_ede3_cfb1(void); +const EVP_CIPHER *EVP_des_ede3_cfb8(void); +const EVP_CIPHER *EVP_des_ofb(void); +const EVP_CIPHER *EVP_des_ede_ofb(void); +const EVP_CIPHER *EVP_des_ede3_ofb(void); +const EVP_CIPHER *EVP_des_cbc(void); +const EVP_CIPHER *EVP_des_ede_cbc(void); +const EVP_CIPHER *EVP_des_ede3_cbc(void); +const EVP_CIPHER *EVP_desx_cbc(void); +const EVP_CIPHER *EVP_des_ede3_wrap(void); +/* + * This should now be supported through the dev_crypto ENGINE. But also, why + * are rc4 and md5 declarations made here inside a "NO_DES" precompiler + * branch? + */ +# if 0 +# ifdef OPENSSL_OPENBSD_DEV_CRYPTO +const EVP_CIPHER *EVP_dev_crypto_des_ede3_cbc(void); +const EVP_CIPHER *EVP_dev_crypto_rc4(void); +const EVP_MD *EVP_dev_crypto_md5(void); +# endif +# endif +# endif +# ifndef OPENSSL_NO_RC4 +const EVP_CIPHER *EVP_rc4(void); +const EVP_CIPHER *EVP_rc4_40(void); +# ifndef OPENSSL_NO_MD5 +const EVP_CIPHER *EVP_rc4_hmac_md5(void); +# endif +# endif +# ifndef OPENSSL_NO_IDEA +const EVP_CIPHER *EVP_idea_ecb(void); +const EVP_CIPHER *EVP_idea_cfb64(void); +# define EVP_idea_cfb EVP_idea_cfb64 +const EVP_CIPHER *EVP_idea_ofb(void); +const EVP_CIPHER *EVP_idea_cbc(void); +# endif +# ifndef OPENSSL_NO_RC2 +const EVP_CIPHER *EVP_rc2_ecb(void); +const EVP_CIPHER *EVP_rc2_cbc(void); +const EVP_CIPHER *EVP_rc2_40_cbc(void); +const EVP_CIPHER *EVP_rc2_64_cbc(void); +const EVP_CIPHER *EVP_rc2_cfb64(void); +# define EVP_rc2_cfb EVP_rc2_cfb64 +const EVP_CIPHER *EVP_rc2_ofb(void); +# endif +# ifndef OPENSSL_NO_BF +const EVP_CIPHER *EVP_bf_ecb(void); +const EVP_CIPHER *EVP_bf_cbc(void); +const EVP_CIPHER *EVP_bf_cfb64(void); +# define EVP_bf_cfb EVP_bf_cfb64 +const EVP_CIPHER *EVP_bf_ofb(void); +# endif +# ifndef OPENSSL_NO_CAST +const EVP_CIPHER *EVP_cast5_ecb(void); +const EVP_CIPHER *EVP_cast5_cbc(void); +const EVP_CIPHER *EVP_cast5_cfb64(void); +# define EVP_cast5_cfb EVP_cast5_cfb64 +const EVP_CIPHER *EVP_cast5_ofb(void); +# endif +# ifndef OPENSSL_NO_RC5 +const EVP_CIPHER *EVP_rc5_32_12_16_cbc(void); +const EVP_CIPHER *EVP_rc5_32_12_16_ecb(void); +const EVP_CIPHER *EVP_rc5_32_12_16_cfb64(void); +# define EVP_rc5_32_12_16_cfb EVP_rc5_32_12_16_cfb64 +const EVP_CIPHER *EVP_rc5_32_12_16_ofb(void); +# endif +# ifndef OPENSSL_NO_AES +const EVP_CIPHER *EVP_aes_128_ecb(void); +const EVP_CIPHER *EVP_aes_128_cbc(void); +const EVP_CIPHER *EVP_aes_128_cfb1(void); +const EVP_CIPHER *EVP_aes_128_cfb8(void); +const EVP_CIPHER *EVP_aes_128_cfb128(void); +# define EVP_aes_128_cfb EVP_aes_128_cfb128 +const EVP_CIPHER *EVP_aes_128_ofb(void); +const EVP_CIPHER *EVP_aes_128_ctr(void); +const EVP_CIPHER *EVP_aes_128_ccm(void); +const EVP_CIPHER *EVP_aes_128_gcm(void); +const EVP_CIPHER *EVP_aes_128_xts(void); +const EVP_CIPHER *EVP_aes_128_wrap(void); +const EVP_CIPHER *EVP_aes_192_ecb(void); +const EVP_CIPHER *EVP_aes_192_cbc(void); +const EVP_CIPHER *EVP_aes_192_cfb1(void); +const EVP_CIPHER *EVP_aes_192_cfb8(void); +const EVP_CIPHER *EVP_aes_192_cfb128(void); +# define EVP_aes_192_cfb EVP_aes_192_cfb128 +const EVP_CIPHER *EVP_aes_192_ofb(void); +const EVP_CIPHER *EVP_aes_192_ctr(void); +const EVP_CIPHER *EVP_aes_192_ccm(void); +const EVP_CIPHER *EVP_aes_192_gcm(void); +const EVP_CIPHER *EVP_aes_192_wrap(void); +const EVP_CIPHER *EVP_aes_256_ecb(void); +const EVP_CIPHER *EVP_aes_256_cbc(void); +const EVP_CIPHER *EVP_aes_256_cfb1(void); +const EVP_CIPHER *EVP_aes_256_cfb8(void); +const EVP_CIPHER *EVP_aes_256_cfb128(void); +# define EVP_aes_256_cfb EVP_aes_256_cfb128 +const EVP_CIPHER *EVP_aes_256_ofb(void); +const EVP_CIPHER *EVP_aes_256_ctr(void); +const EVP_CIPHER *EVP_aes_256_ccm(void); +const EVP_CIPHER *EVP_aes_256_gcm(void); +const EVP_CIPHER *EVP_aes_256_xts(void); +const EVP_CIPHER *EVP_aes_256_wrap(void); +# if !defined(OPENSSL_NO_SHA) && !defined(OPENSSL_NO_SHA1) +const EVP_CIPHER *EVP_aes_128_cbc_hmac_sha1(void); +const EVP_CIPHER *EVP_aes_256_cbc_hmac_sha1(void); +# endif +# ifndef OPENSSL_NO_SHA256 +const EVP_CIPHER *EVP_aes_128_cbc_hmac_sha256(void); +const EVP_CIPHER *EVP_aes_256_cbc_hmac_sha256(void); +# endif +# endif +# ifndef OPENSSL_NO_CAMELLIA +const EVP_CIPHER *EVP_camellia_128_ecb(void); +const EVP_CIPHER *EVP_camellia_128_cbc(void); +const EVP_CIPHER *EVP_camellia_128_cfb1(void); +const EVP_CIPHER *EVP_camellia_128_cfb8(void); +const EVP_CIPHER *EVP_camellia_128_cfb128(void); +# define EVP_camellia_128_cfb EVP_camellia_128_cfb128 +const EVP_CIPHER *EVP_camellia_128_ofb(void); +const EVP_CIPHER *EVP_camellia_192_ecb(void); +const EVP_CIPHER *EVP_camellia_192_cbc(void); +const EVP_CIPHER *EVP_camellia_192_cfb1(void); +const EVP_CIPHER *EVP_camellia_192_cfb8(void); +const EVP_CIPHER *EVP_camellia_192_cfb128(void); +# define EVP_camellia_192_cfb EVP_camellia_192_cfb128 +const EVP_CIPHER *EVP_camellia_192_ofb(void); +const EVP_CIPHER *EVP_camellia_256_ecb(void); +const EVP_CIPHER *EVP_camellia_256_cbc(void); +const EVP_CIPHER *EVP_camellia_256_cfb1(void); +const EVP_CIPHER *EVP_camellia_256_cfb8(void); +const EVP_CIPHER *EVP_camellia_256_cfb128(void); +# define EVP_camellia_256_cfb EVP_camellia_256_cfb128 +const EVP_CIPHER *EVP_camellia_256_ofb(void); +# endif + +# ifndef OPENSSL_NO_SEED +const EVP_CIPHER *EVP_seed_ecb(void); +const EVP_CIPHER *EVP_seed_cbc(void); +const EVP_CIPHER *EVP_seed_cfb128(void); +# define EVP_seed_cfb EVP_seed_cfb128 +const EVP_CIPHER *EVP_seed_ofb(void); +# endif + +void OPENSSL_add_all_algorithms_noconf(void); +void OPENSSL_add_all_algorithms_conf(void); + +# ifdef OPENSSL_LOAD_CONF +# define OpenSSL_add_all_algorithms() \ + OPENSSL_add_all_algorithms_conf() +# else +# define OpenSSL_add_all_algorithms() \ + OPENSSL_add_all_algorithms_noconf() +# endif + +void OpenSSL_add_all_ciphers(void); +void OpenSSL_add_all_digests(void); +# define SSLeay_add_all_algorithms() OpenSSL_add_all_algorithms() +# define SSLeay_add_all_ciphers() OpenSSL_add_all_ciphers() +# define SSLeay_add_all_digests() OpenSSL_add_all_digests() + +int EVP_add_cipher(const EVP_CIPHER *cipher); +int EVP_add_digest(const EVP_MD *digest); + +const EVP_CIPHER *EVP_get_cipherbyname(const char *name); +const EVP_MD *EVP_get_digestbyname(const char *name); +void EVP_cleanup(void); + +void EVP_CIPHER_do_all(void (*fn) (const EVP_CIPHER *ciph, + const char *from, const char *to, void *x), + void *arg); +void EVP_CIPHER_do_all_sorted(void (*fn) + (const EVP_CIPHER *ciph, const char *from, + const char *to, void *x), void *arg); + +void EVP_MD_do_all(void (*fn) (const EVP_MD *ciph, + const char *from, const char *to, void *x), + void *arg); +void EVP_MD_do_all_sorted(void (*fn) + (const EVP_MD *ciph, const char *from, + const char *to, void *x), void *arg); + +int EVP_PKEY_decrypt_old(unsigned char *dec_key, + const unsigned char *enc_key, int enc_key_len, + EVP_PKEY *private_key); +int EVP_PKEY_encrypt_old(unsigned char *enc_key, + const unsigned char *key, int key_len, + EVP_PKEY *pub_key); +int EVP_PKEY_type(int type); +int EVP_PKEY_id(const EVP_PKEY *pkey); +int EVP_PKEY_base_id(const EVP_PKEY *pkey); +int EVP_PKEY_bits(EVP_PKEY *pkey); +int EVP_PKEY_size(EVP_PKEY *pkey); +int EVP_PKEY_set_type(EVP_PKEY *pkey, int type); +int EVP_PKEY_set_type_str(EVP_PKEY *pkey, const char *str, int len); +int EVP_PKEY_assign(EVP_PKEY *pkey, int type, void *key); +void *EVP_PKEY_get0(EVP_PKEY *pkey); + +# ifndef OPENSSL_NO_RSA +struct rsa_st; +int EVP_PKEY_set1_RSA(EVP_PKEY *pkey, struct rsa_st *key); +struct rsa_st *EVP_PKEY_get1_RSA(EVP_PKEY *pkey); +# endif +# ifndef OPENSSL_NO_DSA +struct dsa_st; +int EVP_PKEY_set1_DSA(EVP_PKEY *pkey, struct dsa_st *key); +struct dsa_st *EVP_PKEY_get1_DSA(EVP_PKEY *pkey); +# endif +# ifndef OPENSSL_NO_DH +struct dh_st; +int EVP_PKEY_set1_DH(EVP_PKEY *pkey, struct dh_st *key); +struct dh_st *EVP_PKEY_get1_DH(EVP_PKEY *pkey); +# endif +# ifndef OPENSSL_NO_EC +struct ec_key_st; +int EVP_PKEY_set1_EC_KEY(EVP_PKEY *pkey, struct ec_key_st *key); +struct ec_key_st *EVP_PKEY_get1_EC_KEY(EVP_PKEY *pkey); +# endif + +EVP_PKEY *EVP_PKEY_new(void); +void EVP_PKEY_free(EVP_PKEY *pkey); + +EVP_PKEY *d2i_PublicKey(int type, EVP_PKEY **a, const unsigned char **pp, + long length); +int i2d_PublicKey(EVP_PKEY *a, unsigned char **pp); + +EVP_PKEY *d2i_PrivateKey(int type, EVP_PKEY **a, const unsigned char **pp, + long length); +EVP_PKEY *d2i_AutoPrivateKey(EVP_PKEY **a, const unsigned char **pp, + long length); +int i2d_PrivateKey(EVP_PKEY *a, unsigned char **pp); + +int EVP_PKEY_copy_parameters(EVP_PKEY *to, const EVP_PKEY *from); +int EVP_PKEY_missing_parameters(const EVP_PKEY *pkey); +int EVP_PKEY_save_parameters(EVP_PKEY *pkey, int mode); +int EVP_PKEY_cmp_parameters(const EVP_PKEY *a, const EVP_PKEY *b); + +int EVP_PKEY_cmp(const EVP_PKEY *a, const EVP_PKEY *b); + +int EVP_PKEY_print_public(BIO *out, const EVP_PKEY *pkey, + int indent, ASN1_PCTX *pctx); +int EVP_PKEY_print_private(BIO *out, const EVP_PKEY *pkey, + int indent, ASN1_PCTX *pctx); +int EVP_PKEY_print_params(BIO *out, const EVP_PKEY *pkey, + int indent, ASN1_PCTX *pctx); + +int EVP_PKEY_get_default_digest_nid(EVP_PKEY *pkey, int *pnid); + +int EVP_CIPHER_type(const EVP_CIPHER *ctx); + +/* calls methods */ +int EVP_CIPHER_param_to_asn1(EVP_CIPHER_CTX *c, ASN1_TYPE *type); +int EVP_CIPHER_asn1_to_param(EVP_CIPHER_CTX *c, ASN1_TYPE *type); + +/* These are used by EVP_CIPHER methods */ +int EVP_CIPHER_set_asn1_iv(EVP_CIPHER_CTX *c, ASN1_TYPE *type); +int EVP_CIPHER_get_asn1_iv(EVP_CIPHER_CTX *c, ASN1_TYPE *type); + +/* PKCS5 password based encryption */ +int PKCS5_PBE_keyivgen(EVP_CIPHER_CTX *ctx, const char *pass, int passlen, + ASN1_TYPE *param, const EVP_CIPHER *cipher, + const EVP_MD *md, int en_de); +int PKCS5_PBKDF2_HMAC_SHA1(const char *pass, int passlen, + const unsigned char *salt, int saltlen, int iter, + int keylen, unsigned char *out); +int PKCS5_PBKDF2_HMAC(const char *pass, int passlen, + const unsigned char *salt, int saltlen, int iter, + const EVP_MD *digest, int keylen, unsigned char *out); +int PKCS5_v2_PBE_keyivgen(EVP_CIPHER_CTX *ctx, const char *pass, int passlen, + ASN1_TYPE *param, const EVP_CIPHER *cipher, + const EVP_MD *md, int en_de); + +void PKCS5_PBE_add(void); + +int EVP_PBE_CipherInit(ASN1_OBJECT *pbe_obj, const char *pass, int passlen, + ASN1_TYPE *param, EVP_CIPHER_CTX *ctx, int en_de); + +/* PBE type */ + +/* Can appear as the outermost AlgorithmIdentifier */ +# define EVP_PBE_TYPE_OUTER 0x0 +/* Is an PRF type OID */ +# define EVP_PBE_TYPE_PRF 0x1 + +int EVP_PBE_alg_add_type(int pbe_type, int pbe_nid, int cipher_nid, + int md_nid, EVP_PBE_KEYGEN *keygen); +int EVP_PBE_alg_add(int nid, const EVP_CIPHER *cipher, const EVP_MD *md, + EVP_PBE_KEYGEN *keygen); +int EVP_PBE_find(int type, int pbe_nid, int *pcnid, int *pmnid, + EVP_PBE_KEYGEN **pkeygen); +void EVP_PBE_cleanup(void); + +# define ASN1_PKEY_ALIAS 0x1 +# define ASN1_PKEY_DYNAMIC 0x2 +# define ASN1_PKEY_SIGPARAM_NULL 0x4 + +# define ASN1_PKEY_CTRL_PKCS7_SIGN 0x1 +# define ASN1_PKEY_CTRL_PKCS7_ENCRYPT 0x2 +# define ASN1_PKEY_CTRL_DEFAULT_MD_NID 0x3 +# define ASN1_PKEY_CTRL_CMS_SIGN 0x5 +# define ASN1_PKEY_CTRL_CMS_ENVELOPE 0x7 +# define ASN1_PKEY_CTRL_CMS_RI_TYPE 0x8 + +int EVP_PKEY_asn1_get_count(void); +const EVP_PKEY_ASN1_METHOD *EVP_PKEY_asn1_get0(int idx); +const EVP_PKEY_ASN1_METHOD *EVP_PKEY_asn1_find(ENGINE **pe, int type); +const EVP_PKEY_ASN1_METHOD *EVP_PKEY_asn1_find_str(ENGINE **pe, + const char *str, int len); +int EVP_PKEY_asn1_add0(const EVP_PKEY_ASN1_METHOD *ameth); +int EVP_PKEY_asn1_add_alias(int to, int from); +int EVP_PKEY_asn1_get0_info(int *ppkey_id, int *pkey_base_id, + int *ppkey_flags, const char **pinfo, + const char **ppem_str, + const EVP_PKEY_ASN1_METHOD *ameth); + +const EVP_PKEY_ASN1_METHOD *EVP_PKEY_get0_asn1(EVP_PKEY *pkey); +EVP_PKEY_ASN1_METHOD *EVP_PKEY_asn1_new(int id, int flags, + const char *pem_str, + const char *info); +void EVP_PKEY_asn1_copy(EVP_PKEY_ASN1_METHOD *dst, + const EVP_PKEY_ASN1_METHOD *src); +void EVP_PKEY_asn1_free(EVP_PKEY_ASN1_METHOD *ameth); +void EVP_PKEY_asn1_set_public(EVP_PKEY_ASN1_METHOD *ameth, + int (*pub_decode) (EVP_PKEY *pk, + X509_PUBKEY *pub), + int (*pub_encode) (X509_PUBKEY *pub, + const EVP_PKEY *pk), + int (*pub_cmp) (const EVP_PKEY *a, + const EVP_PKEY *b), + int (*pub_print) (BIO *out, + const EVP_PKEY *pkey, + int indent, ASN1_PCTX *pctx), + int (*pkey_size) (const EVP_PKEY *pk), + int (*pkey_bits) (const EVP_PKEY *pk)); +void EVP_PKEY_asn1_set_private(EVP_PKEY_ASN1_METHOD *ameth, + int (*priv_decode) (EVP_PKEY *pk, + PKCS8_PRIV_KEY_INFO + *p8inf), + int (*priv_encode) (PKCS8_PRIV_KEY_INFO *p8, + const EVP_PKEY *pk), + int (*priv_print) (BIO *out, + const EVP_PKEY *pkey, + int indent, + ASN1_PCTX *pctx)); +void EVP_PKEY_asn1_set_param(EVP_PKEY_ASN1_METHOD *ameth, + int (*param_decode) (EVP_PKEY *pkey, + const unsigned char **pder, + int derlen), + int (*param_encode) (const EVP_PKEY *pkey, + unsigned char **pder), + int (*param_missing) (const EVP_PKEY *pk), + int (*param_copy) (EVP_PKEY *to, + const EVP_PKEY *from), + int (*param_cmp) (const EVP_PKEY *a, + const EVP_PKEY *b), + int (*param_print) (BIO *out, + const EVP_PKEY *pkey, + int indent, + ASN1_PCTX *pctx)); + +void EVP_PKEY_asn1_set_free(EVP_PKEY_ASN1_METHOD *ameth, + void (*pkey_free) (EVP_PKEY *pkey)); +void EVP_PKEY_asn1_set_ctrl(EVP_PKEY_ASN1_METHOD *ameth, + int (*pkey_ctrl) (EVP_PKEY *pkey, int op, + long arg1, void *arg2)); + +# define EVP_PKEY_OP_UNDEFINED 0 +# define EVP_PKEY_OP_PARAMGEN (1<<1) +# define EVP_PKEY_OP_KEYGEN (1<<2) +# define EVP_PKEY_OP_SIGN (1<<3) +# define EVP_PKEY_OP_VERIFY (1<<4) +# define EVP_PKEY_OP_VERIFYRECOVER (1<<5) +# define EVP_PKEY_OP_SIGNCTX (1<<6) +# define EVP_PKEY_OP_VERIFYCTX (1<<7) +# define EVP_PKEY_OP_ENCRYPT (1<<8) +# define EVP_PKEY_OP_DECRYPT (1<<9) +# define EVP_PKEY_OP_DERIVE (1<<10) + +# define EVP_PKEY_OP_TYPE_SIG \ + (EVP_PKEY_OP_SIGN | EVP_PKEY_OP_VERIFY | EVP_PKEY_OP_VERIFYRECOVER \ + | EVP_PKEY_OP_SIGNCTX | EVP_PKEY_OP_VERIFYCTX) + +# define EVP_PKEY_OP_TYPE_CRYPT \ + (EVP_PKEY_OP_ENCRYPT | EVP_PKEY_OP_DECRYPT) + +# define EVP_PKEY_OP_TYPE_NOGEN \ + (EVP_PKEY_OP_SIG | EVP_PKEY_OP_CRYPT | EVP_PKEY_OP_DERIVE) + +# define EVP_PKEY_OP_TYPE_GEN \ + (EVP_PKEY_OP_PARAMGEN | EVP_PKEY_OP_KEYGEN) + +# define EVP_PKEY_CTX_set_signature_md(ctx, md) \ + EVP_PKEY_CTX_ctrl(ctx, -1, EVP_PKEY_OP_TYPE_SIG, \ + EVP_PKEY_CTRL_MD, 0, (void *)md) + +# define EVP_PKEY_CTX_get_signature_md(ctx, pmd) \ + EVP_PKEY_CTX_ctrl(ctx, -1, EVP_PKEY_OP_TYPE_SIG, \ + EVP_PKEY_CTRL_GET_MD, 0, (void *)pmd) + +# define EVP_PKEY_CTRL_MD 1 +# define EVP_PKEY_CTRL_PEER_KEY 2 + +# define EVP_PKEY_CTRL_PKCS7_ENCRYPT 3 +# define EVP_PKEY_CTRL_PKCS7_DECRYPT 4 + +# define EVP_PKEY_CTRL_PKCS7_SIGN 5 + +# define EVP_PKEY_CTRL_SET_MAC_KEY 6 + +# define EVP_PKEY_CTRL_DIGESTINIT 7 + +/* Used by GOST key encryption in TLS */ +# define EVP_PKEY_CTRL_SET_IV 8 + +# define EVP_PKEY_CTRL_CMS_ENCRYPT 9 +# define EVP_PKEY_CTRL_CMS_DECRYPT 10 +# define EVP_PKEY_CTRL_CMS_SIGN 11 + +# define EVP_PKEY_CTRL_CIPHER 12 + +# define EVP_PKEY_CTRL_GET_MD 13 + +# define EVP_PKEY_ALG_CTRL 0x1000 + +# define EVP_PKEY_FLAG_AUTOARGLEN 2 +/* + * Method handles all operations: don't assume any digest related defaults. + */ +# define EVP_PKEY_FLAG_SIGCTX_CUSTOM 4 + +const EVP_PKEY_METHOD *EVP_PKEY_meth_find(int type); +EVP_PKEY_METHOD *EVP_PKEY_meth_new(int id, int flags); +void EVP_PKEY_meth_get0_info(int *ppkey_id, int *pflags, + const EVP_PKEY_METHOD *meth); +void EVP_PKEY_meth_copy(EVP_PKEY_METHOD *dst, const EVP_PKEY_METHOD *src); +void EVP_PKEY_meth_free(EVP_PKEY_METHOD *pmeth); +int EVP_PKEY_meth_add0(const EVP_PKEY_METHOD *pmeth); + +EVP_PKEY_CTX *EVP_PKEY_CTX_new(EVP_PKEY *pkey, ENGINE *e); +EVP_PKEY_CTX *EVP_PKEY_CTX_new_id(int id, ENGINE *e); +EVP_PKEY_CTX *EVP_PKEY_CTX_dup(EVP_PKEY_CTX *ctx); +void EVP_PKEY_CTX_free(EVP_PKEY_CTX *ctx); + +int EVP_PKEY_CTX_ctrl(EVP_PKEY_CTX *ctx, int keytype, int optype, + int cmd, int p1, void *p2); +int EVP_PKEY_CTX_ctrl_str(EVP_PKEY_CTX *ctx, const char *type, + const char *value); + +int EVP_PKEY_CTX_get_operation(EVP_PKEY_CTX *ctx); +void EVP_PKEY_CTX_set0_keygen_info(EVP_PKEY_CTX *ctx, int *dat, int datlen); + +EVP_PKEY *EVP_PKEY_new_mac_key(int type, ENGINE *e, + const unsigned char *key, int keylen); + +void EVP_PKEY_CTX_set_data(EVP_PKEY_CTX *ctx, void *data); +void *EVP_PKEY_CTX_get_data(EVP_PKEY_CTX *ctx); +EVP_PKEY *EVP_PKEY_CTX_get0_pkey(EVP_PKEY_CTX *ctx); + +EVP_PKEY *EVP_PKEY_CTX_get0_peerkey(EVP_PKEY_CTX *ctx); + +void EVP_PKEY_CTX_set_app_data(EVP_PKEY_CTX *ctx, void *data); +void *EVP_PKEY_CTX_get_app_data(EVP_PKEY_CTX *ctx); + +int EVP_PKEY_sign_init(EVP_PKEY_CTX *ctx); +int EVP_PKEY_sign(EVP_PKEY_CTX *ctx, + unsigned char *sig, size_t *siglen, + const unsigned char *tbs, size_t tbslen); +int EVP_PKEY_verify_init(EVP_PKEY_CTX *ctx); +int EVP_PKEY_verify(EVP_PKEY_CTX *ctx, + const unsigned char *sig, size_t siglen, + const unsigned char *tbs, size_t tbslen); +int EVP_PKEY_verify_recover_init(EVP_PKEY_CTX *ctx); +int EVP_PKEY_verify_recover(EVP_PKEY_CTX *ctx, + unsigned char *rout, size_t *routlen, + const unsigned char *sig, size_t siglen); +int EVP_PKEY_encrypt_init(EVP_PKEY_CTX *ctx); +int EVP_PKEY_encrypt(EVP_PKEY_CTX *ctx, + unsigned char *out, size_t *outlen, + const unsigned char *in, size_t inlen); +int EVP_PKEY_decrypt_init(EVP_PKEY_CTX *ctx); +int EVP_PKEY_decrypt(EVP_PKEY_CTX *ctx, + unsigned char *out, size_t *outlen, + const unsigned char *in, size_t inlen); + +int EVP_PKEY_derive_init(EVP_PKEY_CTX *ctx); +int EVP_PKEY_derive_set_peer(EVP_PKEY_CTX *ctx, EVP_PKEY *peer); +int EVP_PKEY_derive(EVP_PKEY_CTX *ctx, unsigned char *key, size_t *keylen); + +typedef int EVP_PKEY_gen_cb (EVP_PKEY_CTX *ctx); + +int EVP_PKEY_paramgen_init(EVP_PKEY_CTX *ctx); +int EVP_PKEY_paramgen(EVP_PKEY_CTX *ctx, EVP_PKEY **ppkey); +int EVP_PKEY_keygen_init(EVP_PKEY_CTX *ctx); +int EVP_PKEY_keygen(EVP_PKEY_CTX *ctx, EVP_PKEY **ppkey); + +void EVP_PKEY_CTX_set_cb(EVP_PKEY_CTX *ctx, EVP_PKEY_gen_cb *cb); +EVP_PKEY_gen_cb *EVP_PKEY_CTX_get_cb(EVP_PKEY_CTX *ctx); + +int EVP_PKEY_CTX_get_keygen_info(EVP_PKEY_CTX *ctx, int idx); + +void EVP_PKEY_meth_set_init(EVP_PKEY_METHOD *pmeth, + int (*init) (EVP_PKEY_CTX *ctx)); + +void EVP_PKEY_meth_set_copy(EVP_PKEY_METHOD *pmeth, + int (*copy) (EVP_PKEY_CTX *dst, + EVP_PKEY_CTX *src)); + +void EVP_PKEY_meth_set_cleanup(EVP_PKEY_METHOD *pmeth, + void (*cleanup) (EVP_PKEY_CTX *ctx)); + +void EVP_PKEY_meth_set_paramgen(EVP_PKEY_METHOD *pmeth, + int (*paramgen_init) (EVP_PKEY_CTX *ctx), + int (*paramgen) (EVP_PKEY_CTX *ctx, + EVP_PKEY *pkey)); + +void EVP_PKEY_meth_set_keygen(EVP_PKEY_METHOD *pmeth, + int (*keygen_init) (EVP_PKEY_CTX *ctx), + int (*keygen) (EVP_PKEY_CTX *ctx, + EVP_PKEY *pkey)); + +void EVP_PKEY_meth_set_sign(EVP_PKEY_METHOD *pmeth, + int (*sign_init) (EVP_PKEY_CTX *ctx), + int (*sign) (EVP_PKEY_CTX *ctx, + unsigned char *sig, size_t *siglen, + const unsigned char *tbs, + size_t tbslen)); + +void EVP_PKEY_meth_set_verify(EVP_PKEY_METHOD *pmeth, + int (*verify_init) (EVP_PKEY_CTX *ctx), + int (*verify) (EVP_PKEY_CTX *ctx, + const unsigned char *sig, + size_t siglen, + const unsigned char *tbs, + size_t tbslen)); + +void EVP_PKEY_meth_set_verify_recover(EVP_PKEY_METHOD *pmeth, + int (*verify_recover_init) (EVP_PKEY_CTX + *ctx), + int (*verify_recover) (EVP_PKEY_CTX + *ctx, + unsigned char + *sig, + size_t *siglen, + const unsigned + char *tbs, + size_t tbslen)); + +void EVP_PKEY_meth_set_signctx(EVP_PKEY_METHOD *pmeth, + int (*signctx_init) (EVP_PKEY_CTX *ctx, + EVP_MD_CTX *mctx), + int (*signctx) (EVP_PKEY_CTX *ctx, + unsigned char *sig, + size_t *siglen, + EVP_MD_CTX *mctx)); + +void EVP_PKEY_meth_set_verifyctx(EVP_PKEY_METHOD *pmeth, + int (*verifyctx_init) (EVP_PKEY_CTX *ctx, + EVP_MD_CTX *mctx), + int (*verifyctx) (EVP_PKEY_CTX *ctx, + const unsigned char *sig, + int siglen, + EVP_MD_CTX *mctx)); + +void EVP_PKEY_meth_set_encrypt(EVP_PKEY_METHOD *pmeth, + int (*encrypt_init) (EVP_PKEY_CTX *ctx), + int (*encryptfn) (EVP_PKEY_CTX *ctx, + unsigned char *out, + size_t *outlen, + const unsigned char *in, + size_t inlen)); + +void EVP_PKEY_meth_set_decrypt(EVP_PKEY_METHOD *pmeth, + int (*decrypt_init) (EVP_PKEY_CTX *ctx), + int (*decrypt) (EVP_PKEY_CTX *ctx, + unsigned char *out, + size_t *outlen, + const unsigned char *in, + size_t inlen)); + +void EVP_PKEY_meth_set_derive(EVP_PKEY_METHOD *pmeth, + int (*derive_init) (EVP_PKEY_CTX *ctx), + int (*derive) (EVP_PKEY_CTX *ctx, + unsigned char *key, + size_t *keylen)); + +void EVP_PKEY_meth_set_ctrl(EVP_PKEY_METHOD *pmeth, + int (*ctrl) (EVP_PKEY_CTX *ctx, int type, int p1, + void *p2), + int (*ctrl_str) (EVP_PKEY_CTX *ctx, + const char *type, + const char *value)); + +void EVP_add_alg_module(void); + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_EVP_strings(void); + +/* Error codes for the EVP functions. */ + +/* Function codes. */ +# define EVP_F_AESNI_INIT_KEY 165 +# define EVP_F_AESNI_XTS_CIPHER 176 +# define EVP_F_AES_INIT_KEY 133 +# define EVP_F_AES_T4_INIT_KEY 178 +# define EVP_F_AES_XTS 172 +# define EVP_F_AES_XTS_CIPHER 175 +# define EVP_F_ALG_MODULE_INIT 177 +# define EVP_F_CAMELLIA_INIT_KEY 159 +# define EVP_F_CMAC_INIT 173 +# define EVP_F_CMLL_T4_INIT_KEY 179 +# define EVP_F_D2I_PKEY 100 +# define EVP_F_DO_SIGVER_INIT 161 +# define EVP_F_DSAPKEY2PKCS8 134 +# define EVP_F_DSA_PKEY2PKCS8 135 +# define EVP_F_ECDSA_PKEY2PKCS8 129 +# define EVP_F_ECKEY_PKEY2PKCS8 132 +# define EVP_F_EVP_CIPHERINIT_EX 123 +# define EVP_F_EVP_CIPHER_CTX_COPY 163 +# define EVP_F_EVP_CIPHER_CTX_CTRL 124 +# define EVP_F_EVP_CIPHER_CTX_SET_KEY_LENGTH 122 +# define EVP_F_EVP_DECRYPTFINAL_EX 101 +# define EVP_F_EVP_DIGESTINIT_EX 128 +# define EVP_F_EVP_ENCRYPTFINAL_EX 127 +# define EVP_F_EVP_MD_CTX_COPY_EX 110 +# define EVP_F_EVP_MD_SIZE 162 +# define EVP_F_EVP_OPENINIT 102 +# define EVP_F_EVP_PBE_ALG_ADD 115 +# define EVP_F_EVP_PBE_ALG_ADD_TYPE 160 +# define EVP_F_EVP_PBE_CIPHERINIT 116 +# define EVP_F_EVP_PKCS82PKEY 111 +# define EVP_F_EVP_PKCS82PKEY_BROKEN 136 +# define EVP_F_EVP_PKEY2PKCS8_BROKEN 113 +# define EVP_F_EVP_PKEY_COPY_PARAMETERS 103 +# define EVP_F_EVP_PKEY_CTX_CTRL 137 +# define EVP_F_EVP_PKEY_CTX_CTRL_STR 150 +# define EVP_F_EVP_PKEY_CTX_DUP 156 +# define EVP_F_EVP_PKEY_DECRYPT 104 +# define EVP_F_EVP_PKEY_DECRYPT_INIT 138 +# define EVP_F_EVP_PKEY_DECRYPT_OLD 151 +# define EVP_F_EVP_PKEY_DERIVE 153 +# define EVP_F_EVP_PKEY_DERIVE_INIT 154 +# define EVP_F_EVP_PKEY_DERIVE_SET_PEER 155 +# define EVP_F_EVP_PKEY_ENCRYPT 105 +# define EVP_F_EVP_PKEY_ENCRYPT_INIT 139 +# define EVP_F_EVP_PKEY_ENCRYPT_OLD 152 +# define EVP_F_EVP_PKEY_GET1_DH 119 +# define EVP_F_EVP_PKEY_GET1_DSA 120 +# define EVP_F_EVP_PKEY_GET1_ECDSA 130 +# define EVP_F_EVP_PKEY_GET1_EC_KEY 131 +# define EVP_F_EVP_PKEY_GET1_RSA 121 +# define EVP_F_EVP_PKEY_KEYGEN 146 +# define EVP_F_EVP_PKEY_KEYGEN_INIT 147 +# define EVP_F_EVP_PKEY_NEW 106 +# define EVP_F_EVP_PKEY_PARAMGEN 148 +# define EVP_F_EVP_PKEY_PARAMGEN_INIT 149 +# define EVP_F_EVP_PKEY_SIGN 140 +# define EVP_F_EVP_PKEY_SIGN_INIT 141 +# define EVP_F_EVP_PKEY_VERIFY 142 +# define EVP_F_EVP_PKEY_VERIFY_INIT 143 +# define EVP_F_EVP_PKEY_VERIFY_RECOVER 144 +# define EVP_F_EVP_PKEY_VERIFY_RECOVER_INIT 145 +# define EVP_F_EVP_RIJNDAEL 126 +# define EVP_F_EVP_SIGNFINAL 107 +# define EVP_F_EVP_VERIFYFINAL 108 +# define EVP_F_FIPS_CIPHERINIT 166 +# define EVP_F_FIPS_CIPHER_CTX_COPY 170 +# define EVP_F_FIPS_CIPHER_CTX_CTRL 167 +# define EVP_F_FIPS_CIPHER_CTX_SET_KEY_LENGTH 171 +# define EVP_F_FIPS_DIGESTINIT 168 +# define EVP_F_FIPS_MD_CTX_COPY 169 +# define EVP_F_HMAC_INIT_EX 174 +# define EVP_F_INT_CTX_NEW 157 +# define EVP_F_PKCS5_PBE_KEYIVGEN 117 +# define EVP_F_PKCS5_V2_PBE_KEYIVGEN 118 +# define EVP_F_PKCS5_V2_PBKDF2_KEYIVGEN 164 +# define EVP_F_PKCS8_SET_BROKEN 112 +# define EVP_F_PKEY_SET_TYPE 158 +# define EVP_F_RC2_MAGIC_TO_METH 109 +# define EVP_F_RC5_CTRL 125 + +/* Reason codes. */ +# define EVP_R_AES_IV_SETUP_FAILED 162 +# define EVP_R_AES_KEY_SETUP_FAILED 143 +# define EVP_R_ASN1_LIB 140 +# define EVP_R_BAD_BLOCK_LENGTH 136 +# define EVP_R_BAD_DECRYPT 100 +# define EVP_R_BAD_KEY_LENGTH 137 +# define EVP_R_BN_DECODE_ERROR 112 +# define EVP_R_BN_PUBKEY_ERROR 113 +# define EVP_R_BUFFER_TOO_SMALL 155 +# define EVP_R_CAMELLIA_KEY_SETUP_FAILED 157 +# define EVP_R_CIPHER_PARAMETER_ERROR 122 +# define EVP_R_COMMAND_NOT_SUPPORTED 147 +# define EVP_R_CTRL_NOT_IMPLEMENTED 132 +# define EVP_R_CTRL_OPERATION_NOT_IMPLEMENTED 133 +# define EVP_R_DATA_NOT_MULTIPLE_OF_BLOCK_LENGTH 138 +# define EVP_R_DECODE_ERROR 114 +# define EVP_R_DIFFERENT_KEY_TYPES 101 +# define EVP_R_DIFFERENT_PARAMETERS 153 +# define EVP_R_DISABLED_FOR_FIPS 163 +# define EVP_R_ENCODE_ERROR 115 +# define EVP_R_ERROR_LOADING_SECTION 165 +# define EVP_R_ERROR_SETTING_FIPS_MODE 166 +# define EVP_R_EVP_PBE_CIPHERINIT_ERROR 119 +# define EVP_R_EXPECTING_AN_RSA_KEY 127 +# define EVP_R_EXPECTING_A_DH_KEY 128 +# define EVP_R_EXPECTING_A_DSA_KEY 129 +# define EVP_R_EXPECTING_A_ECDSA_KEY 141 +# define EVP_R_EXPECTING_A_EC_KEY 142 +# define EVP_R_FIPS_MODE_NOT_SUPPORTED 167 +# define EVP_R_INITIALIZATION_ERROR 134 +# define EVP_R_INPUT_NOT_INITIALIZED 111 +# define EVP_R_INVALID_DIGEST 152 +# define EVP_R_INVALID_FIPS_MODE 168 +# define EVP_R_INVALID_KEY_LENGTH 130 +# define EVP_R_INVALID_OPERATION 148 +# define EVP_R_IV_TOO_LARGE 102 +# define EVP_R_KEYGEN_FAILURE 120 +# define EVP_R_MESSAGE_DIGEST_IS_NULL 159 +# define EVP_R_METHOD_NOT_SUPPORTED 144 +# define EVP_R_MISSING_PARAMETERS 103 +# define EVP_R_NO_CIPHER_SET 131 +# define EVP_R_NO_DEFAULT_DIGEST 158 +# define EVP_R_NO_DIGEST_SET 139 +# define EVP_R_NO_DSA_PARAMETERS 116 +# define EVP_R_NO_KEY_SET 154 +# define EVP_R_NO_OPERATION_SET 149 +# define EVP_R_NO_SIGN_FUNCTION_CONFIGURED 104 +# define EVP_R_NO_VERIFY_FUNCTION_CONFIGURED 105 +# define EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE 150 +# define EVP_R_OPERATON_NOT_INITIALIZED 151 +# define EVP_R_PKCS8_UNKNOWN_BROKEN_TYPE 117 +# define EVP_R_PRIVATE_KEY_DECODE_ERROR 145 +# define EVP_R_PRIVATE_KEY_ENCODE_ERROR 146 +# define EVP_R_PUBLIC_KEY_NOT_RSA 106 +# define EVP_R_TOO_LARGE 164 +# define EVP_R_UNKNOWN_CIPHER 160 +# define EVP_R_UNKNOWN_DIGEST 161 +# define EVP_R_UNKNOWN_OPTION 169 +# define EVP_R_UNKNOWN_PBE_ALGORITHM 121 +# define EVP_R_UNSUPORTED_NUMBER_OF_ROUNDS 135 +# define EVP_R_UNSUPPORTED_ALGORITHM 156 +# define EVP_R_UNSUPPORTED_CIPHER 107 +# define EVP_R_UNSUPPORTED_KEYLENGTH 123 +# define EVP_R_UNSUPPORTED_KEY_DERIVATION_FUNCTION 124 +# define EVP_R_UNSUPPORTED_KEY_SIZE 108 +# define EVP_R_UNSUPPORTED_PRF 125 +# define EVP_R_UNSUPPORTED_PRIVATE_KEY_ALGORITHM 118 +# define EVP_R_UNSUPPORTED_SALT_TYPE 126 +# define EVP_R_WRAP_MODE_NOT_ALLOWED 170 +# define EVP_R_WRONG_FINAL_BLOCK_LENGTH 109 +# define EVP_R_WRONG_PUBLIC_KEY_TYPE 110 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/ext/openssl-osx/include/openssl/hmac.h b/ext/openssl-osx/include/openssl/hmac.h new file mode 100644 index 00000000..b8b55cda --- /dev/null +++ b/ext/openssl-osx/include/openssl/hmac.h @@ -0,0 +1,109 @@ +/* crypto/hmac/hmac.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ +#ifndef HEADER_HMAC_H +# define HEADER_HMAC_H + +# include + +# ifdef OPENSSL_NO_HMAC +# error HMAC is disabled. +# endif + +# include + +# define HMAC_MAX_MD_CBLOCK 128/* largest known is SHA512 */ + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct hmac_ctx_st { + const EVP_MD *md; + EVP_MD_CTX md_ctx; + EVP_MD_CTX i_ctx; + EVP_MD_CTX o_ctx; + unsigned int key_length; + unsigned char key[HMAC_MAX_MD_CBLOCK]; +} HMAC_CTX; + +# define HMAC_size(e) (EVP_MD_size((e)->md)) + +void HMAC_CTX_init(HMAC_CTX *ctx); +void HMAC_CTX_cleanup(HMAC_CTX *ctx); + +/* deprecated */ +# define HMAC_cleanup(ctx) HMAC_CTX_cleanup(ctx) + +/* deprecated */ +int HMAC_Init(HMAC_CTX *ctx, const void *key, int len, const EVP_MD *md); +int HMAC_Init_ex(HMAC_CTX *ctx, const void *key, int len, + const EVP_MD *md, ENGINE *impl); +int HMAC_Update(HMAC_CTX *ctx, const unsigned char *data, size_t len); +int HMAC_Final(HMAC_CTX *ctx, unsigned char *md, unsigned int *len); +unsigned char *HMAC(const EVP_MD *evp_md, const void *key, int key_len, + const unsigned char *d, size_t n, unsigned char *md, + unsigned int *md_len); +int HMAC_CTX_copy(HMAC_CTX *dctx, HMAC_CTX *sctx); + +void HMAC_CTX_set_flags(HMAC_CTX *ctx, unsigned long flags); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ext/openssl-osx/include/openssl/kssl.h b/ext/openssl-osx/include/openssl/kssl.h new file mode 100644 index 00000000..9a576728 --- /dev/null +++ b/ext/openssl-osx/include/openssl/kssl.h @@ -0,0 +1,197 @@ +/* ssl/kssl.h -*- mode: C; c-file-style: "eay" -*- */ +/* + * Written by Vern Staats for the OpenSSL project + * 2000. project 2000. + */ +/* ==================================================================== + * Copyright (c) 2000 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +/* + ** 19990701 VRS Started. + */ + +#ifndef KSSL_H +# define KSSL_H + +# include + +# ifndef OPENSSL_NO_KRB5 + +# include +# include +# include +# ifdef OPENSSL_SYS_WIN32 +/* + * These can sometimes get redefined indirectly by krb5 header files after + * they get undefed in ossl_typ.h + */ +# undef X509_NAME +# undef X509_EXTENSIONS +# undef OCSP_REQUEST +# undef OCSP_RESPONSE +# endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Depending on which KRB5 implementation used, some types from + * the other may be missing. Resolve that here and now + */ +# ifdef KRB5_HEIMDAL +typedef unsigned char krb5_octet; +# define FAR +# else + +# ifndef FAR +# define FAR +# endif + +# endif + +/*- + * Uncomment this to debug kssl problems or + * to trace usage of the Kerberos session key + * + * #define KSSL_DEBUG + */ + +# ifndef KRB5SVC +# define KRB5SVC "host" +# endif + +# ifndef KRB5KEYTAB +# define KRB5KEYTAB "/etc/krb5.keytab" +# endif + +# ifndef KRB5SENDAUTH +# define KRB5SENDAUTH 1 +# endif + +# ifndef KRB5CHECKAUTH +# define KRB5CHECKAUTH 1 +# endif + +# ifndef KSSL_CLOCKSKEW +# define KSSL_CLOCKSKEW 300; +# endif + +# define KSSL_ERR_MAX 255 +typedef struct kssl_err_st { + int reason; + char text[KSSL_ERR_MAX + 1]; +} KSSL_ERR; + +/*- Context for passing + * (1) Kerberos session key to SSL, and + * (2) Config data between application and SSL lib + */ +typedef struct kssl_ctx_st { + /* used by: disposition: */ + char *service_name; /* C,S default ok (kssl) */ + char *service_host; /* C input, REQUIRED */ + char *client_princ; /* S output from krb5 ticket */ + char *keytab_file; /* S NULL (/etc/krb5.keytab) */ + char *cred_cache; /* C NULL (default) */ + krb5_enctype enctype; + int length; + krb5_octet FAR *key; +} KSSL_CTX; + +# define KSSL_CLIENT 1 +# define KSSL_SERVER 2 +# define KSSL_SERVICE 3 +# define KSSL_KEYTAB 4 + +# define KSSL_CTX_OK 0 +# define KSSL_CTX_ERR 1 +# define KSSL_NOMEM 2 + +/* Public (for use by applications that use OpenSSL with Kerberos 5 support */ +krb5_error_code kssl_ctx_setstring(KSSL_CTX *kssl_ctx, int which, char *text); +KSSL_CTX *kssl_ctx_new(void); +KSSL_CTX *kssl_ctx_free(KSSL_CTX *kssl_ctx); +void kssl_ctx_show(KSSL_CTX *kssl_ctx); +krb5_error_code kssl_ctx_setprinc(KSSL_CTX *kssl_ctx, int which, + krb5_data *realm, krb5_data *entity, + int nentities); +krb5_error_code kssl_cget_tkt(KSSL_CTX *kssl_ctx, krb5_data **enc_tktp, + krb5_data *authenp, KSSL_ERR *kssl_err); +krb5_error_code kssl_sget_tkt(KSSL_CTX *kssl_ctx, krb5_data *indata, + krb5_ticket_times *ttimes, KSSL_ERR *kssl_err); +krb5_error_code kssl_ctx_setkey(KSSL_CTX *kssl_ctx, krb5_keyblock *session); +void kssl_err_set(KSSL_ERR *kssl_err, int reason, char *text); +void kssl_krb5_free_data_contents(krb5_context context, krb5_data *data); +krb5_error_code kssl_build_principal_2(krb5_context context, + krb5_principal *princ, int rlen, + const char *realm, int slen, + const char *svc, int hlen, + const char *host); +krb5_error_code kssl_validate_times(krb5_timestamp atime, + krb5_ticket_times *ttimes); +krb5_error_code kssl_check_authent(KSSL_CTX *kssl_ctx, krb5_data *authentp, + krb5_timestamp *atimep, + KSSL_ERR *kssl_err); +unsigned char *kssl_skip_confound(krb5_enctype enctype, unsigned char *authn); + +void SSL_set0_kssl_ctx(SSL *s, KSSL_CTX *kctx); +KSSL_CTX *SSL_get0_kssl_ctx(SSL *s); +char *kssl_ctx_get0_client_princ(KSSL_CTX *kctx); + +#ifdef __cplusplus +} +#endif +# endif /* OPENSSL_NO_KRB5 */ +#endif /* KSSL_H */ diff --git a/ext/openssl-osx/include/openssl/lhash.h b/ext/openssl-osx/include/openssl/lhash.h new file mode 100644 index 00000000..b6c328bf --- /dev/null +++ b/ext/openssl-osx/include/openssl/lhash.h @@ -0,0 +1,240 @@ +/* crypto/lhash/lhash.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +/* + * Header for dynamic hash table routines Author - Eric Young + */ + +#ifndef HEADER_LHASH_H +# define HEADER_LHASH_H + +# include +# ifndef OPENSSL_NO_FP_API +# include +# endif + +# ifndef OPENSSL_NO_BIO +# include +# endif + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct lhash_node_st { + void *data; + struct lhash_node_st *next; +# ifndef OPENSSL_NO_HASH_COMP + unsigned long hash; +# endif +} LHASH_NODE; + +typedef int (*LHASH_COMP_FN_TYPE) (const void *, const void *); +typedef unsigned long (*LHASH_HASH_FN_TYPE) (const void *); +typedef void (*LHASH_DOALL_FN_TYPE) (void *); +typedef void (*LHASH_DOALL_ARG_FN_TYPE) (void *, void *); + +/* + * Macros for declaring and implementing type-safe wrappers for LHASH + * callbacks. This way, callbacks can be provided to LHASH structures without + * function pointer casting and the macro-defined callbacks provide + * per-variable casting before deferring to the underlying type-specific + * callbacks. NB: It is possible to place a "static" in front of both the + * DECLARE and IMPLEMENT macros if the functions are strictly internal. + */ + +/* First: "hash" functions */ +# define DECLARE_LHASH_HASH_FN(name, o_type) \ + unsigned long name##_LHASH_HASH(const void *); +# define IMPLEMENT_LHASH_HASH_FN(name, o_type) \ + unsigned long name##_LHASH_HASH(const void *arg) { \ + const o_type *a = arg; \ + return name##_hash(a); } +# define LHASH_HASH_FN(name) name##_LHASH_HASH + +/* Second: "compare" functions */ +# define DECLARE_LHASH_COMP_FN(name, o_type) \ + int name##_LHASH_COMP(const void *, const void *); +# define IMPLEMENT_LHASH_COMP_FN(name, o_type) \ + int name##_LHASH_COMP(const void *arg1, const void *arg2) { \ + const o_type *a = arg1; \ + const o_type *b = arg2; \ + return name##_cmp(a,b); } +# define LHASH_COMP_FN(name) name##_LHASH_COMP + +/* Third: "doall" functions */ +# define DECLARE_LHASH_DOALL_FN(name, o_type) \ + void name##_LHASH_DOALL(void *); +# define IMPLEMENT_LHASH_DOALL_FN(name, o_type) \ + void name##_LHASH_DOALL(void *arg) { \ + o_type *a = arg; \ + name##_doall(a); } +# define LHASH_DOALL_FN(name) name##_LHASH_DOALL + +/* Fourth: "doall_arg" functions */ +# define DECLARE_LHASH_DOALL_ARG_FN(name, o_type, a_type) \ + void name##_LHASH_DOALL_ARG(void *, void *); +# define IMPLEMENT_LHASH_DOALL_ARG_FN(name, o_type, a_type) \ + void name##_LHASH_DOALL_ARG(void *arg1, void *arg2) { \ + o_type *a = arg1; \ + a_type *b = arg2; \ + name##_doall_arg(a, b); } +# define LHASH_DOALL_ARG_FN(name) name##_LHASH_DOALL_ARG + +typedef struct lhash_st { + LHASH_NODE **b; + LHASH_COMP_FN_TYPE comp; + LHASH_HASH_FN_TYPE hash; + unsigned int num_nodes; + unsigned int num_alloc_nodes; + unsigned int p; + unsigned int pmax; + unsigned long up_load; /* load times 256 */ + unsigned long down_load; /* load times 256 */ + unsigned long num_items; + unsigned long num_expands; + unsigned long num_expand_reallocs; + unsigned long num_contracts; + unsigned long num_contract_reallocs; + unsigned long num_hash_calls; + unsigned long num_comp_calls; + unsigned long num_insert; + unsigned long num_replace; + unsigned long num_delete; + unsigned long num_no_delete; + unsigned long num_retrieve; + unsigned long num_retrieve_miss; + unsigned long num_hash_comps; + int error; +} _LHASH; /* Do not use _LHASH directly, use LHASH_OF + * and friends */ + +# define LH_LOAD_MULT 256 + +/* + * Indicates a malloc() error in the last call, this is only bad in + * lh_insert(). + */ +# define lh_error(lh) ((lh)->error) + +_LHASH *lh_new(LHASH_HASH_FN_TYPE h, LHASH_COMP_FN_TYPE c); +void lh_free(_LHASH *lh); +void *lh_insert(_LHASH *lh, void *data); +void *lh_delete(_LHASH *lh, const void *data); +void *lh_retrieve(_LHASH *lh, const void *data); +void lh_doall(_LHASH *lh, LHASH_DOALL_FN_TYPE func); +void lh_doall_arg(_LHASH *lh, LHASH_DOALL_ARG_FN_TYPE func, void *arg); +unsigned long lh_strhash(const char *c); +unsigned long lh_num_items(const _LHASH *lh); + +# ifndef OPENSSL_NO_FP_API +void lh_stats(const _LHASH *lh, FILE *out); +void lh_node_stats(const _LHASH *lh, FILE *out); +void lh_node_usage_stats(const _LHASH *lh, FILE *out); +# endif + +# ifndef OPENSSL_NO_BIO +void lh_stats_bio(const _LHASH *lh, BIO *out); +void lh_node_stats_bio(const _LHASH *lh, BIO *out); +void lh_node_usage_stats_bio(const _LHASH *lh, BIO *out); +# endif + +/* Type checking... */ + +# define LHASH_OF(type) struct lhash_st_##type + +# define DECLARE_LHASH_OF(type) LHASH_OF(type) { int dummy; } + +# define CHECKED_LHASH_OF(type,lh) \ + ((_LHASH *)CHECKED_PTR_OF(LHASH_OF(type),lh)) + +/* Define wrapper functions. */ +# define LHM_lh_new(type, name) \ + ((LHASH_OF(type) *)lh_new(LHASH_HASH_FN(name), LHASH_COMP_FN(name))) +# define LHM_lh_error(type, lh) \ + lh_error(CHECKED_LHASH_OF(type,lh)) +# define LHM_lh_insert(type, lh, inst) \ + ((type *)lh_insert(CHECKED_LHASH_OF(type, lh), \ + CHECKED_PTR_OF(type, inst))) +# define LHM_lh_retrieve(type, lh, inst) \ + ((type *)lh_retrieve(CHECKED_LHASH_OF(type, lh), \ + CHECKED_PTR_OF(type, inst))) +# define LHM_lh_delete(type, lh, inst) \ + ((type *)lh_delete(CHECKED_LHASH_OF(type, lh), \ + CHECKED_PTR_OF(type, inst))) +# define LHM_lh_doall(type, lh,fn) lh_doall(CHECKED_LHASH_OF(type, lh), fn) +# define LHM_lh_doall_arg(type, lh, fn, arg_type, arg) \ + lh_doall_arg(CHECKED_LHASH_OF(type, lh), fn, CHECKED_PTR_OF(arg_type, arg)) +# define LHM_lh_num_items(type, lh) lh_num_items(CHECKED_LHASH_OF(type, lh)) +# define LHM_lh_down_load(type, lh) (CHECKED_LHASH_OF(type, lh)->down_load) +# define LHM_lh_node_stats_bio(type, lh, out) \ + lh_node_stats_bio(CHECKED_LHASH_OF(type, lh), out) +# define LHM_lh_node_usage_stats_bio(type, lh, out) \ + lh_node_usage_stats_bio(CHECKED_LHASH_OF(type, lh), out) +# define LHM_lh_stats_bio(type, lh, out) \ + lh_stats_bio(CHECKED_LHASH_OF(type, lh), out) +# define LHM_lh_free(type, lh) lh_free(CHECKED_LHASH_OF(type, lh)) + +DECLARE_LHASH_OF(OPENSSL_STRING); +DECLARE_LHASH_OF(OPENSSL_CSTRING); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ext/openssl-osx/include/openssl/obj_mac.h b/ext/openssl-osx/include/openssl/obj_mac.h new file mode 100644 index 00000000..779c309b --- /dev/null +++ b/ext/openssl-osx/include/openssl/obj_mac.h @@ -0,0 +1,4194 @@ +/* crypto/objects/obj_mac.h */ + +/* + * THIS FILE IS GENERATED FROM objects.txt by objects.pl via the following + * command: perl objects.pl objects.txt obj_mac.num obj_mac.h + */ + +/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#define SN_undef "UNDEF" +#define LN_undef "undefined" +#define NID_undef 0 +#define OBJ_undef 0L + +#define SN_itu_t "ITU-T" +#define LN_itu_t "itu-t" +#define NID_itu_t 645 +#define OBJ_itu_t 0L + +#define NID_ccitt 404 +#define OBJ_ccitt OBJ_itu_t + +#define SN_iso "ISO" +#define LN_iso "iso" +#define NID_iso 181 +#define OBJ_iso 1L + +#define SN_joint_iso_itu_t "JOINT-ISO-ITU-T" +#define LN_joint_iso_itu_t "joint-iso-itu-t" +#define NID_joint_iso_itu_t 646 +#define OBJ_joint_iso_itu_t 2L + +#define NID_joint_iso_ccitt 393 +#define OBJ_joint_iso_ccitt OBJ_joint_iso_itu_t + +#define SN_member_body "member-body" +#define LN_member_body "ISO Member Body" +#define NID_member_body 182 +#define OBJ_member_body OBJ_iso,2L + +#define SN_identified_organization "identified-organization" +#define NID_identified_organization 676 +#define OBJ_identified_organization OBJ_iso,3L + +#define SN_hmac_md5 "HMAC-MD5" +#define LN_hmac_md5 "hmac-md5" +#define NID_hmac_md5 780 +#define OBJ_hmac_md5 OBJ_identified_organization,6L,1L,5L,5L,8L,1L,1L + +#define SN_hmac_sha1 "HMAC-SHA1" +#define LN_hmac_sha1 "hmac-sha1" +#define NID_hmac_sha1 781 +#define OBJ_hmac_sha1 OBJ_identified_organization,6L,1L,5L,5L,8L,1L,2L + +#define SN_certicom_arc "certicom-arc" +#define NID_certicom_arc 677 +#define OBJ_certicom_arc OBJ_identified_organization,132L + +#define SN_international_organizations "international-organizations" +#define LN_international_organizations "International Organizations" +#define NID_international_organizations 647 +#define OBJ_international_organizations OBJ_joint_iso_itu_t,23L + +#define SN_wap "wap" +#define NID_wap 678 +#define OBJ_wap OBJ_international_organizations,43L + +#define SN_wap_wsg "wap-wsg" +#define NID_wap_wsg 679 +#define OBJ_wap_wsg OBJ_wap,1L + +#define SN_selected_attribute_types "selected-attribute-types" +#define LN_selected_attribute_types "Selected Attribute Types" +#define NID_selected_attribute_types 394 +#define OBJ_selected_attribute_types OBJ_joint_iso_itu_t,5L,1L,5L + +#define SN_clearance "clearance" +#define NID_clearance 395 +#define OBJ_clearance OBJ_selected_attribute_types,55L + +#define SN_ISO_US "ISO-US" +#define LN_ISO_US "ISO US Member Body" +#define NID_ISO_US 183 +#define OBJ_ISO_US OBJ_member_body,840L + +#define SN_X9_57 "X9-57" +#define LN_X9_57 "X9.57" +#define NID_X9_57 184 +#define OBJ_X9_57 OBJ_ISO_US,10040L + +#define SN_X9cm "X9cm" +#define LN_X9cm "X9.57 CM ?" +#define NID_X9cm 185 +#define OBJ_X9cm OBJ_X9_57,4L + +#define SN_dsa "DSA" +#define LN_dsa "dsaEncryption" +#define NID_dsa 116 +#define OBJ_dsa OBJ_X9cm,1L + +#define SN_dsaWithSHA1 "DSA-SHA1" +#define LN_dsaWithSHA1 "dsaWithSHA1" +#define NID_dsaWithSHA1 113 +#define OBJ_dsaWithSHA1 OBJ_X9cm,3L + +#define SN_ansi_X9_62 "ansi-X9-62" +#define LN_ansi_X9_62 "ANSI X9.62" +#define NID_ansi_X9_62 405 +#define OBJ_ansi_X9_62 OBJ_ISO_US,10045L + +#define OBJ_X9_62_id_fieldType OBJ_ansi_X9_62,1L + +#define SN_X9_62_prime_field "prime-field" +#define NID_X9_62_prime_field 406 +#define OBJ_X9_62_prime_field OBJ_X9_62_id_fieldType,1L + +#define SN_X9_62_characteristic_two_field "characteristic-two-field" +#define NID_X9_62_characteristic_two_field 407 +#define OBJ_X9_62_characteristic_two_field OBJ_X9_62_id_fieldType,2L + +#define SN_X9_62_id_characteristic_two_basis "id-characteristic-two-basis" +#define NID_X9_62_id_characteristic_two_basis 680 +#define OBJ_X9_62_id_characteristic_two_basis OBJ_X9_62_characteristic_two_field,3L + +#define SN_X9_62_onBasis "onBasis" +#define NID_X9_62_onBasis 681 +#define OBJ_X9_62_onBasis OBJ_X9_62_id_characteristic_two_basis,1L + +#define SN_X9_62_tpBasis "tpBasis" +#define NID_X9_62_tpBasis 682 +#define OBJ_X9_62_tpBasis OBJ_X9_62_id_characteristic_two_basis,2L + +#define SN_X9_62_ppBasis "ppBasis" +#define NID_X9_62_ppBasis 683 +#define OBJ_X9_62_ppBasis OBJ_X9_62_id_characteristic_two_basis,3L + +#define OBJ_X9_62_id_publicKeyType OBJ_ansi_X9_62,2L + +#define SN_X9_62_id_ecPublicKey "id-ecPublicKey" +#define NID_X9_62_id_ecPublicKey 408 +#define OBJ_X9_62_id_ecPublicKey OBJ_X9_62_id_publicKeyType,1L + +#define OBJ_X9_62_ellipticCurve OBJ_ansi_X9_62,3L + +#define OBJ_X9_62_c_TwoCurve OBJ_X9_62_ellipticCurve,0L + +#define SN_X9_62_c2pnb163v1 "c2pnb163v1" +#define NID_X9_62_c2pnb163v1 684 +#define OBJ_X9_62_c2pnb163v1 OBJ_X9_62_c_TwoCurve,1L + +#define SN_X9_62_c2pnb163v2 "c2pnb163v2" +#define NID_X9_62_c2pnb163v2 685 +#define OBJ_X9_62_c2pnb163v2 OBJ_X9_62_c_TwoCurve,2L + +#define SN_X9_62_c2pnb163v3 "c2pnb163v3" +#define NID_X9_62_c2pnb163v3 686 +#define OBJ_X9_62_c2pnb163v3 OBJ_X9_62_c_TwoCurve,3L + +#define SN_X9_62_c2pnb176v1 "c2pnb176v1" +#define NID_X9_62_c2pnb176v1 687 +#define OBJ_X9_62_c2pnb176v1 OBJ_X9_62_c_TwoCurve,4L + +#define SN_X9_62_c2tnb191v1 "c2tnb191v1" +#define NID_X9_62_c2tnb191v1 688 +#define OBJ_X9_62_c2tnb191v1 OBJ_X9_62_c_TwoCurve,5L + +#define SN_X9_62_c2tnb191v2 "c2tnb191v2" +#define NID_X9_62_c2tnb191v2 689 +#define OBJ_X9_62_c2tnb191v2 OBJ_X9_62_c_TwoCurve,6L + +#define SN_X9_62_c2tnb191v3 "c2tnb191v3" +#define NID_X9_62_c2tnb191v3 690 +#define OBJ_X9_62_c2tnb191v3 OBJ_X9_62_c_TwoCurve,7L + +#define SN_X9_62_c2onb191v4 "c2onb191v4" +#define NID_X9_62_c2onb191v4 691 +#define OBJ_X9_62_c2onb191v4 OBJ_X9_62_c_TwoCurve,8L + +#define SN_X9_62_c2onb191v5 "c2onb191v5" +#define NID_X9_62_c2onb191v5 692 +#define OBJ_X9_62_c2onb191v5 OBJ_X9_62_c_TwoCurve,9L + +#define SN_X9_62_c2pnb208w1 "c2pnb208w1" +#define NID_X9_62_c2pnb208w1 693 +#define OBJ_X9_62_c2pnb208w1 OBJ_X9_62_c_TwoCurve,10L + +#define SN_X9_62_c2tnb239v1 "c2tnb239v1" +#define NID_X9_62_c2tnb239v1 694 +#define OBJ_X9_62_c2tnb239v1 OBJ_X9_62_c_TwoCurve,11L + +#define SN_X9_62_c2tnb239v2 "c2tnb239v2" +#define NID_X9_62_c2tnb239v2 695 +#define OBJ_X9_62_c2tnb239v2 OBJ_X9_62_c_TwoCurve,12L + +#define SN_X9_62_c2tnb239v3 "c2tnb239v3" +#define NID_X9_62_c2tnb239v3 696 +#define OBJ_X9_62_c2tnb239v3 OBJ_X9_62_c_TwoCurve,13L + +#define SN_X9_62_c2onb239v4 "c2onb239v4" +#define NID_X9_62_c2onb239v4 697 +#define OBJ_X9_62_c2onb239v4 OBJ_X9_62_c_TwoCurve,14L + +#define SN_X9_62_c2onb239v5 "c2onb239v5" +#define NID_X9_62_c2onb239v5 698 +#define OBJ_X9_62_c2onb239v5 OBJ_X9_62_c_TwoCurve,15L + +#define SN_X9_62_c2pnb272w1 "c2pnb272w1" +#define NID_X9_62_c2pnb272w1 699 +#define OBJ_X9_62_c2pnb272w1 OBJ_X9_62_c_TwoCurve,16L + +#define SN_X9_62_c2pnb304w1 "c2pnb304w1" +#define NID_X9_62_c2pnb304w1 700 +#define OBJ_X9_62_c2pnb304w1 OBJ_X9_62_c_TwoCurve,17L + +#define SN_X9_62_c2tnb359v1 "c2tnb359v1" +#define NID_X9_62_c2tnb359v1 701 +#define OBJ_X9_62_c2tnb359v1 OBJ_X9_62_c_TwoCurve,18L + +#define SN_X9_62_c2pnb368w1 "c2pnb368w1" +#define NID_X9_62_c2pnb368w1 702 +#define OBJ_X9_62_c2pnb368w1 OBJ_X9_62_c_TwoCurve,19L + +#define SN_X9_62_c2tnb431r1 "c2tnb431r1" +#define NID_X9_62_c2tnb431r1 703 +#define OBJ_X9_62_c2tnb431r1 OBJ_X9_62_c_TwoCurve,20L + +#define OBJ_X9_62_primeCurve OBJ_X9_62_ellipticCurve,1L + +#define SN_X9_62_prime192v1 "prime192v1" +#define NID_X9_62_prime192v1 409 +#define OBJ_X9_62_prime192v1 OBJ_X9_62_primeCurve,1L + +#define SN_X9_62_prime192v2 "prime192v2" +#define NID_X9_62_prime192v2 410 +#define OBJ_X9_62_prime192v2 OBJ_X9_62_primeCurve,2L + +#define SN_X9_62_prime192v3 "prime192v3" +#define NID_X9_62_prime192v3 411 +#define OBJ_X9_62_prime192v3 OBJ_X9_62_primeCurve,3L + +#define SN_X9_62_prime239v1 "prime239v1" +#define NID_X9_62_prime239v1 412 +#define OBJ_X9_62_prime239v1 OBJ_X9_62_primeCurve,4L + +#define SN_X9_62_prime239v2 "prime239v2" +#define NID_X9_62_prime239v2 413 +#define OBJ_X9_62_prime239v2 OBJ_X9_62_primeCurve,5L + +#define SN_X9_62_prime239v3 "prime239v3" +#define NID_X9_62_prime239v3 414 +#define OBJ_X9_62_prime239v3 OBJ_X9_62_primeCurve,6L + +#define SN_X9_62_prime256v1 "prime256v1" +#define NID_X9_62_prime256v1 415 +#define OBJ_X9_62_prime256v1 OBJ_X9_62_primeCurve,7L + +#define OBJ_X9_62_id_ecSigType OBJ_ansi_X9_62,4L + +#define SN_ecdsa_with_SHA1 "ecdsa-with-SHA1" +#define NID_ecdsa_with_SHA1 416 +#define OBJ_ecdsa_with_SHA1 OBJ_X9_62_id_ecSigType,1L + +#define SN_ecdsa_with_Recommended "ecdsa-with-Recommended" +#define NID_ecdsa_with_Recommended 791 +#define OBJ_ecdsa_with_Recommended OBJ_X9_62_id_ecSigType,2L + +#define SN_ecdsa_with_Specified "ecdsa-with-Specified" +#define NID_ecdsa_with_Specified 792 +#define OBJ_ecdsa_with_Specified OBJ_X9_62_id_ecSigType,3L + +#define SN_ecdsa_with_SHA224 "ecdsa-with-SHA224" +#define NID_ecdsa_with_SHA224 793 +#define OBJ_ecdsa_with_SHA224 OBJ_ecdsa_with_Specified,1L + +#define SN_ecdsa_with_SHA256 "ecdsa-with-SHA256" +#define NID_ecdsa_with_SHA256 794 +#define OBJ_ecdsa_with_SHA256 OBJ_ecdsa_with_Specified,2L + +#define SN_ecdsa_with_SHA384 "ecdsa-with-SHA384" +#define NID_ecdsa_with_SHA384 795 +#define OBJ_ecdsa_with_SHA384 OBJ_ecdsa_with_Specified,3L + +#define SN_ecdsa_with_SHA512 "ecdsa-with-SHA512" +#define NID_ecdsa_with_SHA512 796 +#define OBJ_ecdsa_with_SHA512 OBJ_ecdsa_with_Specified,4L + +#define OBJ_secg_ellipticCurve OBJ_certicom_arc,0L + +#define SN_secp112r1 "secp112r1" +#define NID_secp112r1 704 +#define OBJ_secp112r1 OBJ_secg_ellipticCurve,6L + +#define SN_secp112r2 "secp112r2" +#define NID_secp112r2 705 +#define OBJ_secp112r2 OBJ_secg_ellipticCurve,7L + +#define SN_secp128r1 "secp128r1" +#define NID_secp128r1 706 +#define OBJ_secp128r1 OBJ_secg_ellipticCurve,28L + +#define SN_secp128r2 "secp128r2" +#define NID_secp128r2 707 +#define OBJ_secp128r2 OBJ_secg_ellipticCurve,29L + +#define SN_secp160k1 "secp160k1" +#define NID_secp160k1 708 +#define OBJ_secp160k1 OBJ_secg_ellipticCurve,9L + +#define SN_secp160r1 "secp160r1" +#define NID_secp160r1 709 +#define OBJ_secp160r1 OBJ_secg_ellipticCurve,8L + +#define SN_secp160r2 "secp160r2" +#define NID_secp160r2 710 +#define OBJ_secp160r2 OBJ_secg_ellipticCurve,30L + +#define SN_secp192k1 "secp192k1" +#define NID_secp192k1 711 +#define OBJ_secp192k1 OBJ_secg_ellipticCurve,31L + +#define SN_secp224k1 "secp224k1" +#define NID_secp224k1 712 +#define OBJ_secp224k1 OBJ_secg_ellipticCurve,32L + +#define SN_secp224r1 "secp224r1" +#define NID_secp224r1 713 +#define OBJ_secp224r1 OBJ_secg_ellipticCurve,33L + +#define SN_secp256k1 "secp256k1" +#define NID_secp256k1 714 +#define OBJ_secp256k1 OBJ_secg_ellipticCurve,10L + +#define SN_secp384r1 "secp384r1" +#define NID_secp384r1 715 +#define OBJ_secp384r1 OBJ_secg_ellipticCurve,34L + +#define SN_secp521r1 "secp521r1" +#define NID_secp521r1 716 +#define OBJ_secp521r1 OBJ_secg_ellipticCurve,35L + +#define SN_sect113r1 "sect113r1" +#define NID_sect113r1 717 +#define OBJ_sect113r1 OBJ_secg_ellipticCurve,4L + +#define SN_sect113r2 "sect113r2" +#define NID_sect113r2 718 +#define OBJ_sect113r2 OBJ_secg_ellipticCurve,5L + +#define SN_sect131r1 "sect131r1" +#define NID_sect131r1 719 +#define OBJ_sect131r1 OBJ_secg_ellipticCurve,22L + +#define SN_sect131r2 "sect131r2" +#define NID_sect131r2 720 +#define OBJ_sect131r2 OBJ_secg_ellipticCurve,23L + +#define SN_sect163k1 "sect163k1" +#define NID_sect163k1 721 +#define OBJ_sect163k1 OBJ_secg_ellipticCurve,1L + +#define SN_sect163r1 "sect163r1" +#define NID_sect163r1 722 +#define OBJ_sect163r1 OBJ_secg_ellipticCurve,2L + +#define SN_sect163r2 "sect163r2" +#define NID_sect163r2 723 +#define OBJ_sect163r2 OBJ_secg_ellipticCurve,15L + +#define SN_sect193r1 "sect193r1" +#define NID_sect193r1 724 +#define OBJ_sect193r1 OBJ_secg_ellipticCurve,24L + +#define SN_sect193r2 "sect193r2" +#define NID_sect193r2 725 +#define OBJ_sect193r2 OBJ_secg_ellipticCurve,25L + +#define SN_sect233k1 "sect233k1" +#define NID_sect233k1 726 +#define OBJ_sect233k1 OBJ_secg_ellipticCurve,26L + +#define SN_sect233r1 "sect233r1" +#define NID_sect233r1 727 +#define OBJ_sect233r1 OBJ_secg_ellipticCurve,27L + +#define SN_sect239k1 "sect239k1" +#define NID_sect239k1 728 +#define OBJ_sect239k1 OBJ_secg_ellipticCurve,3L + +#define SN_sect283k1 "sect283k1" +#define NID_sect283k1 729 +#define OBJ_sect283k1 OBJ_secg_ellipticCurve,16L + +#define SN_sect283r1 "sect283r1" +#define NID_sect283r1 730 +#define OBJ_sect283r1 OBJ_secg_ellipticCurve,17L + +#define SN_sect409k1 "sect409k1" +#define NID_sect409k1 731 +#define OBJ_sect409k1 OBJ_secg_ellipticCurve,36L + +#define SN_sect409r1 "sect409r1" +#define NID_sect409r1 732 +#define OBJ_sect409r1 OBJ_secg_ellipticCurve,37L + +#define SN_sect571k1 "sect571k1" +#define NID_sect571k1 733 +#define OBJ_sect571k1 OBJ_secg_ellipticCurve,38L + +#define SN_sect571r1 "sect571r1" +#define NID_sect571r1 734 +#define OBJ_sect571r1 OBJ_secg_ellipticCurve,39L + +#define OBJ_wap_wsg_idm_ecid OBJ_wap_wsg,4L + +#define SN_wap_wsg_idm_ecid_wtls1 "wap-wsg-idm-ecid-wtls1" +#define NID_wap_wsg_idm_ecid_wtls1 735 +#define OBJ_wap_wsg_idm_ecid_wtls1 OBJ_wap_wsg_idm_ecid,1L + +#define SN_wap_wsg_idm_ecid_wtls3 "wap-wsg-idm-ecid-wtls3" +#define NID_wap_wsg_idm_ecid_wtls3 736 +#define OBJ_wap_wsg_idm_ecid_wtls3 OBJ_wap_wsg_idm_ecid,3L + +#define SN_wap_wsg_idm_ecid_wtls4 "wap-wsg-idm-ecid-wtls4" +#define NID_wap_wsg_idm_ecid_wtls4 737 +#define OBJ_wap_wsg_idm_ecid_wtls4 OBJ_wap_wsg_idm_ecid,4L + +#define SN_wap_wsg_idm_ecid_wtls5 "wap-wsg-idm-ecid-wtls5" +#define NID_wap_wsg_idm_ecid_wtls5 738 +#define OBJ_wap_wsg_idm_ecid_wtls5 OBJ_wap_wsg_idm_ecid,5L + +#define SN_wap_wsg_idm_ecid_wtls6 "wap-wsg-idm-ecid-wtls6" +#define NID_wap_wsg_idm_ecid_wtls6 739 +#define OBJ_wap_wsg_idm_ecid_wtls6 OBJ_wap_wsg_idm_ecid,6L + +#define SN_wap_wsg_idm_ecid_wtls7 "wap-wsg-idm-ecid-wtls7" +#define NID_wap_wsg_idm_ecid_wtls7 740 +#define OBJ_wap_wsg_idm_ecid_wtls7 OBJ_wap_wsg_idm_ecid,7L + +#define SN_wap_wsg_idm_ecid_wtls8 "wap-wsg-idm-ecid-wtls8" +#define NID_wap_wsg_idm_ecid_wtls8 741 +#define OBJ_wap_wsg_idm_ecid_wtls8 OBJ_wap_wsg_idm_ecid,8L + +#define SN_wap_wsg_idm_ecid_wtls9 "wap-wsg-idm-ecid-wtls9" +#define NID_wap_wsg_idm_ecid_wtls9 742 +#define OBJ_wap_wsg_idm_ecid_wtls9 OBJ_wap_wsg_idm_ecid,9L + +#define SN_wap_wsg_idm_ecid_wtls10 "wap-wsg-idm-ecid-wtls10" +#define NID_wap_wsg_idm_ecid_wtls10 743 +#define OBJ_wap_wsg_idm_ecid_wtls10 OBJ_wap_wsg_idm_ecid,10L + +#define SN_wap_wsg_idm_ecid_wtls11 "wap-wsg-idm-ecid-wtls11" +#define NID_wap_wsg_idm_ecid_wtls11 744 +#define OBJ_wap_wsg_idm_ecid_wtls11 OBJ_wap_wsg_idm_ecid,11L + +#define SN_wap_wsg_idm_ecid_wtls12 "wap-wsg-idm-ecid-wtls12" +#define NID_wap_wsg_idm_ecid_wtls12 745 +#define OBJ_wap_wsg_idm_ecid_wtls12 OBJ_wap_wsg_idm_ecid,12L + +#define SN_cast5_cbc "CAST5-CBC" +#define LN_cast5_cbc "cast5-cbc" +#define NID_cast5_cbc 108 +#define OBJ_cast5_cbc OBJ_ISO_US,113533L,7L,66L,10L + +#define SN_cast5_ecb "CAST5-ECB" +#define LN_cast5_ecb "cast5-ecb" +#define NID_cast5_ecb 109 + +#define SN_cast5_cfb64 "CAST5-CFB" +#define LN_cast5_cfb64 "cast5-cfb" +#define NID_cast5_cfb64 110 + +#define SN_cast5_ofb64 "CAST5-OFB" +#define LN_cast5_ofb64 "cast5-ofb" +#define NID_cast5_ofb64 111 + +#define LN_pbeWithMD5AndCast5_CBC "pbeWithMD5AndCast5CBC" +#define NID_pbeWithMD5AndCast5_CBC 112 +#define OBJ_pbeWithMD5AndCast5_CBC OBJ_ISO_US,113533L,7L,66L,12L + +#define SN_id_PasswordBasedMAC "id-PasswordBasedMAC" +#define LN_id_PasswordBasedMAC "password based MAC" +#define NID_id_PasswordBasedMAC 782 +#define OBJ_id_PasswordBasedMAC OBJ_ISO_US,113533L,7L,66L,13L + +#define SN_id_DHBasedMac "id-DHBasedMac" +#define LN_id_DHBasedMac "Diffie-Hellman based MAC" +#define NID_id_DHBasedMac 783 +#define OBJ_id_DHBasedMac OBJ_ISO_US,113533L,7L,66L,30L + +#define SN_rsadsi "rsadsi" +#define LN_rsadsi "RSA Data Security, Inc." +#define NID_rsadsi 1 +#define OBJ_rsadsi OBJ_ISO_US,113549L + +#define SN_pkcs "pkcs" +#define LN_pkcs "RSA Data Security, Inc. PKCS" +#define NID_pkcs 2 +#define OBJ_pkcs OBJ_rsadsi,1L + +#define SN_pkcs1 "pkcs1" +#define NID_pkcs1 186 +#define OBJ_pkcs1 OBJ_pkcs,1L + +#define LN_rsaEncryption "rsaEncryption" +#define NID_rsaEncryption 6 +#define OBJ_rsaEncryption OBJ_pkcs1,1L + +#define SN_md2WithRSAEncryption "RSA-MD2" +#define LN_md2WithRSAEncryption "md2WithRSAEncryption" +#define NID_md2WithRSAEncryption 7 +#define OBJ_md2WithRSAEncryption OBJ_pkcs1,2L + +#define SN_md4WithRSAEncryption "RSA-MD4" +#define LN_md4WithRSAEncryption "md4WithRSAEncryption" +#define NID_md4WithRSAEncryption 396 +#define OBJ_md4WithRSAEncryption OBJ_pkcs1,3L + +#define SN_md5WithRSAEncryption "RSA-MD5" +#define LN_md5WithRSAEncryption "md5WithRSAEncryption" +#define NID_md5WithRSAEncryption 8 +#define OBJ_md5WithRSAEncryption OBJ_pkcs1,4L + +#define SN_sha1WithRSAEncryption "RSA-SHA1" +#define LN_sha1WithRSAEncryption "sha1WithRSAEncryption" +#define NID_sha1WithRSAEncryption 65 +#define OBJ_sha1WithRSAEncryption OBJ_pkcs1,5L + +#define SN_rsaesOaep "RSAES-OAEP" +#define LN_rsaesOaep "rsaesOaep" +#define NID_rsaesOaep 919 +#define OBJ_rsaesOaep OBJ_pkcs1,7L + +#define SN_mgf1 "MGF1" +#define LN_mgf1 "mgf1" +#define NID_mgf1 911 +#define OBJ_mgf1 OBJ_pkcs1,8L + +#define SN_pSpecified "PSPECIFIED" +#define LN_pSpecified "pSpecified" +#define NID_pSpecified 935 +#define OBJ_pSpecified OBJ_pkcs1,9L + +#define SN_rsassaPss "RSASSA-PSS" +#define LN_rsassaPss "rsassaPss" +#define NID_rsassaPss 912 +#define OBJ_rsassaPss OBJ_pkcs1,10L + +#define SN_sha256WithRSAEncryption "RSA-SHA256" +#define LN_sha256WithRSAEncryption "sha256WithRSAEncryption" +#define NID_sha256WithRSAEncryption 668 +#define OBJ_sha256WithRSAEncryption OBJ_pkcs1,11L + +#define SN_sha384WithRSAEncryption "RSA-SHA384" +#define LN_sha384WithRSAEncryption "sha384WithRSAEncryption" +#define NID_sha384WithRSAEncryption 669 +#define OBJ_sha384WithRSAEncryption OBJ_pkcs1,12L + +#define SN_sha512WithRSAEncryption "RSA-SHA512" +#define LN_sha512WithRSAEncryption "sha512WithRSAEncryption" +#define NID_sha512WithRSAEncryption 670 +#define OBJ_sha512WithRSAEncryption OBJ_pkcs1,13L + +#define SN_sha224WithRSAEncryption "RSA-SHA224" +#define LN_sha224WithRSAEncryption "sha224WithRSAEncryption" +#define NID_sha224WithRSAEncryption 671 +#define OBJ_sha224WithRSAEncryption OBJ_pkcs1,14L + +#define SN_pkcs3 "pkcs3" +#define NID_pkcs3 27 +#define OBJ_pkcs3 OBJ_pkcs,3L + +#define LN_dhKeyAgreement "dhKeyAgreement" +#define NID_dhKeyAgreement 28 +#define OBJ_dhKeyAgreement OBJ_pkcs3,1L + +#define SN_pkcs5 "pkcs5" +#define NID_pkcs5 187 +#define OBJ_pkcs5 OBJ_pkcs,5L + +#define SN_pbeWithMD2AndDES_CBC "PBE-MD2-DES" +#define LN_pbeWithMD2AndDES_CBC "pbeWithMD2AndDES-CBC" +#define NID_pbeWithMD2AndDES_CBC 9 +#define OBJ_pbeWithMD2AndDES_CBC OBJ_pkcs5,1L + +#define SN_pbeWithMD5AndDES_CBC "PBE-MD5-DES" +#define LN_pbeWithMD5AndDES_CBC "pbeWithMD5AndDES-CBC" +#define NID_pbeWithMD5AndDES_CBC 10 +#define OBJ_pbeWithMD5AndDES_CBC OBJ_pkcs5,3L + +#define SN_pbeWithMD2AndRC2_CBC "PBE-MD2-RC2-64" +#define LN_pbeWithMD2AndRC2_CBC "pbeWithMD2AndRC2-CBC" +#define NID_pbeWithMD2AndRC2_CBC 168 +#define OBJ_pbeWithMD2AndRC2_CBC OBJ_pkcs5,4L + +#define SN_pbeWithMD5AndRC2_CBC "PBE-MD5-RC2-64" +#define LN_pbeWithMD5AndRC2_CBC "pbeWithMD5AndRC2-CBC" +#define NID_pbeWithMD5AndRC2_CBC 169 +#define OBJ_pbeWithMD5AndRC2_CBC OBJ_pkcs5,6L + +#define SN_pbeWithSHA1AndDES_CBC "PBE-SHA1-DES" +#define LN_pbeWithSHA1AndDES_CBC "pbeWithSHA1AndDES-CBC" +#define NID_pbeWithSHA1AndDES_CBC 170 +#define OBJ_pbeWithSHA1AndDES_CBC OBJ_pkcs5,10L + +#define SN_pbeWithSHA1AndRC2_CBC "PBE-SHA1-RC2-64" +#define LN_pbeWithSHA1AndRC2_CBC "pbeWithSHA1AndRC2-CBC" +#define NID_pbeWithSHA1AndRC2_CBC 68 +#define OBJ_pbeWithSHA1AndRC2_CBC OBJ_pkcs5,11L + +#define LN_id_pbkdf2 "PBKDF2" +#define NID_id_pbkdf2 69 +#define OBJ_id_pbkdf2 OBJ_pkcs5,12L + +#define LN_pbes2 "PBES2" +#define NID_pbes2 161 +#define OBJ_pbes2 OBJ_pkcs5,13L + +#define LN_pbmac1 "PBMAC1" +#define NID_pbmac1 162 +#define OBJ_pbmac1 OBJ_pkcs5,14L + +#define SN_pkcs7 "pkcs7" +#define NID_pkcs7 20 +#define OBJ_pkcs7 OBJ_pkcs,7L + +#define LN_pkcs7_data "pkcs7-data" +#define NID_pkcs7_data 21 +#define OBJ_pkcs7_data OBJ_pkcs7,1L + +#define LN_pkcs7_signed "pkcs7-signedData" +#define NID_pkcs7_signed 22 +#define OBJ_pkcs7_signed OBJ_pkcs7,2L + +#define LN_pkcs7_enveloped "pkcs7-envelopedData" +#define NID_pkcs7_enveloped 23 +#define OBJ_pkcs7_enveloped OBJ_pkcs7,3L + +#define LN_pkcs7_signedAndEnveloped "pkcs7-signedAndEnvelopedData" +#define NID_pkcs7_signedAndEnveloped 24 +#define OBJ_pkcs7_signedAndEnveloped OBJ_pkcs7,4L + +#define LN_pkcs7_digest "pkcs7-digestData" +#define NID_pkcs7_digest 25 +#define OBJ_pkcs7_digest OBJ_pkcs7,5L + +#define LN_pkcs7_encrypted "pkcs7-encryptedData" +#define NID_pkcs7_encrypted 26 +#define OBJ_pkcs7_encrypted OBJ_pkcs7,6L + +#define SN_pkcs9 "pkcs9" +#define NID_pkcs9 47 +#define OBJ_pkcs9 OBJ_pkcs,9L + +#define LN_pkcs9_emailAddress "emailAddress" +#define NID_pkcs9_emailAddress 48 +#define OBJ_pkcs9_emailAddress OBJ_pkcs9,1L + +#define LN_pkcs9_unstructuredName "unstructuredName" +#define NID_pkcs9_unstructuredName 49 +#define OBJ_pkcs9_unstructuredName OBJ_pkcs9,2L + +#define LN_pkcs9_contentType "contentType" +#define NID_pkcs9_contentType 50 +#define OBJ_pkcs9_contentType OBJ_pkcs9,3L + +#define LN_pkcs9_messageDigest "messageDigest" +#define NID_pkcs9_messageDigest 51 +#define OBJ_pkcs9_messageDigest OBJ_pkcs9,4L + +#define LN_pkcs9_signingTime "signingTime" +#define NID_pkcs9_signingTime 52 +#define OBJ_pkcs9_signingTime OBJ_pkcs9,5L + +#define LN_pkcs9_countersignature "countersignature" +#define NID_pkcs9_countersignature 53 +#define OBJ_pkcs9_countersignature OBJ_pkcs9,6L + +#define LN_pkcs9_challengePassword "challengePassword" +#define NID_pkcs9_challengePassword 54 +#define OBJ_pkcs9_challengePassword OBJ_pkcs9,7L + +#define LN_pkcs9_unstructuredAddress "unstructuredAddress" +#define NID_pkcs9_unstructuredAddress 55 +#define OBJ_pkcs9_unstructuredAddress OBJ_pkcs9,8L + +#define LN_pkcs9_extCertAttributes "extendedCertificateAttributes" +#define NID_pkcs9_extCertAttributes 56 +#define OBJ_pkcs9_extCertAttributes OBJ_pkcs9,9L + +#define SN_ext_req "extReq" +#define LN_ext_req "Extension Request" +#define NID_ext_req 172 +#define OBJ_ext_req OBJ_pkcs9,14L + +#define SN_SMIMECapabilities "SMIME-CAPS" +#define LN_SMIMECapabilities "S/MIME Capabilities" +#define NID_SMIMECapabilities 167 +#define OBJ_SMIMECapabilities OBJ_pkcs9,15L + +#define SN_SMIME "SMIME" +#define LN_SMIME "S/MIME" +#define NID_SMIME 188 +#define OBJ_SMIME OBJ_pkcs9,16L + +#define SN_id_smime_mod "id-smime-mod" +#define NID_id_smime_mod 189 +#define OBJ_id_smime_mod OBJ_SMIME,0L + +#define SN_id_smime_ct "id-smime-ct" +#define NID_id_smime_ct 190 +#define OBJ_id_smime_ct OBJ_SMIME,1L + +#define SN_id_smime_aa "id-smime-aa" +#define NID_id_smime_aa 191 +#define OBJ_id_smime_aa OBJ_SMIME,2L + +#define SN_id_smime_alg "id-smime-alg" +#define NID_id_smime_alg 192 +#define OBJ_id_smime_alg OBJ_SMIME,3L + +#define SN_id_smime_cd "id-smime-cd" +#define NID_id_smime_cd 193 +#define OBJ_id_smime_cd OBJ_SMIME,4L + +#define SN_id_smime_spq "id-smime-spq" +#define NID_id_smime_spq 194 +#define OBJ_id_smime_spq OBJ_SMIME,5L + +#define SN_id_smime_cti "id-smime-cti" +#define NID_id_smime_cti 195 +#define OBJ_id_smime_cti OBJ_SMIME,6L + +#define SN_id_smime_mod_cms "id-smime-mod-cms" +#define NID_id_smime_mod_cms 196 +#define OBJ_id_smime_mod_cms OBJ_id_smime_mod,1L + +#define SN_id_smime_mod_ess "id-smime-mod-ess" +#define NID_id_smime_mod_ess 197 +#define OBJ_id_smime_mod_ess OBJ_id_smime_mod,2L + +#define SN_id_smime_mod_oid "id-smime-mod-oid" +#define NID_id_smime_mod_oid 198 +#define OBJ_id_smime_mod_oid OBJ_id_smime_mod,3L + +#define SN_id_smime_mod_msg_v3 "id-smime-mod-msg-v3" +#define NID_id_smime_mod_msg_v3 199 +#define OBJ_id_smime_mod_msg_v3 OBJ_id_smime_mod,4L + +#define SN_id_smime_mod_ets_eSignature_88 "id-smime-mod-ets-eSignature-88" +#define NID_id_smime_mod_ets_eSignature_88 200 +#define OBJ_id_smime_mod_ets_eSignature_88 OBJ_id_smime_mod,5L + +#define SN_id_smime_mod_ets_eSignature_97 "id-smime-mod-ets-eSignature-97" +#define NID_id_smime_mod_ets_eSignature_97 201 +#define OBJ_id_smime_mod_ets_eSignature_97 OBJ_id_smime_mod,6L + +#define SN_id_smime_mod_ets_eSigPolicy_88 "id-smime-mod-ets-eSigPolicy-88" +#define NID_id_smime_mod_ets_eSigPolicy_88 202 +#define OBJ_id_smime_mod_ets_eSigPolicy_88 OBJ_id_smime_mod,7L + +#define SN_id_smime_mod_ets_eSigPolicy_97 "id-smime-mod-ets-eSigPolicy-97" +#define NID_id_smime_mod_ets_eSigPolicy_97 203 +#define OBJ_id_smime_mod_ets_eSigPolicy_97 OBJ_id_smime_mod,8L + +#define SN_id_smime_ct_receipt "id-smime-ct-receipt" +#define NID_id_smime_ct_receipt 204 +#define OBJ_id_smime_ct_receipt OBJ_id_smime_ct,1L + +#define SN_id_smime_ct_authData "id-smime-ct-authData" +#define NID_id_smime_ct_authData 205 +#define OBJ_id_smime_ct_authData OBJ_id_smime_ct,2L + +#define SN_id_smime_ct_publishCert "id-smime-ct-publishCert" +#define NID_id_smime_ct_publishCert 206 +#define OBJ_id_smime_ct_publishCert OBJ_id_smime_ct,3L + +#define SN_id_smime_ct_TSTInfo "id-smime-ct-TSTInfo" +#define NID_id_smime_ct_TSTInfo 207 +#define OBJ_id_smime_ct_TSTInfo OBJ_id_smime_ct,4L + +#define SN_id_smime_ct_TDTInfo "id-smime-ct-TDTInfo" +#define NID_id_smime_ct_TDTInfo 208 +#define OBJ_id_smime_ct_TDTInfo OBJ_id_smime_ct,5L + +#define SN_id_smime_ct_contentInfo "id-smime-ct-contentInfo" +#define NID_id_smime_ct_contentInfo 209 +#define OBJ_id_smime_ct_contentInfo OBJ_id_smime_ct,6L + +#define SN_id_smime_ct_DVCSRequestData "id-smime-ct-DVCSRequestData" +#define NID_id_smime_ct_DVCSRequestData 210 +#define OBJ_id_smime_ct_DVCSRequestData OBJ_id_smime_ct,7L + +#define SN_id_smime_ct_DVCSResponseData "id-smime-ct-DVCSResponseData" +#define NID_id_smime_ct_DVCSResponseData 211 +#define OBJ_id_smime_ct_DVCSResponseData OBJ_id_smime_ct,8L + +#define SN_id_smime_ct_compressedData "id-smime-ct-compressedData" +#define NID_id_smime_ct_compressedData 786 +#define OBJ_id_smime_ct_compressedData OBJ_id_smime_ct,9L + +#define SN_id_ct_asciiTextWithCRLF "id-ct-asciiTextWithCRLF" +#define NID_id_ct_asciiTextWithCRLF 787 +#define OBJ_id_ct_asciiTextWithCRLF OBJ_id_smime_ct,27L + +#define SN_id_smime_aa_receiptRequest "id-smime-aa-receiptRequest" +#define NID_id_smime_aa_receiptRequest 212 +#define OBJ_id_smime_aa_receiptRequest OBJ_id_smime_aa,1L + +#define SN_id_smime_aa_securityLabel "id-smime-aa-securityLabel" +#define NID_id_smime_aa_securityLabel 213 +#define OBJ_id_smime_aa_securityLabel OBJ_id_smime_aa,2L + +#define SN_id_smime_aa_mlExpandHistory "id-smime-aa-mlExpandHistory" +#define NID_id_smime_aa_mlExpandHistory 214 +#define OBJ_id_smime_aa_mlExpandHistory OBJ_id_smime_aa,3L + +#define SN_id_smime_aa_contentHint "id-smime-aa-contentHint" +#define NID_id_smime_aa_contentHint 215 +#define OBJ_id_smime_aa_contentHint OBJ_id_smime_aa,4L + +#define SN_id_smime_aa_msgSigDigest "id-smime-aa-msgSigDigest" +#define NID_id_smime_aa_msgSigDigest 216 +#define OBJ_id_smime_aa_msgSigDigest OBJ_id_smime_aa,5L + +#define SN_id_smime_aa_encapContentType "id-smime-aa-encapContentType" +#define NID_id_smime_aa_encapContentType 217 +#define OBJ_id_smime_aa_encapContentType OBJ_id_smime_aa,6L + +#define SN_id_smime_aa_contentIdentifier "id-smime-aa-contentIdentifier" +#define NID_id_smime_aa_contentIdentifier 218 +#define OBJ_id_smime_aa_contentIdentifier OBJ_id_smime_aa,7L + +#define SN_id_smime_aa_macValue "id-smime-aa-macValue" +#define NID_id_smime_aa_macValue 219 +#define OBJ_id_smime_aa_macValue OBJ_id_smime_aa,8L + +#define SN_id_smime_aa_equivalentLabels "id-smime-aa-equivalentLabels" +#define NID_id_smime_aa_equivalentLabels 220 +#define OBJ_id_smime_aa_equivalentLabels OBJ_id_smime_aa,9L + +#define SN_id_smime_aa_contentReference "id-smime-aa-contentReference" +#define NID_id_smime_aa_contentReference 221 +#define OBJ_id_smime_aa_contentReference OBJ_id_smime_aa,10L + +#define SN_id_smime_aa_encrypKeyPref "id-smime-aa-encrypKeyPref" +#define NID_id_smime_aa_encrypKeyPref 222 +#define OBJ_id_smime_aa_encrypKeyPref OBJ_id_smime_aa,11L + +#define SN_id_smime_aa_signingCertificate "id-smime-aa-signingCertificate" +#define NID_id_smime_aa_signingCertificate 223 +#define OBJ_id_smime_aa_signingCertificate OBJ_id_smime_aa,12L + +#define SN_id_smime_aa_smimeEncryptCerts "id-smime-aa-smimeEncryptCerts" +#define NID_id_smime_aa_smimeEncryptCerts 224 +#define OBJ_id_smime_aa_smimeEncryptCerts OBJ_id_smime_aa,13L + +#define SN_id_smime_aa_timeStampToken "id-smime-aa-timeStampToken" +#define NID_id_smime_aa_timeStampToken 225 +#define OBJ_id_smime_aa_timeStampToken OBJ_id_smime_aa,14L + +#define SN_id_smime_aa_ets_sigPolicyId "id-smime-aa-ets-sigPolicyId" +#define NID_id_smime_aa_ets_sigPolicyId 226 +#define OBJ_id_smime_aa_ets_sigPolicyId OBJ_id_smime_aa,15L + +#define SN_id_smime_aa_ets_commitmentType "id-smime-aa-ets-commitmentType" +#define NID_id_smime_aa_ets_commitmentType 227 +#define OBJ_id_smime_aa_ets_commitmentType OBJ_id_smime_aa,16L + +#define SN_id_smime_aa_ets_signerLocation "id-smime-aa-ets-signerLocation" +#define NID_id_smime_aa_ets_signerLocation 228 +#define OBJ_id_smime_aa_ets_signerLocation OBJ_id_smime_aa,17L + +#define SN_id_smime_aa_ets_signerAttr "id-smime-aa-ets-signerAttr" +#define NID_id_smime_aa_ets_signerAttr 229 +#define OBJ_id_smime_aa_ets_signerAttr OBJ_id_smime_aa,18L + +#define SN_id_smime_aa_ets_otherSigCert "id-smime-aa-ets-otherSigCert" +#define NID_id_smime_aa_ets_otherSigCert 230 +#define OBJ_id_smime_aa_ets_otherSigCert OBJ_id_smime_aa,19L + +#define SN_id_smime_aa_ets_contentTimestamp "id-smime-aa-ets-contentTimestamp" +#define NID_id_smime_aa_ets_contentTimestamp 231 +#define OBJ_id_smime_aa_ets_contentTimestamp OBJ_id_smime_aa,20L + +#define SN_id_smime_aa_ets_CertificateRefs "id-smime-aa-ets-CertificateRefs" +#define NID_id_smime_aa_ets_CertificateRefs 232 +#define OBJ_id_smime_aa_ets_CertificateRefs OBJ_id_smime_aa,21L + +#define SN_id_smime_aa_ets_RevocationRefs "id-smime-aa-ets-RevocationRefs" +#define NID_id_smime_aa_ets_RevocationRefs 233 +#define OBJ_id_smime_aa_ets_RevocationRefs OBJ_id_smime_aa,22L + +#define SN_id_smime_aa_ets_certValues "id-smime-aa-ets-certValues" +#define NID_id_smime_aa_ets_certValues 234 +#define OBJ_id_smime_aa_ets_certValues OBJ_id_smime_aa,23L + +#define SN_id_smime_aa_ets_revocationValues "id-smime-aa-ets-revocationValues" +#define NID_id_smime_aa_ets_revocationValues 235 +#define OBJ_id_smime_aa_ets_revocationValues OBJ_id_smime_aa,24L + +#define SN_id_smime_aa_ets_escTimeStamp "id-smime-aa-ets-escTimeStamp" +#define NID_id_smime_aa_ets_escTimeStamp 236 +#define OBJ_id_smime_aa_ets_escTimeStamp OBJ_id_smime_aa,25L + +#define SN_id_smime_aa_ets_certCRLTimestamp "id-smime-aa-ets-certCRLTimestamp" +#define NID_id_smime_aa_ets_certCRLTimestamp 237 +#define OBJ_id_smime_aa_ets_certCRLTimestamp OBJ_id_smime_aa,26L + +#define SN_id_smime_aa_ets_archiveTimeStamp "id-smime-aa-ets-archiveTimeStamp" +#define NID_id_smime_aa_ets_archiveTimeStamp 238 +#define OBJ_id_smime_aa_ets_archiveTimeStamp OBJ_id_smime_aa,27L + +#define SN_id_smime_aa_signatureType "id-smime-aa-signatureType" +#define NID_id_smime_aa_signatureType 239 +#define OBJ_id_smime_aa_signatureType OBJ_id_smime_aa,28L + +#define SN_id_smime_aa_dvcs_dvc "id-smime-aa-dvcs-dvc" +#define NID_id_smime_aa_dvcs_dvc 240 +#define OBJ_id_smime_aa_dvcs_dvc OBJ_id_smime_aa,29L + +#define SN_id_smime_alg_ESDHwith3DES "id-smime-alg-ESDHwith3DES" +#define NID_id_smime_alg_ESDHwith3DES 241 +#define OBJ_id_smime_alg_ESDHwith3DES OBJ_id_smime_alg,1L + +#define SN_id_smime_alg_ESDHwithRC2 "id-smime-alg-ESDHwithRC2" +#define NID_id_smime_alg_ESDHwithRC2 242 +#define OBJ_id_smime_alg_ESDHwithRC2 OBJ_id_smime_alg,2L + +#define SN_id_smime_alg_3DESwrap "id-smime-alg-3DESwrap" +#define NID_id_smime_alg_3DESwrap 243 +#define OBJ_id_smime_alg_3DESwrap OBJ_id_smime_alg,3L + +#define SN_id_smime_alg_RC2wrap "id-smime-alg-RC2wrap" +#define NID_id_smime_alg_RC2wrap 244 +#define OBJ_id_smime_alg_RC2wrap OBJ_id_smime_alg,4L + +#define SN_id_smime_alg_ESDH "id-smime-alg-ESDH" +#define NID_id_smime_alg_ESDH 245 +#define OBJ_id_smime_alg_ESDH OBJ_id_smime_alg,5L + +#define SN_id_smime_alg_CMS3DESwrap "id-smime-alg-CMS3DESwrap" +#define NID_id_smime_alg_CMS3DESwrap 246 +#define OBJ_id_smime_alg_CMS3DESwrap OBJ_id_smime_alg,6L + +#define SN_id_smime_alg_CMSRC2wrap "id-smime-alg-CMSRC2wrap" +#define NID_id_smime_alg_CMSRC2wrap 247 +#define OBJ_id_smime_alg_CMSRC2wrap OBJ_id_smime_alg,7L + +#define SN_id_alg_PWRI_KEK "id-alg-PWRI-KEK" +#define NID_id_alg_PWRI_KEK 893 +#define OBJ_id_alg_PWRI_KEK OBJ_id_smime_alg,9L + +#define SN_id_smime_cd_ldap "id-smime-cd-ldap" +#define NID_id_smime_cd_ldap 248 +#define OBJ_id_smime_cd_ldap OBJ_id_smime_cd,1L + +#define SN_id_smime_spq_ets_sqt_uri "id-smime-spq-ets-sqt-uri" +#define NID_id_smime_spq_ets_sqt_uri 249 +#define OBJ_id_smime_spq_ets_sqt_uri OBJ_id_smime_spq,1L + +#define SN_id_smime_spq_ets_sqt_unotice "id-smime-spq-ets-sqt-unotice" +#define NID_id_smime_spq_ets_sqt_unotice 250 +#define OBJ_id_smime_spq_ets_sqt_unotice OBJ_id_smime_spq,2L + +#define SN_id_smime_cti_ets_proofOfOrigin "id-smime-cti-ets-proofOfOrigin" +#define NID_id_smime_cti_ets_proofOfOrigin 251 +#define OBJ_id_smime_cti_ets_proofOfOrigin OBJ_id_smime_cti,1L + +#define SN_id_smime_cti_ets_proofOfReceipt "id-smime-cti-ets-proofOfReceipt" +#define NID_id_smime_cti_ets_proofOfReceipt 252 +#define OBJ_id_smime_cti_ets_proofOfReceipt OBJ_id_smime_cti,2L + +#define SN_id_smime_cti_ets_proofOfDelivery "id-smime-cti-ets-proofOfDelivery" +#define NID_id_smime_cti_ets_proofOfDelivery 253 +#define OBJ_id_smime_cti_ets_proofOfDelivery OBJ_id_smime_cti,3L + +#define SN_id_smime_cti_ets_proofOfSender "id-smime-cti-ets-proofOfSender" +#define NID_id_smime_cti_ets_proofOfSender 254 +#define OBJ_id_smime_cti_ets_proofOfSender OBJ_id_smime_cti,4L + +#define SN_id_smime_cti_ets_proofOfApproval "id-smime-cti-ets-proofOfApproval" +#define NID_id_smime_cti_ets_proofOfApproval 255 +#define OBJ_id_smime_cti_ets_proofOfApproval OBJ_id_smime_cti,5L + +#define SN_id_smime_cti_ets_proofOfCreation "id-smime-cti-ets-proofOfCreation" +#define NID_id_smime_cti_ets_proofOfCreation 256 +#define OBJ_id_smime_cti_ets_proofOfCreation OBJ_id_smime_cti,6L + +#define LN_friendlyName "friendlyName" +#define NID_friendlyName 156 +#define OBJ_friendlyName OBJ_pkcs9,20L + +#define LN_localKeyID "localKeyID" +#define NID_localKeyID 157 +#define OBJ_localKeyID OBJ_pkcs9,21L + +#define SN_ms_csp_name "CSPName" +#define LN_ms_csp_name "Microsoft CSP Name" +#define NID_ms_csp_name 417 +#define OBJ_ms_csp_name 1L,3L,6L,1L,4L,1L,311L,17L,1L + +#define SN_LocalKeySet "LocalKeySet" +#define LN_LocalKeySet "Microsoft Local Key set" +#define NID_LocalKeySet 856 +#define OBJ_LocalKeySet 1L,3L,6L,1L,4L,1L,311L,17L,2L + +#define OBJ_certTypes OBJ_pkcs9,22L + +#define LN_x509Certificate "x509Certificate" +#define NID_x509Certificate 158 +#define OBJ_x509Certificate OBJ_certTypes,1L + +#define LN_sdsiCertificate "sdsiCertificate" +#define NID_sdsiCertificate 159 +#define OBJ_sdsiCertificate OBJ_certTypes,2L + +#define OBJ_crlTypes OBJ_pkcs9,23L + +#define LN_x509Crl "x509Crl" +#define NID_x509Crl 160 +#define OBJ_x509Crl OBJ_crlTypes,1L + +#define OBJ_pkcs12 OBJ_pkcs,12L + +#define OBJ_pkcs12_pbeids OBJ_pkcs12,1L + +#define SN_pbe_WithSHA1And128BitRC4 "PBE-SHA1-RC4-128" +#define LN_pbe_WithSHA1And128BitRC4 "pbeWithSHA1And128BitRC4" +#define NID_pbe_WithSHA1And128BitRC4 144 +#define OBJ_pbe_WithSHA1And128BitRC4 OBJ_pkcs12_pbeids,1L + +#define SN_pbe_WithSHA1And40BitRC4 "PBE-SHA1-RC4-40" +#define LN_pbe_WithSHA1And40BitRC4 "pbeWithSHA1And40BitRC4" +#define NID_pbe_WithSHA1And40BitRC4 145 +#define OBJ_pbe_WithSHA1And40BitRC4 OBJ_pkcs12_pbeids,2L + +#define SN_pbe_WithSHA1And3_Key_TripleDES_CBC "PBE-SHA1-3DES" +#define LN_pbe_WithSHA1And3_Key_TripleDES_CBC "pbeWithSHA1And3-KeyTripleDES-CBC" +#define NID_pbe_WithSHA1And3_Key_TripleDES_CBC 146 +#define OBJ_pbe_WithSHA1And3_Key_TripleDES_CBC OBJ_pkcs12_pbeids,3L + +#define SN_pbe_WithSHA1And2_Key_TripleDES_CBC "PBE-SHA1-2DES" +#define LN_pbe_WithSHA1And2_Key_TripleDES_CBC "pbeWithSHA1And2-KeyTripleDES-CBC" +#define NID_pbe_WithSHA1And2_Key_TripleDES_CBC 147 +#define OBJ_pbe_WithSHA1And2_Key_TripleDES_CBC OBJ_pkcs12_pbeids,4L + +#define SN_pbe_WithSHA1And128BitRC2_CBC "PBE-SHA1-RC2-128" +#define LN_pbe_WithSHA1And128BitRC2_CBC "pbeWithSHA1And128BitRC2-CBC" +#define NID_pbe_WithSHA1And128BitRC2_CBC 148 +#define OBJ_pbe_WithSHA1And128BitRC2_CBC OBJ_pkcs12_pbeids,5L + +#define SN_pbe_WithSHA1And40BitRC2_CBC "PBE-SHA1-RC2-40" +#define LN_pbe_WithSHA1And40BitRC2_CBC "pbeWithSHA1And40BitRC2-CBC" +#define NID_pbe_WithSHA1And40BitRC2_CBC 149 +#define OBJ_pbe_WithSHA1And40BitRC2_CBC OBJ_pkcs12_pbeids,6L + +#define OBJ_pkcs12_Version1 OBJ_pkcs12,10L + +#define OBJ_pkcs12_BagIds OBJ_pkcs12_Version1,1L + +#define LN_keyBag "keyBag" +#define NID_keyBag 150 +#define OBJ_keyBag OBJ_pkcs12_BagIds,1L + +#define LN_pkcs8ShroudedKeyBag "pkcs8ShroudedKeyBag" +#define NID_pkcs8ShroudedKeyBag 151 +#define OBJ_pkcs8ShroudedKeyBag OBJ_pkcs12_BagIds,2L + +#define LN_certBag "certBag" +#define NID_certBag 152 +#define OBJ_certBag OBJ_pkcs12_BagIds,3L + +#define LN_crlBag "crlBag" +#define NID_crlBag 153 +#define OBJ_crlBag OBJ_pkcs12_BagIds,4L + +#define LN_secretBag "secretBag" +#define NID_secretBag 154 +#define OBJ_secretBag OBJ_pkcs12_BagIds,5L + +#define LN_safeContentsBag "safeContentsBag" +#define NID_safeContentsBag 155 +#define OBJ_safeContentsBag OBJ_pkcs12_BagIds,6L + +#define SN_md2 "MD2" +#define LN_md2 "md2" +#define NID_md2 3 +#define OBJ_md2 OBJ_rsadsi,2L,2L + +#define SN_md4 "MD4" +#define LN_md4 "md4" +#define NID_md4 257 +#define OBJ_md4 OBJ_rsadsi,2L,4L + +#define SN_md5 "MD5" +#define LN_md5 "md5" +#define NID_md5 4 +#define OBJ_md5 OBJ_rsadsi,2L,5L + +#define SN_md5_sha1 "MD5-SHA1" +#define LN_md5_sha1 "md5-sha1" +#define NID_md5_sha1 114 + +#define LN_hmacWithMD5 "hmacWithMD5" +#define NID_hmacWithMD5 797 +#define OBJ_hmacWithMD5 OBJ_rsadsi,2L,6L + +#define LN_hmacWithSHA1 "hmacWithSHA1" +#define NID_hmacWithSHA1 163 +#define OBJ_hmacWithSHA1 OBJ_rsadsi,2L,7L + +#define LN_hmacWithSHA224 "hmacWithSHA224" +#define NID_hmacWithSHA224 798 +#define OBJ_hmacWithSHA224 OBJ_rsadsi,2L,8L + +#define LN_hmacWithSHA256 "hmacWithSHA256" +#define NID_hmacWithSHA256 799 +#define OBJ_hmacWithSHA256 OBJ_rsadsi,2L,9L + +#define LN_hmacWithSHA384 "hmacWithSHA384" +#define NID_hmacWithSHA384 800 +#define OBJ_hmacWithSHA384 OBJ_rsadsi,2L,10L + +#define LN_hmacWithSHA512 "hmacWithSHA512" +#define NID_hmacWithSHA512 801 +#define OBJ_hmacWithSHA512 OBJ_rsadsi,2L,11L + +#define SN_rc2_cbc "RC2-CBC" +#define LN_rc2_cbc "rc2-cbc" +#define NID_rc2_cbc 37 +#define OBJ_rc2_cbc OBJ_rsadsi,3L,2L + +#define SN_rc2_ecb "RC2-ECB" +#define LN_rc2_ecb "rc2-ecb" +#define NID_rc2_ecb 38 + +#define SN_rc2_cfb64 "RC2-CFB" +#define LN_rc2_cfb64 "rc2-cfb" +#define NID_rc2_cfb64 39 + +#define SN_rc2_ofb64 "RC2-OFB" +#define LN_rc2_ofb64 "rc2-ofb" +#define NID_rc2_ofb64 40 + +#define SN_rc2_40_cbc "RC2-40-CBC" +#define LN_rc2_40_cbc "rc2-40-cbc" +#define NID_rc2_40_cbc 98 + +#define SN_rc2_64_cbc "RC2-64-CBC" +#define LN_rc2_64_cbc "rc2-64-cbc" +#define NID_rc2_64_cbc 166 + +#define SN_rc4 "RC4" +#define LN_rc4 "rc4" +#define NID_rc4 5 +#define OBJ_rc4 OBJ_rsadsi,3L,4L + +#define SN_rc4_40 "RC4-40" +#define LN_rc4_40 "rc4-40" +#define NID_rc4_40 97 + +#define SN_des_ede3_cbc "DES-EDE3-CBC" +#define LN_des_ede3_cbc "des-ede3-cbc" +#define NID_des_ede3_cbc 44 +#define OBJ_des_ede3_cbc OBJ_rsadsi,3L,7L + +#define SN_rc5_cbc "RC5-CBC" +#define LN_rc5_cbc "rc5-cbc" +#define NID_rc5_cbc 120 +#define OBJ_rc5_cbc OBJ_rsadsi,3L,8L + +#define SN_rc5_ecb "RC5-ECB" +#define LN_rc5_ecb "rc5-ecb" +#define NID_rc5_ecb 121 + +#define SN_rc5_cfb64 "RC5-CFB" +#define LN_rc5_cfb64 "rc5-cfb" +#define NID_rc5_cfb64 122 + +#define SN_rc5_ofb64 "RC5-OFB" +#define LN_rc5_ofb64 "rc5-ofb" +#define NID_rc5_ofb64 123 + +#define SN_ms_ext_req "msExtReq" +#define LN_ms_ext_req "Microsoft Extension Request" +#define NID_ms_ext_req 171 +#define OBJ_ms_ext_req 1L,3L,6L,1L,4L,1L,311L,2L,1L,14L + +#define SN_ms_code_ind "msCodeInd" +#define LN_ms_code_ind "Microsoft Individual Code Signing" +#define NID_ms_code_ind 134 +#define OBJ_ms_code_ind 1L,3L,6L,1L,4L,1L,311L,2L,1L,21L + +#define SN_ms_code_com "msCodeCom" +#define LN_ms_code_com "Microsoft Commercial Code Signing" +#define NID_ms_code_com 135 +#define OBJ_ms_code_com 1L,3L,6L,1L,4L,1L,311L,2L,1L,22L + +#define SN_ms_ctl_sign "msCTLSign" +#define LN_ms_ctl_sign "Microsoft Trust List Signing" +#define NID_ms_ctl_sign 136 +#define OBJ_ms_ctl_sign 1L,3L,6L,1L,4L,1L,311L,10L,3L,1L + +#define SN_ms_sgc "msSGC" +#define LN_ms_sgc "Microsoft Server Gated Crypto" +#define NID_ms_sgc 137 +#define OBJ_ms_sgc 1L,3L,6L,1L,4L,1L,311L,10L,3L,3L + +#define SN_ms_efs "msEFS" +#define LN_ms_efs "Microsoft Encrypted File System" +#define NID_ms_efs 138 +#define OBJ_ms_efs 1L,3L,6L,1L,4L,1L,311L,10L,3L,4L + +#define SN_ms_smartcard_login "msSmartcardLogin" +#define LN_ms_smartcard_login "Microsoft Smartcardlogin" +#define NID_ms_smartcard_login 648 +#define OBJ_ms_smartcard_login 1L,3L,6L,1L,4L,1L,311L,20L,2L,2L + +#define SN_ms_upn "msUPN" +#define LN_ms_upn "Microsoft Universal Principal Name" +#define NID_ms_upn 649 +#define OBJ_ms_upn 1L,3L,6L,1L,4L,1L,311L,20L,2L,3L + +#define SN_idea_cbc "IDEA-CBC" +#define LN_idea_cbc "idea-cbc" +#define NID_idea_cbc 34 +#define OBJ_idea_cbc 1L,3L,6L,1L,4L,1L,188L,7L,1L,1L,2L + +#define SN_idea_ecb "IDEA-ECB" +#define LN_idea_ecb "idea-ecb" +#define NID_idea_ecb 36 + +#define SN_idea_cfb64 "IDEA-CFB" +#define LN_idea_cfb64 "idea-cfb" +#define NID_idea_cfb64 35 + +#define SN_idea_ofb64 "IDEA-OFB" +#define LN_idea_ofb64 "idea-ofb" +#define NID_idea_ofb64 46 + +#define SN_bf_cbc "BF-CBC" +#define LN_bf_cbc "bf-cbc" +#define NID_bf_cbc 91 +#define OBJ_bf_cbc 1L,3L,6L,1L,4L,1L,3029L,1L,2L + +#define SN_bf_ecb "BF-ECB" +#define LN_bf_ecb "bf-ecb" +#define NID_bf_ecb 92 + +#define SN_bf_cfb64 "BF-CFB" +#define LN_bf_cfb64 "bf-cfb" +#define NID_bf_cfb64 93 + +#define SN_bf_ofb64 "BF-OFB" +#define LN_bf_ofb64 "bf-ofb" +#define NID_bf_ofb64 94 + +#define SN_id_pkix "PKIX" +#define NID_id_pkix 127 +#define OBJ_id_pkix 1L,3L,6L,1L,5L,5L,7L + +#define SN_id_pkix_mod "id-pkix-mod" +#define NID_id_pkix_mod 258 +#define OBJ_id_pkix_mod OBJ_id_pkix,0L + +#define SN_id_pe "id-pe" +#define NID_id_pe 175 +#define OBJ_id_pe OBJ_id_pkix,1L + +#define SN_id_qt "id-qt" +#define NID_id_qt 259 +#define OBJ_id_qt OBJ_id_pkix,2L + +#define SN_id_kp "id-kp" +#define NID_id_kp 128 +#define OBJ_id_kp OBJ_id_pkix,3L + +#define SN_id_it "id-it" +#define NID_id_it 260 +#define OBJ_id_it OBJ_id_pkix,4L + +#define SN_id_pkip "id-pkip" +#define NID_id_pkip 261 +#define OBJ_id_pkip OBJ_id_pkix,5L + +#define SN_id_alg "id-alg" +#define NID_id_alg 262 +#define OBJ_id_alg OBJ_id_pkix,6L + +#define SN_id_cmc "id-cmc" +#define NID_id_cmc 263 +#define OBJ_id_cmc OBJ_id_pkix,7L + +#define SN_id_on "id-on" +#define NID_id_on 264 +#define OBJ_id_on OBJ_id_pkix,8L + +#define SN_id_pda "id-pda" +#define NID_id_pda 265 +#define OBJ_id_pda OBJ_id_pkix,9L + +#define SN_id_aca "id-aca" +#define NID_id_aca 266 +#define OBJ_id_aca OBJ_id_pkix,10L + +#define SN_id_qcs "id-qcs" +#define NID_id_qcs 267 +#define OBJ_id_qcs OBJ_id_pkix,11L + +#define SN_id_cct "id-cct" +#define NID_id_cct 268 +#define OBJ_id_cct OBJ_id_pkix,12L + +#define SN_id_ppl "id-ppl" +#define NID_id_ppl 662 +#define OBJ_id_ppl OBJ_id_pkix,21L + +#define SN_id_ad "id-ad" +#define NID_id_ad 176 +#define OBJ_id_ad OBJ_id_pkix,48L + +#define SN_id_pkix1_explicit_88 "id-pkix1-explicit-88" +#define NID_id_pkix1_explicit_88 269 +#define OBJ_id_pkix1_explicit_88 OBJ_id_pkix_mod,1L + +#define SN_id_pkix1_implicit_88 "id-pkix1-implicit-88" +#define NID_id_pkix1_implicit_88 270 +#define OBJ_id_pkix1_implicit_88 OBJ_id_pkix_mod,2L + +#define SN_id_pkix1_explicit_93 "id-pkix1-explicit-93" +#define NID_id_pkix1_explicit_93 271 +#define OBJ_id_pkix1_explicit_93 OBJ_id_pkix_mod,3L + +#define SN_id_pkix1_implicit_93 "id-pkix1-implicit-93" +#define NID_id_pkix1_implicit_93 272 +#define OBJ_id_pkix1_implicit_93 OBJ_id_pkix_mod,4L + +#define SN_id_mod_crmf "id-mod-crmf" +#define NID_id_mod_crmf 273 +#define OBJ_id_mod_crmf OBJ_id_pkix_mod,5L + +#define SN_id_mod_cmc "id-mod-cmc" +#define NID_id_mod_cmc 274 +#define OBJ_id_mod_cmc OBJ_id_pkix_mod,6L + +#define SN_id_mod_kea_profile_88 "id-mod-kea-profile-88" +#define NID_id_mod_kea_profile_88 275 +#define OBJ_id_mod_kea_profile_88 OBJ_id_pkix_mod,7L + +#define SN_id_mod_kea_profile_93 "id-mod-kea-profile-93" +#define NID_id_mod_kea_profile_93 276 +#define OBJ_id_mod_kea_profile_93 OBJ_id_pkix_mod,8L + +#define SN_id_mod_cmp "id-mod-cmp" +#define NID_id_mod_cmp 277 +#define OBJ_id_mod_cmp OBJ_id_pkix_mod,9L + +#define SN_id_mod_qualified_cert_88 "id-mod-qualified-cert-88" +#define NID_id_mod_qualified_cert_88 278 +#define OBJ_id_mod_qualified_cert_88 OBJ_id_pkix_mod,10L + +#define SN_id_mod_qualified_cert_93 "id-mod-qualified-cert-93" +#define NID_id_mod_qualified_cert_93 279 +#define OBJ_id_mod_qualified_cert_93 OBJ_id_pkix_mod,11L + +#define SN_id_mod_attribute_cert "id-mod-attribute-cert" +#define NID_id_mod_attribute_cert 280 +#define OBJ_id_mod_attribute_cert OBJ_id_pkix_mod,12L + +#define SN_id_mod_timestamp_protocol "id-mod-timestamp-protocol" +#define NID_id_mod_timestamp_protocol 281 +#define OBJ_id_mod_timestamp_protocol OBJ_id_pkix_mod,13L + +#define SN_id_mod_ocsp "id-mod-ocsp" +#define NID_id_mod_ocsp 282 +#define OBJ_id_mod_ocsp OBJ_id_pkix_mod,14L + +#define SN_id_mod_dvcs "id-mod-dvcs" +#define NID_id_mod_dvcs 283 +#define OBJ_id_mod_dvcs OBJ_id_pkix_mod,15L + +#define SN_id_mod_cmp2000 "id-mod-cmp2000" +#define NID_id_mod_cmp2000 284 +#define OBJ_id_mod_cmp2000 OBJ_id_pkix_mod,16L + +#define SN_info_access "authorityInfoAccess" +#define LN_info_access "Authority Information Access" +#define NID_info_access 177 +#define OBJ_info_access OBJ_id_pe,1L + +#define SN_biometricInfo "biometricInfo" +#define LN_biometricInfo "Biometric Info" +#define NID_biometricInfo 285 +#define OBJ_biometricInfo OBJ_id_pe,2L + +#define SN_qcStatements "qcStatements" +#define NID_qcStatements 286 +#define OBJ_qcStatements OBJ_id_pe,3L + +#define SN_ac_auditEntity "ac-auditEntity" +#define NID_ac_auditEntity 287 +#define OBJ_ac_auditEntity OBJ_id_pe,4L + +#define SN_ac_targeting "ac-targeting" +#define NID_ac_targeting 288 +#define OBJ_ac_targeting OBJ_id_pe,5L + +#define SN_aaControls "aaControls" +#define NID_aaControls 289 +#define OBJ_aaControls OBJ_id_pe,6L + +#define SN_sbgp_ipAddrBlock "sbgp-ipAddrBlock" +#define NID_sbgp_ipAddrBlock 290 +#define OBJ_sbgp_ipAddrBlock OBJ_id_pe,7L + +#define SN_sbgp_autonomousSysNum "sbgp-autonomousSysNum" +#define NID_sbgp_autonomousSysNum 291 +#define OBJ_sbgp_autonomousSysNum OBJ_id_pe,8L + +#define SN_sbgp_routerIdentifier "sbgp-routerIdentifier" +#define NID_sbgp_routerIdentifier 292 +#define OBJ_sbgp_routerIdentifier OBJ_id_pe,9L + +#define SN_ac_proxying "ac-proxying" +#define NID_ac_proxying 397 +#define OBJ_ac_proxying OBJ_id_pe,10L + +#define SN_sinfo_access "subjectInfoAccess" +#define LN_sinfo_access "Subject Information Access" +#define NID_sinfo_access 398 +#define OBJ_sinfo_access OBJ_id_pe,11L + +#define SN_proxyCertInfo "proxyCertInfo" +#define LN_proxyCertInfo "Proxy Certificate Information" +#define NID_proxyCertInfo 663 +#define OBJ_proxyCertInfo OBJ_id_pe,14L + +#define SN_id_qt_cps "id-qt-cps" +#define LN_id_qt_cps "Policy Qualifier CPS" +#define NID_id_qt_cps 164 +#define OBJ_id_qt_cps OBJ_id_qt,1L + +#define SN_id_qt_unotice "id-qt-unotice" +#define LN_id_qt_unotice "Policy Qualifier User Notice" +#define NID_id_qt_unotice 165 +#define OBJ_id_qt_unotice OBJ_id_qt,2L + +#define SN_textNotice "textNotice" +#define NID_textNotice 293 +#define OBJ_textNotice OBJ_id_qt,3L + +#define SN_server_auth "serverAuth" +#define LN_server_auth "TLS Web Server Authentication" +#define NID_server_auth 129 +#define OBJ_server_auth OBJ_id_kp,1L + +#define SN_client_auth "clientAuth" +#define LN_client_auth "TLS Web Client Authentication" +#define NID_client_auth 130 +#define OBJ_client_auth OBJ_id_kp,2L + +#define SN_code_sign "codeSigning" +#define LN_code_sign "Code Signing" +#define NID_code_sign 131 +#define OBJ_code_sign OBJ_id_kp,3L + +#define SN_email_protect "emailProtection" +#define LN_email_protect "E-mail Protection" +#define NID_email_protect 132 +#define OBJ_email_protect OBJ_id_kp,4L + +#define SN_ipsecEndSystem "ipsecEndSystem" +#define LN_ipsecEndSystem "IPSec End System" +#define NID_ipsecEndSystem 294 +#define OBJ_ipsecEndSystem OBJ_id_kp,5L + +#define SN_ipsecTunnel "ipsecTunnel" +#define LN_ipsecTunnel "IPSec Tunnel" +#define NID_ipsecTunnel 295 +#define OBJ_ipsecTunnel OBJ_id_kp,6L + +#define SN_ipsecUser "ipsecUser" +#define LN_ipsecUser "IPSec User" +#define NID_ipsecUser 296 +#define OBJ_ipsecUser OBJ_id_kp,7L + +#define SN_time_stamp "timeStamping" +#define LN_time_stamp "Time Stamping" +#define NID_time_stamp 133 +#define OBJ_time_stamp OBJ_id_kp,8L + +#define SN_OCSP_sign "OCSPSigning" +#define LN_OCSP_sign "OCSP Signing" +#define NID_OCSP_sign 180 +#define OBJ_OCSP_sign OBJ_id_kp,9L + +#define SN_dvcs "DVCS" +#define LN_dvcs "dvcs" +#define NID_dvcs 297 +#define OBJ_dvcs OBJ_id_kp,10L + +#define SN_id_it_caProtEncCert "id-it-caProtEncCert" +#define NID_id_it_caProtEncCert 298 +#define OBJ_id_it_caProtEncCert OBJ_id_it,1L + +#define SN_id_it_signKeyPairTypes "id-it-signKeyPairTypes" +#define NID_id_it_signKeyPairTypes 299 +#define OBJ_id_it_signKeyPairTypes OBJ_id_it,2L + +#define SN_id_it_encKeyPairTypes "id-it-encKeyPairTypes" +#define NID_id_it_encKeyPairTypes 300 +#define OBJ_id_it_encKeyPairTypes OBJ_id_it,3L + +#define SN_id_it_preferredSymmAlg "id-it-preferredSymmAlg" +#define NID_id_it_preferredSymmAlg 301 +#define OBJ_id_it_preferredSymmAlg OBJ_id_it,4L + +#define SN_id_it_caKeyUpdateInfo "id-it-caKeyUpdateInfo" +#define NID_id_it_caKeyUpdateInfo 302 +#define OBJ_id_it_caKeyUpdateInfo OBJ_id_it,5L + +#define SN_id_it_currentCRL "id-it-currentCRL" +#define NID_id_it_currentCRL 303 +#define OBJ_id_it_currentCRL OBJ_id_it,6L + +#define SN_id_it_unsupportedOIDs "id-it-unsupportedOIDs" +#define NID_id_it_unsupportedOIDs 304 +#define OBJ_id_it_unsupportedOIDs OBJ_id_it,7L + +#define SN_id_it_subscriptionRequest "id-it-subscriptionRequest" +#define NID_id_it_subscriptionRequest 305 +#define OBJ_id_it_subscriptionRequest OBJ_id_it,8L + +#define SN_id_it_subscriptionResponse "id-it-subscriptionResponse" +#define NID_id_it_subscriptionResponse 306 +#define OBJ_id_it_subscriptionResponse OBJ_id_it,9L + +#define SN_id_it_keyPairParamReq "id-it-keyPairParamReq" +#define NID_id_it_keyPairParamReq 307 +#define OBJ_id_it_keyPairParamReq OBJ_id_it,10L + +#define SN_id_it_keyPairParamRep "id-it-keyPairParamRep" +#define NID_id_it_keyPairParamRep 308 +#define OBJ_id_it_keyPairParamRep OBJ_id_it,11L + +#define SN_id_it_revPassphrase "id-it-revPassphrase" +#define NID_id_it_revPassphrase 309 +#define OBJ_id_it_revPassphrase OBJ_id_it,12L + +#define SN_id_it_implicitConfirm "id-it-implicitConfirm" +#define NID_id_it_implicitConfirm 310 +#define OBJ_id_it_implicitConfirm OBJ_id_it,13L + +#define SN_id_it_confirmWaitTime "id-it-confirmWaitTime" +#define NID_id_it_confirmWaitTime 311 +#define OBJ_id_it_confirmWaitTime OBJ_id_it,14L + +#define SN_id_it_origPKIMessage "id-it-origPKIMessage" +#define NID_id_it_origPKIMessage 312 +#define OBJ_id_it_origPKIMessage OBJ_id_it,15L + +#define SN_id_it_suppLangTags "id-it-suppLangTags" +#define NID_id_it_suppLangTags 784 +#define OBJ_id_it_suppLangTags OBJ_id_it,16L + +#define SN_id_regCtrl "id-regCtrl" +#define NID_id_regCtrl 313 +#define OBJ_id_regCtrl OBJ_id_pkip,1L + +#define SN_id_regInfo "id-regInfo" +#define NID_id_regInfo 314 +#define OBJ_id_regInfo OBJ_id_pkip,2L + +#define SN_id_regCtrl_regToken "id-regCtrl-regToken" +#define NID_id_regCtrl_regToken 315 +#define OBJ_id_regCtrl_regToken OBJ_id_regCtrl,1L + +#define SN_id_regCtrl_authenticator "id-regCtrl-authenticator" +#define NID_id_regCtrl_authenticator 316 +#define OBJ_id_regCtrl_authenticator OBJ_id_regCtrl,2L + +#define SN_id_regCtrl_pkiPublicationInfo "id-regCtrl-pkiPublicationInfo" +#define NID_id_regCtrl_pkiPublicationInfo 317 +#define OBJ_id_regCtrl_pkiPublicationInfo OBJ_id_regCtrl,3L + +#define SN_id_regCtrl_pkiArchiveOptions "id-regCtrl-pkiArchiveOptions" +#define NID_id_regCtrl_pkiArchiveOptions 318 +#define OBJ_id_regCtrl_pkiArchiveOptions OBJ_id_regCtrl,4L + +#define SN_id_regCtrl_oldCertID "id-regCtrl-oldCertID" +#define NID_id_regCtrl_oldCertID 319 +#define OBJ_id_regCtrl_oldCertID OBJ_id_regCtrl,5L + +#define SN_id_regCtrl_protocolEncrKey "id-regCtrl-protocolEncrKey" +#define NID_id_regCtrl_protocolEncrKey 320 +#define OBJ_id_regCtrl_protocolEncrKey OBJ_id_regCtrl,6L + +#define SN_id_regInfo_utf8Pairs "id-regInfo-utf8Pairs" +#define NID_id_regInfo_utf8Pairs 321 +#define OBJ_id_regInfo_utf8Pairs OBJ_id_regInfo,1L + +#define SN_id_regInfo_certReq "id-regInfo-certReq" +#define NID_id_regInfo_certReq 322 +#define OBJ_id_regInfo_certReq OBJ_id_regInfo,2L + +#define SN_id_alg_des40 "id-alg-des40" +#define NID_id_alg_des40 323 +#define OBJ_id_alg_des40 OBJ_id_alg,1L + +#define SN_id_alg_noSignature "id-alg-noSignature" +#define NID_id_alg_noSignature 324 +#define OBJ_id_alg_noSignature OBJ_id_alg,2L + +#define SN_id_alg_dh_sig_hmac_sha1 "id-alg-dh-sig-hmac-sha1" +#define NID_id_alg_dh_sig_hmac_sha1 325 +#define OBJ_id_alg_dh_sig_hmac_sha1 OBJ_id_alg,3L + +#define SN_id_alg_dh_pop "id-alg-dh-pop" +#define NID_id_alg_dh_pop 326 +#define OBJ_id_alg_dh_pop OBJ_id_alg,4L + +#define SN_id_cmc_statusInfo "id-cmc-statusInfo" +#define NID_id_cmc_statusInfo 327 +#define OBJ_id_cmc_statusInfo OBJ_id_cmc,1L + +#define SN_id_cmc_identification "id-cmc-identification" +#define NID_id_cmc_identification 328 +#define OBJ_id_cmc_identification OBJ_id_cmc,2L + +#define SN_id_cmc_identityProof "id-cmc-identityProof" +#define NID_id_cmc_identityProof 329 +#define OBJ_id_cmc_identityProof OBJ_id_cmc,3L + +#define SN_id_cmc_dataReturn "id-cmc-dataReturn" +#define NID_id_cmc_dataReturn 330 +#define OBJ_id_cmc_dataReturn OBJ_id_cmc,4L + +#define SN_id_cmc_transactionId "id-cmc-transactionId" +#define NID_id_cmc_transactionId 331 +#define OBJ_id_cmc_transactionId OBJ_id_cmc,5L + +#define SN_id_cmc_senderNonce "id-cmc-senderNonce" +#define NID_id_cmc_senderNonce 332 +#define OBJ_id_cmc_senderNonce OBJ_id_cmc,6L + +#define SN_id_cmc_recipientNonce "id-cmc-recipientNonce" +#define NID_id_cmc_recipientNonce 333 +#define OBJ_id_cmc_recipientNonce OBJ_id_cmc,7L + +#define SN_id_cmc_addExtensions "id-cmc-addExtensions" +#define NID_id_cmc_addExtensions 334 +#define OBJ_id_cmc_addExtensions OBJ_id_cmc,8L + +#define SN_id_cmc_encryptedPOP "id-cmc-encryptedPOP" +#define NID_id_cmc_encryptedPOP 335 +#define OBJ_id_cmc_encryptedPOP OBJ_id_cmc,9L + +#define SN_id_cmc_decryptedPOP "id-cmc-decryptedPOP" +#define NID_id_cmc_decryptedPOP 336 +#define OBJ_id_cmc_decryptedPOP OBJ_id_cmc,10L + +#define SN_id_cmc_lraPOPWitness "id-cmc-lraPOPWitness" +#define NID_id_cmc_lraPOPWitness 337 +#define OBJ_id_cmc_lraPOPWitness OBJ_id_cmc,11L + +#define SN_id_cmc_getCert "id-cmc-getCert" +#define NID_id_cmc_getCert 338 +#define OBJ_id_cmc_getCert OBJ_id_cmc,15L + +#define SN_id_cmc_getCRL "id-cmc-getCRL" +#define NID_id_cmc_getCRL 339 +#define OBJ_id_cmc_getCRL OBJ_id_cmc,16L + +#define SN_id_cmc_revokeRequest "id-cmc-revokeRequest" +#define NID_id_cmc_revokeRequest 340 +#define OBJ_id_cmc_revokeRequest OBJ_id_cmc,17L + +#define SN_id_cmc_regInfo "id-cmc-regInfo" +#define NID_id_cmc_regInfo 341 +#define OBJ_id_cmc_regInfo OBJ_id_cmc,18L + +#define SN_id_cmc_responseInfo "id-cmc-responseInfo" +#define NID_id_cmc_responseInfo 342 +#define OBJ_id_cmc_responseInfo OBJ_id_cmc,19L + +#define SN_id_cmc_queryPending "id-cmc-queryPending" +#define NID_id_cmc_queryPending 343 +#define OBJ_id_cmc_queryPending OBJ_id_cmc,21L + +#define SN_id_cmc_popLinkRandom "id-cmc-popLinkRandom" +#define NID_id_cmc_popLinkRandom 344 +#define OBJ_id_cmc_popLinkRandom OBJ_id_cmc,22L + +#define SN_id_cmc_popLinkWitness "id-cmc-popLinkWitness" +#define NID_id_cmc_popLinkWitness 345 +#define OBJ_id_cmc_popLinkWitness OBJ_id_cmc,23L + +#define SN_id_cmc_confirmCertAcceptance "id-cmc-confirmCertAcceptance" +#define NID_id_cmc_confirmCertAcceptance 346 +#define OBJ_id_cmc_confirmCertAcceptance OBJ_id_cmc,24L + +#define SN_id_on_personalData "id-on-personalData" +#define NID_id_on_personalData 347 +#define OBJ_id_on_personalData OBJ_id_on,1L + +#define SN_id_on_permanentIdentifier "id-on-permanentIdentifier" +#define LN_id_on_permanentIdentifier "Permanent Identifier" +#define NID_id_on_permanentIdentifier 858 +#define OBJ_id_on_permanentIdentifier OBJ_id_on,3L + +#define SN_id_pda_dateOfBirth "id-pda-dateOfBirth" +#define NID_id_pda_dateOfBirth 348 +#define OBJ_id_pda_dateOfBirth OBJ_id_pda,1L + +#define SN_id_pda_placeOfBirth "id-pda-placeOfBirth" +#define NID_id_pda_placeOfBirth 349 +#define OBJ_id_pda_placeOfBirth OBJ_id_pda,2L + +#define SN_id_pda_gender "id-pda-gender" +#define NID_id_pda_gender 351 +#define OBJ_id_pda_gender OBJ_id_pda,3L + +#define SN_id_pda_countryOfCitizenship "id-pda-countryOfCitizenship" +#define NID_id_pda_countryOfCitizenship 352 +#define OBJ_id_pda_countryOfCitizenship OBJ_id_pda,4L + +#define SN_id_pda_countryOfResidence "id-pda-countryOfResidence" +#define NID_id_pda_countryOfResidence 353 +#define OBJ_id_pda_countryOfResidence OBJ_id_pda,5L + +#define SN_id_aca_authenticationInfo "id-aca-authenticationInfo" +#define NID_id_aca_authenticationInfo 354 +#define OBJ_id_aca_authenticationInfo OBJ_id_aca,1L + +#define SN_id_aca_accessIdentity "id-aca-accessIdentity" +#define NID_id_aca_accessIdentity 355 +#define OBJ_id_aca_accessIdentity OBJ_id_aca,2L + +#define SN_id_aca_chargingIdentity "id-aca-chargingIdentity" +#define NID_id_aca_chargingIdentity 356 +#define OBJ_id_aca_chargingIdentity OBJ_id_aca,3L + +#define SN_id_aca_group "id-aca-group" +#define NID_id_aca_group 357 +#define OBJ_id_aca_group OBJ_id_aca,4L + +#define SN_id_aca_role "id-aca-role" +#define NID_id_aca_role 358 +#define OBJ_id_aca_role OBJ_id_aca,5L + +#define SN_id_aca_encAttrs "id-aca-encAttrs" +#define NID_id_aca_encAttrs 399 +#define OBJ_id_aca_encAttrs OBJ_id_aca,6L + +#define SN_id_qcs_pkixQCSyntax_v1 "id-qcs-pkixQCSyntax-v1" +#define NID_id_qcs_pkixQCSyntax_v1 359 +#define OBJ_id_qcs_pkixQCSyntax_v1 OBJ_id_qcs,1L + +#define SN_id_cct_crs "id-cct-crs" +#define NID_id_cct_crs 360 +#define OBJ_id_cct_crs OBJ_id_cct,1L + +#define SN_id_cct_PKIData "id-cct-PKIData" +#define NID_id_cct_PKIData 361 +#define OBJ_id_cct_PKIData OBJ_id_cct,2L + +#define SN_id_cct_PKIResponse "id-cct-PKIResponse" +#define NID_id_cct_PKIResponse 362 +#define OBJ_id_cct_PKIResponse OBJ_id_cct,3L + +#define SN_id_ppl_anyLanguage "id-ppl-anyLanguage" +#define LN_id_ppl_anyLanguage "Any language" +#define NID_id_ppl_anyLanguage 664 +#define OBJ_id_ppl_anyLanguage OBJ_id_ppl,0L + +#define SN_id_ppl_inheritAll "id-ppl-inheritAll" +#define LN_id_ppl_inheritAll "Inherit all" +#define NID_id_ppl_inheritAll 665 +#define OBJ_id_ppl_inheritAll OBJ_id_ppl,1L + +#define SN_Independent "id-ppl-independent" +#define LN_Independent "Independent" +#define NID_Independent 667 +#define OBJ_Independent OBJ_id_ppl,2L + +#define SN_ad_OCSP "OCSP" +#define LN_ad_OCSP "OCSP" +#define NID_ad_OCSP 178 +#define OBJ_ad_OCSP OBJ_id_ad,1L + +#define SN_ad_ca_issuers "caIssuers" +#define LN_ad_ca_issuers "CA Issuers" +#define NID_ad_ca_issuers 179 +#define OBJ_ad_ca_issuers OBJ_id_ad,2L + +#define SN_ad_timeStamping "ad_timestamping" +#define LN_ad_timeStamping "AD Time Stamping" +#define NID_ad_timeStamping 363 +#define OBJ_ad_timeStamping OBJ_id_ad,3L + +#define SN_ad_dvcs "AD_DVCS" +#define LN_ad_dvcs "ad dvcs" +#define NID_ad_dvcs 364 +#define OBJ_ad_dvcs OBJ_id_ad,4L + +#define SN_caRepository "caRepository" +#define LN_caRepository "CA Repository" +#define NID_caRepository 785 +#define OBJ_caRepository OBJ_id_ad,5L + +#define OBJ_id_pkix_OCSP OBJ_ad_OCSP + +#define SN_id_pkix_OCSP_basic "basicOCSPResponse" +#define LN_id_pkix_OCSP_basic "Basic OCSP Response" +#define NID_id_pkix_OCSP_basic 365 +#define OBJ_id_pkix_OCSP_basic OBJ_id_pkix_OCSP,1L + +#define SN_id_pkix_OCSP_Nonce "Nonce" +#define LN_id_pkix_OCSP_Nonce "OCSP Nonce" +#define NID_id_pkix_OCSP_Nonce 366 +#define OBJ_id_pkix_OCSP_Nonce OBJ_id_pkix_OCSP,2L + +#define SN_id_pkix_OCSP_CrlID "CrlID" +#define LN_id_pkix_OCSP_CrlID "OCSP CRL ID" +#define NID_id_pkix_OCSP_CrlID 367 +#define OBJ_id_pkix_OCSP_CrlID OBJ_id_pkix_OCSP,3L + +#define SN_id_pkix_OCSP_acceptableResponses "acceptableResponses" +#define LN_id_pkix_OCSP_acceptableResponses "Acceptable OCSP Responses" +#define NID_id_pkix_OCSP_acceptableResponses 368 +#define OBJ_id_pkix_OCSP_acceptableResponses OBJ_id_pkix_OCSP,4L + +#define SN_id_pkix_OCSP_noCheck "noCheck" +#define LN_id_pkix_OCSP_noCheck "OCSP No Check" +#define NID_id_pkix_OCSP_noCheck 369 +#define OBJ_id_pkix_OCSP_noCheck OBJ_id_pkix_OCSP,5L + +#define SN_id_pkix_OCSP_archiveCutoff "archiveCutoff" +#define LN_id_pkix_OCSP_archiveCutoff "OCSP Archive Cutoff" +#define NID_id_pkix_OCSP_archiveCutoff 370 +#define OBJ_id_pkix_OCSP_archiveCutoff OBJ_id_pkix_OCSP,6L + +#define SN_id_pkix_OCSP_serviceLocator "serviceLocator" +#define LN_id_pkix_OCSP_serviceLocator "OCSP Service Locator" +#define NID_id_pkix_OCSP_serviceLocator 371 +#define OBJ_id_pkix_OCSP_serviceLocator OBJ_id_pkix_OCSP,7L + +#define SN_id_pkix_OCSP_extendedStatus "extendedStatus" +#define LN_id_pkix_OCSP_extendedStatus "Extended OCSP Status" +#define NID_id_pkix_OCSP_extendedStatus 372 +#define OBJ_id_pkix_OCSP_extendedStatus OBJ_id_pkix_OCSP,8L + +#define SN_id_pkix_OCSP_valid "valid" +#define NID_id_pkix_OCSP_valid 373 +#define OBJ_id_pkix_OCSP_valid OBJ_id_pkix_OCSP,9L + +#define SN_id_pkix_OCSP_path "path" +#define NID_id_pkix_OCSP_path 374 +#define OBJ_id_pkix_OCSP_path OBJ_id_pkix_OCSP,10L + +#define SN_id_pkix_OCSP_trustRoot "trustRoot" +#define LN_id_pkix_OCSP_trustRoot "Trust Root" +#define NID_id_pkix_OCSP_trustRoot 375 +#define OBJ_id_pkix_OCSP_trustRoot OBJ_id_pkix_OCSP,11L + +#define SN_algorithm "algorithm" +#define LN_algorithm "algorithm" +#define NID_algorithm 376 +#define OBJ_algorithm 1L,3L,14L,3L,2L + +#define SN_md5WithRSA "RSA-NP-MD5" +#define LN_md5WithRSA "md5WithRSA" +#define NID_md5WithRSA 104 +#define OBJ_md5WithRSA OBJ_algorithm,3L + +#define SN_des_ecb "DES-ECB" +#define LN_des_ecb "des-ecb" +#define NID_des_ecb 29 +#define OBJ_des_ecb OBJ_algorithm,6L + +#define SN_des_cbc "DES-CBC" +#define LN_des_cbc "des-cbc" +#define NID_des_cbc 31 +#define OBJ_des_cbc OBJ_algorithm,7L + +#define SN_des_ofb64 "DES-OFB" +#define LN_des_ofb64 "des-ofb" +#define NID_des_ofb64 45 +#define OBJ_des_ofb64 OBJ_algorithm,8L + +#define SN_des_cfb64 "DES-CFB" +#define LN_des_cfb64 "des-cfb" +#define NID_des_cfb64 30 +#define OBJ_des_cfb64 OBJ_algorithm,9L + +#define SN_rsaSignature "rsaSignature" +#define NID_rsaSignature 377 +#define OBJ_rsaSignature OBJ_algorithm,11L + +#define SN_dsa_2 "DSA-old" +#define LN_dsa_2 "dsaEncryption-old" +#define NID_dsa_2 67 +#define OBJ_dsa_2 OBJ_algorithm,12L + +#define SN_dsaWithSHA "DSA-SHA" +#define LN_dsaWithSHA "dsaWithSHA" +#define NID_dsaWithSHA 66 +#define OBJ_dsaWithSHA OBJ_algorithm,13L + +#define SN_shaWithRSAEncryption "RSA-SHA" +#define LN_shaWithRSAEncryption "shaWithRSAEncryption" +#define NID_shaWithRSAEncryption 42 +#define OBJ_shaWithRSAEncryption OBJ_algorithm,15L + +#define SN_des_ede_ecb "DES-EDE" +#define LN_des_ede_ecb "des-ede" +#define NID_des_ede_ecb 32 +#define OBJ_des_ede_ecb OBJ_algorithm,17L + +#define SN_des_ede3_ecb "DES-EDE3" +#define LN_des_ede3_ecb "des-ede3" +#define NID_des_ede3_ecb 33 + +#define SN_des_ede_cbc "DES-EDE-CBC" +#define LN_des_ede_cbc "des-ede-cbc" +#define NID_des_ede_cbc 43 + +#define SN_des_ede_cfb64 "DES-EDE-CFB" +#define LN_des_ede_cfb64 "des-ede-cfb" +#define NID_des_ede_cfb64 60 + +#define SN_des_ede3_cfb64 "DES-EDE3-CFB" +#define LN_des_ede3_cfb64 "des-ede3-cfb" +#define NID_des_ede3_cfb64 61 + +#define SN_des_ede_ofb64 "DES-EDE-OFB" +#define LN_des_ede_ofb64 "des-ede-ofb" +#define NID_des_ede_ofb64 62 + +#define SN_des_ede3_ofb64 "DES-EDE3-OFB" +#define LN_des_ede3_ofb64 "des-ede3-ofb" +#define NID_des_ede3_ofb64 63 + +#define SN_desx_cbc "DESX-CBC" +#define LN_desx_cbc "desx-cbc" +#define NID_desx_cbc 80 + +#define SN_sha "SHA" +#define LN_sha "sha" +#define NID_sha 41 +#define OBJ_sha OBJ_algorithm,18L + +#define SN_sha1 "SHA1" +#define LN_sha1 "sha1" +#define NID_sha1 64 +#define OBJ_sha1 OBJ_algorithm,26L + +#define SN_dsaWithSHA1_2 "DSA-SHA1-old" +#define LN_dsaWithSHA1_2 "dsaWithSHA1-old" +#define NID_dsaWithSHA1_2 70 +#define OBJ_dsaWithSHA1_2 OBJ_algorithm,27L + +#define SN_sha1WithRSA "RSA-SHA1-2" +#define LN_sha1WithRSA "sha1WithRSA" +#define NID_sha1WithRSA 115 +#define OBJ_sha1WithRSA OBJ_algorithm,29L + +#define SN_ripemd160 "RIPEMD160" +#define LN_ripemd160 "ripemd160" +#define NID_ripemd160 117 +#define OBJ_ripemd160 1L,3L,36L,3L,2L,1L + +#define SN_ripemd160WithRSA "RSA-RIPEMD160" +#define LN_ripemd160WithRSA "ripemd160WithRSA" +#define NID_ripemd160WithRSA 119 +#define OBJ_ripemd160WithRSA 1L,3L,36L,3L,3L,1L,2L + +#define SN_sxnet "SXNetID" +#define LN_sxnet "Strong Extranet ID" +#define NID_sxnet 143 +#define OBJ_sxnet 1L,3L,101L,1L,4L,1L + +#define SN_X500 "X500" +#define LN_X500 "directory services (X.500)" +#define NID_X500 11 +#define OBJ_X500 2L,5L + +#define SN_X509 "X509" +#define NID_X509 12 +#define OBJ_X509 OBJ_X500,4L + +#define SN_commonName "CN" +#define LN_commonName "commonName" +#define NID_commonName 13 +#define OBJ_commonName OBJ_X509,3L + +#define SN_surname "SN" +#define LN_surname "surname" +#define NID_surname 100 +#define OBJ_surname OBJ_X509,4L + +#define LN_serialNumber "serialNumber" +#define NID_serialNumber 105 +#define OBJ_serialNumber OBJ_X509,5L + +#define SN_countryName "C" +#define LN_countryName "countryName" +#define NID_countryName 14 +#define OBJ_countryName OBJ_X509,6L + +#define SN_localityName "L" +#define LN_localityName "localityName" +#define NID_localityName 15 +#define OBJ_localityName OBJ_X509,7L + +#define SN_stateOrProvinceName "ST" +#define LN_stateOrProvinceName "stateOrProvinceName" +#define NID_stateOrProvinceName 16 +#define OBJ_stateOrProvinceName OBJ_X509,8L + +#define SN_streetAddress "street" +#define LN_streetAddress "streetAddress" +#define NID_streetAddress 660 +#define OBJ_streetAddress OBJ_X509,9L + +#define SN_organizationName "O" +#define LN_organizationName "organizationName" +#define NID_organizationName 17 +#define OBJ_organizationName OBJ_X509,10L + +#define SN_organizationalUnitName "OU" +#define LN_organizationalUnitName "organizationalUnitName" +#define NID_organizationalUnitName 18 +#define OBJ_organizationalUnitName OBJ_X509,11L + +#define SN_title "title" +#define LN_title "title" +#define NID_title 106 +#define OBJ_title OBJ_X509,12L + +#define LN_description "description" +#define NID_description 107 +#define OBJ_description OBJ_X509,13L + +#define LN_searchGuide "searchGuide" +#define NID_searchGuide 859 +#define OBJ_searchGuide OBJ_X509,14L + +#define LN_businessCategory "businessCategory" +#define NID_businessCategory 860 +#define OBJ_businessCategory OBJ_X509,15L + +#define LN_postalAddress "postalAddress" +#define NID_postalAddress 861 +#define OBJ_postalAddress OBJ_X509,16L + +#define LN_postalCode "postalCode" +#define NID_postalCode 661 +#define OBJ_postalCode OBJ_X509,17L + +#define LN_postOfficeBox "postOfficeBox" +#define NID_postOfficeBox 862 +#define OBJ_postOfficeBox OBJ_X509,18L + +#define LN_physicalDeliveryOfficeName "physicalDeliveryOfficeName" +#define NID_physicalDeliveryOfficeName 863 +#define OBJ_physicalDeliveryOfficeName OBJ_X509,19L + +#define LN_telephoneNumber "telephoneNumber" +#define NID_telephoneNumber 864 +#define OBJ_telephoneNumber OBJ_X509,20L + +#define LN_telexNumber "telexNumber" +#define NID_telexNumber 865 +#define OBJ_telexNumber OBJ_X509,21L + +#define LN_teletexTerminalIdentifier "teletexTerminalIdentifier" +#define NID_teletexTerminalIdentifier 866 +#define OBJ_teletexTerminalIdentifier OBJ_X509,22L + +#define LN_facsimileTelephoneNumber "facsimileTelephoneNumber" +#define NID_facsimileTelephoneNumber 867 +#define OBJ_facsimileTelephoneNumber OBJ_X509,23L + +#define LN_x121Address "x121Address" +#define NID_x121Address 868 +#define OBJ_x121Address OBJ_X509,24L + +#define LN_internationaliSDNNumber "internationaliSDNNumber" +#define NID_internationaliSDNNumber 869 +#define OBJ_internationaliSDNNumber OBJ_X509,25L + +#define LN_registeredAddress "registeredAddress" +#define NID_registeredAddress 870 +#define OBJ_registeredAddress OBJ_X509,26L + +#define LN_destinationIndicator "destinationIndicator" +#define NID_destinationIndicator 871 +#define OBJ_destinationIndicator OBJ_X509,27L + +#define LN_preferredDeliveryMethod "preferredDeliveryMethod" +#define NID_preferredDeliveryMethod 872 +#define OBJ_preferredDeliveryMethod OBJ_X509,28L + +#define LN_presentationAddress "presentationAddress" +#define NID_presentationAddress 873 +#define OBJ_presentationAddress OBJ_X509,29L + +#define LN_supportedApplicationContext "supportedApplicationContext" +#define NID_supportedApplicationContext 874 +#define OBJ_supportedApplicationContext OBJ_X509,30L + +#define SN_member "member" +#define NID_member 875 +#define OBJ_member OBJ_X509,31L + +#define SN_owner "owner" +#define NID_owner 876 +#define OBJ_owner OBJ_X509,32L + +#define LN_roleOccupant "roleOccupant" +#define NID_roleOccupant 877 +#define OBJ_roleOccupant OBJ_X509,33L + +#define SN_seeAlso "seeAlso" +#define NID_seeAlso 878 +#define OBJ_seeAlso OBJ_X509,34L + +#define LN_userPassword "userPassword" +#define NID_userPassword 879 +#define OBJ_userPassword OBJ_X509,35L + +#define LN_userCertificate "userCertificate" +#define NID_userCertificate 880 +#define OBJ_userCertificate OBJ_X509,36L + +#define LN_cACertificate "cACertificate" +#define NID_cACertificate 881 +#define OBJ_cACertificate OBJ_X509,37L + +#define LN_authorityRevocationList "authorityRevocationList" +#define NID_authorityRevocationList 882 +#define OBJ_authorityRevocationList OBJ_X509,38L + +#define LN_certificateRevocationList "certificateRevocationList" +#define NID_certificateRevocationList 883 +#define OBJ_certificateRevocationList OBJ_X509,39L + +#define LN_crossCertificatePair "crossCertificatePair" +#define NID_crossCertificatePair 884 +#define OBJ_crossCertificatePair OBJ_X509,40L + +#define SN_name "name" +#define LN_name "name" +#define NID_name 173 +#define OBJ_name OBJ_X509,41L + +#define SN_givenName "GN" +#define LN_givenName "givenName" +#define NID_givenName 99 +#define OBJ_givenName OBJ_X509,42L + +#define SN_initials "initials" +#define LN_initials "initials" +#define NID_initials 101 +#define OBJ_initials OBJ_X509,43L + +#define LN_generationQualifier "generationQualifier" +#define NID_generationQualifier 509 +#define OBJ_generationQualifier OBJ_X509,44L + +#define LN_x500UniqueIdentifier "x500UniqueIdentifier" +#define NID_x500UniqueIdentifier 503 +#define OBJ_x500UniqueIdentifier OBJ_X509,45L + +#define SN_dnQualifier "dnQualifier" +#define LN_dnQualifier "dnQualifier" +#define NID_dnQualifier 174 +#define OBJ_dnQualifier OBJ_X509,46L + +#define LN_enhancedSearchGuide "enhancedSearchGuide" +#define NID_enhancedSearchGuide 885 +#define OBJ_enhancedSearchGuide OBJ_X509,47L + +#define LN_protocolInformation "protocolInformation" +#define NID_protocolInformation 886 +#define OBJ_protocolInformation OBJ_X509,48L + +#define LN_distinguishedName "distinguishedName" +#define NID_distinguishedName 887 +#define OBJ_distinguishedName OBJ_X509,49L + +#define LN_uniqueMember "uniqueMember" +#define NID_uniqueMember 888 +#define OBJ_uniqueMember OBJ_X509,50L + +#define LN_houseIdentifier "houseIdentifier" +#define NID_houseIdentifier 889 +#define OBJ_houseIdentifier OBJ_X509,51L + +#define LN_supportedAlgorithms "supportedAlgorithms" +#define NID_supportedAlgorithms 890 +#define OBJ_supportedAlgorithms OBJ_X509,52L + +#define LN_deltaRevocationList "deltaRevocationList" +#define NID_deltaRevocationList 891 +#define OBJ_deltaRevocationList OBJ_X509,53L + +#define SN_dmdName "dmdName" +#define NID_dmdName 892 +#define OBJ_dmdName OBJ_X509,54L + +#define LN_pseudonym "pseudonym" +#define NID_pseudonym 510 +#define OBJ_pseudonym OBJ_X509,65L + +#define SN_role "role" +#define LN_role "role" +#define NID_role 400 +#define OBJ_role OBJ_X509,72L + +#define SN_X500algorithms "X500algorithms" +#define LN_X500algorithms "directory services - algorithms" +#define NID_X500algorithms 378 +#define OBJ_X500algorithms OBJ_X500,8L + +#define SN_rsa "RSA" +#define LN_rsa "rsa" +#define NID_rsa 19 +#define OBJ_rsa OBJ_X500algorithms,1L,1L + +#define SN_mdc2WithRSA "RSA-MDC2" +#define LN_mdc2WithRSA "mdc2WithRSA" +#define NID_mdc2WithRSA 96 +#define OBJ_mdc2WithRSA OBJ_X500algorithms,3L,100L + +#define SN_mdc2 "MDC2" +#define LN_mdc2 "mdc2" +#define NID_mdc2 95 +#define OBJ_mdc2 OBJ_X500algorithms,3L,101L + +#define SN_id_ce "id-ce" +#define NID_id_ce 81 +#define OBJ_id_ce OBJ_X500,29L + +#define SN_subject_directory_attributes "subjectDirectoryAttributes" +#define LN_subject_directory_attributes "X509v3 Subject Directory Attributes" +#define NID_subject_directory_attributes 769 +#define OBJ_subject_directory_attributes OBJ_id_ce,9L + +#define SN_subject_key_identifier "subjectKeyIdentifier" +#define LN_subject_key_identifier "X509v3 Subject Key Identifier" +#define NID_subject_key_identifier 82 +#define OBJ_subject_key_identifier OBJ_id_ce,14L + +#define SN_key_usage "keyUsage" +#define LN_key_usage "X509v3 Key Usage" +#define NID_key_usage 83 +#define OBJ_key_usage OBJ_id_ce,15L + +#define SN_private_key_usage_period "privateKeyUsagePeriod" +#define LN_private_key_usage_period "X509v3 Private Key Usage Period" +#define NID_private_key_usage_period 84 +#define OBJ_private_key_usage_period OBJ_id_ce,16L + +#define SN_subject_alt_name "subjectAltName" +#define LN_subject_alt_name "X509v3 Subject Alternative Name" +#define NID_subject_alt_name 85 +#define OBJ_subject_alt_name OBJ_id_ce,17L + +#define SN_issuer_alt_name "issuerAltName" +#define LN_issuer_alt_name "X509v3 Issuer Alternative Name" +#define NID_issuer_alt_name 86 +#define OBJ_issuer_alt_name OBJ_id_ce,18L + +#define SN_basic_constraints "basicConstraints" +#define LN_basic_constraints "X509v3 Basic Constraints" +#define NID_basic_constraints 87 +#define OBJ_basic_constraints OBJ_id_ce,19L + +#define SN_crl_number "crlNumber" +#define LN_crl_number "X509v3 CRL Number" +#define NID_crl_number 88 +#define OBJ_crl_number OBJ_id_ce,20L + +#define SN_crl_reason "CRLReason" +#define LN_crl_reason "X509v3 CRL Reason Code" +#define NID_crl_reason 141 +#define OBJ_crl_reason OBJ_id_ce,21L + +#define SN_invalidity_date "invalidityDate" +#define LN_invalidity_date "Invalidity Date" +#define NID_invalidity_date 142 +#define OBJ_invalidity_date OBJ_id_ce,24L + +#define SN_delta_crl "deltaCRL" +#define LN_delta_crl "X509v3 Delta CRL Indicator" +#define NID_delta_crl 140 +#define OBJ_delta_crl OBJ_id_ce,27L + +#define SN_issuing_distribution_point "issuingDistributionPoint" +#define LN_issuing_distribution_point "X509v3 Issuing Distrubution Point" +#define NID_issuing_distribution_point 770 +#define OBJ_issuing_distribution_point OBJ_id_ce,28L + +#define SN_certificate_issuer "certificateIssuer" +#define LN_certificate_issuer "X509v3 Certificate Issuer" +#define NID_certificate_issuer 771 +#define OBJ_certificate_issuer OBJ_id_ce,29L + +#define SN_name_constraints "nameConstraints" +#define LN_name_constraints "X509v3 Name Constraints" +#define NID_name_constraints 666 +#define OBJ_name_constraints OBJ_id_ce,30L + +#define SN_crl_distribution_points "crlDistributionPoints" +#define LN_crl_distribution_points "X509v3 CRL Distribution Points" +#define NID_crl_distribution_points 103 +#define OBJ_crl_distribution_points OBJ_id_ce,31L + +#define SN_certificate_policies "certificatePolicies" +#define LN_certificate_policies "X509v3 Certificate Policies" +#define NID_certificate_policies 89 +#define OBJ_certificate_policies OBJ_id_ce,32L + +#define SN_any_policy "anyPolicy" +#define LN_any_policy "X509v3 Any Policy" +#define NID_any_policy 746 +#define OBJ_any_policy OBJ_certificate_policies,0L + +#define SN_policy_mappings "policyMappings" +#define LN_policy_mappings "X509v3 Policy Mappings" +#define NID_policy_mappings 747 +#define OBJ_policy_mappings OBJ_id_ce,33L + +#define SN_authority_key_identifier "authorityKeyIdentifier" +#define LN_authority_key_identifier "X509v3 Authority Key Identifier" +#define NID_authority_key_identifier 90 +#define OBJ_authority_key_identifier OBJ_id_ce,35L + +#define SN_policy_constraints "policyConstraints" +#define LN_policy_constraints "X509v3 Policy Constraints" +#define NID_policy_constraints 401 +#define OBJ_policy_constraints OBJ_id_ce,36L + +#define SN_ext_key_usage "extendedKeyUsage" +#define LN_ext_key_usage "X509v3 Extended Key Usage" +#define NID_ext_key_usage 126 +#define OBJ_ext_key_usage OBJ_id_ce,37L + +#define SN_freshest_crl "freshestCRL" +#define LN_freshest_crl "X509v3 Freshest CRL" +#define NID_freshest_crl 857 +#define OBJ_freshest_crl OBJ_id_ce,46L + +#define SN_inhibit_any_policy "inhibitAnyPolicy" +#define LN_inhibit_any_policy "X509v3 Inhibit Any Policy" +#define NID_inhibit_any_policy 748 +#define OBJ_inhibit_any_policy OBJ_id_ce,54L + +#define SN_target_information "targetInformation" +#define LN_target_information "X509v3 AC Targeting" +#define NID_target_information 402 +#define OBJ_target_information OBJ_id_ce,55L + +#define SN_no_rev_avail "noRevAvail" +#define LN_no_rev_avail "X509v3 No Revocation Available" +#define NID_no_rev_avail 403 +#define OBJ_no_rev_avail OBJ_id_ce,56L + +#define SN_anyExtendedKeyUsage "anyExtendedKeyUsage" +#define LN_anyExtendedKeyUsage "Any Extended Key Usage" +#define NID_anyExtendedKeyUsage 910 +#define OBJ_anyExtendedKeyUsage OBJ_ext_key_usage,0L + +#define SN_netscape "Netscape" +#define LN_netscape "Netscape Communications Corp." +#define NID_netscape 57 +#define OBJ_netscape 2L,16L,840L,1L,113730L + +#define SN_netscape_cert_extension "nsCertExt" +#define LN_netscape_cert_extension "Netscape Certificate Extension" +#define NID_netscape_cert_extension 58 +#define OBJ_netscape_cert_extension OBJ_netscape,1L + +#define SN_netscape_data_type "nsDataType" +#define LN_netscape_data_type "Netscape Data Type" +#define NID_netscape_data_type 59 +#define OBJ_netscape_data_type OBJ_netscape,2L + +#define SN_netscape_cert_type "nsCertType" +#define LN_netscape_cert_type "Netscape Cert Type" +#define NID_netscape_cert_type 71 +#define OBJ_netscape_cert_type OBJ_netscape_cert_extension,1L + +#define SN_netscape_base_url "nsBaseUrl" +#define LN_netscape_base_url "Netscape Base Url" +#define NID_netscape_base_url 72 +#define OBJ_netscape_base_url OBJ_netscape_cert_extension,2L + +#define SN_netscape_revocation_url "nsRevocationUrl" +#define LN_netscape_revocation_url "Netscape Revocation Url" +#define NID_netscape_revocation_url 73 +#define OBJ_netscape_revocation_url OBJ_netscape_cert_extension,3L + +#define SN_netscape_ca_revocation_url "nsCaRevocationUrl" +#define LN_netscape_ca_revocation_url "Netscape CA Revocation Url" +#define NID_netscape_ca_revocation_url 74 +#define OBJ_netscape_ca_revocation_url OBJ_netscape_cert_extension,4L + +#define SN_netscape_renewal_url "nsRenewalUrl" +#define LN_netscape_renewal_url "Netscape Renewal Url" +#define NID_netscape_renewal_url 75 +#define OBJ_netscape_renewal_url OBJ_netscape_cert_extension,7L + +#define SN_netscape_ca_policy_url "nsCaPolicyUrl" +#define LN_netscape_ca_policy_url "Netscape CA Policy Url" +#define NID_netscape_ca_policy_url 76 +#define OBJ_netscape_ca_policy_url OBJ_netscape_cert_extension,8L + +#define SN_netscape_ssl_server_name "nsSslServerName" +#define LN_netscape_ssl_server_name "Netscape SSL Server Name" +#define NID_netscape_ssl_server_name 77 +#define OBJ_netscape_ssl_server_name OBJ_netscape_cert_extension,12L + +#define SN_netscape_comment "nsComment" +#define LN_netscape_comment "Netscape Comment" +#define NID_netscape_comment 78 +#define OBJ_netscape_comment OBJ_netscape_cert_extension,13L + +#define SN_netscape_cert_sequence "nsCertSequence" +#define LN_netscape_cert_sequence "Netscape Certificate Sequence" +#define NID_netscape_cert_sequence 79 +#define OBJ_netscape_cert_sequence OBJ_netscape_data_type,5L + +#define SN_ns_sgc "nsSGC" +#define LN_ns_sgc "Netscape Server Gated Crypto" +#define NID_ns_sgc 139 +#define OBJ_ns_sgc OBJ_netscape,4L,1L + +#define SN_org "ORG" +#define LN_org "org" +#define NID_org 379 +#define OBJ_org OBJ_iso,3L + +#define SN_dod "DOD" +#define LN_dod "dod" +#define NID_dod 380 +#define OBJ_dod OBJ_org,6L + +#define SN_iana "IANA" +#define LN_iana "iana" +#define NID_iana 381 +#define OBJ_iana OBJ_dod,1L + +#define OBJ_internet OBJ_iana + +#define SN_Directory "directory" +#define LN_Directory "Directory" +#define NID_Directory 382 +#define OBJ_Directory OBJ_internet,1L + +#define SN_Management "mgmt" +#define LN_Management "Management" +#define NID_Management 383 +#define OBJ_Management OBJ_internet,2L + +#define SN_Experimental "experimental" +#define LN_Experimental "Experimental" +#define NID_Experimental 384 +#define OBJ_Experimental OBJ_internet,3L + +#define SN_Private "private" +#define LN_Private "Private" +#define NID_Private 385 +#define OBJ_Private OBJ_internet,4L + +#define SN_Security "security" +#define LN_Security "Security" +#define NID_Security 386 +#define OBJ_Security OBJ_internet,5L + +#define SN_SNMPv2 "snmpv2" +#define LN_SNMPv2 "SNMPv2" +#define NID_SNMPv2 387 +#define OBJ_SNMPv2 OBJ_internet,6L + +#define LN_Mail "Mail" +#define NID_Mail 388 +#define OBJ_Mail OBJ_internet,7L + +#define SN_Enterprises "enterprises" +#define LN_Enterprises "Enterprises" +#define NID_Enterprises 389 +#define OBJ_Enterprises OBJ_Private,1L + +#define SN_dcObject "dcobject" +#define LN_dcObject "dcObject" +#define NID_dcObject 390 +#define OBJ_dcObject OBJ_Enterprises,1466L,344L + +#define SN_mime_mhs "mime-mhs" +#define LN_mime_mhs "MIME MHS" +#define NID_mime_mhs 504 +#define OBJ_mime_mhs OBJ_Mail,1L + +#define SN_mime_mhs_headings "mime-mhs-headings" +#define LN_mime_mhs_headings "mime-mhs-headings" +#define NID_mime_mhs_headings 505 +#define OBJ_mime_mhs_headings OBJ_mime_mhs,1L + +#define SN_mime_mhs_bodies "mime-mhs-bodies" +#define LN_mime_mhs_bodies "mime-mhs-bodies" +#define NID_mime_mhs_bodies 506 +#define OBJ_mime_mhs_bodies OBJ_mime_mhs,2L + +#define SN_id_hex_partial_message "id-hex-partial-message" +#define LN_id_hex_partial_message "id-hex-partial-message" +#define NID_id_hex_partial_message 507 +#define OBJ_id_hex_partial_message OBJ_mime_mhs_headings,1L + +#define SN_id_hex_multipart_message "id-hex-multipart-message" +#define LN_id_hex_multipart_message "id-hex-multipart-message" +#define NID_id_hex_multipart_message 508 +#define OBJ_id_hex_multipart_message OBJ_mime_mhs_headings,2L + +#define SN_rle_compression "RLE" +#define LN_rle_compression "run length compression" +#define NID_rle_compression 124 +#define OBJ_rle_compression 1L,1L,1L,1L,666L,1L + +#define SN_zlib_compression "ZLIB" +#define LN_zlib_compression "zlib compression" +#define NID_zlib_compression 125 +#define OBJ_zlib_compression OBJ_id_smime_alg,8L + +#define OBJ_csor 2L,16L,840L,1L,101L,3L + +#define OBJ_nistAlgorithms OBJ_csor,4L + +#define OBJ_aes OBJ_nistAlgorithms,1L + +#define SN_aes_128_ecb "AES-128-ECB" +#define LN_aes_128_ecb "aes-128-ecb" +#define NID_aes_128_ecb 418 +#define OBJ_aes_128_ecb OBJ_aes,1L + +#define SN_aes_128_cbc "AES-128-CBC" +#define LN_aes_128_cbc "aes-128-cbc" +#define NID_aes_128_cbc 419 +#define OBJ_aes_128_cbc OBJ_aes,2L + +#define SN_aes_128_ofb128 "AES-128-OFB" +#define LN_aes_128_ofb128 "aes-128-ofb" +#define NID_aes_128_ofb128 420 +#define OBJ_aes_128_ofb128 OBJ_aes,3L + +#define SN_aes_128_cfb128 "AES-128-CFB" +#define LN_aes_128_cfb128 "aes-128-cfb" +#define NID_aes_128_cfb128 421 +#define OBJ_aes_128_cfb128 OBJ_aes,4L + +#define SN_id_aes128_wrap "id-aes128-wrap" +#define NID_id_aes128_wrap 788 +#define OBJ_id_aes128_wrap OBJ_aes,5L + +#define SN_aes_128_gcm "id-aes128-GCM" +#define LN_aes_128_gcm "aes-128-gcm" +#define NID_aes_128_gcm 895 +#define OBJ_aes_128_gcm OBJ_aes,6L + +#define SN_aes_128_ccm "id-aes128-CCM" +#define LN_aes_128_ccm "aes-128-ccm" +#define NID_aes_128_ccm 896 +#define OBJ_aes_128_ccm OBJ_aes,7L + +#define SN_id_aes128_wrap_pad "id-aes128-wrap-pad" +#define NID_id_aes128_wrap_pad 897 +#define OBJ_id_aes128_wrap_pad OBJ_aes,8L + +#define SN_aes_192_ecb "AES-192-ECB" +#define LN_aes_192_ecb "aes-192-ecb" +#define NID_aes_192_ecb 422 +#define OBJ_aes_192_ecb OBJ_aes,21L + +#define SN_aes_192_cbc "AES-192-CBC" +#define LN_aes_192_cbc "aes-192-cbc" +#define NID_aes_192_cbc 423 +#define OBJ_aes_192_cbc OBJ_aes,22L + +#define SN_aes_192_ofb128 "AES-192-OFB" +#define LN_aes_192_ofb128 "aes-192-ofb" +#define NID_aes_192_ofb128 424 +#define OBJ_aes_192_ofb128 OBJ_aes,23L + +#define SN_aes_192_cfb128 "AES-192-CFB" +#define LN_aes_192_cfb128 "aes-192-cfb" +#define NID_aes_192_cfb128 425 +#define OBJ_aes_192_cfb128 OBJ_aes,24L + +#define SN_id_aes192_wrap "id-aes192-wrap" +#define NID_id_aes192_wrap 789 +#define OBJ_id_aes192_wrap OBJ_aes,25L + +#define SN_aes_192_gcm "id-aes192-GCM" +#define LN_aes_192_gcm "aes-192-gcm" +#define NID_aes_192_gcm 898 +#define OBJ_aes_192_gcm OBJ_aes,26L + +#define SN_aes_192_ccm "id-aes192-CCM" +#define LN_aes_192_ccm "aes-192-ccm" +#define NID_aes_192_ccm 899 +#define OBJ_aes_192_ccm OBJ_aes,27L + +#define SN_id_aes192_wrap_pad "id-aes192-wrap-pad" +#define NID_id_aes192_wrap_pad 900 +#define OBJ_id_aes192_wrap_pad OBJ_aes,28L + +#define SN_aes_256_ecb "AES-256-ECB" +#define LN_aes_256_ecb "aes-256-ecb" +#define NID_aes_256_ecb 426 +#define OBJ_aes_256_ecb OBJ_aes,41L + +#define SN_aes_256_cbc "AES-256-CBC" +#define LN_aes_256_cbc "aes-256-cbc" +#define NID_aes_256_cbc 427 +#define OBJ_aes_256_cbc OBJ_aes,42L + +#define SN_aes_256_ofb128 "AES-256-OFB" +#define LN_aes_256_ofb128 "aes-256-ofb" +#define NID_aes_256_ofb128 428 +#define OBJ_aes_256_ofb128 OBJ_aes,43L + +#define SN_aes_256_cfb128 "AES-256-CFB" +#define LN_aes_256_cfb128 "aes-256-cfb" +#define NID_aes_256_cfb128 429 +#define OBJ_aes_256_cfb128 OBJ_aes,44L + +#define SN_id_aes256_wrap "id-aes256-wrap" +#define NID_id_aes256_wrap 790 +#define OBJ_id_aes256_wrap OBJ_aes,45L + +#define SN_aes_256_gcm "id-aes256-GCM" +#define LN_aes_256_gcm "aes-256-gcm" +#define NID_aes_256_gcm 901 +#define OBJ_aes_256_gcm OBJ_aes,46L + +#define SN_aes_256_ccm "id-aes256-CCM" +#define LN_aes_256_ccm "aes-256-ccm" +#define NID_aes_256_ccm 902 +#define OBJ_aes_256_ccm OBJ_aes,47L + +#define SN_id_aes256_wrap_pad "id-aes256-wrap-pad" +#define NID_id_aes256_wrap_pad 903 +#define OBJ_id_aes256_wrap_pad OBJ_aes,48L + +#define SN_aes_128_cfb1 "AES-128-CFB1" +#define LN_aes_128_cfb1 "aes-128-cfb1" +#define NID_aes_128_cfb1 650 + +#define SN_aes_192_cfb1 "AES-192-CFB1" +#define LN_aes_192_cfb1 "aes-192-cfb1" +#define NID_aes_192_cfb1 651 + +#define SN_aes_256_cfb1 "AES-256-CFB1" +#define LN_aes_256_cfb1 "aes-256-cfb1" +#define NID_aes_256_cfb1 652 + +#define SN_aes_128_cfb8 "AES-128-CFB8" +#define LN_aes_128_cfb8 "aes-128-cfb8" +#define NID_aes_128_cfb8 653 + +#define SN_aes_192_cfb8 "AES-192-CFB8" +#define LN_aes_192_cfb8 "aes-192-cfb8" +#define NID_aes_192_cfb8 654 + +#define SN_aes_256_cfb8 "AES-256-CFB8" +#define LN_aes_256_cfb8 "aes-256-cfb8" +#define NID_aes_256_cfb8 655 + +#define SN_aes_128_ctr "AES-128-CTR" +#define LN_aes_128_ctr "aes-128-ctr" +#define NID_aes_128_ctr 904 + +#define SN_aes_192_ctr "AES-192-CTR" +#define LN_aes_192_ctr "aes-192-ctr" +#define NID_aes_192_ctr 905 + +#define SN_aes_256_ctr "AES-256-CTR" +#define LN_aes_256_ctr "aes-256-ctr" +#define NID_aes_256_ctr 906 + +#define SN_aes_128_xts "AES-128-XTS" +#define LN_aes_128_xts "aes-128-xts" +#define NID_aes_128_xts 913 + +#define SN_aes_256_xts "AES-256-XTS" +#define LN_aes_256_xts "aes-256-xts" +#define NID_aes_256_xts 914 + +#define SN_des_cfb1 "DES-CFB1" +#define LN_des_cfb1 "des-cfb1" +#define NID_des_cfb1 656 + +#define SN_des_cfb8 "DES-CFB8" +#define LN_des_cfb8 "des-cfb8" +#define NID_des_cfb8 657 + +#define SN_des_ede3_cfb1 "DES-EDE3-CFB1" +#define LN_des_ede3_cfb1 "des-ede3-cfb1" +#define NID_des_ede3_cfb1 658 + +#define SN_des_ede3_cfb8 "DES-EDE3-CFB8" +#define LN_des_ede3_cfb8 "des-ede3-cfb8" +#define NID_des_ede3_cfb8 659 + +#define OBJ_nist_hashalgs OBJ_nistAlgorithms,2L + +#define SN_sha256 "SHA256" +#define LN_sha256 "sha256" +#define NID_sha256 672 +#define OBJ_sha256 OBJ_nist_hashalgs,1L + +#define SN_sha384 "SHA384" +#define LN_sha384 "sha384" +#define NID_sha384 673 +#define OBJ_sha384 OBJ_nist_hashalgs,2L + +#define SN_sha512 "SHA512" +#define LN_sha512 "sha512" +#define NID_sha512 674 +#define OBJ_sha512 OBJ_nist_hashalgs,3L + +#define SN_sha224 "SHA224" +#define LN_sha224 "sha224" +#define NID_sha224 675 +#define OBJ_sha224 OBJ_nist_hashalgs,4L + +#define OBJ_dsa_with_sha2 OBJ_nistAlgorithms,3L + +#define SN_dsa_with_SHA224 "dsa_with_SHA224" +#define NID_dsa_with_SHA224 802 +#define OBJ_dsa_with_SHA224 OBJ_dsa_with_sha2,1L + +#define SN_dsa_with_SHA256 "dsa_with_SHA256" +#define NID_dsa_with_SHA256 803 +#define OBJ_dsa_with_SHA256 OBJ_dsa_with_sha2,2L + +#define SN_hold_instruction_code "holdInstructionCode" +#define LN_hold_instruction_code "Hold Instruction Code" +#define NID_hold_instruction_code 430 +#define OBJ_hold_instruction_code OBJ_id_ce,23L + +#define OBJ_holdInstruction OBJ_X9_57,2L + +#define SN_hold_instruction_none "holdInstructionNone" +#define LN_hold_instruction_none "Hold Instruction None" +#define NID_hold_instruction_none 431 +#define OBJ_hold_instruction_none OBJ_holdInstruction,1L + +#define SN_hold_instruction_call_issuer "holdInstructionCallIssuer" +#define LN_hold_instruction_call_issuer "Hold Instruction Call Issuer" +#define NID_hold_instruction_call_issuer 432 +#define OBJ_hold_instruction_call_issuer OBJ_holdInstruction,2L + +#define SN_hold_instruction_reject "holdInstructionReject" +#define LN_hold_instruction_reject "Hold Instruction Reject" +#define NID_hold_instruction_reject 433 +#define OBJ_hold_instruction_reject OBJ_holdInstruction,3L + +#define SN_data "data" +#define NID_data 434 +#define OBJ_data OBJ_itu_t,9L + +#define SN_pss "pss" +#define NID_pss 435 +#define OBJ_pss OBJ_data,2342L + +#define SN_ucl "ucl" +#define NID_ucl 436 +#define OBJ_ucl OBJ_pss,19200300L + +#define SN_pilot "pilot" +#define NID_pilot 437 +#define OBJ_pilot OBJ_ucl,100L + +#define LN_pilotAttributeType "pilotAttributeType" +#define NID_pilotAttributeType 438 +#define OBJ_pilotAttributeType OBJ_pilot,1L + +#define LN_pilotAttributeSyntax "pilotAttributeSyntax" +#define NID_pilotAttributeSyntax 439 +#define OBJ_pilotAttributeSyntax OBJ_pilot,3L + +#define LN_pilotObjectClass "pilotObjectClass" +#define NID_pilotObjectClass 440 +#define OBJ_pilotObjectClass OBJ_pilot,4L + +#define LN_pilotGroups "pilotGroups" +#define NID_pilotGroups 441 +#define OBJ_pilotGroups OBJ_pilot,10L + +#define LN_iA5StringSyntax "iA5StringSyntax" +#define NID_iA5StringSyntax 442 +#define OBJ_iA5StringSyntax OBJ_pilotAttributeSyntax,4L + +#define LN_caseIgnoreIA5StringSyntax "caseIgnoreIA5StringSyntax" +#define NID_caseIgnoreIA5StringSyntax 443 +#define OBJ_caseIgnoreIA5StringSyntax OBJ_pilotAttributeSyntax,5L + +#define LN_pilotObject "pilotObject" +#define NID_pilotObject 444 +#define OBJ_pilotObject OBJ_pilotObjectClass,3L + +#define LN_pilotPerson "pilotPerson" +#define NID_pilotPerson 445 +#define OBJ_pilotPerson OBJ_pilotObjectClass,4L + +#define SN_account "account" +#define NID_account 446 +#define OBJ_account OBJ_pilotObjectClass,5L + +#define SN_document "document" +#define NID_document 447 +#define OBJ_document OBJ_pilotObjectClass,6L + +#define SN_room "room" +#define NID_room 448 +#define OBJ_room OBJ_pilotObjectClass,7L + +#define LN_documentSeries "documentSeries" +#define NID_documentSeries 449 +#define OBJ_documentSeries OBJ_pilotObjectClass,9L + +#define SN_Domain "domain" +#define LN_Domain "Domain" +#define NID_Domain 392 +#define OBJ_Domain OBJ_pilotObjectClass,13L + +#define LN_rFC822localPart "rFC822localPart" +#define NID_rFC822localPart 450 +#define OBJ_rFC822localPart OBJ_pilotObjectClass,14L + +#define LN_dNSDomain "dNSDomain" +#define NID_dNSDomain 451 +#define OBJ_dNSDomain OBJ_pilotObjectClass,15L + +#define LN_domainRelatedObject "domainRelatedObject" +#define NID_domainRelatedObject 452 +#define OBJ_domainRelatedObject OBJ_pilotObjectClass,17L + +#define LN_friendlyCountry "friendlyCountry" +#define NID_friendlyCountry 453 +#define OBJ_friendlyCountry OBJ_pilotObjectClass,18L + +#define LN_simpleSecurityObject "simpleSecurityObject" +#define NID_simpleSecurityObject 454 +#define OBJ_simpleSecurityObject OBJ_pilotObjectClass,19L + +#define LN_pilotOrganization "pilotOrganization" +#define NID_pilotOrganization 455 +#define OBJ_pilotOrganization OBJ_pilotObjectClass,20L + +#define LN_pilotDSA "pilotDSA" +#define NID_pilotDSA 456 +#define OBJ_pilotDSA OBJ_pilotObjectClass,21L + +#define LN_qualityLabelledData "qualityLabelledData" +#define NID_qualityLabelledData 457 +#define OBJ_qualityLabelledData OBJ_pilotObjectClass,22L + +#define SN_userId "UID" +#define LN_userId "userId" +#define NID_userId 458 +#define OBJ_userId OBJ_pilotAttributeType,1L + +#define LN_textEncodedORAddress "textEncodedORAddress" +#define NID_textEncodedORAddress 459 +#define OBJ_textEncodedORAddress OBJ_pilotAttributeType,2L + +#define SN_rfc822Mailbox "mail" +#define LN_rfc822Mailbox "rfc822Mailbox" +#define NID_rfc822Mailbox 460 +#define OBJ_rfc822Mailbox OBJ_pilotAttributeType,3L + +#define SN_info "info" +#define NID_info 461 +#define OBJ_info OBJ_pilotAttributeType,4L + +#define LN_favouriteDrink "favouriteDrink" +#define NID_favouriteDrink 462 +#define OBJ_favouriteDrink OBJ_pilotAttributeType,5L + +#define LN_roomNumber "roomNumber" +#define NID_roomNumber 463 +#define OBJ_roomNumber OBJ_pilotAttributeType,6L + +#define SN_photo "photo" +#define NID_photo 464 +#define OBJ_photo OBJ_pilotAttributeType,7L + +#define LN_userClass "userClass" +#define NID_userClass 465 +#define OBJ_userClass OBJ_pilotAttributeType,8L + +#define SN_host "host" +#define NID_host 466 +#define OBJ_host OBJ_pilotAttributeType,9L + +#define SN_manager "manager" +#define NID_manager 467 +#define OBJ_manager OBJ_pilotAttributeType,10L + +#define LN_documentIdentifier "documentIdentifier" +#define NID_documentIdentifier 468 +#define OBJ_documentIdentifier OBJ_pilotAttributeType,11L + +#define LN_documentTitle "documentTitle" +#define NID_documentTitle 469 +#define OBJ_documentTitle OBJ_pilotAttributeType,12L + +#define LN_documentVersion "documentVersion" +#define NID_documentVersion 470 +#define OBJ_documentVersion OBJ_pilotAttributeType,13L + +#define LN_documentAuthor "documentAuthor" +#define NID_documentAuthor 471 +#define OBJ_documentAuthor OBJ_pilotAttributeType,14L + +#define LN_documentLocation "documentLocation" +#define NID_documentLocation 472 +#define OBJ_documentLocation OBJ_pilotAttributeType,15L + +#define LN_homeTelephoneNumber "homeTelephoneNumber" +#define NID_homeTelephoneNumber 473 +#define OBJ_homeTelephoneNumber OBJ_pilotAttributeType,20L + +#define SN_secretary "secretary" +#define NID_secretary 474 +#define OBJ_secretary OBJ_pilotAttributeType,21L + +#define LN_otherMailbox "otherMailbox" +#define NID_otherMailbox 475 +#define OBJ_otherMailbox OBJ_pilotAttributeType,22L + +#define LN_lastModifiedTime "lastModifiedTime" +#define NID_lastModifiedTime 476 +#define OBJ_lastModifiedTime OBJ_pilotAttributeType,23L + +#define LN_lastModifiedBy "lastModifiedBy" +#define NID_lastModifiedBy 477 +#define OBJ_lastModifiedBy OBJ_pilotAttributeType,24L + +#define SN_domainComponent "DC" +#define LN_domainComponent "domainComponent" +#define NID_domainComponent 391 +#define OBJ_domainComponent OBJ_pilotAttributeType,25L + +#define LN_aRecord "aRecord" +#define NID_aRecord 478 +#define OBJ_aRecord OBJ_pilotAttributeType,26L + +#define LN_pilotAttributeType27 "pilotAttributeType27" +#define NID_pilotAttributeType27 479 +#define OBJ_pilotAttributeType27 OBJ_pilotAttributeType,27L + +#define LN_mXRecord "mXRecord" +#define NID_mXRecord 480 +#define OBJ_mXRecord OBJ_pilotAttributeType,28L + +#define LN_nSRecord "nSRecord" +#define NID_nSRecord 481 +#define OBJ_nSRecord OBJ_pilotAttributeType,29L + +#define LN_sOARecord "sOARecord" +#define NID_sOARecord 482 +#define OBJ_sOARecord OBJ_pilotAttributeType,30L + +#define LN_cNAMERecord "cNAMERecord" +#define NID_cNAMERecord 483 +#define OBJ_cNAMERecord OBJ_pilotAttributeType,31L + +#define LN_associatedDomain "associatedDomain" +#define NID_associatedDomain 484 +#define OBJ_associatedDomain OBJ_pilotAttributeType,37L + +#define LN_associatedName "associatedName" +#define NID_associatedName 485 +#define OBJ_associatedName OBJ_pilotAttributeType,38L + +#define LN_homePostalAddress "homePostalAddress" +#define NID_homePostalAddress 486 +#define OBJ_homePostalAddress OBJ_pilotAttributeType,39L + +#define LN_personalTitle "personalTitle" +#define NID_personalTitle 487 +#define OBJ_personalTitle OBJ_pilotAttributeType,40L + +#define LN_mobileTelephoneNumber "mobileTelephoneNumber" +#define NID_mobileTelephoneNumber 488 +#define OBJ_mobileTelephoneNumber OBJ_pilotAttributeType,41L + +#define LN_pagerTelephoneNumber "pagerTelephoneNumber" +#define NID_pagerTelephoneNumber 489 +#define OBJ_pagerTelephoneNumber OBJ_pilotAttributeType,42L + +#define LN_friendlyCountryName "friendlyCountryName" +#define NID_friendlyCountryName 490 +#define OBJ_friendlyCountryName OBJ_pilotAttributeType,43L + +#define LN_organizationalStatus "organizationalStatus" +#define NID_organizationalStatus 491 +#define OBJ_organizationalStatus OBJ_pilotAttributeType,45L + +#define LN_janetMailbox "janetMailbox" +#define NID_janetMailbox 492 +#define OBJ_janetMailbox OBJ_pilotAttributeType,46L + +#define LN_mailPreferenceOption "mailPreferenceOption" +#define NID_mailPreferenceOption 493 +#define OBJ_mailPreferenceOption OBJ_pilotAttributeType,47L + +#define LN_buildingName "buildingName" +#define NID_buildingName 494 +#define OBJ_buildingName OBJ_pilotAttributeType,48L + +#define LN_dSAQuality "dSAQuality" +#define NID_dSAQuality 495 +#define OBJ_dSAQuality OBJ_pilotAttributeType,49L + +#define LN_singleLevelQuality "singleLevelQuality" +#define NID_singleLevelQuality 496 +#define OBJ_singleLevelQuality OBJ_pilotAttributeType,50L + +#define LN_subtreeMinimumQuality "subtreeMinimumQuality" +#define NID_subtreeMinimumQuality 497 +#define OBJ_subtreeMinimumQuality OBJ_pilotAttributeType,51L + +#define LN_subtreeMaximumQuality "subtreeMaximumQuality" +#define NID_subtreeMaximumQuality 498 +#define OBJ_subtreeMaximumQuality OBJ_pilotAttributeType,52L + +#define LN_personalSignature "personalSignature" +#define NID_personalSignature 499 +#define OBJ_personalSignature OBJ_pilotAttributeType,53L + +#define LN_dITRedirect "dITRedirect" +#define NID_dITRedirect 500 +#define OBJ_dITRedirect OBJ_pilotAttributeType,54L + +#define SN_audio "audio" +#define NID_audio 501 +#define OBJ_audio OBJ_pilotAttributeType,55L + +#define LN_documentPublisher "documentPublisher" +#define NID_documentPublisher 502 +#define OBJ_documentPublisher OBJ_pilotAttributeType,56L + +#define SN_id_set "id-set" +#define LN_id_set "Secure Electronic Transactions" +#define NID_id_set 512 +#define OBJ_id_set OBJ_international_organizations,42L + +#define SN_set_ctype "set-ctype" +#define LN_set_ctype "content types" +#define NID_set_ctype 513 +#define OBJ_set_ctype OBJ_id_set,0L + +#define SN_set_msgExt "set-msgExt" +#define LN_set_msgExt "message extensions" +#define NID_set_msgExt 514 +#define OBJ_set_msgExt OBJ_id_set,1L + +#define SN_set_attr "set-attr" +#define NID_set_attr 515 +#define OBJ_set_attr OBJ_id_set,3L + +#define SN_set_policy "set-policy" +#define NID_set_policy 516 +#define OBJ_set_policy OBJ_id_set,5L + +#define SN_set_certExt "set-certExt" +#define LN_set_certExt "certificate extensions" +#define NID_set_certExt 517 +#define OBJ_set_certExt OBJ_id_set,7L + +#define SN_set_brand "set-brand" +#define NID_set_brand 518 +#define OBJ_set_brand OBJ_id_set,8L + +#define SN_setct_PANData "setct-PANData" +#define NID_setct_PANData 519 +#define OBJ_setct_PANData OBJ_set_ctype,0L + +#define SN_setct_PANToken "setct-PANToken" +#define NID_setct_PANToken 520 +#define OBJ_setct_PANToken OBJ_set_ctype,1L + +#define SN_setct_PANOnly "setct-PANOnly" +#define NID_setct_PANOnly 521 +#define OBJ_setct_PANOnly OBJ_set_ctype,2L + +#define SN_setct_OIData "setct-OIData" +#define NID_setct_OIData 522 +#define OBJ_setct_OIData OBJ_set_ctype,3L + +#define SN_setct_PI "setct-PI" +#define NID_setct_PI 523 +#define OBJ_setct_PI OBJ_set_ctype,4L + +#define SN_setct_PIData "setct-PIData" +#define NID_setct_PIData 524 +#define OBJ_setct_PIData OBJ_set_ctype,5L + +#define SN_setct_PIDataUnsigned "setct-PIDataUnsigned" +#define NID_setct_PIDataUnsigned 525 +#define OBJ_setct_PIDataUnsigned OBJ_set_ctype,6L + +#define SN_setct_HODInput "setct-HODInput" +#define NID_setct_HODInput 526 +#define OBJ_setct_HODInput OBJ_set_ctype,7L + +#define SN_setct_AuthResBaggage "setct-AuthResBaggage" +#define NID_setct_AuthResBaggage 527 +#define OBJ_setct_AuthResBaggage OBJ_set_ctype,8L + +#define SN_setct_AuthRevReqBaggage "setct-AuthRevReqBaggage" +#define NID_setct_AuthRevReqBaggage 528 +#define OBJ_setct_AuthRevReqBaggage OBJ_set_ctype,9L + +#define SN_setct_AuthRevResBaggage "setct-AuthRevResBaggage" +#define NID_setct_AuthRevResBaggage 529 +#define OBJ_setct_AuthRevResBaggage OBJ_set_ctype,10L + +#define SN_setct_CapTokenSeq "setct-CapTokenSeq" +#define NID_setct_CapTokenSeq 530 +#define OBJ_setct_CapTokenSeq OBJ_set_ctype,11L + +#define SN_setct_PInitResData "setct-PInitResData" +#define NID_setct_PInitResData 531 +#define OBJ_setct_PInitResData OBJ_set_ctype,12L + +#define SN_setct_PI_TBS "setct-PI-TBS" +#define NID_setct_PI_TBS 532 +#define OBJ_setct_PI_TBS OBJ_set_ctype,13L + +#define SN_setct_PResData "setct-PResData" +#define NID_setct_PResData 533 +#define OBJ_setct_PResData OBJ_set_ctype,14L + +#define SN_setct_AuthReqTBS "setct-AuthReqTBS" +#define NID_setct_AuthReqTBS 534 +#define OBJ_setct_AuthReqTBS OBJ_set_ctype,16L + +#define SN_setct_AuthResTBS "setct-AuthResTBS" +#define NID_setct_AuthResTBS 535 +#define OBJ_setct_AuthResTBS OBJ_set_ctype,17L + +#define SN_setct_AuthResTBSX "setct-AuthResTBSX" +#define NID_setct_AuthResTBSX 536 +#define OBJ_setct_AuthResTBSX OBJ_set_ctype,18L + +#define SN_setct_AuthTokenTBS "setct-AuthTokenTBS" +#define NID_setct_AuthTokenTBS 537 +#define OBJ_setct_AuthTokenTBS OBJ_set_ctype,19L + +#define SN_setct_CapTokenData "setct-CapTokenData" +#define NID_setct_CapTokenData 538 +#define OBJ_setct_CapTokenData OBJ_set_ctype,20L + +#define SN_setct_CapTokenTBS "setct-CapTokenTBS" +#define NID_setct_CapTokenTBS 539 +#define OBJ_setct_CapTokenTBS OBJ_set_ctype,21L + +#define SN_setct_AcqCardCodeMsg "setct-AcqCardCodeMsg" +#define NID_setct_AcqCardCodeMsg 540 +#define OBJ_setct_AcqCardCodeMsg OBJ_set_ctype,22L + +#define SN_setct_AuthRevReqTBS "setct-AuthRevReqTBS" +#define NID_setct_AuthRevReqTBS 541 +#define OBJ_setct_AuthRevReqTBS OBJ_set_ctype,23L + +#define SN_setct_AuthRevResData "setct-AuthRevResData" +#define NID_setct_AuthRevResData 542 +#define OBJ_setct_AuthRevResData OBJ_set_ctype,24L + +#define SN_setct_AuthRevResTBS "setct-AuthRevResTBS" +#define NID_setct_AuthRevResTBS 543 +#define OBJ_setct_AuthRevResTBS OBJ_set_ctype,25L + +#define SN_setct_CapReqTBS "setct-CapReqTBS" +#define NID_setct_CapReqTBS 544 +#define OBJ_setct_CapReqTBS OBJ_set_ctype,26L + +#define SN_setct_CapReqTBSX "setct-CapReqTBSX" +#define NID_setct_CapReqTBSX 545 +#define OBJ_setct_CapReqTBSX OBJ_set_ctype,27L + +#define SN_setct_CapResData "setct-CapResData" +#define NID_setct_CapResData 546 +#define OBJ_setct_CapResData OBJ_set_ctype,28L + +#define SN_setct_CapRevReqTBS "setct-CapRevReqTBS" +#define NID_setct_CapRevReqTBS 547 +#define OBJ_setct_CapRevReqTBS OBJ_set_ctype,29L + +#define SN_setct_CapRevReqTBSX "setct-CapRevReqTBSX" +#define NID_setct_CapRevReqTBSX 548 +#define OBJ_setct_CapRevReqTBSX OBJ_set_ctype,30L + +#define SN_setct_CapRevResData "setct-CapRevResData" +#define NID_setct_CapRevResData 549 +#define OBJ_setct_CapRevResData OBJ_set_ctype,31L + +#define SN_setct_CredReqTBS "setct-CredReqTBS" +#define NID_setct_CredReqTBS 550 +#define OBJ_setct_CredReqTBS OBJ_set_ctype,32L + +#define SN_setct_CredReqTBSX "setct-CredReqTBSX" +#define NID_setct_CredReqTBSX 551 +#define OBJ_setct_CredReqTBSX OBJ_set_ctype,33L + +#define SN_setct_CredResData "setct-CredResData" +#define NID_setct_CredResData 552 +#define OBJ_setct_CredResData OBJ_set_ctype,34L + +#define SN_setct_CredRevReqTBS "setct-CredRevReqTBS" +#define NID_setct_CredRevReqTBS 553 +#define OBJ_setct_CredRevReqTBS OBJ_set_ctype,35L + +#define SN_setct_CredRevReqTBSX "setct-CredRevReqTBSX" +#define NID_setct_CredRevReqTBSX 554 +#define OBJ_setct_CredRevReqTBSX OBJ_set_ctype,36L + +#define SN_setct_CredRevResData "setct-CredRevResData" +#define NID_setct_CredRevResData 555 +#define OBJ_setct_CredRevResData OBJ_set_ctype,37L + +#define SN_setct_PCertReqData "setct-PCertReqData" +#define NID_setct_PCertReqData 556 +#define OBJ_setct_PCertReqData OBJ_set_ctype,38L + +#define SN_setct_PCertResTBS "setct-PCertResTBS" +#define NID_setct_PCertResTBS 557 +#define OBJ_setct_PCertResTBS OBJ_set_ctype,39L + +#define SN_setct_BatchAdminReqData "setct-BatchAdminReqData" +#define NID_setct_BatchAdminReqData 558 +#define OBJ_setct_BatchAdminReqData OBJ_set_ctype,40L + +#define SN_setct_BatchAdminResData "setct-BatchAdminResData" +#define NID_setct_BatchAdminResData 559 +#define OBJ_setct_BatchAdminResData OBJ_set_ctype,41L + +#define SN_setct_CardCInitResTBS "setct-CardCInitResTBS" +#define NID_setct_CardCInitResTBS 560 +#define OBJ_setct_CardCInitResTBS OBJ_set_ctype,42L + +#define SN_setct_MeAqCInitResTBS "setct-MeAqCInitResTBS" +#define NID_setct_MeAqCInitResTBS 561 +#define OBJ_setct_MeAqCInitResTBS OBJ_set_ctype,43L + +#define SN_setct_RegFormResTBS "setct-RegFormResTBS" +#define NID_setct_RegFormResTBS 562 +#define OBJ_setct_RegFormResTBS OBJ_set_ctype,44L + +#define SN_setct_CertReqData "setct-CertReqData" +#define NID_setct_CertReqData 563 +#define OBJ_setct_CertReqData OBJ_set_ctype,45L + +#define SN_setct_CertReqTBS "setct-CertReqTBS" +#define NID_setct_CertReqTBS 564 +#define OBJ_setct_CertReqTBS OBJ_set_ctype,46L + +#define SN_setct_CertResData "setct-CertResData" +#define NID_setct_CertResData 565 +#define OBJ_setct_CertResData OBJ_set_ctype,47L + +#define SN_setct_CertInqReqTBS "setct-CertInqReqTBS" +#define NID_setct_CertInqReqTBS 566 +#define OBJ_setct_CertInqReqTBS OBJ_set_ctype,48L + +#define SN_setct_ErrorTBS "setct-ErrorTBS" +#define NID_setct_ErrorTBS 567 +#define OBJ_setct_ErrorTBS OBJ_set_ctype,49L + +#define SN_setct_PIDualSignedTBE "setct-PIDualSignedTBE" +#define NID_setct_PIDualSignedTBE 568 +#define OBJ_setct_PIDualSignedTBE OBJ_set_ctype,50L + +#define SN_setct_PIUnsignedTBE "setct-PIUnsignedTBE" +#define NID_setct_PIUnsignedTBE 569 +#define OBJ_setct_PIUnsignedTBE OBJ_set_ctype,51L + +#define SN_setct_AuthReqTBE "setct-AuthReqTBE" +#define NID_setct_AuthReqTBE 570 +#define OBJ_setct_AuthReqTBE OBJ_set_ctype,52L + +#define SN_setct_AuthResTBE "setct-AuthResTBE" +#define NID_setct_AuthResTBE 571 +#define OBJ_setct_AuthResTBE OBJ_set_ctype,53L + +#define SN_setct_AuthResTBEX "setct-AuthResTBEX" +#define NID_setct_AuthResTBEX 572 +#define OBJ_setct_AuthResTBEX OBJ_set_ctype,54L + +#define SN_setct_AuthTokenTBE "setct-AuthTokenTBE" +#define NID_setct_AuthTokenTBE 573 +#define OBJ_setct_AuthTokenTBE OBJ_set_ctype,55L + +#define SN_setct_CapTokenTBE "setct-CapTokenTBE" +#define NID_setct_CapTokenTBE 574 +#define OBJ_setct_CapTokenTBE OBJ_set_ctype,56L + +#define SN_setct_CapTokenTBEX "setct-CapTokenTBEX" +#define NID_setct_CapTokenTBEX 575 +#define OBJ_setct_CapTokenTBEX OBJ_set_ctype,57L + +#define SN_setct_AcqCardCodeMsgTBE "setct-AcqCardCodeMsgTBE" +#define NID_setct_AcqCardCodeMsgTBE 576 +#define OBJ_setct_AcqCardCodeMsgTBE OBJ_set_ctype,58L + +#define SN_setct_AuthRevReqTBE "setct-AuthRevReqTBE" +#define NID_setct_AuthRevReqTBE 577 +#define OBJ_setct_AuthRevReqTBE OBJ_set_ctype,59L + +#define SN_setct_AuthRevResTBE "setct-AuthRevResTBE" +#define NID_setct_AuthRevResTBE 578 +#define OBJ_setct_AuthRevResTBE OBJ_set_ctype,60L + +#define SN_setct_AuthRevResTBEB "setct-AuthRevResTBEB" +#define NID_setct_AuthRevResTBEB 579 +#define OBJ_setct_AuthRevResTBEB OBJ_set_ctype,61L + +#define SN_setct_CapReqTBE "setct-CapReqTBE" +#define NID_setct_CapReqTBE 580 +#define OBJ_setct_CapReqTBE OBJ_set_ctype,62L + +#define SN_setct_CapReqTBEX "setct-CapReqTBEX" +#define NID_setct_CapReqTBEX 581 +#define OBJ_setct_CapReqTBEX OBJ_set_ctype,63L + +#define SN_setct_CapResTBE "setct-CapResTBE" +#define NID_setct_CapResTBE 582 +#define OBJ_setct_CapResTBE OBJ_set_ctype,64L + +#define SN_setct_CapRevReqTBE "setct-CapRevReqTBE" +#define NID_setct_CapRevReqTBE 583 +#define OBJ_setct_CapRevReqTBE OBJ_set_ctype,65L + +#define SN_setct_CapRevReqTBEX "setct-CapRevReqTBEX" +#define NID_setct_CapRevReqTBEX 584 +#define OBJ_setct_CapRevReqTBEX OBJ_set_ctype,66L + +#define SN_setct_CapRevResTBE "setct-CapRevResTBE" +#define NID_setct_CapRevResTBE 585 +#define OBJ_setct_CapRevResTBE OBJ_set_ctype,67L + +#define SN_setct_CredReqTBE "setct-CredReqTBE" +#define NID_setct_CredReqTBE 586 +#define OBJ_setct_CredReqTBE OBJ_set_ctype,68L + +#define SN_setct_CredReqTBEX "setct-CredReqTBEX" +#define NID_setct_CredReqTBEX 587 +#define OBJ_setct_CredReqTBEX OBJ_set_ctype,69L + +#define SN_setct_CredResTBE "setct-CredResTBE" +#define NID_setct_CredResTBE 588 +#define OBJ_setct_CredResTBE OBJ_set_ctype,70L + +#define SN_setct_CredRevReqTBE "setct-CredRevReqTBE" +#define NID_setct_CredRevReqTBE 589 +#define OBJ_setct_CredRevReqTBE OBJ_set_ctype,71L + +#define SN_setct_CredRevReqTBEX "setct-CredRevReqTBEX" +#define NID_setct_CredRevReqTBEX 590 +#define OBJ_setct_CredRevReqTBEX OBJ_set_ctype,72L + +#define SN_setct_CredRevResTBE "setct-CredRevResTBE" +#define NID_setct_CredRevResTBE 591 +#define OBJ_setct_CredRevResTBE OBJ_set_ctype,73L + +#define SN_setct_BatchAdminReqTBE "setct-BatchAdminReqTBE" +#define NID_setct_BatchAdminReqTBE 592 +#define OBJ_setct_BatchAdminReqTBE OBJ_set_ctype,74L + +#define SN_setct_BatchAdminResTBE "setct-BatchAdminResTBE" +#define NID_setct_BatchAdminResTBE 593 +#define OBJ_setct_BatchAdminResTBE OBJ_set_ctype,75L + +#define SN_setct_RegFormReqTBE "setct-RegFormReqTBE" +#define NID_setct_RegFormReqTBE 594 +#define OBJ_setct_RegFormReqTBE OBJ_set_ctype,76L + +#define SN_setct_CertReqTBE "setct-CertReqTBE" +#define NID_setct_CertReqTBE 595 +#define OBJ_setct_CertReqTBE OBJ_set_ctype,77L + +#define SN_setct_CertReqTBEX "setct-CertReqTBEX" +#define NID_setct_CertReqTBEX 596 +#define OBJ_setct_CertReqTBEX OBJ_set_ctype,78L + +#define SN_setct_CertResTBE "setct-CertResTBE" +#define NID_setct_CertResTBE 597 +#define OBJ_setct_CertResTBE OBJ_set_ctype,79L + +#define SN_setct_CRLNotificationTBS "setct-CRLNotificationTBS" +#define NID_setct_CRLNotificationTBS 598 +#define OBJ_setct_CRLNotificationTBS OBJ_set_ctype,80L + +#define SN_setct_CRLNotificationResTBS "setct-CRLNotificationResTBS" +#define NID_setct_CRLNotificationResTBS 599 +#define OBJ_setct_CRLNotificationResTBS OBJ_set_ctype,81L + +#define SN_setct_BCIDistributionTBS "setct-BCIDistributionTBS" +#define NID_setct_BCIDistributionTBS 600 +#define OBJ_setct_BCIDistributionTBS OBJ_set_ctype,82L + +#define SN_setext_genCrypt "setext-genCrypt" +#define LN_setext_genCrypt "generic cryptogram" +#define NID_setext_genCrypt 601 +#define OBJ_setext_genCrypt OBJ_set_msgExt,1L + +#define SN_setext_miAuth "setext-miAuth" +#define LN_setext_miAuth "merchant initiated auth" +#define NID_setext_miAuth 602 +#define OBJ_setext_miAuth OBJ_set_msgExt,3L + +#define SN_setext_pinSecure "setext-pinSecure" +#define NID_setext_pinSecure 603 +#define OBJ_setext_pinSecure OBJ_set_msgExt,4L + +#define SN_setext_pinAny "setext-pinAny" +#define NID_setext_pinAny 604 +#define OBJ_setext_pinAny OBJ_set_msgExt,5L + +#define SN_setext_track2 "setext-track2" +#define NID_setext_track2 605 +#define OBJ_setext_track2 OBJ_set_msgExt,7L + +#define SN_setext_cv "setext-cv" +#define LN_setext_cv "additional verification" +#define NID_setext_cv 606 +#define OBJ_setext_cv OBJ_set_msgExt,8L + +#define SN_set_policy_root "set-policy-root" +#define NID_set_policy_root 607 +#define OBJ_set_policy_root OBJ_set_policy,0L + +#define SN_setCext_hashedRoot "setCext-hashedRoot" +#define NID_setCext_hashedRoot 608 +#define OBJ_setCext_hashedRoot OBJ_set_certExt,0L + +#define SN_setCext_certType "setCext-certType" +#define NID_setCext_certType 609 +#define OBJ_setCext_certType OBJ_set_certExt,1L + +#define SN_setCext_merchData "setCext-merchData" +#define NID_setCext_merchData 610 +#define OBJ_setCext_merchData OBJ_set_certExt,2L + +#define SN_setCext_cCertRequired "setCext-cCertRequired" +#define NID_setCext_cCertRequired 611 +#define OBJ_setCext_cCertRequired OBJ_set_certExt,3L + +#define SN_setCext_tunneling "setCext-tunneling" +#define NID_setCext_tunneling 612 +#define OBJ_setCext_tunneling OBJ_set_certExt,4L + +#define SN_setCext_setExt "setCext-setExt" +#define NID_setCext_setExt 613 +#define OBJ_setCext_setExt OBJ_set_certExt,5L + +#define SN_setCext_setQualf "setCext-setQualf" +#define NID_setCext_setQualf 614 +#define OBJ_setCext_setQualf OBJ_set_certExt,6L + +#define SN_setCext_PGWYcapabilities "setCext-PGWYcapabilities" +#define NID_setCext_PGWYcapabilities 615 +#define OBJ_setCext_PGWYcapabilities OBJ_set_certExt,7L + +#define SN_setCext_TokenIdentifier "setCext-TokenIdentifier" +#define NID_setCext_TokenIdentifier 616 +#define OBJ_setCext_TokenIdentifier OBJ_set_certExt,8L + +#define SN_setCext_Track2Data "setCext-Track2Data" +#define NID_setCext_Track2Data 617 +#define OBJ_setCext_Track2Data OBJ_set_certExt,9L + +#define SN_setCext_TokenType "setCext-TokenType" +#define NID_setCext_TokenType 618 +#define OBJ_setCext_TokenType OBJ_set_certExt,10L + +#define SN_setCext_IssuerCapabilities "setCext-IssuerCapabilities" +#define NID_setCext_IssuerCapabilities 619 +#define OBJ_setCext_IssuerCapabilities OBJ_set_certExt,11L + +#define SN_setAttr_Cert "setAttr-Cert" +#define NID_setAttr_Cert 620 +#define OBJ_setAttr_Cert OBJ_set_attr,0L + +#define SN_setAttr_PGWYcap "setAttr-PGWYcap" +#define LN_setAttr_PGWYcap "payment gateway capabilities" +#define NID_setAttr_PGWYcap 621 +#define OBJ_setAttr_PGWYcap OBJ_set_attr,1L + +#define SN_setAttr_TokenType "setAttr-TokenType" +#define NID_setAttr_TokenType 622 +#define OBJ_setAttr_TokenType OBJ_set_attr,2L + +#define SN_setAttr_IssCap "setAttr-IssCap" +#define LN_setAttr_IssCap "issuer capabilities" +#define NID_setAttr_IssCap 623 +#define OBJ_setAttr_IssCap OBJ_set_attr,3L + +#define SN_set_rootKeyThumb "set-rootKeyThumb" +#define NID_set_rootKeyThumb 624 +#define OBJ_set_rootKeyThumb OBJ_setAttr_Cert,0L + +#define SN_set_addPolicy "set-addPolicy" +#define NID_set_addPolicy 625 +#define OBJ_set_addPolicy OBJ_setAttr_Cert,1L + +#define SN_setAttr_Token_EMV "setAttr-Token-EMV" +#define NID_setAttr_Token_EMV 626 +#define OBJ_setAttr_Token_EMV OBJ_setAttr_TokenType,1L + +#define SN_setAttr_Token_B0Prime "setAttr-Token-B0Prime" +#define NID_setAttr_Token_B0Prime 627 +#define OBJ_setAttr_Token_B0Prime OBJ_setAttr_TokenType,2L + +#define SN_setAttr_IssCap_CVM "setAttr-IssCap-CVM" +#define NID_setAttr_IssCap_CVM 628 +#define OBJ_setAttr_IssCap_CVM OBJ_setAttr_IssCap,3L + +#define SN_setAttr_IssCap_T2 "setAttr-IssCap-T2" +#define NID_setAttr_IssCap_T2 629 +#define OBJ_setAttr_IssCap_T2 OBJ_setAttr_IssCap,4L + +#define SN_setAttr_IssCap_Sig "setAttr-IssCap-Sig" +#define NID_setAttr_IssCap_Sig 630 +#define OBJ_setAttr_IssCap_Sig OBJ_setAttr_IssCap,5L + +#define SN_setAttr_GenCryptgrm "setAttr-GenCryptgrm" +#define LN_setAttr_GenCryptgrm "generate cryptogram" +#define NID_setAttr_GenCryptgrm 631 +#define OBJ_setAttr_GenCryptgrm OBJ_setAttr_IssCap_CVM,1L + +#define SN_setAttr_T2Enc "setAttr-T2Enc" +#define LN_setAttr_T2Enc "encrypted track 2" +#define NID_setAttr_T2Enc 632 +#define OBJ_setAttr_T2Enc OBJ_setAttr_IssCap_T2,1L + +#define SN_setAttr_T2cleartxt "setAttr-T2cleartxt" +#define LN_setAttr_T2cleartxt "cleartext track 2" +#define NID_setAttr_T2cleartxt 633 +#define OBJ_setAttr_T2cleartxt OBJ_setAttr_IssCap_T2,2L + +#define SN_setAttr_TokICCsig "setAttr-TokICCsig" +#define LN_setAttr_TokICCsig "ICC or token signature" +#define NID_setAttr_TokICCsig 634 +#define OBJ_setAttr_TokICCsig OBJ_setAttr_IssCap_Sig,1L + +#define SN_setAttr_SecDevSig "setAttr-SecDevSig" +#define LN_setAttr_SecDevSig "secure device signature" +#define NID_setAttr_SecDevSig 635 +#define OBJ_setAttr_SecDevSig OBJ_setAttr_IssCap_Sig,2L + +#define SN_set_brand_IATA_ATA "set-brand-IATA-ATA" +#define NID_set_brand_IATA_ATA 636 +#define OBJ_set_brand_IATA_ATA OBJ_set_brand,1L + +#define SN_set_brand_Diners "set-brand-Diners" +#define NID_set_brand_Diners 637 +#define OBJ_set_brand_Diners OBJ_set_brand,30L + +#define SN_set_brand_AmericanExpress "set-brand-AmericanExpress" +#define NID_set_brand_AmericanExpress 638 +#define OBJ_set_brand_AmericanExpress OBJ_set_brand,34L + +#define SN_set_brand_JCB "set-brand-JCB" +#define NID_set_brand_JCB 639 +#define OBJ_set_brand_JCB OBJ_set_brand,35L + +#define SN_set_brand_Visa "set-brand-Visa" +#define NID_set_brand_Visa 640 +#define OBJ_set_brand_Visa OBJ_set_brand,4L + +#define SN_set_brand_MasterCard "set-brand-MasterCard" +#define NID_set_brand_MasterCard 641 +#define OBJ_set_brand_MasterCard OBJ_set_brand,5L + +#define SN_set_brand_Novus "set-brand-Novus" +#define NID_set_brand_Novus 642 +#define OBJ_set_brand_Novus OBJ_set_brand,6011L + +#define SN_des_cdmf "DES-CDMF" +#define LN_des_cdmf "des-cdmf" +#define NID_des_cdmf 643 +#define OBJ_des_cdmf OBJ_rsadsi,3L,10L + +#define SN_rsaOAEPEncryptionSET "rsaOAEPEncryptionSET" +#define NID_rsaOAEPEncryptionSET 644 +#define OBJ_rsaOAEPEncryptionSET OBJ_rsadsi,1L,1L,6L + +#define SN_ipsec3 "Oakley-EC2N-3" +#define LN_ipsec3 "ipsec3" +#define NID_ipsec3 749 + +#define SN_ipsec4 "Oakley-EC2N-4" +#define LN_ipsec4 "ipsec4" +#define NID_ipsec4 750 + +#define SN_whirlpool "whirlpool" +#define NID_whirlpool 804 +#define OBJ_whirlpool OBJ_iso,0L,10118L,3L,0L,55L + +#define SN_cryptopro "cryptopro" +#define NID_cryptopro 805 +#define OBJ_cryptopro OBJ_member_body,643L,2L,2L + +#define SN_cryptocom "cryptocom" +#define NID_cryptocom 806 +#define OBJ_cryptocom OBJ_member_body,643L,2L,9L + +#define SN_id_GostR3411_94_with_GostR3410_2001 "id-GostR3411-94-with-GostR3410-2001" +#define LN_id_GostR3411_94_with_GostR3410_2001 "GOST R 34.11-94 with GOST R 34.10-2001" +#define NID_id_GostR3411_94_with_GostR3410_2001 807 +#define OBJ_id_GostR3411_94_with_GostR3410_2001 OBJ_cryptopro,3L + +#define SN_id_GostR3411_94_with_GostR3410_94 "id-GostR3411-94-with-GostR3410-94" +#define LN_id_GostR3411_94_with_GostR3410_94 "GOST R 34.11-94 with GOST R 34.10-94" +#define NID_id_GostR3411_94_with_GostR3410_94 808 +#define OBJ_id_GostR3411_94_with_GostR3410_94 OBJ_cryptopro,4L + +#define SN_id_GostR3411_94 "md_gost94" +#define LN_id_GostR3411_94 "GOST R 34.11-94" +#define NID_id_GostR3411_94 809 +#define OBJ_id_GostR3411_94 OBJ_cryptopro,9L + +#define SN_id_HMACGostR3411_94 "id-HMACGostR3411-94" +#define LN_id_HMACGostR3411_94 "HMAC GOST 34.11-94" +#define NID_id_HMACGostR3411_94 810 +#define OBJ_id_HMACGostR3411_94 OBJ_cryptopro,10L + +#define SN_id_GostR3410_2001 "gost2001" +#define LN_id_GostR3410_2001 "GOST R 34.10-2001" +#define NID_id_GostR3410_2001 811 +#define OBJ_id_GostR3410_2001 OBJ_cryptopro,19L + +#define SN_id_GostR3410_94 "gost94" +#define LN_id_GostR3410_94 "GOST R 34.10-94" +#define NID_id_GostR3410_94 812 +#define OBJ_id_GostR3410_94 OBJ_cryptopro,20L + +#define SN_id_Gost28147_89 "gost89" +#define LN_id_Gost28147_89 "GOST 28147-89" +#define NID_id_Gost28147_89 813 +#define OBJ_id_Gost28147_89 OBJ_cryptopro,21L + +#define SN_gost89_cnt "gost89-cnt" +#define NID_gost89_cnt 814 + +#define SN_id_Gost28147_89_MAC "gost-mac" +#define LN_id_Gost28147_89_MAC "GOST 28147-89 MAC" +#define NID_id_Gost28147_89_MAC 815 +#define OBJ_id_Gost28147_89_MAC OBJ_cryptopro,22L + +#define SN_id_GostR3411_94_prf "prf-gostr3411-94" +#define LN_id_GostR3411_94_prf "GOST R 34.11-94 PRF" +#define NID_id_GostR3411_94_prf 816 +#define OBJ_id_GostR3411_94_prf OBJ_cryptopro,23L + +#define SN_id_GostR3410_2001DH "id-GostR3410-2001DH" +#define LN_id_GostR3410_2001DH "GOST R 34.10-2001 DH" +#define NID_id_GostR3410_2001DH 817 +#define OBJ_id_GostR3410_2001DH OBJ_cryptopro,98L + +#define SN_id_GostR3410_94DH "id-GostR3410-94DH" +#define LN_id_GostR3410_94DH "GOST R 34.10-94 DH" +#define NID_id_GostR3410_94DH 818 +#define OBJ_id_GostR3410_94DH OBJ_cryptopro,99L + +#define SN_id_Gost28147_89_CryptoPro_KeyMeshing "id-Gost28147-89-CryptoPro-KeyMeshing" +#define NID_id_Gost28147_89_CryptoPro_KeyMeshing 819 +#define OBJ_id_Gost28147_89_CryptoPro_KeyMeshing OBJ_cryptopro,14L,1L + +#define SN_id_Gost28147_89_None_KeyMeshing "id-Gost28147-89-None-KeyMeshing" +#define NID_id_Gost28147_89_None_KeyMeshing 820 +#define OBJ_id_Gost28147_89_None_KeyMeshing OBJ_cryptopro,14L,0L + +#define SN_id_GostR3411_94_TestParamSet "id-GostR3411-94-TestParamSet" +#define NID_id_GostR3411_94_TestParamSet 821 +#define OBJ_id_GostR3411_94_TestParamSet OBJ_cryptopro,30L,0L + +#define SN_id_GostR3411_94_CryptoProParamSet "id-GostR3411-94-CryptoProParamSet" +#define NID_id_GostR3411_94_CryptoProParamSet 822 +#define OBJ_id_GostR3411_94_CryptoProParamSet OBJ_cryptopro,30L,1L + +#define SN_id_Gost28147_89_TestParamSet "id-Gost28147-89-TestParamSet" +#define NID_id_Gost28147_89_TestParamSet 823 +#define OBJ_id_Gost28147_89_TestParamSet OBJ_cryptopro,31L,0L + +#define SN_id_Gost28147_89_CryptoPro_A_ParamSet "id-Gost28147-89-CryptoPro-A-ParamSet" +#define NID_id_Gost28147_89_CryptoPro_A_ParamSet 824 +#define OBJ_id_Gost28147_89_CryptoPro_A_ParamSet OBJ_cryptopro,31L,1L + +#define SN_id_Gost28147_89_CryptoPro_B_ParamSet "id-Gost28147-89-CryptoPro-B-ParamSet" +#define NID_id_Gost28147_89_CryptoPro_B_ParamSet 825 +#define OBJ_id_Gost28147_89_CryptoPro_B_ParamSet OBJ_cryptopro,31L,2L + +#define SN_id_Gost28147_89_CryptoPro_C_ParamSet "id-Gost28147-89-CryptoPro-C-ParamSet" +#define NID_id_Gost28147_89_CryptoPro_C_ParamSet 826 +#define OBJ_id_Gost28147_89_CryptoPro_C_ParamSet OBJ_cryptopro,31L,3L + +#define SN_id_Gost28147_89_CryptoPro_D_ParamSet "id-Gost28147-89-CryptoPro-D-ParamSet" +#define NID_id_Gost28147_89_CryptoPro_D_ParamSet 827 +#define OBJ_id_Gost28147_89_CryptoPro_D_ParamSet OBJ_cryptopro,31L,4L + +#define SN_id_Gost28147_89_CryptoPro_Oscar_1_1_ParamSet "id-Gost28147-89-CryptoPro-Oscar-1-1-ParamSet" +#define NID_id_Gost28147_89_CryptoPro_Oscar_1_1_ParamSet 828 +#define OBJ_id_Gost28147_89_CryptoPro_Oscar_1_1_ParamSet OBJ_cryptopro,31L,5L + +#define SN_id_Gost28147_89_CryptoPro_Oscar_1_0_ParamSet "id-Gost28147-89-CryptoPro-Oscar-1-0-ParamSet" +#define NID_id_Gost28147_89_CryptoPro_Oscar_1_0_ParamSet 829 +#define OBJ_id_Gost28147_89_CryptoPro_Oscar_1_0_ParamSet OBJ_cryptopro,31L,6L + +#define SN_id_Gost28147_89_CryptoPro_RIC_1_ParamSet "id-Gost28147-89-CryptoPro-RIC-1-ParamSet" +#define NID_id_Gost28147_89_CryptoPro_RIC_1_ParamSet 830 +#define OBJ_id_Gost28147_89_CryptoPro_RIC_1_ParamSet OBJ_cryptopro,31L,7L + +#define SN_id_GostR3410_94_TestParamSet "id-GostR3410-94-TestParamSet" +#define NID_id_GostR3410_94_TestParamSet 831 +#define OBJ_id_GostR3410_94_TestParamSet OBJ_cryptopro,32L,0L + +#define SN_id_GostR3410_94_CryptoPro_A_ParamSet "id-GostR3410-94-CryptoPro-A-ParamSet" +#define NID_id_GostR3410_94_CryptoPro_A_ParamSet 832 +#define OBJ_id_GostR3410_94_CryptoPro_A_ParamSet OBJ_cryptopro,32L,2L + +#define SN_id_GostR3410_94_CryptoPro_B_ParamSet "id-GostR3410-94-CryptoPro-B-ParamSet" +#define NID_id_GostR3410_94_CryptoPro_B_ParamSet 833 +#define OBJ_id_GostR3410_94_CryptoPro_B_ParamSet OBJ_cryptopro,32L,3L + +#define SN_id_GostR3410_94_CryptoPro_C_ParamSet "id-GostR3410-94-CryptoPro-C-ParamSet" +#define NID_id_GostR3410_94_CryptoPro_C_ParamSet 834 +#define OBJ_id_GostR3410_94_CryptoPro_C_ParamSet OBJ_cryptopro,32L,4L + +#define SN_id_GostR3410_94_CryptoPro_D_ParamSet "id-GostR3410-94-CryptoPro-D-ParamSet" +#define NID_id_GostR3410_94_CryptoPro_D_ParamSet 835 +#define OBJ_id_GostR3410_94_CryptoPro_D_ParamSet OBJ_cryptopro,32L,5L + +#define SN_id_GostR3410_94_CryptoPro_XchA_ParamSet "id-GostR3410-94-CryptoPro-XchA-ParamSet" +#define NID_id_GostR3410_94_CryptoPro_XchA_ParamSet 836 +#define OBJ_id_GostR3410_94_CryptoPro_XchA_ParamSet OBJ_cryptopro,33L,1L + +#define SN_id_GostR3410_94_CryptoPro_XchB_ParamSet "id-GostR3410-94-CryptoPro-XchB-ParamSet" +#define NID_id_GostR3410_94_CryptoPro_XchB_ParamSet 837 +#define OBJ_id_GostR3410_94_CryptoPro_XchB_ParamSet OBJ_cryptopro,33L,2L + +#define SN_id_GostR3410_94_CryptoPro_XchC_ParamSet "id-GostR3410-94-CryptoPro-XchC-ParamSet" +#define NID_id_GostR3410_94_CryptoPro_XchC_ParamSet 838 +#define OBJ_id_GostR3410_94_CryptoPro_XchC_ParamSet OBJ_cryptopro,33L,3L + +#define SN_id_GostR3410_2001_TestParamSet "id-GostR3410-2001-TestParamSet" +#define NID_id_GostR3410_2001_TestParamSet 839 +#define OBJ_id_GostR3410_2001_TestParamSet OBJ_cryptopro,35L,0L + +#define SN_id_GostR3410_2001_CryptoPro_A_ParamSet "id-GostR3410-2001-CryptoPro-A-ParamSet" +#define NID_id_GostR3410_2001_CryptoPro_A_ParamSet 840 +#define OBJ_id_GostR3410_2001_CryptoPro_A_ParamSet OBJ_cryptopro,35L,1L + +#define SN_id_GostR3410_2001_CryptoPro_B_ParamSet "id-GostR3410-2001-CryptoPro-B-ParamSet" +#define NID_id_GostR3410_2001_CryptoPro_B_ParamSet 841 +#define OBJ_id_GostR3410_2001_CryptoPro_B_ParamSet OBJ_cryptopro,35L,2L + +#define SN_id_GostR3410_2001_CryptoPro_C_ParamSet "id-GostR3410-2001-CryptoPro-C-ParamSet" +#define NID_id_GostR3410_2001_CryptoPro_C_ParamSet 842 +#define OBJ_id_GostR3410_2001_CryptoPro_C_ParamSet OBJ_cryptopro,35L,3L + +#define SN_id_GostR3410_2001_CryptoPro_XchA_ParamSet "id-GostR3410-2001-CryptoPro-XchA-ParamSet" +#define NID_id_GostR3410_2001_CryptoPro_XchA_ParamSet 843 +#define OBJ_id_GostR3410_2001_CryptoPro_XchA_ParamSet OBJ_cryptopro,36L,0L + +#define SN_id_GostR3410_2001_CryptoPro_XchB_ParamSet "id-GostR3410-2001-CryptoPro-XchB-ParamSet" +#define NID_id_GostR3410_2001_CryptoPro_XchB_ParamSet 844 +#define OBJ_id_GostR3410_2001_CryptoPro_XchB_ParamSet OBJ_cryptopro,36L,1L + +#define SN_id_GostR3410_94_a "id-GostR3410-94-a" +#define NID_id_GostR3410_94_a 845 +#define OBJ_id_GostR3410_94_a OBJ_id_GostR3410_94,1L + +#define SN_id_GostR3410_94_aBis "id-GostR3410-94-aBis" +#define NID_id_GostR3410_94_aBis 846 +#define OBJ_id_GostR3410_94_aBis OBJ_id_GostR3410_94,2L + +#define SN_id_GostR3410_94_b "id-GostR3410-94-b" +#define NID_id_GostR3410_94_b 847 +#define OBJ_id_GostR3410_94_b OBJ_id_GostR3410_94,3L + +#define SN_id_GostR3410_94_bBis "id-GostR3410-94-bBis" +#define NID_id_GostR3410_94_bBis 848 +#define OBJ_id_GostR3410_94_bBis OBJ_id_GostR3410_94,4L + +#define SN_id_Gost28147_89_cc "id-Gost28147-89-cc" +#define LN_id_Gost28147_89_cc "GOST 28147-89 Cryptocom ParamSet" +#define NID_id_Gost28147_89_cc 849 +#define OBJ_id_Gost28147_89_cc OBJ_cryptocom,1L,6L,1L + +#define SN_id_GostR3410_94_cc "gost94cc" +#define LN_id_GostR3410_94_cc "GOST 34.10-94 Cryptocom" +#define NID_id_GostR3410_94_cc 850 +#define OBJ_id_GostR3410_94_cc OBJ_cryptocom,1L,5L,3L + +#define SN_id_GostR3410_2001_cc "gost2001cc" +#define LN_id_GostR3410_2001_cc "GOST 34.10-2001 Cryptocom" +#define NID_id_GostR3410_2001_cc 851 +#define OBJ_id_GostR3410_2001_cc OBJ_cryptocom,1L,5L,4L + +#define SN_id_GostR3411_94_with_GostR3410_94_cc "id-GostR3411-94-with-GostR3410-94-cc" +#define LN_id_GostR3411_94_with_GostR3410_94_cc "GOST R 34.11-94 with GOST R 34.10-94 Cryptocom" +#define NID_id_GostR3411_94_with_GostR3410_94_cc 852 +#define OBJ_id_GostR3411_94_with_GostR3410_94_cc OBJ_cryptocom,1L,3L,3L + +#define SN_id_GostR3411_94_with_GostR3410_2001_cc "id-GostR3411-94-with-GostR3410-2001-cc" +#define LN_id_GostR3411_94_with_GostR3410_2001_cc "GOST R 34.11-94 with GOST R 34.10-2001 Cryptocom" +#define NID_id_GostR3411_94_with_GostR3410_2001_cc 853 +#define OBJ_id_GostR3411_94_with_GostR3410_2001_cc OBJ_cryptocom,1L,3L,4L + +#define SN_id_GostR3410_2001_ParamSet_cc "id-GostR3410-2001-ParamSet-cc" +#define LN_id_GostR3410_2001_ParamSet_cc "GOST R 3410-2001 Parameter Set Cryptocom" +#define NID_id_GostR3410_2001_ParamSet_cc 854 +#define OBJ_id_GostR3410_2001_ParamSet_cc OBJ_cryptocom,1L,8L,1L + +#define SN_camellia_128_cbc "CAMELLIA-128-CBC" +#define LN_camellia_128_cbc "camellia-128-cbc" +#define NID_camellia_128_cbc 751 +#define OBJ_camellia_128_cbc 1L,2L,392L,200011L,61L,1L,1L,1L,2L + +#define SN_camellia_192_cbc "CAMELLIA-192-CBC" +#define LN_camellia_192_cbc "camellia-192-cbc" +#define NID_camellia_192_cbc 752 +#define OBJ_camellia_192_cbc 1L,2L,392L,200011L,61L,1L,1L,1L,3L + +#define SN_camellia_256_cbc "CAMELLIA-256-CBC" +#define LN_camellia_256_cbc "camellia-256-cbc" +#define NID_camellia_256_cbc 753 +#define OBJ_camellia_256_cbc 1L,2L,392L,200011L,61L,1L,1L,1L,4L + +#define SN_id_camellia128_wrap "id-camellia128-wrap" +#define NID_id_camellia128_wrap 907 +#define OBJ_id_camellia128_wrap 1L,2L,392L,200011L,61L,1L,1L,3L,2L + +#define SN_id_camellia192_wrap "id-camellia192-wrap" +#define NID_id_camellia192_wrap 908 +#define OBJ_id_camellia192_wrap 1L,2L,392L,200011L,61L,1L,1L,3L,3L + +#define SN_id_camellia256_wrap "id-camellia256-wrap" +#define NID_id_camellia256_wrap 909 +#define OBJ_id_camellia256_wrap 1L,2L,392L,200011L,61L,1L,1L,3L,4L + +#define OBJ_ntt_ds 0L,3L,4401L,5L + +#define OBJ_camellia OBJ_ntt_ds,3L,1L,9L + +#define SN_camellia_128_ecb "CAMELLIA-128-ECB" +#define LN_camellia_128_ecb "camellia-128-ecb" +#define NID_camellia_128_ecb 754 +#define OBJ_camellia_128_ecb OBJ_camellia,1L + +#define SN_camellia_128_ofb128 "CAMELLIA-128-OFB" +#define LN_camellia_128_ofb128 "camellia-128-ofb" +#define NID_camellia_128_ofb128 766 +#define OBJ_camellia_128_ofb128 OBJ_camellia,3L + +#define SN_camellia_128_cfb128 "CAMELLIA-128-CFB" +#define LN_camellia_128_cfb128 "camellia-128-cfb" +#define NID_camellia_128_cfb128 757 +#define OBJ_camellia_128_cfb128 OBJ_camellia,4L + +#define SN_camellia_192_ecb "CAMELLIA-192-ECB" +#define LN_camellia_192_ecb "camellia-192-ecb" +#define NID_camellia_192_ecb 755 +#define OBJ_camellia_192_ecb OBJ_camellia,21L + +#define SN_camellia_192_ofb128 "CAMELLIA-192-OFB" +#define LN_camellia_192_ofb128 "camellia-192-ofb" +#define NID_camellia_192_ofb128 767 +#define OBJ_camellia_192_ofb128 OBJ_camellia,23L + +#define SN_camellia_192_cfb128 "CAMELLIA-192-CFB" +#define LN_camellia_192_cfb128 "camellia-192-cfb" +#define NID_camellia_192_cfb128 758 +#define OBJ_camellia_192_cfb128 OBJ_camellia,24L + +#define SN_camellia_256_ecb "CAMELLIA-256-ECB" +#define LN_camellia_256_ecb "camellia-256-ecb" +#define NID_camellia_256_ecb 756 +#define OBJ_camellia_256_ecb OBJ_camellia,41L + +#define SN_camellia_256_ofb128 "CAMELLIA-256-OFB" +#define LN_camellia_256_ofb128 "camellia-256-ofb" +#define NID_camellia_256_ofb128 768 +#define OBJ_camellia_256_ofb128 OBJ_camellia,43L + +#define SN_camellia_256_cfb128 "CAMELLIA-256-CFB" +#define LN_camellia_256_cfb128 "camellia-256-cfb" +#define NID_camellia_256_cfb128 759 +#define OBJ_camellia_256_cfb128 OBJ_camellia,44L + +#define SN_camellia_128_cfb1 "CAMELLIA-128-CFB1" +#define LN_camellia_128_cfb1 "camellia-128-cfb1" +#define NID_camellia_128_cfb1 760 + +#define SN_camellia_192_cfb1 "CAMELLIA-192-CFB1" +#define LN_camellia_192_cfb1 "camellia-192-cfb1" +#define NID_camellia_192_cfb1 761 + +#define SN_camellia_256_cfb1 "CAMELLIA-256-CFB1" +#define LN_camellia_256_cfb1 "camellia-256-cfb1" +#define NID_camellia_256_cfb1 762 + +#define SN_camellia_128_cfb8 "CAMELLIA-128-CFB8" +#define LN_camellia_128_cfb8 "camellia-128-cfb8" +#define NID_camellia_128_cfb8 763 + +#define SN_camellia_192_cfb8 "CAMELLIA-192-CFB8" +#define LN_camellia_192_cfb8 "camellia-192-cfb8" +#define NID_camellia_192_cfb8 764 + +#define SN_camellia_256_cfb8 "CAMELLIA-256-CFB8" +#define LN_camellia_256_cfb8 "camellia-256-cfb8" +#define NID_camellia_256_cfb8 765 + +#define SN_kisa "KISA" +#define LN_kisa "kisa" +#define NID_kisa 773 +#define OBJ_kisa OBJ_member_body,410L,200004L + +#define SN_seed_ecb "SEED-ECB" +#define LN_seed_ecb "seed-ecb" +#define NID_seed_ecb 776 +#define OBJ_seed_ecb OBJ_kisa,1L,3L + +#define SN_seed_cbc "SEED-CBC" +#define LN_seed_cbc "seed-cbc" +#define NID_seed_cbc 777 +#define OBJ_seed_cbc OBJ_kisa,1L,4L + +#define SN_seed_cfb128 "SEED-CFB" +#define LN_seed_cfb128 "seed-cfb" +#define NID_seed_cfb128 779 +#define OBJ_seed_cfb128 OBJ_kisa,1L,5L + +#define SN_seed_ofb128 "SEED-OFB" +#define LN_seed_ofb128 "seed-ofb" +#define NID_seed_ofb128 778 +#define OBJ_seed_ofb128 OBJ_kisa,1L,6L + +#define SN_hmac "HMAC" +#define LN_hmac "hmac" +#define NID_hmac 855 + +#define SN_cmac "CMAC" +#define LN_cmac "cmac" +#define NID_cmac 894 + +#define SN_rc4_hmac_md5 "RC4-HMAC-MD5" +#define LN_rc4_hmac_md5 "rc4-hmac-md5" +#define NID_rc4_hmac_md5 915 + +#define SN_aes_128_cbc_hmac_sha1 "AES-128-CBC-HMAC-SHA1" +#define LN_aes_128_cbc_hmac_sha1 "aes-128-cbc-hmac-sha1" +#define NID_aes_128_cbc_hmac_sha1 916 + +#define SN_aes_192_cbc_hmac_sha1 "AES-192-CBC-HMAC-SHA1" +#define LN_aes_192_cbc_hmac_sha1 "aes-192-cbc-hmac-sha1" +#define NID_aes_192_cbc_hmac_sha1 917 + +#define SN_aes_256_cbc_hmac_sha1 "AES-256-CBC-HMAC-SHA1" +#define LN_aes_256_cbc_hmac_sha1 "aes-256-cbc-hmac-sha1" +#define NID_aes_256_cbc_hmac_sha1 918 + +#define SN_aes_128_cbc_hmac_sha256 "AES-128-CBC-HMAC-SHA256" +#define LN_aes_128_cbc_hmac_sha256 "aes-128-cbc-hmac-sha256" +#define NID_aes_128_cbc_hmac_sha256 948 + +#define SN_aes_192_cbc_hmac_sha256 "AES-192-CBC-HMAC-SHA256" +#define LN_aes_192_cbc_hmac_sha256 "aes-192-cbc-hmac-sha256" +#define NID_aes_192_cbc_hmac_sha256 949 + +#define SN_aes_256_cbc_hmac_sha256 "AES-256-CBC-HMAC-SHA256" +#define LN_aes_256_cbc_hmac_sha256 "aes-256-cbc-hmac-sha256" +#define NID_aes_256_cbc_hmac_sha256 950 + +#define SN_dhpublicnumber "dhpublicnumber" +#define LN_dhpublicnumber "X9.42 DH" +#define NID_dhpublicnumber 920 +#define OBJ_dhpublicnumber OBJ_ISO_US,10046L,2L,1L + +#define SN_brainpoolP160r1 "brainpoolP160r1" +#define NID_brainpoolP160r1 921 +#define OBJ_brainpoolP160r1 1L,3L,36L,3L,3L,2L,8L,1L,1L,1L + +#define SN_brainpoolP160t1 "brainpoolP160t1" +#define NID_brainpoolP160t1 922 +#define OBJ_brainpoolP160t1 1L,3L,36L,3L,3L,2L,8L,1L,1L,2L + +#define SN_brainpoolP192r1 "brainpoolP192r1" +#define NID_brainpoolP192r1 923 +#define OBJ_brainpoolP192r1 1L,3L,36L,3L,3L,2L,8L,1L,1L,3L + +#define SN_brainpoolP192t1 "brainpoolP192t1" +#define NID_brainpoolP192t1 924 +#define OBJ_brainpoolP192t1 1L,3L,36L,3L,3L,2L,8L,1L,1L,4L + +#define SN_brainpoolP224r1 "brainpoolP224r1" +#define NID_brainpoolP224r1 925 +#define OBJ_brainpoolP224r1 1L,3L,36L,3L,3L,2L,8L,1L,1L,5L + +#define SN_brainpoolP224t1 "brainpoolP224t1" +#define NID_brainpoolP224t1 926 +#define OBJ_brainpoolP224t1 1L,3L,36L,3L,3L,2L,8L,1L,1L,6L + +#define SN_brainpoolP256r1 "brainpoolP256r1" +#define NID_brainpoolP256r1 927 +#define OBJ_brainpoolP256r1 1L,3L,36L,3L,3L,2L,8L,1L,1L,7L + +#define SN_brainpoolP256t1 "brainpoolP256t1" +#define NID_brainpoolP256t1 928 +#define OBJ_brainpoolP256t1 1L,3L,36L,3L,3L,2L,8L,1L,1L,8L + +#define SN_brainpoolP320r1 "brainpoolP320r1" +#define NID_brainpoolP320r1 929 +#define OBJ_brainpoolP320r1 1L,3L,36L,3L,3L,2L,8L,1L,1L,9L + +#define SN_brainpoolP320t1 "brainpoolP320t1" +#define NID_brainpoolP320t1 930 +#define OBJ_brainpoolP320t1 1L,3L,36L,3L,3L,2L,8L,1L,1L,10L + +#define SN_brainpoolP384r1 "brainpoolP384r1" +#define NID_brainpoolP384r1 931 +#define OBJ_brainpoolP384r1 1L,3L,36L,3L,3L,2L,8L,1L,1L,11L + +#define SN_brainpoolP384t1 "brainpoolP384t1" +#define NID_brainpoolP384t1 932 +#define OBJ_brainpoolP384t1 1L,3L,36L,3L,3L,2L,8L,1L,1L,12L + +#define SN_brainpoolP512r1 "brainpoolP512r1" +#define NID_brainpoolP512r1 933 +#define OBJ_brainpoolP512r1 1L,3L,36L,3L,3L,2L,8L,1L,1L,13L + +#define SN_brainpoolP512t1 "brainpoolP512t1" +#define NID_brainpoolP512t1 934 +#define OBJ_brainpoolP512t1 1L,3L,36L,3L,3L,2L,8L,1L,1L,14L + +#define OBJ_x9_63_scheme 1L,3L,133L,16L,840L,63L,0L + +#define OBJ_secg_scheme OBJ_certicom_arc,1L + +#define SN_dhSinglePass_stdDH_sha1kdf_scheme "dhSinglePass-stdDH-sha1kdf-scheme" +#define NID_dhSinglePass_stdDH_sha1kdf_scheme 936 +#define OBJ_dhSinglePass_stdDH_sha1kdf_scheme OBJ_x9_63_scheme,2L + +#define SN_dhSinglePass_stdDH_sha224kdf_scheme "dhSinglePass-stdDH-sha224kdf-scheme" +#define NID_dhSinglePass_stdDH_sha224kdf_scheme 937 +#define OBJ_dhSinglePass_stdDH_sha224kdf_scheme OBJ_secg_scheme,11L,0L + +#define SN_dhSinglePass_stdDH_sha256kdf_scheme "dhSinglePass-stdDH-sha256kdf-scheme" +#define NID_dhSinglePass_stdDH_sha256kdf_scheme 938 +#define OBJ_dhSinglePass_stdDH_sha256kdf_scheme OBJ_secg_scheme,11L,1L + +#define SN_dhSinglePass_stdDH_sha384kdf_scheme "dhSinglePass-stdDH-sha384kdf-scheme" +#define NID_dhSinglePass_stdDH_sha384kdf_scheme 939 +#define OBJ_dhSinglePass_stdDH_sha384kdf_scheme OBJ_secg_scheme,11L,2L + +#define SN_dhSinglePass_stdDH_sha512kdf_scheme "dhSinglePass-stdDH-sha512kdf-scheme" +#define NID_dhSinglePass_stdDH_sha512kdf_scheme 940 +#define OBJ_dhSinglePass_stdDH_sha512kdf_scheme OBJ_secg_scheme,11L,3L + +#define SN_dhSinglePass_cofactorDH_sha1kdf_scheme "dhSinglePass-cofactorDH-sha1kdf-scheme" +#define NID_dhSinglePass_cofactorDH_sha1kdf_scheme 941 +#define OBJ_dhSinglePass_cofactorDH_sha1kdf_scheme OBJ_x9_63_scheme,3L + +#define SN_dhSinglePass_cofactorDH_sha224kdf_scheme "dhSinglePass-cofactorDH-sha224kdf-scheme" +#define NID_dhSinglePass_cofactorDH_sha224kdf_scheme 942 +#define OBJ_dhSinglePass_cofactorDH_sha224kdf_scheme OBJ_secg_scheme,14L,0L + +#define SN_dhSinglePass_cofactorDH_sha256kdf_scheme "dhSinglePass-cofactorDH-sha256kdf-scheme" +#define NID_dhSinglePass_cofactorDH_sha256kdf_scheme 943 +#define OBJ_dhSinglePass_cofactorDH_sha256kdf_scheme OBJ_secg_scheme,14L,1L + +#define SN_dhSinglePass_cofactorDH_sha384kdf_scheme "dhSinglePass-cofactorDH-sha384kdf-scheme" +#define NID_dhSinglePass_cofactorDH_sha384kdf_scheme 944 +#define OBJ_dhSinglePass_cofactorDH_sha384kdf_scheme OBJ_secg_scheme,14L,2L + +#define SN_dhSinglePass_cofactorDH_sha512kdf_scheme "dhSinglePass-cofactorDH-sha512kdf-scheme" +#define NID_dhSinglePass_cofactorDH_sha512kdf_scheme 945 +#define OBJ_dhSinglePass_cofactorDH_sha512kdf_scheme OBJ_secg_scheme,14L,3L + +#define SN_dh_std_kdf "dh-std-kdf" +#define NID_dh_std_kdf 946 + +#define SN_dh_cofactor_kdf "dh-cofactor-kdf" +#define NID_dh_cofactor_kdf 947 + +#define SN_ct_precert_scts "ct_precert_scts" +#define LN_ct_precert_scts "CT Precertificate SCTs" +#define NID_ct_precert_scts 951 +#define OBJ_ct_precert_scts 1L,3L,6L,1L,4L,1L,11129L,2L,4L,2L + +#define SN_ct_precert_poison "ct_precert_poison" +#define LN_ct_precert_poison "CT Precertificate Poison" +#define NID_ct_precert_poison 952 +#define OBJ_ct_precert_poison 1L,3L,6L,1L,4L,1L,11129L,2L,4L,3L + +#define SN_ct_precert_signer "ct_precert_signer" +#define LN_ct_precert_signer "CT Precertificate Signer" +#define NID_ct_precert_signer 953 +#define OBJ_ct_precert_signer 1L,3L,6L,1L,4L,1L,11129L,2L,4L,4L + +#define SN_ct_cert_scts "ct_cert_scts" +#define LN_ct_cert_scts "CT Certificate SCTs" +#define NID_ct_cert_scts 954 +#define OBJ_ct_cert_scts 1L,3L,6L,1L,4L,1L,11129L,2L,4L,5L + +#define SN_jurisdictionLocalityName "jurisdictionL" +#define LN_jurisdictionLocalityName "jurisdictionLocalityName" +#define NID_jurisdictionLocalityName 955 +#define OBJ_jurisdictionLocalityName 1L,3L,6L,1L,4L,1L,311L,60L,2L,1L,1L + +#define SN_jurisdictionStateOrProvinceName "jurisdictionST" +#define LN_jurisdictionStateOrProvinceName "jurisdictionStateOrProvinceName" +#define NID_jurisdictionStateOrProvinceName 956 +#define OBJ_jurisdictionStateOrProvinceName 1L,3L,6L,1L,4L,1L,311L,60L,2L,1L,2L + +#define SN_jurisdictionCountryName "jurisdictionC" +#define LN_jurisdictionCountryName "jurisdictionCountryName" +#define NID_jurisdictionCountryName 957 +#define OBJ_jurisdictionCountryName 1L,3L,6L,1L,4L,1L,311L,60L,2L,1L,3L diff --git a/ext/openssl-osx/include/openssl/objects.h b/ext/openssl-osx/include/openssl/objects.h new file mode 100644 index 00000000..b8dafa89 --- /dev/null +++ b/ext/openssl-osx/include/openssl/objects.h @@ -0,0 +1,1143 @@ +/* crypto/objects/objects.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_OBJECTS_H +# define HEADER_OBJECTS_H + +# define USE_OBJ_MAC + +# ifdef USE_OBJ_MAC +# include +# else +# define SN_undef "UNDEF" +# define LN_undef "undefined" +# define NID_undef 0 +# define OBJ_undef 0L + +# define SN_Algorithm "Algorithm" +# define LN_algorithm "algorithm" +# define NID_algorithm 38 +# define OBJ_algorithm 1L,3L,14L,3L,2L + +# define LN_rsadsi "rsadsi" +# define NID_rsadsi 1 +# define OBJ_rsadsi 1L,2L,840L,113549L + +# define LN_pkcs "pkcs" +# define NID_pkcs 2 +# define OBJ_pkcs OBJ_rsadsi,1L + +# define SN_md2 "MD2" +# define LN_md2 "md2" +# define NID_md2 3 +# define OBJ_md2 OBJ_rsadsi,2L,2L + +# define SN_md5 "MD5" +# define LN_md5 "md5" +# define NID_md5 4 +# define OBJ_md5 OBJ_rsadsi,2L,5L + +# define SN_rc4 "RC4" +# define LN_rc4 "rc4" +# define NID_rc4 5 +# define OBJ_rc4 OBJ_rsadsi,3L,4L + +# define LN_rsaEncryption "rsaEncryption" +# define NID_rsaEncryption 6 +# define OBJ_rsaEncryption OBJ_pkcs,1L,1L + +# define SN_md2WithRSAEncryption "RSA-MD2" +# define LN_md2WithRSAEncryption "md2WithRSAEncryption" +# define NID_md2WithRSAEncryption 7 +# define OBJ_md2WithRSAEncryption OBJ_pkcs,1L,2L + +# define SN_md5WithRSAEncryption "RSA-MD5" +# define LN_md5WithRSAEncryption "md5WithRSAEncryption" +# define NID_md5WithRSAEncryption 8 +# define OBJ_md5WithRSAEncryption OBJ_pkcs,1L,4L + +# define SN_pbeWithMD2AndDES_CBC "PBE-MD2-DES" +# define LN_pbeWithMD2AndDES_CBC "pbeWithMD2AndDES-CBC" +# define NID_pbeWithMD2AndDES_CBC 9 +# define OBJ_pbeWithMD2AndDES_CBC OBJ_pkcs,5L,1L + +# define SN_pbeWithMD5AndDES_CBC "PBE-MD5-DES" +# define LN_pbeWithMD5AndDES_CBC "pbeWithMD5AndDES-CBC" +# define NID_pbeWithMD5AndDES_CBC 10 +# define OBJ_pbeWithMD5AndDES_CBC OBJ_pkcs,5L,3L + +# define LN_X500 "X500" +# define NID_X500 11 +# define OBJ_X500 2L,5L + +# define LN_X509 "X509" +# define NID_X509 12 +# define OBJ_X509 OBJ_X500,4L + +# define SN_commonName "CN" +# define LN_commonName "commonName" +# define NID_commonName 13 +# define OBJ_commonName OBJ_X509,3L + +# define SN_countryName "C" +# define LN_countryName "countryName" +# define NID_countryName 14 +# define OBJ_countryName OBJ_X509,6L + +# define SN_localityName "L" +# define LN_localityName "localityName" +# define NID_localityName 15 +# define OBJ_localityName OBJ_X509,7L + +/* Postal Address? PA */ + +/* should be "ST" (rfc1327) but MS uses 'S' */ +# define SN_stateOrProvinceName "ST" +# define LN_stateOrProvinceName "stateOrProvinceName" +# define NID_stateOrProvinceName 16 +# define OBJ_stateOrProvinceName OBJ_X509,8L + +# define SN_organizationName "O" +# define LN_organizationName "organizationName" +# define NID_organizationName 17 +# define OBJ_organizationName OBJ_X509,10L + +# define SN_organizationalUnitName "OU" +# define LN_organizationalUnitName "organizationalUnitName" +# define NID_organizationalUnitName 18 +# define OBJ_organizationalUnitName OBJ_X509,11L + +# define SN_rsa "RSA" +# define LN_rsa "rsa" +# define NID_rsa 19 +# define OBJ_rsa OBJ_X500,8L,1L,1L + +# define LN_pkcs7 "pkcs7" +# define NID_pkcs7 20 +# define OBJ_pkcs7 OBJ_pkcs,7L + +# define LN_pkcs7_data "pkcs7-data" +# define NID_pkcs7_data 21 +# define OBJ_pkcs7_data OBJ_pkcs7,1L + +# define LN_pkcs7_signed "pkcs7-signedData" +# define NID_pkcs7_signed 22 +# define OBJ_pkcs7_signed OBJ_pkcs7,2L + +# define LN_pkcs7_enveloped "pkcs7-envelopedData" +# define NID_pkcs7_enveloped 23 +# define OBJ_pkcs7_enveloped OBJ_pkcs7,3L + +# define LN_pkcs7_signedAndEnveloped "pkcs7-signedAndEnvelopedData" +# define NID_pkcs7_signedAndEnveloped 24 +# define OBJ_pkcs7_signedAndEnveloped OBJ_pkcs7,4L + +# define LN_pkcs7_digest "pkcs7-digestData" +# define NID_pkcs7_digest 25 +# define OBJ_pkcs7_digest OBJ_pkcs7,5L + +# define LN_pkcs7_encrypted "pkcs7-encryptedData" +# define NID_pkcs7_encrypted 26 +# define OBJ_pkcs7_encrypted OBJ_pkcs7,6L + +# define LN_pkcs3 "pkcs3" +# define NID_pkcs3 27 +# define OBJ_pkcs3 OBJ_pkcs,3L + +# define LN_dhKeyAgreement "dhKeyAgreement" +# define NID_dhKeyAgreement 28 +# define OBJ_dhKeyAgreement OBJ_pkcs3,1L + +# define SN_des_ecb "DES-ECB" +# define LN_des_ecb "des-ecb" +# define NID_des_ecb 29 +# define OBJ_des_ecb OBJ_algorithm,6L + +# define SN_des_cfb64 "DES-CFB" +# define LN_des_cfb64 "des-cfb" +# define NID_des_cfb64 30 +/* IV + num */ +# define OBJ_des_cfb64 OBJ_algorithm,9L + +# define SN_des_cbc "DES-CBC" +# define LN_des_cbc "des-cbc" +# define NID_des_cbc 31 +/* IV */ +# define OBJ_des_cbc OBJ_algorithm,7L + +# define SN_des_ede "DES-EDE" +# define LN_des_ede "des-ede" +# define NID_des_ede 32 +/* ?? */ +# define OBJ_des_ede OBJ_algorithm,17L + +# define SN_des_ede3 "DES-EDE3" +# define LN_des_ede3 "des-ede3" +# define NID_des_ede3 33 + +# define SN_idea_cbc "IDEA-CBC" +# define LN_idea_cbc "idea-cbc" +# define NID_idea_cbc 34 +# define OBJ_idea_cbc 1L,3L,6L,1L,4L,1L,188L,7L,1L,1L,2L + +# define SN_idea_cfb64 "IDEA-CFB" +# define LN_idea_cfb64 "idea-cfb" +# define NID_idea_cfb64 35 + +# define SN_idea_ecb "IDEA-ECB" +# define LN_idea_ecb "idea-ecb" +# define NID_idea_ecb 36 + +# define SN_rc2_cbc "RC2-CBC" +# define LN_rc2_cbc "rc2-cbc" +# define NID_rc2_cbc 37 +# define OBJ_rc2_cbc OBJ_rsadsi,3L,2L + +# define SN_rc2_ecb "RC2-ECB" +# define LN_rc2_ecb "rc2-ecb" +# define NID_rc2_ecb 38 + +# define SN_rc2_cfb64 "RC2-CFB" +# define LN_rc2_cfb64 "rc2-cfb" +# define NID_rc2_cfb64 39 + +# define SN_rc2_ofb64 "RC2-OFB" +# define LN_rc2_ofb64 "rc2-ofb" +# define NID_rc2_ofb64 40 + +# define SN_sha "SHA" +# define LN_sha "sha" +# define NID_sha 41 +# define OBJ_sha OBJ_algorithm,18L + +# define SN_shaWithRSAEncryption "RSA-SHA" +# define LN_shaWithRSAEncryption "shaWithRSAEncryption" +# define NID_shaWithRSAEncryption 42 +# define OBJ_shaWithRSAEncryption OBJ_algorithm,15L + +# define SN_des_ede_cbc "DES-EDE-CBC" +# define LN_des_ede_cbc "des-ede-cbc" +# define NID_des_ede_cbc 43 + +# define SN_des_ede3_cbc "DES-EDE3-CBC" +# define LN_des_ede3_cbc "des-ede3-cbc" +# define NID_des_ede3_cbc 44 +# define OBJ_des_ede3_cbc OBJ_rsadsi,3L,7L + +# define SN_des_ofb64 "DES-OFB" +# define LN_des_ofb64 "des-ofb" +# define NID_des_ofb64 45 +# define OBJ_des_ofb64 OBJ_algorithm,8L + +# define SN_idea_ofb64 "IDEA-OFB" +# define LN_idea_ofb64 "idea-ofb" +# define NID_idea_ofb64 46 + +# define LN_pkcs9 "pkcs9" +# define NID_pkcs9 47 +# define OBJ_pkcs9 OBJ_pkcs,9L + +# define SN_pkcs9_emailAddress "Email" +# define LN_pkcs9_emailAddress "emailAddress" +# define NID_pkcs9_emailAddress 48 +# define OBJ_pkcs9_emailAddress OBJ_pkcs9,1L + +# define LN_pkcs9_unstructuredName "unstructuredName" +# define NID_pkcs9_unstructuredName 49 +# define OBJ_pkcs9_unstructuredName OBJ_pkcs9,2L + +# define LN_pkcs9_contentType "contentType" +# define NID_pkcs9_contentType 50 +# define OBJ_pkcs9_contentType OBJ_pkcs9,3L + +# define LN_pkcs9_messageDigest "messageDigest" +# define NID_pkcs9_messageDigest 51 +# define OBJ_pkcs9_messageDigest OBJ_pkcs9,4L + +# define LN_pkcs9_signingTime "signingTime" +# define NID_pkcs9_signingTime 52 +# define OBJ_pkcs9_signingTime OBJ_pkcs9,5L + +# define LN_pkcs9_countersignature "countersignature" +# define NID_pkcs9_countersignature 53 +# define OBJ_pkcs9_countersignature OBJ_pkcs9,6L + +# define LN_pkcs9_challengePassword "challengePassword" +# define NID_pkcs9_challengePassword 54 +# define OBJ_pkcs9_challengePassword OBJ_pkcs9,7L + +# define LN_pkcs9_unstructuredAddress "unstructuredAddress" +# define NID_pkcs9_unstructuredAddress 55 +# define OBJ_pkcs9_unstructuredAddress OBJ_pkcs9,8L + +# define LN_pkcs9_extCertAttributes "extendedCertificateAttributes" +# define NID_pkcs9_extCertAttributes 56 +# define OBJ_pkcs9_extCertAttributes OBJ_pkcs9,9L + +# define SN_netscape "Netscape" +# define LN_netscape "Netscape Communications Corp." +# define NID_netscape 57 +# define OBJ_netscape 2L,16L,840L,1L,113730L + +# define SN_netscape_cert_extension "nsCertExt" +# define LN_netscape_cert_extension "Netscape Certificate Extension" +# define NID_netscape_cert_extension 58 +# define OBJ_netscape_cert_extension OBJ_netscape,1L + +# define SN_netscape_data_type "nsDataType" +# define LN_netscape_data_type "Netscape Data Type" +# define NID_netscape_data_type 59 +# define OBJ_netscape_data_type OBJ_netscape,2L + +# define SN_des_ede_cfb64 "DES-EDE-CFB" +# define LN_des_ede_cfb64 "des-ede-cfb" +# define NID_des_ede_cfb64 60 + +# define SN_des_ede3_cfb64 "DES-EDE3-CFB" +# define LN_des_ede3_cfb64 "des-ede3-cfb" +# define NID_des_ede3_cfb64 61 + +# define SN_des_ede_ofb64 "DES-EDE-OFB" +# define LN_des_ede_ofb64 "des-ede-ofb" +# define NID_des_ede_ofb64 62 + +# define SN_des_ede3_ofb64 "DES-EDE3-OFB" +# define LN_des_ede3_ofb64 "des-ede3-ofb" +# define NID_des_ede3_ofb64 63 + +/* I'm not sure about the object ID */ +# define SN_sha1 "SHA1" +# define LN_sha1 "sha1" +# define NID_sha1 64 +# define OBJ_sha1 OBJ_algorithm,26L +/* 28 Jun 1996 - eay */ +/* #define OBJ_sha1 1L,3L,14L,2L,26L,05L <- wrong */ + +# define SN_sha1WithRSAEncryption "RSA-SHA1" +# define LN_sha1WithRSAEncryption "sha1WithRSAEncryption" +# define NID_sha1WithRSAEncryption 65 +# define OBJ_sha1WithRSAEncryption OBJ_pkcs,1L,5L + +# define SN_dsaWithSHA "DSA-SHA" +# define LN_dsaWithSHA "dsaWithSHA" +# define NID_dsaWithSHA 66 +# define OBJ_dsaWithSHA OBJ_algorithm,13L + +# define SN_dsa_2 "DSA-old" +# define LN_dsa_2 "dsaEncryption-old" +# define NID_dsa_2 67 +# define OBJ_dsa_2 OBJ_algorithm,12L + +/* proposed by microsoft to RSA */ +# define SN_pbeWithSHA1AndRC2_CBC "PBE-SHA1-RC2-64" +# define LN_pbeWithSHA1AndRC2_CBC "pbeWithSHA1AndRC2-CBC" +# define NID_pbeWithSHA1AndRC2_CBC 68 +# define OBJ_pbeWithSHA1AndRC2_CBC OBJ_pkcs,5L,11L + +/* + * proposed by microsoft to RSA as pbeWithSHA1AndRC4: it is now defined + * explicitly in PKCS#5 v2.0 as id-PBKDF2 which is something completely + * different. + */ +# define LN_id_pbkdf2 "PBKDF2" +# define NID_id_pbkdf2 69 +# define OBJ_id_pbkdf2 OBJ_pkcs,5L,12L + +# define SN_dsaWithSHA1_2 "DSA-SHA1-old" +# define LN_dsaWithSHA1_2 "dsaWithSHA1-old" +# define NID_dsaWithSHA1_2 70 +/* Got this one from 'sdn706r20.pdf' which is actually an NSA document :-) */ +# define OBJ_dsaWithSHA1_2 OBJ_algorithm,27L + +# define SN_netscape_cert_type "nsCertType" +# define LN_netscape_cert_type "Netscape Cert Type" +# define NID_netscape_cert_type 71 +# define OBJ_netscape_cert_type OBJ_netscape_cert_extension,1L + +# define SN_netscape_base_url "nsBaseUrl" +# define LN_netscape_base_url "Netscape Base Url" +# define NID_netscape_base_url 72 +# define OBJ_netscape_base_url OBJ_netscape_cert_extension,2L + +# define SN_netscape_revocation_url "nsRevocationUrl" +# define LN_netscape_revocation_url "Netscape Revocation Url" +# define NID_netscape_revocation_url 73 +# define OBJ_netscape_revocation_url OBJ_netscape_cert_extension,3L + +# define SN_netscape_ca_revocation_url "nsCaRevocationUrl" +# define LN_netscape_ca_revocation_url "Netscape CA Revocation Url" +# define NID_netscape_ca_revocation_url 74 +# define OBJ_netscape_ca_revocation_url OBJ_netscape_cert_extension,4L + +# define SN_netscape_renewal_url "nsRenewalUrl" +# define LN_netscape_renewal_url "Netscape Renewal Url" +# define NID_netscape_renewal_url 75 +# define OBJ_netscape_renewal_url OBJ_netscape_cert_extension,7L + +# define SN_netscape_ca_policy_url "nsCaPolicyUrl" +# define LN_netscape_ca_policy_url "Netscape CA Policy Url" +# define NID_netscape_ca_policy_url 76 +# define OBJ_netscape_ca_policy_url OBJ_netscape_cert_extension,8L + +# define SN_netscape_ssl_server_name "nsSslServerName" +# define LN_netscape_ssl_server_name "Netscape SSL Server Name" +# define NID_netscape_ssl_server_name 77 +# define OBJ_netscape_ssl_server_name OBJ_netscape_cert_extension,12L + +# define SN_netscape_comment "nsComment" +# define LN_netscape_comment "Netscape Comment" +# define NID_netscape_comment 78 +# define OBJ_netscape_comment OBJ_netscape_cert_extension,13L + +# define SN_netscape_cert_sequence "nsCertSequence" +# define LN_netscape_cert_sequence "Netscape Certificate Sequence" +# define NID_netscape_cert_sequence 79 +# define OBJ_netscape_cert_sequence OBJ_netscape_data_type,5L + +# define SN_desx_cbc "DESX-CBC" +# define LN_desx_cbc "desx-cbc" +# define NID_desx_cbc 80 + +# define SN_id_ce "id-ce" +# define NID_id_ce 81 +# define OBJ_id_ce 2L,5L,29L + +# define SN_subject_key_identifier "subjectKeyIdentifier" +# define LN_subject_key_identifier "X509v3 Subject Key Identifier" +# define NID_subject_key_identifier 82 +# define OBJ_subject_key_identifier OBJ_id_ce,14L + +# define SN_key_usage "keyUsage" +# define LN_key_usage "X509v3 Key Usage" +# define NID_key_usage 83 +# define OBJ_key_usage OBJ_id_ce,15L + +# define SN_private_key_usage_period "privateKeyUsagePeriod" +# define LN_private_key_usage_period "X509v3 Private Key Usage Period" +# define NID_private_key_usage_period 84 +# define OBJ_private_key_usage_period OBJ_id_ce,16L + +# define SN_subject_alt_name "subjectAltName" +# define LN_subject_alt_name "X509v3 Subject Alternative Name" +# define NID_subject_alt_name 85 +# define OBJ_subject_alt_name OBJ_id_ce,17L + +# define SN_issuer_alt_name "issuerAltName" +# define LN_issuer_alt_name "X509v3 Issuer Alternative Name" +# define NID_issuer_alt_name 86 +# define OBJ_issuer_alt_name OBJ_id_ce,18L + +# define SN_basic_constraints "basicConstraints" +# define LN_basic_constraints "X509v3 Basic Constraints" +# define NID_basic_constraints 87 +# define OBJ_basic_constraints OBJ_id_ce,19L + +# define SN_crl_number "crlNumber" +# define LN_crl_number "X509v3 CRL Number" +# define NID_crl_number 88 +# define OBJ_crl_number OBJ_id_ce,20L + +# define SN_certificate_policies "certificatePolicies" +# define LN_certificate_policies "X509v3 Certificate Policies" +# define NID_certificate_policies 89 +# define OBJ_certificate_policies OBJ_id_ce,32L + +# define SN_authority_key_identifier "authorityKeyIdentifier" +# define LN_authority_key_identifier "X509v3 Authority Key Identifier" +# define NID_authority_key_identifier 90 +# define OBJ_authority_key_identifier OBJ_id_ce,35L + +# define SN_bf_cbc "BF-CBC" +# define LN_bf_cbc "bf-cbc" +# define NID_bf_cbc 91 +# define OBJ_bf_cbc 1L,3L,6L,1L,4L,1L,3029L,1L,2L + +# define SN_bf_ecb "BF-ECB" +# define LN_bf_ecb "bf-ecb" +# define NID_bf_ecb 92 + +# define SN_bf_cfb64 "BF-CFB" +# define LN_bf_cfb64 "bf-cfb" +# define NID_bf_cfb64 93 + +# define SN_bf_ofb64 "BF-OFB" +# define LN_bf_ofb64 "bf-ofb" +# define NID_bf_ofb64 94 + +# define SN_mdc2 "MDC2" +# define LN_mdc2 "mdc2" +# define NID_mdc2 95 +# define OBJ_mdc2 2L,5L,8L,3L,101L +/* An alternative? 1L,3L,14L,3L,2L,19L */ + +# define SN_mdc2WithRSA "RSA-MDC2" +# define LN_mdc2WithRSA "mdc2withRSA" +# define NID_mdc2WithRSA 96 +# define OBJ_mdc2WithRSA 2L,5L,8L,3L,100L + +# define SN_rc4_40 "RC4-40" +# define LN_rc4_40 "rc4-40" +# define NID_rc4_40 97 + +# define SN_rc2_40_cbc "RC2-40-CBC" +# define LN_rc2_40_cbc "rc2-40-cbc" +# define NID_rc2_40_cbc 98 + +# define SN_givenName "G" +# define LN_givenName "givenName" +# define NID_givenName 99 +# define OBJ_givenName OBJ_X509,42L + +# define SN_surname "S" +# define LN_surname "surname" +# define NID_surname 100 +# define OBJ_surname OBJ_X509,4L + +# define SN_initials "I" +# define LN_initials "initials" +# define NID_initials 101 +# define OBJ_initials OBJ_X509,43L + +# define SN_uniqueIdentifier "UID" +# define LN_uniqueIdentifier "uniqueIdentifier" +# define NID_uniqueIdentifier 102 +# define OBJ_uniqueIdentifier OBJ_X509,45L + +# define SN_crl_distribution_points "crlDistributionPoints" +# define LN_crl_distribution_points "X509v3 CRL Distribution Points" +# define NID_crl_distribution_points 103 +# define OBJ_crl_distribution_points OBJ_id_ce,31L + +# define SN_md5WithRSA "RSA-NP-MD5" +# define LN_md5WithRSA "md5WithRSA" +# define NID_md5WithRSA 104 +# define OBJ_md5WithRSA OBJ_algorithm,3L + +# define SN_serialNumber "SN" +# define LN_serialNumber "serialNumber" +# define NID_serialNumber 105 +# define OBJ_serialNumber OBJ_X509,5L + +# define SN_title "T" +# define LN_title "title" +# define NID_title 106 +# define OBJ_title OBJ_X509,12L + +# define SN_description "D" +# define LN_description "description" +# define NID_description 107 +# define OBJ_description OBJ_X509,13L + +/* CAST5 is CAST-128, I'm just sticking with the documentation */ +# define SN_cast5_cbc "CAST5-CBC" +# define LN_cast5_cbc "cast5-cbc" +# define NID_cast5_cbc 108 +# define OBJ_cast5_cbc 1L,2L,840L,113533L,7L,66L,10L + +# define SN_cast5_ecb "CAST5-ECB" +# define LN_cast5_ecb "cast5-ecb" +# define NID_cast5_ecb 109 + +# define SN_cast5_cfb64 "CAST5-CFB" +# define LN_cast5_cfb64 "cast5-cfb" +# define NID_cast5_cfb64 110 + +# define SN_cast5_ofb64 "CAST5-OFB" +# define LN_cast5_ofb64 "cast5-ofb" +# define NID_cast5_ofb64 111 + +# define LN_pbeWithMD5AndCast5_CBC "pbeWithMD5AndCast5CBC" +# define NID_pbeWithMD5AndCast5_CBC 112 +# define OBJ_pbeWithMD5AndCast5_CBC 1L,2L,840L,113533L,7L,66L,12L + +/*- + * This is one sun will soon be using :-( + * id-dsa-with-sha1 ID ::= { + * iso(1) member-body(2) us(840) x9-57 (10040) x9cm(4) 3 } + */ +# define SN_dsaWithSHA1 "DSA-SHA1" +# define LN_dsaWithSHA1 "dsaWithSHA1" +# define NID_dsaWithSHA1 113 +# define OBJ_dsaWithSHA1 1L,2L,840L,10040L,4L,3L + +# define NID_md5_sha1 114 +# define SN_md5_sha1 "MD5-SHA1" +# define LN_md5_sha1 "md5-sha1" + +# define SN_sha1WithRSA "RSA-SHA1-2" +# define LN_sha1WithRSA "sha1WithRSA" +# define NID_sha1WithRSA 115 +# define OBJ_sha1WithRSA OBJ_algorithm,29L + +# define SN_dsa "DSA" +# define LN_dsa "dsaEncryption" +# define NID_dsa 116 +# define OBJ_dsa 1L,2L,840L,10040L,4L,1L + +# define SN_ripemd160 "RIPEMD160" +# define LN_ripemd160 "ripemd160" +# define NID_ripemd160 117 +# define OBJ_ripemd160 1L,3L,36L,3L,2L,1L + +/* + * The name should actually be rsaSignatureWithripemd160, but I'm going to + * continue using the convention I'm using with the other ciphers + */ +# define SN_ripemd160WithRSA "RSA-RIPEMD160" +# define LN_ripemd160WithRSA "ripemd160WithRSA" +# define NID_ripemd160WithRSA 119 +# define OBJ_ripemd160WithRSA 1L,3L,36L,3L,3L,1L,2L + +/*- + * Taken from rfc2040 + * RC5_CBC_Parameters ::= SEQUENCE { + * version INTEGER (v1_0(16)), + * rounds INTEGER (8..127), + * blockSizeInBits INTEGER (64, 128), + * iv OCTET STRING OPTIONAL + * } + */ +# define SN_rc5_cbc "RC5-CBC" +# define LN_rc5_cbc "rc5-cbc" +# define NID_rc5_cbc 120 +# define OBJ_rc5_cbc OBJ_rsadsi,3L,8L + +# define SN_rc5_ecb "RC5-ECB" +# define LN_rc5_ecb "rc5-ecb" +# define NID_rc5_ecb 121 + +# define SN_rc5_cfb64 "RC5-CFB" +# define LN_rc5_cfb64 "rc5-cfb" +# define NID_rc5_cfb64 122 + +# define SN_rc5_ofb64 "RC5-OFB" +# define LN_rc5_ofb64 "rc5-ofb" +# define NID_rc5_ofb64 123 + +# define SN_rle_compression "RLE" +# define LN_rle_compression "run length compression" +# define NID_rle_compression 124 +# define OBJ_rle_compression 1L,1L,1L,1L,666L,1L + +# define SN_zlib_compression "ZLIB" +# define LN_zlib_compression "zlib compression" +# define NID_zlib_compression 125 +# define OBJ_zlib_compression 1L,1L,1L,1L,666L,2L + +# define SN_ext_key_usage "extendedKeyUsage" +# define LN_ext_key_usage "X509v3 Extended Key Usage" +# define NID_ext_key_usage 126 +# define OBJ_ext_key_usage OBJ_id_ce,37 + +# define SN_id_pkix "PKIX" +# define NID_id_pkix 127 +# define OBJ_id_pkix 1L,3L,6L,1L,5L,5L,7L + +# define SN_id_kp "id-kp" +# define NID_id_kp 128 +# define OBJ_id_kp OBJ_id_pkix,3L + +/* PKIX extended key usage OIDs */ + +# define SN_server_auth "serverAuth" +# define LN_server_auth "TLS Web Server Authentication" +# define NID_server_auth 129 +# define OBJ_server_auth OBJ_id_kp,1L + +# define SN_client_auth "clientAuth" +# define LN_client_auth "TLS Web Client Authentication" +# define NID_client_auth 130 +# define OBJ_client_auth OBJ_id_kp,2L + +# define SN_code_sign "codeSigning" +# define LN_code_sign "Code Signing" +# define NID_code_sign 131 +# define OBJ_code_sign OBJ_id_kp,3L + +# define SN_email_protect "emailProtection" +# define LN_email_protect "E-mail Protection" +# define NID_email_protect 132 +# define OBJ_email_protect OBJ_id_kp,4L + +# define SN_time_stamp "timeStamping" +# define LN_time_stamp "Time Stamping" +# define NID_time_stamp 133 +# define OBJ_time_stamp OBJ_id_kp,8L + +/* Additional extended key usage OIDs: Microsoft */ + +# define SN_ms_code_ind "msCodeInd" +# define LN_ms_code_ind "Microsoft Individual Code Signing" +# define NID_ms_code_ind 134 +# define OBJ_ms_code_ind 1L,3L,6L,1L,4L,1L,311L,2L,1L,21L + +# define SN_ms_code_com "msCodeCom" +# define LN_ms_code_com "Microsoft Commercial Code Signing" +# define NID_ms_code_com 135 +# define OBJ_ms_code_com 1L,3L,6L,1L,4L,1L,311L,2L,1L,22L + +# define SN_ms_ctl_sign "msCTLSign" +# define LN_ms_ctl_sign "Microsoft Trust List Signing" +# define NID_ms_ctl_sign 136 +# define OBJ_ms_ctl_sign 1L,3L,6L,1L,4L,1L,311L,10L,3L,1L + +# define SN_ms_sgc "msSGC" +# define LN_ms_sgc "Microsoft Server Gated Crypto" +# define NID_ms_sgc 137 +# define OBJ_ms_sgc 1L,3L,6L,1L,4L,1L,311L,10L,3L,3L + +# define SN_ms_efs "msEFS" +# define LN_ms_efs "Microsoft Encrypted File System" +# define NID_ms_efs 138 +# define OBJ_ms_efs 1L,3L,6L,1L,4L,1L,311L,10L,3L,4L + +/* Additional usage: Netscape */ + +# define SN_ns_sgc "nsSGC" +# define LN_ns_sgc "Netscape Server Gated Crypto" +# define NID_ns_sgc 139 +# define OBJ_ns_sgc OBJ_netscape,4L,1L + +# define SN_delta_crl "deltaCRL" +# define LN_delta_crl "X509v3 Delta CRL Indicator" +# define NID_delta_crl 140 +# define OBJ_delta_crl OBJ_id_ce,27L + +# define SN_crl_reason "CRLReason" +# define LN_crl_reason "CRL Reason Code" +# define NID_crl_reason 141 +# define OBJ_crl_reason OBJ_id_ce,21L + +# define SN_invalidity_date "invalidityDate" +# define LN_invalidity_date "Invalidity Date" +# define NID_invalidity_date 142 +# define OBJ_invalidity_date OBJ_id_ce,24L + +# define SN_sxnet "SXNetID" +# define LN_sxnet "Strong Extranet ID" +# define NID_sxnet 143 +# define OBJ_sxnet 1L,3L,101L,1L,4L,1L + +/* PKCS12 and related OBJECT IDENTIFIERS */ + +# define OBJ_pkcs12 OBJ_pkcs,12L +# define OBJ_pkcs12_pbeids OBJ_pkcs12, 1 + +# define SN_pbe_WithSHA1And128BitRC4 "PBE-SHA1-RC4-128" +# define LN_pbe_WithSHA1And128BitRC4 "pbeWithSHA1And128BitRC4" +# define NID_pbe_WithSHA1And128BitRC4 144 +# define OBJ_pbe_WithSHA1And128BitRC4 OBJ_pkcs12_pbeids, 1L + +# define SN_pbe_WithSHA1And40BitRC4 "PBE-SHA1-RC4-40" +# define LN_pbe_WithSHA1And40BitRC4 "pbeWithSHA1And40BitRC4" +# define NID_pbe_WithSHA1And40BitRC4 145 +# define OBJ_pbe_WithSHA1And40BitRC4 OBJ_pkcs12_pbeids, 2L + +# define SN_pbe_WithSHA1And3_Key_TripleDES_CBC "PBE-SHA1-3DES" +# define LN_pbe_WithSHA1And3_Key_TripleDES_CBC "pbeWithSHA1And3-KeyTripleDES-CBC" +# define NID_pbe_WithSHA1And3_Key_TripleDES_CBC 146 +# define OBJ_pbe_WithSHA1And3_Key_TripleDES_CBC OBJ_pkcs12_pbeids, 3L + +# define SN_pbe_WithSHA1And2_Key_TripleDES_CBC "PBE-SHA1-2DES" +# define LN_pbe_WithSHA1And2_Key_TripleDES_CBC "pbeWithSHA1And2-KeyTripleDES-CBC" +# define NID_pbe_WithSHA1And2_Key_TripleDES_CBC 147 +# define OBJ_pbe_WithSHA1And2_Key_TripleDES_CBC OBJ_pkcs12_pbeids, 4L + +# define SN_pbe_WithSHA1And128BitRC2_CBC "PBE-SHA1-RC2-128" +# define LN_pbe_WithSHA1And128BitRC2_CBC "pbeWithSHA1And128BitRC2-CBC" +# define NID_pbe_WithSHA1And128BitRC2_CBC 148 +# define OBJ_pbe_WithSHA1And128BitRC2_CBC OBJ_pkcs12_pbeids, 5L + +# define SN_pbe_WithSHA1And40BitRC2_CBC "PBE-SHA1-RC2-40" +# define LN_pbe_WithSHA1And40BitRC2_CBC "pbeWithSHA1And40BitRC2-CBC" +# define NID_pbe_WithSHA1And40BitRC2_CBC 149 +# define OBJ_pbe_WithSHA1And40BitRC2_CBC OBJ_pkcs12_pbeids, 6L + +# define OBJ_pkcs12_Version1 OBJ_pkcs12, 10L + +# define OBJ_pkcs12_BagIds OBJ_pkcs12_Version1, 1L + +# define LN_keyBag "keyBag" +# define NID_keyBag 150 +# define OBJ_keyBag OBJ_pkcs12_BagIds, 1L + +# define LN_pkcs8ShroudedKeyBag "pkcs8ShroudedKeyBag" +# define NID_pkcs8ShroudedKeyBag 151 +# define OBJ_pkcs8ShroudedKeyBag OBJ_pkcs12_BagIds, 2L + +# define LN_certBag "certBag" +# define NID_certBag 152 +# define OBJ_certBag OBJ_pkcs12_BagIds, 3L + +# define LN_crlBag "crlBag" +# define NID_crlBag 153 +# define OBJ_crlBag OBJ_pkcs12_BagIds, 4L + +# define LN_secretBag "secretBag" +# define NID_secretBag 154 +# define OBJ_secretBag OBJ_pkcs12_BagIds, 5L + +# define LN_safeContentsBag "safeContentsBag" +# define NID_safeContentsBag 155 +# define OBJ_safeContentsBag OBJ_pkcs12_BagIds, 6L + +# define LN_friendlyName "friendlyName" +# define NID_friendlyName 156 +# define OBJ_friendlyName OBJ_pkcs9, 20L + +# define LN_localKeyID "localKeyID" +# define NID_localKeyID 157 +# define OBJ_localKeyID OBJ_pkcs9, 21L + +# define OBJ_certTypes OBJ_pkcs9, 22L + +# define LN_x509Certificate "x509Certificate" +# define NID_x509Certificate 158 +# define OBJ_x509Certificate OBJ_certTypes, 1L + +# define LN_sdsiCertificate "sdsiCertificate" +# define NID_sdsiCertificate 159 +# define OBJ_sdsiCertificate OBJ_certTypes, 2L + +# define OBJ_crlTypes OBJ_pkcs9, 23L + +# define LN_x509Crl "x509Crl" +# define NID_x509Crl 160 +# define OBJ_x509Crl OBJ_crlTypes, 1L + +/* PKCS#5 v2 OIDs */ + +# define LN_pbes2 "PBES2" +# define NID_pbes2 161 +# define OBJ_pbes2 OBJ_pkcs,5L,13L + +# define LN_pbmac1 "PBMAC1" +# define NID_pbmac1 162 +# define OBJ_pbmac1 OBJ_pkcs,5L,14L + +# define LN_hmacWithSHA1 "hmacWithSHA1" +# define NID_hmacWithSHA1 163 +# define OBJ_hmacWithSHA1 OBJ_rsadsi,2L,7L + +/* Policy Qualifier Ids */ + +# define LN_id_qt_cps "Policy Qualifier CPS" +# define SN_id_qt_cps "id-qt-cps" +# define NID_id_qt_cps 164 +# define OBJ_id_qt_cps OBJ_id_pkix,2L,1L + +# define LN_id_qt_unotice "Policy Qualifier User Notice" +# define SN_id_qt_unotice "id-qt-unotice" +# define NID_id_qt_unotice 165 +# define OBJ_id_qt_unotice OBJ_id_pkix,2L,2L + +# define SN_rc2_64_cbc "RC2-64-CBC" +# define LN_rc2_64_cbc "rc2-64-cbc" +# define NID_rc2_64_cbc 166 + +# define SN_SMIMECapabilities "SMIME-CAPS" +# define LN_SMIMECapabilities "S/MIME Capabilities" +# define NID_SMIMECapabilities 167 +# define OBJ_SMIMECapabilities OBJ_pkcs9,15L + +# define SN_pbeWithMD2AndRC2_CBC "PBE-MD2-RC2-64" +# define LN_pbeWithMD2AndRC2_CBC "pbeWithMD2AndRC2-CBC" +# define NID_pbeWithMD2AndRC2_CBC 168 +# define OBJ_pbeWithMD2AndRC2_CBC OBJ_pkcs,5L,4L + +# define SN_pbeWithMD5AndRC2_CBC "PBE-MD5-RC2-64" +# define LN_pbeWithMD5AndRC2_CBC "pbeWithMD5AndRC2-CBC" +# define NID_pbeWithMD5AndRC2_CBC 169 +# define OBJ_pbeWithMD5AndRC2_CBC OBJ_pkcs,5L,6L + +# define SN_pbeWithSHA1AndDES_CBC "PBE-SHA1-DES" +# define LN_pbeWithSHA1AndDES_CBC "pbeWithSHA1AndDES-CBC" +# define NID_pbeWithSHA1AndDES_CBC 170 +# define OBJ_pbeWithSHA1AndDES_CBC OBJ_pkcs,5L,10L + +/* Extension request OIDs */ + +# define LN_ms_ext_req "Microsoft Extension Request" +# define SN_ms_ext_req "msExtReq" +# define NID_ms_ext_req 171 +# define OBJ_ms_ext_req 1L,3L,6L,1L,4L,1L,311L,2L,1L,14L + +# define LN_ext_req "Extension Request" +# define SN_ext_req "extReq" +# define NID_ext_req 172 +# define OBJ_ext_req OBJ_pkcs9,14L + +# define SN_name "name" +# define LN_name "name" +# define NID_name 173 +# define OBJ_name OBJ_X509,41L + +# define SN_dnQualifier "dnQualifier" +# define LN_dnQualifier "dnQualifier" +# define NID_dnQualifier 174 +# define OBJ_dnQualifier OBJ_X509,46L + +# define SN_id_pe "id-pe" +# define NID_id_pe 175 +# define OBJ_id_pe OBJ_id_pkix,1L + +# define SN_id_ad "id-ad" +# define NID_id_ad 176 +# define OBJ_id_ad OBJ_id_pkix,48L + +# define SN_info_access "authorityInfoAccess" +# define LN_info_access "Authority Information Access" +# define NID_info_access 177 +# define OBJ_info_access OBJ_id_pe,1L + +# define SN_ad_OCSP "OCSP" +# define LN_ad_OCSP "OCSP" +# define NID_ad_OCSP 178 +# define OBJ_ad_OCSP OBJ_id_ad,1L + +# define SN_ad_ca_issuers "caIssuers" +# define LN_ad_ca_issuers "CA Issuers" +# define NID_ad_ca_issuers 179 +# define OBJ_ad_ca_issuers OBJ_id_ad,2L + +# define SN_OCSP_sign "OCSPSigning" +# define LN_OCSP_sign "OCSP Signing" +# define NID_OCSP_sign 180 +# define OBJ_OCSP_sign OBJ_id_kp,9L +# endif /* USE_OBJ_MAC */ + +# include +# include + +# define OBJ_NAME_TYPE_UNDEF 0x00 +# define OBJ_NAME_TYPE_MD_METH 0x01 +# define OBJ_NAME_TYPE_CIPHER_METH 0x02 +# define OBJ_NAME_TYPE_PKEY_METH 0x03 +# define OBJ_NAME_TYPE_COMP_METH 0x04 +# define OBJ_NAME_TYPE_NUM 0x05 + +# define OBJ_NAME_ALIAS 0x8000 + +# define OBJ_BSEARCH_VALUE_ON_NOMATCH 0x01 +# define OBJ_BSEARCH_FIRST_VALUE_ON_MATCH 0x02 + + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct obj_name_st { + int type; + int alias; + const char *name; + const char *data; +} OBJ_NAME; + +# define OBJ_create_and_add_object(a,b,c) OBJ_create(a,b,c) + +int OBJ_NAME_init(void); +int OBJ_NAME_new_index(unsigned long (*hash_func) (const char *), + int (*cmp_func) (const char *, const char *), + void (*free_func) (const char *, int, const char *)); +const char *OBJ_NAME_get(const char *name, int type); +int OBJ_NAME_add(const char *name, int type, const char *data); +int OBJ_NAME_remove(const char *name, int type); +void OBJ_NAME_cleanup(int type); /* -1 for everything */ +void OBJ_NAME_do_all(int type, void (*fn) (const OBJ_NAME *, void *arg), + void *arg); +void OBJ_NAME_do_all_sorted(int type, + void (*fn) (const OBJ_NAME *, void *arg), + void *arg); + +ASN1_OBJECT *OBJ_dup(const ASN1_OBJECT *o); +ASN1_OBJECT *OBJ_nid2obj(int n); +const char *OBJ_nid2ln(int n); +const char *OBJ_nid2sn(int n); +int OBJ_obj2nid(const ASN1_OBJECT *o); +ASN1_OBJECT *OBJ_txt2obj(const char *s, int no_name); +int OBJ_obj2txt(char *buf, int buf_len, const ASN1_OBJECT *a, int no_name); +int OBJ_txt2nid(const char *s); +int OBJ_ln2nid(const char *s); +int OBJ_sn2nid(const char *s); +int OBJ_cmp(const ASN1_OBJECT *a, const ASN1_OBJECT *b); +const void *OBJ_bsearch_(const void *key, const void *base, int num, int size, + int (*cmp) (const void *, const void *)); +const void *OBJ_bsearch_ex_(const void *key, const void *base, int num, + int size, + int (*cmp) (const void *, const void *), + int flags); + +# define _DECLARE_OBJ_BSEARCH_CMP_FN(scope, type1, type2, nm) \ + static int nm##_cmp_BSEARCH_CMP_FN(const void *, const void *); \ + static int nm##_cmp(type1 const *, type2 const *); \ + scope type2 * OBJ_bsearch_##nm(type1 *key, type2 const *base, int num) + +# define DECLARE_OBJ_BSEARCH_CMP_FN(type1, type2, cmp) \ + _DECLARE_OBJ_BSEARCH_CMP_FN(static, type1, type2, cmp) +# define DECLARE_OBJ_BSEARCH_GLOBAL_CMP_FN(type1, type2, nm) \ + type2 * OBJ_bsearch_##nm(type1 *key, type2 const *base, int num) + +/*- + * Unsolved problem: if a type is actually a pointer type, like + * nid_triple is, then its impossible to get a const where you need + * it. Consider: + * + * typedef int nid_triple[3]; + * const void *a_; + * const nid_triple const *a = a_; + * + * The assignement discards a const because what you really want is: + * + * const int const * const *a = a_; + * + * But if you do that, you lose the fact that a is an array of 3 ints, + * which breaks comparison functions. + * + * Thus we end up having to cast, sadly, or unpack the + * declarations. Or, as I finally did in this case, delcare nid_triple + * to be a struct, which it should have been in the first place. + * + * Ben, August 2008. + * + * Also, strictly speaking not all types need be const, but handling + * the non-constness means a lot of complication, and in practice + * comparison routines do always not touch their arguments. + */ + +# define IMPLEMENT_OBJ_BSEARCH_CMP_FN(type1, type2, nm) \ + static int nm##_cmp_BSEARCH_CMP_FN(const void *a_, const void *b_) \ + { \ + type1 const *a = a_; \ + type2 const *b = b_; \ + return nm##_cmp(a,b); \ + } \ + static type2 *OBJ_bsearch_##nm(type1 *key, type2 const *base, int num) \ + { \ + return (type2 *)OBJ_bsearch_(key, base, num, sizeof(type2), \ + nm##_cmp_BSEARCH_CMP_FN); \ + } \ + extern void dummy_prototype(void) + +# define IMPLEMENT_OBJ_BSEARCH_GLOBAL_CMP_FN(type1, type2, nm) \ + static int nm##_cmp_BSEARCH_CMP_FN(const void *a_, const void *b_) \ + { \ + type1 const *a = a_; \ + type2 const *b = b_; \ + return nm##_cmp(a,b); \ + } \ + type2 *OBJ_bsearch_##nm(type1 *key, type2 const *base, int num) \ + { \ + return (type2 *)OBJ_bsearch_(key, base, num, sizeof(type2), \ + nm##_cmp_BSEARCH_CMP_FN); \ + } \ + extern void dummy_prototype(void) + +# define OBJ_bsearch(type1,key,type2,base,num,cmp) \ + ((type2 *)OBJ_bsearch_(CHECKED_PTR_OF(type1,key),CHECKED_PTR_OF(type2,base), \ + num,sizeof(type2), \ + ((void)CHECKED_PTR_OF(type1,cmp##_type_1), \ + (void)CHECKED_PTR_OF(type2,cmp##_type_2), \ + cmp##_BSEARCH_CMP_FN))) + +# define OBJ_bsearch_ex(type1,key,type2,base,num,cmp,flags) \ + ((type2 *)OBJ_bsearch_ex_(CHECKED_PTR_OF(type1,key),CHECKED_PTR_OF(type2,base), \ + num,sizeof(type2), \ + ((void)CHECKED_PTR_OF(type1,cmp##_type_1), \ + (void)type_2=CHECKED_PTR_OF(type2,cmp##_type_2), \ + cmp##_BSEARCH_CMP_FN)),flags) + +int OBJ_new_nid(int num); +int OBJ_add_object(const ASN1_OBJECT *obj); +int OBJ_create(const char *oid, const char *sn, const char *ln); +void OBJ_cleanup(void); +int OBJ_create_objects(BIO *in); + +int OBJ_find_sigid_algs(int signid, int *pdig_nid, int *ppkey_nid); +int OBJ_find_sigid_by_algs(int *psignid, int dig_nid, int pkey_nid); +int OBJ_add_sigid(int signid, int dig_id, int pkey_id); +void OBJ_sigid_free(void); + +extern int obj_cleanup_defer; +void check_defer(int nid); + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_OBJ_strings(void); + +/* Error codes for the OBJ functions. */ + +/* Function codes. */ +# define OBJ_F_OBJ_ADD_OBJECT 105 +# define OBJ_F_OBJ_CREATE 100 +# define OBJ_F_OBJ_DUP 101 +# define OBJ_F_OBJ_NAME_NEW_INDEX 106 +# define OBJ_F_OBJ_NID2LN 102 +# define OBJ_F_OBJ_NID2OBJ 103 +# define OBJ_F_OBJ_NID2SN 104 + +/* Reason codes. */ +# define OBJ_R_MALLOC_FAILURE 100 +# define OBJ_R_UNKNOWN_NID 101 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/ext/openssl-osx/include/openssl/opensslconf.h b/ext/openssl-osx/include/openssl/opensslconf.h new file mode 100644 index 00000000..96ef885f --- /dev/null +++ b/ext/openssl-osx/include/openssl/opensslconf.h @@ -0,0 +1,261 @@ +/* opensslconf.h */ +/* WARNING: Generated automatically from opensslconf.h.in by Configure. */ + +#ifdef __cplusplus +extern "C" { +#endif +/* OpenSSL was configured with the following options: */ +#ifndef OPENSSL_SYSNAME_MACOSX +# define OPENSSL_SYSNAME_MACOSX +#endif +#ifndef OPENSSL_DOING_MAKEDEPEND + + +#ifndef OPENSSL_NO_EC_NISTP_64_GCC_128 +# define OPENSSL_NO_EC_NISTP_64_GCC_128 +#endif +#ifndef OPENSSL_NO_GMP +# define OPENSSL_NO_GMP +#endif +#ifndef OPENSSL_NO_JPAKE +# define OPENSSL_NO_JPAKE +#endif +#ifndef OPENSSL_NO_KRB5 +# define OPENSSL_NO_KRB5 +#endif +#ifndef OPENSSL_NO_LIBUNBOUND +# define OPENSSL_NO_LIBUNBOUND +#endif +#ifndef OPENSSL_NO_MD2 +# define OPENSSL_NO_MD2 +#endif +#ifndef OPENSSL_NO_RC5 +# define OPENSSL_NO_RC5 +#endif +#ifndef OPENSSL_NO_RFC3779 +# define OPENSSL_NO_RFC3779 +#endif +#ifndef OPENSSL_NO_SCTP +# define OPENSSL_NO_SCTP +#endif +#ifndef OPENSSL_NO_SSL_TRACE +# define OPENSSL_NO_SSL_TRACE +#endif +#ifndef OPENSSL_NO_STORE +# define OPENSSL_NO_STORE +#endif +#ifndef OPENSSL_NO_UNIT_TEST +# define OPENSSL_NO_UNIT_TEST +#endif + +#endif /* OPENSSL_DOING_MAKEDEPEND */ + +#ifndef OPENSSL_THREADS +# define OPENSSL_THREADS +#endif +#ifndef OPENSSL_NO_DYNAMIC_ENGINE +# define OPENSSL_NO_DYNAMIC_ENGINE +#endif + +/* The OPENSSL_NO_* macros are also defined as NO_* if the application + asks for it. This is a transient feature that is provided for those + who haven't had the time to do the appropriate changes in their + applications. */ +#ifdef OPENSSL_ALGORITHM_DEFINES +# if defined(OPENSSL_NO_EC_NISTP_64_GCC_128) && !defined(NO_EC_NISTP_64_GCC_128) +# define NO_EC_NISTP_64_GCC_128 +# endif +# if defined(OPENSSL_NO_GMP) && !defined(NO_GMP) +# define NO_GMP +# endif +# if defined(OPENSSL_NO_JPAKE) && !defined(NO_JPAKE) +# define NO_JPAKE +# endif +# if defined(OPENSSL_NO_KRB5) && !defined(NO_KRB5) +# define NO_KRB5 +# endif +# if defined(OPENSSL_NO_LIBUNBOUND) && !defined(NO_LIBUNBOUND) +# define NO_LIBUNBOUND +# endif +# if defined(OPENSSL_NO_MD2) && !defined(NO_MD2) +# define NO_MD2 +# endif +# if defined(OPENSSL_NO_RC5) && !defined(NO_RC5) +# define NO_RC5 +# endif +# if defined(OPENSSL_NO_RFC3779) && !defined(NO_RFC3779) +# define NO_RFC3779 +# endif +# if defined(OPENSSL_NO_SCTP) && !defined(NO_SCTP) +# define NO_SCTP +# endif +# if defined(OPENSSL_NO_SSL_TRACE) && !defined(NO_SSL_TRACE) +# define NO_SSL_TRACE +# endif +# if defined(OPENSSL_NO_STORE) && !defined(NO_STORE) +# define NO_STORE +# endif +# if defined(OPENSSL_NO_UNIT_TEST) && !defined(NO_UNIT_TEST) +# define NO_UNIT_TEST +# endif +#endif + +#define OPENSSL_CPUID_OBJ + +/* crypto/opensslconf.h.in */ + +/* Generate 80386 code? */ +#undef I386_ONLY + +#if !(defined(VMS) || defined(__VMS)) /* VMS uses logical names instead */ +#if defined(HEADER_CRYPTLIB_H) && !defined(OPENSSLDIR) +#define ENGINESDIR "/usr/local/ssl/lib/engines" +#define OPENSSLDIR "/usr/local/ssl" +#endif +#endif + +#undef OPENSSL_UNISTD +#define OPENSSL_UNISTD + +#undef OPENSSL_EXPORT_VAR_AS_FUNCTION + +#if defined(HEADER_IDEA_H) && !defined(IDEA_INT) +#define IDEA_INT unsigned int +#endif + +#if defined(HEADER_MD2_H) && !defined(MD2_INT) +#define MD2_INT unsigned int +#endif + +#if defined(HEADER_RC2_H) && !defined(RC2_INT) +/* I need to put in a mod for the alpha - eay */ +#define RC2_INT unsigned int +#endif + +#if defined(HEADER_RC4_H) +#if !defined(RC4_INT) +/* using int types make the structure larger but make the code faster + * on most boxes I have tested - up to %20 faster. */ +/* + * I don't know what does "most" mean, but declaring "int" is a must on: + * - Intel P6 because partial register stalls are very expensive; + * - elder Alpha because it lacks byte load/store instructions; + */ +#define RC4_INT unsigned int +#endif +#if !defined(RC4_CHUNK) +/* + * This enables code handling data aligned at natural CPU word + * boundary. See crypto/rc4/rc4_enc.c for further details. + */ +#define RC4_CHUNK unsigned long +#endif +#endif + +#if (defined(HEADER_NEW_DES_H) || defined(HEADER_DES_H)) && !defined(DES_LONG) +/* If this is set to 'unsigned int' on a DEC Alpha, this gives about a + * %20 speed up (longs are 8 bytes, int's are 4). */ +#ifndef DES_LONG +#define DES_LONG unsigned long +#endif +#endif + +#if defined(HEADER_BN_H) && !defined(CONFIG_HEADER_BN_H) +#define CONFIG_HEADER_BN_H +#define BN_LLONG + +/* Should we define BN_DIV2W here? */ + +/* Only one for the following should be defined */ +#undef SIXTY_FOUR_BIT_LONG +#undef SIXTY_FOUR_BIT +#define THIRTY_TWO_BIT +#endif + +#if defined(HEADER_RC4_LOCL_H) && !defined(CONFIG_HEADER_RC4_LOCL_H) +#define CONFIG_HEADER_RC4_LOCL_H +/* if this is defined data[i] is used instead of *data, this is a %20 + * speedup on x86 */ +#undef RC4_INDEX +#endif + +#if defined(HEADER_BF_LOCL_H) && !defined(CONFIG_HEADER_BF_LOCL_H) +#define CONFIG_HEADER_BF_LOCL_H +#define BF_PTR +#endif /* HEADER_BF_LOCL_H */ + +#if defined(HEADER_DES_LOCL_H) && !defined(CONFIG_HEADER_DES_LOCL_H) +#define CONFIG_HEADER_DES_LOCL_H +#ifndef DES_DEFAULT_OPTIONS +/* the following is tweaked from a config script, that is why it is a + * protected undef/define */ +#ifndef DES_PTR +#undef DES_PTR +#endif + +/* This helps C compiler generate the correct code for multiple functional + * units. It reduces register dependancies at the expense of 2 more + * registers */ +#ifndef DES_RISC1 +#undef DES_RISC1 +#endif + +#ifndef DES_RISC2 +#undef DES_RISC2 +#endif + +#if defined(DES_RISC1) && defined(DES_RISC2) +YOU SHOULD NOT HAVE BOTH DES_RISC1 AND DES_RISC2 DEFINED!!!!! +#endif + +/* Unroll the inner loop, this sometimes helps, sometimes hinders. + * Very mucy CPU dependant */ +#ifndef DES_UNROLL +#define DES_UNROLL +#endif + +/* These default values were supplied by + * Peter Gutman + * They are only used if nothing else has been defined */ +#if !defined(DES_PTR) && !defined(DES_RISC1) && !defined(DES_RISC2) && !defined(DES_UNROLL) +/* Special defines which change the way the code is built depending on the + CPU and OS. For SGI machines you can use _MIPS_SZLONG (32 or 64) to find + even newer MIPS CPU's, but at the moment one size fits all for + optimization options. Older Sparc's work better with only UNROLL, but + there's no way to tell at compile time what it is you're running on */ + +#if defined( sun ) /* Newer Sparc's */ +# define DES_PTR +# define DES_RISC1 +# define DES_UNROLL +#elif defined( __ultrix ) /* Older MIPS */ +# define DES_PTR +# define DES_RISC2 +# define DES_UNROLL +#elif defined( __osf1__ ) /* Alpha */ +# define DES_PTR +# define DES_RISC2 +#elif defined ( _AIX ) /* RS6000 */ + /* Unknown */ +#elif defined( __hpux ) /* HP-PA */ + /* Unknown */ +#elif defined( __aux ) /* 68K */ + /* Unknown */ +#elif defined( __dgux ) /* 88K (but P6 in latest boxes) */ +# define DES_UNROLL +#elif defined( __sgi ) /* Newer MIPS */ +# define DES_PTR +# define DES_RISC2 +# define DES_UNROLL +#elif defined(i386) || defined(__i386__) /* x86 boxes, should be gcc */ +# define DES_PTR +# define DES_RISC1 +# define DES_UNROLL +#endif /* Systems-specific speed defines */ +#endif + +#endif /* DES_DEFAULT_OPTIONS */ +#endif /* HEADER_DES_LOCL_H */ +#ifdef __cplusplus +} +#endif diff --git a/ext/openssl-osx/include/openssl/opensslv.h b/ext/openssl-osx/include/openssl/opensslv.h new file mode 100644 index 00000000..e277caee --- /dev/null +++ b/ext/openssl-osx/include/openssl/opensslv.h @@ -0,0 +1,97 @@ +#ifndef HEADER_OPENSSLV_H +# define HEADER_OPENSSLV_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*- + * Numeric release version identifier: + * MNNFFPPS: major minor fix patch status + * The status nibble has one of the values 0 for development, 1 to e for betas + * 1 to 14, and f for release. The patch level is exactly that. + * For example: + * 0.9.3-dev 0x00903000 + * 0.9.3-beta1 0x00903001 + * 0.9.3-beta2-dev 0x00903002 + * 0.9.3-beta2 0x00903002 (same as ...beta2-dev) + * 0.9.3 0x0090300f + * 0.9.3a 0x0090301f + * 0.9.4 0x0090400f + * 1.2.3z 0x102031af + * + * For continuity reasons (because 0.9.5 is already out, and is coded + * 0x00905100), between 0.9.5 and 0.9.6 the coding of the patch level + * part is slightly different, by setting the highest bit. This means + * that 0.9.5a looks like this: 0x0090581f. At 0.9.6, we can start + * with 0x0090600S... + * + * (Prior to 0.9.3-dev a different scheme was used: 0.9.2b is 0x0922.) + * (Prior to 0.9.5a beta1, a different scheme was used: MMNNFFRBB for + * major minor fix final patch/beta) + */ +# define OPENSSL_VERSION_NUMBER 0x1000200fL +# ifdef OPENSSL_FIPS +# define OPENSSL_VERSION_TEXT "OpenSSL 1.0.2-fips 22 Jan 2015" +# else +# define OPENSSL_VERSION_TEXT "OpenSSL 1.0.2 22 Jan 2015" +# endif +# define OPENSSL_VERSION_PTEXT " part of " OPENSSL_VERSION_TEXT + +/*- + * The macros below are to be used for shared library (.so, .dll, ...) + * versioning. That kind of versioning works a bit differently between + * operating systems. The most usual scheme is to set a major and a minor + * number, and have the runtime loader check that the major number is equal + * to what it was at application link time, while the minor number has to + * be greater or equal to what it was at application link time. With this + * scheme, the version number is usually part of the file name, like this: + * + * libcrypto.so.0.9 + * + * Some unixen also make a softlink with the major verson number only: + * + * libcrypto.so.0 + * + * On Tru64 and IRIX 6.x it works a little bit differently. There, the + * shared library version is stored in the file, and is actually a series + * of versions, separated by colons. The rightmost version present in the + * library when linking an application is stored in the application to be + * matched at run time. When the application is run, a check is done to + * see if the library version stored in the application matches any of the + * versions in the version string of the library itself. + * This version string can be constructed in any way, depending on what + * kind of matching is desired. However, to implement the same scheme as + * the one used in the other unixen, all compatible versions, from lowest + * to highest, should be part of the string. Consecutive builds would + * give the following versions strings: + * + * 3.0 + * 3.0:3.1 + * 3.0:3.1:3.2 + * 4.0 + * 4.0:4.1 + * + * Notice how version 4 is completely incompatible with version, and + * therefore give the breach you can see. + * + * There may be other schemes as well that I haven't yet discovered. + * + * So, here's the way it works here: first of all, the library version + * number doesn't need at all to match the overall OpenSSL version. + * However, it's nice and more understandable if it actually does. + * The current library version is stored in the macro SHLIB_VERSION_NUMBER, + * which is just a piece of text in the format "M.m.e" (Major, minor, edit). + * For the sake of Tru64, IRIX, and any other OS that behaves in similar ways, + * we need to keep a history of version numbers, which is done in the + * macro SHLIB_VERSION_HISTORY. The numbers are separated by colons and + * should only keep the versions that are binary compatible with the current. + */ +# define SHLIB_VERSION_HISTORY "" +# define SHLIB_VERSION_NUMBER "1.0.0" + + +#ifdef __cplusplus +} +#endif +#endif /* HEADER_OPENSSLV_H */ diff --git a/ext/openssl-osx/include/openssl/ossl_typ.h b/ext/openssl-osx/include/openssl/ossl_typ.h new file mode 100644 index 00000000..9144ea2c --- /dev/null +++ b/ext/openssl-osx/include/openssl/ossl_typ.h @@ -0,0 +1,211 @@ +/* ==================================================================== + * Copyright (c) 1998-2001 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_OPENSSL_TYPES_H +# define HEADER_OPENSSL_TYPES_H + +#ifdef __cplusplus +extern "C" { +#endif + +# include + +# ifdef NO_ASN1_TYPEDEFS +# define ASN1_INTEGER ASN1_STRING +# define ASN1_ENUMERATED ASN1_STRING +# define ASN1_BIT_STRING ASN1_STRING +# define ASN1_OCTET_STRING ASN1_STRING +# define ASN1_PRINTABLESTRING ASN1_STRING +# define ASN1_T61STRING ASN1_STRING +# define ASN1_IA5STRING ASN1_STRING +# define ASN1_UTCTIME ASN1_STRING +# define ASN1_GENERALIZEDTIME ASN1_STRING +# define ASN1_TIME ASN1_STRING +# define ASN1_GENERALSTRING ASN1_STRING +# define ASN1_UNIVERSALSTRING ASN1_STRING +# define ASN1_BMPSTRING ASN1_STRING +# define ASN1_VISIBLESTRING ASN1_STRING +# define ASN1_UTF8STRING ASN1_STRING +# define ASN1_BOOLEAN int +# define ASN1_NULL int +# else +typedef struct asn1_string_st ASN1_INTEGER; +typedef struct asn1_string_st ASN1_ENUMERATED; +typedef struct asn1_string_st ASN1_BIT_STRING; +typedef struct asn1_string_st ASN1_OCTET_STRING; +typedef struct asn1_string_st ASN1_PRINTABLESTRING; +typedef struct asn1_string_st ASN1_T61STRING; +typedef struct asn1_string_st ASN1_IA5STRING; +typedef struct asn1_string_st ASN1_GENERALSTRING; +typedef struct asn1_string_st ASN1_UNIVERSALSTRING; +typedef struct asn1_string_st ASN1_BMPSTRING; +typedef struct asn1_string_st ASN1_UTCTIME; +typedef struct asn1_string_st ASN1_TIME; +typedef struct asn1_string_st ASN1_GENERALIZEDTIME; +typedef struct asn1_string_st ASN1_VISIBLESTRING; +typedef struct asn1_string_st ASN1_UTF8STRING; +typedef struct asn1_string_st ASN1_STRING; +typedef int ASN1_BOOLEAN; +typedef int ASN1_NULL; +# endif + +typedef struct asn1_object_st ASN1_OBJECT; + +typedef struct ASN1_ITEM_st ASN1_ITEM; +typedef struct asn1_pctx_st ASN1_PCTX; + +# ifdef OPENSSL_SYS_WIN32 +# undef X509_NAME +# undef X509_EXTENSIONS +# undef X509_CERT_PAIR +# undef PKCS7_ISSUER_AND_SERIAL +# undef OCSP_REQUEST +# undef OCSP_RESPONSE +# endif + +# ifdef BIGNUM +# undef BIGNUM +# endif +typedef struct bignum_st BIGNUM; +typedef struct bignum_ctx BN_CTX; +typedef struct bn_blinding_st BN_BLINDING; +typedef struct bn_mont_ctx_st BN_MONT_CTX; +typedef struct bn_recp_ctx_st BN_RECP_CTX; +typedef struct bn_gencb_st BN_GENCB; + +typedef struct buf_mem_st BUF_MEM; + +typedef struct evp_cipher_st EVP_CIPHER; +typedef struct evp_cipher_ctx_st EVP_CIPHER_CTX; +typedef struct env_md_st EVP_MD; +typedef struct env_md_ctx_st EVP_MD_CTX; +typedef struct evp_pkey_st EVP_PKEY; + +typedef struct evp_pkey_asn1_method_st EVP_PKEY_ASN1_METHOD; + +typedef struct evp_pkey_method_st EVP_PKEY_METHOD; +typedef struct evp_pkey_ctx_st EVP_PKEY_CTX; + +typedef struct dh_st DH; +typedef struct dh_method DH_METHOD; + +typedef struct dsa_st DSA; +typedef struct dsa_method DSA_METHOD; + +typedef struct rsa_st RSA; +typedef struct rsa_meth_st RSA_METHOD; + +typedef struct rand_meth_st RAND_METHOD; + +typedef struct ecdh_method ECDH_METHOD; +typedef struct ecdsa_method ECDSA_METHOD; + +typedef struct x509_st X509; +typedef struct X509_algor_st X509_ALGOR; +typedef struct X509_crl_st X509_CRL; +typedef struct x509_crl_method_st X509_CRL_METHOD; +typedef struct x509_revoked_st X509_REVOKED; +typedef struct X509_name_st X509_NAME; +typedef struct X509_pubkey_st X509_PUBKEY; +typedef struct x509_store_st X509_STORE; +typedef struct x509_store_ctx_st X509_STORE_CTX; + +typedef struct pkcs8_priv_key_info_st PKCS8_PRIV_KEY_INFO; + +typedef struct v3_ext_ctx X509V3_CTX; +typedef struct conf_st CONF; + +typedef struct store_st STORE; +typedef struct store_method_st STORE_METHOD; + +typedef struct ui_st UI; +typedef struct ui_method_st UI_METHOD; + +typedef struct st_ERR_FNS ERR_FNS; + +typedef struct engine_st ENGINE; +typedef struct ssl_st SSL; +typedef struct ssl_ctx_st SSL_CTX; + +typedef struct X509_POLICY_NODE_st X509_POLICY_NODE; +typedef struct X509_POLICY_LEVEL_st X509_POLICY_LEVEL; +typedef struct X509_POLICY_TREE_st X509_POLICY_TREE; +typedef struct X509_POLICY_CACHE_st X509_POLICY_CACHE; + +typedef struct AUTHORITY_KEYID_st AUTHORITY_KEYID; +typedef struct DIST_POINT_st DIST_POINT; +typedef struct ISSUING_DIST_POINT_st ISSUING_DIST_POINT; +typedef struct NAME_CONSTRAINTS_st NAME_CONSTRAINTS; + + /* If placed in pkcs12.h, we end up with a circular depency with pkcs7.h */ +# define DECLARE_PKCS12_STACK_OF(type)/* Nothing */ +# define IMPLEMENT_PKCS12_STACK_OF(type)/* Nothing */ + +typedef struct crypto_ex_data_st CRYPTO_EX_DATA; +/* Callback types for crypto.h */ +typedef int CRYPTO_EX_new (void *parent, void *ptr, CRYPTO_EX_DATA *ad, + int idx, long argl, void *argp); +typedef void CRYPTO_EX_free (void *parent, void *ptr, CRYPTO_EX_DATA *ad, + int idx, long argl, void *argp); +typedef int CRYPTO_EX_dup (CRYPTO_EX_DATA *to, CRYPTO_EX_DATA *from, + void *from_d, int idx, long argl, void *argp); + +typedef struct ocsp_req_ctx_st OCSP_REQ_CTX; +typedef struct ocsp_response_st OCSP_RESPONSE; +typedef struct ocsp_responder_id_st OCSP_RESPID; + +#ifdef __cplusplus +} +#endif +#endif /* def HEADER_OPENSSL_TYPES_H */ diff --git a/ext/openssl-osx/include/openssl/pem.h b/ext/openssl-osx/include/openssl/pem.h new file mode 100644 index 00000000..d3b23fc9 --- /dev/null +++ b/ext/openssl-osx/include/openssl/pem.h @@ -0,0 +1,615 @@ +/* crypto/pem/pem.h */ +/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_PEM_H +# define HEADER_PEM_H + +# include +# ifndef OPENSSL_NO_BIO +# include +# endif +# ifndef OPENSSL_NO_STACK +# include +# endif +# include +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# define PEM_BUFSIZE 1024 + +# define PEM_OBJ_UNDEF 0 +# define PEM_OBJ_X509 1 +# define PEM_OBJ_X509_REQ 2 +# define PEM_OBJ_CRL 3 +# define PEM_OBJ_SSL_SESSION 4 +# define PEM_OBJ_PRIV_KEY 10 +# define PEM_OBJ_PRIV_RSA 11 +# define PEM_OBJ_PRIV_DSA 12 +# define PEM_OBJ_PRIV_DH 13 +# define PEM_OBJ_PUB_RSA 14 +# define PEM_OBJ_PUB_DSA 15 +# define PEM_OBJ_PUB_DH 16 +# define PEM_OBJ_DHPARAMS 17 +# define PEM_OBJ_DSAPARAMS 18 +# define PEM_OBJ_PRIV_RSA_PUBLIC 19 +# define PEM_OBJ_PRIV_ECDSA 20 +# define PEM_OBJ_PUB_ECDSA 21 +# define PEM_OBJ_ECPARAMETERS 22 + +# define PEM_ERROR 30 +# define PEM_DEK_DES_CBC 40 +# define PEM_DEK_IDEA_CBC 45 +# define PEM_DEK_DES_EDE 50 +# define PEM_DEK_DES_ECB 60 +# define PEM_DEK_RSA 70 +# define PEM_DEK_RSA_MD2 80 +# define PEM_DEK_RSA_MD5 90 + +# define PEM_MD_MD2 NID_md2 +# define PEM_MD_MD5 NID_md5 +# define PEM_MD_SHA NID_sha +# define PEM_MD_MD2_RSA NID_md2WithRSAEncryption +# define PEM_MD_MD5_RSA NID_md5WithRSAEncryption +# define PEM_MD_SHA_RSA NID_sha1WithRSAEncryption + +# define PEM_STRING_X509_OLD "X509 CERTIFICATE" +# define PEM_STRING_X509 "CERTIFICATE" +# define PEM_STRING_X509_PAIR "CERTIFICATE PAIR" +# define PEM_STRING_X509_TRUSTED "TRUSTED CERTIFICATE" +# define PEM_STRING_X509_REQ_OLD "NEW CERTIFICATE REQUEST" +# define PEM_STRING_X509_REQ "CERTIFICATE REQUEST" +# define PEM_STRING_X509_CRL "X509 CRL" +# define PEM_STRING_EVP_PKEY "ANY PRIVATE KEY" +# define PEM_STRING_PUBLIC "PUBLIC KEY" +# define PEM_STRING_RSA "RSA PRIVATE KEY" +# define PEM_STRING_RSA_PUBLIC "RSA PUBLIC KEY" +# define PEM_STRING_DSA "DSA PRIVATE KEY" +# define PEM_STRING_DSA_PUBLIC "DSA PUBLIC KEY" +# define PEM_STRING_PKCS7 "PKCS7" +# define PEM_STRING_PKCS7_SIGNED "PKCS #7 SIGNED DATA" +# define PEM_STRING_PKCS8 "ENCRYPTED PRIVATE KEY" +# define PEM_STRING_PKCS8INF "PRIVATE KEY" +# define PEM_STRING_DHPARAMS "DH PARAMETERS" +# define PEM_STRING_DHXPARAMS "X9.42 DH PARAMETERS" +# define PEM_STRING_SSL_SESSION "SSL SESSION PARAMETERS" +# define PEM_STRING_DSAPARAMS "DSA PARAMETERS" +# define PEM_STRING_ECDSA_PUBLIC "ECDSA PUBLIC KEY" +# define PEM_STRING_ECPARAMETERS "EC PARAMETERS" +# define PEM_STRING_ECPRIVATEKEY "EC PRIVATE KEY" +# define PEM_STRING_PARAMETERS "PARAMETERS" +# define PEM_STRING_CMS "CMS" + + /* + * Note that this structure is initialised by PEM_SealInit and cleaned up + * by PEM_SealFinal (at least for now) + */ +typedef struct PEM_Encode_Seal_st { + EVP_ENCODE_CTX encode; + EVP_MD_CTX md; + EVP_CIPHER_CTX cipher; +} PEM_ENCODE_SEAL_CTX; + +/* enc_type is one off */ +# define PEM_TYPE_ENCRYPTED 10 +# define PEM_TYPE_MIC_ONLY 20 +# define PEM_TYPE_MIC_CLEAR 30 +# define PEM_TYPE_CLEAR 40 + +typedef struct pem_recip_st { + char *name; + X509_NAME *dn; + int cipher; + int key_enc; + /* char iv[8]; unused and wrong size */ +} PEM_USER; + +typedef struct pem_ctx_st { + int type; /* what type of object */ + struct { + int version; + int mode; + } proc_type; + + char *domain; + + struct { + int cipher; + /*- + unused, and wrong size + unsigned char iv[8]; */ + } DEK_info; + + PEM_USER *originator; + + int num_recipient; + PEM_USER **recipient; +/*- + XXX(ben): don#t think this is used! + STACK *x509_chain; / * certificate chain */ + EVP_MD *md; /* signature type */ + + int md_enc; /* is the md encrypted or not? */ + int md_len; /* length of md_data */ + char *md_data; /* message digest, could be pkey encrypted */ + + EVP_CIPHER *dec; /* date encryption cipher */ + int key_len; /* key length */ + unsigned char *key; /* key */ + /*- + unused, and wrong size + unsigned char iv[8]; */ + + int data_enc; /* is the data encrypted */ + int data_len; + unsigned char *data; +} PEM_CTX; + +/* + * These macros make the PEM_read/PEM_write functions easier to maintain and + * write. Now they are all implemented with either: IMPLEMENT_PEM_rw(...) or + * IMPLEMENT_PEM_rw_cb(...) + */ + +# ifdef OPENSSL_NO_FP_API + +# define IMPLEMENT_PEM_read_fp(name, type, str, asn1) /**/ +# define IMPLEMENT_PEM_write_fp(name, type, str, asn1) /**/ +# define IMPLEMENT_PEM_write_fp_const(name, type, str, asn1) /**/ +# define IMPLEMENT_PEM_write_cb_fp(name, type, str, asn1) /**/ +# define IMPLEMENT_PEM_write_cb_fp_const(name, type, str, asn1) /**/ +# else + +# define IMPLEMENT_PEM_read_fp(name, type, str, asn1) \ +type *PEM_read_##name(FILE *fp, type **x, pem_password_cb *cb, void *u)\ +{ \ +return PEM_ASN1_read((d2i_of_void *)d2i_##asn1, str,fp,(void **)x,cb,u); \ +} + +# define IMPLEMENT_PEM_write_fp(name, type, str, asn1) \ +int PEM_write_##name(FILE *fp, type *x) \ +{ \ +return PEM_ASN1_write((i2d_of_void *)i2d_##asn1,str,fp,x,NULL,NULL,0,NULL,NULL); \ +} + +# define IMPLEMENT_PEM_write_fp_const(name, type, str, asn1) \ +int PEM_write_##name(FILE *fp, const type *x) \ +{ \ +return PEM_ASN1_write((i2d_of_void *)i2d_##asn1,str,fp,(void *)x,NULL,NULL,0,NULL,NULL); \ +} + +# define IMPLEMENT_PEM_write_cb_fp(name, type, str, asn1) \ +int PEM_write_##name(FILE *fp, type *x, const EVP_CIPHER *enc, \ + unsigned char *kstr, int klen, pem_password_cb *cb, \ + void *u) \ + { \ + return PEM_ASN1_write((i2d_of_void *)i2d_##asn1,str,fp,x,enc,kstr,klen,cb,u); \ + } + +# define IMPLEMENT_PEM_write_cb_fp_const(name, type, str, asn1) \ +int PEM_write_##name(FILE *fp, type *x, const EVP_CIPHER *enc, \ + unsigned char *kstr, int klen, pem_password_cb *cb, \ + void *u) \ + { \ + return PEM_ASN1_write((i2d_of_void *)i2d_##asn1,str,fp,x,enc,kstr,klen,cb,u); \ + } + +# endif + +# define IMPLEMENT_PEM_read_bio(name, type, str, asn1) \ +type *PEM_read_bio_##name(BIO *bp, type **x, pem_password_cb *cb, void *u)\ +{ \ +return PEM_ASN1_read_bio((d2i_of_void *)d2i_##asn1, str,bp,(void **)x,cb,u); \ +} + +# define IMPLEMENT_PEM_write_bio(name, type, str, asn1) \ +int PEM_write_bio_##name(BIO *bp, type *x) \ +{ \ +return PEM_ASN1_write_bio((i2d_of_void *)i2d_##asn1,str,bp,x,NULL,NULL,0,NULL,NULL); \ +} + +# define IMPLEMENT_PEM_write_bio_const(name, type, str, asn1) \ +int PEM_write_bio_##name(BIO *bp, const type *x) \ +{ \ +return PEM_ASN1_write_bio((i2d_of_void *)i2d_##asn1,str,bp,(void *)x,NULL,NULL,0,NULL,NULL); \ +} + +# define IMPLEMENT_PEM_write_cb_bio(name, type, str, asn1) \ +int PEM_write_bio_##name(BIO *bp, type *x, const EVP_CIPHER *enc, \ + unsigned char *kstr, int klen, pem_password_cb *cb, void *u) \ + { \ + return PEM_ASN1_write_bio((i2d_of_void *)i2d_##asn1,str,bp,x,enc,kstr,klen,cb,u); \ + } + +# define IMPLEMENT_PEM_write_cb_bio_const(name, type, str, asn1) \ +int PEM_write_bio_##name(BIO *bp, type *x, const EVP_CIPHER *enc, \ + unsigned char *kstr, int klen, pem_password_cb *cb, void *u) \ + { \ + return PEM_ASN1_write_bio((i2d_of_void *)i2d_##asn1,str,bp,(void *)x,enc,kstr,klen,cb,u); \ + } + +# define IMPLEMENT_PEM_write(name, type, str, asn1) \ + IMPLEMENT_PEM_write_bio(name, type, str, asn1) \ + IMPLEMENT_PEM_write_fp(name, type, str, asn1) + +# define IMPLEMENT_PEM_write_const(name, type, str, asn1) \ + IMPLEMENT_PEM_write_bio_const(name, type, str, asn1) \ + IMPLEMENT_PEM_write_fp_const(name, type, str, asn1) + +# define IMPLEMENT_PEM_write_cb(name, type, str, asn1) \ + IMPLEMENT_PEM_write_cb_bio(name, type, str, asn1) \ + IMPLEMENT_PEM_write_cb_fp(name, type, str, asn1) + +# define IMPLEMENT_PEM_write_cb_const(name, type, str, asn1) \ + IMPLEMENT_PEM_write_cb_bio_const(name, type, str, asn1) \ + IMPLEMENT_PEM_write_cb_fp_const(name, type, str, asn1) + +# define IMPLEMENT_PEM_read(name, type, str, asn1) \ + IMPLEMENT_PEM_read_bio(name, type, str, asn1) \ + IMPLEMENT_PEM_read_fp(name, type, str, asn1) + +# define IMPLEMENT_PEM_rw(name, type, str, asn1) \ + IMPLEMENT_PEM_read(name, type, str, asn1) \ + IMPLEMENT_PEM_write(name, type, str, asn1) + +# define IMPLEMENT_PEM_rw_const(name, type, str, asn1) \ + IMPLEMENT_PEM_read(name, type, str, asn1) \ + IMPLEMENT_PEM_write_const(name, type, str, asn1) + +# define IMPLEMENT_PEM_rw_cb(name, type, str, asn1) \ + IMPLEMENT_PEM_read(name, type, str, asn1) \ + IMPLEMENT_PEM_write_cb(name, type, str, asn1) + +/* These are the same except they are for the declarations */ + +# if defined(OPENSSL_NO_FP_API) + +# define DECLARE_PEM_read_fp(name, type) /**/ +# define DECLARE_PEM_write_fp(name, type) /**/ +# define DECLARE_PEM_write_cb_fp(name, type) /**/ +# else + +# define DECLARE_PEM_read_fp(name, type) \ + type *PEM_read_##name(FILE *fp, type **x, pem_password_cb *cb, void *u); + +# define DECLARE_PEM_write_fp(name, type) \ + int PEM_write_##name(FILE *fp, type *x); + +# define DECLARE_PEM_write_fp_const(name, type) \ + int PEM_write_##name(FILE *fp, const type *x); + +# define DECLARE_PEM_write_cb_fp(name, type) \ + int PEM_write_##name(FILE *fp, type *x, const EVP_CIPHER *enc, \ + unsigned char *kstr, int klen, pem_password_cb *cb, void *u); + +# endif + +# ifndef OPENSSL_NO_BIO +# define DECLARE_PEM_read_bio(name, type) \ + type *PEM_read_bio_##name(BIO *bp, type **x, pem_password_cb *cb, void *u); + +# define DECLARE_PEM_write_bio(name, type) \ + int PEM_write_bio_##name(BIO *bp, type *x); + +# define DECLARE_PEM_write_bio_const(name, type) \ + int PEM_write_bio_##name(BIO *bp, const type *x); + +# define DECLARE_PEM_write_cb_bio(name, type) \ + int PEM_write_bio_##name(BIO *bp, type *x, const EVP_CIPHER *enc, \ + unsigned char *kstr, int klen, pem_password_cb *cb, void *u); + +# else + +# define DECLARE_PEM_read_bio(name, type) /**/ +# define DECLARE_PEM_write_bio(name, type) /**/ +# define DECLARE_PEM_write_bio_const(name, type) /**/ +# define DECLARE_PEM_write_cb_bio(name, type) /**/ +# endif +# define DECLARE_PEM_write(name, type) \ + DECLARE_PEM_write_bio(name, type) \ + DECLARE_PEM_write_fp(name, type) +# define DECLARE_PEM_write_const(name, type) \ + DECLARE_PEM_write_bio_const(name, type) \ + DECLARE_PEM_write_fp_const(name, type) +# define DECLARE_PEM_write_cb(name, type) \ + DECLARE_PEM_write_cb_bio(name, type) \ + DECLARE_PEM_write_cb_fp(name, type) +# define DECLARE_PEM_read(name, type) \ + DECLARE_PEM_read_bio(name, type) \ + DECLARE_PEM_read_fp(name, type) +# define DECLARE_PEM_rw(name, type) \ + DECLARE_PEM_read(name, type) \ + DECLARE_PEM_write(name, type) +# define DECLARE_PEM_rw_const(name, type) \ + DECLARE_PEM_read(name, type) \ + DECLARE_PEM_write_const(name, type) +# define DECLARE_PEM_rw_cb(name, type) \ + DECLARE_PEM_read(name, type) \ + DECLARE_PEM_write_cb(name, type) +# if 1 +/* "userdata": new with OpenSSL 0.9.4 */ +typedef int pem_password_cb (char *buf, int size, int rwflag, void *userdata); +# else +/* OpenSSL 0.9.3, 0.9.3a */ +typedef int pem_password_cb (char *buf, int size, int rwflag); +# endif + +int PEM_get_EVP_CIPHER_INFO(char *header, EVP_CIPHER_INFO *cipher); +int PEM_do_header(EVP_CIPHER_INFO *cipher, unsigned char *data, long *len, + pem_password_cb *callback, void *u); + +# ifndef OPENSSL_NO_BIO +int PEM_read_bio(BIO *bp, char **name, char **header, + unsigned char **data, long *len); +int PEM_write_bio(BIO *bp, const char *name, const char *hdr, + const unsigned char *data, long len); +int PEM_bytes_read_bio(unsigned char **pdata, long *plen, char **pnm, + const char *name, BIO *bp, pem_password_cb *cb, + void *u); +void *PEM_ASN1_read_bio(d2i_of_void *d2i, const char *name, BIO *bp, void **x, + pem_password_cb *cb, void *u); +int PEM_ASN1_write_bio(i2d_of_void *i2d, const char *name, BIO *bp, void *x, + const EVP_CIPHER *enc, unsigned char *kstr, int klen, + pem_password_cb *cb, void *u); + +STACK_OF(X509_INFO) *PEM_X509_INFO_read_bio(BIO *bp, STACK_OF(X509_INFO) *sk, + pem_password_cb *cb, void *u); +int PEM_X509_INFO_write_bio(BIO *bp, X509_INFO *xi, EVP_CIPHER *enc, + unsigned char *kstr, int klen, + pem_password_cb *cd, void *u); +# endif + +int PEM_read(FILE *fp, char **name, char **header, + unsigned char **data, long *len); +int PEM_write(FILE *fp, const char *name, const char *hdr, + const unsigned char *data, long len); +void *PEM_ASN1_read(d2i_of_void *d2i, const char *name, FILE *fp, void **x, + pem_password_cb *cb, void *u); +int PEM_ASN1_write(i2d_of_void *i2d, const char *name, FILE *fp, + void *x, const EVP_CIPHER *enc, unsigned char *kstr, + int klen, pem_password_cb *callback, void *u); +STACK_OF(X509_INFO) *PEM_X509_INFO_read(FILE *fp, STACK_OF(X509_INFO) *sk, + pem_password_cb *cb, void *u); + +int PEM_SealInit(PEM_ENCODE_SEAL_CTX *ctx, EVP_CIPHER *type, + EVP_MD *md_type, unsigned char **ek, int *ekl, + unsigned char *iv, EVP_PKEY **pubk, int npubk); +void PEM_SealUpdate(PEM_ENCODE_SEAL_CTX *ctx, unsigned char *out, int *outl, + unsigned char *in, int inl); +int PEM_SealFinal(PEM_ENCODE_SEAL_CTX *ctx, unsigned char *sig, int *sigl, + unsigned char *out, int *outl, EVP_PKEY *priv); + +void PEM_SignInit(EVP_MD_CTX *ctx, EVP_MD *type); +void PEM_SignUpdate(EVP_MD_CTX *ctx, unsigned char *d, unsigned int cnt); +int PEM_SignFinal(EVP_MD_CTX *ctx, unsigned char *sigret, + unsigned int *siglen, EVP_PKEY *pkey); + +int PEM_def_callback(char *buf, int num, int w, void *key); +void PEM_proc_type(char *buf, int type); +void PEM_dek_info(char *buf, const char *type, int len, char *str); + +# include + +DECLARE_PEM_rw(X509, X509) +DECLARE_PEM_rw(X509_AUX, X509) +DECLARE_PEM_rw(X509_CERT_PAIR, X509_CERT_PAIR) +DECLARE_PEM_rw(X509_REQ, X509_REQ) +DECLARE_PEM_write(X509_REQ_NEW, X509_REQ) +DECLARE_PEM_rw(X509_CRL, X509_CRL) +DECLARE_PEM_rw(PKCS7, PKCS7) +DECLARE_PEM_rw(NETSCAPE_CERT_SEQUENCE, NETSCAPE_CERT_SEQUENCE) +DECLARE_PEM_rw(PKCS8, X509_SIG) +DECLARE_PEM_rw(PKCS8_PRIV_KEY_INFO, PKCS8_PRIV_KEY_INFO) +# ifndef OPENSSL_NO_RSA +DECLARE_PEM_rw_cb(RSAPrivateKey, RSA) +DECLARE_PEM_rw_const(RSAPublicKey, RSA) +DECLARE_PEM_rw(RSA_PUBKEY, RSA) +# endif +# ifndef OPENSSL_NO_DSA +DECLARE_PEM_rw_cb(DSAPrivateKey, DSA) +DECLARE_PEM_rw(DSA_PUBKEY, DSA) +DECLARE_PEM_rw_const(DSAparams, DSA) +# endif +# ifndef OPENSSL_NO_EC +DECLARE_PEM_rw_const(ECPKParameters, EC_GROUP) +DECLARE_PEM_rw_cb(ECPrivateKey, EC_KEY) +DECLARE_PEM_rw(EC_PUBKEY, EC_KEY) +# endif +# ifndef OPENSSL_NO_DH +DECLARE_PEM_rw_const(DHparams, DH) +DECLARE_PEM_write_const(DHxparams, DH) +# endif +DECLARE_PEM_rw_cb(PrivateKey, EVP_PKEY) +DECLARE_PEM_rw(PUBKEY, EVP_PKEY) + +int PEM_write_bio_PKCS8PrivateKey_nid(BIO *bp, EVP_PKEY *x, int nid, + char *kstr, int klen, + pem_password_cb *cb, void *u); +int PEM_write_bio_PKCS8PrivateKey(BIO *, EVP_PKEY *, const EVP_CIPHER *, + char *, int, pem_password_cb *, void *); +int i2d_PKCS8PrivateKey_bio(BIO *bp, EVP_PKEY *x, const EVP_CIPHER *enc, + char *kstr, int klen, + pem_password_cb *cb, void *u); +int i2d_PKCS8PrivateKey_nid_bio(BIO *bp, EVP_PKEY *x, int nid, + char *kstr, int klen, + pem_password_cb *cb, void *u); +EVP_PKEY *d2i_PKCS8PrivateKey_bio(BIO *bp, EVP_PKEY **x, pem_password_cb *cb, + void *u); + +int i2d_PKCS8PrivateKey_fp(FILE *fp, EVP_PKEY *x, const EVP_CIPHER *enc, + char *kstr, int klen, + pem_password_cb *cb, void *u); +int i2d_PKCS8PrivateKey_nid_fp(FILE *fp, EVP_PKEY *x, int nid, + char *kstr, int klen, + pem_password_cb *cb, void *u); +int PEM_write_PKCS8PrivateKey_nid(FILE *fp, EVP_PKEY *x, int nid, + char *kstr, int klen, + pem_password_cb *cb, void *u); + +EVP_PKEY *d2i_PKCS8PrivateKey_fp(FILE *fp, EVP_PKEY **x, pem_password_cb *cb, + void *u); + +int PEM_write_PKCS8PrivateKey(FILE *fp, EVP_PKEY *x, const EVP_CIPHER *enc, + char *kstr, int klen, pem_password_cb *cd, + void *u); + +EVP_PKEY *PEM_read_bio_Parameters(BIO *bp, EVP_PKEY **x); +int PEM_write_bio_Parameters(BIO *bp, EVP_PKEY *x); + +EVP_PKEY *b2i_PrivateKey(const unsigned char **in, long length); +EVP_PKEY *b2i_PublicKey(const unsigned char **in, long length); +EVP_PKEY *b2i_PrivateKey_bio(BIO *in); +EVP_PKEY *b2i_PublicKey_bio(BIO *in); +int i2b_PrivateKey_bio(BIO *out, EVP_PKEY *pk); +int i2b_PublicKey_bio(BIO *out, EVP_PKEY *pk); +# ifndef OPENSSL_NO_RC4 +EVP_PKEY *b2i_PVK_bio(BIO *in, pem_password_cb *cb, void *u); +int i2b_PVK_bio(BIO *out, EVP_PKEY *pk, int enclevel, + pem_password_cb *cb, void *u); +# endif + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_PEM_strings(void); + +/* Error codes for the PEM functions. */ + +/* Function codes. */ +# define PEM_F_B2I_DSS 127 +# define PEM_F_B2I_PVK_BIO 128 +# define PEM_F_B2I_RSA 129 +# define PEM_F_CHECK_BITLEN_DSA 130 +# define PEM_F_CHECK_BITLEN_RSA 131 +# define PEM_F_D2I_PKCS8PRIVATEKEY_BIO 120 +# define PEM_F_D2I_PKCS8PRIVATEKEY_FP 121 +# define PEM_F_DO_B2I 132 +# define PEM_F_DO_B2I_BIO 133 +# define PEM_F_DO_BLOB_HEADER 134 +# define PEM_F_DO_PK8PKEY 126 +# define PEM_F_DO_PK8PKEY_FP 125 +# define PEM_F_DO_PVK_BODY 135 +# define PEM_F_DO_PVK_HEADER 136 +# define PEM_F_I2B_PVK 137 +# define PEM_F_I2B_PVK_BIO 138 +# define PEM_F_LOAD_IV 101 +# define PEM_F_PEM_ASN1_READ 102 +# define PEM_F_PEM_ASN1_READ_BIO 103 +# define PEM_F_PEM_ASN1_WRITE 104 +# define PEM_F_PEM_ASN1_WRITE_BIO 105 +# define PEM_F_PEM_DEF_CALLBACK 100 +# define PEM_F_PEM_DO_HEADER 106 +# define PEM_F_PEM_F_PEM_WRITE_PKCS8PRIVATEKEY 118 +# define PEM_F_PEM_GET_EVP_CIPHER_INFO 107 +# define PEM_F_PEM_PK8PKEY 119 +# define PEM_F_PEM_READ 108 +# define PEM_F_PEM_READ_BIO 109 +# define PEM_F_PEM_READ_BIO_DHPARAMS 141 +# define PEM_F_PEM_READ_BIO_PARAMETERS 140 +# define PEM_F_PEM_READ_BIO_PRIVATEKEY 123 +# define PEM_F_PEM_READ_DHPARAMS 142 +# define PEM_F_PEM_READ_PRIVATEKEY 124 +# define PEM_F_PEM_SEALFINAL 110 +# define PEM_F_PEM_SEALINIT 111 +# define PEM_F_PEM_SIGNFINAL 112 +# define PEM_F_PEM_WRITE 113 +# define PEM_F_PEM_WRITE_BIO 114 +# define PEM_F_PEM_WRITE_PRIVATEKEY 139 +# define PEM_F_PEM_X509_INFO_READ 115 +# define PEM_F_PEM_X509_INFO_READ_BIO 116 +# define PEM_F_PEM_X509_INFO_WRITE_BIO 117 + +/* Reason codes. */ +# define PEM_R_BAD_BASE64_DECODE 100 +# define PEM_R_BAD_DECRYPT 101 +# define PEM_R_BAD_END_LINE 102 +# define PEM_R_BAD_IV_CHARS 103 +# define PEM_R_BAD_MAGIC_NUMBER 116 +# define PEM_R_BAD_PASSWORD_READ 104 +# define PEM_R_BAD_VERSION_NUMBER 117 +# define PEM_R_BIO_WRITE_FAILURE 118 +# define PEM_R_CIPHER_IS_NULL 127 +# define PEM_R_ERROR_CONVERTING_PRIVATE_KEY 115 +# define PEM_R_EXPECTING_PRIVATE_KEY_BLOB 119 +# define PEM_R_EXPECTING_PUBLIC_KEY_BLOB 120 +# define PEM_R_INCONSISTENT_HEADER 121 +# define PEM_R_KEYBLOB_HEADER_PARSE_ERROR 122 +# define PEM_R_KEYBLOB_TOO_SHORT 123 +# define PEM_R_NOT_DEK_INFO 105 +# define PEM_R_NOT_ENCRYPTED 106 +# define PEM_R_NOT_PROC_TYPE 107 +# define PEM_R_NO_START_LINE 108 +# define PEM_R_PROBLEMS_GETTING_PASSWORD 109 +# define PEM_R_PUBLIC_KEY_NO_RSA 110 +# define PEM_R_PVK_DATA_TOO_SHORT 124 +# define PEM_R_PVK_TOO_SHORT 125 +# define PEM_R_READ_KEY 111 +# define PEM_R_SHORT_HEADER 112 +# define PEM_R_UNSUPPORTED_CIPHER 113 +# define PEM_R_UNSUPPORTED_ENCRYPTION 114 +# define PEM_R_UNSUPPORTED_KEY_COMPONENTS 126 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/ext/openssl-osx/include/openssl/pem2.h b/ext/openssl-osx/include/openssl/pem2.h new file mode 100644 index 00000000..84897d5e --- /dev/null +++ b/ext/openssl-osx/include/openssl/pem2.h @@ -0,0 +1,70 @@ +/* ==================================================================== + * Copyright (c) 1999 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +/* + * This header only exists to break a circular dependency between pem and err + * Ben 30 Jan 1999. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef HEADER_PEM_H +void ERR_load_PEM_strings(void); +#endif + +#ifdef __cplusplus +} +#endif diff --git a/ext/openssl-osx/include/openssl/pkcs7.h b/ext/openssl-osx/include/openssl/pkcs7.h new file mode 100644 index 00000000..b51b3863 --- /dev/null +++ b/ext/openssl-osx/include/openssl/pkcs7.h @@ -0,0 +1,481 @@ +/* crypto/pkcs7/pkcs7.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_PKCS7_H +# define HEADER_PKCS7_H + +# include +# include +# include + +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# ifdef OPENSSL_SYS_WIN32 +/* Under Win32 thes are defined in wincrypt.h */ +# undef PKCS7_ISSUER_AND_SERIAL +# undef PKCS7_SIGNER_INFO +# endif + +/*- +Encryption_ID DES-CBC +Digest_ID MD5 +Digest_Encryption_ID rsaEncryption +Key_Encryption_ID rsaEncryption +*/ + +typedef struct pkcs7_issuer_and_serial_st { + X509_NAME *issuer; + ASN1_INTEGER *serial; +} PKCS7_ISSUER_AND_SERIAL; + +typedef struct pkcs7_signer_info_st { + ASN1_INTEGER *version; /* version 1 */ + PKCS7_ISSUER_AND_SERIAL *issuer_and_serial; + X509_ALGOR *digest_alg; + STACK_OF(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */ + X509_ALGOR *digest_enc_alg; + ASN1_OCTET_STRING *enc_digest; + STACK_OF(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */ + /* The private key to sign with */ + EVP_PKEY *pkey; +} PKCS7_SIGNER_INFO; + +DECLARE_STACK_OF(PKCS7_SIGNER_INFO) +DECLARE_ASN1_SET_OF(PKCS7_SIGNER_INFO) + +typedef struct pkcs7_recip_info_st { + ASN1_INTEGER *version; /* version 0 */ + PKCS7_ISSUER_AND_SERIAL *issuer_and_serial; + X509_ALGOR *key_enc_algor; + ASN1_OCTET_STRING *enc_key; + X509 *cert; /* get the pub-key from this */ +} PKCS7_RECIP_INFO; + +DECLARE_STACK_OF(PKCS7_RECIP_INFO) +DECLARE_ASN1_SET_OF(PKCS7_RECIP_INFO) + +typedef struct pkcs7_signed_st { + ASN1_INTEGER *version; /* version 1 */ + STACK_OF(X509_ALGOR) *md_algs; /* md used */ + STACK_OF(X509) *cert; /* [ 0 ] */ + STACK_OF(X509_CRL) *crl; /* [ 1 ] */ + STACK_OF(PKCS7_SIGNER_INFO) *signer_info; + struct pkcs7_st *contents; +} PKCS7_SIGNED; +/* + * The above structure is very very similar to PKCS7_SIGN_ENVELOPE. How about + * merging the two + */ + +typedef struct pkcs7_enc_content_st { + ASN1_OBJECT *content_type; + X509_ALGOR *algorithm; + ASN1_OCTET_STRING *enc_data; /* [ 0 ] */ + const EVP_CIPHER *cipher; +} PKCS7_ENC_CONTENT; + +typedef struct pkcs7_enveloped_st { + ASN1_INTEGER *version; /* version 0 */ + STACK_OF(PKCS7_RECIP_INFO) *recipientinfo; + PKCS7_ENC_CONTENT *enc_data; +} PKCS7_ENVELOPE; + +typedef struct pkcs7_signedandenveloped_st { + ASN1_INTEGER *version; /* version 1 */ + STACK_OF(X509_ALGOR) *md_algs; /* md used */ + STACK_OF(X509) *cert; /* [ 0 ] */ + STACK_OF(X509_CRL) *crl; /* [ 1 ] */ + STACK_OF(PKCS7_SIGNER_INFO) *signer_info; + PKCS7_ENC_CONTENT *enc_data; + STACK_OF(PKCS7_RECIP_INFO) *recipientinfo; +} PKCS7_SIGN_ENVELOPE; + +typedef struct pkcs7_digest_st { + ASN1_INTEGER *version; /* version 0 */ + X509_ALGOR *md; /* md used */ + struct pkcs7_st *contents; + ASN1_OCTET_STRING *digest; +} PKCS7_DIGEST; + +typedef struct pkcs7_encrypted_st { + ASN1_INTEGER *version; /* version 0 */ + PKCS7_ENC_CONTENT *enc_data; +} PKCS7_ENCRYPT; + +typedef struct pkcs7_st { + /* + * The following is non NULL if it contains ASN1 encoding of this + * structure + */ + unsigned char *asn1; + long length; +# define PKCS7_S_HEADER 0 +# define PKCS7_S_BODY 1 +# define PKCS7_S_TAIL 2 + int state; /* used during processing */ + int detached; + ASN1_OBJECT *type; + /* content as defined by the type */ + /* + * all encryption/message digests are applied to the 'contents', leaving + * out the 'type' field. + */ + union { + char *ptr; + /* NID_pkcs7_data */ + ASN1_OCTET_STRING *data; + /* NID_pkcs7_signed */ + PKCS7_SIGNED *sign; + /* NID_pkcs7_enveloped */ + PKCS7_ENVELOPE *enveloped; + /* NID_pkcs7_signedAndEnveloped */ + PKCS7_SIGN_ENVELOPE *signed_and_enveloped; + /* NID_pkcs7_digest */ + PKCS7_DIGEST *digest; + /* NID_pkcs7_encrypted */ + PKCS7_ENCRYPT *encrypted; + /* Anything else */ + ASN1_TYPE *other; + } d; +} PKCS7; + +DECLARE_STACK_OF(PKCS7) +DECLARE_ASN1_SET_OF(PKCS7) +DECLARE_PKCS12_STACK_OF(PKCS7) + +# define PKCS7_OP_SET_DETACHED_SIGNATURE 1 +# define PKCS7_OP_GET_DETACHED_SIGNATURE 2 + +# define PKCS7_get_signed_attributes(si) ((si)->auth_attr) +# define PKCS7_get_attributes(si) ((si)->unauth_attr) + +# define PKCS7_type_is_signed(a) (OBJ_obj2nid((a)->type) == NID_pkcs7_signed) +# define PKCS7_type_is_encrypted(a) (OBJ_obj2nid((a)->type) == NID_pkcs7_encrypted) +# define PKCS7_type_is_enveloped(a) (OBJ_obj2nid((a)->type) == NID_pkcs7_enveloped) +# define PKCS7_type_is_signedAndEnveloped(a) \ + (OBJ_obj2nid((a)->type) == NID_pkcs7_signedAndEnveloped) +# define PKCS7_type_is_data(a) (OBJ_obj2nid((a)->type) == NID_pkcs7_data) +# define PKCS7_type_is_digest(a) (OBJ_obj2nid((a)->type) == NID_pkcs7_digest) + +# define PKCS7_set_detached(p,v) \ + PKCS7_ctrl(p,PKCS7_OP_SET_DETACHED_SIGNATURE,v,NULL) +# define PKCS7_get_detached(p) \ + PKCS7_ctrl(p,PKCS7_OP_GET_DETACHED_SIGNATURE,0,NULL) + +# define PKCS7_is_detached(p7) (PKCS7_type_is_signed(p7) && PKCS7_get_detached(p7)) + +/* S/MIME related flags */ + +# define PKCS7_TEXT 0x1 +# define PKCS7_NOCERTS 0x2 +# define PKCS7_NOSIGS 0x4 +# define PKCS7_NOCHAIN 0x8 +# define PKCS7_NOINTERN 0x10 +# define PKCS7_NOVERIFY 0x20 +# define PKCS7_DETACHED 0x40 +# define PKCS7_BINARY 0x80 +# define PKCS7_NOATTR 0x100 +# define PKCS7_NOSMIMECAP 0x200 +# define PKCS7_NOOLDMIMETYPE 0x400 +# define PKCS7_CRLFEOL 0x800 +# define PKCS7_STREAM 0x1000 +# define PKCS7_NOCRL 0x2000 +# define PKCS7_PARTIAL 0x4000 +# define PKCS7_REUSE_DIGEST 0x8000 + +/* Flags: for compatibility with older code */ + +# define SMIME_TEXT PKCS7_TEXT +# define SMIME_NOCERTS PKCS7_NOCERTS +# define SMIME_NOSIGS PKCS7_NOSIGS +# define SMIME_NOCHAIN PKCS7_NOCHAIN +# define SMIME_NOINTERN PKCS7_NOINTERN +# define SMIME_NOVERIFY PKCS7_NOVERIFY +# define SMIME_DETACHED PKCS7_DETACHED +# define SMIME_BINARY PKCS7_BINARY +# define SMIME_NOATTR PKCS7_NOATTR + +DECLARE_ASN1_FUNCTIONS(PKCS7_ISSUER_AND_SERIAL) + +int PKCS7_ISSUER_AND_SERIAL_digest(PKCS7_ISSUER_AND_SERIAL *data, + const EVP_MD *type, unsigned char *md, + unsigned int *len); +# ifndef OPENSSL_NO_FP_API +PKCS7 *d2i_PKCS7_fp(FILE *fp, PKCS7 **p7); +int i2d_PKCS7_fp(FILE *fp, PKCS7 *p7); +# endif +PKCS7 *PKCS7_dup(PKCS7 *p7); +PKCS7 *d2i_PKCS7_bio(BIO *bp, PKCS7 **p7); +int i2d_PKCS7_bio(BIO *bp, PKCS7 *p7); +int i2d_PKCS7_bio_stream(BIO *out, PKCS7 *p7, BIO *in, int flags); +int PEM_write_bio_PKCS7_stream(BIO *out, PKCS7 *p7, BIO *in, int flags); + +DECLARE_ASN1_FUNCTIONS(PKCS7_SIGNER_INFO) +DECLARE_ASN1_FUNCTIONS(PKCS7_RECIP_INFO) +DECLARE_ASN1_FUNCTIONS(PKCS7_SIGNED) +DECLARE_ASN1_FUNCTIONS(PKCS7_ENC_CONTENT) +DECLARE_ASN1_FUNCTIONS(PKCS7_ENVELOPE) +DECLARE_ASN1_FUNCTIONS(PKCS7_SIGN_ENVELOPE) +DECLARE_ASN1_FUNCTIONS(PKCS7_DIGEST) +DECLARE_ASN1_FUNCTIONS(PKCS7_ENCRYPT) +DECLARE_ASN1_FUNCTIONS(PKCS7) + +DECLARE_ASN1_ITEM(PKCS7_ATTR_SIGN) +DECLARE_ASN1_ITEM(PKCS7_ATTR_VERIFY) + +DECLARE_ASN1_NDEF_FUNCTION(PKCS7) +DECLARE_ASN1_PRINT_FUNCTION(PKCS7) + +long PKCS7_ctrl(PKCS7 *p7, int cmd, long larg, char *parg); + +int PKCS7_set_type(PKCS7 *p7, int type); +int PKCS7_set0_type_other(PKCS7 *p7, int type, ASN1_TYPE *other); +int PKCS7_set_content(PKCS7 *p7, PKCS7 *p7_data); +int PKCS7_SIGNER_INFO_set(PKCS7_SIGNER_INFO *p7i, X509 *x509, EVP_PKEY *pkey, + const EVP_MD *dgst); +int PKCS7_SIGNER_INFO_sign(PKCS7_SIGNER_INFO *si); +int PKCS7_add_signer(PKCS7 *p7, PKCS7_SIGNER_INFO *p7i); +int PKCS7_add_certificate(PKCS7 *p7, X509 *x509); +int PKCS7_add_crl(PKCS7 *p7, X509_CRL *x509); +int PKCS7_content_new(PKCS7 *p7, int nid); +int PKCS7_dataVerify(X509_STORE *cert_store, X509_STORE_CTX *ctx, + BIO *bio, PKCS7 *p7, PKCS7_SIGNER_INFO *si); +int PKCS7_signatureVerify(BIO *bio, PKCS7 *p7, PKCS7_SIGNER_INFO *si, + X509 *x509); + +BIO *PKCS7_dataInit(PKCS7 *p7, BIO *bio); +int PKCS7_dataFinal(PKCS7 *p7, BIO *bio); +BIO *PKCS7_dataDecode(PKCS7 *p7, EVP_PKEY *pkey, BIO *in_bio, X509 *pcert); + +PKCS7_SIGNER_INFO *PKCS7_add_signature(PKCS7 *p7, X509 *x509, + EVP_PKEY *pkey, const EVP_MD *dgst); +X509 *PKCS7_cert_from_signer_info(PKCS7 *p7, PKCS7_SIGNER_INFO *si); +int PKCS7_set_digest(PKCS7 *p7, const EVP_MD *md); +STACK_OF(PKCS7_SIGNER_INFO) *PKCS7_get_signer_info(PKCS7 *p7); + +PKCS7_RECIP_INFO *PKCS7_add_recipient(PKCS7 *p7, X509 *x509); +void PKCS7_SIGNER_INFO_get0_algs(PKCS7_SIGNER_INFO *si, EVP_PKEY **pk, + X509_ALGOR **pdig, X509_ALGOR **psig); +void PKCS7_RECIP_INFO_get0_alg(PKCS7_RECIP_INFO *ri, X509_ALGOR **penc); +int PKCS7_add_recipient_info(PKCS7 *p7, PKCS7_RECIP_INFO *ri); +int PKCS7_RECIP_INFO_set(PKCS7_RECIP_INFO *p7i, X509 *x509); +int PKCS7_set_cipher(PKCS7 *p7, const EVP_CIPHER *cipher); +int PKCS7_stream(unsigned char ***boundary, PKCS7 *p7); + +PKCS7_ISSUER_AND_SERIAL *PKCS7_get_issuer_and_serial(PKCS7 *p7, int idx); +ASN1_OCTET_STRING *PKCS7_digest_from_attributes(STACK_OF(X509_ATTRIBUTE) *sk); +int PKCS7_add_signed_attribute(PKCS7_SIGNER_INFO *p7si, int nid, int type, + void *data); +int PKCS7_add_attribute(PKCS7_SIGNER_INFO *p7si, int nid, int atrtype, + void *value); +ASN1_TYPE *PKCS7_get_attribute(PKCS7_SIGNER_INFO *si, int nid); +ASN1_TYPE *PKCS7_get_signed_attribute(PKCS7_SIGNER_INFO *si, int nid); +int PKCS7_set_signed_attributes(PKCS7_SIGNER_INFO *p7si, + STACK_OF(X509_ATTRIBUTE) *sk); +int PKCS7_set_attributes(PKCS7_SIGNER_INFO *p7si, + STACK_OF(X509_ATTRIBUTE) *sk); + +PKCS7 *PKCS7_sign(X509 *signcert, EVP_PKEY *pkey, STACK_OF(X509) *certs, + BIO *data, int flags); + +PKCS7_SIGNER_INFO *PKCS7_sign_add_signer(PKCS7 *p7, + X509 *signcert, EVP_PKEY *pkey, + const EVP_MD *md, int flags); + +int PKCS7_final(PKCS7 *p7, BIO *data, int flags); +int PKCS7_verify(PKCS7 *p7, STACK_OF(X509) *certs, X509_STORE *store, + BIO *indata, BIO *out, int flags); +STACK_OF(X509) *PKCS7_get0_signers(PKCS7 *p7, STACK_OF(X509) *certs, + int flags); +PKCS7 *PKCS7_encrypt(STACK_OF(X509) *certs, BIO *in, const EVP_CIPHER *cipher, + int flags); +int PKCS7_decrypt(PKCS7 *p7, EVP_PKEY *pkey, X509 *cert, BIO *data, + int flags); + +int PKCS7_add_attrib_smimecap(PKCS7_SIGNER_INFO *si, + STACK_OF(X509_ALGOR) *cap); +STACK_OF(X509_ALGOR) *PKCS7_get_smimecap(PKCS7_SIGNER_INFO *si); +int PKCS7_simple_smimecap(STACK_OF(X509_ALGOR) *sk, int nid, int arg); + +int PKCS7_add_attrib_content_type(PKCS7_SIGNER_INFO *si, ASN1_OBJECT *coid); +int PKCS7_add0_attrib_signing_time(PKCS7_SIGNER_INFO *si, ASN1_TIME *t); +int PKCS7_add1_attrib_digest(PKCS7_SIGNER_INFO *si, + const unsigned char *md, int mdlen); + +int SMIME_write_PKCS7(BIO *bio, PKCS7 *p7, BIO *data, int flags); +PKCS7 *SMIME_read_PKCS7(BIO *bio, BIO **bcont); + +BIO *BIO_new_PKCS7(BIO *out, PKCS7 *p7); + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_PKCS7_strings(void); + +/* Error codes for the PKCS7 functions. */ + +/* Function codes. */ +# define PKCS7_F_B64_READ_PKCS7 120 +# define PKCS7_F_B64_WRITE_PKCS7 121 +# define PKCS7_F_DO_PKCS7_SIGNED_ATTRIB 136 +# define PKCS7_F_I2D_PKCS7_BIO_STREAM 140 +# define PKCS7_F_PKCS7_ADD0_ATTRIB_SIGNING_TIME 135 +# define PKCS7_F_PKCS7_ADD_ATTRIB_SMIMECAP 118 +# define PKCS7_F_PKCS7_ADD_CERTIFICATE 100 +# define PKCS7_F_PKCS7_ADD_CRL 101 +# define PKCS7_F_PKCS7_ADD_RECIPIENT_INFO 102 +# define PKCS7_F_PKCS7_ADD_SIGNATURE 131 +# define PKCS7_F_PKCS7_ADD_SIGNER 103 +# define PKCS7_F_PKCS7_BIO_ADD_DIGEST 125 +# define PKCS7_F_PKCS7_COPY_EXISTING_DIGEST 138 +# define PKCS7_F_PKCS7_CTRL 104 +# define PKCS7_F_PKCS7_DATADECODE 112 +# define PKCS7_F_PKCS7_DATAFINAL 128 +# define PKCS7_F_PKCS7_DATAINIT 105 +# define PKCS7_F_PKCS7_DATASIGN 106 +# define PKCS7_F_PKCS7_DATAVERIFY 107 +# define PKCS7_F_PKCS7_DECRYPT 114 +# define PKCS7_F_PKCS7_DECRYPT_RINFO 133 +# define PKCS7_F_PKCS7_ENCODE_RINFO 132 +# define PKCS7_F_PKCS7_ENCRYPT 115 +# define PKCS7_F_PKCS7_FINAL 134 +# define PKCS7_F_PKCS7_FIND_DIGEST 127 +# define PKCS7_F_PKCS7_GET0_SIGNERS 124 +# define PKCS7_F_PKCS7_RECIP_INFO_SET 130 +# define PKCS7_F_PKCS7_SET_CIPHER 108 +# define PKCS7_F_PKCS7_SET_CONTENT 109 +# define PKCS7_F_PKCS7_SET_DIGEST 126 +# define PKCS7_F_PKCS7_SET_TYPE 110 +# define PKCS7_F_PKCS7_SIGN 116 +# define PKCS7_F_PKCS7_SIGNATUREVERIFY 113 +# define PKCS7_F_PKCS7_SIGNER_INFO_SET 129 +# define PKCS7_F_PKCS7_SIGNER_INFO_SIGN 139 +# define PKCS7_F_PKCS7_SIGN_ADD_SIGNER 137 +# define PKCS7_F_PKCS7_SIMPLE_SMIMECAP 119 +# define PKCS7_F_PKCS7_VERIFY 117 +# define PKCS7_F_SMIME_READ_PKCS7 122 +# define PKCS7_F_SMIME_TEXT 123 + +/* Reason codes. */ +# define PKCS7_R_CERTIFICATE_VERIFY_ERROR 117 +# define PKCS7_R_CIPHER_HAS_NO_OBJECT_IDENTIFIER 144 +# define PKCS7_R_CIPHER_NOT_INITIALIZED 116 +# define PKCS7_R_CONTENT_AND_DATA_PRESENT 118 +# define PKCS7_R_CTRL_ERROR 152 +# define PKCS7_R_DECODE_ERROR 130 +# define PKCS7_R_DECRYPTED_KEY_IS_WRONG_LENGTH 100 +# define PKCS7_R_DECRYPT_ERROR 119 +# define PKCS7_R_DIGEST_FAILURE 101 +# define PKCS7_R_ENCRYPTION_CTRL_FAILURE 149 +# define PKCS7_R_ENCRYPTION_NOT_SUPPORTED_FOR_THIS_KEY_TYPE 150 +# define PKCS7_R_ERROR_ADDING_RECIPIENT 120 +# define PKCS7_R_ERROR_SETTING_CIPHER 121 +# define PKCS7_R_INVALID_MIME_TYPE 131 +# define PKCS7_R_INVALID_NULL_POINTER 143 +# define PKCS7_R_INVALID_SIGNED_DATA_TYPE 155 +# define PKCS7_R_MIME_NO_CONTENT_TYPE 132 +# define PKCS7_R_MIME_PARSE_ERROR 133 +# define PKCS7_R_MIME_SIG_PARSE_ERROR 134 +# define PKCS7_R_MISSING_CERIPEND_INFO 103 +# define PKCS7_R_NO_CONTENT 122 +# define PKCS7_R_NO_CONTENT_TYPE 135 +# define PKCS7_R_NO_DEFAULT_DIGEST 151 +# define PKCS7_R_NO_MATCHING_DIGEST_TYPE_FOUND 154 +# define PKCS7_R_NO_MULTIPART_BODY_FAILURE 136 +# define PKCS7_R_NO_MULTIPART_BOUNDARY 137 +# define PKCS7_R_NO_RECIPIENT_MATCHES_CERTIFICATE 115 +# define PKCS7_R_NO_RECIPIENT_MATCHES_KEY 146 +# define PKCS7_R_NO_SIGNATURES_ON_DATA 123 +# define PKCS7_R_NO_SIGNERS 142 +# define PKCS7_R_NO_SIG_CONTENT_TYPE 138 +# define PKCS7_R_OPERATION_NOT_SUPPORTED_ON_THIS_TYPE 104 +# define PKCS7_R_PKCS7_ADD_SIGNATURE_ERROR 124 +# define PKCS7_R_PKCS7_ADD_SIGNER_ERROR 153 +# define PKCS7_R_PKCS7_DATAFINAL 126 +# define PKCS7_R_PKCS7_DATAFINAL_ERROR 125 +# define PKCS7_R_PKCS7_DATASIGN 145 +# define PKCS7_R_PKCS7_PARSE_ERROR 139 +# define PKCS7_R_PKCS7_SIG_PARSE_ERROR 140 +# define PKCS7_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE 127 +# define PKCS7_R_SIGNATURE_FAILURE 105 +# define PKCS7_R_SIGNER_CERTIFICATE_NOT_FOUND 128 +# define PKCS7_R_SIGNING_CTRL_FAILURE 147 +# define PKCS7_R_SIGNING_NOT_SUPPORTED_FOR_THIS_KEY_TYPE 148 +# define PKCS7_R_SIG_INVALID_MIME_TYPE 141 +# define PKCS7_R_SMIME_TEXT_ERROR 129 +# define PKCS7_R_UNABLE_TO_FIND_CERTIFICATE 106 +# define PKCS7_R_UNABLE_TO_FIND_MEM_BIO 107 +# define PKCS7_R_UNABLE_TO_FIND_MESSAGE_DIGEST 108 +# define PKCS7_R_UNKNOWN_DIGEST_TYPE 109 +# define PKCS7_R_UNKNOWN_OPERATION 110 +# define PKCS7_R_UNSUPPORTED_CIPHER_TYPE 111 +# define PKCS7_R_UNSUPPORTED_CONTENT_TYPE 112 +# define PKCS7_R_WRONG_CONTENT_TYPE 113 +# define PKCS7_R_WRONG_PKCS7_TYPE 114 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/ext/openssl-osx/include/openssl/pqueue.h b/ext/openssl-osx/include/openssl/pqueue.h new file mode 100644 index 00000000..d40d9c7d --- /dev/null +++ b/ext/openssl-osx/include/openssl/pqueue.h @@ -0,0 +1,99 @@ +/* crypto/pqueue/pqueue.h */ +/* + * DTLS implementation written by Nagendra Modadugu + * (nagendra@cs.stanford.edu) for the OpenSSL project 2005. + */ +/* ==================================================================== + * Copyright (c) 1999-2005 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_PQUEUE_H +# define HEADER_PQUEUE_H + +# include +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif +typedef struct _pqueue *pqueue; + +typedef struct _pitem { + unsigned char priority[8]; /* 64-bit value in big-endian encoding */ + void *data; + struct _pitem *next; +} pitem; + +typedef struct _pitem *piterator; + +pitem *pitem_new(unsigned char *prio64be, void *data); +void pitem_free(pitem *item); + +pqueue pqueue_new(void); +void pqueue_free(pqueue pq); + +pitem *pqueue_insert(pqueue pq, pitem *item); +pitem *pqueue_peek(pqueue pq); +pitem *pqueue_pop(pqueue pq); +pitem *pqueue_find(pqueue pq, unsigned char *prio64be); +pitem *pqueue_iterator(pqueue pq); +pitem *pqueue_next(piterator *iter); + +void pqueue_print(pqueue pq); +int pqueue_size(pqueue pq); + +#ifdef __cplusplus +} +#endif +#endif /* ! HEADER_PQUEUE_H */ diff --git a/ext/openssl-osx/include/openssl/rsa.h b/ext/openssl-osx/include/openssl/rsa.h new file mode 100644 index 00000000..d2ee3740 --- /dev/null +++ b/ext/openssl-osx/include/openssl/rsa.h @@ -0,0 +1,664 @@ +/* crypto/rsa/rsa.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_RSA_H +# define HEADER_RSA_H + +# include + +# ifndef OPENSSL_NO_BIO +# include +# endif +# include +# include +# ifndef OPENSSL_NO_DEPRECATED +# include +# endif + +# ifdef OPENSSL_NO_RSA +# error RSA is disabled. +# endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* Declared already in ossl_typ.h */ +/* typedef struct rsa_st RSA; */ +/* typedef struct rsa_meth_st RSA_METHOD; */ + +struct rsa_meth_st { + const char *name; + int (*rsa_pub_enc) (int flen, const unsigned char *from, + unsigned char *to, RSA *rsa, int padding); + int (*rsa_pub_dec) (int flen, const unsigned char *from, + unsigned char *to, RSA *rsa, int padding); + int (*rsa_priv_enc) (int flen, const unsigned char *from, + unsigned char *to, RSA *rsa, int padding); + int (*rsa_priv_dec) (int flen, const unsigned char *from, + unsigned char *to, RSA *rsa, int padding); + /* Can be null */ + int (*rsa_mod_exp) (BIGNUM *r0, const BIGNUM *I, RSA *rsa, BN_CTX *ctx); + /* Can be null */ + int (*bn_mod_exp) (BIGNUM *r, const BIGNUM *a, const BIGNUM *p, + const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx); + /* called at new */ + int (*init) (RSA *rsa); + /* called at free */ + int (*finish) (RSA *rsa); + /* RSA_METHOD_FLAG_* things */ + int flags; + /* may be needed! */ + char *app_data; + /* + * New sign and verify functions: some libraries don't allow arbitrary + * data to be signed/verified: this allows them to be used. Note: for + * this to work the RSA_public_decrypt() and RSA_private_encrypt() should + * *NOT* be used RSA_sign(), RSA_verify() should be used instead. Note: + * for backwards compatibility this functionality is only enabled if the + * RSA_FLAG_SIGN_VER option is set in 'flags'. + */ + int (*rsa_sign) (int type, + const unsigned char *m, unsigned int m_length, + unsigned char *sigret, unsigned int *siglen, + const RSA *rsa); + int (*rsa_verify) (int dtype, const unsigned char *m, + unsigned int m_length, const unsigned char *sigbuf, + unsigned int siglen, const RSA *rsa); + /* + * If this callback is NULL, the builtin software RSA key-gen will be + * used. This is for behavioural compatibility whilst the code gets + * rewired, but one day it would be nice to assume there are no such + * things as "builtin software" implementations. + */ + int (*rsa_keygen) (RSA *rsa, int bits, BIGNUM *e, BN_GENCB *cb); +}; + +struct rsa_st { + /* + * The first parameter is used to pickup errors where this is passed + * instead of aEVP_PKEY, it is set to 0 + */ + int pad; + long version; + const RSA_METHOD *meth; + /* functional reference if 'meth' is ENGINE-provided */ + ENGINE *engine; + BIGNUM *n; + BIGNUM *e; + BIGNUM *d; + BIGNUM *p; + BIGNUM *q; + BIGNUM *dmp1; + BIGNUM *dmq1; + BIGNUM *iqmp; + /* be careful using this if the RSA structure is shared */ + CRYPTO_EX_DATA ex_data; + int references; + int flags; + /* Used to cache montgomery values */ + BN_MONT_CTX *_method_mod_n; + BN_MONT_CTX *_method_mod_p; + BN_MONT_CTX *_method_mod_q; + /* + * all BIGNUM values are actually in the following data, if it is not + * NULL + */ + char *bignum_data; + BN_BLINDING *blinding; + BN_BLINDING *mt_blinding; +}; + +# ifndef OPENSSL_RSA_MAX_MODULUS_BITS +# define OPENSSL_RSA_MAX_MODULUS_BITS 16384 +# endif + +# ifndef OPENSSL_RSA_SMALL_MODULUS_BITS +# define OPENSSL_RSA_SMALL_MODULUS_BITS 3072 +# endif +# ifndef OPENSSL_RSA_MAX_PUBEXP_BITS + +/* exponent limit enforced for "large" modulus only */ +# define OPENSSL_RSA_MAX_PUBEXP_BITS 64 +# endif + +# define RSA_3 0x3L +# define RSA_F4 0x10001L + +# define RSA_METHOD_FLAG_NO_CHECK 0x0001/* don't check pub/private + * match */ + +# define RSA_FLAG_CACHE_PUBLIC 0x0002 +# define RSA_FLAG_CACHE_PRIVATE 0x0004 +# define RSA_FLAG_BLINDING 0x0008 +# define RSA_FLAG_THREAD_SAFE 0x0010 +/* + * This flag means the private key operations will be handled by rsa_mod_exp + * and that they do not depend on the private key components being present: + * for example a key stored in external hardware. Without this flag + * bn_mod_exp gets called when private key components are absent. + */ +# define RSA_FLAG_EXT_PKEY 0x0020 + +/* + * This flag in the RSA_METHOD enables the new rsa_sign, rsa_verify + * functions. + */ +# define RSA_FLAG_SIGN_VER 0x0040 + +/* + * new with 0.9.6j and 0.9.7b; the built-in + * RSA implementation now uses blinding by + * default (ignoring RSA_FLAG_BLINDING), + * but other engines might not need it + */ +# define RSA_FLAG_NO_BLINDING 0x0080 +/* + * new with 0.9.8f; the built-in RSA + * implementation now uses constant time + * operations by default in private key operations, + * e.g., constant time modular exponentiation, + * modular inverse without leaking branches, + * division without leaking branches. This + * flag disables these constant time + * operations and results in faster RSA + * private key operations. + */ +# define RSA_FLAG_NO_CONSTTIME 0x0100 +# ifdef OPENSSL_USE_DEPRECATED +/* deprecated name for the flag*/ +/* + * new with 0.9.7h; the built-in RSA + * implementation now uses constant time + * modular exponentiation for secret exponents + * by default. This flag causes the + * faster variable sliding window method to + * be used for all exponents. + */ +# define RSA_FLAG_NO_EXP_CONSTTIME RSA_FLAG_NO_CONSTTIME +# endif + +# define EVP_PKEY_CTX_set_rsa_padding(ctx, pad) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, -1, EVP_PKEY_CTRL_RSA_PADDING, \ + pad, NULL) + +# define EVP_PKEY_CTX_get_rsa_padding(ctx, ppad) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, -1, \ + EVP_PKEY_CTRL_GET_RSA_PADDING, 0, ppad) + +# define EVP_PKEY_CTX_set_rsa_pss_saltlen(ctx, len) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, \ + (EVP_PKEY_OP_SIGN|EVP_PKEY_OP_VERIFY), \ + EVP_PKEY_CTRL_RSA_PSS_SALTLEN, \ + len, NULL) + +# define EVP_PKEY_CTX_get_rsa_pss_saltlen(ctx, plen) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, \ + (EVP_PKEY_OP_SIGN|EVP_PKEY_OP_VERIFY), \ + EVP_PKEY_CTRL_GET_RSA_PSS_SALTLEN, \ + 0, plen) + +# define EVP_PKEY_CTX_set_rsa_keygen_bits(ctx, bits) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, EVP_PKEY_OP_KEYGEN, \ + EVP_PKEY_CTRL_RSA_KEYGEN_BITS, bits, NULL) + +# define EVP_PKEY_CTX_set_rsa_keygen_pubexp(ctx, pubexp) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, EVP_PKEY_OP_KEYGEN, \ + EVP_PKEY_CTRL_RSA_KEYGEN_PUBEXP, 0, pubexp) + +# define EVP_PKEY_CTX_set_rsa_mgf1_md(ctx, md) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, \ + EVP_PKEY_OP_TYPE_SIG | EVP_PKEY_OP_TYPE_CRYPT, \ + EVP_PKEY_CTRL_RSA_MGF1_MD, 0, (void *)md) + +# define EVP_PKEY_CTX_set_rsa_oaep_md(ctx, md) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, EVP_PKEY_OP_TYPE_CRYPT, \ + EVP_PKEY_CTRL_RSA_OAEP_MD, 0, (void *)md) + +# define EVP_PKEY_CTX_get_rsa_mgf1_md(ctx, pmd) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, \ + EVP_PKEY_OP_TYPE_SIG | EVP_PKEY_OP_TYPE_CRYPT, \ + EVP_PKEY_CTRL_GET_RSA_MGF1_MD, 0, (void *)pmd) + +# define EVP_PKEY_CTX_get_rsa_oaep_md(ctx, pmd) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, EVP_PKEY_OP_TYPE_CRYPT, \ + EVP_PKEY_CTRL_GET_RSA_OAEP_MD, 0, (void *)pmd) + +# define EVP_PKEY_CTX_set0_rsa_oaep_label(ctx, l, llen) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, EVP_PKEY_OP_TYPE_CRYPT, \ + EVP_PKEY_CTRL_RSA_OAEP_LABEL, llen, (void *)l) + +# define EVP_PKEY_CTX_get0_rsa_oaep_label(ctx, l) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, EVP_PKEY_OP_TYPE_CRYPT, \ + EVP_PKEY_CTRL_GET_RSA_OAEP_LABEL, 0, (void *)l) + +# define EVP_PKEY_CTRL_RSA_PADDING (EVP_PKEY_ALG_CTRL + 1) +# define EVP_PKEY_CTRL_RSA_PSS_SALTLEN (EVP_PKEY_ALG_CTRL + 2) + +# define EVP_PKEY_CTRL_RSA_KEYGEN_BITS (EVP_PKEY_ALG_CTRL + 3) +# define EVP_PKEY_CTRL_RSA_KEYGEN_PUBEXP (EVP_PKEY_ALG_CTRL + 4) +# define EVP_PKEY_CTRL_RSA_MGF1_MD (EVP_PKEY_ALG_CTRL + 5) + +# define EVP_PKEY_CTRL_GET_RSA_PADDING (EVP_PKEY_ALG_CTRL + 6) +# define EVP_PKEY_CTRL_GET_RSA_PSS_SALTLEN (EVP_PKEY_ALG_CTRL + 7) +# define EVP_PKEY_CTRL_GET_RSA_MGF1_MD (EVP_PKEY_ALG_CTRL + 8) + +# define EVP_PKEY_CTRL_RSA_OAEP_MD (EVP_PKEY_ALG_CTRL + 9) +# define EVP_PKEY_CTRL_RSA_OAEP_LABEL (EVP_PKEY_ALG_CTRL + 10) + +# define EVP_PKEY_CTRL_GET_RSA_OAEP_MD (EVP_PKEY_ALG_CTRL + 11) +# define EVP_PKEY_CTRL_GET_RSA_OAEP_LABEL (EVP_PKEY_ALG_CTRL + 12) + +# define RSA_PKCS1_PADDING 1 +# define RSA_SSLV23_PADDING 2 +# define RSA_NO_PADDING 3 +# define RSA_PKCS1_OAEP_PADDING 4 +# define RSA_X931_PADDING 5 +/* EVP_PKEY_ only */ +# define RSA_PKCS1_PSS_PADDING 6 + +# define RSA_PKCS1_PADDING_SIZE 11 + +# define RSA_set_app_data(s,arg) RSA_set_ex_data(s,0,arg) +# define RSA_get_app_data(s) RSA_get_ex_data(s,0) + +RSA *RSA_new(void); +RSA *RSA_new_method(ENGINE *engine); +int RSA_size(const RSA *rsa); + +/* Deprecated version */ +# ifndef OPENSSL_NO_DEPRECATED +RSA *RSA_generate_key(int bits, unsigned long e, void + (*callback) (int, int, void *), void *cb_arg); +# endif /* !defined(OPENSSL_NO_DEPRECATED) */ + +/* New version */ +int RSA_generate_key_ex(RSA *rsa, int bits, BIGNUM *e, BN_GENCB *cb); + +int RSA_check_key(const RSA *); + /* next 4 return -1 on error */ +int RSA_public_encrypt(int flen, const unsigned char *from, + unsigned char *to, RSA *rsa, int padding); +int RSA_private_encrypt(int flen, const unsigned char *from, + unsigned char *to, RSA *rsa, int padding); +int RSA_public_decrypt(int flen, const unsigned char *from, + unsigned char *to, RSA *rsa, int padding); +int RSA_private_decrypt(int flen, const unsigned char *from, + unsigned char *to, RSA *rsa, int padding); +void RSA_free(RSA *r); +/* "up" the RSA object's reference count */ +int RSA_up_ref(RSA *r); + +int RSA_flags(const RSA *r); + +void RSA_set_default_method(const RSA_METHOD *meth); +const RSA_METHOD *RSA_get_default_method(void); +const RSA_METHOD *RSA_get_method(const RSA *rsa); +int RSA_set_method(RSA *rsa, const RSA_METHOD *meth); + +/* This function needs the memory locking malloc callbacks to be installed */ +int RSA_memory_lock(RSA *r); + +/* these are the actual SSLeay RSA functions */ +const RSA_METHOD *RSA_PKCS1_SSLeay(void); + +const RSA_METHOD *RSA_null_method(void); + +DECLARE_ASN1_ENCODE_FUNCTIONS_const(RSA, RSAPublicKey) +DECLARE_ASN1_ENCODE_FUNCTIONS_const(RSA, RSAPrivateKey) + +typedef struct rsa_pss_params_st { + X509_ALGOR *hashAlgorithm; + X509_ALGOR *maskGenAlgorithm; + ASN1_INTEGER *saltLength; + ASN1_INTEGER *trailerField; +} RSA_PSS_PARAMS; + +DECLARE_ASN1_FUNCTIONS(RSA_PSS_PARAMS) + +typedef struct rsa_oaep_params_st { + X509_ALGOR *hashFunc; + X509_ALGOR *maskGenFunc; + X509_ALGOR *pSourceFunc; +} RSA_OAEP_PARAMS; + +DECLARE_ASN1_FUNCTIONS(RSA_OAEP_PARAMS) + +# ifndef OPENSSL_NO_FP_API +int RSA_print_fp(FILE *fp, const RSA *r, int offset); +# endif + +# ifndef OPENSSL_NO_BIO +int RSA_print(BIO *bp, const RSA *r, int offset); +# endif + +# ifndef OPENSSL_NO_RC4 +int i2d_RSA_NET(const RSA *a, unsigned char **pp, + int (*cb) (char *buf, int len, const char *prompt, + int verify), int sgckey); +RSA *d2i_RSA_NET(RSA **a, const unsigned char **pp, long length, + int (*cb) (char *buf, int len, const char *prompt, + int verify), int sgckey); + +int i2d_Netscape_RSA(const RSA *a, unsigned char **pp, + int (*cb) (char *buf, int len, const char *prompt, + int verify)); +RSA *d2i_Netscape_RSA(RSA **a, const unsigned char **pp, long length, + int (*cb) (char *buf, int len, const char *prompt, + int verify)); +# endif + +/* + * The following 2 functions sign and verify a X509_SIG ASN1 object inside + * PKCS#1 padded RSA encryption + */ +int RSA_sign(int type, const unsigned char *m, unsigned int m_length, + unsigned char *sigret, unsigned int *siglen, RSA *rsa); +int RSA_verify(int type, const unsigned char *m, unsigned int m_length, + const unsigned char *sigbuf, unsigned int siglen, RSA *rsa); + +/* + * The following 2 function sign and verify a ASN1_OCTET_STRING object inside + * PKCS#1 padded RSA encryption + */ +int RSA_sign_ASN1_OCTET_STRING(int type, + const unsigned char *m, unsigned int m_length, + unsigned char *sigret, unsigned int *siglen, + RSA *rsa); +int RSA_verify_ASN1_OCTET_STRING(int type, const unsigned char *m, + unsigned int m_length, unsigned char *sigbuf, + unsigned int siglen, RSA *rsa); + +int RSA_blinding_on(RSA *rsa, BN_CTX *ctx); +void RSA_blinding_off(RSA *rsa); +BN_BLINDING *RSA_setup_blinding(RSA *rsa, BN_CTX *ctx); + +int RSA_padding_add_PKCS1_type_1(unsigned char *to, int tlen, + const unsigned char *f, int fl); +int RSA_padding_check_PKCS1_type_1(unsigned char *to, int tlen, + const unsigned char *f, int fl, + int rsa_len); +int RSA_padding_add_PKCS1_type_2(unsigned char *to, int tlen, + const unsigned char *f, int fl); +int RSA_padding_check_PKCS1_type_2(unsigned char *to, int tlen, + const unsigned char *f, int fl, + int rsa_len); +int PKCS1_MGF1(unsigned char *mask, long len, const unsigned char *seed, + long seedlen, const EVP_MD *dgst); +int RSA_padding_add_PKCS1_OAEP(unsigned char *to, int tlen, + const unsigned char *f, int fl, + const unsigned char *p, int pl); +int RSA_padding_check_PKCS1_OAEP(unsigned char *to, int tlen, + const unsigned char *f, int fl, int rsa_len, + const unsigned char *p, int pl); +int RSA_padding_add_PKCS1_OAEP_mgf1(unsigned char *to, int tlen, + const unsigned char *from, int flen, + const unsigned char *param, int plen, + const EVP_MD *md, const EVP_MD *mgf1md); +int RSA_padding_check_PKCS1_OAEP_mgf1(unsigned char *to, int tlen, + const unsigned char *from, int flen, + int num, const unsigned char *param, + int plen, const EVP_MD *md, + const EVP_MD *mgf1md); +int RSA_padding_add_SSLv23(unsigned char *to, int tlen, + const unsigned char *f, int fl); +int RSA_padding_check_SSLv23(unsigned char *to, int tlen, + const unsigned char *f, int fl, int rsa_len); +int RSA_padding_add_none(unsigned char *to, int tlen, const unsigned char *f, + int fl); +int RSA_padding_check_none(unsigned char *to, int tlen, + const unsigned char *f, int fl, int rsa_len); +int RSA_padding_add_X931(unsigned char *to, int tlen, const unsigned char *f, + int fl); +int RSA_padding_check_X931(unsigned char *to, int tlen, + const unsigned char *f, int fl, int rsa_len); +int RSA_X931_hash_id(int nid); + +int RSA_verify_PKCS1_PSS(RSA *rsa, const unsigned char *mHash, + const EVP_MD *Hash, const unsigned char *EM, + int sLen); +int RSA_padding_add_PKCS1_PSS(RSA *rsa, unsigned char *EM, + const unsigned char *mHash, const EVP_MD *Hash, + int sLen); + +int RSA_verify_PKCS1_PSS_mgf1(RSA *rsa, const unsigned char *mHash, + const EVP_MD *Hash, const EVP_MD *mgf1Hash, + const unsigned char *EM, int sLen); + +int RSA_padding_add_PKCS1_PSS_mgf1(RSA *rsa, unsigned char *EM, + const unsigned char *mHash, + const EVP_MD *Hash, const EVP_MD *mgf1Hash, + int sLen); + +int RSA_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func); +int RSA_set_ex_data(RSA *r, int idx, void *arg); +void *RSA_get_ex_data(const RSA *r, int idx); + +RSA *RSAPublicKey_dup(RSA *rsa); +RSA *RSAPrivateKey_dup(RSA *rsa); + +/* + * If this flag is set the RSA method is FIPS compliant and can be used in + * FIPS mode. This is set in the validated module method. If an application + * sets this flag in its own methods it is its responsibility to ensure the + * result is compliant. + */ + +# define RSA_FLAG_FIPS_METHOD 0x0400 + +/* + * If this flag is set the operations normally disabled in FIPS mode are + * permitted it is then the applications responsibility to ensure that the + * usage is compliant. + */ + +# define RSA_FLAG_NON_FIPS_ALLOW 0x0400 +/* + * Application has decided PRNG is good enough to generate a key: don't + * check. + */ +# define RSA_FLAG_CHECKED 0x0800 + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_RSA_strings(void); + +/* Error codes for the RSA functions. */ + +/* Function codes. */ +# define RSA_F_CHECK_PADDING_MD 140 +# define RSA_F_DO_RSA_PRINT 146 +# define RSA_F_INT_RSA_VERIFY 145 +# define RSA_F_MEMORY_LOCK 100 +# define RSA_F_OLD_RSA_PRIV_DECODE 147 +# define RSA_F_PKEY_RSA_CTRL 143 +# define RSA_F_PKEY_RSA_CTRL_STR 144 +# define RSA_F_PKEY_RSA_SIGN 142 +# define RSA_F_PKEY_RSA_VERIFY 154 +# define RSA_F_PKEY_RSA_VERIFYRECOVER 141 +# define RSA_F_RSA_ALGOR_TO_MD 157 +# define RSA_F_RSA_BUILTIN_KEYGEN 129 +# define RSA_F_RSA_CHECK_KEY 123 +# define RSA_F_RSA_CMS_DECRYPT 158 +# define RSA_F_RSA_EAY_PRIVATE_DECRYPT 101 +# define RSA_F_RSA_EAY_PRIVATE_ENCRYPT 102 +# define RSA_F_RSA_EAY_PUBLIC_DECRYPT 103 +# define RSA_F_RSA_EAY_PUBLIC_ENCRYPT 104 +# define RSA_F_RSA_GENERATE_KEY 105 +# define RSA_F_RSA_GENERATE_KEY_EX 155 +# define RSA_F_RSA_ITEM_VERIFY 156 +# define RSA_F_RSA_MEMORY_LOCK 130 +# define RSA_F_RSA_MGF1_TO_MD 159 +# define RSA_F_RSA_NEW_METHOD 106 +# define RSA_F_RSA_NULL 124 +# define RSA_F_RSA_NULL_MOD_EXP 131 +# define RSA_F_RSA_NULL_PRIVATE_DECRYPT 132 +# define RSA_F_RSA_NULL_PRIVATE_ENCRYPT 133 +# define RSA_F_RSA_NULL_PUBLIC_DECRYPT 134 +# define RSA_F_RSA_NULL_PUBLIC_ENCRYPT 135 +# define RSA_F_RSA_PADDING_ADD_NONE 107 +# define RSA_F_RSA_PADDING_ADD_PKCS1_OAEP 121 +# define RSA_F_RSA_PADDING_ADD_PKCS1_OAEP_MGF1 160 +# define RSA_F_RSA_PADDING_ADD_PKCS1_PSS 125 +# define RSA_F_RSA_PADDING_ADD_PKCS1_PSS_MGF1 148 +# define RSA_F_RSA_PADDING_ADD_PKCS1_TYPE_1 108 +# define RSA_F_RSA_PADDING_ADD_PKCS1_TYPE_2 109 +# define RSA_F_RSA_PADDING_ADD_SSLV23 110 +# define RSA_F_RSA_PADDING_ADD_X931 127 +# define RSA_F_RSA_PADDING_CHECK_NONE 111 +# define RSA_F_RSA_PADDING_CHECK_PKCS1_OAEP 122 +# define RSA_F_RSA_PADDING_CHECK_PKCS1_OAEP_MGF1 161 +# define RSA_F_RSA_PADDING_CHECK_PKCS1_TYPE_1 112 +# define RSA_F_RSA_PADDING_CHECK_PKCS1_TYPE_2 113 +# define RSA_F_RSA_PADDING_CHECK_SSLV23 114 +# define RSA_F_RSA_PADDING_CHECK_X931 128 +# define RSA_F_RSA_PRINT 115 +# define RSA_F_RSA_PRINT_FP 116 +# define RSA_F_RSA_PRIVATE_DECRYPT 150 +# define RSA_F_RSA_PRIVATE_ENCRYPT 151 +# define RSA_F_RSA_PRIV_DECODE 137 +# define RSA_F_RSA_PRIV_ENCODE 138 +# define RSA_F_RSA_PSS_TO_CTX 162 +# define RSA_F_RSA_PUBLIC_DECRYPT 152 +# define RSA_F_RSA_PUBLIC_ENCRYPT 153 +# define RSA_F_RSA_PUB_DECODE 139 +# define RSA_F_RSA_SETUP_BLINDING 136 +# define RSA_F_RSA_SIGN 117 +# define RSA_F_RSA_SIGN_ASN1_OCTET_STRING 118 +# define RSA_F_RSA_VERIFY 119 +# define RSA_F_RSA_VERIFY_ASN1_OCTET_STRING 120 +# define RSA_F_RSA_VERIFY_PKCS1_PSS 126 +# define RSA_F_RSA_VERIFY_PKCS1_PSS_MGF1 149 + +/* Reason codes. */ +# define RSA_R_ALGORITHM_MISMATCH 100 +# define RSA_R_BAD_E_VALUE 101 +# define RSA_R_BAD_FIXED_HEADER_DECRYPT 102 +# define RSA_R_BAD_PAD_BYTE_COUNT 103 +# define RSA_R_BAD_SIGNATURE 104 +# define RSA_R_BLOCK_TYPE_IS_NOT_01 106 +# define RSA_R_BLOCK_TYPE_IS_NOT_02 107 +# define RSA_R_DATA_GREATER_THAN_MOD_LEN 108 +# define RSA_R_DATA_TOO_LARGE 109 +# define RSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE 110 +# define RSA_R_DATA_TOO_LARGE_FOR_MODULUS 132 +# define RSA_R_DATA_TOO_SMALL 111 +# define RSA_R_DATA_TOO_SMALL_FOR_KEY_SIZE 122 +# define RSA_R_DIGEST_DOES_NOT_MATCH 166 +# define RSA_R_DIGEST_TOO_BIG_FOR_RSA_KEY 112 +# define RSA_R_DMP1_NOT_CONGRUENT_TO_D 124 +# define RSA_R_DMQ1_NOT_CONGRUENT_TO_D 125 +# define RSA_R_D_E_NOT_CONGRUENT_TO_1 123 +# define RSA_R_FIRST_OCTET_INVALID 133 +# define RSA_R_ILLEGAL_OR_UNSUPPORTED_PADDING_MODE 144 +# define RSA_R_INVALID_DIGEST 160 +# define RSA_R_INVALID_DIGEST_LENGTH 143 +# define RSA_R_INVALID_HEADER 137 +# define RSA_R_INVALID_KEYBITS 145 +# define RSA_R_INVALID_LABEL 161 +# define RSA_R_INVALID_MESSAGE_LENGTH 131 +# define RSA_R_INVALID_MGF1_MD 156 +# define RSA_R_INVALID_OAEP_PARAMETERS 162 +# define RSA_R_INVALID_PADDING 138 +# define RSA_R_INVALID_PADDING_MODE 141 +# define RSA_R_INVALID_PSS_PARAMETERS 149 +# define RSA_R_INVALID_PSS_SALTLEN 146 +# define RSA_R_INVALID_SALT_LENGTH 150 +# define RSA_R_INVALID_TRAILER 139 +# define RSA_R_INVALID_X931_DIGEST 142 +# define RSA_R_IQMP_NOT_INVERSE_OF_Q 126 +# define RSA_R_KEY_SIZE_TOO_SMALL 120 +# define RSA_R_LAST_OCTET_INVALID 134 +# define RSA_R_MODULUS_TOO_LARGE 105 +# define RSA_R_NON_FIPS_RSA_METHOD 157 +# define RSA_R_NO_PUBLIC_EXPONENT 140 +# define RSA_R_NULL_BEFORE_BLOCK_MISSING 113 +# define RSA_R_N_DOES_NOT_EQUAL_P_Q 127 +# define RSA_R_OAEP_DECODING_ERROR 121 +# define RSA_R_OPERATION_NOT_ALLOWED_IN_FIPS_MODE 158 +# define RSA_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE 148 +# define RSA_R_PADDING_CHECK_FAILED 114 +# define RSA_R_PKCS_DECODING_ERROR 159 +# define RSA_R_P_NOT_PRIME 128 +# define RSA_R_Q_NOT_PRIME 129 +# define RSA_R_RSA_OPERATIONS_NOT_SUPPORTED 130 +# define RSA_R_SLEN_CHECK_FAILED 136 +# define RSA_R_SLEN_RECOVERY_FAILED 135 +# define RSA_R_SSLV3_ROLLBACK_ATTACK 115 +# define RSA_R_THE_ASN1_OBJECT_IDENTIFIER_IS_NOT_KNOWN_FOR_THIS_MD 116 +# define RSA_R_UNKNOWN_ALGORITHM_TYPE 117 +# define RSA_R_UNKNOWN_DIGEST 163 +# define RSA_R_UNKNOWN_MASK_DIGEST 151 +# define RSA_R_UNKNOWN_PADDING_TYPE 118 +# define RSA_R_UNKNOWN_PSS_DIGEST 152 +# define RSA_R_UNSUPPORTED_ENCRYPTION_TYPE 164 +# define RSA_R_UNSUPPORTED_LABEL_SOURCE 165 +# define RSA_R_UNSUPPORTED_MASK_ALGORITHM 153 +# define RSA_R_UNSUPPORTED_MASK_PARAMETER 154 +# define RSA_R_UNSUPPORTED_SIGNATURE_TYPE 155 +# define RSA_R_VALUE_MISSING 147 +# define RSA_R_WRONG_SIGNATURE_LENGTH 119 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/ext/openssl-osx/include/openssl/safestack.h b/ext/openssl-osx/include/openssl/safestack.h new file mode 100644 index 00000000..1d4f87ea --- /dev/null +++ b/ext/openssl-osx/include/openssl/safestack.h @@ -0,0 +1,2672 @@ +/* ==================================================================== + * Copyright (c) 1999 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_SAFESTACK_H +# define HEADER_SAFESTACK_H + +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# ifndef CHECKED_PTR_OF +# define CHECKED_PTR_OF(type, p) \ + ((void*) (1 ? p : (type*)0)) +# endif + +/* + * In C++ we get problems because an explicit cast is needed from (void *) we + * use CHECKED_STACK_OF to ensure the correct type is passed in the macros + * below. + */ + +# define CHECKED_STACK_OF(type, p) \ + ((_STACK*) (1 ? p : (STACK_OF(type)*)0)) + +# define CHECKED_SK_COPY_FUNC(type, p) \ + ((void *(*)(void *)) ((1 ? p : (type *(*)(const type *))0))) + +# define CHECKED_SK_FREE_FUNC(type, p) \ + ((void (*)(void *)) ((1 ? p : (void (*)(type *))0))) + +# define CHECKED_SK_CMP_FUNC(type, p) \ + ((int (*)(const void *, const void *)) \ + ((1 ? p : (int (*)(const type * const *, const type * const *))0))) + +# define STACK_OF(type) struct stack_st_##type +# define PREDECLARE_STACK_OF(type) STACK_OF(type); + +# define DECLARE_STACK_OF(type) \ +STACK_OF(type) \ + { \ + _STACK stack; \ + }; +# define DECLARE_SPECIAL_STACK_OF(type, type2) \ +STACK_OF(type) \ + { \ + _STACK stack; \ + }; + +/* nada (obsolete in new safestack approach)*/ +# define IMPLEMENT_STACK_OF(type) + +/*- + * Strings are special: normally an lhash entry will point to a single + * (somewhat) mutable object. In the case of strings: + * + * a) Instead of a single char, there is an array of chars, NUL-terminated. + * b) The string may have be immutable. + * + * So, they need their own declarations. Especially important for + * type-checking tools, such as Deputy. + * + * In practice, however, it appears to be hard to have a const + * string. For now, I'm settling for dealing with the fact it is a + * string at all. + */ +typedef char *OPENSSL_STRING; + +typedef const char *OPENSSL_CSTRING; + +/* + * Confusingly, LHASH_OF(STRING) deals with char ** throughout, but + * STACK_OF(STRING) is really more like STACK_OF(char), only, as mentioned + * above, instead of a single char each entry is a NUL-terminated array of + * chars. So, we have to implement STRING specially for STACK_OF. This is + * dealt with in the autogenerated macros below. + */ + +DECLARE_SPECIAL_STACK_OF(OPENSSL_STRING, char) + +/* + * Similarly, we sometimes use a block of characters, NOT nul-terminated. + * These should also be distinguished from "normal" stacks. + */ +typedef void *OPENSSL_BLOCK; +DECLARE_SPECIAL_STACK_OF(OPENSSL_BLOCK, void) + +/* + * SKM_sk_... stack macros are internal to safestack.h: never use them + * directly, use sk__... instead + */ +# define SKM_sk_new(type, cmp) \ + ((STACK_OF(type) *)sk_new(CHECKED_SK_CMP_FUNC(type, cmp))) +# define SKM_sk_new_null(type) \ + ((STACK_OF(type) *)sk_new_null()) +# define SKM_sk_free(type, st) \ + sk_free(CHECKED_STACK_OF(type, st)) +# define SKM_sk_num(type, st) \ + sk_num(CHECKED_STACK_OF(type, st)) +# define SKM_sk_value(type, st,i) \ + ((type *)sk_value(CHECKED_STACK_OF(type, st), i)) +# define SKM_sk_set(type, st,i,val) \ + sk_set(CHECKED_STACK_OF(type, st), i, CHECKED_PTR_OF(type, val)) +# define SKM_sk_zero(type, st) \ + sk_zero(CHECKED_STACK_OF(type, st)) +# define SKM_sk_push(type, st, val) \ + sk_push(CHECKED_STACK_OF(type, st), CHECKED_PTR_OF(type, val)) +# define SKM_sk_unshift(type, st, val) \ + sk_unshift(CHECKED_STACK_OF(type, st), CHECKED_PTR_OF(type, val)) +# define SKM_sk_find(type, st, val) \ + sk_find(CHECKED_STACK_OF(type, st), CHECKED_PTR_OF(type, val)) +# define SKM_sk_find_ex(type, st, val) \ + sk_find_ex(CHECKED_STACK_OF(type, st), \ + CHECKED_PTR_OF(type, val)) +# define SKM_sk_delete(type, st, i) \ + (type *)sk_delete(CHECKED_STACK_OF(type, st), i) +# define SKM_sk_delete_ptr(type, st, ptr) \ + (type *)sk_delete_ptr(CHECKED_STACK_OF(type, st), CHECKED_PTR_OF(type, ptr)) +# define SKM_sk_insert(type, st,val, i) \ + sk_insert(CHECKED_STACK_OF(type, st), CHECKED_PTR_OF(type, val), i) +# define SKM_sk_set_cmp_func(type, st, cmp) \ + ((int (*)(const type * const *,const type * const *)) \ + sk_set_cmp_func(CHECKED_STACK_OF(type, st), CHECKED_SK_CMP_FUNC(type, cmp))) +# define SKM_sk_dup(type, st) \ + (STACK_OF(type) *)sk_dup(CHECKED_STACK_OF(type, st)) +# define SKM_sk_pop_free(type, st, free_func) \ + sk_pop_free(CHECKED_STACK_OF(type, st), CHECKED_SK_FREE_FUNC(type, free_func)) +# define SKM_sk_deep_copy(type, st, copy_func, free_func) \ + (STACK_OF(type) *)sk_deep_copy(CHECKED_STACK_OF(type, st), CHECKED_SK_COPY_FUNC(type, copy_func), CHECKED_SK_FREE_FUNC(type, free_func)) +# define SKM_sk_shift(type, st) \ + (type *)sk_shift(CHECKED_STACK_OF(type, st)) +# define SKM_sk_pop(type, st) \ + (type *)sk_pop(CHECKED_STACK_OF(type, st)) +# define SKM_sk_sort(type, st) \ + sk_sort(CHECKED_STACK_OF(type, st)) +# define SKM_sk_is_sorted(type, st) \ + sk_is_sorted(CHECKED_STACK_OF(type, st)) +# define SKM_ASN1_SET_OF_d2i(type, st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + (STACK_OF(type) *)d2i_ASN1_SET( \ + (STACK_OF(OPENSSL_BLOCK) **)CHECKED_PTR_OF(STACK_OF(type)*, st), \ + pp, length, \ + CHECKED_D2I_OF(type, d2i_func), \ + CHECKED_SK_FREE_FUNC(type, free_func), \ + ex_tag, ex_class) +# define SKM_ASN1_SET_OF_i2d(type, st, pp, i2d_func, ex_tag, ex_class, is_set) \ + i2d_ASN1_SET((STACK_OF(OPENSSL_BLOCK) *)CHECKED_STACK_OF(type, st), pp, \ + CHECKED_I2D_OF(type, i2d_func), \ + ex_tag, ex_class, is_set) +# define SKM_ASN1_seq_pack(type, st, i2d_func, buf, len) \ + ASN1_seq_pack(CHECKED_PTR_OF(STACK_OF(type), st), \ + CHECKED_I2D_OF(type, i2d_func), buf, len) +# define SKM_ASN1_seq_unpack(type, buf, len, d2i_func, free_func) \ + (STACK_OF(type) *)ASN1_seq_unpack(buf, len, CHECKED_D2I_OF(type, d2i_func), CHECKED_SK_FREE_FUNC(type, free_func)) +# define SKM_PKCS12_decrypt_d2i(type, algor, d2i_func, free_func, pass, passlen, oct, seq) \ + (STACK_OF(type) *)PKCS12_decrypt_d2i(algor, \ + CHECKED_D2I_OF(type, d2i_func), \ + CHECKED_SK_FREE_FUNC(type, free_func), \ + pass, passlen, oct, seq) +/* + * This block of defines is updated by util/mkstack.pl, please do not touch! + */ +# define sk_ACCESS_DESCRIPTION_new(cmp) SKM_sk_new(ACCESS_DESCRIPTION, (cmp)) +# define sk_ACCESS_DESCRIPTION_new_null() SKM_sk_new_null(ACCESS_DESCRIPTION) +# define sk_ACCESS_DESCRIPTION_free(st) SKM_sk_free(ACCESS_DESCRIPTION, (st)) +# define sk_ACCESS_DESCRIPTION_num(st) SKM_sk_num(ACCESS_DESCRIPTION, (st)) +# define sk_ACCESS_DESCRIPTION_value(st, i) SKM_sk_value(ACCESS_DESCRIPTION, (st), (i)) +# define sk_ACCESS_DESCRIPTION_set(st, i, val) SKM_sk_set(ACCESS_DESCRIPTION, (st), (i), (val)) +# define sk_ACCESS_DESCRIPTION_zero(st) SKM_sk_zero(ACCESS_DESCRIPTION, (st)) +# define sk_ACCESS_DESCRIPTION_push(st, val) SKM_sk_push(ACCESS_DESCRIPTION, (st), (val)) +# define sk_ACCESS_DESCRIPTION_unshift(st, val) SKM_sk_unshift(ACCESS_DESCRIPTION, (st), (val)) +# define sk_ACCESS_DESCRIPTION_find(st, val) SKM_sk_find(ACCESS_DESCRIPTION, (st), (val)) +# define sk_ACCESS_DESCRIPTION_find_ex(st, val) SKM_sk_find_ex(ACCESS_DESCRIPTION, (st), (val)) +# define sk_ACCESS_DESCRIPTION_delete(st, i) SKM_sk_delete(ACCESS_DESCRIPTION, (st), (i)) +# define sk_ACCESS_DESCRIPTION_delete_ptr(st, ptr) SKM_sk_delete_ptr(ACCESS_DESCRIPTION, (st), (ptr)) +# define sk_ACCESS_DESCRIPTION_insert(st, val, i) SKM_sk_insert(ACCESS_DESCRIPTION, (st), (val), (i)) +# define sk_ACCESS_DESCRIPTION_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ACCESS_DESCRIPTION, (st), (cmp)) +# define sk_ACCESS_DESCRIPTION_dup(st) SKM_sk_dup(ACCESS_DESCRIPTION, st) +# define sk_ACCESS_DESCRIPTION_pop_free(st, free_func) SKM_sk_pop_free(ACCESS_DESCRIPTION, (st), (free_func)) +# define sk_ACCESS_DESCRIPTION_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(ACCESS_DESCRIPTION, (st), (copy_func), (free_func)) +# define sk_ACCESS_DESCRIPTION_shift(st) SKM_sk_shift(ACCESS_DESCRIPTION, (st)) +# define sk_ACCESS_DESCRIPTION_pop(st) SKM_sk_pop(ACCESS_DESCRIPTION, (st)) +# define sk_ACCESS_DESCRIPTION_sort(st) SKM_sk_sort(ACCESS_DESCRIPTION, (st)) +# define sk_ACCESS_DESCRIPTION_is_sorted(st) SKM_sk_is_sorted(ACCESS_DESCRIPTION, (st)) +# define sk_ASIdOrRange_new(cmp) SKM_sk_new(ASIdOrRange, (cmp)) +# define sk_ASIdOrRange_new_null() SKM_sk_new_null(ASIdOrRange) +# define sk_ASIdOrRange_free(st) SKM_sk_free(ASIdOrRange, (st)) +# define sk_ASIdOrRange_num(st) SKM_sk_num(ASIdOrRange, (st)) +# define sk_ASIdOrRange_value(st, i) SKM_sk_value(ASIdOrRange, (st), (i)) +# define sk_ASIdOrRange_set(st, i, val) SKM_sk_set(ASIdOrRange, (st), (i), (val)) +# define sk_ASIdOrRange_zero(st) SKM_sk_zero(ASIdOrRange, (st)) +# define sk_ASIdOrRange_push(st, val) SKM_sk_push(ASIdOrRange, (st), (val)) +# define sk_ASIdOrRange_unshift(st, val) SKM_sk_unshift(ASIdOrRange, (st), (val)) +# define sk_ASIdOrRange_find(st, val) SKM_sk_find(ASIdOrRange, (st), (val)) +# define sk_ASIdOrRange_find_ex(st, val) SKM_sk_find_ex(ASIdOrRange, (st), (val)) +# define sk_ASIdOrRange_delete(st, i) SKM_sk_delete(ASIdOrRange, (st), (i)) +# define sk_ASIdOrRange_delete_ptr(st, ptr) SKM_sk_delete_ptr(ASIdOrRange, (st), (ptr)) +# define sk_ASIdOrRange_insert(st, val, i) SKM_sk_insert(ASIdOrRange, (st), (val), (i)) +# define sk_ASIdOrRange_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ASIdOrRange, (st), (cmp)) +# define sk_ASIdOrRange_dup(st) SKM_sk_dup(ASIdOrRange, st) +# define sk_ASIdOrRange_pop_free(st, free_func) SKM_sk_pop_free(ASIdOrRange, (st), (free_func)) +# define sk_ASIdOrRange_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(ASIdOrRange, (st), (copy_func), (free_func)) +# define sk_ASIdOrRange_shift(st) SKM_sk_shift(ASIdOrRange, (st)) +# define sk_ASIdOrRange_pop(st) SKM_sk_pop(ASIdOrRange, (st)) +# define sk_ASIdOrRange_sort(st) SKM_sk_sort(ASIdOrRange, (st)) +# define sk_ASIdOrRange_is_sorted(st) SKM_sk_is_sorted(ASIdOrRange, (st)) +# define sk_ASN1_GENERALSTRING_new(cmp) SKM_sk_new(ASN1_GENERALSTRING, (cmp)) +# define sk_ASN1_GENERALSTRING_new_null() SKM_sk_new_null(ASN1_GENERALSTRING) +# define sk_ASN1_GENERALSTRING_free(st) SKM_sk_free(ASN1_GENERALSTRING, (st)) +# define sk_ASN1_GENERALSTRING_num(st) SKM_sk_num(ASN1_GENERALSTRING, (st)) +# define sk_ASN1_GENERALSTRING_value(st, i) SKM_sk_value(ASN1_GENERALSTRING, (st), (i)) +# define sk_ASN1_GENERALSTRING_set(st, i, val) SKM_sk_set(ASN1_GENERALSTRING, (st), (i), (val)) +# define sk_ASN1_GENERALSTRING_zero(st) SKM_sk_zero(ASN1_GENERALSTRING, (st)) +# define sk_ASN1_GENERALSTRING_push(st, val) SKM_sk_push(ASN1_GENERALSTRING, (st), (val)) +# define sk_ASN1_GENERALSTRING_unshift(st, val) SKM_sk_unshift(ASN1_GENERALSTRING, (st), (val)) +# define sk_ASN1_GENERALSTRING_find(st, val) SKM_sk_find(ASN1_GENERALSTRING, (st), (val)) +# define sk_ASN1_GENERALSTRING_find_ex(st, val) SKM_sk_find_ex(ASN1_GENERALSTRING, (st), (val)) +# define sk_ASN1_GENERALSTRING_delete(st, i) SKM_sk_delete(ASN1_GENERALSTRING, (st), (i)) +# define sk_ASN1_GENERALSTRING_delete_ptr(st, ptr) SKM_sk_delete_ptr(ASN1_GENERALSTRING, (st), (ptr)) +# define sk_ASN1_GENERALSTRING_insert(st, val, i) SKM_sk_insert(ASN1_GENERALSTRING, (st), (val), (i)) +# define sk_ASN1_GENERALSTRING_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ASN1_GENERALSTRING, (st), (cmp)) +# define sk_ASN1_GENERALSTRING_dup(st) SKM_sk_dup(ASN1_GENERALSTRING, st) +# define sk_ASN1_GENERALSTRING_pop_free(st, free_func) SKM_sk_pop_free(ASN1_GENERALSTRING, (st), (free_func)) +# define sk_ASN1_GENERALSTRING_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(ASN1_GENERALSTRING, (st), (copy_func), (free_func)) +# define sk_ASN1_GENERALSTRING_shift(st) SKM_sk_shift(ASN1_GENERALSTRING, (st)) +# define sk_ASN1_GENERALSTRING_pop(st) SKM_sk_pop(ASN1_GENERALSTRING, (st)) +# define sk_ASN1_GENERALSTRING_sort(st) SKM_sk_sort(ASN1_GENERALSTRING, (st)) +# define sk_ASN1_GENERALSTRING_is_sorted(st) SKM_sk_is_sorted(ASN1_GENERALSTRING, (st)) +# define sk_ASN1_INTEGER_new(cmp) SKM_sk_new(ASN1_INTEGER, (cmp)) +# define sk_ASN1_INTEGER_new_null() SKM_sk_new_null(ASN1_INTEGER) +# define sk_ASN1_INTEGER_free(st) SKM_sk_free(ASN1_INTEGER, (st)) +# define sk_ASN1_INTEGER_num(st) SKM_sk_num(ASN1_INTEGER, (st)) +# define sk_ASN1_INTEGER_value(st, i) SKM_sk_value(ASN1_INTEGER, (st), (i)) +# define sk_ASN1_INTEGER_set(st, i, val) SKM_sk_set(ASN1_INTEGER, (st), (i), (val)) +# define sk_ASN1_INTEGER_zero(st) SKM_sk_zero(ASN1_INTEGER, (st)) +# define sk_ASN1_INTEGER_push(st, val) SKM_sk_push(ASN1_INTEGER, (st), (val)) +# define sk_ASN1_INTEGER_unshift(st, val) SKM_sk_unshift(ASN1_INTEGER, (st), (val)) +# define sk_ASN1_INTEGER_find(st, val) SKM_sk_find(ASN1_INTEGER, (st), (val)) +# define sk_ASN1_INTEGER_find_ex(st, val) SKM_sk_find_ex(ASN1_INTEGER, (st), (val)) +# define sk_ASN1_INTEGER_delete(st, i) SKM_sk_delete(ASN1_INTEGER, (st), (i)) +# define sk_ASN1_INTEGER_delete_ptr(st, ptr) SKM_sk_delete_ptr(ASN1_INTEGER, (st), (ptr)) +# define sk_ASN1_INTEGER_insert(st, val, i) SKM_sk_insert(ASN1_INTEGER, (st), (val), (i)) +# define sk_ASN1_INTEGER_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ASN1_INTEGER, (st), (cmp)) +# define sk_ASN1_INTEGER_dup(st) SKM_sk_dup(ASN1_INTEGER, st) +# define sk_ASN1_INTEGER_pop_free(st, free_func) SKM_sk_pop_free(ASN1_INTEGER, (st), (free_func)) +# define sk_ASN1_INTEGER_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(ASN1_INTEGER, (st), (copy_func), (free_func)) +# define sk_ASN1_INTEGER_shift(st) SKM_sk_shift(ASN1_INTEGER, (st)) +# define sk_ASN1_INTEGER_pop(st) SKM_sk_pop(ASN1_INTEGER, (st)) +# define sk_ASN1_INTEGER_sort(st) SKM_sk_sort(ASN1_INTEGER, (st)) +# define sk_ASN1_INTEGER_is_sorted(st) SKM_sk_is_sorted(ASN1_INTEGER, (st)) +# define sk_ASN1_OBJECT_new(cmp) SKM_sk_new(ASN1_OBJECT, (cmp)) +# define sk_ASN1_OBJECT_new_null() SKM_sk_new_null(ASN1_OBJECT) +# define sk_ASN1_OBJECT_free(st) SKM_sk_free(ASN1_OBJECT, (st)) +# define sk_ASN1_OBJECT_num(st) SKM_sk_num(ASN1_OBJECT, (st)) +# define sk_ASN1_OBJECT_value(st, i) SKM_sk_value(ASN1_OBJECT, (st), (i)) +# define sk_ASN1_OBJECT_set(st, i, val) SKM_sk_set(ASN1_OBJECT, (st), (i), (val)) +# define sk_ASN1_OBJECT_zero(st) SKM_sk_zero(ASN1_OBJECT, (st)) +# define sk_ASN1_OBJECT_push(st, val) SKM_sk_push(ASN1_OBJECT, (st), (val)) +# define sk_ASN1_OBJECT_unshift(st, val) SKM_sk_unshift(ASN1_OBJECT, (st), (val)) +# define sk_ASN1_OBJECT_find(st, val) SKM_sk_find(ASN1_OBJECT, (st), (val)) +# define sk_ASN1_OBJECT_find_ex(st, val) SKM_sk_find_ex(ASN1_OBJECT, (st), (val)) +# define sk_ASN1_OBJECT_delete(st, i) SKM_sk_delete(ASN1_OBJECT, (st), (i)) +# define sk_ASN1_OBJECT_delete_ptr(st, ptr) SKM_sk_delete_ptr(ASN1_OBJECT, (st), (ptr)) +# define sk_ASN1_OBJECT_insert(st, val, i) SKM_sk_insert(ASN1_OBJECT, (st), (val), (i)) +# define sk_ASN1_OBJECT_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ASN1_OBJECT, (st), (cmp)) +# define sk_ASN1_OBJECT_dup(st) SKM_sk_dup(ASN1_OBJECT, st) +# define sk_ASN1_OBJECT_pop_free(st, free_func) SKM_sk_pop_free(ASN1_OBJECT, (st), (free_func)) +# define sk_ASN1_OBJECT_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(ASN1_OBJECT, (st), (copy_func), (free_func)) +# define sk_ASN1_OBJECT_shift(st) SKM_sk_shift(ASN1_OBJECT, (st)) +# define sk_ASN1_OBJECT_pop(st) SKM_sk_pop(ASN1_OBJECT, (st)) +# define sk_ASN1_OBJECT_sort(st) SKM_sk_sort(ASN1_OBJECT, (st)) +# define sk_ASN1_OBJECT_is_sorted(st) SKM_sk_is_sorted(ASN1_OBJECT, (st)) +# define sk_ASN1_STRING_TABLE_new(cmp) SKM_sk_new(ASN1_STRING_TABLE, (cmp)) +# define sk_ASN1_STRING_TABLE_new_null() SKM_sk_new_null(ASN1_STRING_TABLE) +# define sk_ASN1_STRING_TABLE_free(st) SKM_sk_free(ASN1_STRING_TABLE, (st)) +# define sk_ASN1_STRING_TABLE_num(st) SKM_sk_num(ASN1_STRING_TABLE, (st)) +# define sk_ASN1_STRING_TABLE_value(st, i) SKM_sk_value(ASN1_STRING_TABLE, (st), (i)) +# define sk_ASN1_STRING_TABLE_set(st, i, val) SKM_sk_set(ASN1_STRING_TABLE, (st), (i), (val)) +# define sk_ASN1_STRING_TABLE_zero(st) SKM_sk_zero(ASN1_STRING_TABLE, (st)) +# define sk_ASN1_STRING_TABLE_push(st, val) SKM_sk_push(ASN1_STRING_TABLE, (st), (val)) +# define sk_ASN1_STRING_TABLE_unshift(st, val) SKM_sk_unshift(ASN1_STRING_TABLE, (st), (val)) +# define sk_ASN1_STRING_TABLE_find(st, val) SKM_sk_find(ASN1_STRING_TABLE, (st), (val)) +# define sk_ASN1_STRING_TABLE_find_ex(st, val) SKM_sk_find_ex(ASN1_STRING_TABLE, (st), (val)) +# define sk_ASN1_STRING_TABLE_delete(st, i) SKM_sk_delete(ASN1_STRING_TABLE, (st), (i)) +# define sk_ASN1_STRING_TABLE_delete_ptr(st, ptr) SKM_sk_delete_ptr(ASN1_STRING_TABLE, (st), (ptr)) +# define sk_ASN1_STRING_TABLE_insert(st, val, i) SKM_sk_insert(ASN1_STRING_TABLE, (st), (val), (i)) +# define sk_ASN1_STRING_TABLE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ASN1_STRING_TABLE, (st), (cmp)) +# define sk_ASN1_STRING_TABLE_dup(st) SKM_sk_dup(ASN1_STRING_TABLE, st) +# define sk_ASN1_STRING_TABLE_pop_free(st, free_func) SKM_sk_pop_free(ASN1_STRING_TABLE, (st), (free_func)) +# define sk_ASN1_STRING_TABLE_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(ASN1_STRING_TABLE, (st), (copy_func), (free_func)) +# define sk_ASN1_STRING_TABLE_shift(st) SKM_sk_shift(ASN1_STRING_TABLE, (st)) +# define sk_ASN1_STRING_TABLE_pop(st) SKM_sk_pop(ASN1_STRING_TABLE, (st)) +# define sk_ASN1_STRING_TABLE_sort(st) SKM_sk_sort(ASN1_STRING_TABLE, (st)) +# define sk_ASN1_STRING_TABLE_is_sorted(st) SKM_sk_is_sorted(ASN1_STRING_TABLE, (st)) +# define sk_ASN1_TYPE_new(cmp) SKM_sk_new(ASN1_TYPE, (cmp)) +# define sk_ASN1_TYPE_new_null() SKM_sk_new_null(ASN1_TYPE) +# define sk_ASN1_TYPE_free(st) SKM_sk_free(ASN1_TYPE, (st)) +# define sk_ASN1_TYPE_num(st) SKM_sk_num(ASN1_TYPE, (st)) +# define sk_ASN1_TYPE_value(st, i) SKM_sk_value(ASN1_TYPE, (st), (i)) +# define sk_ASN1_TYPE_set(st, i, val) SKM_sk_set(ASN1_TYPE, (st), (i), (val)) +# define sk_ASN1_TYPE_zero(st) SKM_sk_zero(ASN1_TYPE, (st)) +# define sk_ASN1_TYPE_push(st, val) SKM_sk_push(ASN1_TYPE, (st), (val)) +# define sk_ASN1_TYPE_unshift(st, val) SKM_sk_unshift(ASN1_TYPE, (st), (val)) +# define sk_ASN1_TYPE_find(st, val) SKM_sk_find(ASN1_TYPE, (st), (val)) +# define sk_ASN1_TYPE_find_ex(st, val) SKM_sk_find_ex(ASN1_TYPE, (st), (val)) +# define sk_ASN1_TYPE_delete(st, i) SKM_sk_delete(ASN1_TYPE, (st), (i)) +# define sk_ASN1_TYPE_delete_ptr(st, ptr) SKM_sk_delete_ptr(ASN1_TYPE, (st), (ptr)) +# define sk_ASN1_TYPE_insert(st, val, i) SKM_sk_insert(ASN1_TYPE, (st), (val), (i)) +# define sk_ASN1_TYPE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ASN1_TYPE, (st), (cmp)) +# define sk_ASN1_TYPE_dup(st) SKM_sk_dup(ASN1_TYPE, st) +# define sk_ASN1_TYPE_pop_free(st, free_func) SKM_sk_pop_free(ASN1_TYPE, (st), (free_func)) +# define sk_ASN1_TYPE_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(ASN1_TYPE, (st), (copy_func), (free_func)) +# define sk_ASN1_TYPE_shift(st) SKM_sk_shift(ASN1_TYPE, (st)) +# define sk_ASN1_TYPE_pop(st) SKM_sk_pop(ASN1_TYPE, (st)) +# define sk_ASN1_TYPE_sort(st) SKM_sk_sort(ASN1_TYPE, (st)) +# define sk_ASN1_TYPE_is_sorted(st) SKM_sk_is_sorted(ASN1_TYPE, (st)) +# define sk_ASN1_UTF8STRING_new(cmp) SKM_sk_new(ASN1_UTF8STRING, (cmp)) +# define sk_ASN1_UTF8STRING_new_null() SKM_sk_new_null(ASN1_UTF8STRING) +# define sk_ASN1_UTF8STRING_free(st) SKM_sk_free(ASN1_UTF8STRING, (st)) +# define sk_ASN1_UTF8STRING_num(st) SKM_sk_num(ASN1_UTF8STRING, (st)) +# define sk_ASN1_UTF8STRING_value(st, i) SKM_sk_value(ASN1_UTF8STRING, (st), (i)) +# define sk_ASN1_UTF8STRING_set(st, i, val) SKM_sk_set(ASN1_UTF8STRING, (st), (i), (val)) +# define sk_ASN1_UTF8STRING_zero(st) SKM_sk_zero(ASN1_UTF8STRING, (st)) +# define sk_ASN1_UTF8STRING_push(st, val) SKM_sk_push(ASN1_UTF8STRING, (st), (val)) +# define sk_ASN1_UTF8STRING_unshift(st, val) SKM_sk_unshift(ASN1_UTF8STRING, (st), (val)) +# define sk_ASN1_UTF8STRING_find(st, val) SKM_sk_find(ASN1_UTF8STRING, (st), (val)) +# define sk_ASN1_UTF8STRING_find_ex(st, val) SKM_sk_find_ex(ASN1_UTF8STRING, (st), (val)) +# define sk_ASN1_UTF8STRING_delete(st, i) SKM_sk_delete(ASN1_UTF8STRING, (st), (i)) +# define sk_ASN1_UTF8STRING_delete_ptr(st, ptr) SKM_sk_delete_ptr(ASN1_UTF8STRING, (st), (ptr)) +# define sk_ASN1_UTF8STRING_insert(st, val, i) SKM_sk_insert(ASN1_UTF8STRING, (st), (val), (i)) +# define sk_ASN1_UTF8STRING_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ASN1_UTF8STRING, (st), (cmp)) +# define sk_ASN1_UTF8STRING_dup(st) SKM_sk_dup(ASN1_UTF8STRING, st) +# define sk_ASN1_UTF8STRING_pop_free(st, free_func) SKM_sk_pop_free(ASN1_UTF8STRING, (st), (free_func)) +# define sk_ASN1_UTF8STRING_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(ASN1_UTF8STRING, (st), (copy_func), (free_func)) +# define sk_ASN1_UTF8STRING_shift(st) SKM_sk_shift(ASN1_UTF8STRING, (st)) +# define sk_ASN1_UTF8STRING_pop(st) SKM_sk_pop(ASN1_UTF8STRING, (st)) +# define sk_ASN1_UTF8STRING_sort(st) SKM_sk_sort(ASN1_UTF8STRING, (st)) +# define sk_ASN1_UTF8STRING_is_sorted(st) SKM_sk_is_sorted(ASN1_UTF8STRING, (st)) +# define sk_ASN1_VALUE_new(cmp) SKM_sk_new(ASN1_VALUE, (cmp)) +# define sk_ASN1_VALUE_new_null() SKM_sk_new_null(ASN1_VALUE) +# define sk_ASN1_VALUE_free(st) SKM_sk_free(ASN1_VALUE, (st)) +# define sk_ASN1_VALUE_num(st) SKM_sk_num(ASN1_VALUE, (st)) +# define sk_ASN1_VALUE_value(st, i) SKM_sk_value(ASN1_VALUE, (st), (i)) +# define sk_ASN1_VALUE_set(st, i, val) SKM_sk_set(ASN1_VALUE, (st), (i), (val)) +# define sk_ASN1_VALUE_zero(st) SKM_sk_zero(ASN1_VALUE, (st)) +# define sk_ASN1_VALUE_push(st, val) SKM_sk_push(ASN1_VALUE, (st), (val)) +# define sk_ASN1_VALUE_unshift(st, val) SKM_sk_unshift(ASN1_VALUE, (st), (val)) +# define sk_ASN1_VALUE_find(st, val) SKM_sk_find(ASN1_VALUE, (st), (val)) +# define sk_ASN1_VALUE_find_ex(st, val) SKM_sk_find_ex(ASN1_VALUE, (st), (val)) +# define sk_ASN1_VALUE_delete(st, i) SKM_sk_delete(ASN1_VALUE, (st), (i)) +# define sk_ASN1_VALUE_delete_ptr(st, ptr) SKM_sk_delete_ptr(ASN1_VALUE, (st), (ptr)) +# define sk_ASN1_VALUE_insert(st, val, i) SKM_sk_insert(ASN1_VALUE, (st), (val), (i)) +# define sk_ASN1_VALUE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ASN1_VALUE, (st), (cmp)) +# define sk_ASN1_VALUE_dup(st) SKM_sk_dup(ASN1_VALUE, st) +# define sk_ASN1_VALUE_pop_free(st, free_func) SKM_sk_pop_free(ASN1_VALUE, (st), (free_func)) +# define sk_ASN1_VALUE_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(ASN1_VALUE, (st), (copy_func), (free_func)) +# define sk_ASN1_VALUE_shift(st) SKM_sk_shift(ASN1_VALUE, (st)) +# define sk_ASN1_VALUE_pop(st) SKM_sk_pop(ASN1_VALUE, (st)) +# define sk_ASN1_VALUE_sort(st) SKM_sk_sort(ASN1_VALUE, (st)) +# define sk_ASN1_VALUE_is_sorted(st) SKM_sk_is_sorted(ASN1_VALUE, (st)) +# define sk_BIO_new(cmp) SKM_sk_new(BIO, (cmp)) +# define sk_BIO_new_null() SKM_sk_new_null(BIO) +# define sk_BIO_free(st) SKM_sk_free(BIO, (st)) +# define sk_BIO_num(st) SKM_sk_num(BIO, (st)) +# define sk_BIO_value(st, i) SKM_sk_value(BIO, (st), (i)) +# define sk_BIO_set(st, i, val) SKM_sk_set(BIO, (st), (i), (val)) +# define sk_BIO_zero(st) SKM_sk_zero(BIO, (st)) +# define sk_BIO_push(st, val) SKM_sk_push(BIO, (st), (val)) +# define sk_BIO_unshift(st, val) SKM_sk_unshift(BIO, (st), (val)) +# define sk_BIO_find(st, val) SKM_sk_find(BIO, (st), (val)) +# define sk_BIO_find_ex(st, val) SKM_sk_find_ex(BIO, (st), (val)) +# define sk_BIO_delete(st, i) SKM_sk_delete(BIO, (st), (i)) +# define sk_BIO_delete_ptr(st, ptr) SKM_sk_delete_ptr(BIO, (st), (ptr)) +# define sk_BIO_insert(st, val, i) SKM_sk_insert(BIO, (st), (val), (i)) +# define sk_BIO_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(BIO, (st), (cmp)) +# define sk_BIO_dup(st) SKM_sk_dup(BIO, st) +# define sk_BIO_pop_free(st, free_func) SKM_sk_pop_free(BIO, (st), (free_func)) +# define sk_BIO_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(BIO, (st), (copy_func), (free_func)) +# define sk_BIO_shift(st) SKM_sk_shift(BIO, (st)) +# define sk_BIO_pop(st) SKM_sk_pop(BIO, (st)) +# define sk_BIO_sort(st) SKM_sk_sort(BIO, (st)) +# define sk_BIO_is_sorted(st) SKM_sk_is_sorted(BIO, (st)) +# define sk_BY_DIR_ENTRY_new(cmp) SKM_sk_new(BY_DIR_ENTRY, (cmp)) +# define sk_BY_DIR_ENTRY_new_null() SKM_sk_new_null(BY_DIR_ENTRY) +# define sk_BY_DIR_ENTRY_free(st) SKM_sk_free(BY_DIR_ENTRY, (st)) +# define sk_BY_DIR_ENTRY_num(st) SKM_sk_num(BY_DIR_ENTRY, (st)) +# define sk_BY_DIR_ENTRY_value(st, i) SKM_sk_value(BY_DIR_ENTRY, (st), (i)) +# define sk_BY_DIR_ENTRY_set(st, i, val) SKM_sk_set(BY_DIR_ENTRY, (st), (i), (val)) +# define sk_BY_DIR_ENTRY_zero(st) SKM_sk_zero(BY_DIR_ENTRY, (st)) +# define sk_BY_DIR_ENTRY_push(st, val) SKM_sk_push(BY_DIR_ENTRY, (st), (val)) +# define sk_BY_DIR_ENTRY_unshift(st, val) SKM_sk_unshift(BY_DIR_ENTRY, (st), (val)) +# define sk_BY_DIR_ENTRY_find(st, val) SKM_sk_find(BY_DIR_ENTRY, (st), (val)) +# define sk_BY_DIR_ENTRY_find_ex(st, val) SKM_sk_find_ex(BY_DIR_ENTRY, (st), (val)) +# define sk_BY_DIR_ENTRY_delete(st, i) SKM_sk_delete(BY_DIR_ENTRY, (st), (i)) +# define sk_BY_DIR_ENTRY_delete_ptr(st, ptr) SKM_sk_delete_ptr(BY_DIR_ENTRY, (st), (ptr)) +# define sk_BY_DIR_ENTRY_insert(st, val, i) SKM_sk_insert(BY_DIR_ENTRY, (st), (val), (i)) +# define sk_BY_DIR_ENTRY_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(BY_DIR_ENTRY, (st), (cmp)) +# define sk_BY_DIR_ENTRY_dup(st) SKM_sk_dup(BY_DIR_ENTRY, st) +# define sk_BY_DIR_ENTRY_pop_free(st, free_func) SKM_sk_pop_free(BY_DIR_ENTRY, (st), (free_func)) +# define sk_BY_DIR_ENTRY_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(BY_DIR_ENTRY, (st), (copy_func), (free_func)) +# define sk_BY_DIR_ENTRY_shift(st) SKM_sk_shift(BY_DIR_ENTRY, (st)) +# define sk_BY_DIR_ENTRY_pop(st) SKM_sk_pop(BY_DIR_ENTRY, (st)) +# define sk_BY_DIR_ENTRY_sort(st) SKM_sk_sort(BY_DIR_ENTRY, (st)) +# define sk_BY_DIR_ENTRY_is_sorted(st) SKM_sk_is_sorted(BY_DIR_ENTRY, (st)) +# define sk_BY_DIR_HASH_new(cmp) SKM_sk_new(BY_DIR_HASH, (cmp)) +# define sk_BY_DIR_HASH_new_null() SKM_sk_new_null(BY_DIR_HASH) +# define sk_BY_DIR_HASH_free(st) SKM_sk_free(BY_DIR_HASH, (st)) +# define sk_BY_DIR_HASH_num(st) SKM_sk_num(BY_DIR_HASH, (st)) +# define sk_BY_DIR_HASH_value(st, i) SKM_sk_value(BY_DIR_HASH, (st), (i)) +# define sk_BY_DIR_HASH_set(st, i, val) SKM_sk_set(BY_DIR_HASH, (st), (i), (val)) +# define sk_BY_DIR_HASH_zero(st) SKM_sk_zero(BY_DIR_HASH, (st)) +# define sk_BY_DIR_HASH_push(st, val) SKM_sk_push(BY_DIR_HASH, (st), (val)) +# define sk_BY_DIR_HASH_unshift(st, val) SKM_sk_unshift(BY_DIR_HASH, (st), (val)) +# define sk_BY_DIR_HASH_find(st, val) SKM_sk_find(BY_DIR_HASH, (st), (val)) +# define sk_BY_DIR_HASH_find_ex(st, val) SKM_sk_find_ex(BY_DIR_HASH, (st), (val)) +# define sk_BY_DIR_HASH_delete(st, i) SKM_sk_delete(BY_DIR_HASH, (st), (i)) +# define sk_BY_DIR_HASH_delete_ptr(st, ptr) SKM_sk_delete_ptr(BY_DIR_HASH, (st), (ptr)) +# define sk_BY_DIR_HASH_insert(st, val, i) SKM_sk_insert(BY_DIR_HASH, (st), (val), (i)) +# define sk_BY_DIR_HASH_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(BY_DIR_HASH, (st), (cmp)) +# define sk_BY_DIR_HASH_dup(st) SKM_sk_dup(BY_DIR_HASH, st) +# define sk_BY_DIR_HASH_pop_free(st, free_func) SKM_sk_pop_free(BY_DIR_HASH, (st), (free_func)) +# define sk_BY_DIR_HASH_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(BY_DIR_HASH, (st), (copy_func), (free_func)) +# define sk_BY_DIR_HASH_shift(st) SKM_sk_shift(BY_DIR_HASH, (st)) +# define sk_BY_DIR_HASH_pop(st) SKM_sk_pop(BY_DIR_HASH, (st)) +# define sk_BY_DIR_HASH_sort(st) SKM_sk_sort(BY_DIR_HASH, (st)) +# define sk_BY_DIR_HASH_is_sorted(st) SKM_sk_is_sorted(BY_DIR_HASH, (st)) +# define sk_CMS_CertificateChoices_new(cmp) SKM_sk_new(CMS_CertificateChoices, (cmp)) +# define sk_CMS_CertificateChoices_new_null() SKM_sk_new_null(CMS_CertificateChoices) +# define sk_CMS_CertificateChoices_free(st) SKM_sk_free(CMS_CertificateChoices, (st)) +# define sk_CMS_CertificateChoices_num(st) SKM_sk_num(CMS_CertificateChoices, (st)) +# define sk_CMS_CertificateChoices_value(st, i) SKM_sk_value(CMS_CertificateChoices, (st), (i)) +# define sk_CMS_CertificateChoices_set(st, i, val) SKM_sk_set(CMS_CertificateChoices, (st), (i), (val)) +# define sk_CMS_CertificateChoices_zero(st) SKM_sk_zero(CMS_CertificateChoices, (st)) +# define sk_CMS_CertificateChoices_push(st, val) SKM_sk_push(CMS_CertificateChoices, (st), (val)) +# define sk_CMS_CertificateChoices_unshift(st, val) SKM_sk_unshift(CMS_CertificateChoices, (st), (val)) +# define sk_CMS_CertificateChoices_find(st, val) SKM_sk_find(CMS_CertificateChoices, (st), (val)) +# define sk_CMS_CertificateChoices_find_ex(st, val) SKM_sk_find_ex(CMS_CertificateChoices, (st), (val)) +# define sk_CMS_CertificateChoices_delete(st, i) SKM_sk_delete(CMS_CertificateChoices, (st), (i)) +# define sk_CMS_CertificateChoices_delete_ptr(st, ptr) SKM_sk_delete_ptr(CMS_CertificateChoices, (st), (ptr)) +# define sk_CMS_CertificateChoices_insert(st, val, i) SKM_sk_insert(CMS_CertificateChoices, (st), (val), (i)) +# define sk_CMS_CertificateChoices_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(CMS_CertificateChoices, (st), (cmp)) +# define sk_CMS_CertificateChoices_dup(st) SKM_sk_dup(CMS_CertificateChoices, st) +# define sk_CMS_CertificateChoices_pop_free(st, free_func) SKM_sk_pop_free(CMS_CertificateChoices, (st), (free_func)) +# define sk_CMS_CertificateChoices_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(CMS_CertificateChoices, (st), (copy_func), (free_func)) +# define sk_CMS_CertificateChoices_shift(st) SKM_sk_shift(CMS_CertificateChoices, (st)) +# define sk_CMS_CertificateChoices_pop(st) SKM_sk_pop(CMS_CertificateChoices, (st)) +# define sk_CMS_CertificateChoices_sort(st) SKM_sk_sort(CMS_CertificateChoices, (st)) +# define sk_CMS_CertificateChoices_is_sorted(st) SKM_sk_is_sorted(CMS_CertificateChoices, (st)) +# define sk_CMS_RecipientEncryptedKey_new(cmp) SKM_sk_new(CMS_RecipientEncryptedKey, (cmp)) +# define sk_CMS_RecipientEncryptedKey_new_null() SKM_sk_new_null(CMS_RecipientEncryptedKey) +# define sk_CMS_RecipientEncryptedKey_free(st) SKM_sk_free(CMS_RecipientEncryptedKey, (st)) +# define sk_CMS_RecipientEncryptedKey_num(st) SKM_sk_num(CMS_RecipientEncryptedKey, (st)) +# define sk_CMS_RecipientEncryptedKey_value(st, i) SKM_sk_value(CMS_RecipientEncryptedKey, (st), (i)) +# define sk_CMS_RecipientEncryptedKey_set(st, i, val) SKM_sk_set(CMS_RecipientEncryptedKey, (st), (i), (val)) +# define sk_CMS_RecipientEncryptedKey_zero(st) SKM_sk_zero(CMS_RecipientEncryptedKey, (st)) +# define sk_CMS_RecipientEncryptedKey_push(st, val) SKM_sk_push(CMS_RecipientEncryptedKey, (st), (val)) +# define sk_CMS_RecipientEncryptedKey_unshift(st, val) SKM_sk_unshift(CMS_RecipientEncryptedKey, (st), (val)) +# define sk_CMS_RecipientEncryptedKey_find(st, val) SKM_sk_find(CMS_RecipientEncryptedKey, (st), (val)) +# define sk_CMS_RecipientEncryptedKey_find_ex(st, val) SKM_sk_find_ex(CMS_RecipientEncryptedKey, (st), (val)) +# define sk_CMS_RecipientEncryptedKey_delete(st, i) SKM_sk_delete(CMS_RecipientEncryptedKey, (st), (i)) +# define sk_CMS_RecipientEncryptedKey_delete_ptr(st, ptr) SKM_sk_delete_ptr(CMS_RecipientEncryptedKey, (st), (ptr)) +# define sk_CMS_RecipientEncryptedKey_insert(st, val, i) SKM_sk_insert(CMS_RecipientEncryptedKey, (st), (val), (i)) +# define sk_CMS_RecipientEncryptedKey_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(CMS_RecipientEncryptedKey, (st), (cmp)) +# define sk_CMS_RecipientEncryptedKey_dup(st) SKM_sk_dup(CMS_RecipientEncryptedKey, st) +# define sk_CMS_RecipientEncryptedKey_pop_free(st, free_func) SKM_sk_pop_free(CMS_RecipientEncryptedKey, (st), (free_func)) +# define sk_CMS_RecipientEncryptedKey_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(CMS_RecipientEncryptedKey, (st), (copy_func), (free_func)) +# define sk_CMS_RecipientEncryptedKey_shift(st) SKM_sk_shift(CMS_RecipientEncryptedKey, (st)) +# define sk_CMS_RecipientEncryptedKey_pop(st) SKM_sk_pop(CMS_RecipientEncryptedKey, (st)) +# define sk_CMS_RecipientEncryptedKey_sort(st) SKM_sk_sort(CMS_RecipientEncryptedKey, (st)) +# define sk_CMS_RecipientEncryptedKey_is_sorted(st) SKM_sk_is_sorted(CMS_RecipientEncryptedKey, (st)) +# define sk_CMS_RecipientInfo_new(cmp) SKM_sk_new(CMS_RecipientInfo, (cmp)) +# define sk_CMS_RecipientInfo_new_null() SKM_sk_new_null(CMS_RecipientInfo) +# define sk_CMS_RecipientInfo_free(st) SKM_sk_free(CMS_RecipientInfo, (st)) +# define sk_CMS_RecipientInfo_num(st) SKM_sk_num(CMS_RecipientInfo, (st)) +# define sk_CMS_RecipientInfo_value(st, i) SKM_sk_value(CMS_RecipientInfo, (st), (i)) +# define sk_CMS_RecipientInfo_set(st, i, val) SKM_sk_set(CMS_RecipientInfo, (st), (i), (val)) +# define sk_CMS_RecipientInfo_zero(st) SKM_sk_zero(CMS_RecipientInfo, (st)) +# define sk_CMS_RecipientInfo_push(st, val) SKM_sk_push(CMS_RecipientInfo, (st), (val)) +# define sk_CMS_RecipientInfo_unshift(st, val) SKM_sk_unshift(CMS_RecipientInfo, (st), (val)) +# define sk_CMS_RecipientInfo_find(st, val) SKM_sk_find(CMS_RecipientInfo, (st), (val)) +# define sk_CMS_RecipientInfo_find_ex(st, val) SKM_sk_find_ex(CMS_RecipientInfo, (st), (val)) +# define sk_CMS_RecipientInfo_delete(st, i) SKM_sk_delete(CMS_RecipientInfo, (st), (i)) +# define sk_CMS_RecipientInfo_delete_ptr(st, ptr) SKM_sk_delete_ptr(CMS_RecipientInfo, (st), (ptr)) +# define sk_CMS_RecipientInfo_insert(st, val, i) SKM_sk_insert(CMS_RecipientInfo, (st), (val), (i)) +# define sk_CMS_RecipientInfo_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(CMS_RecipientInfo, (st), (cmp)) +# define sk_CMS_RecipientInfo_dup(st) SKM_sk_dup(CMS_RecipientInfo, st) +# define sk_CMS_RecipientInfo_pop_free(st, free_func) SKM_sk_pop_free(CMS_RecipientInfo, (st), (free_func)) +# define sk_CMS_RecipientInfo_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(CMS_RecipientInfo, (st), (copy_func), (free_func)) +# define sk_CMS_RecipientInfo_shift(st) SKM_sk_shift(CMS_RecipientInfo, (st)) +# define sk_CMS_RecipientInfo_pop(st) SKM_sk_pop(CMS_RecipientInfo, (st)) +# define sk_CMS_RecipientInfo_sort(st) SKM_sk_sort(CMS_RecipientInfo, (st)) +# define sk_CMS_RecipientInfo_is_sorted(st) SKM_sk_is_sorted(CMS_RecipientInfo, (st)) +# define sk_CMS_RevocationInfoChoice_new(cmp) SKM_sk_new(CMS_RevocationInfoChoice, (cmp)) +# define sk_CMS_RevocationInfoChoice_new_null() SKM_sk_new_null(CMS_RevocationInfoChoice) +# define sk_CMS_RevocationInfoChoice_free(st) SKM_sk_free(CMS_RevocationInfoChoice, (st)) +# define sk_CMS_RevocationInfoChoice_num(st) SKM_sk_num(CMS_RevocationInfoChoice, (st)) +# define sk_CMS_RevocationInfoChoice_value(st, i) SKM_sk_value(CMS_RevocationInfoChoice, (st), (i)) +# define sk_CMS_RevocationInfoChoice_set(st, i, val) SKM_sk_set(CMS_RevocationInfoChoice, (st), (i), (val)) +# define sk_CMS_RevocationInfoChoice_zero(st) SKM_sk_zero(CMS_RevocationInfoChoice, (st)) +# define sk_CMS_RevocationInfoChoice_push(st, val) SKM_sk_push(CMS_RevocationInfoChoice, (st), (val)) +# define sk_CMS_RevocationInfoChoice_unshift(st, val) SKM_sk_unshift(CMS_RevocationInfoChoice, (st), (val)) +# define sk_CMS_RevocationInfoChoice_find(st, val) SKM_sk_find(CMS_RevocationInfoChoice, (st), (val)) +# define sk_CMS_RevocationInfoChoice_find_ex(st, val) SKM_sk_find_ex(CMS_RevocationInfoChoice, (st), (val)) +# define sk_CMS_RevocationInfoChoice_delete(st, i) SKM_sk_delete(CMS_RevocationInfoChoice, (st), (i)) +# define sk_CMS_RevocationInfoChoice_delete_ptr(st, ptr) SKM_sk_delete_ptr(CMS_RevocationInfoChoice, (st), (ptr)) +# define sk_CMS_RevocationInfoChoice_insert(st, val, i) SKM_sk_insert(CMS_RevocationInfoChoice, (st), (val), (i)) +# define sk_CMS_RevocationInfoChoice_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(CMS_RevocationInfoChoice, (st), (cmp)) +# define sk_CMS_RevocationInfoChoice_dup(st) SKM_sk_dup(CMS_RevocationInfoChoice, st) +# define sk_CMS_RevocationInfoChoice_pop_free(st, free_func) SKM_sk_pop_free(CMS_RevocationInfoChoice, (st), (free_func)) +# define sk_CMS_RevocationInfoChoice_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(CMS_RevocationInfoChoice, (st), (copy_func), (free_func)) +# define sk_CMS_RevocationInfoChoice_shift(st) SKM_sk_shift(CMS_RevocationInfoChoice, (st)) +# define sk_CMS_RevocationInfoChoice_pop(st) SKM_sk_pop(CMS_RevocationInfoChoice, (st)) +# define sk_CMS_RevocationInfoChoice_sort(st) SKM_sk_sort(CMS_RevocationInfoChoice, (st)) +# define sk_CMS_RevocationInfoChoice_is_sorted(st) SKM_sk_is_sorted(CMS_RevocationInfoChoice, (st)) +# define sk_CMS_SignerInfo_new(cmp) SKM_sk_new(CMS_SignerInfo, (cmp)) +# define sk_CMS_SignerInfo_new_null() SKM_sk_new_null(CMS_SignerInfo) +# define sk_CMS_SignerInfo_free(st) SKM_sk_free(CMS_SignerInfo, (st)) +# define sk_CMS_SignerInfo_num(st) SKM_sk_num(CMS_SignerInfo, (st)) +# define sk_CMS_SignerInfo_value(st, i) SKM_sk_value(CMS_SignerInfo, (st), (i)) +# define sk_CMS_SignerInfo_set(st, i, val) SKM_sk_set(CMS_SignerInfo, (st), (i), (val)) +# define sk_CMS_SignerInfo_zero(st) SKM_sk_zero(CMS_SignerInfo, (st)) +# define sk_CMS_SignerInfo_push(st, val) SKM_sk_push(CMS_SignerInfo, (st), (val)) +# define sk_CMS_SignerInfo_unshift(st, val) SKM_sk_unshift(CMS_SignerInfo, (st), (val)) +# define sk_CMS_SignerInfo_find(st, val) SKM_sk_find(CMS_SignerInfo, (st), (val)) +# define sk_CMS_SignerInfo_find_ex(st, val) SKM_sk_find_ex(CMS_SignerInfo, (st), (val)) +# define sk_CMS_SignerInfo_delete(st, i) SKM_sk_delete(CMS_SignerInfo, (st), (i)) +# define sk_CMS_SignerInfo_delete_ptr(st, ptr) SKM_sk_delete_ptr(CMS_SignerInfo, (st), (ptr)) +# define sk_CMS_SignerInfo_insert(st, val, i) SKM_sk_insert(CMS_SignerInfo, (st), (val), (i)) +# define sk_CMS_SignerInfo_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(CMS_SignerInfo, (st), (cmp)) +# define sk_CMS_SignerInfo_dup(st) SKM_sk_dup(CMS_SignerInfo, st) +# define sk_CMS_SignerInfo_pop_free(st, free_func) SKM_sk_pop_free(CMS_SignerInfo, (st), (free_func)) +# define sk_CMS_SignerInfo_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(CMS_SignerInfo, (st), (copy_func), (free_func)) +# define sk_CMS_SignerInfo_shift(st) SKM_sk_shift(CMS_SignerInfo, (st)) +# define sk_CMS_SignerInfo_pop(st) SKM_sk_pop(CMS_SignerInfo, (st)) +# define sk_CMS_SignerInfo_sort(st) SKM_sk_sort(CMS_SignerInfo, (st)) +# define sk_CMS_SignerInfo_is_sorted(st) SKM_sk_is_sorted(CMS_SignerInfo, (st)) +# define sk_CONF_IMODULE_new(cmp) SKM_sk_new(CONF_IMODULE, (cmp)) +# define sk_CONF_IMODULE_new_null() SKM_sk_new_null(CONF_IMODULE) +# define sk_CONF_IMODULE_free(st) SKM_sk_free(CONF_IMODULE, (st)) +# define sk_CONF_IMODULE_num(st) SKM_sk_num(CONF_IMODULE, (st)) +# define sk_CONF_IMODULE_value(st, i) SKM_sk_value(CONF_IMODULE, (st), (i)) +# define sk_CONF_IMODULE_set(st, i, val) SKM_sk_set(CONF_IMODULE, (st), (i), (val)) +# define sk_CONF_IMODULE_zero(st) SKM_sk_zero(CONF_IMODULE, (st)) +# define sk_CONF_IMODULE_push(st, val) SKM_sk_push(CONF_IMODULE, (st), (val)) +# define sk_CONF_IMODULE_unshift(st, val) SKM_sk_unshift(CONF_IMODULE, (st), (val)) +# define sk_CONF_IMODULE_find(st, val) SKM_sk_find(CONF_IMODULE, (st), (val)) +# define sk_CONF_IMODULE_find_ex(st, val) SKM_sk_find_ex(CONF_IMODULE, (st), (val)) +# define sk_CONF_IMODULE_delete(st, i) SKM_sk_delete(CONF_IMODULE, (st), (i)) +# define sk_CONF_IMODULE_delete_ptr(st, ptr) SKM_sk_delete_ptr(CONF_IMODULE, (st), (ptr)) +# define sk_CONF_IMODULE_insert(st, val, i) SKM_sk_insert(CONF_IMODULE, (st), (val), (i)) +# define sk_CONF_IMODULE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(CONF_IMODULE, (st), (cmp)) +# define sk_CONF_IMODULE_dup(st) SKM_sk_dup(CONF_IMODULE, st) +# define sk_CONF_IMODULE_pop_free(st, free_func) SKM_sk_pop_free(CONF_IMODULE, (st), (free_func)) +# define sk_CONF_IMODULE_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(CONF_IMODULE, (st), (copy_func), (free_func)) +# define sk_CONF_IMODULE_shift(st) SKM_sk_shift(CONF_IMODULE, (st)) +# define sk_CONF_IMODULE_pop(st) SKM_sk_pop(CONF_IMODULE, (st)) +# define sk_CONF_IMODULE_sort(st) SKM_sk_sort(CONF_IMODULE, (st)) +# define sk_CONF_IMODULE_is_sorted(st) SKM_sk_is_sorted(CONF_IMODULE, (st)) +# define sk_CONF_MODULE_new(cmp) SKM_sk_new(CONF_MODULE, (cmp)) +# define sk_CONF_MODULE_new_null() SKM_sk_new_null(CONF_MODULE) +# define sk_CONF_MODULE_free(st) SKM_sk_free(CONF_MODULE, (st)) +# define sk_CONF_MODULE_num(st) SKM_sk_num(CONF_MODULE, (st)) +# define sk_CONF_MODULE_value(st, i) SKM_sk_value(CONF_MODULE, (st), (i)) +# define sk_CONF_MODULE_set(st, i, val) SKM_sk_set(CONF_MODULE, (st), (i), (val)) +# define sk_CONF_MODULE_zero(st) SKM_sk_zero(CONF_MODULE, (st)) +# define sk_CONF_MODULE_push(st, val) SKM_sk_push(CONF_MODULE, (st), (val)) +# define sk_CONF_MODULE_unshift(st, val) SKM_sk_unshift(CONF_MODULE, (st), (val)) +# define sk_CONF_MODULE_find(st, val) SKM_sk_find(CONF_MODULE, (st), (val)) +# define sk_CONF_MODULE_find_ex(st, val) SKM_sk_find_ex(CONF_MODULE, (st), (val)) +# define sk_CONF_MODULE_delete(st, i) SKM_sk_delete(CONF_MODULE, (st), (i)) +# define sk_CONF_MODULE_delete_ptr(st, ptr) SKM_sk_delete_ptr(CONF_MODULE, (st), (ptr)) +# define sk_CONF_MODULE_insert(st, val, i) SKM_sk_insert(CONF_MODULE, (st), (val), (i)) +# define sk_CONF_MODULE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(CONF_MODULE, (st), (cmp)) +# define sk_CONF_MODULE_dup(st) SKM_sk_dup(CONF_MODULE, st) +# define sk_CONF_MODULE_pop_free(st, free_func) SKM_sk_pop_free(CONF_MODULE, (st), (free_func)) +# define sk_CONF_MODULE_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(CONF_MODULE, (st), (copy_func), (free_func)) +# define sk_CONF_MODULE_shift(st) SKM_sk_shift(CONF_MODULE, (st)) +# define sk_CONF_MODULE_pop(st) SKM_sk_pop(CONF_MODULE, (st)) +# define sk_CONF_MODULE_sort(st) SKM_sk_sort(CONF_MODULE, (st)) +# define sk_CONF_MODULE_is_sorted(st) SKM_sk_is_sorted(CONF_MODULE, (st)) +# define sk_CONF_VALUE_new(cmp) SKM_sk_new(CONF_VALUE, (cmp)) +# define sk_CONF_VALUE_new_null() SKM_sk_new_null(CONF_VALUE) +# define sk_CONF_VALUE_free(st) SKM_sk_free(CONF_VALUE, (st)) +# define sk_CONF_VALUE_num(st) SKM_sk_num(CONF_VALUE, (st)) +# define sk_CONF_VALUE_value(st, i) SKM_sk_value(CONF_VALUE, (st), (i)) +# define sk_CONF_VALUE_set(st, i, val) SKM_sk_set(CONF_VALUE, (st), (i), (val)) +# define sk_CONF_VALUE_zero(st) SKM_sk_zero(CONF_VALUE, (st)) +# define sk_CONF_VALUE_push(st, val) SKM_sk_push(CONF_VALUE, (st), (val)) +# define sk_CONF_VALUE_unshift(st, val) SKM_sk_unshift(CONF_VALUE, (st), (val)) +# define sk_CONF_VALUE_find(st, val) SKM_sk_find(CONF_VALUE, (st), (val)) +# define sk_CONF_VALUE_find_ex(st, val) SKM_sk_find_ex(CONF_VALUE, (st), (val)) +# define sk_CONF_VALUE_delete(st, i) SKM_sk_delete(CONF_VALUE, (st), (i)) +# define sk_CONF_VALUE_delete_ptr(st, ptr) SKM_sk_delete_ptr(CONF_VALUE, (st), (ptr)) +# define sk_CONF_VALUE_insert(st, val, i) SKM_sk_insert(CONF_VALUE, (st), (val), (i)) +# define sk_CONF_VALUE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(CONF_VALUE, (st), (cmp)) +# define sk_CONF_VALUE_dup(st) SKM_sk_dup(CONF_VALUE, st) +# define sk_CONF_VALUE_pop_free(st, free_func) SKM_sk_pop_free(CONF_VALUE, (st), (free_func)) +# define sk_CONF_VALUE_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(CONF_VALUE, (st), (copy_func), (free_func)) +# define sk_CONF_VALUE_shift(st) SKM_sk_shift(CONF_VALUE, (st)) +# define sk_CONF_VALUE_pop(st) SKM_sk_pop(CONF_VALUE, (st)) +# define sk_CONF_VALUE_sort(st) SKM_sk_sort(CONF_VALUE, (st)) +# define sk_CONF_VALUE_is_sorted(st) SKM_sk_is_sorted(CONF_VALUE, (st)) +# define sk_CRYPTO_EX_DATA_FUNCS_new(cmp) SKM_sk_new(CRYPTO_EX_DATA_FUNCS, (cmp)) +# define sk_CRYPTO_EX_DATA_FUNCS_new_null() SKM_sk_new_null(CRYPTO_EX_DATA_FUNCS) +# define sk_CRYPTO_EX_DATA_FUNCS_free(st) SKM_sk_free(CRYPTO_EX_DATA_FUNCS, (st)) +# define sk_CRYPTO_EX_DATA_FUNCS_num(st) SKM_sk_num(CRYPTO_EX_DATA_FUNCS, (st)) +# define sk_CRYPTO_EX_DATA_FUNCS_value(st, i) SKM_sk_value(CRYPTO_EX_DATA_FUNCS, (st), (i)) +# define sk_CRYPTO_EX_DATA_FUNCS_set(st, i, val) SKM_sk_set(CRYPTO_EX_DATA_FUNCS, (st), (i), (val)) +# define sk_CRYPTO_EX_DATA_FUNCS_zero(st) SKM_sk_zero(CRYPTO_EX_DATA_FUNCS, (st)) +# define sk_CRYPTO_EX_DATA_FUNCS_push(st, val) SKM_sk_push(CRYPTO_EX_DATA_FUNCS, (st), (val)) +# define sk_CRYPTO_EX_DATA_FUNCS_unshift(st, val) SKM_sk_unshift(CRYPTO_EX_DATA_FUNCS, (st), (val)) +# define sk_CRYPTO_EX_DATA_FUNCS_find(st, val) SKM_sk_find(CRYPTO_EX_DATA_FUNCS, (st), (val)) +# define sk_CRYPTO_EX_DATA_FUNCS_find_ex(st, val) SKM_sk_find_ex(CRYPTO_EX_DATA_FUNCS, (st), (val)) +# define sk_CRYPTO_EX_DATA_FUNCS_delete(st, i) SKM_sk_delete(CRYPTO_EX_DATA_FUNCS, (st), (i)) +# define sk_CRYPTO_EX_DATA_FUNCS_delete_ptr(st, ptr) SKM_sk_delete_ptr(CRYPTO_EX_DATA_FUNCS, (st), (ptr)) +# define sk_CRYPTO_EX_DATA_FUNCS_insert(st, val, i) SKM_sk_insert(CRYPTO_EX_DATA_FUNCS, (st), (val), (i)) +# define sk_CRYPTO_EX_DATA_FUNCS_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(CRYPTO_EX_DATA_FUNCS, (st), (cmp)) +# define sk_CRYPTO_EX_DATA_FUNCS_dup(st) SKM_sk_dup(CRYPTO_EX_DATA_FUNCS, st) +# define sk_CRYPTO_EX_DATA_FUNCS_pop_free(st, free_func) SKM_sk_pop_free(CRYPTO_EX_DATA_FUNCS, (st), (free_func)) +# define sk_CRYPTO_EX_DATA_FUNCS_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(CRYPTO_EX_DATA_FUNCS, (st), (copy_func), (free_func)) +# define sk_CRYPTO_EX_DATA_FUNCS_shift(st) SKM_sk_shift(CRYPTO_EX_DATA_FUNCS, (st)) +# define sk_CRYPTO_EX_DATA_FUNCS_pop(st) SKM_sk_pop(CRYPTO_EX_DATA_FUNCS, (st)) +# define sk_CRYPTO_EX_DATA_FUNCS_sort(st) SKM_sk_sort(CRYPTO_EX_DATA_FUNCS, (st)) +# define sk_CRYPTO_EX_DATA_FUNCS_is_sorted(st) SKM_sk_is_sorted(CRYPTO_EX_DATA_FUNCS, (st)) +# define sk_CRYPTO_dynlock_new(cmp) SKM_sk_new(CRYPTO_dynlock, (cmp)) +# define sk_CRYPTO_dynlock_new_null() SKM_sk_new_null(CRYPTO_dynlock) +# define sk_CRYPTO_dynlock_free(st) SKM_sk_free(CRYPTO_dynlock, (st)) +# define sk_CRYPTO_dynlock_num(st) SKM_sk_num(CRYPTO_dynlock, (st)) +# define sk_CRYPTO_dynlock_value(st, i) SKM_sk_value(CRYPTO_dynlock, (st), (i)) +# define sk_CRYPTO_dynlock_set(st, i, val) SKM_sk_set(CRYPTO_dynlock, (st), (i), (val)) +# define sk_CRYPTO_dynlock_zero(st) SKM_sk_zero(CRYPTO_dynlock, (st)) +# define sk_CRYPTO_dynlock_push(st, val) SKM_sk_push(CRYPTO_dynlock, (st), (val)) +# define sk_CRYPTO_dynlock_unshift(st, val) SKM_sk_unshift(CRYPTO_dynlock, (st), (val)) +# define sk_CRYPTO_dynlock_find(st, val) SKM_sk_find(CRYPTO_dynlock, (st), (val)) +# define sk_CRYPTO_dynlock_find_ex(st, val) SKM_sk_find_ex(CRYPTO_dynlock, (st), (val)) +# define sk_CRYPTO_dynlock_delete(st, i) SKM_sk_delete(CRYPTO_dynlock, (st), (i)) +# define sk_CRYPTO_dynlock_delete_ptr(st, ptr) SKM_sk_delete_ptr(CRYPTO_dynlock, (st), (ptr)) +# define sk_CRYPTO_dynlock_insert(st, val, i) SKM_sk_insert(CRYPTO_dynlock, (st), (val), (i)) +# define sk_CRYPTO_dynlock_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(CRYPTO_dynlock, (st), (cmp)) +# define sk_CRYPTO_dynlock_dup(st) SKM_sk_dup(CRYPTO_dynlock, st) +# define sk_CRYPTO_dynlock_pop_free(st, free_func) SKM_sk_pop_free(CRYPTO_dynlock, (st), (free_func)) +# define sk_CRYPTO_dynlock_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(CRYPTO_dynlock, (st), (copy_func), (free_func)) +# define sk_CRYPTO_dynlock_shift(st) SKM_sk_shift(CRYPTO_dynlock, (st)) +# define sk_CRYPTO_dynlock_pop(st) SKM_sk_pop(CRYPTO_dynlock, (st)) +# define sk_CRYPTO_dynlock_sort(st) SKM_sk_sort(CRYPTO_dynlock, (st)) +# define sk_CRYPTO_dynlock_is_sorted(st) SKM_sk_is_sorted(CRYPTO_dynlock, (st)) +# define sk_DIST_POINT_new(cmp) SKM_sk_new(DIST_POINT, (cmp)) +# define sk_DIST_POINT_new_null() SKM_sk_new_null(DIST_POINT) +# define sk_DIST_POINT_free(st) SKM_sk_free(DIST_POINT, (st)) +# define sk_DIST_POINT_num(st) SKM_sk_num(DIST_POINT, (st)) +# define sk_DIST_POINT_value(st, i) SKM_sk_value(DIST_POINT, (st), (i)) +# define sk_DIST_POINT_set(st, i, val) SKM_sk_set(DIST_POINT, (st), (i), (val)) +# define sk_DIST_POINT_zero(st) SKM_sk_zero(DIST_POINT, (st)) +# define sk_DIST_POINT_push(st, val) SKM_sk_push(DIST_POINT, (st), (val)) +# define sk_DIST_POINT_unshift(st, val) SKM_sk_unshift(DIST_POINT, (st), (val)) +# define sk_DIST_POINT_find(st, val) SKM_sk_find(DIST_POINT, (st), (val)) +# define sk_DIST_POINT_find_ex(st, val) SKM_sk_find_ex(DIST_POINT, (st), (val)) +# define sk_DIST_POINT_delete(st, i) SKM_sk_delete(DIST_POINT, (st), (i)) +# define sk_DIST_POINT_delete_ptr(st, ptr) SKM_sk_delete_ptr(DIST_POINT, (st), (ptr)) +# define sk_DIST_POINT_insert(st, val, i) SKM_sk_insert(DIST_POINT, (st), (val), (i)) +# define sk_DIST_POINT_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(DIST_POINT, (st), (cmp)) +# define sk_DIST_POINT_dup(st) SKM_sk_dup(DIST_POINT, st) +# define sk_DIST_POINT_pop_free(st, free_func) SKM_sk_pop_free(DIST_POINT, (st), (free_func)) +# define sk_DIST_POINT_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(DIST_POINT, (st), (copy_func), (free_func)) +# define sk_DIST_POINT_shift(st) SKM_sk_shift(DIST_POINT, (st)) +# define sk_DIST_POINT_pop(st) SKM_sk_pop(DIST_POINT, (st)) +# define sk_DIST_POINT_sort(st) SKM_sk_sort(DIST_POINT, (st)) +# define sk_DIST_POINT_is_sorted(st) SKM_sk_is_sorted(DIST_POINT, (st)) +# define sk_ENGINE_new(cmp) SKM_sk_new(ENGINE, (cmp)) +# define sk_ENGINE_new_null() SKM_sk_new_null(ENGINE) +# define sk_ENGINE_free(st) SKM_sk_free(ENGINE, (st)) +# define sk_ENGINE_num(st) SKM_sk_num(ENGINE, (st)) +# define sk_ENGINE_value(st, i) SKM_sk_value(ENGINE, (st), (i)) +# define sk_ENGINE_set(st, i, val) SKM_sk_set(ENGINE, (st), (i), (val)) +# define sk_ENGINE_zero(st) SKM_sk_zero(ENGINE, (st)) +# define sk_ENGINE_push(st, val) SKM_sk_push(ENGINE, (st), (val)) +# define sk_ENGINE_unshift(st, val) SKM_sk_unshift(ENGINE, (st), (val)) +# define sk_ENGINE_find(st, val) SKM_sk_find(ENGINE, (st), (val)) +# define sk_ENGINE_find_ex(st, val) SKM_sk_find_ex(ENGINE, (st), (val)) +# define sk_ENGINE_delete(st, i) SKM_sk_delete(ENGINE, (st), (i)) +# define sk_ENGINE_delete_ptr(st, ptr) SKM_sk_delete_ptr(ENGINE, (st), (ptr)) +# define sk_ENGINE_insert(st, val, i) SKM_sk_insert(ENGINE, (st), (val), (i)) +# define sk_ENGINE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ENGINE, (st), (cmp)) +# define sk_ENGINE_dup(st) SKM_sk_dup(ENGINE, st) +# define sk_ENGINE_pop_free(st, free_func) SKM_sk_pop_free(ENGINE, (st), (free_func)) +# define sk_ENGINE_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(ENGINE, (st), (copy_func), (free_func)) +# define sk_ENGINE_shift(st) SKM_sk_shift(ENGINE, (st)) +# define sk_ENGINE_pop(st) SKM_sk_pop(ENGINE, (st)) +# define sk_ENGINE_sort(st) SKM_sk_sort(ENGINE, (st)) +# define sk_ENGINE_is_sorted(st) SKM_sk_is_sorted(ENGINE, (st)) +# define sk_ENGINE_CLEANUP_ITEM_new(cmp) SKM_sk_new(ENGINE_CLEANUP_ITEM, (cmp)) +# define sk_ENGINE_CLEANUP_ITEM_new_null() SKM_sk_new_null(ENGINE_CLEANUP_ITEM) +# define sk_ENGINE_CLEANUP_ITEM_free(st) SKM_sk_free(ENGINE_CLEANUP_ITEM, (st)) +# define sk_ENGINE_CLEANUP_ITEM_num(st) SKM_sk_num(ENGINE_CLEANUP_ITEM, (st)) +# define sk_ENGINE_CLEANUP_ITEM_value(st, i) SKM_sk_value(ENGINE_CLEANUP_ITEM, (st), (i)) +# define sk_ENGINE_CLEANUP_ITEM_set(st, i, val) SKM_sk_set(ENGINE_CLEANUP_ITEM, (st), (i), (val)) +# define sk_ENGINE_CLEANUP_ITEM_zero(st) SKM_sk_zero(ENGINE_CLEANUP_ITEM, (st)) +# define sk_ENGINE_CLEANUP_ITEM_push(st, val) SKM_sk_push(ENGINE_CLEANUP_ITEM, (st), (val)) +# define sk_ENGINE_CLEANUP_ITEM_unshift(st, val) SKM_sk_unshift(ENGINE_CLEANUP_ITEM, (st), (val)) +# define sk_ENGINE_CLEANUP_ITEM_find(st, val) SKM_sk_find(ENGINE_CLEANUP_ITEM, (st), (val)) +# define sk_ENGINE_CLEANUP_ITEM_find_ex(st, val) SKM_sk_find_ex(ENGINE_CLEANUP_ITEM, (st), (val)) +# define sk_ENGINE_CLEANUP_ITEM_delete(st, i) SKM_sk_delete(ENGINE_CLEANUP_ITEM, (st), (i)) +# define sk_ENGINE_CLEANUP_ITEM_delete_ptr(st, ptr) SKM_sk_delete_ptr(ENGINE_CLEANUP_ITEM, (st), (ptr)) +# define sk_ENGINE_CLEANUP_ITEM_insert(st, val, i) SKM_sk_insert(ENGINE_CLEANUP_ITEM, (st), (val), (i)) +# define sk_ENGINE_CLEANUP_ITEM_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ENGINE_CLEANUP_ITEM, (st), (cmp)) +# define sk_ENGINE_CLEANUP_ITEM_dup(st) SKM_sk_dup(ENGINE_CLEANUP_ITEM, st) +# define sk_ENGINE_CLEANUP_ITEM_pop_free(st, free_func) SKM_sk_pop_free(ENGINE_CLEANUP_ITEM, (st), (free_func)) +# define sk_ENGINE_CLEANUP_ITEM_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(ENGINE_CLEANUP_ITEM, (st), (copy_func), (free_func)) +# define sk_ENGINE_CLEANUP_ITEM_shift(st) SKM_sk_shift(ENGINE_CLEANUP_ITEM, (st)) +# define sk_ENGINE_CLEANUP_ITEM_pop(st) SKM_sk_pop(ENGINE_CLEANUP_ITEM, (st)) +# define sk_ENGINE_CLEANUP_ITEM_sort(st) SKM_sk_sort(ENGINE_CLEANUP_ITEM, (st)) +# define sk_ENGINE_CLEANUP_ITEM_is_sorted(st) SKM_sk_is_sorted(ENGINE_CLEANUP_ITEM, (st)) +# define sk_ESS_CERT_ID_new(cmp) SKM_sk_new(ESS_CERT_ID, (cmp)) +# define sk_ESS_CERT_ID_new_null() SKM_sk_new_null(ESS_CERT_ID) +# define sk_ESS_CERT_ID_free(st) SKM_sk_free(ESS_CERT_ID, (st)) +# define sk_ESS_CERT_ID_num(st) SKM_sk_num(ESS_CERT_ID, (st)) +# define sk_ESS_CERT_ID_value(st, i) SKM_sk_value(ESS_CERT_ID, (st), (i)) +# define sk_ESS_CERT_ID_set(st, i, val) SKM_sk_set(ESS_CERT_ID, (st), (i), (val)) +# define sk_ESS_CERT_ID_zero(st) SKM_sk_zero(ESS_CERT_ID, (st)) +# define sk_ESS_CERT_ID_push(st, val) SKM_sk_push(ESS_CERT_ID, (st), (val)) +# define sk_ESS_CERT_ID_unshift(st, val) SKM_sk_unshift(ESS_CERT_ID, (st), (val)) +# define sk_ESS_CERT_ID_find(st, val) SKM_sk_find(ESS_CERT_ID, (st), (val)) +# define sk_ESS_CERT_ID_find_ex(st, val) SKM_sk_find_ex(ESS_CERT_ID, (st), (val)) +# define sk_ESS_CERT_ID_delete(st, i) SKM_sk_delete(ESS_CERT_ID, (st), (i)) +# define sk_ESS_CERT_ID_delete_ptr(st, ptr) SKM_sk_delete_ptr(ESS_CERT_ID, (st), (ptr)) +# define sk_ESS_CERT_ID_insert(st, val, i) SKM_sk_insert(ESS_CERT_ID, (st), (val), (i)) +# define sk_ESS_CERT_ID_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ESS_CERT_ID, (st), (cmp)) +# define sk_ESS_CERT_ID_dup(st) SKM_sk_dup(ESS_CERT_ID, st) +# define sk_ESS_CERT_ID_pop_free(st, free_func) SKM_sk_pop_free(ESS_CERT_ID, (st), (free_func)) +# define sk_ESS_CERT_ID_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(ESS_CERT_ID, (st), (copy_func), (free_func)) +# define sk_ESS_CERT_ID_shift(st) SKM_sk_shift(ESS_CERT_ID, (st)) +# define sk_ESS_CERT_ID_pop(st) SKM_sk_pop(ESS_CERT_ID, (st)) +# define sk_ESS_CERT_ID_sort(st) SKM_sk_sort(ESS_CERT_ID, (st)) +# define sk_ESS_CERT_ID_is_sorted(st) SKM_sk_is_sorted(ESS_CERT_ID, (st)) +# define sk_EVP_MD_new(cmp) SKM_sk_new(EVP_MD, (cmp)) +# define sk_EVP_MD_new_null() SKM_sk_new_null(EVP_MD) +# define sk_EVP_MD_free(st) SKM_sk_free(EVP_MD, (st)) +# define sk_EVP_MD_num(st) SKM_sk_num(EVP_MD, (st)) +# define sk_EVP_MD_value(st, i) SKM_sk_value(EVP_MD, (st), (i)) +# define sk_EVP_MD_set(st, i, val) SKM_sk_set(EVP_MD, (st), (i), (val)) +# define sk_EVP_MD_zero(st) SKM_sk_zero(EVP_MD, (st)) +# define sk_EVP_MD_push(st, val) SKM_sk_push(EVP_MD, (st), (val)) +# define sk_EVP_MD_unshift(st, val) SKM_sk_unshift(EVP_MD, (st), (val)) +# define sk_EVP_MD_find(st, val) SKM_sk_find(EVP_MD, (st), (val)) +# define sk_EVP_MD_find_ex(st, val) SKM_sk_find_ex(EVP_MD, (st), (val)) +# define sk_EVP_MD_delete(st, i) SKM_sk_delete(EVP_MD, (st), (i)) +# define sk_EVP_MD_delete_ptr(st, ptr) SKM_sk_delete_ptr(EVP_MD, (st), (ptr)) +# define sk_EVP_MD_insert(st, val, i) SKM_sk_insert(EVP_MD, (st), (val), (i)) +# define sk_EVP_MD_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(EVP_MD, (st), (cmp)) +# define sk_EVP_MD_dup(st) SKM_sk_dup(EVP_MD, st) +# define sk_EVP_MD_pop_free(st, free_func) SKM_sk_pop_free(EVP_MD, (st), (free_func)) +# define sk_EVP_MD_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(EVP_MD, (st), (copy_func), (free_func)) +# define sk_EVP_MD_shift(st) SKM_sk_shift(EVP_MD, (st)) +# define sk_EVP_MD_pop(st) SKM_sk_pop(EVP_MD, (st)) +# define sk_EVP_MD_sort(st) SKM_sk_sort(EVP_MD, (st)) +# define sk_EVP_MD_is_sorted(st) SKM_sk_is_sorted(EVP_MD, (st)) +# define sk_EVP_PBE_CTL_new(cmp) SKM_sk_new(EVP_PBE_CTL, (cmp)) +# define sk_EVP_PBE_CTL_new_null() SKM_sk_new_null(EVP_PBE_CTL) +# define sk_EVP_PBE_CTL_free(st) SKM_sk_free(EVP_PBE_CTL, (st)) +# define sk_EVP_PBE_CTL_num(st) SKM_sk_num(EVP_PBE_CTL, (st)) +# define sk_EVP_PBE_CTL_value(st, i) SKM_sk_value(EVP_PBE_CTL, (st), (i)) +# define sk_EVP_PBE_CTL_set(st, i, val) SKM_sk_set(EVP_PBE_CTL, (st), (i), (val)) +# define sk_EVP_PBE_CTL_zero(st) SKM_sk_zero(EVP_PBE_CTL, (st)) +# define sk_EVP_PBE_CTL_push(st, val) SKM_sk_push(EVP_PBE_CTL, (st), (val)) +# define sk_EVP_PBE_CTL_unshift(st, val) SKM_sk_unshift(EVP_PBE_CTL, (st), (val)) +# define sk_EVP_PBE_CTL_find(st, val) SKM_sk_find(EVP_PBE_CTL, (st), (val)) +# define sk_EVP_PBE_CTL_find_ex(st, val) SKM_sk_find_ex(EVP_PBE_CTL, (st), (val)) +# define sk_EVP_PBE_CTL_delete(st, i) SKM_sk_delete(EVP_PBE_CTL, (st), (i)) +# define sk_EVP_PBE_CTL_delete_ptr(st, ptr) SKM_sk_delete_ptr(EVP_PBE_CTL, (st), (ptr)) +# define sk_EVP_PBE_CTL_insert(st, val, i) SKM_sk_insert(EVP_PBE_CTL, (st), (val), (i)) +# define sk_EVP_PBE_CTL_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(EVP_PBE_CTL, (st), (cmp)) +# define sk_EVP_PBE_CTL_dup(st) SKM_sk_dup(EVP_PBE_CTL, st) +# define sk_EVP_PBE_CTL_pop_free(st, free_func) SKM_sk_pop_free(EVP_PBE_CTL, (st), (free_func)) +# define sk_EVP_PBE_CTL_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(EVP_PBE_CTL, (st), (copy_func), (free_func)) +# define sk_EVP_PBE_CTL_shift(st) SKM_sk_shift(EVP_PBE_CTL, (st)) +# define sk_EVP_PBE_CTL_pop(st) SKM_sk_pop(EVP_PBE_CTL, (st)) +# define sk_EVP_PBE_CTL_sort(st) SKM_sk_sort(EVP_PBE_CTL, (st)) +# define sk_EVP_PBE_CTL_is_sorted(st) SKM_sk_is_sorted(EVP_PBE_CTL, (st)) +# define sk_EVP_PKEY_ASN1_METHOD_new(cmp) SKM_sk_new(EVP_PKEY_ASN1_METHOD, (cmp)) +# define sk_EVP_PKEY_ASN1_METHOD_new_null() SKM_sk_new_null(EVP_PKEY_ASN1_METHOD) +# define sk_EVP_PKEY_ASN1_METHOD_free(st) SKM_sk_free(EVP_PKEY_ASN1_METHOD, (st)) +# define sk_EVP_PKEY_ASN1_METHOD_num(st) SKM_sk_num(EVP_PKEY_ASN1_METHOD, (st)) +# define sk_EVP_PKEY_ASN1_METHOD_value(st, i) SKM_sk_value(EVP_PKEY_ASN1_METHOD, (st), (i)) +# define sk_EVP_PKEY_ASN1_METHOD_set(st, i, val) SKM_sk_set(EVP_PKEY_ASN1_METHOD, (st), (i), (val)) +# define sk_EVP_PKEY_ASN1_METHOD_zero(st) SKM_sk_zero(EVP_PKEY_ASN1_METHOD, (st)) +# define sk_EVP_PKEY_ASN1_METHOD_push(st, val) SKM_sk_push(EVP_PKEY_ASN1_METHOD, (st), (val)) +# define sk_EVP_PKEY_ASN1_METHOD_unshift(st, val) SKM_sk_unshift(EVP_PKEY_ASN1_METHOD, (st), (val)) +# define sk_EVP_PKEY_ASN1_METHOD_find(st, val) SKM_sk_find(EVP_PKEY_ASN1_METHOD, (st), (val)) +# define sk_EVP_PKEY_ASN1_METHOD_find_ex(st, val) SKM_sk_find_ex(EVP_PKEY_ASN1_METHOD, (st), (val)) +# define sk_EVP_PKEY_ASN1_METHOD_delete(st, i) SKM_sk_delete(EVP_PKEY_ASN1_METHOD, (st), (i)) +# define sk_EVP_PKEY_ASN1_METHOD_delete_ptr(st, ptr) SKM_sk_delete_ptr(EVP_PKEY_ASN1_METHOD, (st), (ptr)) +# define sk_EVP_PKEY_ASN1_METHOD_insert(st, val, i) SKM_sk_insert(EVP_PKEY_ASN1_METHOD, (st), (val), (i)) +# define sk_EVP_PKEY_ASN1_METHOD_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(EVP_PKEY_ASN1_METHOD, (st), (cmp)) +# define sk_EVP_PKEY_ASN1_METHOD_dup(st) SKM_sk_dup(EVP_PKEY_ASN1_METHOD, st) +# define sk_EVP_PKEY_ASN1_METHOD_pop_free(st, free_func) SKM_sk_pop_free(EVP_PKEY_ASN1_METHOD, (st), (free_func)) +# define sk_EVP_PKEY_ASN1_METHOD_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(EVP_PKEY_ASN1_METHOD, (st), (copy_func), (free_func)) +# define sk_EVP_PKEY_ASN1_METHOD_shift(st) SKM_sk_shift(EVP_PKEY_ASN1_METHOD, (st)) +# define sk_EVP_PKEY_ASN1_METHOD_pop(st) SKM_sk_pop(EVP_PKEY_ASN1_METHOD, (st)) +# define sk_EVP_PKEY_ASN1_METHOD_sort(st) SKM_sk_sort(EVP_PKEY_ASN1_METHOD, (st)) +# define sk_EVP_PKEY_ASN1_METHOD_is_sorted(st) SKM_sk_is_sorted(EVP_PKEY_ASN1_METHOD, (st)) +# define sk_EVP_PKEY_METHOD_new(cmp) SKM_sk_new(EVP_PKEY_METHOD, (cmp)) +# define sk_EVP_PKEY_METHOD_new_null() SKM_sk_new_null(EVP_PKEY_METHOD) +# define sk_EVP_PKEY_METHOD_free(st) SKM_sk_free(EVP_PKEY_METHOD, (st)) +# define sk_EVP_PKEY_METHOD_num(st) SKM_sk_num(EVP_PKEY_METHOD, (st)) +# define sk_EVP_PKEY_METHOD_value(st, i) SKM_sk_value(EVP_PKEY_METHOD, (st), (i)) +# define sk_EVP_PKEY_METHOD_set(st, i, val) SKM_sk_set(EVP_PKEY_METHOD, (st), (i), (val)) +# define sk_EVP_PKEY_METHOD_zero(st) SKM_sk_zero(EVP_PKEY_METHOD, (st)) +# define sk_EVP_PKEY_METHOD_push(st, val) SKM_sk_push(EVP_PKEY_METHOD, (st), (val)) +# define sk_EVP_PKEY_METHOD_unshift(st, val) SKM_sk_unshift(EVP_PKEY_METHOD, (st), (val)) +# define sk_EVP_PKEY_METHOD_find(st, val) SKM_sk_find(EVP_PKEY_METHOD, (st), (val)) +# define sk_EVP_PKEY_METHOD_find_ex(st, val) SKM_sk_find_ex(EVP_PKEY_METHOD, (st), (val)) +# define sk_EVP_PKEY_METHOD_delete(st, i) SKM_sk_delete(EVP_PKEY_METHOD, (st), (i)) +# define sk_EVP_PKEY_METHOD_delete_ptr(st, ptr) SKM_sk_delete_ptr(EVP_PKEY_METHOD, (st), (ptr)) +# define sk_EVP_PKEY_METHOD_insert(st, val, i) SKM_sk_insert(EVP_PKEY_METHOD, (st), (val), (i)) +# define sk_EVP_PKEY_METHOD_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(EVP_PKEY_METHOD, (st), (cmp)) +# define sk_EVP_PKEY_METHOD_dup(st) SKM_sk_dup(EVP_PKEY_METHOD, st) +# define sk_EVP_PKEY_METHOD_pop_free(st, free_func) SKM_sk_pop_free(EVP_PKEY_METHOD, (st), (free_func)) +# define sk_EVP_PKEY_METHOD_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(EVP_PKEY_METHOD, (st), (copy_func), (free_func)) +# define sk_EVP_PKEY_METHOD_shift(st) SKM_sk_shift(EVP_PKEY_METHOD, (st)) +# define sk_EVP_PKEY_METHOD_pop(st) SKM_sk_pop(EVP_PKEY_METHOD, (st)) +# define sk_EVP_PKEY_METHOD_sort(st) SKM_sk_sort(EVP_PKEY_METHOD, (st)) +# define sk_EVP_PKEY_METHOD_is_sorted(st) SKM_sk_is_sorted(EVP_PKEY_METHOD, (st)) +# define sk_GENERAL_NAME_new(cmp) SKM_sk_new(GENERAL_NAME, (cmp)) +# define sk_GENERAL_NAME_new_null() SKM_sk_new_null(GENERAL_NAME) +# define sk_GENERAL_NAME_free(st) SKM_sk_free(GENERAL_NAME, (st)) +# define sk_GENERAL_NAME_num(st) SKM_sk_num(GENERAL_NAME, (st)) +# define sk_GENERAL_NAME_value(st, i) SKM_sk_value(GENERAL_NAME, (st), (i)) +# define sk_GENERAL_NAME_set(st, i, val) SKM_sk_set(GENERAL_NAME, (st), (i), (val)) +# define sk_GENERAL_NAME_zero(st) SKM_sk_zero(GENERAL_NAME, (st)) +# define sk_GENERAL_NAME_push(st, val) SKM_sk_push(GENERAL_NAME, (st), (val)) +# define sk_GENERAL_NAME_unshift(st, val) SKM_sk_unshift(GENERAL_NAME, (st), (val)) +# define sk_GENERAL_NAME_find(st, val) SKM_sk_find(GENERAL_NAME, (st), (val)) +# define sk_GENERAL_NAME_find_ex(st, val) SKM_sk_find_ex(GENERAL_NAME, (st), (val)) +# define sk_GENERAL_NAME_delete(st, i) SKM_sk_delete(GENERAL_NAME, (st), (i)) +# define sk_GENERAL_NAME_delete_ptr(st, ptr) SKM_sk_delete_ptr(GENERAL_NAME, (st), (ptr)) +# define sk_GENERAL_NAME_insert(st, val, i) SKM_sk_insert(GENERAL_NAME, (st), (val), (i)) +# define sk_GENERAL_NAME_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(GENERAL_NAME, (st), (cmp)) +# define sk_GENERAL_NAME_dup(st) SKM_sk_dup(GENERAL_NAME, st) +# define sk_GENERAL_NAME_pop_free(st, free_func) SKM_sk_pop_free(GENERAL_NAME, (st), (free_func)) +# define sk_GENERAL_NAME_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(GENERAL_NAME, (st), (copy_func), (free_func)) +# define sk_GENERAL_NAME_shift(st) SKM_sk_shift(GENERAL_NAME, (st)) +# define sk_GENERAL_NAME_pop(st) SKM_sk_pop(GENERAL_NAME, (st)) +# define sk_GENERAL_NAME_sort(st) SKM_sk_sort(GENERAL_NAME, (st)) +# define sk_GENERAL_NAME_is_sorted(st) SKM_sk_is_sorted(GENERAL_NAME, (st)) +# define sk_GENERAL_NAMES_new(cmp) SKM_sk_new(GENERAL_NAMES, (cmp)) +# define sk_GENERAL_NAMES_new_null() SKM_sk_new_null(GENERAL_NAMES) +# define sk_GENERAL_NAMES_free(st) SKM_sk_free(GENERAL_NAMES, (st)) +# define sk_GENERAL_NAMES_num(st) SKM_sk_num(GENERAL_NAMES, (st)) +# define sk_GENERAL_NAMES_value(st, i) SKM_sk_value(GENERAL_NAMES, (st), (i)) +# define sk_GENERAL_NAMES_set(st, i, val) SKM_sk_set(GENERAL_NAMES, (st), (i), (val)) +# define sk_GENERAL_NAMES_zero(st) SKM_sk_zero(GENERAL_NAMES, (st)) +# define sk_GENERAL_NAMES_push(st, val) SKM_sk_push(GENERAL_NAMES, (st), (val)) +# define sk_GENERAL_NAMES_unshift(st, val) SKM_sk_unshift(GENERAL_NAMES, (st), (val)) +# define sk_GENERAL_NAMES_find(st, val) SKM_sk_find(GENERAL_NAMES, (st), (val)) +# define sk_GENERAL_NAMES_find_ex(st, val) SKM_sk_find_ex(GENERAL_NAMES, (st), (val)) +# define sk_GENERAL_NAMES_delete(st, i) SKM_sk_delete(GENERAL_NAMES, (st), (i)) +# define sk_GENERAL_NAMES_delete_ptr(st, ptr) SKM_sk_delete_ptr(GENERAL_NAMES, (st), (ptr)) +# define sk_GENERAL_NAMES_insert(st, val, i) SKM_sk_insert(GENERAL_NAMES, (st), (val), (i)) +# define sk_GENERAL_NAMES_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(GENERAL_NAMES, (st), (cmp)) +# define sk_GENERAL_NAMES_dup(st) SKM_sk_dup(GENERAL_NAMES, st) +# define sk_GENERAL_NAMES_pop_free(st, free_func) SKM_sk_pop_free(GENERAL_NAMES, (st), (free_func)) +# define sk_GENERAL_NAMES_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(GENERAL_NAMES, (st), (copy_func), (free_func)) +# define sk_GENERAL_NAMES_shift(st) SKM_sk_shift(GENERAL_NAMES, (st)) +# define sk_GENERAL_NAMES_pop(st) SKM_sk_pop(GENERAL_NAMES, (st)) +# define sk_GENERAL_NAMES_sort(st) SKM_sk_sort(GENERAL_NAMES, (st)) +# define sk_GENERAL_NAMES_is_sorted(st) SKM_sk_is_sorted(GENERAL_NAMES, (st)) +# define sk_GENERAL_SUBTREE_new(cmp) SKM_sk_new(GENERAL_SUBTREE, (cmp)) +# define sk_GENERAL_SUBTREE_new_null() SKM_sk_new_null(GENERAL_SUBTREE) +# define sk_GENERAL_SUBTREE_free(st) SKM_sk_free(GENERAL_SUBTREE, (st)) +# define sk_GENERAL_SUBTREE_num(st) SKM_sk_num(GENERAL_SUBTREE, (st)) +# define sk_GENERAL_SUBTREE_value(st, i) SKM_sk_value(GENERAL_SUBTREE, (st), (i)) +# define sk_GENERAL_SUBTREE_set(st, i, val) SKM_sk_set(GENERAL_SUBTREE, (st), (i), (val)) +# define sk_GENERAL_SUBTREE_zero(st) SKM_sk_zero(GENERAL_SUBTREE, (st)) +# define sk_GENERAL_SUBTREE_push(st, val) SKM_sk_push(GENERAL_SUBTREE, (st), (val)) +# define sk_GENERAL_SUBTREE_unshift(st, val) SKM_sk_unshift(GENERAL_SUBTREE, (st), (val)) +# define sk_GENERAL_SUBTREE_find(st, val) SKM_sk_find(GENERAL_SUBTREE, (st), (val)) +# define sk_GENERAL_SUBTREE_find_ex(st, val) SKM_sk_find_ex(GENERAL_SUBTREE, (st), (val)) +# define sk_GENERAL_SUBTREE_delete(st, i) SKM_sk_delete(GENERAL_SUBTREE, (st), (i)) +# define sk_GENERAL_SUBTREE_delete_ptr(st, ptr) SKM_sk_delete_ptr(GENERAL_SUBTREE, (st), (ptr)) +# define sk_GENERAL_SUBTREE_insert(st, val, i) SKM_sk_insert(GENERAL_SUBTREE, (st), (val), (i)) +# define sk_GENERAL_SUBTREE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(GENERAL_SUBTREE, (st), (cmp)) +# define sk_GENERAL_SUBTREE_dup(st) SKM_sk_dup(GENERAL_SUBTREE, st) +# define sk_GENERAL_SUBTREE_pop_free(st, free_func) SKM_sk_pop_free(GENERAL_SUBTREE, (st), (free_func)) +# define sk_GENERAL_SUBTREE_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(GENERAL_SUBTREE, (st), (copy_func), (free_func)) +# define sk_GENERAL_SUBTREE_shift(st) SKM_sk_shift(GENERAL_SUBTREE, (st)) +# define sk_GENERAL_SUBTREE_pop(st) SKM_sk_pop(GENERAL_SUBTREE, (st)) +# define sk_GENERAL_SUBTREE_sort(st) SKM_sk_sort(GENERAL_SUBTREE, (st)) +# define sk_GENERAL_SUBTREE_is_sorted(st) SKM_sk_is_sorted(GENERAL_SUBTREE, (st)) +# define sk_IPAddressFamily_new(cmp) SKM_sk_new(IPAddressFamily, (cmp)) +# define sk_IPAddressFamily_new_null() SKM_sk_new_null(IPAddressFamily) +# define sk_IPAddressFamily_free(st) SKM_sk_free(IPAddressFamily, (st)) +# define sk_IPAddressFamily_num(st) SKM_sk_num(IPAddressFamily, (st)) +# define sk_IPAddressFamily_value(st, i) SKM_sk_value(IPAddressFamily, (st), (i)) +# define sk_IPAddressFamily_set(st, i, val) SKM_sk_set(IPAddressFamily, (st), (i), (val)) +# define sk_IPAddressFamily_zero(st) SKM_sk_zero(IPAddressFamily, (st)) +# define sk_IPAddressFamily_push(st, val) SKM_sk_push(IPAddressFamily, (st), (val)) +# define sk_IPAddressFamily_unshift(st, val) SKM_sk_unshift(IPAddressFamily, (st), (val)) +# define sk_IPAddressFamily_find(st, val) SKM_sk_find(IPAddressFamily, (st), (val)) +# define sk_IPAddressFamily_find_ex(st, val) SKM_sk_find_ex(IPAddressFamily, (st), (val)) +# define sk_IPAddressFamily_delete(st, i) SKM_sk_delete(IPAddressFamily, (st), (i)) +# define sk_IPAddressFamily_delete_ptr(st, ptr) SKM_sk_delete_ptr(IPAddressFamily, (st), (ptr)) +# define sk_IPAddressFamily_insert(st, val, i) SKM_sk_insert(IPAddressFamily, (st), (val), (i)) +# define sk_IPAddressFamily_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(IPAddressFamily, (st), (cmp)) +# define sk_IPAddressFamily_dup(st) SKM_sk_dup(IPAddressFamily, st) +# define sk_IPAddressFamily_pop_free(st, free_func) SKM_sk_pop_free(IPAddressFamily, (st), (free_func)) +# define sk_IPAddressFamily_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(IPAddressFamily, (st), (copy_func), (free_func)) +# define sk_IPAddressFamily_shift(st) SKM_sk_shift(IPAddressFamily, (st)) +# define sk_IPAddressFamily_pop(st) SKM_sk_pop(IPAddressFamily, (st)) +# define sk_IPAddressFamily_sort(st) SKM_sk_sort(IPAddressFamily, (st)) +# define sk_IPAddressFamily_is_sorted(st) SKM_sk_is_sorted(IPAddressFamily, (st)) +# define sk_IPAddressOrRange_new(cmp) SKM_sk_new(IPAddressOrRange, (cmp)) +# define sk_IPAddressOrRange_new_null() SKM_sk_new_null(IPAddressOrRange) +# define sk_IPAddressOrRange_free(st) SKM_sk_free(IPAddressOrRange, (st)) +# define sk_IPAddressOrRange_num(st) SKM_sk_num(IPAddressOrRange, (st)) +# define sk_IPAddressOrRange_value(st, i) SKM_sk_value(IPAddressOrRange, (st), (i)) +# define sk_IPAddressOrRange_set(st, i, val) SKM_sk_set(IPAddressOrRange, (st), (i), (val)) +# define sk_IPAddressOrRange_zero(st) SKM_sk_zero(IPAddressOrRange, (st)) +# define sk_IPAddressOrRange_push(st, val) SKM_sk_push(IPAddressOrRange, (st), (val)) +# define sk_IPAddressOrRange_unshift(st, val) SKM_sk_unshift(IPAddressOrRange, (st), (val)) +# define sk_IPAddressOrRange_find(st, val) SKM_sk_find(IPAddressOrRange, (st), (val)) +# define sk_IPAddressOrRange_find_ex(st, val) SKM_sk_find_ex(IPAddressOrRange, (st), (val)) +# define sk_IPAddressOrRange_delete(st, i) SKM_sk_delete(IPAddressOrRange, (st), (i)) +# define sk_IPAddressOrRange_delete_ptr(st, ptr) SKM_sk_delete_ptr(IPAddressOrRange, (st), (ptr)) +# define sk_IPAddressOrRange_insert(st, val, i) SKM_sk_insert(IPAddressOrRange, (st), (val), (i)) +# define sk_IPAddressOrRange_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(IPAddressOrRange, (st), (cmp)) +# define sk_IPAddressOrRange_dup(st) SKM_sk_dup(IPAddressOrRange, st) +# define sk_IPAddressOrRange_pop_free(st, free_func) SKM_sk_pop_free(IPAddressOrRange, (st), (free_func)) +# define sk_IPAddressOrRange_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(IPAddressOrRange, (st), (copy_func), (free_func)) +# define sk_IPAddressOrRange_shift(st) SKM_sk_shift(IPAddressOrRange, (st)) +# define sk_IPAddressOrRange_pop(st) SKM_sk_pop(IPAddressOrRange, (st)) +# define sk_IPAddressOrRange_sort(st) SKM_sk_sort(IPAddressOrRange, (st)) +# define sk_IPAddressOrRange_is_sorted(st) SKM_sk_is_sorted(IPAddressOrRange, (st)) +# define sk_KRB5_APREQBODY_new(cmp) SKM_sk_new(KRB5_APREQBODY, (cmp)) +# define sk_KRB5_APREQBODY_new_null() SKM_sk_new_null(KRB5_APREQBODY) +# define sk_KRB5_APREQBODY_free(st) SKM_sk_free(KRB5_APREQBODY, (st)) +# define sk_KRB5_APREQBODY_num(st) SKM_sk_num(KRB5_APREQBODY, (st)) +# define sk_KRB5_APREQBODY_value(st, i) SKM_sk_value(KRB5_APREQBODY, (st), (i)) +# define sk_KRB5_APREQBODY_set(st, i, val) SKM_sk_set(KRB5_APREQBODY, (st), (i), (val)) +# define sk_KRB5_APREQBODY_zero(st) SKM_sk_zero(KRB5_APREQBODY, (st)) +# define sk_KRB5_APREQBODY_push(st, val) SKM_sk_push(KRB5_APREQBODY, (st), (val)) +# define sk_KRB5_APREQBODY_unshift(st, val) SKM_sk_unshift(KRB5_APREQBODY, (st), (val)) +# define sk_KRB5_APREQBODY_find(st, val) SKM_sk_find(KRB5_APREQBODY, (st), (val)) +# define sk_KRB5_APREQBODY_find_ex(st, val) SKM_sk_find_ex(KRB5_APREQBODY, (st), (val)) +# define sk_KRB5_APREQBODY_delete(st, i) SKM_sk_delete(KRB5_APREQBODY, (st), (i)) +# define sk_KRB5_APREQBODY_delete_ptr(st, ptr) SKM_sk_delete_ptr(KRB5_APREQBODY, (st), (ptr)) +# define sk_KRB5_APREQBODY_insert(st, val, i) SKM_sk_insert(KRB5_APREQBODY, (st), (val), (i)) +# define sk_KRB5_APREQBODY_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(KRB5_APREQBODY, (st), (cmp)) +# define sk_KRB5_APREQBODY_dup(st) SKM_sk_dup(KRB5_APREQBODY, st) +# define sk_KRB5_APREQBODY_pop_free(st, free_func) SKM_sk_pop_free(KRB5_APREQBODY, (st), (free_func)) +# define sk_KRB5_APREQBODY_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(KRB5_APREQBODY, (st), (copy_func), (free_func)) +# define sk_KRB5_APREQBODY_shift(st) SKM_sk_shift(KRB5_APREQBODY, (st)) +# define sk_KRB5_APREQBODY_pop(st) SKM_sk_pop(KRB5_APREQBODY, (st)) +# define sk_KRB5_APREQBODY_sort(st) SKM_sk_sort(KRB5_APREQBODY, (st)) +# define sk_KRB5_APREQBODY_is_sorted(st) SKM_sk_is_sorted(KRB5_APREQBODY, (st)) +# define sk_KRB5_AUTHDATA_new(cmp) SKM_sk_new(KRB5_AUTHDATA, (cmp)) +# define sk_KRB5_AUTHDATA_new_null() SKM_sk_new_null(KRB5_AUTHDATA) +# define sk_KRB5_AUTHDATA_free(st) SKM_sk_free(KRB5_AUTHDATA, (st)) +# define sk_KRB5_AUTHDATA_num(st) SKM_sk_num(KRB5_AUTHDATA, (st)) +# define sk_KRB5_AUTHDATA_value(st, i) SKM_sk_value(KRB5_AUTHDATA, (st), (i)) +# define sk_KRB5_AUTHDATA_set(st, i, val) SKM_sk_set(KRB5_AUTHDATA, (st), (i), (val)) +# define sk_KRB5_AUTHDATA_zero(st) SKM_sk_zero(KRB5_AUTHDATA, (st)) +# define sk_KRB5_AUTHDATA_push(st, val) SKM_sk_push(KRB5_AUTHDATA, (st), (val)) +# define sk_KRB5_AUTHDATA_unshift(st, val) SKM_sk_unshift(KRB5_AUTHDATA, (st), (val)) +# define sk_KRB5_AUTHDATA_find(st, val) SKM_sk_find(KRB5_AUTHDATA, (st), (val)) +# define sk_KRB5_AUTHDATA_find_ex(st, val) SKM_sk_find_ex(KRB5_AUTHDATA, (st), (val)) +# define sk_KRB5_AUTHDATA_delete(st, i) SKM_sk_delete(KRB5_AUTHDATA, (st), (i)) +# define sk_KRB5_AUTHDATA_delete_ptr(st, ptr) SKM_sk_delete_ptr(KRB5_AUTHDATA, (st), (ptr)) +# define sk_KRB5_AUTHDATA_insert(st, val, i) SKM_sk_insert(KRB5_AUTHDATA, (st), (val), (i)) +# define sk_KRB5_AUTHDATA_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(KRB5_AUTHDATA, (st), (cmp)) +# define sk_KRB5_AUTHDATA_dup(st) SKM_sk_dup(KRB5_AUTHDATA, st) +# define sk_KRB5_AUTHDATA_pop_free(st, free_func) SKM_sk_pop_free(KRB5_AUTHDATA, (st), (free_func)) +# define sk_KRB5_AUTHDATA_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(KRB5_AUTHDATA, (st), (copy_func), (free_func)) +# define sk_KRB5_AUTHDATA_shift(st) SKM_sk_shift(KRB5_AUTHDATA, (st)) +# define sk_KRB5_AUTHDATA_pop(st) SKM_sk_pop(KRB5_AUTHDATA, (st)) +# define sk_KRB5_AUTHDATA_sort(st) SKM_sk_sort(KRB5_AUTHDATA, (st)) +# define sk_KRB5_AUTHDATA_is_sorted(st) SKM_sk_is_sorted(KRB5_AUTHDATA, (st)) +# define sk_KRB5_AUTHENTBODY_new(cmp) SKM_sk_new(KRB5_AUTHENTBODY, (cmp)) +# define sk_KRB5_AUTHENTBODY_new_null() SKM_sk_new_null(KRB5_AUTHENTBODY) +# define sk_KRB5_AUTHENTBODY_free(st) SKM_sk_free(KRB5_AUTHENTBODY, (st)) +# define sk_KRB5_AUTHENTBODY_num(st) SKM_sk_num(KRB5_AUTHENTBODY, (st)) +# define sk_KRB5_AUTHENTBODY_value(st, i) SKM_sk_value(KRB5_AUTHENTBODY, (st), (i)) +# define sk_KRB5_AUTHENTBODY_set(st, i, val) SKM_sk_set(KRB5_AUTHENTBODY, (st), (i), (val)) +# define sk_KRB5_AUTHENTBODY_zero(st) SKM_sk_zero(KRB5_AUTHENTBODY, (st)) +# define sk_KRB5_AUTHENTBODY_push(st, val) SKM_sk_push(KRB5_AUTHENTBODY, (st), (val)) +# define sk_KRB5_AUTHENTBODY_unshift(st, val) SKM_sk_unshift(KRB5_AUTHENTBODY, (st), (val)) +# define sk_KRB5_AUTHENTBODY_find(st, val) SKM_sk_find(KRB5_AUTHENTBODY, (st), (val)) +# define sk_KRB5_AUTHENTBODY_find_ex(st, val) SKM_sk_find_ex(KRB5_AUTHENTBODY, (st), (val)) +# define sk_KRB5_AUTHENTBODY_delete(st, i) SKM_sk_delete(KRB5_AUTHENTBODY, (st), (i)) +# define sk_KRB5_AUTHENTBODY_delete_ptr(st, ptr) SKM_sk_delete_ptr(KRB5_AUTHENTBODY, (st), (ptr)) +# define sk_KRB5_AUTHENTBODY_insert(st, val, i) SKM_sk_insert(KRB5_AUTHENTBODY, (st), (val), (i)) +# define sk_KRB5_AUTHENTBODY_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(KRB5_AUTHENTBODY, (st), (cmp)) +# define sk_KRB5_AUTHENTBODY_dup(st) SKM_sk_dup(KRB5_AUTHENTBODY, st) +# define sk_KRB5_AUTHENTBODY_pop_free(st, free_func) SKM_sk_pop_free(KRB5_AUTHENTBODY, (st), (free_func)) +# define sk_KRB5_AUTHENTBODY_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(KRB5_AUTHENTBODY, (st), (copy_func), (free_func)) +# define sk_KRB5_AUTHENTBODY_shift(st) SKM_sk_shift(KRB5_AUTHENTBODY, (st)) +# define sk_KRB5_AUTHENTBODY_pop(st) SKM_sk_pop(KRB5_AUTHENTBODY, (st)) +# define sk_KRB5_AUTHENTBODY_sort(st) SKM_sk_sort(KRB5_AUTHENTBODY, (st)) +# define sk_KRB5_AUTHENTBODY_is_sorted(st) SKM_sk_is_sorted(KRB5_AUTHENTBODY, (st)) +# define sk_KRB5_CHECKSUM_new(cmp) SKM_sk_new(KRB5_CHECKSUM, (cmp)) +# define sk_KRB5_CHECKSUM_new_null() SKM_sk_new_null(KRB5_CHECKSUM) +# define sk_KRB5_CHECKSUM_free(st) SKM_sk_free(KRB5_CHECKSUM, (st)) +# define sk_KRB5_CHECKSUM_num(st) SKM_sk_num(KRB5_CHECKSUM, (st)) +# define sk_KRB5_CHECKSUM_value(st, i) SKM_sk_value(KRB5_CHECKSUM, (st), (i)) +# define sk_KRB5_CHECKSUM_set(st, i, val) SKM_sk_set(KRB5_CHECKSUM, (st), (i), (val)) +# define sk_KRB5_CHECKSUM_zero(st) SKM_sk_zero(KRB5_CHECKSUM, (st)) +# define sk_KRB5_CHECKSUM_push(st, val) SKM_sk_push(KRB5_CHECKSUM, (st), (val)) +# define sk_KRB5_CHECKSUM_unshift(st, val) SKM_sk_unshift(KRB5_CHECKSUM, (st), (val)) +# define sk_KRB5_CHECKSUM_find(st, val) SKM_sk_find(KRB5_CHECKSUM, (st), (val)) +# define sk_KRB5_CHECKSUM_find_ex(st, val) SKM_sk_find_ex(KRB5_CHECKSUM, (st), (val)) +# define sk_KRB5_CHECKSUM_delete(st, i) SKM_sk_delete(KRB5_CHECKSUM, (st), (i)) +# define sk_KRB5_CHECKSUM_delete_ptr(st, ptr) SKM_sk_delete_ptr(KRB5_CHECKSUM, (st), (ptr)) +# define sk_KRB5_CHECKSUM_insert(st, val, i) SKM_sk_insert(KRB5_CHECKSUM, (st), (val), (i)) +# define sk_KRB5_CHECKSUM_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(KRB5_CHECKSUM, (st), (cmp)) +# define sk_KRB5_CHECKSUM_dup(st) SKM_sk_dup(KRB5_CHECKSUM, st) +# define sk_KRB5_CHECKSUM_pop_free(st, free_func) SKM_sk_pop_free(KRB5_CHECKSUM, (st), (free_func)) +# define sk_KRB5_CHECKSUM_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(KRB5_CHECKSUM, (st), (copy_func), (free_func)) +# define sk_KRB5_CHECKSUM_shift(st) SKM_sk_shift(KRB5_CHECKSUM, (st)) +# define sk_KRB5_CHECKSUM_pop(st) SKM_sk_pop(KRB5_CHECKSUM, (st)) +# define sk_KRB5_CHECKSUM_sort(st) SKM_sk_sort(KRB5_CHECKSUM, (st)) +# define sk_KRB5_CHECKSUM_is_sorted(st) SKM_sk_is_sorted(KRB5_CHECKSUM, (st)) +# define sk_KRB5_ENCDATA_new(cmp) SKM_sk_new(KRB5_ENCDATA, (cmp)) +# define sk_KRB5_ENCDATA_new_null() SKM_sk_new_null(KRB5_ENCDATA) +# define sk_KRB5_ENCDATA_free(st) SKM_sk_free(KRB5_ENCDATA, (st)) +# define sk_KRB5_ENCDATA_num(st) SKM_sk_num(KRB5_ENCDATA, (st)) +# define sk_KRB5_ENCDATA_value(st, i) SKM_sk_value(KRB5_ENCDATA, (st), (i)) +# define sk_KRB5_ENCDATA_set(st, i, val) SKM_sk_set(KRB5_ENCDATA, (st), (i), (val)) +# define sk_KRB5_ENCDATA_zero(st) SKM_sk_zero(KRB5_ENCDATA, (st)) +# define sk_KRB5_ENCDATA_push(st, val) SKM_sk_push(KRB5_ENCDATA, (st), (val)) +# define sk_KRB5_ENCDATA_unshift(st, val) SKM_sk_unshift(KRB5_ENCDATA, (st), (val)) +# define sk_KRB5_ENCDATA_find(st, val) SKM_sk_find(KRB5_ENCDATA, (st), (val)) +# define sk_KRB5_ENCDATA_find_ex(st, val) SKM_sk_find_ex(KRB5_ENCDATA, (st), (val)) +# define sk_KRB5_ENCDATA_delete(st, i) SKM_sk_delete(KRB5_ENCDATA, (st), (i)) +# define sk_KRB5_ENCDATA_delete_ptr(st, ptr) SKM_sk_delete_ptr(KRB5_ENCDATA, (st), (ptr)) +# define sk_KRB5_ENCDATA_insert(st, val, i) SKM_sk_insert(KRB5_ENCDATA, (st), (val), (i)) +# define sk_KRB5_ENCDATA_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(KRB5_ENCDATA, (st), (cmp)) +# define sk_KRB5_ENCDATA_dup(st) SKM_sk_dup(KRB5_ENCDATA, st) +# define sk_KRB5_ENCDATA_pop_free(st, free_func) SKM_sk_pop_free(KRB5_ENCDATA, (st), (free_func)) +# define sk_KRB5_ENCDATA_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(KRB5_ENCDATA, (st), (copy_func), (free_func)) +# define sk_KRB5_ENCDATA_shift(st) SKM_sk_shift(KRB5_ENCDATA, (st)) +# define sk_KRB5_ENCDATA_pop(st) SKM_sk_pop(KRB5_ENCDATA, (st)) +# define sk_KRB5_ENCDATA_sort(st) SKM_sk_sort(KRB5_ENCDATA, (st)) +# define sk_KRB5_ENCDATA_is_sorted(st) SKM_sk_is_sorted(KRB5_ENCDATA, (st)) +# define sk_KRB5_ENCKEY_new(cmp) SKM_sk_new(KRB5_ENCKEY, (cmp)) +# define sk_KRB5_ENCKEY_new_null() SKM_sk_new_null(KRB5_ENCKEY) +# define sk_KRB5_ENCKEY_free(st) SKM_sk_free(KRB5_ENCKEY, (st)) +# define sk_KRB5_ENCKEY_num(st) SKM_sk_num(KRB5_ENCKEY, (st)) +# define sk_KRB5_ENCKEY_value(st, i) SKM_sk_value(KRB5_ENCKEY, (st), (i)) +# define sk_KRB5_ENCKEY_set(st, i, val) SKM_sk_set(KRB5_ENCKEY, (st), (i), (val)) +# define sk_KRB5_ENCKEY_zero(st) SKM_sk_zero(KRB5_ENCKEY, (st)) +# define sk_KRB5_ENCKEY_push(st, val) SKM_sk_push(KRB5_ENCKEY, (st), (val)) +# define sk_KRB5_ENCKEY_unshift(st, val) SKM_sk_unshift(KRB5_ENCKEY, (st), (val)) +# define sk_KRB5_ENCKEY_find(st, val) SKM_sk_find(KRB5_ENCKEY, (st), (val)) +# define sk_KRB5_ENCKEY_find_ex(st, val) SKM_sk_find_ex(KRB5_ENCKEY, (st), (val)) +# define sk_KRB5_ENCKEY_delete(st, i) SKM_sk_delete(KRB5_ENCKEY, (st), (i)) +# define sk_KRB5_ENCKEY_delete_ptr(st, ptr) SKM_sk_delete_ptr(KRB5_ENCKEY, (st), (ptr)) +# define sk_KRB5_ENCKEY_insert(st, val, i) SKM_sk_insert(KRB5_ENCKEY, (st), (val), (i)) +# define sk_KRB5_ENCKEY_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(KRB5_ENCKEY, (st), (cmp)) +# define sk_KRB5_ENCKEY_dup(st) SKM_sk_dup(KRB5_ENCKEY, st) +# define sk_KRB5_ENCKEY_pop_free(st, free_func) SKM_sk_pop_free(KRB5_ENCKEY, (st), (free_func)) +# define sk_KRB5_ENCKEY_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(KRB5_ENCKEY, (st), (copy_func), (free_func)) +# define sk_KRB5_ENCKEY_shift(st) SKM_sk_shift(KRB5_ENCKEY, (st)) +# define sk_KRB5_ENCKEY_pop(st) SKM_sk_pop(KRB5_ENCKEY, (st)) +# define sk_KRB5_ENCKEY_sort(st) SKM_sk_sort(KRB5_ENCKEY, (st)) +# define sk_KRB5_ENCKEY_is_sorted(st) SKM_sk_is_sorted(KRB5_ENCKEY, (st)) +# define sk_KRB5_PRINCNAME_new(cmp) SKM_sk_new(KRB5_PRINCNAME, (cmp)) +# define sk_KRB5_PRINCNAME_new_null() SKM_sk_new_null(KRB5_PRINCNAME) +# define sk_KRB5_PRINCNAME_free(st) SKM_sk_free(KRB5_PRINCNAME, (st)) +# define sk_KRB5_PRINCNAME_num(st) SKM_sk_num(KRB5_PRINCNAME, (st)) +# define sk_KRB5_PRINCNAME_value(st, i) SKM_sk_value(KRB5_PRINCNAME, (st), (i)) +# define sk_KRB5_PRINCNAME_set(st, i, val) SKM_sk_set(KRB5_PRINCNAME, (st), (i), (val)) +# define sk_KRB5_PRINCNAME_zero(st) SKM_sk_zero(KRB5_PRINCNAME, (st)) +# define sk_KRB5_PRINCNAME_push(st, val) SKM_sk_push(KRB5_PRINCNAME, (st), (val)) +# define sk_KRB5_PRINCNAME_unshift(st, val) SKM_sk_unshift(KRB5_PRINCNAME, (st), (val)) +# define sk_KRB5_PRINCNAME_find(st, val) SKM_sk_find(KRB5_PRINCNAME, (st), (val)) +# define sk_KRB5_PRINCNAME_find_ex(st, val) SKM_sk_find_ex(KRB5_PRINCNAME, (st), (val)) +# define sk_KRB5_PRINCNAME_delete(st, i) SKM_sk_delete(KRB5_PRINCNAME, (st), (i)) +# define sk_KRB5_PRINCNAME_delete_ptr(st, ptr) SKM_sk_delete_ptr(KRB5_PRINCNAME, (st), (ptr)) +# define sk_KRB5_PRINCNAME_insert(st, val, i) SKM_sk_insert(KRB5_PRINCNAME, (st), (val), (i)) +# define sk_KRB5_PRINCNAME_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(KRB5_PRINCNAME, (st), (cmp)) +# define sk_KRB5_PRINCNAME_dup(st) SKM_sk_dup(KRB5_PRINCNAME, st) +# define sk_KRB5_PRINCNAME_pop_free(st, free_func) SKM_sk_pop_free(KRB5_PRINCNAME, (st), (free_func)) +# define sk_KRB5_PRINCNAME_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(KRB5_PRINCNAME, (st), (copy_func), (free_func)) +# define sk_KRB5_PRINCNAME_shift(st) SKM_sk_shift(KRB5_PRINCNAME, (st)) +# define sk_KRB5_PRINCNAME_pop(st) SKM_sk_pop(KRB5_PRINCNAME, (st)) +# define sk_KRB5_PRINCNAME_sort(st) SKM_sk_sort(KRB5_PRINCNAME, (st)) +# define sk_KRB5_PRINCNAME_is_sorted(st) SKM_sk_is_sorted(KRB5_PRINCNAME, (st)) +# define sk_KRB5_TKTBODY_new(cmp) SKM_sk_new(KRB5_TKTBODY, (cmp)) +# define sk_KRB5_TKTBODY_new_null() SKM_sk_new_null(KRB5_TKTBODY) +# define sk_KRB5_TKTBODY_free(st) SKM_sk_free(KRB5_TKTBODY, (st)) +# define sk_KRB5_TKTBODY_num(st) SKM_sk_num(KRB5_TKTBODY, (st)) +# define sk_KRB5_TKTBODY_value(st, i) SKM_sk_value(KRB5_TKTBODY, (st), (i)) +# define sk_KRB5_TKTBODY_set(st, i, val) SKM_sk_set(KRB5_TKTBODY, (st), (i), (val)) +# define sk_KRB5_TKTBODY_zero(st) SKM_sk_zero(KRB5_TKTBODY, (st)) +# define sk_KRB5_TKTBODY_push(st, val) SKM_sk_push(KRB5_TKTBODY, (st), (val)) +# define sk_KRB5_TKTBODY_unshift(st, val) SKM_sk_unshift(KRB5_TKTBODY, (st), (val)) +# define sk_KRB5_TKTBODY_find(st, val) SKM_sk_find(KRB5_TKTBODY, (st), (val)) +# define sk_KRB5_TKTBODY_find_ex(st, val) SKM_sk_find_ex(KRB5_TKTBODY, (st), (val)) +# define sk_KRB5_TKTBODY_delete(st, i) SKM_sk_delete(KRB5_TKTBODY, (st), (i)) +# define sk_KRB5_TKTBODY_delete_ptr(st, ptr) SKM_sk_delete_ptr(KRB5_TKTBODY, (st), (ptr)) +# define sk_KRB5_TKTBODY_insert(st, val, i) SKM_sk_insert(KRB5_TKTBODY, (st), (val), (i)) +# define sk_KRB5_TKTBODY_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(KRB5_TKTBODY, (st), (cmp)) +# define sk_KRB5_TKTBODY_dup(st) SKM_sk_dup(KRB5_TKTBODY, st) +# define sk_KRB5_TKTBODY_pop_free(st, free_func) SKM_sk_pop_free(KRB5_TKTBODY, (st), (free_func)) +# define sk_KRB5_TKTBODY_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(KRB5_TKTBODY, (st), (copy_func), (free_func)) +# define sk_KRB5_TKTBODY_shift(st) SKM_sk_shift(KRB5_TKTBODY, (st)) +# define sk_KRB5_TKTBODY_pop(st) SKM_sk_pop(KRB5_TKTBODY, (st)) +# define sk_KRB5_TKTBODY_sort(st) SKM_sk_sort(KRB5_TKTBODY, (st)) +# define sk_KRB5_TKTBODY_is_sorted(st) SKM_sk_is_sorted(KRB5_TKTBODY, (st)) +# define sk_MEM_OBJECT_DATA_new(cmp) SKM_sk_new(MEM_OBJECT_DATA, (cmp)) +# define sk_MEM_OBJECT_DATA_new_null() SKM_sk_new_null(MEM_OBJECT_DATA) +# define sk_MEM_OBJECT_DATA_free(st) SKM_sk_free(MEM_OBJECT_DATA, (st)) +# define sk_MEM_OBJECT_DATA_num(st) SKM_sk_num(MEM_OBJECT_DATA, (st)) +# define sk_MEM_OBJECT_DATA_value(st, i) SKM_sk_value(MEM_OBJECT_DATA, (st), (i)) +# define sk_MEM_OBJECT_DATA_set(st, i, val) SKM_sk_set(MEM_OBJECT_DATA, (st), (i), (val)) +# define sk_MEM_OBJECT_DATA_zero(st) SKM_sk_zero(MEM_OBJECT_DATA, (st)) +# define sk_MEM_OBJECT_DATA_push(st, val) SKM_sk_push(MEM_OBJECT_DATA, (st), (val)) +# define sk_MEM_OBJECT_DATA_unshift(st, val) SKM_sk_unshift(MEM_OBJECT_DATA, (st), (val)) +# define sk_MEM_OBJECT_DATA_find(st, val) SKM_sk_find(MEM_OBJECT_DATA, (st), (val)) +# define sk_MEM_OBJECT_DATA_find_ex(st, val) SKM_sk_find_ex(MEM_OBJECT_DATA, (st), (val)) +# define sk_MEM_OBJECT_DATA_delete(st, i) SKM_sk_delete(MEM_OBJECT_DATA, (st), (i)) +# define sk_MEM_OBJECT_DATA_delete_ptr(st, ptr) SKM_sk_delete_ptr(MEM_OBJECT_DATA, (st), (ptr)) +# define sk_MEM_OBJECT_DATA_insert(st, val, i) SKM_sk_insert(MEM_OBJECT_DATA, (st), (val), (i)) +# define sk_MEM_OBJECT_DATA_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(MEM_OBJECT_DATA, (st), (cmp)) +# define sk_MEM_OBJECT_DATA_dup(st) SKM_sk_dup(MEM_OBJECT_DATA, st) +# define sk_MEM_OBJECT_DATA_pop_free(st, free_func) SKM_sk_pop_free(MEM_OBJECT_DATA, (st), (free_func)) +# define sk_MEM_OBJECT_DATA_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(MEM_OBJECT_DATA, (st), (copy_func), (free_func)) +# define sk_MEM_OBJECT_DATA_shift(st) SKM_sk_shift(MEM_OBJECT_DATA, (st)) +# define sk_MEM_OBJECT_DATA_pop(st) SKM_sk_pop(MEM_OBJECT_DATA, (st)) +# define sk_MEM_OBJECT_DATA_sort(st) SKM_sk_sort(MEM_OBJECT_DATA, (st)) +# define sk_MEM_OBJECT_DATA_is_sorted(st) SKM_sk_is_sorted(MEM_OBJECT_DATA, (st)) +# define sk_MIME_HEADER_new(cmp) SKM_sk_new(MIME_HEADER, (cmp)) +# define sk_MIME_HEADER_new_null() SKM_sk_new_null(MIME_HEADER) +# define sk_MIME_HEADER_free(st) SKM_sk_free(MIME_HEADER, (st)) +# define sk_MIME_HEADER_num(st) SKM_sk_num(MIME_HEADER, (st)) +# define sk_MIME_HEADER_value(st, i) SKM_sk_value(MIME_HEADER, (st), (i)) +# define sk_MIME_HEADER_set(st, i, val) SKM_sk_set(MIME_HEADER, (st), (i), (val)) +# define sk_MIME_HEADER_zero(st) SKM_sk_zero(MIME_HEADER, (st)) +# define sk_MIME_HEADER_push(st, val) SKM_sk_push(MIME_HEADER, (st), (val)) +# define sk_MIME_HEADER_unshift(st, val) SKM_sk_unshift(MIME_HEADER, (st), (val)) +# define sk_MIME_HEADER_find(st, val) SKM_sk_find(MIME_HEADER, (st), (val)) +# define sk_MIME_HEADER_find_ex(st, val) SKM_sk_find_ex(MIME_HEADER, (st), (val)) +# define sk_MIME_HEADER_delete(st, i) SKM_sk_delete(MIME_HEADER, (st), (i)) +# define sk_MIME_HEADER_delete_ptr(st, ptr) SKM_sk_delete_ptr(MIME_HEADER, (st), (ptr)) +# define sk_MIME_HEADER_insert(st, val, i) SKM_sk_insert(MIME_HEADER, (st), (val), (i)) +# define sk_MIME_HEADER_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(MIME_HEADER, (st), (cmp)) +# define sk_MIME_HEADER_dup(st) SKM_sk_dup(MIME_HEADER, st) +# define sk_MIME_HEADER_pop_free(st, free_func) SKM_sk_pop_free(MIME_HEADER, (st), (free_func)) +# define sk_MIME_HEADER_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(MIME_HEADER, (st), (copy_func), (free_func)) +# define sk_MIME_HEADER_shift(st) SKM_sk_shift(MIME_HEADER, (st)) +# define sk_MIME_HEADER_pop(st) SKM_sk_pop(MIME_HEADER, (st)) +# define sk_MIME_HEADER_sort(st) SKM_sk_sort(MIME_HEADER, (st)) +# define sk_MIME_HEADER_is_sorted(st) SKM_sk_is_sorted(MIME_HEADER, (st)) +# define sk_MIME_PARAM_new(cmp) SKM_sk_new(MIME_PARAM, (cmp)) +# define sk_MIME_PARAM_new_null() SKM_sk_new_null(MIME_PARAM) +# define sk_MIME_PARAM_free(st) SKM_sk_free(MIME_PARAM, (st)) +# define sk_MIME_PARAM_num(st) SKM_sk_num(MIME_PARAM, (st)) +# define sk_MIME_PARAM_value(st, i) SKM_sk_value(MIME_PARAM, (st), (i)) +# define sk_MIME_PARAM_set(st, i, val) SKM_sk_set(MIME_PARAM, (st), (i), (val)) +# define sk_MIME_PARAM_zero(st) SKM_sk_zero(MIME_PARAM, (st)) +# define sk_MIME_PARAM_push(st, val) SKM_sk_push(MIME_PARAM, (st), (val)) +# define sk_MIME_PARAM_unshift(st, val) SKM_sk_unshift(MIME_PARAM, (st), (val)) +# define sk_MIME_PARAM_find(st, val) SKM_sk_find(MIME_PARAM, (st), (val)) +# define sk_MIME_PARAM_find_ex(st, val) SKM_sk_find_ex(MIME_PARAM, (st), (val)) +# define sk_MIME_PARAM_delete(st, i) SKM_sk_delete(MIME_PARAM, (st), (i)) +# define sk_MIME_PARAM_delete_ptr(st, ptr) SKM_sk_delete_ptr(MIME_PARAM, (st), (ptr)) +# define sk_MIME_PARAM_insert(st, val, i) SKM_sk_insert(MIME_PARAM, (st), (val), (i)) +# define sk_MIME_PARAM_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(MIME_PARAM, (st), (cmp)) +# define sk_MIME_PARAM_dup(st) SKM_sk_dup(MIME_PARAM, st) +# define sk_MIME_PARAM_pop_free(st, free_func) SKM_sk_pop_free(MIME_PARAM, (st), (free_func)) +# define sk_MIME_PARAM_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(MIME_PARAM, (st), (copy_func), (free_func)) +# define sk_MIME_PARAM_shift(st) SKM_sk_shift(MIME_PARAM, (st)) +# define sk_MIME_PARAM_pop(st) SKM_sk_pop(MIME_PARAM, (st)) +# define sk_MIME_PARAM_sort(st) SKM_sk_sort(MIME_PARAM, (st)) +# define sk_MIME_PARAM_is_sorted(st) SKM_sk_is_sorted(MIME_PARAM, (st)) +# define sk_NAME_FUNCS_new(cmp) SKM_sk_new(NAME_FUNCS, (cmp)) +# define sk_NAME_FUNCS_new_null() SKM_sk_new_null(NAME_FUNCS) +# define sk_NAME_FUNCS_free(st) SKM_sk_free(NAME_FUNCS, (st)) +# define sk_NAME_FUNCS_num(st) SKM_sk_num(NAME_FUNCS, (st)) +# define sk_NAME_FUNCS_value(st, i) SKM_sk_value(NAME_FUNCS, (st), (i)) +# define sk_NAME_FUNCS_set(st, i, val) SKM_sk_set(NAME_FUNCS, (st), (i), (val)) +# define sk_NAME_FUNCS_zero(st) SKM_sk_zero(NAME_FUNCS, (st)) +# define sk_NAME_FUNCS_push(st, val) SKM_sk_push(NAME_FUNCS, (st), (val)) +# define sk_NAME_FUNCS_unshift(st, val) SKM_sk_unshift(NAME_FUNCS, (st), (val)) +# define sk_NAME_FUNCS_find(st, val) SKM_sk_find(NAME_FUNCS, (st), (val)) +# define sk_NAME_FUNCS_find_ex(st, val) SKM_sk_find_ex(NAME_FUNCS, (st), (val)) +# define sk_NAME_FUNCS_delete(st, i) SKM_sk_delete(NAME_FUNCS, (st), (i)) +# define sk_NAME_FUNCS_delete_ptr(st, ptr) SKM_sk_delete_ptr(NAME_FUNCS, (st), (ptr)) +# define sk_NAME_FUNCS_insert(st, val, i) SKM_sk_insert(NAME_FUNCS, (st), (val), (i)) +# define sk_NAME_FUNCS_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(NAME_FUNCS, (st), (cmp)) +# define sk_NAME_FUNCS_dup(st) SKM_sk_dup(NAME_FUNCS, st) +# define sk_NAME_FUNCS_pop_free(st, free_func) SKM_sk_pop_free(NAME_FUNCS, (st), (free_func)) +# define sk_NAME_FUNCS_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(NAME_FUNCS, (st), (copy_func), (free_func)) +# define sk_NAME_FUNCS_shift(st) SKM_sk_shift(NAME_FUNCS, (st)) +# define sk_NAME_FUNCS_pop(st) SKM_sk_pop(NAME_FUNCS, (st)) +# define sk_NAME_FUNCS_sort(st) SKM_sk_sort(NAME_FUNCS, (st)) +# define sk_NAME_FUNCS_is_sorted(st) SKM_sk_is_sorted(NAME_FUNCS, (st)) +# define sk_OCSP_CERTID_new(cmp) SKM_sk_new(OCSP_CERTID, (cmp)) +# define sk_OCSP_CERTID_new_null() SKM_sk_new_null(OCSP_CERTID) +# define sk_OCSP_CERTID_free(st) SKM_sk_free(OCSP_CERTID, (st)) +# define sk_OCSP_CERTID_num(st) SKM_sk_num(OCSP_CERTID, (st)) +# define sk_OCSP_CERTID_value(st, i) SKM_sk_value(OCSP_CERTID, (st), (i)) +# define sk_OCSP_CERTID_set(st, i, val) SKM_sk_set(OCSP_CERTID, (st), (i), (val)) +# define sk_OCSP_CERTID_zero(st) SKM_sk_zero(OCSP_CERTID, (st)) +# define sk_OCSP_CERTID_push(st, val) SKM_sk_push(OCSP_CERTID, (st), (val)) +# define sk_OCSP_CERTID_unshift(st, val) SKM_sk_unshift(OCSP_CERTID, (st), (val)) +# define sk_OCSP_CERTID_find(st, val) SKM_sk_find(OCSP_CERTID, (st), (val)) +# define sk_OCSP_CERTID_find_ex(st, val) SKM_sk_find_ex(OCSP_CERTID, (st), (val)) +# define sk_OCSP_CERTID_delete(st, i) SKM_sk_delete(OCSP_CERTID, (st), (i)) +# define sk_OCSP_CERTID_delete_ptr(st, ptr) SKM_sk_delete_ptr(OCSP_CERTID, (st), (ptr)) +# define sk_OCSP_CERTID_insert(st, val, i) SKM_sk_insert(OCSP_CERTID, (st), (val), (i)) +# define sk_OCSP_CERTID_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(OCSP_CERTID, (st), (cmp)) +# define sk_OCSP_CERTID_dup(st) SKM_sk_dup(OCSP_CERTID, st) +# define sk_OCSP_CERTID_pop_free(st, free_func) SKM_sk_pop_free(OCSP_CERTID, (st), (free_func)) +# define sk_OCSP_CERTID_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(OCSP_CERTID, (st), (copy_func), (free_func)) +# define sk_OCSP_CERTID_shift(st) SKM_sk_shift(OCSP_CERTID, (st)) +# define sk_OCSP_CERTID_pop(st) SKM_sk_pop(OCSP_CERTID, (st)) +# define sk_OCSP_CERTID_sort(st) SKM_sk_sort(OCSP_CERTID, (st)) +# define sk_OCSP_CERTID_is_sorted(st) SKM_sk_is_sorted(OCSP_CERTID, (st)) +# define sk_OCSP_ONEREQ_new(cmp) SKM_sk_new(OCSP_ONEREQ, (cmp)) +# define sk_OCSP_ONEREQ_new_null() SKM_sk_new_null(OCSP_ONEREQ) +# define sk_OCSP_ONEREQ_free(st) SKM_sk_free(OCSP_ONEREQ, (st)) +# define sk_OCSP_ONEREQ_num(st) SKM_sk_num(OCSP_ONEREQ, (st)) +# define sk_OCSP_ONEREQ_value(st, i) SKM_sk_value(OCSP_ONEREQ, (st), (i)) +# define sk_OCSP_ONEREQ_set(st, i, val) SKM_sk_set(OCSP_ONEREQ, (st), (i), (val)) +# define sk_OCSP_ONEREQ_zero(st) SKM_sk_zero(OCSP_ONEREQ, (st)) +# define sk_OCSP_ONEREQ_push(st, val) SKM_sk_push(OCSP_ONEREQ, (st), (val)) +# define sk_OCSP_ONEREQ_unshift(st, val) SKM_sk_unshift(OCSP_ONEREQ, (st), (val)) +# define sk_OCSP_ONEREQ_find(st, val) SKM_sk_find(OCSP_ONEREQ, (st), (val)) +# define sk_OCSP_ONEREQ_find_ex(st, val) SKM_sk_find_ex(OCSP_ONEREQ, (st), (val)) +# define sk_OCSP_ONEREQ_delete(st, i) SKM_sk_delete(OCSP_ONEREQ, (st), (i)) +# define sk_OCSP_ONEREQ_delete_ptr(st, ptr) SKM_sk_delete_ptr(OCSP_ONEREQ, (st), (ptr)) +# define sk_OCSP_ONEREQ_insert(st, val, i) SKM_sk_insert(OCSP_ONEREQ, (st), (val), (i)) +# define sk_OCSP_ONEREQ_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(OCSP_ONEREQ, (st), (cmp)) +# define sk_OCSP_ONEREQ_dup(st) SKM_sk_dup(OCSP_ONEREQ, st) +# define sk_OCSP_ONEREQ_pop_free(st, free_func) SKM_sk_pop_free(OCSP_ONEREQ, (st), (free_func)) +# define sk_OCSP_ONEREQ_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(OCSP_ONEREQ, (st), (copy_func), (free_func)) +# define sk_OCSP_ONEREQ_shift(st) SKM_sk_shift(OCSP_ONEREQ, (st)) +# define sk_OCSP_ONEREQ_pop(st) SKM_sk_pop(OCSP_ONEREQ, (st)) +# define sk_OCSP_ONEREQ_sort(st) SKM_sk_sort(OCSP_ONEREQ, (st)) +# define sk_OCSP_ONEREQ_is_sorted(st) SKM_sk_is_sorted(OCSP_ONEREQ, (st)) +# define sk_OCSP_RESPID_new(cmp) SKM_sk_new(OCSP_RESPID, (cmp)) +# define sk_OCSP_RESPID_new_null() SKM_sk_new_null(OCSP_RESPID) +# define sk_OCSP_RESPID_free(st) SKM_sk_free(OCSP_RESPID, (st)) +# define sk_OCSP_RESPID_num(st) SKM_sk_num(OCSP_RESPID, (st)) +# define sk_OCSP_RESPID_value(st, i) SKM_sk_value(OCSP_RESPID, (st), (i)) +# define sk_OCSP_RESPID_set(st, i, val) SKM_sk_set(OCSP_RESPID, (st), (i), (val)) +# define sk_OCSP_RESPID_zero(st) SKM_sk_zero(OCSP_RESPID, (st)) +# define sk_OCSP_RESPID_push(st, val) SKM_sk_push(OCSP_RESPID, (st), (val)) +# define sk_OCSP_RESPID_unshift(st, val) SKM_sk_unshift(OCSP_RESPID, (st), (val)) +# define sk_OCSP_RESPID_find(st, val) SKM_sk_find(OCSP_RESPID, (st), (val)) +# define sk_OCSP_RESPID_find_ex(st, val) SKM_sk_find_ex(OCSP_RESPID, (st), (val)) +# define sk_OCSP_RESPID_delete(st, i) SKM_sk_delete(OCSP_RESPID, (st), (i)) +# define sk_OCSP_RESPID_delete_ptr(st, ptr) SKM_sk_delete_ptr(OCSP_RESPID, (st), (ptr)) +# define sk_OCSP_RESPID_insert(st, val, i) SKM_sk_insert(OCSP_RESPID, (st), (val), (i)) +# define sk_OCSP_RESPID_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(OCSP_RESPID, (st), (cmp)) +# define sk_OCSP_RESPID_dup(st) SKM_sk_dup(OCSP_RESPID, st) +# define sk_OCSP_RESPID_pop_free(st, free_func) SKM_sk_pop_free(OCSP_RESPID, (st), (free_func)) +# define sk_OCSP_RESPID_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(OCSP_RESPID, (st), (copy_func), (free_func)) +# define sk_OCSP_RESPID_shift(st) SKM_sk_shift(OCSP_RESPID, (st)) +# define sk_OCSP_RESPID_pop(st) SKM_sk_pop(OCSP_RESPID, (st)) +# define sk_OCSP_RESPID_sort(st) SKM_sk_sort(OCSP_RESPID, (st)) +# define sk_OCSP_RESPID_is_sorted(st) SKM_sk_is_sorted(OCSP_RESPID, (st)) +# define sk_OCSP_SINGLERESP_new(cmp) SKM_sk_new(OCSP_SINGLERESP, (cmp)) +# define sk_OCSP_SINGLERESP_new_null() SKM_sk_new_null(OCSP_SINGLERESP) +# define sk_OCSP_SINGLERESP_free(st) SKM_sk_free(OCSP_SINGLERESP, (st)) +# define sk_OCSP_SINGLERESP_num(st) SKM_sk_num(OCSP_SINGLERESP, (st)) +# define sk_OCSP_SINGLERESP_value(st, i) SKM_sk_value(OCSP_SINGLERESP, (st), (i)) +# define sk_OCSP_SINGLERESP_set(st, i, val) SKM_sk_set(OCSP_SINGLERESP, (st), (i), (val)) +# define sk_OCSP_SINGLERESP_zero(st) SKM_sk_zero(OCSP_SINGLERESP, (st)) +# define sk_OCSP_SINGLERESP_push(st, val) SKM_sk_push(OCSP_SINGLERESP, (st), (val)) +# define sk_OCSP_SINGLERESP_unshift(st, val) SKM_sk_unshift(OCSP_SINGLERESP, (st), (val)) +# define sk_OCSP_SINGLERESP_find(st, val) SKM_sk_find(OCSP_SINGLERESP, (st), (val)) +# define sk_OCSP_SINGLERESP_find_ex(st, val) SKM_sk_find_ex(OCSP_SINGLERESP, (st), (val)) +# define sk_OCSP_SINGLERESP_delete(st, i) SKM_sk_delete(OCSP_SINGLERESP, (st), (i)) +# define sk_OCSP_SINGLERESP_delete_ptr(st, ptr) SKM_sk_delete_ptr(OCSP_SINGLERESP, (st), (ptr)) +# define sk_OCSP_SINGLERESP_insert(st, val, i) SKM_sk_insert(OCSP_SINGLERESP, (st), (val), (i)) +# define sk_OCSP_SINGLERESP_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(OCSP_SINGLERESP, (st), (cmp)) +# define sk_OCSP_SINGLERESP_dup(st) SKM_sk_dup(OCSP_SINGLERESP, st) +# define sk_OCSP_SINGLERESP_pop_free(st, free_func) SKM_sk_pop_free(OCSP_SINGLERESP, (st), (free_func)) +# define sk_OCSP_SINGLERESP_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(OCSP_SINGLERESP, (st), (copy_func), (free_func)) +# define sk_OCSP_SINGLERESP_shift(st) SKM_sk_shift(OCSP_SINGLERESP, (st)) +# define sk_OCSP_SINGLERESP_pop(st) SKM_sk_pop(OCSP_SINGLERESP, (st)) +# define sk_OCSP_SINGLERESP_sort(st) SKM_sk_sort(OCSP_SINGLERESP, (st)) +# define sk_OCSP_SINGLERESP_is_sorted(st) SKM_sk_is_sorted(OCSP_SINGLERESP, (st)) +# define sk_PKCS12_SAFEBAG_new(cmp) SKM_sk_new(PKCS12_SAFEBAG, (cmp)) +# define sk_PKCS12_SAFEBAG_new_null() SKM_sk_new_null(PKCS12_SAFEBAG) +# define sk_PKCS12_SAFEBAG_free(st) SKM_sk_free(PKCS12_SAFEBAG, (st)) +# define sk_PKCS12_SAFEBAG_num(st) SKM_sk_num(PKCS12_SAFEBAG, (st)) +# define sk_PKCS12_SAFEBAG_value(st, i) SKM_sk_value(PKCS12_SAFEBAG, (st), (i)) +# define sk_PKCS12_SAFEBAG_set(st, i, val) SKM_sk_set(PKCS12_SAFEBAG, (st), (i), (val)) +# define sk_PKCS12_SAFEBAG_zero(st) SKM_sk_zero(PKCS12_SAFEBAG, (st)) +# define sk_PKCS12_SAFEBAG_push(st, val) SKM_sk_push(PKCS12_SAFEBAG, (st), (val)) +# define sk_PKCS12_SAFEBAG_unshift(st, val) SKM_sk_unshift(PKCS12_SAFEBAG, (st), (val)) +# define sk_PKCS12_SAFEBAG_find(st, val) SKM_sk_find(PKCS12_SAFEBAG, (st), (val)) +# define sk_PKCS12_SAFEBAG_find_ex(st, val) SKM_sk_find_ex(PKCS12_SAFEBAG, (st), (val)) +# define sk_PKCS12_SAFEBAG_delete(st, i) SKM_sk_delete(PKCS12_SAFEBAG, (st), (i)) +# define sk_PKCS12_SAFEBAG_delete_ptr(st, ptr) SKM_sk_delete_ptr(PKCS12_SAFEBAG, (st), (ptr)) +# define sk_PKCS12_SAFEBAG_insert(st, val, i) SKM_sk_insert(PKCS12_SAFEBAG, (st), (val), (i)) +# define sk_PKCS12_SAFEBAG_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(PKCS12_SAFEBAG, (st), (cmp)) +# define sk_PKCS12_SAFEBAG_dup(st) SKM_sk_dup(PKCS12_SAFEBAG, st) +# define sk_PKCS12_SAFEBAG_pop_free(st, free_func) SKM_sk_pop_free(PKCS12_SAFEBAG, (st), (free_func)) +# define sk_PKCS12_SAFEBAG_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(PKCS12_SAFEBAG, (st), (copy_func), (free_func)) +# define sk_PKCS12_SAFEBAG_shift(st) SKM_sk_shift(PKCS12_SAFEBAG, (st)) +# define sk_PKCS12_SAFEBAG_pop(st) SKM_sk_pop(PKCS12_SAFEBAG, (st)) +# define sk_PKCS12_SAFEBAG_sort(st) SKM_sk_sort(PKCS12_SAFEBAG, (st)) +# define sk_PKCS12_SAFEBAG_is_sorted(st) SKM_sk_is_sorted(PKCS12_SAFEBAG, (st)) +# define sk_PKCS7_new(cmp) SKM_sk_new(PKCS7, (cmp)) +# define sk_PKCS7_new_null() SKM_sk_new_null(PKCS7) +# define sk_PKCS7_free(st) SKM_sk_free(PKCS7, (st)) +# define sk_PKCS7_num(st) SKM_sk_num(PKCS7, (st)) +# define sk_PKCS7_value(st, i) SKM_sk_value(PKCS7, (st), (i)) +# define sk_PKCS7_set(st, i, val) SKM_sk_set(PKCS7, (st), (i), (val)) +# define sk_PKCS7_zero(st) SKM_sk_zero(PKCS7, (st)) +# define sk_PKCS7_push(st, val) SKM_sk_push(PKCS7, (st), (val)) +# define sk_PKCS7_unshift(st, val) SKM_sk_unshift(PKCS7, (st), (val)) +# define sk_PKCS7_find(st, val) SKM_sk_find(PKCS7, (st), (val)) +# define sk_PKCS7_find_ex(st, val) SKM_sk_find_ex(PKCS7, (st), (val)) +# define sk_PKCS7_delete(st, i) SKM_sk_delete(PKCS7, (st), (i)) +# define sk_PKCS7_delete_ptr(st, ptr) SKM_sk_delete_ptr(PKCS7, (st), (ptr)) +# define sk_PKCS7_insert(st, val, i) SKM_sk_insert(PKCS7, (st), (val), (i)) +# define sk_PKCS7_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(PKCS7, (st), (cmp)) +# define sk_PKCS7_dup(st) SKM_sk_dup(PKCS7, st) +# define sk_PKCS7_pop_free(st, free_func) SKM_sk_pop_free(PKCS7, (st), (free_func)) +# define sk_PKCS7_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(PKCS7, (st), (copy_func), (free_func)) +# define sk_PKCS7_shift(st) SKM_sk_shift(PKCS7, (st)) +# define sk_PKCS7_pop(st) SKM_sk_pop(PKCS7, (st)) +# define sk_PKCS7_sort(st) SKM_sk_sort(PKCS7, (st)) +# define sk_PKCS7_is_sorted(st) SKM_sk_is_sorted(PKCS7, (st)) +# define sk_PKCS7_RECIP_INFO_new(cmp) SKM_sk_new(PKCS7_RECIP_INFO, (cmp)) +# define sk_PKCS7_RECIP_INFO_new_null() SKM_sk_new_null(PKCS7_RECIP_INFO) +# define sk_PKCS7_RECIP_INFO_free(st) SKM_sk_free(PKCS7_RECIP_INFO, (st)) +# define sk_PKCS7_RECIP_INFO_num(st) SKM_sk_num(PKCS7_RECIP_INFO, (st)) +# define sk_PKCS7_RECIP_INFO_value(st, i) SKM_sk_value(PKCS7_RECIP_INFO, (st), (i)) +# define sk_PKCS7_RECIP_INFO_set(st, i, val) SKM_sk_set(PKCS7_RECIP_INFO, (st), (i), (val)) +# define sk_PKCS7_RECIP_INFO_zero(st) SKM_sk_zero(PKCS7_RECIP_INFO, (st)) +# define sk_PKCS7_RECIP_INFO_push(st, val) SKM_sk_push(PKCS7_RECIP_INFO, (st), (val)) +# define sk_PKCS7_RECIP_INFO_unshift(st, val) SKM_sk_unshift(PKCS7_RECIP_INFO, (st), (val)) +# define sk_PKCS7_RECIP_INFO_find(st, val) SKM_sk_find(PKCS7_RECIP_INFO, (st), (val)) +# define sk_PKCS7_RECIP_INFO_find_ex(st, val) SKM_sk_find_ex(PKCS7_RECIP_INFO, (st), (val)) +# define sk_PKCS7_RECIP_INFO_delete(st, i) SKM_sk_delete(PKCS7_RECIP_INFO, (st), (i)) +# define sk_PKCS7_RECIP_INFO_delete_ptr(st, ptr) SKM_sk_delete_ptr(PKCS7_RECIP_INFO, (st), (ptr)) +# define sk_PKCS7_RECIP_INFO_insert(st, val, i) SKM_sk_insert(PKCS7_RECIP_INFO, (st), (val), (i)) +# define sk_PKCS7_RECIP_INFO_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(PKCS7_RECIP_INFO, (st), (cmp)) +# define sk_PKCS7_RECIP_INFO_dup(st) SKM_sk_dup(PKCS7_RECIP_INFO, st) +# define sk_PKCS7_RECIP_INFO_pop_free(st, free_func) SKM_sk_pop_free(PKCS7_RECIP_INFO, (st), (free_func)) +# define sk_PKCS7_RECIP_INFO_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(PKCS7_RECIP_INFO, (st), (copy_func), (free_func)) +# define sk_PKCS7_RECIP_INFO_shift(st) SKM_sk_shift(PKCS7_RECIP_INFO, (st)) +# define sk_PKCS7_RECIP_INFO_pop(st) SKM_sk_pop(PKCS7_RECIP_INFO, (st)) +# define sk_PKCS7_RECIP_INFO_sort(st) SKM_sk_sort(PKCS7_RECIP_INFO, (st)) +# define sk_PKCS7_RECIP_INFO_is_sorted(st) SKM_sk_is_sorted(PKCS7_RECIP_INFO, (st)) +# define sk_PKCS7_SIGNER_INFO_new(cmp) SKM_sk_new(PKCS7_SIGNER_INFO, (cmp)) +# define sk_PKCS7_SIGNER_INFO_new_null() SKM_sk_new_null(PKCS7_SIGNER_INFO) +# define sk_PKCS7_SIGNER_INFO_free(st) SKM_sk_free(PKCS7_SIGNER_INFO, (st)) +# define sk_PKCS7_SIGNER_INFO_num(st) SKM_sk_num(PKCS7_SIGNER_INFO, (st)) +# define sk_PKCS7_SIGNER_INFO_value(st, i) SKM_sk_value(PKCS7_SIGNER_INFO, (st), (i)) +# define sk_PKCS7_SIGNER_INFO_set(st, i, val) SKM_sk_set(PKCS7_SIGNER_INFO, (st), (i), (val)) +# define sk_PKCS7_SIGNER_INFO_zero(st) SKM_sk_zero(PKCS7_SIGNER_INFO, (st)) +# define sk_PKCS7_SIGNER_INFO_push(st, val) SKM_sk_push(PKCS7_SIGNER_INFO, (st), (val)) +# define sk_PKCS7_SIGNER_INFO_unshift(st, val) SKM_sk_unshift(PKCS7_SIGNER_INFO, (st), (val)) +# define sk_PKCS7_SIGNER_INFO_find(st, val) SKM_sk_find(PKCS7_SIGNER_INFO, (st), (val)) +# define sk_PKCS7_SIGNER_INFO_find_ex(st, val) SKM_sk_find_ex(PKCS7_SIGNER_INFO, (st), (val)) +# define sk_PKCS7_SIGNER_INFO_delete(st, i) SKM_sk_delete(PKCS7_SIGNER_INFO, (st), (i)) +# define sk_PKCS7_SIGNER_INFO_delete_ptr(st, ptr) SKM_sk_delete_ptr(PKCS7_SIGNER_INFO, (st), (ptr)) +# define sk_PKCS7_SIGNER_INFO_insert(st, val, i) SKM_sk_insert(PKCS7_SIGNER_INFO, (st), (val), (i)) +# define sk_PKCS7_SIGNER_INFO_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(PKCS7_SIGNER_INFO, (st), (cmp)) +# define sk_PKCS7_SIGNER_INFO_dup(st) SKM_sk_dup(PKCS7_SIGNER_INFO, st) +# define sk_PKCS7_SIGNER_INFO_pop_free(st, free_func) SKM_sk_pop_free(PKCS7_SIGNER_INFO, (st), (free_func)) +# define sk_PKCS7_SIGNER_INFO_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(PKCS7_SIGNER_INFO, (st), (copy_func), (free_func)) +# define sk_PKCS7_SIGNER_INFO_shift(st) SKM_sk_shift(PKCS7_SIGNER_INFO, (st)) +# define sk_PKCS7_SIGNER_INFO_pop(st) SKM_sk_pop(PKCS7_SIGNER_INFO, (st)) +# define sk_PKCS7_SIGNER_INFO_sort(st) SKM_sk_sort(PKCS7_SIGNER_INFO, (st)) +# define sk_PKCS7_SIGNER_INFO_is_sorted(st) SKM_sk_is_sorted(PKCS7_SIGNER_INFO, (st)) +# define sk_POLICYINFO_new(cmp) SKM_sk_new(POLICYINFO, (cmp)) +# define sk_POLICYINFO_new_null() SKM_sk_new_null(POLICYINFO) +# define sk_POLICYINFO_free(st) SKM_sk_free(POLICYINFO, (st)) +# define sk_POLICYINFO_num(st) SKM_sk_num(POLICYINFO, (st)) +# define sk_POLICYINFO_value(st, i) SKM_sk_value(POLICYINFO, (st), (i)) +# define sk_POLICYINFO_set(st, i, val) SKM_sk_set(POLICYINFO, (st), (i), (val)) +# define sk_POLICYINFO_zero(st) SKM_sk_zero(POLICYINFO, (st)) +# define sk_POLICYINFO_push(st, val) SKM_sk_push(POLICYINFO, (st), (val)) +# define sk_POLICYINFO_unshift(st, val) SKM_sk_unshift(POLICYINFO, (st), (val)) +# define sk_POLICYINFO_find(st, val) SKM_sk_find(POLICYINFO, (st), (val)) +# define sk_POLICYINFO_find_ex(st, val) SKM_sk_find_ex(POLICYINFO, (st), (val)) +# define sk_POLICYINFO_delete(st, i) SKM_sk_delete(POLICYINFO, (st), (i)) +# define sk_POLICYINFO_delete_ptr(st, ptr) SKM_sk_delete_ptr(POLICYINFO, (st), (ptr)) +# define sk_POLICYINFO_insert(st, val, i) SKM_sk_insert(POLICYINFO, (st), (val), (i)) +# define sk_POLICYINFO_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(POLICYINFO, (st), (cmp)) +# define sk_POLICYINFO_dup(st) SKM_sk_dup(POLICYINFO, st) +# define sk_POLICYINFO_pop_free(st, free_func) SKM_sk_pop_free(POLICYINFO, (st), (free_func)) +# define sk_POLICYINFO_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(POLICYINFO, (st), (copy_func), (free_func)) +# define sk_POLICYINFO_shift(st) SKM_sk_shift(POLICYINFO, (st)) +# define sk_POLICYINFO_pop(st) SKM_sk_pop(POLICYINFO, (st)) +# define sk_POLICYINFO_sort(st) SKM_sk_sort(POLICYINFO, (st)) +# define sk_POLICYINFO_is_sorted(st) SKM_sk_is_sorted(POLICYINFO, (st)) +# define sk_POLICYQUALINFO_new(cmp) SKM_sk_new(POLICYQUALINFO, (cmp)) +# define sk_POLICYQUALINFO_new_null() SKM_sk_new_null(POLICYQUALINFO) +# define sk_POLICYQUALINFO_free(st) SKM_sk_free(POLICYQUALINFO, (st)) +# define sk_POLICYQUALINFO_num(st) SKM_sk_num(POLICYQUALINFO, (st)) +# define sk_POLICYQUALINFO_value(st, i) SKM_sk_value(POLICYQUALINFO, (st), (i)) +# define sk_POLICYQUALINFO_set(st, i, val) SKM_sk_set(POLICYQUALINFO, (st), (i), (val)) +# define sk_POLICYQUALINFO_zero(st) SKM_sk_zero(POLICYQUALINFO, (st)) +# define sk_POLICYQUALINFO_push(st, val) SKM_sk_push(POLICYQUALINFO, (st), (val)) +# define sk_POLICYQUALINFO_unshift(st, val) SKM_sk_unshift(POLICYQUALINFO, (st), (val)) +# define sk_POLICYQUALINFO_find(st, val) SKM_sk_find(POLICYQUALINFO, (st), (val)) +# define sk_POLICYQUALINFO_find_ex(st, val) SKM_sk_find_ex(POLICYQUALINFO, (st), (val)) +# define sk_POLICYQUALINFO_delete(st, i) SKM_sk_delete(POLICYQUALINFO, (st), (i)) +# define sk_POLICYQUALINFO_delete_ptr(st, ptr) SKM_sk_delete_ptr(POLICYQUALINFO, (st), (ptr)) +# define sk_POLICYQUALINFO_insert(st, val, i) SKM_sk_insert(POLICYQUALINFO, (st), (val), (i)) +# define sk_POLICYQUALINFO_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(POLICYQUALINFO, (st), (cmp)) +# define sk_POLICYQUALINFO_dup(st) SKM_sk_dup(POLICYQUALINFO, st) +# define sk_POLICYQUALINFO_pop_free(st, free_func) SKM_sk_pop_free(POLICYQUALINFO, (st), (free_func)) +# define sk_POLICYQUALINFO_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(POLICYQUALINFO, (st), (copy_func), (free_func)) +# define sk_POLICYQUALINFO_shift(st) SKM_sk_shift(POLICYQUALINFO, (st)) +# define sk_POLICYQUALINFO_pop(st) SKM_sk_pop(POLICYQUALINFO, (st)) +# define sk_POLICYQUALINFO_sort(st) SKM_sk_sort(POLICYQUALINFO, (st)) +# define sk_POLICYQUALINFO_is_sorted(st) SKM_sk_is_sorted(POLICYQUALINFO, (st)) +# define sk_POLICY_MAPPING_new(cmp) SKM_sk_new(POLICY_MAPPING, (cmp)) +# define sk_POLICY_MAPPING_new_null() SKM_sk_new_null(POLICY_MAPPING) +# define sk_POLICY_MAPPING_free(st) SKM_sk_free(POLICY_MAPPING, (st)) +# define sk_POLICY_MAPPING_num(st) SKM_sk_num(POLICY_MAPPING, (st)) +# define sk_POLICY_MAPPING_value(st, i) SKM_sk_value(POLICY_MAPPING, (st), (i)) +# define sk_POLICY_MAPPING_set(st, i, val) SKM_sk_set(POLICY_MAPPING, (st), (i), (val)) +# define sk_POLICY_MAPPING_zero(st) SKM_sk_zero(POLICY_MAPPING, (st)) +# define sk_POLICY_MAPPING_push(st, val) SKM_sk_push(POLICY_MAPPING, (st), (val)) +# define sk_POLICY_MAPPING_unshift(st, val) SKM_sk_unshift(POLICY_MAPPING, (st), (val)) +# define sk_POLICY_MAPPING_find(st, val) SKM_sk_find(POLICY_MAPPING, (st), (val)) +# define sk_POLICY_MAPPING_find_ex(st, val) SKM_sk_find_ex(POLICY_MAPPING, (st), (val)) +# define sk_POLICY_MAPPING_delete(st, i) SKM_sk_delete(POLICY_MAPPING, (st), (i)) +# define sk_POLICY_MAPPING_delete_ptr(st, ptr) SKM_sk_delete_ptr(POLICY_MAPPING, (st), (ptr)) +# define sk_POLICY_MAPPING_insert(st, val, i) SKM_sk_insert(POLICY_MAPPING, (st), (val), (i)) +# define sk_POLICY_MAPPING_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(POLICY_MAPPING, (st), (cmp)) +# define sk_POLICY_MAPPING_dup(st) SKM_sk_dup(POLICY_MAPPING, st) +# define sk_POLICY_MAPPING_pop_free(st, free_func) SKM_sk_pop_free(POLICY_MAPPING, (st), (free_func)) +# define sk_POLICY_MAPPING_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(POLICY_MAPPING, (st), (copy_func), (free_func)) +# define sk_POLICY_MAPPING_shift(st) SKM_sk_shift(POLICY_MAPPING, (st)) +# define sk_POLICY_MAPPING_pop(st) SKM_sk_pop(POLICY_MAPPING, (st)) +# define sk_POLICY_MAPPING_sort(st) SKM_sk_sort(POLICY_MAPPING, (st)) +# define sk_POLICY_MAPPING_is_sorted(st) SKM_sk_is_sorted(POLICY_MAPPING, (st)) +# define sk_SCT_new(cmp) SKM_sk_new(SCT, (cmp)) +# define sk_SCT_new_null() SKM_sk_new_null(SCT) +# define sk_SCT_free(st) SKM_sk_free(SCT, (st)) +# define sk_SCT_num(st) SKM_sk_num(SCT, (st)) +# define sk_SCT_value(st, i) SKM_sk_value(SCT, (st), (i)) +# define sk_SCT_set(st, i, val) SKM_sk_set(SCT, (st), (i), (val)) +# define sk_SCT_zero(st) SKM_sk_zero(SCT, (st)) +# define sk_SCT_push(st, val) SKM_sk_push(SCT, (st), (val)) +# define sk_SCT_unshift(st, val) SKM_sk_unshift(SCT, (st), (val)) +# define sk_SCT_find(st, val) SKM_sk_find(SCT, (st), (val)) +# define sk_SCT_find_ex(st, val) SKM_sk_find_ex(SCT, (st), (val)) +# define sk_SCT_delete(st, i) SKM_sk_delete(SCT, (st), (i)) +# define sk_SCT_delete_ptr(st, ptr) SKM_sk_delete_ptr(SCT, (st), (ptr)) +# define sk_SCT_insert(st, val, i) SKM_sk_insert(SCT, (st), (val), (i)) +# define sk_SCT_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(SCT, (st), (cmp)) +# define sk_SCT_dup(st) SKM_sk_dup(SCT, st) +# define sk_SCT_pop_free(st, free_func) SKM_sk_pop_free(SCT, (st), (free_func)) +# define sk_SCT_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(SCT, (st), (copy_func), (free_func)) +# define sk_SCT_shift(st) SKM_sk_shift(SCT, (st)) +# define sk_SCT_pop(st) SKM_sk_pop(SCT, (st)) +# define sk_SCT_sort(st) SKM_sk_sort(SCT, (st)) +# define sk_SCT_is_sorted(st) SKM_sk_is_sorted(SCT, (st)) +# define sk_SRP_gN_new(cmp) SKM_sk_new(SRP_gN, (cmp)) +# define sk_SRP_gN_new_null() SKM_sk_new_null(SRP_gN) +# define sk_SRP_gN_free(st) SKM_sk_free(SRP_gN, (st)) +# define sk_SRP_gN_num(st) SKM_sk_num(SRP_gN, (st)) +# define sk_SRP_gN_value(st, i) SKM_sk_value(SRP_gN, (st), (i)) +# define sk_SRP_gN_set(st, i, val) SKM_sk_set(SRP_gN, (st), (i), (val)) +# define sk_SRP_gN_zero(st) SKM_sk_zero(SRP_gN, (st)) +# define sk_SRP_gN_push(st, val) SKM_sk_push(SRP_gN, (st), (val)) +# define sk_SRP_gN_unshift(st, val) SKM_sk_unshift(SRP_gN, (st), (val)) +# define sk_SRP_gN_find(st, val) SKM_sk_find(SRP_gN, (st), (val)) +# define sk_SRP_gN_find_ex(st, val) SKM_sk_find_ex(SRP_gN, (st), (val)) +# define sk_SRP_gN_delete(st, i) SKM_sk_delete(SRP_gN, (st), (i)) +# define sk_SRP_gN_delete_ptr(st, ptr) SKM_sk_delete_ptr(SRP_gN, (st), (ptr)) +# define sk_SRP_gN_insert(st, val, i) SKM_sk_insert(SRP_gN, (st), (val), (i)) +# define sk_SRP_gN_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(SRP_gN, (st), (cmp)) +# define sk_SRP_gN_dup(st) SKM_sk_dup(SRP_gN, st) +# define sk_SRP_gN_pop_free(st, free_func) SKM_sk_pop_free(SRP_gN, (st), (free_func)) +# define sk_SRP_gN_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(SRP_gN, (st), (copy_func), (free_func)) +# define sk_SRP_gN_shift(st) SKM_sk_shift(SRP_gN, (st)) +# define sk_SRP_gN_pop(st) SKM_sk_pop(SRP_gN, (st)) +# define sk_SRP_gN_sort(st) SKM_sk_sort(SRP_gN, (st)) +# define sk_SRP_gN_is_sorted(st) SKM_sk_is_sorted(SRP_gN, (st)) +# define sk_SRP_gN_cache_new(cmp) SKM_sk_new(SRP_gN_cache, (cmp)) +# define sk_SRP_gN_cache_new_null() SKM_sk_new_null(SRP_gN_cache) +# define sk_SRP_gN_cache_free(st) SKM_sk_free(SRP_gN_cache, (st)) +# define sk_SRP_gN_cache_num(st) SKM_sk_num(SRP_gN_cache, (st)) +# define sk_SRP_gN_cache_value(st, i) SKM_sk_value(SRP_gN_cache, (st), (i)) +# define sk_SRP_gN_cache_set(st, i, val) SKM_sk_set(SRP_gN_cache, (st), (i), (val)) +# define sk_SRP_gN_cache_zero(st) SKM_sk_zero(SRP_gN_cache, (st)) +# define sk_SRP_gN_cache_push(st, val) SKM_sk_push(SRP_gN_cache, (st), (val)) +# define sk_SRP_gN_cache_unshift(st, val) SKM_sk_unshift(SRP_gN_cache, (st), (val)) +# define sk_SRP_gN_cache_find(st, val) SKM_sk_find(SRP_gN_cache, (st), (val)) +# define sk_SRP_gN_cache_find_ex(st, val) SKM_sk_find_ex(SRP_gN_cache, (st), (val)) +# define sk_SRP_gN_cache_delete(st, i) SKM_sk_delete(SRP_gN_cache, (st), (i)) +# define sk_SRP_gN_cache_delete_ptr(st, ptr) SKM_sk_delete_ptr(SRP_gN_cache, (st), (ptr)) +# define sk_SRP_gN_cache_insert(st, val, i) SKM_sk_insert(SRP_gN_cache, (st), (val), (i)) +# define sk_SRP_gN_cache_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(SRP_gN_cache, (st), (cmp)) +# define sk_SRP_gN_cache_dup(st) SKM_sk_dup(SRP_gN_cache, st) +# define sk_SRP_gN_cache_pop_free(st, free_func) SKM_sk_pop_free(SRP_gN_cache, (st), (free_func)) +# define sk_SRP_gN_cache_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(SRP_gN_cache, (st), (copy_func), (free_func)) +# define sk_SRP_gN_cache_shift(st) SKM_sk_shift(SRP_gN_cache, (st)) +# define sk_SRP_gN_cache_pop(st) SKM_sk_pop(SRP_gN_cache, (st)) +# define sk_SRP_gN_cache_sort(st) SKM_sk_sort(SRP_gN_cache, (st)) +# define sk_SRP_gN_cache_is_sorted(st) SKM_sk_is_sorted(SRP_gN_cache, (st)) +# define sk_SRP_user_pwd_new(cmp) SKM_sk_new(SRP_user_pwd, (cmp)) +# define sk_SRP_user_pwd_new_null() SKM_sk_new_null(SRP_user_pwd) +# define sk_SRP_user_pwd_free(st) SKM_sk_free(SRP_user_pwd, (st)) +# define sk_SRP_user_pwd_num(st) SKM_sk_num(SRP_user_pwd, (st)) +# define sk_SRP_user_pwd_value(st, i) SKM_sk_value(SRP_user_pwd, (st), (i)) +# define sk_SRP_user_pwd_set(st, i, val) SKM_sk_set(SRP_user_pwd, (st), (i), (val)) +# define sk_SRP_user_pwd_zero(st) SKM_sk_zero(SRP_user_pwd, (st)) +# define sk_SRP_user_pwd_push(st, val) SKM_sk_push(SRP_user_pwd, (st), (val)) +# define sk_SRP_user_pwd_unshift(st, val) SKM_sk_unshift(SRP_user_pwd, (st), (val)) +# define sk_SRP_user_pwd_find(st, val) SKM_sk_find(SRP_user_pwd, (st), (val)) +# define sk_SRP_user_pwd_find_ex(st, val) SKM_sk_find_ex(SRP_user_pwd, (st), (val)) +# define sk_SRP_user_pwd_delete(st, i) SKM_sk_delete(SRP_user_pwd, (st), (i)) +# define sk_SRP_user_pwd_delete_ptr(st, ptr) SKM_sk_delete_ptr(SRP_user_pwd, (st), (ptr)) +# define sk_SRP_user_pwd_insert(st, val, i) SKM_sk_insert(SRP_user_pwd, (st), (val), (i)) +# define sk_SRP_user_pwd_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(SRP_user_pwd, (st), (cmp)) +# define sk_SRP_user_pwd_dup(st) SKM_sk_dup(SRP_user_pwd, st) +# define sk_SRP_user_pwd_pop_free(st, free_func) SKM_sk_pop_free(SRP_user_pwd, (st), (free_func)) +# define sk_SRP_user_pwd_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(SRP_user_pwd, (st), (copy_func), (free_func)) +# define sk_SRP_user_pwd_shift(st) SKM_sk_shift(SRP_user_pwd, (st)) +# define sk_SRP_user_pwd_pop(st) SKM_sk_pop(SRP_user_pwd, (st)) +# define sk_SRP_user_pwd_sort(st) SKM_sk_sort(SRP_user_pwd, (st)) +# define sk_SRP_user_pwd_is_sorted(st) SKM_sk_is_sorted(SRP_user_pwd, (st)) +# define sk_SRTP_PROTECTION_PROFILE_new(cmp) SKM_sk_new(SRTP_PROTECTION_PROFILE, (cmp)) +# define sk_SRTP_PROTECTION_PROFILE_new_null() SKM_sk_new_null(SRTP_PROTECTION_PROFILE) +# define sk_SRTP_PROTECTION_PROFILE_free(st) SKM_sk_free(SRTP_PROTECTION_PROFILE, (st)) +# define sk_SRTP_PROTECTION_PROFILE_num(st) SKM_sk_num(SRTP_PROTECTION_PROFILE, (st)) +# define sk_SRTP_PROTECTION_PROFILE_value(st, i) SKM_sk_value(SRTP_PROTECTION_PROFILE, (st), (i)) +# define sk_SRTP_PROTECTION_PROFILE_set(st, i, val) SKM_sk_set(SRTP_PROTECTION_PROFILE, (st), (i), (val)) +# define sk_SRTP_PROTECTION_PROFILE_zero(st) SKM_sk_zero(SRTP_PROTECTION_PROFILE, (st)) +# define sk_SRTP_PROTECTION_PROFILE_push(st, val) SKM_sk_push(SRTP_PROTECTION_PROFILE, (st), (val)) +# define sk_SRTP_PROTECTION_PROFILE_unshift(st, val) SKM_sk_unshift(SRTP_PROTECTION_PROFILE, (st), (val)) +# define sk_SRTP_PROTECTION_PROFILE_find(st, val) SKM_sk_find(SRTP_PROTECTION_PROFILE, (st), (val)) +# define sk_SRTP_PROTECTION_PROFILE_find_ex(st, val) SKM_sk_find_ex(SRTP_PROTECTION_PROFILE, (st), (val)) +# define sk_SRTP_PROTECTION_PROFILE_delete(st, i) SKM_sk_delete(SRTP_PROTECTION_PROFILE, (st), (i)) +# define sk_SRTP_PROTECTION_PROFILE_delete_ptr(st, ptr) SKM_sk_delete_ptr(SRTP_PROTECTION_PROFILE, (st), (ptr)) +# define sk_SRTP_PROTECTION_PROFILE_insert(st, val, i) SKM_sk_insert(SRTP_PROTECTION_PROFILE, (st), (val), (i)) +# define sk_SRTP_PROTECTION_PROFILE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(SRTP_PROTECTION_PROFILE, (st), (cmp)) +# define sk_SRTP_PROTECTION_PROFILE_dup(st) SKM_sk_dup(SRTP_PROTECTION_PROFILE, st) +# define sk_SRTP_PROTECTION_PROFILE_pop_free(st, free_func) SKM_sk_pop_free(SRTP_PROTECTION_PROFILE, (st), (free_func)) +# define sk_SRTP_PROTECTION_PROFILE_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(SRTP_PROTECTION_PROFILE, (st), (copy_func), (free_func)) +# define sk_SRTP_PROTECTION_PROFILE_shift(st) SKM_sk_shift(SRTP_PROTECTION_PROFILE, (st)) +# define sk_SRTP_PROTECTION_PROFILE_pop(st) SKM_sk_pop(SRTP_PROTECTION_PROFILE, (st)) +# define sk_SRTP_PROTECTION_PROFILE_sort(st) SKM_sk_sort(SRTP_PROTECTION_PROFILE, (st)) +# define sk_SRTP_PROTECTION_PROFILE_is_sorted(st) SKM_sk_is_sorted(SRTP_PROTECTION_PROFILE, (st)) +# define sk_SSL_CIPHER_new(cmp) SKM_sk_new(SSL_CIPHER, (cmp)) +# define sk_SSL_CIPHER_new_null() SKM_sk_new_null(SSL_CIPHER) +# define sk_SSL_CIPHER_free(st) SKM_sk_free(SSL_CIPHER, (st)) +# define sk_SSL_CIPHER_num(st) SKM_sk_num(SSL_CIPHER, (st)) +# define sk_SSL_CIPHER_value(st, i) SKM_sk_value(SSL_CIPHER, (st), (i)) +# define sk_SSL_CIPHER_set(st, i, val) SKM_sk_set(SSL_CIPHER, (st), (i), (val)) +# define sk_SSL_CIPHER_zero(st) SKM_sk_zero(SSL_CIPHER, (st)) +# define sk_SSL_CIPHER_push(st, val) SKM_sk_push(SSL_CIPHER, (st), (val)) +# define sk_SSL_CIPHER_unshift(st, val) SKM_sk_unshift(SSL_CIPHER, (st), (val)) +# define sk_SSL_CIPHER_find(st, val) SKM_sk_find(SSL_CIPHER, (st), (val)) +# define sk_SSL_CIPHER_find_ex(st, val) SKM_sk_find_ex(SSL_CIPHER, (st), (val)) +# define sk_SSL_CIPHER_delete(st, i) SKM_sk_delete(SSL_CIPHER, (st), (i)) +# define sk_SSL_CIPHER_delete_ptr(st, ptr) SKM_sk_delete_ptr(SSL_CIPHER, (st), (ptr)) +# define sk_SSL_CIPHER_insert(st, val, i) SKM_sk_insert(SSL_CIPHER, (st), (val), (i)) +# define sk_SSL_CIPHER_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(SSL_CIPHER, (st), (cmp)) +# define sk_SSL_CIPHER_dup(st) SKM_sk_dup(SSL_CIPHER, st) +# define sk_SSL_CIPHER_pop_free(st, free_func) SKM_sk_pop_free(SSL_CIPHER, (st), (free_func)) +# define sk_SSL_CIPHER_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(SSL_CIPHER, (st), (copy_func), (free_func)) +# define sk_SSL_CIPHER_shift(st) SKM_sk_shift(SSL_CIPHER, (st)) +# define sk_SSL_CIPHER_pop(st) SKM_sk_pop(SSL_CIPHER, (st)) +# define sk_SSL_CIPHER_sort(st) SKM_sk_sort(SSL_CIPHER, (st)) +# define sk_SSL_CIPHER_is_sorted(st) SKM_sk_is_sorted(SSL_CIPHER, (st)) +# define sk_SSL_COMP_new(cmp) SKM_sk_new(SSL_COMP, (cmp)) +# define sk_SSL_COMP_new_null() SKM_sk_new_null(SSL_COMP) +# define sk_SSL_COMP_free(st) SKM_sk_free(SSL_COMP, (st)) +# define sk_SSL_COMP_num(st) SKM_sk_num(SSL_COMP, (st)) +# define sk_SSL_COMP_value(st, i) SKM_sk_value(SSL_COMP, (st), (i)) +# define sk_SSL_COMP_set(st, i, val) SKM_sk_set(SSL_COMP, (st), (i), (val)) +# define sk_SSL_COMP_zero(st) SKM_sk_zero(SSL_COMP, (st)) +# define sk_SSL_COMP_push(st, val) SKM_sk_push(SSL_COMP, (st), (val)) +# define sk_SSL_COMP_unshift(st, val) SKM_sk_unshift(SSL_COMP, (st), (val)) +# define sk_SSL_COMP_find(st, val) SKM_sk_find(SSL_COMP, (st), (val)) +# define sk_SSL_COMP_find_ex(st, val) SKM_sk_find_ex(SSL_COMP, (st), (val)) +# define sk_SSL_COMP_delete(st, i) SKM_sk_delete(SSL_COMP, (st), (i)) +# define sk_SSL_COMP_delete_ptr(st, ptr) SKM_sk_delete_ptr(SSL_COMP, (st), (ptr)) +# define sk_SSL_COMP_insert(st, val, i) SKM_sk_insert(SSL_COMP, (st), (val), (i)) +# define sk_SSL_COMP_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(SSL_COMP, (st), (cmp)) +# define sk_SSL_COMP_dup(st) SKM_sk_dup(SSL_COMP, st) +# define sk_SSL_COMP_pop_free(st, free_func) SKM_sk_pop_free(SSL_COMP, (st), (free_func)) +# define sk_SSL_COMP_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(SSL_COMP, (st), (copy_func), (free_func)) +# define sk_SSL_COMP_shift(st) SKM_sk_shift(SSL_COMP, (st)) +# define sk_SSL_COMP_pop(st) SKM_sk_pop(SSL_COMP, (st)) +# define sk_SSL_COMP_sort(st) SKM_sk_sort(SSL_COMP, (st)) +# define sk_SSL_COMP_is_sorted(st) SKM_sk_is_sorted(SSL_COMP, (st)) +# define sk_STACK_OF_X509_NAME_ENTRY_new(cmp) SKM_sk_new(STACK_OF_X509_NAME_ENTRY, (cmp)) +# define sk_STACK_OF_X509_NAME_ENTRY_new_null() SKM_sk_new_null(STACK_OF_X509_NAME_ENTRY) +# define sk_STACK_OF_X509_NAME_ENTRY_free(st) SKM_sk_free(STACK_OF_X509_NAME_ENTRY, (st)) +# define sk_STACK_OF_X509_NAME_ENTRY_num(st) SKM_sk_num(STACK_OF_X509_NAME_ENTRY, (st)) +# define sk_STACK_OF_X509_NAME_ENTRY_value(st, i) SKM_sk_value(STACK_OF_X509_NAME_ENTRY, (st), (i)) +# define sk_STACK_OF_X509_NAME_ENTRY_set(st, i, val) SKM_sk_set(STACK_OF_X509_NAME_ENTRY, (st), (i), (val)) +# define sk_STACK_OF_X509_NAME_ENTRY_zero(st) SKM_sk_zero(STACK_OF_X509_NAME_ENTRY, (st)) +# define sk_STACK_OF_X509_NAME_ENTRY_push(st, val) SKM_sk_push(STACK_OF_X509_NAME_ENTRY, (st), (val)) +# define sk_STACK_OF_X509_NAME_ENTRY_unshift(st, val) SKM_sk_unshift(STACK_OF_X509_NAME_ENTRY, (st), (val)) +# define sk_STACK_OF_X509_NAME_ENTRY_find(st, val) SKM_sk_find(STACK_OF_X509_NAME_ENTRY, (st), (val)) +# define sk_STACK_OF_X509_NAME_ENTRY_find_ex(st, val) SKM_sk_find_ex(STACK_OF_X509_NAME_ENTRY, (st), (val)) +# define sk_STACK_OF_X509_NAME_ENTRY_delete(st, i) SKM_sk_delete(STACK_OF_X509_NAME_ENTRY, (st), (i)) +# define sk_STACK_OF_X509_NAME_ENTRY_delete_ptr(st, ptr) SKM_sk_delete_ptr(STACK_OF_X509_NAME_ENTRY, (st), (ptr)) +# define sk_STACK_OF_X509_NAME_ENTRY_insert(st, val, i) SKM_sk_insert(STACK_OF_X509_NAME_ENTRY, (st), (val), (i)) +# define sk_STACK_OF_X509_NAME_ENTRY_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(STACK_OF_X509_NAME_ENTRY, (st), (cmp)) +# define sk_STACK_OF_X509_NAME_ENTRY_dup(st) SKM_sk_dup(STACK_OF_X509_NAME_ENTRY, st) +# define sk_STACK_OF_X509_NAME_ENTRY_pop_free(st, free_func) SKM_sk_pop_free(STACK_OF_X509_NAME_ENTRY, (st), (free_func)) +# define sk_STACK_OF_X509_NAME_ENTRY_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(STACK_OF_X509_NAME_ENTRY, (st), (copy_func), (free_func)) +# define sk_STACK_OF_X509_NAME_ENTRY_shift(st) SKM_sk_shift(STACK_OF_X509_NAME_ENTRY, (st)) +# define sk_STACK_OF_X509_NAME_ENTRY_pop(st) SKM_sk_pop(STACK_OF_X509_NAME_ENTRY, (st)) +# define sk_STACK_OF_X509_NAME_ENTRY_sort(st) SKM_sk_sort(STACK_OF_X509_NAME_ENTRY, (st)) +# define sk_STACK_OF_X509_NAME_ENTRY_is_sorted(st) SKM_sk_is_sorted(STACK_OF_X509_NAME_ENTRY, (st)) +# define sk_STORE_ATTR_INFO_new(cmp) SKM_sk_new(STORE_ATTR_INFO, (cmp)) +# define sk_STORE_ATTR_INFO_new_null() SKM_sk_new_null(STORE_ATTR_INFO) +# define sk_STORE_ATTR_INFO_free(st) SKM_sk_free(STORE_ATTR_INFO, (st)) +# define sk_STORE_ATTR_INFO_num(st) SKM_sk_num(STORE_ATTR_INFO, (st)) +# define sk_STORE_ATTR_INFO_value(st, i) SKM_sk_value(STORE_ATTR_INFO, (st), (i)) +# define sk_STORE_ATTR_INFO_set(st, i, val) SKM_sk_set(STORE_ATTR_INFO, (st), (i), (val)) +# define sk_STORE_ATTR_INFO_zero(st) SKM_sk_zero(STORE_ATTR_INFO, (st)) +# define sk_STORE_ATTR_INFO_push(st, val) SKM_sk_push(STORE_ATTR_INFO, (st), (val)) +# define sk_STORE_ATTR_INFO_unshift(st, val) SKM_sk_unshift(STORE_ATTR_INFO, (st), (val)) +# define sk_STORE_ATTR_INFO_find(st, val) SKM_sk_find(STORE_ATTR_INFO, (st), (val)) +# define sk_STORE_ATTR_INFO_find_ex(st, val) SKM_sk_find_ex(STORE_ATTR_INFO, (st), (val)) +# define sk_STORE_ATTR_INFO_delete(st, i) SKM_sk_delete(STORE_ATTR_INFO, (st), (i)) +# define sk_STORE_ATTR_INFO_delete_ptr(st, ptr) SKM_sk_delete_ptr(STORE_ATTR_INFO, (st), (ptr)) +# define sk_STORE_ATTR_INFO_insert(st, val, i) SKM_sk_insert(STORE_ATTR_INFO, (st), (val), (i)) +# define sk_STORE_ATTR_INFO_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(STORE_ATTR_INFO, (st), (cmp)) +# define sk_STORE_ATTR_INFO_dup(st) SKM_sk_dup(STORE_ATTR_INFO, st) +# define sk_STORE_ATTR_INFO_pop_free(st, free_func) SKM_sk_pop_free(STORE_ATTR_INFO, (st), (free_func)) +# define sk_STORE_ATTR_INFO_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(STORE_ATTR_INFO, (st), (copy_func), (free_func)) +# define sk_STORE_ATTR_INFO_shift(st) SKM_sk_shift(STORE_ATTR_INFO, (st)) +# define sk_STORE_ATTR_INFO_pop(st) SKM_sk_pop(STORE_ATTR_INFO, (st)) +# define sk_STORE_ATTR_INFO_sort(st) SKM_sk_sort(STORE_ATTR_INFO, (st)) +# define sk_STORE_ATTR_INFO_is_sorted(st) SKM_sk_is_sorted(STORE_ATTR_INFO, (st)) +# define sk_STORE_OBJECT_new(cmp) SKM_sk_new(STORE_OBJECT, (cmp)) +# define sk_STORE_OBJECT_new_null() SKM_sk_new_null(STORE_OBJECT) +# define sk_STORE_OBJECT_free(st) SKM_sk_free(STORE_OBJECT, (st)) +# define sk_STORE_OBJECT_num(st) SKM_sk_num(STORE_OBJECT, (st)) +# define sk_STORE_OBJECT_value(st, i) SKM_sk_value(STORE_OBJECT, (st), (i)) +# define sk_STORE_OBJECT_set(st, i, val) SKM_sk_set(STORE_OBJECT, (st), (i), (val)) +# define sk_STORE_OBJECT_zero(st) SKM_sk_zero(STORE_OBJECT, (st)) +# define sk_STORE_OBJECT_push(st, val) SKM_sk_push(STORE_OBJECT, (st), (val)) +# define sk_STORE_OBJECT_unshift(st, val) SKM_sk_unshift(STORE_OBJECT, (st), (val)) +# define sk_STORE_OBJECT_find(st, val) SKM_sk_find(STORE_OBJECT, (st), (val)) +# define sk_STORE_OBJECT_find_ex(st, val) SKM_sk_find_ex(STORE_OBJECT, (st), (val)) +# define sk_STORE_OBJECT_delete(st, i) SKM_sk_delete(STORE_OBJECT, (st), (i)) +# define sk_STORE_OBJECT_delete_ptr(st, ptr) SKM_sk_delete_ptr(STORE_OBJECT, (st), (ptr)) +# define sk_STORE_OBJECT_insert(st, val, i) SKM_sk_insert(STORE_OBJECT, (st), (val), (i)) +# define sk_STORE_OBJECT_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(STORE_OBJECT, (st), (cmp)) +# define sk_STORE_OBJECT_dup(st) SKM_sk_dup(STORE_OBJECT, st) +# define sk_STORE_OBJECT_pop_free(st, free_func) SKM_sk_pop_free(STORE_OBJECT, (st), (free_func)) +# define sk_STORE_OBJECT_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(STORE_OBJECT, (st), (copy_func), (free_func)) +# define sk_STORE_OBJECT_shift(st) SKM_sk_shift(STORE_OBJECT, (st)) +# define sk_STORE_OBJECT_pop(st) SKM_sk_pop(STORE_OBJECT, (st)) +# define sk_STORE_OBJECT_sort(st) SKM_sk_sort(STORE_OBJECT, (st)) +# define sk_STORE_OBJECT_is_sorted(st) SKM_sk_is_sorted(STORE_OBJECT, (st)) +# define sk_SXNETID_new(cmp) SKM_sk_new(SXNETID, (cmp)) +# define sk_SXNETID_new_null() SKM_sk_new_null(SXNETID) +# define sk_SXNETID_free(st) SKM_sk_free(SXNETID, (st)) +# define sk_SXNETID_num(st) SKM_sk_num(SXNETID, (st)) +# define sk_SXNETID_value(st, i) SKM_sk_value(SXNETID, (st), (i)) +# define sk_SXNETID_set(st, i, val) SKM_sk_set(SXNETID, (st), (i), (val)) +# define sk_SXNETID_zero(st) SKM_sk_zero(SXNETID, (st)) +# define sk_SXNETID_push(st, val) SKM_sk_push(SXNETID, (st), (val)) +# define sk_SXNETID_unshift(st, val) SKM_sk_unshift(SXNETID, (st), (val)) +# define sk_SXNETID_find(st, val) SKM_sk_find(SXNETID, (st), (val)) +# define sk_SXNETID_find_ex(st, val) SKM_sk_find_ex(SXNETID, (st), (val)) +# define sk_SXNETID_delete(st, i) SKM_sk_delete(SXNETID, (st), (i)) +# define sk_SXNETID_delete_ptr(st, ptr) SKM_sk_delete_ptr(SXNETID, (st), (ptr)) +# define sk_SXNETID_insert(st, val, i) SKM_sk_insert(SXNETID, (st), (val), (i)) +# define sk_SXNETID_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(SXNETID, (st), (cmp)) +# define sk_SXNETID_dup(st) SKM_sk_dup(SXNETID, st) +# define sk_SXNETID_pop_free(st, free_func) SKM_sk_pop_free(SXNETID, (st), (free_func)) +# define sk_SXNETID_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(SXNETID, (st), (copy_func), (free_func)) +# define sk_SXNETID_shift(st) SKM_sk_shift(SXNETID, (st)) +# define sk_SXNETID_pop(st) SKM_sk_pop(SXNETID, (st)) +# define sk_SXNETID_sort(st) SKM_sk_sort(SXNETID, (st)) +# define sk_SXNETID_is_sorted(st) SKM_sk_is_sorted(SXNETID, (st)) +# define sk_UI_STRING_new(cmp) SKM_sk_new(UI_STRING, (cmp)) +# define sk_UI_STRING_new_null() SKM_sk_new_null(UI_STRING) +# define sk_UI_STRING_free(st) SKM_sk_free(UI_STRING, (st)) +# define sk_UI_STRING_num(st) SKM_sk_num(UI_STRING, (st)) +# define sk_UI_STRING_value(st, i) SKM_sk_value(UI_STRING, (st), (i)) +# define sk_UI_STRING_set(st, i, val) SKM_sk_set(UI_STRING, (st), (i), (val)) +# define sk_UI_STRING_zero(st) SKM_sk_zero(UI_STRING, (st)) +# define sk_UI_STRING_push(st, val) SKM_sk_push(UI_STRING, (st), (val)) +# define sk_UI_STRING_unshift(st, val) SKM_sk_unshift(UI_STRING, (st), (val)) +# define sk_UI_STRING_find(st, val) SKM_sk_find(UI_STRING, (st), (val)) +# define sk_UI_STRING_find_ex(st, val) SKM_sk_find_ex(UI_STRING, (st), (val)) +# define sk_UI_STRING_delete(st, i) SKM_sk_delete(UI_STRING, (st), (i)) +# define sk_UI_STRING_delete_ptr(st, ptr) SKM_sk_delete_ptr(UI_STRING, (st), (ptr)) +# define sk_UI_STRING_insert(st, val, i) SKM_sk_insert(UI_STRING, (st), (val), (i)) +# define sk_UI_STRING_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(UI_STRING, (st), (cmp)) +# define sk_UI_STRING_dup(st) SKM_sk_dup(UI_STRING, st) +# define sk_UI_STRING_pop_free(st, free_func) SKM_sk_pop_free(UI_STRING, (st), (free_func)) +# define sk_UI_STRING_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(UI_STRING, (st), (copy_func), (free_func)) +# define sk_UI_STRING_shift(st) SKM_sk_shift(UI_STRING, (st)) +# define sk_UI_STRING_pop(st) SKM_sk_pop(UI_STRING, (st)) +# define sk_UI_STRING_sort(st) SKM_sk_sort(UI_STRING, (st)) +# define sk_UI_STRING_is_sorted(st) SKM_sk_is_sorted(UI_STRING, (st)) +# define sk_X509_new(cmp) SKM_sk_new(X509, (cmp)) +# define sk_X509_new_null() SKM_sk_new_null(X509) +# define sk_X509_free(st) SKM_sk_free(X509, (st)) +# define sk_X509_num(st) SKM_sk_num(X509, (st)) +# define sk_X509_value(st, i) SKM_sk_value(X509, (st), (i)) +# define sk_X509_set(st, i, val) SKM_sk_set(X509, (st), (i), (val)) +# define sk_X509_zero(st) SKM_sk_zero(X509, (st)) +# define sk_X509_push(st, val) SKM_sk_push(X509, (st), (val)) +# define sk_X509_unshift(st, val) SKM_sk_unshift(X509, (st), (val)) +# define sk_X509_find(st, val) SKM_sk_find(X509, (st), (val)) +# define sk_X509_find_ex(st, val) SKM_sk_find_ex(X509, (st), (val)) +# define sk_X509_delete(st, i) SKM_sk_delete(X509, (st), (i)) +# define sk_X509_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509, (st), (ptr)) +# define sk_X509_insert(st, val, i) SKM_sk_insert(X509, (st), (val), (i)) +# define sk_X509_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509, (st), (cmp)) +# define sk_X509_dup(st) SKM_sk_dup(X509, st) +# define sk_X509_pop_free(st, free_func) SKM_sk_pop_free(X509, (st), (free_func)) +# define sk_X509_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(X509, (st), (copy_func), (free_func)) +# define sk_X509_shift(st) SKM_sk_shift(X509, (st)) +# define sk_X509_pop(st) SKM_sk_pop(X509, (st)) +# define sk_X509_sort(st) SKM_sk_sort(X509, (st)) +# define sk_X509_is_sorted(st) SKM_sk_is_sorted(X509, (st)) +# define sk_X509V3_EXT_METHOD_new(cmp) SKM_sk_new(X509V3_EXT_METHOD, (cmp)) +# define sk_X509V3_EXT_METHOD_new_null() SKM_sk_new_null(X509V3_EXT_METHOD) +# define sk_X509V3_EXT_METHOD_free(st) SKM_sk_free(X509V3_EXT_METHOD, (st)) +# define sk_X509V3_EXT_METHOD_num(st) SKM_sk_num(X509V3_EXT_METHOD, (st)) +# define sk_X509V3_EXT_METHOD_value(st, i) SKM_sk_value(X509V3_EXT_METHOD, (st), (i)) +# define sk_X509V3_EXT_METHOD_set(st, i, val) SKM_sk_set(X509V3_EXT_METHOD, (st), (i), (val)) +# define sk_X509V3_EXT_METHOD_zero(st) SKM_sk_zero(X509V3_EXT_METHOD, (st)) +# define sk_X509V3_EXT_METHOD_push(st, val) SKM_sk_push(X509V3_EXT_METHOD, (st), (val)) +# define sk_X509V3_EXT_METHOD_unshift(st, val) SKM_sk_unshift(X509V3_EXT_METHOD, (st), (val)) +# define sk_X509V3_EXT_METHOD_find(st, val) SKM_sk_find(X509V3_EXT_METHOD, (st), (val)) +# define sk_X509V3_EXT_METHOD_find_ex(st, val) SKM_sk_find_ex(X509V3_EXT_METHOD, (st), (val)) +# define sk_X509V3_EXT_METHOD_delete(st, i) SKM_sk_delete(X509V3_EXT_METHOD, (st), (i)) +# define sk_X509V3_EXT_METHOD_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509V3_EXT_METHOD, (st), (ptr)) +# define sk_X509V3_EXT_METHOD_insert(st, val, i) SKM_sk_insert(X509V3_EXT_METHOD, (st), (val), (i)) +# define sk_X509V3_EXT_METHOD_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509V3_EXT_METHOD, (st), (cmp)) +# define sk_X509V3_EXT_METHOD_dup(st) SKM_sk_dup(X509V3_EXT_METHOD, st) +# define sk_X509V3_EXT_METHOD_pop_free(st, free_func) SKM_sk_pop_free(X509V3_EXT_METHOD, (st), (free_func)) +# define sk_X509V3_EXT_METHOD_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(X509V3_EXT_METHOD, (st), (copy_func), (free_func)) +# define sk_X509V3_EXT_METHOD_shift(st) SKM_sk_shift(X509V3_EXT_METHOD, (st)) +# define sk_X509V3_EXT_METHOD_pop(st) SKM_sk_pop(X509V3_EXT_METHOD, (st)) +# define sk_X509V3_EXT_METHOD_sort(st) SKM_sk_sort(X509V3_EXT_METHOD, (st)) +# define sk_X509V3_EXT_METHOD_is_sorted(st) SKM_sk_is_sorted(X509V3_EXT_METHOD, (st)) +# define sk_X509_ALGOR_new(cmp) SKM_sk_new(X509_ALGOR, (cmp)) +# define sk_X509_ALGOR_new_null() SKM_sk_new_null(X509_ALGOR) +# define sk_X509_ALGOR_free(st) SKM_sk_free(X509_ALGOR, (st)) +# define sk_X509_ALGOR_num(st) SKM_sk_num(X509_ALGOR, (st)) +# define sk_X509_ALGOR_value(st, i) SKM_sk_value(X509_ALGOR, (st), (i)) +# define sk_X509_ALGOR_set(st, i, val) SKM_sk_set(X509_ALGOR, (st), (i), (val)) +# define sk_X509_ALGOR_zero(st) SKM_sk_zero(X509_ALGOR, (st)) +# define sk_X509_ALGOR_push(st, val) SKM_sk_push(X509_ALGOR, (st), (val)) +# define sk_X509_ALGOR_unshift(st, val) SKM_sk_unshift(X509_ALGOR, (st), (val)) +# define sk_X509_ALGOR_find(st, val) SKM_sk_find(X509_ALGOR, (st), (val)) +# define sk_X509_ALGOR_find_ex(st, val) SKM_sk_find_ex(X509_ALGOR, (st), (val)) +# define sk_X509_ALGOR_delete(st, i) SKM_sk_delete(X509_ALGOR, (st), (i)) +# define sk_X509_ALGOR_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_ALGOR, (st), (ptr)) +# define sk_X509_ALGOR_insert(st, val, i) SKM_sk_insert(X509_ALGOR, (st), (val), (i)) +# define sk_X509_ALGOR_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_ALGOR, (st), (cmp)) +# define sk_X509_ALGOR_dup(st) SKM_sk_dup(X509_ALGOR, st) +# define sk_X509_ALGOR_pop_free(st, free_func) SKM_sk_pop_free(X509_ALGOR, (st), (free_func)) +# define sk_X509_ALGOR_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(X509_ALGOR, (st), (copy_func), (free_func)) +# define sk_X509_ALGOR_shift(st) SKM_sk_shift(X509_ALGOR, (st)) +# define sk_X509_ALGOR_pop(st) SKM_sk_pop(X509_ALGOR, (st)) +# define sk_X509_ALGOR_sort(st) SKM_sk_sort(X509_ALGOR, (st)) +# define sk_X509_ALGOR_is_sorted(st) SKM_sk_is_sorted(X509_ALGOR, (st)) +# define sk_X509_ATTRIBUTE_new(cmp) SKM_sk_new(X509_ATTRIBUTE, (cmp)) +# define sk_X509_ATTRIBUTE_new_null() SKM_sk_new_null(X509_ATTRIBUTE) +# define sk_X509_ATTRIBUTE_free(st) SKM_sk_free(X509_ATTRIBUTE, (st)) +# define sk_X509_ATTRIBUTE_num(st) SKM_sk_num(X509_ATTRIBUTE, (st)) +# define sk_X509_ATTRIBUTE_value(st, i) SKM_sk_value(X509_ATTRIBUTE, (st), (i)) +# define sk_X509_ATTRIBUTE_set(st, i, val) SKM_sk_set(X509_ATTRIBUTE, (st), (i), (val)) +# define sk_X509_ATTRIBUTE_zero(st) SKM_sk_zero(X509_ATTRIBUTE, (st)) +# define sk_X509_ATTRIBUTE_push(st, val) SKM_sk_push(X509_ATTRIBUTE, (st), (val)) +# define sk_X509_ATTRIBUTE_unshift(st, val) SKM_sk_unshift(X509_ATTRIBUTE, (st), (val)) +# define sk_X509_ATTRIBUTE_find(st, val) SKM_sk_find(X509_ATTRIBUTE, (st), (val)) +# define sk_X509_ATTRIBUTE_find_ex(st, val) SKM_sk_find_ex(X509_ATTRIBUTE, (st), (val)) +# define sk_X509_ATTRIBUTE_delete(st, i) SKM_sk_delete(X509_ATTRIBUTE, (st), (i)) +# define sk_X509_ATTRIBUTE_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_ATTRIBUTE, (st), (ptr)) +# define sk_X509_ATTRIBUTE_insert(st, val, i) SKM_sk_insert(X509_ATTRIBUTE, (st), (val), (i)) +# define sk_X509_ATTRIBUTE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_ATTRIBUTE, (st), (cmp)) +# define sk_X509_ATTRIBUTE_dup(st) SKM_sk_dup(X509_ATTRIBUTE, st) +# define sk_X509_ATTRIBUTE_pop_free(st, free_func) SKM_sk_pop_free(X509_ATTRIBUTE, (st), (free_func)) +# define sk_X509_ATTRIBUTE_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(X509_ATTRIBUTE, (st), (copy_func), (free_func)) +# define sk_X509_ATTRIBUTE_shift(st) SKM_sk_shift(X509_ATTRIBUTE, (st)) +# define sk_X509_ATTRIBUTE_pop(st) SKM_sk_pop(X509_ATTRIBUTE, (st)) +# define sk_X509_ATTRIBUTE_sort(st) SKM_sk_sort(X509_ATTRIBUTE, (st)) +# define sk_X509_ATTRIBUTE_is_sorted(st) SKM_sk_is_sorted(X509_ATTRIBUTE, (st)) +# define sk_X509_CRL_new(cmp) SKM_sk_new(X509_CRL, (cmp)) +# define sk_X509_CRL_new_null() SKM_sk_new_null(X509_CRL) +# define sk_X509_CRL_free(st) SKM_sk_free(X509_CRL, (st)) +# define sk_X509_CRL_num(st) SKM_sk_num(X509_CRL, (st)) +# define sk_X509_CRL_value(st, i) SKM_sk_value(X509_CRL, (st), (i)) +# define sk_X509_CRL_set(st, i, val) SKM_sk_set(X509_CRL, (st), (i), (val)) +# define sk_X509_CRL_zero(st) SKM_sk_zero(X509_CRL, (st)) +# define sk_X509_CRL_push(st, val) SKM_sk_push(X509_CRL, (st), (val)) +# define sk_X509_CRL_unshift(st, val) SKM_sk_unshift(X509_CRL, (st), (val)) +# define sk_X509_CRL_find(st, val) SKM_sk_find(X509_CRL, (st), (val)) +# define sk_X509_CRL_find_ex(st, val) SKM_sk_find_ex(X509_CRL, (st), (val)) +# define sk_X509_CRL_delete(st, i) SKM_sk_delete(X509_CRL, (st), (i)) +# define sk_X509_CRL_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_CRL, (st), (ptr)) +# define sk_X509_CRL_insert(st, val, i) SKM_sk_insert(X509_CRL, (st), (val), (i)) +# define sk_X509_CRL_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_CRL, (st), (cmp)) +# define sk_X509_CRL_dup(st) SKM_sk_dup(X509_CRL, st) +# define sk_X509_CRL_pop_free(st, free_func) SKM_sk_pop_free(X509_CRL, (st), (free_func)) +# define sk_X509_CRL_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(X509_CRL, (st), (copy_func), (free_func)) +# define sk_X509_CRL_shift(st) SKM_sk_shift(X509_CRL, (st)) +# define sk_X509_CRL_pop(st) SKM_sk_pop(X509_CRL, (st)) +# define sk_X509_CRL_sort(st) SKM_sk_sort(X509_CRL, (st)) +# define sk_X509_CRL_is_sorted(st) SKM_sk_is_sorted(X509_CRL, (st)) +# define sk_X509_EXTENSION_new(cmp) SKM_sk_new(X509_EXTENSION, (cmp)) +# define sk_X509_EXTENSION_new_null() SKM_sk_new_null(X509_EXTENSION) +# define sk_X509_EXTENSION_free(st) SKM_sk_free(X509_EXTENSION, (st)) +# define sk_X509_EXTENSION_num(st) SKM_sk_num(X509_EXTENSION, (st)) +# define sk_X509_EXTENSION_value(st, i) SKM_sk_value(X509_EXTENSION, (st), (i)) +# define sk_X509_EXTENSION_set(st, i, val) SKM_sk_set(X509_EXTENSION, (st), (i), (val)) +# define sk_X509_EXTENSION_zero(st) SKM_sk_zero(X509_EXTENSION, (st)) +# define sk_X509_EXTENSION_push(st, val) SKM_sk_push(X509_EXTENSION, (st), (val)) +# define sk_X509_EXTENSION_unshift(st, val) SKM_sk_unshift(X509_EXTENSION, (st), (val)) +# define sk_X509_EXTENSION_find(st, val) SKM_sk_find(X509_EXTENSION, (st), (val)) +# define sk_X509_EXTENSION_find_ex(st, val) SKM_sk_find_ex(X509_EXTENSION, (st), (val)) +# define sk_X509_EXTENSION_delete(st, i) SKM_sk_delete(X509_EXTENSION, (st), (i)) +# define sk_X509_EXTENSION_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_EXTENSION, (st), (ptr)) +# define sk_X509_EXTENSION_insert(st, val, i) SKM_sk_insert(X509_EXTENSION, (st), (val), (i)) +# define sk_X509_EXTENSION_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_EXTENSION, (st), (cmp)) +# define sk_X509_EXTENSION_dup(st) SKM_sk_dup(X509_EXTENSION, st) +# define sk_X509_EXTENSION_pop_free(st, free_func) SKM_sk_pop_free(X509_EXTENSION, (st), (free_func)) +# define sk_X509_EXTENSION_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(X509_EXTENSION, (st), (copy_func), (free_func)) +# define sk_X509_EXTENSION_shift(st) SKM_sk_shift(X509_EXTENSION, (st)) +# define sk_X509_EXTENSION_pop(st) SKM_sk_pop(X509_EXTENSION, (st)) +# define sk_X509_EXTENSION_sort(st) SKM_sk_sort(X509_EXTENSION, (st)) +# define sk_X509_EXTENSION_is_sorted(st) SKM_sk_is_sorted(X509_EXTENSION, (st)) +# define sk_X509_INFO_new(cmp) SKM_sk_new(X509_INFO, (cmp)) +# define sk_X509_INFO_new_null() SKM_sk_new_null(X509_INFO) +# define sk_X509_INFO_free(st) SKM_sk_free(X509_INFO, (st)) +# define sk_X509_INFO_num(st) SKM_sk_num(X509_INFO, (st)) +# define sk_X509_INFO_value(st, i) SKM_sk_value(X509_INFO, (st), (i)) +# define sk_X509_INFO_set(st, i, val) SKM_sk_set(X509_INFO, (st), (i), (val)) +# define sk_X509_INFO_zero(st) SKM_sk_zero(X509_INFO, (st)) +# define sk_X509_INFO_push(st, val) SKM_sk_push(X509_INFO, (st), (val)) +# define sk_X509_INFO_unshift(st, val) SKM_sk_unshift(X509_INFO, (st), (val)) +# define sk_X509_INFO_find(st, val) SKM_sk_find(X509_INFO, (st), (val)) +# define sk_X509_INFO_find_ex(st, val) SKM_sk_find_ex(X509_INFO, (st), (val)) +# define sk_X509_INFO_delete(st, i) SKM_sk_delete(X509_INFO, (st), (i)) +# define sk_X509_INFO_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_INFO, (st), (ptr)) +# define sk_X509_INFO_insert(st, val, i) SKM_sk_insert(X509_INFO, (st), (val), (i)) +# define sk_X509_INFO_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_INFO, (st), (cmp)) +# define sk_X509_INFO_dup(st) SKM_sk_dup(X509_INFO, st) +# define sk_X509_INFO_pop_free(st, free_func) SKM_sk_pop_free(X509_INFO, (st), (free_func)) +# define sk_X509_INFO_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(X509_INFO, (st), (copy_func), (free_func)) +# define sk_X509_INFO_shift(st) SKM_sk_shift(X509_INFO, (st)) +# define sk_X509_INFO_pop(st) SKM_sk_pop(X509_INFO, (st)) +# define sk_X509_INFO_sort(st) SKM_sk_sort(X509_INFO, (st)) +# define sk_X509_INFO_is_sorted(st) SKM_sk_is_sorted(X509_INFO, (st)) +# define sk_X509_LOOKUP_new(cmp) SKM_sk_new(X509_LOOKUP, (cmp)) +# define sk_X509_LOOKUP_new_null() SKM_sk_new_null(X509_LOOKUP) +# define sk_X509_LOOKUP_free(st) SKM_sk_free(X509_LOOKUP, (st)) +# define sk_X509_LOOKUP_num(st) SKM_sk_num(X509_LOOKUP, (st)) +# define sk_X509_LOOKUP_value(st, i) SKM_sk_value(X509_LOOKUP, (st), (i)) +# define sk_X509_LOOKUP_set(st, i, val) SKM_sk_set(X509_LOOKUP, (st), (i), (val)) +# define sk_X509_LOOKUP_zero(st) SKM_sk_zero(X509_LOOKUP, (st)) +# define sk_X509_LOOKUP_push(st, val) SKM_sk_push(X509_LOOKUP, (st), (val)) +# define sk_X509_LOOKUP_unshift(st, val) SKM_sk_unshift(X509_LOOKUP, (st), (val)) +# define sk_X509_LOOKUP_find(st, val) SKM_sk_find(X509_LOOKUP, (st), (val)) +# define sk_X509_LOOKUP_find_ex(st, val) SKM_sk_find_ex(X509_LOOKUP, (st), (val)) +# define sk_X509_LOOKUP_delete(st, i) SKM_sk_delete(X509_LOOKUP, (st), (i)) +# define sk_X509_LOOKUP_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_LOOKUP, (st), (ptr)) +# define sk_X509_LOOKUP_insert(st, val, i) SKM_sk_insert(X509_LOOKUP, (st), (val), (i)) +# define sk_X509_LOOKUP_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_LOOKUP, (st), (cmp)) +# define sk_X509_LOOKUP_dup(st) SKM_sk_dup(X509_LOOKUP, st) +# define sk_X509_LOOKUP_pop_free(st, free_func) SKM_sk_pop_free(X509_LOOKUP, (st), (free_func)) +# define sk_X509_LOOKUP_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(X509_LOOKUP, (st), (copy_func), (free_func)) +# define sk_X509_LOOKUP_shift(st) SKM_sk_shift(X509_LOOKUP, (st)) +# define sk_X509_LOOKUP_pop(st) SKM_sk_pop(X509_LOOKUP, (st)) +# define sk_X509_LOOKUP_sort(st) SKM_sk_sort(X509_LOOKUP, (st)) +# define sk_X509_LOOKUP_is_sorted(st) SKM_sk_is_sorted(X509_LOOKUP, (st)) +# define sk_X509_NAME_new(cmp) SKM_sk_new(X509_NAME, (cmp)) +# define sk_X509_NAME_new_null() SKM_sk_new_null(X509_NAME) +# define sk_X509_NAME_free(st) SKM_sk_free(X509_NAME, (st)) +# define sk_X509_NAME_num(st) SKM_sk_num(X509_NAME, (st)) +# define sk_X509_NAME_value(st, i) SKM_sk_value(X509_NAME, (st), (i)) +# define sk_X509_NAME_set(st, i, val) SKM_sk_set(X509_NAME, (st), (i), (val)) +# define sk_X509_NAME_zero(st) SKM_sk_zero(X509_NAME, (st)) +# define sk_X509_NAME_push(st, val) SKM_sk_push(X509_NAME, (st), (val)) +# define sk_X509_NAME_unshift(st, val) SKM_sk_unshift(X509_NAME, (st), (val)) +# define sk_X509_NAME_find(st, val) SKM_sk_find(X509_NAME, (st), (val)) +# define sk_X509_NAME_find_ex(st, val) SKM_sk_find_ex(X509_NAME, (st), (val)) +# define sk_X509_NAME_delete(st, i) SKM_sk_delete(X509_NAME, (st), (i)) +# define sk_X509_NAME_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_NAME, (st), (ptr)) +# define sk_X509_NAME_insert(st, val, i) SKM_sk_insert(X509_NAME, (st), (val), (i)) +# define sk_X509_NAME_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_NAME, (st), (cmp)) +# define sk_X509_NAME_dup(st) SKM_sk_dup(X509_NAME, st) +# define sk_X509_NAME_pop_free(st, free_func) SKM_sk_pop_free(X509_NAME, (st), (free_func)) +# define sk_X509_NAME_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(X509_NAME, (st), (copy_func), (free_func)) +# define sk_X509_NAME_shift(st) SKM_sk_shift(X509_NAME, (st)) +# define sk_X509_NAME_pop(st) SKM_sk_pop(X509_NAME, (st)) +# define sk_X509_NAME_sort(st) SKM_sk_sort(X509_NAME, (st)) +# define sk_X509_NAME_is_sorted(st) SKM_sk_is_sorted(X509_NAME, (st)) +# define sk_X509_NAME_ENTRY_new(cmp) SKM_sk_new(X509_NAME_ENTRY, (cmp)) +# define sk_X509_NAME_ENTRY_new_null() SKM_sk_new_null(X509_NAME_ENTRY) +# define sk_X509_NAME_ENTRY_free(st) SKM_sk_free(X509_NAME_ENTRY, (st)) +# define sk_X509_NAME_ENTRY_num(st) SKM_sk_num(X509_NAME_ENTRY, (st)) +# define sk_X509_NAME_ENTRY_value(st, i) SKM_sk_value(X509_NAME_ENTRY, (st), (i)) +# define sk_X509_NAME_ENTRY_set(st, i, val) SKM_sk_set(X509_NAME_ENTRY, (st), (i), (val)) +# define sk_X509_NAME_ENTRY_zero(st) SKM_sk_zero(X509_NAME_ENTRY, (st)) +# define sk_X509_NAME_ENTRY_push(st, val) SKM_sk_push(X509_NAME_ENTRY, (st), (val)) +# define sk_X509_NAME_ENTRY_unshift(st, val) SKM_sk_unshift(X509_NAME_ENTRY, (st), (val)) +# define sk_X509_NAME_ENTRY_find(st, val) SKM_sk_find(X509_NAME_ENTRY, (st), (val)) +# define sk_X509_NAME_ENTRY_find_ex(st, val) SKM_sk_find_ex(X509_NAME_ENTRY, (st), (val)) +# define sk_X509_NAME_ENTRY_delete(st, i) SKM_sk_delete(X509_NAME_ENTRY, (st), (i)) +# define sk_X509_NAME_ENTRY_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_NAME_ENTRY, (st), (ptr)) +# define sk_X509_NAME_ENTRY_insert(st, val, i) SKM_sk_insert(X509_NAME_ENTRY, (st), (val), (i)) +# define sk_X509_NAME_ENTRY_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_NAME_ENTRY, (st), (cmp)) +# define sk_X509_NAME_ENTRY_dup(st) SKM_sk_dup(X509_NAME_ENTRY, st) +# define sk_X509_NAME_ENTRY_pop_free(st, free_func) SKM_sk_pop_free(X509_NAME_ENTRY, (st), (free_func)) +# define sk_X509_NAME_ENTRY_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(X509_NAME_ENTRY, (st), (copy_func), (free_func)) +# define sk_X509_NAME_ENTRY_shift(st) SKM_sk_shift(X509_NAME_ENTRY, (st)) +# define sk_X509_NAME_ENTRY_pop(st) SKM_sk_pop(X509_NAME_ENTRY, (st)) +# define sk_X509_NAME_ENTRY_sort(st) SKM_sk_sort(X509_NAME_ENTRY, (st)) +# define sk_X509_NAME_ENTRY_is_sorted(st) SKM_sk_is_sorted(X509_NAME_ENTRY, (st)) +# define sk_X509_OBJECT_new(cmp) SKM_sk_new(X509_OBJECT, (cmp)) +# define sk_X509_OBJECT_new_null() SKM_sk_new_null(X509_OBJECT) +# define sk_X509_OBJECT_free(st) SKM_sk_free(X509_OBJECT, (st)) +# define sk_X509_OBJECT_num(st) SKM_sk_num(X509_OBJECT, (st)) +# define sk_X509_OBJECT_value(st, i) SKM_sk_value(X509_OBJECT, (st), (i)) +# define sk_X509_OBJECT_set(st, i, val) SKM_sk_set(X509_OBJECT, (st), (i), (val)) +# define sk_X509_OBJECT_zero(st) SKM_sk_zero(X509_OBJECT, (st)) +# define sk_X509_OBJECT_push(st, val) SKM_sk_push(X509_OBJECT, (st), (val)) +# define sk_X509_OBJECT_unshift(st, val) SKM_sk_unshift(X509_OBJECT, (st), (val)) +# define sk_X509_OBJECT_find(st, val) SKM_sk_find(X509_OBJECT, (st), (val)) +# define sk_X509_OBJECT_find_ex(st, val) SKM_sk_find_ex(X509_OBJECT, (st), (val)) +# define sk_X509_OBJECT_delete(st, i) SKM_sk_delete(X509_OBJECT, (st), (i)) +# define sk_X509_OBJECT_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_OBJECT, (st), (ptr)) +# define sk_X509_OBJECT_insert(st, val, i) SKM_sk_insert(X509_OBJECT, (st), (val), (i)) +# define sk_X509_OBJECT_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_OBJECT, (st), (cmp)) +# define sk_X509_OBJECT_dup(st) SKM_sk_dup(X509_OBJECT, st) +# define sk_X509_OBJECT_pop_free(st, free_func) SKM_sk_pop_free(X509_OBJECT, (st), (free_func)) +# define sk_X509_OBJECT_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(X509_OBJECT, (st), (copy_func), (free_func)) +# define sk_X509_OBJECT_shift(st) SKM_sk_shift(X509_OBJECT, (st)) +# define sk_X509_OBJECT_pop(st) SKM_sk_pop(X509_OBJECT, (st)) +# define sk_X509_OBJECT_sort(st) SKM_sk_sort(X509_OBJECT, (st)) +# define sk_X509_OBJECT_is_sorted(st) SKM_sk_is_sorted(X509_OBJECT, (st)) +# define sk_X509_POLICY_DATA_new(cmp) SKM_sk_new(X509_POLICY_DATA, (cmp)) +# define sk_X509_POLICY_DATA_new_null() SKM_sk_new_null(X509_POLICY_DATA) +# define sk_X509_POLICY_DATA_free(st) SKM_sk_free(X509_POLICY_DATA, (st)) +# define sk_X509_POLICY_DATA_num(st) SKM_sk_num(X509_POLICY_DATA, (st)) +# define sk_X509_POLICY_DATA_value(st, i) SKM_sk_value(X509_POLICY_DATA, (st), (i)) +# define sk_X509_POLICY_DATA_set(st, i, val) SKM_sk_set(X509_POLICY_DATA, (st), (i), (val)) +# define sk_X509_POLICY_DATA_zero(st) SKM_sk_zero(X509_POLICY_DATA, (st)) +# define sk_X509_POLICY_DATA_push(st, val) SKM_sk_push(X509_POLICY_DATA, (st), (val)) +# define sk_X509_POLICY_DATA_unshift(st, val) SKM_sk_unshift(X509_POLICY_DATA, (st), (val)) +# define sk_X509_POLICY_DATA_find(st, val) SKM_sk_find(X509_POLICY_DATA, (st), (val)) +# define sk_X509_POLICY_DATA_find_ex(st, val) SKM_sk_find_ex(X509_POLICY_DATA, (st), (val)) +# define sk_X509_POLICY_DATA_delete(st, i) SKM_sk_delete(X509_POLICY_DATA, (st), (i)) +# define sk_X509_POLICY_DATA_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_POLICY_DATA, (st), (ptr)) +# define sk_X509_POLICY_DATA_insert(st, val, i) SKM_sk_insert(X509_POLICY_DATA, (st), (val), (i)) +# define sk_X509_POLICY_DATA_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_POLICY_DATA, (st), (cmp)) +# define sk_X509_POLICY_DATA_dup(st) SKM_sk_dup(X509_POLICY_DATA, st) +# define sk_X509_POLICY_DATA_pop_free(st, free_func) SKM_sk_pop_free(X509_POLICY_DATA, (st), (free_func)) +# define sk_X509_POLICY_DATA_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(X509_POLICY_DATA, (st), (copy_func), (free_func)) +# define sk_X509_POLICY_DATA_shift(st) SKM_sk_shift(X509_POLICY_DATA, (st)) +# define sk_X509_POLICY_DATA_pop(st) SKM_sk_pop(X509_POLICY_DATA, (st)) +# define sk_X509_POLICY_DATA_sort(st) SKM_sk_sort(X509_POLICY_DATA, (st)) +# define sk_X509_POLICY_DATA_is_sorted(st) SKM_sk_is_sorted(X509_POLICY_DATA, (st)) +# define sk_X509_POLICY_NODE_new(cmp) SKM_sk_new(X509_POLICY_NODE, (cmp)) +# define sk_X509_POLICY_NODE_new_null() SKM_sk_new_null(X509_POLICY_NODE) +# define sk_X509_POLICY_NODE_free(st) SKM_sk_free(X509_POLICY_NODE, (st)) +# define sk_X509_POLICY_NODE_num(st) SKM_sk_num(X509_POLICY_NODE, (st)) +# define sk_X509_POLICY_NODE_value(st, i) SKM_sk_value(X509_POLICY_NODE, (st), (i)) +# define sk_X509_POLICY_NODE_set(st, i, val) SKM_sk_set(X509_POLICY_NODE, (st), (i), (val)) +# define sk_X509_POLICY_NODE_zero(st) SKM_sk_zero(X509_POLICY_NODE, (st)) +# define sk_X509_POLICY_NODE_push(st, val) SKM_sk_push(X509_POLICY_NODE, (st), (val)) +# define sk_X509_POLICY_NODE_unshift(st, val) SKM_sk_unshift(X509_POLICY_NODE, (st), (val)) +# define sk_X509_POLICY_NODE_find(st, val) SKM_sk_find(X509_POLICY_NODE, (st), (val)) +# define sk_X509_POLICY_NODE_find_ex(st, val) SKM_sk_find_ex(X509_POLICY_NODE, (st), (val)) +# define sk_X509_POLICY_NODE_delete(st, i) SKM_sk_delete(X509_POLICY_NODE, (st), (i)) +# define sk_X509_POLICY_NODE_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_POLICY_NODE, (st), (ptr)) +# define sk_X509_POLICY_NODE_insert(st, val, i) SKM_sk_insert(X509_POLICY_NODE, (st), (val), (i)) +# define sk_X509_POLICY_NODE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_POLICY_NODE, (st), (cmp)) +# define sk_X509_POLICY_NODE_dup(st) SKM_sk_dup(X509_POLICY_NODE, st) +# define sk_X509_POLICY_NODE_pop_free(st, free_func) SKM_sk_pop_free(X509_POLICY_NODE, (st), (free_func)) +# define sk_X509_POLICY_NODE_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(X509_POLICY_NODE, (st), (copy_func), (free_func)) +# define sk_X509_POLICY_NODE_shift(st) SKM_sk_shift(X509_POLICY_NODE, (st)) +# define sk_X509_POLICY_NODE_pop(st) SKM_sk_pop(X509_POLICY_NODE, (st)) +# define sk_X509_POLICY_NODE_sort(st) SKM_sk_sort(X509_POLICY_NODE, (st)) +# define sk_X509_POLICY_NODE_is_sorted(st) SKM_sk_is_sorted(X509_POLICY_NODE, (st)) +# define sk_X509_PURPOSE_new(cmp) SKM_sk_new(X509_PURPOSE, (cmp)) +# define sk_X509_PURPOSE_new_null() SKM_sk_new_null(X509_PURPOSE) +# define sk_X509_PURPOSE_free(st) SKM_sk_free(X509_PURPOSE, (st)) +# define sk_X509_PURPOSE_num(st) SKM_sk_num(X509_PURPOSE, (st)) +# define sk_X509_PURPOSE_value(st, i) SKM_sk_value(X509_PURPOSE, (st), (i)) +# define sk_X509_PURPOSE_set(st, i, val) SKM_sk_set(X509_PURPOSE, (st), (i), (val)) +# define sk_X509_PURPOSE_zero(st) SKM_sk_zero(X509_PURPOSE, (st)) +# define sk_X509_PURPOSE_push(st, val) SKM_sk_push(X509_PURPOSE, (st), (val)) +# define sk_X509_PURPOSE_unshift(st, val) SKM_sk_unshift(X509_PURPOSE, (st), (val)) +# define sk_X509_PURPOSE_find(st, val) SKM_sk_find(X509_PURPOSE, (st), (val)) +# define sk_X509_PURPOSE_find_ex(st, val) SKM_sk_find_ex(X509_PURPOSE, (st), (val)) +# define sk_X509_PURPOSE_delete(st, i) SKM_sk_delete(X509_PURPOSE, (st), (i)) +# define sk_X509_PURPOSE_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_PURPOSE, (st), (ptr)) +# define sk_X509_PURPOSE_insert(st, val, i) SKM_sk_insert(X509_PURPOSE, (st), (val), (i)) +# define sk_X509_PURPOSE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_PURPOSE, (st), (cmp)) +# define sk_X509_PURPOSE_dup(st) SKM_sk_dup(X509_PURPOSE, st) +# define sk_X509_PURPOSE_pop_free(st, free_func) SKM_sk_pop_free(X509_PURPOSE, (st), (free_func)) +# define sk_X509_PURPOSE_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(X509_PURPOSE, (st), (copy_func), (free_func)) +# define sk_X509_PURPOSE_shift(st) SKM_sk_shift(X509_PURPOSE, (st)) +# define sk_X509_PURPOSE_pop(st) SKM_sk_pop(X509_PURPOSE, (st)) +# define sk_X509_PURPOSE_sort(st) SKM_sk_sort(X509_PURPOSE, (st)) +# define sk_X509_PURPOSE_is_sorted(st) SKM_sk_is_sorted(X509_PURPOSE, (st)) +# define sk_X509_REVOKED_new(cmp) SKM_sk_new(X509_REVOKED, (cmp)) +# define sk_X509_REVOKED_new_null() SKM_sk_new_null(X509_REVOKED) +# define sk_X509_REVOKED_free(st) SKM_sk_free(X509_REVOKED, (st)) +# define sk_X509_REVOKED_num(st) SKM_sk_num(X509_REVOKED, (st)) +# define sk_X509_REVOKED_value(st, i) SKM_sk_value(X509_REVOKED, (st), (i)) +# define sk_X509_REVOKED_set(st, i, val) SKM_sk_set(X509_REVOKED, (st), (i), (val)) +# define sk_X509_REVOKED_zero(st) SKM_sk_zero(X509_REVOKED, (st)) +# define sk_X509_REVOKED_push(st, val) SKM_sk_push(X509_REVOKED, (st), (val)) +# define sk_X509_REVOKED_unshift(st, val) SKM_sk_unshift(X509_REVOKED, (st), (val)) +# define sk_X509_REVOKED_find(st, val) SKM_sk_find(X509_REVOKED, (st), (val)) +# define sk_X509_REVOKED_find_ex(st, val) SKM_sk_find_ex(X509_REVOKED, (st), (val)) +# define sk_X509_REVOKED_delete(st, i) SKM_sk_delete(X509_REVOKED, (st), (i)) +# define sk_X509_REVOKED_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_REVOKED, (st), (ptr)) +# define sk_X509_REVOKED_insert(st, val, i) SKM_sk_insert(X509_REVOKED, (st), (val), (i)) +# define sk_X509_REVOKED_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_REVOKED, (st), (cmp)) +# define sk_X509_REVOKED_dup(st) SKM_sk_dup(X509_REVOKED, st) +# define sk_X509_REVOKED_pop_free(st, free_func) SKM_sk_pop_free(X509_REVOKED, (st), (free_func)) +# define sk_X509_REVOKED_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(X509_REVOKED, (st), (copy_func), (free_func)) +# define sk_X509_REVOKED_shift(st) SKM_sk_shift(X509_REVOKED, (st)) +# define sk_X509_REVOKED_pop(st) SKM_sk_pop(X509_REVOKED, (st)) +# define sk_X509_REVOKED_sort(st) SKM_sk_sort(X509_REVOKED, (st)) +# define sk_X509_REVOKED_is_sorted(st) SKM_sk_is_sorted(X509_REVOKED, (st)) +# define sk_X509_TRUST_new(cmp) SKM_sk_new(X509_TRUST, (cmp)) +# define sk_X509_TRUST_new_null() SKM_sk_new_null(X509_TRUST) +# define sk_X509_TRUST_free(st) SKM_sk_free(X509_TRUST, (st)) +# define sk_X509_TRUST_num(st) SKM_sk_num(X509_TRUST, (st)) +# define sk_X509_TRUST_value(st, i) SKM_sk_value(X509_TRUST, (st), (i)) +# define sk_X509_TRUST_set(st, i, val) SKM_sk_set(X509_TRUST, (st), (i), (val)) +# define sk_X509_TRUST_zero(st) SKM_sk_zero(X509_TRUST, (st)) +# define sk_X509_TRUST_push(st, val) SKM_sk_push(X509_TRUST, (st), (val)) +# define sk_X509_TRUST_unshift(st, val) SKM_sk_unshift(X509_TRUST, (st), (val)) +# define sk_X509_TRUST_find(st, val) SKM_sk_find(X509_TRUST, (st), (val)) +# define sk_X509_TRUST_find_ex(st, val) SKM_sk_find_ex(X509_TRUST, (st), (val)) +# define sk_X509_TRUST_delete(st, i) SKM_sk_delete(X509_TRUST, (st), (i)) +# define sk_X509_TRUST_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_TRUST, (st), (ptr)) +# define sk_X509_TRUST_insert(st, val, i) SKM_sk_insert(X509_TRUST, (st), (val), (i)) +# define sk_X509_TRUST_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_TRUST, (st), (cmp)) +# define sk_X509_TRUST_dup(st) SKM_sk_dup(X509_TRUST, st) +# define sk_X509_TRUST_pop_free(st, free_func) SKM_sk_pop_free(X509_TRUST, (st), (free_func)) +# define sk_X509_TRUST_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(X509_TRUST, (st), (copy_func), (free_func)) +# define sk_X509_TRUST_shift(st) SKM_sk_shift(X509_TRUST, (st)) +# define sk_X509_TRUST_pop(st) SKM_sk_pop(X509_TRUST, (st)) +# define sk_X509_TRUST_sort(st) SKM_sk_sort(X509_TRUST, (st)) +# define sk_X509_TRUST_is_sorted(st) SKM_sk_is_sorted(X509_TRUST, (st)) +# define sk_X509_VERIFY_PARAM_new(cmp) SKM_sk_new(X509_VERIFY_PARAM, (cmp)) +# define sk_X509_VERIFY_PARAM_new_null() SKM_sk_new_null(X509_VERIFY_PARAM) +# define sk_X509_VERIFY_PARAM_free(st) SKM_sk_free(X509_VERIFY_PARAM, (st)) +# define sk_X509_VERIFY_PARAM_num(st) SKM_sk_num(X509_VERIFY_PARAM, (st)) +# define sk_X509_VERIFY_PARAM_value(st, i) SKM_sk_value(X509_VERIFY_PARAM, (st), (i)) +# define sk_X509_VERIFY_PARAM_set(st, i, val) SKM_sk_set(X509_VERIFY_PARAM, (st), (i), (val)) +# define sk_X509_VERIFY_PARAM_zero(st) SKM_sk_zero(X509_VERIFY_PARAM, (st)) +# define sk_X509_VERIFY_PARAM_push(st, val) SKM_sk_push(X509_VERIFY_PARAM, (st), (val)) +# define sk_X509_VERIFY_PARAM_unshift(st, val) SKM_sk_unshift(X509_VERIFY_PARAM, (st), (val)) +# define sk_X509_VERIFY_PARAM_find(st, val) SKM_sk_find(X509_VERIFY_PARAM, (st), (val)) +# define sk_X509_VERIFY_PARAM_find_ex(st, val) SKM_sk_find_ex(X509_VERIFY_PARAM, (st), (val)) +# define sk_X509_VERIFY_PARAM_delete(st, i) SKM_sk_delete(X509_VERIFY_PARAM, (st), (i)) +# define sk_X509_VERIFY_PARAM_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_VERIFY_PARAM, (st), (ptr)) +# define sk_X509_VERIFY_PARAM_insert(st, val, i) SKM_sk_insert(X509_VERIFY_PARAM, (st), (val), (i)) +# define sk_X509_VERIFY_PARAM_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_VERIFY_PARAM, (st), (cmp)) +# define sk_X509_VERIFY_PARAM_dup(st) SKM_sk_dup(X509_VERIFY_PARAM, st) +# define sk_X509_VERIFY_PARAM_pop_free(st, free_func) SKM_sk_pop_free(X509_VERIFY_PARAM, (st), (free_func)) +# define sk_X509_VERIFY_PARAM_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(X509_VERIFY_PARAM, (st), (copy_func), (free_func)) +# define sk_X509_VERIFY_PARAM_shift(st) SKM_sk_shift(X509_VERIFY_PARAM, (st)) +# define sk_X509_VERIFY_PARAM_pop(st) SKM_sk_pop(X509_VERIFY_PARAM, (st)) +# define sk_X509_VERIFY_PARAM_sort(st) SKM_sk_sort(X509_VERIFY_PARAM, (st)) +# define sk_X509_VERIFY_PARAM_is_sorted(st) SKM_sk_is_sorted(X509_VERIFY_PARAM, (st)) +# define sk_nid_triple_new(cmp) SKM_sk_new(nid_triple, (cmp)) +# define sk_nid_triple_new_null() SKM_sk_new_null(nid_triple) +# define sk_nid_triple_free(st) SKM_sk_free(nid_triple, (st)) +# define sk_nid_triple_num(st) SKM_sk_num(nid_triple, (st)) +# define sk_nid_triple_value(st, i) SKM_sk_value(nid_triple, (st), (i)) +# define sk_nid_triple_set(st, i, val) SKM_sk_set(nid_triple, (st), (i), (val)) +# define sk_nid_triple_zero(st) SKM_sk_zero(nid_triple, (st)) +# define sk_nid_triple_push(st, val) SKM_sk_push(nid_triple, (st), (val)) +# define sk_nid_triple_unshift(st, val) SKM_sk_unshift(nid_triple, (st), (val)) +# define sk_nid_triple_find(st, val) SKM_sk_find(nid_triple, (st), (val)) +# define sk_nid_triple_find_ex(st, val) SKM_sk_find_ex(nid_triple, (st), (val)) +# define sk_nid_triple_delete(st, i) SKM_sk_delete(nid_triple, (st), (i)) +# define sk_nid_triple_delete_ptr(st, ptr) SKM_sk_delete_ptr(nid_triple, (st), (ptr)) +# define sk_nid_triple_insert(st, val, i) SKM_sk_insert(nid_triple, (st), (val), (i)) +# define sk_nid_triple_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(nid_triple, (st), (cmp)) +# define sk_nid_triple_dup(st) SKM_sk_dup(nid_triple, st) +# define sk_nid_triple_pop_free(st, free_func) SKM_sk_pop_free(nid_triple, (st), (free_func)) +# define sk_nid_triple_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(nid_triple, (st), (copy_func), (free_func)) +# define sk_nid_triple_shift(st) SKM_sk_shift(nid_triple, (st)) +# define sk_nid_triple_pop(st) SKM_sk_pop(nid_triple, (st)) +# define sk_nid_triple_sort(st) SKM_sk_sort(nid_triple, (st)) +# define sk_nid_triple_is_sorted(st) SKM_sk_is_sorted(nid_triple, (st)) +# define sk_void_new(cmp) SKM_sk_new(void, (cmp)) +# define sk_void_new_null() SKM_sk_new_null(void) +# define sk_void_free(st) SKM_sk_free(void, (st)) +# define sk_void_num(st) SKM_sk_num(void, (st)) +# define sk_void_value(st, i) SKM_sk_value(void, (st), (i)) +# define sk_void_set(st, i, val) SKM_sk_set(void, (st), (i), (val)) +# define sk_void_zero(st) SKM_sk_zero(void, (st)) +# define sk_void_push(st, val) SKM_sk_push(void, (st), (val)) +# define sk_void_unshift(st, val) SKM_sk_unshift(void, (st), (val)) +# define sk_void_find(st, val) SKM_sk_find(void, (st), (val)) +# define sk_void_find_ex(st, val) SKM_sk_find_ex(void, (st), (val)) +# define sk_void_delete(st, i) SKM_sk_delete(void, (st), (i)) +# define sk_void_delete_ptr(st, ptr) SKM_sk_delete_ptr(void, (st), (ptr)) +# define sk_void_insert(st, val, i) SKM_sk_insert(void, (st), (val), (i)) +# define sk_void_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(void, (st), (cmp)) +# define sk_void_dup(st) SKM_sk_dup(void, st) +# define sk_void_pop_free(st, free_func) SKM_sk_pop_free(void, (st), (free_func)) +# define sk_void_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy(void, (st), (copy_func), (free_func)) +# define sk_void_shift(st) SKM_sk_shift(void, (st)) +# define sk_void_pop(st) SKM_sk_pop(void, (st)) +# define sk_void_sort(st) SKM_sk_sort(void, (st)) +# define sk_void_is_sorted(st) SKM_sk_is_sorted(void, (st)) +# define sk_OPENSSL_STRING_new(cmp) ((STACK_OF(OPENSSL_STRING) *)sk_new(CHECKED_SK_CMP_FUNC(char, cmp))) +# define sk_OPENSSL_STRING_new_null() ((STACK_OF(OPENSSL_STRING) *)sk_new_null()) +# define sk_OPENSSL_STRING_push(st, val) sk_push(CHECKED_STACK_OF(OPENSSL_STRING, st), CHECKED_PTR_OF(char, val)) +# define sk_OPENSSL_STRING_find(st, val) sk_find(CHECKED_STACK_OF(OPENSSL_STRING, st), CHECKED_PTR_OF(char, val)) +# define sk_OPENSSL_STRING_value(st, i) ((OPENSSL_STRING)sk_value(CHECKED_STACK_OF(OPENSSL_STRING, st), i)) +# define sk_OPENSSL_STRING_num(st) SKM_sk_num(OPENSSL_STRING, st) +# define sk_OPENSSL_STRING_pop_free(st, free_func) sk_pop_free(CHECKED_STACK_OF(OPENSSL_STRING, st), CHECKED_SK_FREE_FUNC(char, free_func)) +# define sk_OPENSSL_STRING_deep_copy(st, copy_func, free_func) ((STACK_OF(OPENSSL_STRING) *)sk_deep_copy(CHECKED_STACK_OF(OPENSSL_STRING, st), CHECKED_SK_COPY_FUNC(char, copy_func), CHECKED_SK_FREE_FUNC(char, free_func))) +# define sk_OPENSSL_STRING_insert(st, val, i) sk_insert(CHECKED_STACK_OF(OPENSSL_STRING, st), CHECKED_PTR_OF(char, val), i) +# define sk_OPENSSL_STRING_free(st) SKM_sk_free(OPENSSL_STRING, st) +# define sk_OPENSSL_STRING_set(st, i, val) sk_set(CHECKED_STACK_OF(OPENSSL_STRING, st), i, CHECKED_PTR_OF(char, val)) +# define sk_OPENSSL_STRING_zero(st) SKM_sk_zero(OPENSSL_STRING, (st)) +# define sk_OPENSSL_STRING_unshift(st, val) sk_unshift(CHECKED_STACK_OF(OPENSSL_STRING, st), CHECKED_PTR_OF(char, val)) +# define sk_OPENSSL_STRING_find_ex(st, val) sk_find_ex((_STACK *)CHECKED_CONST_PTR_OF(STACK_OF(OPENSSL_STRING), st), CHECKED_CONST_PTR_OF(char, val)) +# define sk_OPENSSL_STRING_delete(st, i) SKM_sk_delete(OPENSSL_STRING, (st), (i)) +# define sk_OPENSSL_STRING_delete_ptr(st, ptr) (OPENSSL_STRING *)sk_delete_ptr(CHECKED_STACK_OF(OPENSSL_STRING, st), CHECKED_PTR_OF(char, ptr)) +# define sk_OPENSSL_STRING_set_cmp_func(st, cmp) \ + ((int (*)(const char * const *,const char * const *)) \ + sk_set_cmp_func(CHECKED_STACK_OF(OPENSSL_STRING, st), CHECKED_SK_CMP_FUNC(char, cmp))) +# define sk_OPENSSL_STRING_dup(st) SKM_sk_dup(OPENSSL_STRING, st) +# define sk_OPENSSL_STRING_shift(st) SKM_sk_shift(OPENSSL_STRING, (st)) +# define sk_OPENSSL_STRING_pop(st) (char *)sk_pop(CHECKED_STACK_OF(OPENSSL_STRING, st)) +# define sk_OPENSSL_STRING_sort(st) SKM_sk_sort(OPENSSL_STRING, (st)) +# define sk_OPENSSL_STRING_is_sorted(st) SKM_sk_is_sorted(OPENSSL_STRING, (st)) +# define sk_OPENSSL_BLOCK_new(cmp) ((STACK_OF(OPENSSL_BLOCK) *)sk_new(CHECKED_SK_CMP_FUNC(void, cmp))) +# define sk_OPENSSL_BLOCK_new_null() ((STACK_OF(OPENSSL_BLOCK) *)sk_new_null()) +# define sk_OPENSSL_BLOCK_push(st, val) sk_push(CHECKED_STACK_OF(OPENSSL_BLOCK, st), CHECKED_PTR_OF(void, val)) +# define sk_OPENSSL_BLOCK_find(st, val) sk_find(CHECKED_STACK_OF(OPENSSL_BLOCK, st), CHECKED_PTR_OF(void, val)) +# define sk_OPENSSL_BLOCK_value(st, i) ((OPENSSL_BLOCK)sk_value(CHECKED_STACK_OF(OPENSSL_BLOCK, st), i)) +# define sk_OPENSSL_BLOCK_num(st) SKM_sk_num(OPENSSL_BLOCK, st) +# define sk_OPENSSL_BLOCK_pop_free(st, free_func) sk_pop_free(CHECKED_STACK_OF(OPENSSL_BLOCK, st), CHECKED_SK_FREE_FUNC(void, free_func)) +# define sk_OPENSSL_BLOCK_deep_copy(st, copy_func, free_func) ((STACK_OF(OPENSSL_BLOCK) *)sk_deep_copy(CHECKED_STACK_OF(OPENSSL_BLOCK, st), CHECKED_SK_COPY_FUNC(void, copy_func), CHECKED_SK_FREE_FUNC(void, free_func))) +# define sk_OPENSSL_BLOCK_insert(st, val, i) sk_insert(CHECKED_STACK_OF(OPENSSL_BLOCK, st), CHECKED_PTR_OF(void, val), i) +# define sk_OPENSSL_BLOCK_free(st) SKM_sk_free(OPENSSL_BLOCK, st) +# define sk_OPENSSL_BLOCK_set(st, i, val) sk_set(CHECKED_STACK_OF(OPENSSL_BLOCK, st), i, CHECKED_PTR_OF(void, val)) +# define sk_OPENSSL_BLOCK_zero(st) SKM_sk_zero(OPENSSL_BLOCK, (st)) +# define sk_OPENSSL_BLOCK_unshift(st, val) sk_unshift(CHECKED_STACK_OF(OPENSSL_BLOCK, st), CHECKED_PTR_OF(void, val)) +# define sk_OPENSSL_BLOCK_find_ex(st, val) sk_find_ex((_STACK *)CHECKED_CONST_PTR_OF(STACK_OF(OPENSSL_BLOCK), st), CHECKED_CONST_PTR_OF(void, val)) +# define sk_OPENSSL_BLOCK_delete(st, i) SKM_sk_delete(OPENSSL_BLOCK, (st), (i)) +# define sk_OPENSSL_BLOCK_delete_ptr(st, ptr) (OPENSSL_BLOCK *)sk_delete_ptr(CHECKED_STACK_OF(OPENSSL_BLOCK, st), CHECKED_PTR_OF(void, ptr)) +# define sk_OPENSSL_BLOCK_set_cmp_func(st, cmp) \ + ((int (*)(const void * const *,const void * const *)) \ + sk_set_cmp_func(CHECKED_STACK_OF(OPENSSL_BLOCK, st), CHECKED_SK_CMP_FUNC(void, cmp))) +# define sk_OPENSSL_BLOCK_dup(st) SKM_sk_dup(OPENSSL_BLOCK, st) +# define sk_OPENSSL_BLOCK_shift(st) SKM_sk_shift(OPENSSL_BLOCK, (st)) +# define sk_OPENSSL_BLOCK_pop(st) (void *)sk_pop(CHECKED_STACK_OF(OPENSSL_BLOCK, st)) +# define sk_OPENSSL_BLOCK_sort(st) SKM_sk_sort(OPENSSL_BLOCK, (st)) +# define sk_OPENSSL_BLOCK_is_sorted(st) SKM_sk_is_sorted(OPENSSL_BLOCK, (st)) +# define sk_OPENSSL_PSTRING_new(cmp) ((STACK_OF(OPENSSL_PSTRING) *)sk_new(CHECKED_SK_CMP_FUNC(OPENSSL_STRING, cmp))) +# define sk_OPENSSL_PSTRING_new_null() ((STACK_OF(OPENSSL_PSTRING) *)sk_new_null()) +# define sk_OPENSSL_PSTRING_push(st, val) sk_push(CHECKED_STACK_OF(OPENSSL_PSTRING, st), CHECKED_PTR_OF(OPENSSL_STRING, val)) +# define sk_OPENSSL_PSTRING_find(st, val) sk_find(CHECKED_STACK_OF(OPENSSL_PSTRING, st), CHECKED_PTR_OF(OPENSSL_STRING, val)) +# define sk_OPENSSL_PSTRING_value(st, i) ((OPENSSL_PSTRING)sk_value(CHECKED_STACK_OF(OPENSSL_PSTRING, st), i)) +# define sk_OPENSSL_PSTRING_num(st) SKM_sk_num(OPENSSL_PSTRING, st) +# define sk_OPENSSL_PSTRING_pop_free(st, free_func) sk_pop_free(CHECKED_STACK_OF(OPENSSL_PSTRING, st), CHECKED_SK_FREE_FUNC(OPENSSL_STRING, free_func)) +# define sk_OPENSSL_PSTRING_deep_copy(st, copy_func, free_func) ((STACK_OF(OPENSSL_PSTRING) *)sk_deep_copy(CHECKED_STACK_OF(OPENSSL_PSTRING, st), CHECKED_SK_COPY_FUNC(OPENSSL_STRING, copy_func), CHECKED_SK_FREE_FUNC(OPENSSL_STRING, free_func))) +# define sk_OPENSSL_PSTRING_insert(st, val, i) sk_insert(CHECKED_STACK_OF(OPENSSL_PSTRING, st), CHECKED_PTR_OF(OPENSSL_STRING, val), i) +# define sk_OPENSSL_PSTRING_free(st) SKM_sk_free(OPENSSL_PSTRING, st) +# define sk_OPENSSL_PSTRING_set(st, i, val) sk_set(CHECKED_STACK_OF(OPENSSL_PSTRING, st), i, CHECKED_PTR_OF(OPENSSL_STRING, val)) +# define sk_OPENSSL_PSTRING_zero(st) SKM_sk_zero(OPENSSL_PSTRING, (st)) +# define sk_OPENSSL_PSTRING_unshift(st, val) sk_unshift(CHECKED_STACK_OF(OPENSSL_PSTRING, st), CHECKED_PTR_OF(OPENSSL_STRING, val)) +# define sk_OPENSSL_PSTRING_find_ex(st, val) sk_find_ex((_STACK *)CHECKED_CONST_PTR_OF(STACK_OF(OPENSSL_PSTRING), st), CHECKED_CONST_PTR_OF(OPENSSL_STRING, val)) +# define sk_OPENSSL_PSTRING_delete(st, i) SKM_sk_delete(OPENSSL_PSTRING, (st), (i)) +# define sk_OPENSSL_PSTRING_delete_ptr(st, ptr) (OPENSSL_PSTRING *)sk_delete_ptr(CHECKED_STACK_OF(OPENSSL_PSTRING, st), CHECKED_PTR_OF(OPENSSL_STRING, ptr)) +# define sk_OPENSSL_PSTRING_set_cmp_func(st, cmp) \ + ((int (*)(const OPENSSL_STRING * const *,const OPENSSL_STRING * const *)) \ + sk_set_cmp_func(CHECKED_STACK_OF(OPENSSL_PSTRING, st), CHECKED_SK_CMP_FUNC(OPENSSL_STRING, cmp))) +# define sk_OPENSSL_PSTRING_dup(st) SKM_sk_dup(OPENSSL_PSTRING, st) +# define sk_OPENSSL_PSTRING_shift(st) SKM_sk_shift(OPENSSL_PSTRING, (st)) +# define sk_OPENSSL_PSTRING_pop(st) (OPENSSL_STRING *)sk_pop(CHECKED_STACK_OF(OPENSSL_PSTRING, st)) +# define sk_OPENSSL_PSTRING_sort(st) SKM_sk_sort(OPENSSL_PSTRING, (st)) +# define sk_OPENSSL_PSTRING_is_sorted(st) SKM_sk_is_sorted(OPENSSL_PSTRING, (st)) +# define d2i_ASN1_SET_OF_ACCESS_DESCRIPTION(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(ACCESS_DESCRIPTION, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_ACCESS_DESCRIPTION(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(ACCESS_DESCRIPTION, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_ACCESS_DESCRIPTION(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(ACCESS_DESCRIPTION, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_ACCESS_DESCRIPTION(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(ACCESS_DESCRIPTION, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_ASN1_INTEGER(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(ASN1_INTEGER, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_ASN1_INTEGER(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(ASN1_INTEGER, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_ASN1_INTEGER(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(ASN1_INTEGER, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_ASN1_INTEGER(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(ASN1_INTEGER, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_ASN1_OBJECT(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(ASN1_OBJECT, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_ASN1_OBJECT(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(ASN1_OBJECT, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_ASN1_OBJECT(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(ASN1_OBJECT, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_ASN1_OBJECT(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(ASN1_OBJECT, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_ASN1_TYPE(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(ASN1_TYPE, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_ASN1_TYPE(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(ASN1_TYPE, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_ASN1_TYPE(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(ASN1_TYPE, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_ASN1_TYPE(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(ASN1_TYPE, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_ASN1_UTF8STRING(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(ASN1_UTF8STRING, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_ASN1_UTF8STRING(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(ASN1_UTF8STRING, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_ASN1_UTF8STRING(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(ASN1_UTF8STRING, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_ASN1_UTF8STRING(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(ASN1_UTF8STRING, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_DIST_POINT(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(DIST_POINT, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_DIST_POINT(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(DIST_POINT, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_DIST_POINT(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(DIST_POINT, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_DIST_POINT(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(DIST_POINT, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_ESS_CERT_ID(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(ESS_CERT_ID, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_ESS_CERT_ID(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(ESS_CERT_ID, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_ESS_CERT_ID(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(ESS_CERT_ID, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_ESS_CERT_ID(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(ESS_CERT_ID, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_EVP_MD(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(EVP_MD, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_EVP_MD(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(EVP_MD, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_EVP_MD(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(EVP_MD, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_EVP_MD(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(EVP_MD, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_GENERAL_NAME(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(GENERAL_NAME, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_GENERAL_NAME(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(GENERAL_NAME, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_GENERAL_NAME(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(GENERAL_NAME, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_GENERAL_NAME(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(GENERAL_NAME, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_OCSP_ONEREQ(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(OCSP_ONEREQ, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_OCSP_ONEREQ(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(OCSP_ONEREQ, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_OCSP_ONEREQ(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(OCSP_ONEREQ, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_OCSP_ONEREQ(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(OCSP_ONEREQ, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_OCSP_SINGLERESP(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(OCSP_SINGLERESP, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_OCSP_SINGLERESP(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(OCSP_SINGLERESP, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_OCSP_SINGLERESP(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(OCSP_SINGLERESP, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_OCSP_SINGLERESP(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(OCSP_SINGLERESP, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_PKCS12_SAFEBAG(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(PKCS12_SAFEBAG, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_PKCS12_SAFEBAG(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(PKCS12_SAFEBAG, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_PKCS12_SAFEBAG(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(PKCS12_SAFEBAG, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_PKCS12_SAFEBAG(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(PKCS12_SAFEBAG, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_PKCS7(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(PKCS7, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_PKCS7(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(PKCS7, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_PKCS7(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(PKCS7, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_PKCS7(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(PKCS7, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_PKCS7_RECIP_INFO(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(PKCS7_RECIP_INFO, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_PKCS7_RECIP_INFO(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(PKCS7_RECIP_INFO, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_PKCS7_RECIP_INFO(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(PKCS7_RECIP_INFO, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_PKCS7_RECIP_INFO(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(PKCS7_RECIP_INFO, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_PKCS7_SIGNER_INFO(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(PKCS7_SIGNER_INFO, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_PKCS7_SIGNER_INFO(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(PKCS7_SIGNER_INFO, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_PKCS7_SIGNER_INFO(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(PKCS7_SIGNER_INFO, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_PKCS7_SIGNER_INFO(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(PKCS7_SIGNER_INFO, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_POLICYINFO(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(POLICYINFO, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_POLICYINFO(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(POLICYINFO, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_POLICYINFO(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(POLICYINFO, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_POLICYINFO(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(POLICYINFO, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_POLICYQUALINFO(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(POLICYQUALINFO, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_POLICYQUALINFO(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(POLICYQUALINFO, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_POLICYQUALINFO(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(POLICYQUALINFO, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_POLICYQUALINFO(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(POLICYQUALINFO, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_SXNETID(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(SXNETID, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_SXNETID(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(SXNETID, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_SXNETID(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(SXNETID, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_SXNETID(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(SXNETID, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_X509(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(X509, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_X509(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(X509, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_X509(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(X509, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_X509(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(X509, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_X509_ALGOR(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(X509_ALGOR, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_X509_ALGOR(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(X509_ALGOR, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_X509_ALGOR(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(X509_ALGOR, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_X509_ALGOR(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(X509_ALGOR, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_X509_ATTRIBUTE(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(X509_ATTRIBUTE, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_X509_ATTRIBUTE(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(X509_ATTRIBUTE, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_X509_ATTRIBUTE(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(X509_ATTRIBUTE, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_X509_ATTRIBUTE(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(X509_ATTRIBUTE, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_X509_CRL(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(X509_CRL, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_X509_CRL(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(X509_CRL, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_X509_CRL(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(X509_CRL, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_X509_CRL(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(X509_CRL, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_X509_EXTENSION(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(X509_EXTENSION, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_X509_EXTENSION(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(X509_EXTENSION, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_X509_EXTENSION(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(X509_EXTENSION, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_X509_EXTENSION(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(X509_EXTENSION, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_X509_NAME_ENTRY(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(X509_NAME_ENTRY, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_X509_NAME_ENTRY(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(X509_NAME_ENTRY, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_X509_NAME_ENTRY(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(X509_NAME_ENTRY, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_X509_NAME_ENTRY(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(X509_NAME_ENTRY, (buf), (len), (d2i_func), (free_func)) +# define d2i_ASN1_SET_OF_X509_REVOKED(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(X509_REVOKED, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +# define i2d_ASN1_SET_OF_X509_REVOKED(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(X509_REVOKED, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +# define ASN1_seq_pack_X509_REVOKED(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(X509_REVOKED, (st), (i2d_func), (buf), (len)) +# define ASN1_seq_unpack_X509_REVOKED(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(X509_REVOKED, (buf), (len), (d2i_func), (free_func)) +# define PKCS12_decrypt_d2i_PKCS12_SAFEBAG(algor, d2i_func, free_func, pass, passlen, oct, seq) \ + SKM_PKCS12_decrypt_d2i(PKCS12_SAFEBAG, (algor), (d2i_func), (free_func), (pass), (passlen), (oct), (seq)) +# define PKCS12_decrypt_d2i_PKCS7(algor, d2i_func, free_func, pass, passlen, oct, seq) \ + SKM_PKCS12_decrypt_d2i(PKCS7, (algor), (d2i_func), (free_func), (pass), (passlen), (oct), (seq)) +# define lh_ADDED_OBJ_new() LHM_lh_new(ADDED_OBJ,added_obj) +# define lh_ADDED_OBJ_insert(lh,inst) LHM_lh_insert(ADDED_OBJ,lh,inst) +# define lh_ADDED_OBJ_retrieve(lh,inst) LHM_lh_retrieve(ADDED_OBJ,lh,inst) +# define lh_ADDED_OBJ_delete(lh,inst) LHM_lh_delete(ADDED_OBJ,lh,inst) +# define lh_ADDED_OBJ_doall(lh,fn) LHM_lh_doall(ADDED_OBJ,lh,fn) +# define lh_ADDED_OBJ_doall_arg(lh,fn,arg_type,arg) \ + LHM_lh_doall_arg(ADDED_OBJ,lh,fn,arg_type,arg) +# define lh_ADDED_OBJ_error(lh) LHM_lh_error(ADDED_OBJ,lh) +# define lh_ADDED_OBJ_num_items(lh) LHM_lh_num_items(ADDED_OBJ,lh) +# define lh_ADDED_OBJ_down_load(lh) LHM_lh_down_load(ADDED_OBJ,lh) +# define lh_ADDED_OBJ_node_stats_bio(lh,out) \ + LHM_lh_node_stats_bio(ADDED_OBJ,lh,out) +# define lh_ADDED_OBJ_node_usage_stats_bio(lh,out) \ + LHM_lh_node_usage_stats_bio(ADDED_OBJ,lh,out) +# define lh_ADDED_OBJ_stats_bio(lh,out) \ + LHM_lh_stats_bio(ADDED_OBJ,lh,out) +# define lh_ADDED_OBJ_free(lh) LHM_lh_free(ADDED_OBJ,lh) +# define lh_APP_INFO_new() LHM_lh_new(APP_INFO,app_info) +# define lh_APP_INFO_insert(lh,inst) LHM_lh_insert(APP_INFO,lh,inst) +# define lh_APP_INFO_retrieve(lh,inst) LHM_lh_retrieve(APP_INFO,lh,inst) +# define lh_APP_INFO_delete(lh,inst) LHM_lh_delete(APP_INFO,lh,inst) +# define lh_APP_INFO_doall(lh,fn) LHM_lh_doall(APP_INFO,lh,fn) +# define lh_APP_INFO_doall_arg(lh,fn,arg_type,arg) \ + LHM_lh_doall_arg(APP_INFO,lh,fn,arg_type,arg) +# define lh_APP_INFO_error(lh) LHM_lh_error(APP_INFO,lh) +# define lh_APP_INFO_num_items(lh) LHM_lh_num_items(APP_INFO,lh) +# define lh_APP_INFO_down_load(lh) LHM_lh_down_load(APP_INFO,lh) +# define lh_APP_INFO_node_stats_bio(lh,out) \ + LHM_lh_node_stats_bio(APP_INFO,lh,out) +# define lh_APP_INFO_node_usage_stats_bio(lh,out) \ + LHM_lh_node_usage_stats_bio(APP_INFO,lh,out) +# define lh_APP_INFO_stats_bio(lh,out) \ + LHM_lh_stats_bio(APP_INFO,lh,out) +# define lh_APP_INFO_free(lh) LHM_lh_free(APP_INFO,lh) +# define lh_CONF_VALUE_new() LHM_lh_new(CONF_VALUE,conf_value) +# define lh_CONF_VALUE_insert(lh,inst) LHM_lh_insert(CONF_VALUE,lh,inst) +# define lh_CONF_VALUE_retrieve(lh,inst) LHM_lh_retrieve(CONF_VALUE,lh,inst) +# define lh_CONF_VALUE_delete(lh,inst) LHM_lh_delete(CONF_VALUE,lh,inst) +# define lh_CONF_VALUE_doall(lh,fn) LHM_lh_doall(CONF_VALUE,lh,fn) +# define lh_CONF_VALUE_doall_arg(lh,fn,arg_type,arg) \ + LHM_lh_doall_arg(CONF_VALUE,lh,fn,arg_type,arg) +# define lh_CONF_VALUE_error(lh) LHM_lh_error(CONF_VALUE,lh) +# define lh_CONF_VALUE_num_items(lh) LHM_lh_num_items(CONF_VALUE,lh) +# define lh_CONF_VALUE_down_load(lh) LHM_lh_down_load(CONF_VALUE,lh) +# define lh_CONF_VALUE_node_stats_bio(lh,out) \ + LHM_lh_node_stats_bio(CONF_VALUE,lh,out) +# define lh_CONF_VALUE_node_usage_stats_bio(lh,out) \ + LHM_lh_node_usage_stats_bio(CONF_VALUE,lh,out) +# define lh_CONF_VALUE_stats_bio(lh,out) \ + LHM_lh_stats_bio(CONF_VALUE,lh,out) +# define lh_CONF_VALUE_free(lh) LHM_lh_free(CONF_VALUE,lh) +# define lh_ENGINE_PILE_new() LHM_lh_new(ENGINE_PILE,engine_pile) +# define lh_ENGINE_PILE_insert(lh,inst) LHM_lh_insert(ENGINE_PILE,lh,inst) +# define lh_ENGINE_PILE_retrieve(lh,inst) LHM_lh_retrieve(ENGINE_PILE,lh,inst) +# define lh_ENGINE_PILE_delete(lh,inst) LHM_lh_delete(ENGINE_PILE,lh,inst) +# define lh_ENGINE_PILE_doall(lh,fn) LHM_lh_doall(ENGINE_PILE,lh,fn) +# define lh_ENGINE_PILE_doall_arg(lh,fn,arg_type,arg) \ + LHM_lh_doall_arg(ENGINE_PILE,lh,fn,arg_type,arg) +# define lh_ENGINE_PILE_error(lh) LHM_lh_error(ENGINE_PILE,lh) +# define lh_ENGINE_PILE_num_items(lh) LHM_lh_num_items(ENGINE_PILE,lh) +# define lh_ENGINE_PILE_down_load(lh) LHM_lh_down_load(ENGINE_PILE,lh) +# define lh_ENGINE_PILE_node_stats_bio(lh,out) \ + LHM_lh_node_stats_bio(ENGINE_PILE,lh,out) +# define lh_ENGINE_PILE_node_usage_stats_bio(lh,out) \ + LHM_lh_node_usage_stats_bio(ENGINE_PILE,lh,out) +# define lh_ENGINE_PILE_stats_bio(lh,out) \ + LHM_lh_stats_bio(ENGINE_PILE,lh,out) +# define lh_ENGINE_PILE_free(lh) LHM_lh_free(ENGINE_PILE,lh) +# define lh_ERR_STATE_new() LHM_lh_new(ERR_STATE,err_state) +# define lh_ERR_STATE_insert(lh,inst) LHM_lh_insert(ERR_STATE,lh,inst) +# define lh_ERR_STATE_retrieve(lh,inst) LHM_lh_retrieve(ERR_STATE,lh,inst) +# define lh_ERR_STATE_delete(lh,inst) LHM_lh_delete(ERR_STATE,lh,inst) +# define lh_ERR_STATE_doall(lh,fn) LHM_lh_doall(ERR_STATE,lh,fn) +# define lh_ERR_STATE_doall_arg(lh,fn,arg_type,arg) \ + LHM_lh_doall_arg(ERR_STATE,lh,fn,arg_type,arg) +# define lh_ERR_STATE_error(lh) LHM_lh_error(ERR_STATE,lh) +# define lh_ERR_STATE_num_items(lh) LHM_lh_num_items(ERR_STATE,lh) +# define lh_ERR_STATE_down_load(lh) LHM_lh_down_load(ERR_STATE,lh) +# define lh_ERR_STATE_node_stats_bio(lh,out) \ + LHM_lh_node_stats_bio(ERR_STATE,lh,out) +# define lh_ERR_STATE_node_usage_stats_bio(lh,out) \ + LHM_lh_node_usage_stats_bio(ERR_STATE,lh,out) +# define lh_ERR_STATE_stats_bio(lh,out) \ + LHM_lh_stats_bio(ERR_STATE,lh,out) +# define lh_ERR_STATE_free(lh) LHM_lh_free(ERR_STATE,lh) +# define lh_ERR_STRING_DATA_new() LHM_lh_new(ERR_STRING_DATA,err_string_data) +# define lh_ERR_STRING_DATA_insert(lh,inst) LHM_lh_insert(ERR_STRING_DATA,lh,inst) +# define lh_ERR_STRING_DATA_retrieve(lh,inst) LHM_lh_retrieve(ERR_STRING_DATA,lh,inst) +# define lh_ERR_STRING_DATA_delete(lh,inst) LHM_lh_delete(ERR_STRING_DATA,lh,inst) +# define lh_ERR_STRING_DATA_doall(lh,fn) LHM_lh_doall(ERR_STRING_DATA,lh,fn) +# define lh_ERR_STRING_DATA_doall_arg(lh,fn,arg_type,arg) \ + LHM_lh_doall_arg(ERR_STRING_DATA,lh,fn,arg_type,arg) +# define lh_ERR_STRING_DATA_error(lh) LHM_lh_error(ERR_STRING_DATA,lh) +# define lh_ERR_STRING_DATA_num_items(lh) LHM_lh_num_items(ERR_STRING_DATA,lh) +# define lh_ERR_STRING_DATA_down_load(lh) LHM_lh_down_load(ERR_STRING_DATA,lh) +# define lh_ERR_STRING_DATA_node_stats_bio(lh,out) \ + LHM_lh_node_stats_bio(ERR_STRING_DATA,lh,out) +# define lh_ERR_STRING_DATA_node_usage_stats_bio(lh,out) \ + LHM_lh_node_usage_stats_bio(ERR_STRING_DATA,lh,out) +# define lh_ERR_STRING_DATA_stats_bio(lh,out) \ + LHM_lh_stats_bio(ERR_STRING_DATA,lh,out) +# define lh_ERR_STRING_DATA_free(lh) LHM_lh_free(ERR_STRING_DATA,lh) +# define lh_EX_CLASS_ITEM_new() LHM_lh_new(EX_CLASS_ITEM,ex_class_item) +# define lh_EX_CLASS_ITEM_insert(lh,inst) LHM_lh_insert(EX_CLASS_ITEM,lh,inst) +# define lh_EX_CLASS_ITEM_retrieve(lh,inst) LHM_lh_retrieve(EX_CLASS_ITEM,lh,inst) +# define lh_EX_CLASS_ITEM_delete(lh,inst) LHM_lh_delete(EX_CLASS_ITEM,lh,inst) +# define lh_EX_CLASS_ITEM_doall(lh,fn) LHM_lh_doall(EX_CLASS_ITEM,lh,fn) +# define lh_EX_CLASS_ITEM_doall_arg(lh,fn,arg_type,arg) \ + LHM_lh_doall_arg(EX_CLASS_ITEM,lh,fn,arg_type,arg) +# define lh_EX_CLASS_ITEM_error(lh) LHM_lh_error(EX_CLASS_ITEM,lh) +# define lh_EX_CLASS_ITEM_num_items(lh) LHM_lh_num_items(EX_CLASS_ITEM,lh) +# define lh_EX_CLASS_ITEM_down_load(lh) LHM_lh_down_load(EX_CLASS_ITEM,lh) +# define lh_EX_CLASS_ITEM_node_stats_bio(lh,out) \ + LHM_lh_node_stats_bio(EX_CLASS_ITEM,lh,out) +# define lh_EX_CLASS_ITEM_node_usage_stats_bio(lh,out) \ + LHM_lh_node_usage_stats_bio(EX_CLASS_ITEM,lh,out) +# define lh_EX_CLASS_ITEM_stats_bio(lh,out) \ + LHM_lh_stats_bio(EX_CLASS_ITEM,lh,out) +# define lh_EX_CLASS_ITEM_free(lh) LHM_lh_free(EX_CLASS_ITEM,lh) +# define lh_FUNCTION_new() LHM_lh_new(FUNCTION,function) +# define lh_FUNCTION_insert(lh,inst) LHM_lh_insert(FUNCTION,lh,inst) +# define lh_FUNCTION_retrieve(lh,inst) LHM_lh_retrieve(FUNCTION,lh,inst) +# define lh_FUNCTION_delete(lh,inst) LHM_lh_delete(FUNCTION,lh,inst) +# define lh_FUNCTION_doall(lh,fn) LHM_lh_doall(FUNCTION,lh,fn) +# define lh_FUNCTION_doall_arg(lh,fn,arg_type,arg) \ + LHM_lh_doall_arg(FUNCTION,lh,fn,arg_type,arg) +# define lh_FUNCTION_error(lh) LHM_lh_error(FUNCTION,lh) +# define lh_FUNCTION_num_items(lh) LHM_lh_num_items(FUNCTION,lh) +# define lh_FUNCTION_down_load(lh) LHM_lh_down_load(FUNCTION,lh) +# define lh_FUNCTION_node_stats_bio(lh,out) \ + LHM_lh_node_stats_bio(FUNCTION,lh,out) +# define lh_FUNCTION_node_usage_stats_bio(lh,out) \ + LHM_lh_node_usage_stats_bio(FUNCTION,lh,out) +# define lh_FUNCTION_stats_bio(lh,out) \ + LHM_lh_stats_bio(FUNCTION,lh,out) +# define lh_FUNCTION_free(lh) LHM_lh_free(FUNCTION,lh) +# define lh_MEM_new() LHM_lh_new(MEM,mem) +# define lh_MEM_insert(lh,inst) LHM_lh_insert(MEM,lh,inst) +# define lh_MEM_retrieve(lh,inst) LHM_lh_retrieve(MEM,lh,inst) +# define lh_MEM_delete(lh,inst) LHM_lh_delete(MEM,lh,inst) +# define lh_MEM_doall(lh,fn) LHM_lh_doall(MEM,lh,fn) +# define lh_MEM_doall_arg(lh,fn,arg_type,arg) \ + LHM_lh_doall_arg(MEM,lh,fn,arg_type,arg) +# define lh_MEM_error(lh) LHM_lh_error(MEM,lh) +# define lh_MEM_num_items(lh) LHM_lh_num_items(MEM,lh) +# define lh_MEM_down_load(lh) LHM_lh_down_load(MEM,lh) +# define lh_MEM_node_stats_bio(lh,out) \ + LHM_lh_node_stats_bio(MEM,lh,out) +# define lh_MEM_node_usage_stats_bio(lh,out) \ + LHM_lh_node_usage_stats_bio(MEM,lh,out) +# define lh_MEM_stats_bio(lh,out) \ + LHM_lh_stats_bio(MEM,lh,out) +# define lh_MEM_free(lh) LHM_lh_free(MEM,lh) +# define lh_OBJ_NAME_new() LHM_lh_new(OBJ_NAME,obj_name) +# define lh_OBJ_NAME_insert(lh,inst) LHM_lh_insert(OBJ_NAME,lh,inst) +# define lh_OBJ_NAME_retrieve(lh,inst) LHM_lh_retrieve(OBJ_NAME,lh,inst) +# define lh_OBJ_NAME_delete(lh,inst) LHM_lh_delete(OBJ_NAME,lh,inst) +# define lh_OBJ_NAME_doall(lh,fn) LHM_lh_doall(OBJ_NAME,lh,fn) +# define lh_OBJ_NAME_doall_arg(lh,fn,arg_type,arg) \ + LHM_lh_doall_arg(OBJ_NAME,lh,fn,arg_type,arg) +# define lh_OBJ_NAME_error(lh) LHM_lh_error(OBJ_NAME,lh) +# define lh_OBJ_NAME_num_items(lh) LHM_lh_num_items(OBJ_NAME,lh) +# define lh_OBJ_NAME_down_load(lh) LHM_lh_down_load(OBJ_NAME,lh) +# define lh_OBJ_NAME_node_stats_bio(lh,out) \ + LHM_lh_node_stats_bio(OBJ_NAME,lh,out) +# define lh_OBJ_NAME_node_usage_stats_bio(lh,out) \ + LHM_lh_node_usage_stats_bio(OBJ_NAME,lh,out) +# define lh_OBJ_NAME_stats_bio(lh,out) \ + LHM_lh_stats_bio(OBJ_NAME,lh,out) +# define lh_OBJ_NAME_free(lh) LHM_lh_free(OBJ_NAME,lh) +# define lh_OPENSSL_CSTRING_new() LHM_lh_new(OPENSSL_CSTRING,openssl_cstring) +# define lh_OPENSSL_CSTRING_insert(lh,inst) LHM_lh_insert(OPENSSL_CSTRING,lh,inst) +# define lh_OPENSSL_CSTRING_retrieve(lh,inst) LHM_lh_retrieve(OPENSSL_CSTRING,lh,inst) +# define lh_OPENSSL_CSTRING_delete(lh,inst) LHM_lh_delete(OPENSSL_CSTRING,lh,inst) +# define lh_OPENSSL_CSTRING_doall(lh,fn) LHM_lh_doall(OPENSSL_CSTRING,lh,fn) +# define lh_OPENSSL_CSTRING_doall_arg(lh,fn,arg_type,arg) \ + LHM_lh_doall_arg(OPENSSL_CSTRING,lh,fn,arg_type,arg) +# define lh_OPENSSL_CSTRING_error(lh) LHM_lh_error(OPENSSL_CSTRING,lh) +# define lh_OPENSSL_CSTRING_num_items(lh) LHM_lh_num_items(OPENSSL_CSTRING,lh) +# define lh_OPENSSL_CSTRING_down_load(lh) LHM_lh_down_load(OPENSSL_CSTRING,lh) +# define lh_OPENSSL_CSTRING_node_stats_bio(lh,out) \ + LHM_lh_node_stats_bio(OPENSSL_CSTRING,lh,out) +# define lh_OPENSSL_CSTRING_node_usage_stats_bio(lh,out) \ + LHM_lh_node_usage_stats_bio(OPENSSL_CSTRING,lh,out) +# define lh_OPENSSL_CSTRING_stats_bio(lh,out) \ + LHM_lh_stats_bio(OPENSSL_CSTRING,lh,out) +# define lh_OPENSSL_CSTRING_free(lh) LHM_lh_free(OPENSSL_CSTRING,lh) +# define lh_OPENSSL_STRING_new() LHM_lh_new(OPENSSL_STRING,openssl_string) +# define lh_OPENSSL_STRING_insert(lh,inst) LHM_lh_insert(OPENSSL_STRING,lh,inst) +# define lh_OPENSSL_STRING_retrieve(lh,inst) LHM_lh_retrieve(OPENSSL_STRING,lh,inst) +# define lh_OPENSSL_STRING_delete(lh,inst) LHM_lh_delete(OPENSSL_STRING,lh,inst) +# define lh_OPENSSL_STRING_doall(lh,fn) LHM_lh_doall(OPENSSL_STRING,lh,fn) +# define lh_OPENSSL_STRING_doall_arg(lh,fn,arg_type,arg) \ + LHM_lh_doall_arg(OPENSSL_STRING,lh,fn,arg_type,arg) +# define lh_OPENSSL_STRING_error(lh) LHM_lh_error(OPENSSL_STRING,lh) +# define lh_OPENSSL_STRING_num_items(lh) LHM_lh_num_items(OPENSSL_STRING,lh) +# define lh_OPENSSL_STRING_down_load(lh) LHM_lh_down_load(OPENSSL_STRING,lh) +# define lh_OPENSSL_STRING_node_stats_bio(lh,out) \ + LHM_lh_node_stats_bio(OPENSSL_STRING,lh,out) +# define lh_OPENSSL_STRING_node_usage_stats_bio(lh,out) \ + LHM_lh_node_usage_stats_bio(OPENSSL_STRING,lh,out) +# define lh_OPENSSL_STRING_stats_bio(lh,out) \ + LHM_lh_stats_bio(OPENSSL_STRING,lh,out) +# define lh_OPENSSL_STRING_free(lh) LHM_lh_free(OPENSSL_STRING,lh) +# define lh_SSL_SESSION_new() LHM_lh_new(SSL_SESSION,ssl_session) +# define lh_SSL_SESSION_insert(lh,inst) LHM_lh_insert(SSL_SESSION,lh,inst) +# define lh_SSL_SESSION_retrieve(lh,inst) LHM_lh_retrieve(SSL_SESSION,lh,inst) +# define lh_SSL_SESSION_delete(lh,inst) LHM_lh_delete(SSL_SESSION,lh,inst) +# define lh_SSL_SESSION_doall(lh,fn) LHM_lh_doall(SSL_SESSION,lh,fn) +# define lh_SSL_SESSION_doall_arg(lh,fn,arg_type,arg) \ + LHM_lh_doall_arg(SSL_SESSION,lh,fn,arg_type,arg) +# define lh_SSL_SESSION_error(lh) LHM_lh_error(SSL_SESSION,lh) +# define lh_SSL_SESSION_num_items(lh) LHM_lh_num_items(SSL_SESSION,lh) +# define lh_SSL_SESSION_down_load(lh) LHM_lh_down_load(SSL_SESSION,lh) +# define lh_SSL_SESSION_node_stats_bio(lh,out) \ + LHM_lh_node_stats_bio(SSL_SESSION,lh,out) +# define lh_SSL_SESSION_node_usage_stats_bio(lh,out) \ + LHM_lh_node_usage_stats_bio(SSL_SESSION,lh,out) +# define lh_SSL_SESSION_stats_bio(lh,out) \ + LHM_lh_stats_bio(SSL_SESSION,lh,out) +# define lh_SSL_SESSION_free(lh) LHM_lh_free(SSL_SESSION,lh) +#ifdef __cplusplus +} +#endif +#endif /* !defined HEADER_SAFESTACK_H */ diff --git a/ext/openssl-osx/include/openssl/sha.h b/ext/openssl-osx/include/openssl/sha.h new file mode 100644 index 00000000..e5169e4f --- /dev/null +++ b/ext/openssl-osx/include/openssl/sha.h @@ -0,0 +1,214 @@ +/* crypto/sha/sha.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_SHA_H +# define HEADER_SHA_H + +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# if defined(OPENSSL_NO_SHA) || (defined(OPENSSL_NO_SHA0) && defined(OPENSSL_NO_SHA1)) +# error SHA is disabled. +# endif + +# if defined(OPENSSL_FIPS) +# define FIPS_SHA_SIZE_T size_t +# endif + +/*- + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + * ! SHA_LONG has to be at least 32 bits wide. If it's wider, then ! + * ! SHA_LONG_LOG2 has to be defined along. ! + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + */ + +# if defined(__LP32__) +# define SHA_LONG unsigned long +# elif defined(OPENSSL_SYS_CRAY) || defined(__ILP64__) +# define SHA_LONG unsigned long +# define SHA_LONG_LOG2 3 +# else +# define SHA_LONG unsigned int +# endif + +# define SHA_LBLOCK 16 +# define SHA_CBLOCK (SHA_LBLOCK*4)/* SHA treats input data as a + * contiguous array of 32 bit wide + * big-endian values. */ +# define SHA_LAST_BLOCK (SHA_CBLOCK-8) +# define SHA_DIGEST_LENGTH 20 + +typedef struct SHAstate_st { + SHA_LONG h0, h1, h2, h3, h4; + SHA_LONG Nl, Nh; + SHA_LONG data[SHA_LBLOCK]; + unsigned int num; +} SHA_CTX; + +# ifndef OPENSSL_NO_SHA0 +# ifdef OPENSSL_FIPS +int private_SHA_Init(SHA_CTX *c); +# endif +int SHA_Init(SHA_CTX *c); +int SHA_Update(SHA_CTX *c, const void *data, size_t len); +int SHA_Final(unsigned char *md, SHA_CTX *c); +unsigned char *SHA(const unsigned char *d, size_t n, unsigned char *md); +void SHA_Transform(SHA_CTX *c, const unsigned char *data); +# endif +# ifndef OPENSSL_NO_SHA1 +# ifdef OPENSSL_FIPS +int private_SHA1_Init(SHA_CTX *c); +# endif +int SHA1_Init(SHA_CTX *c); +int SHA1_Update(SHA_CTX *c, const void *data, size_t len); +int SHA1_Final(unsigned char *md, SHA_CTX *c); +unsigned char *SHA1(const unsigned char *d, size_t n, unsigned char *md); +void SHA1_Transform(SHA_CTX *c, const unsigned char *data); +# endif + +# define SHA256_CBLOCK (SHA_LBLOCK*4)/* SHA-256 treats input data as a + * contiguous array of 32 bit wide + * big-endian values. */ +# define SHA224_DIGEST_LENGTH 28 +# define SHA256_DIGEST_LENGTH 32 + +typedef struct SHA256state_st { + SHA_LONG h[8]; + SHA_LONG Nl, Nh; + SHA_LONG data[SHA_LBLOCK]; + unsigned int num, md_len; +} SHA256_CTX; + +# ifndef OPENSSL_NO_SHA256 +# ifdef OPENSSL_FIPS +int private_SHA224_Init(SHA256_CTX *c); +int private_SHA256_Init(SHA256_CTX *c); +# endif +int SHA224_Init(SHA256_CTX *c); +int SHA224_Update(SHA256_CTX *c, const void *data, size_t len); +int SHA224_Final(unsigned char *md, SHA256_CTX *c); +unsigned char *SHA224(const unsigned char *d, size_t n, unsigned char *md); +int SHA256_Init(SHA256_CTX *c); +int SHA256_Update(SHA256_CTX *c, const void *data, size_t len); +int SHA256_Final(unsigned char *md, SHA256_CTX *c); +unsigned char *SHA256(const unsigned char *d, size_t n, unsigned char *md); +void SHA256_Transform(SHA256_CTX *c, const unsigned char *data); +# endif + +# define SHA384_DIGEST_LENGTH 48 +# define SHA512_DIGEST_LENGTH 64 + +# ifndef OPENSSL_NO_SHA512 +/* + * Unlike 32-bit digest algorithms, SHA-512 *relies* on SHA_LONG64 + * being exactly 64-bit wide. See Implementation Notes in sha512.c + * for further details. + */ +/* + * SHA-512 treats input data as a + * contiguous array of 64 bit + * wide big-endian values. + */ +# define SHA512_CBLOCK (SHA_LBLOCK*8) +# if (defined(_WIN32) || defined(_WIN64)) && !defined(__MINGW32__) +# define SHA_LONG64 unsigned __int64 +# define U64(C) C##UI64 +# elif defined(__arch64__) +# define SHA_LONG64 unsigned long +# define U64(C) C##UL +# else +# define SHA_LONG64 unsigned long long +# define U64(C) C##ULL +# endif + +typedef struct SHA512state_st { + SHA_LONG64 h[8]; + SHA_LONG64 Nl, Nh; + union { + SHA_LONG64 d[SHA_LBLOCK]; + unsigned char p[SHA512_CBLOCK]; + } u; + unsigned int num, md_len; +} SHA512_CTX; +# endif + +# ifndef OPENSSL_NO_SHA512 +# ifdef OPENSSL_FIPS +int private_SHA384_Init(SHA512_CTX *c); +int private_SHA512_Init(SHA512_CTX *c); +# endif +int SHA384_Init(SHA512_CTX *c); +int SHA384_Update(SHA512_CTX *c, const void *data, size_t len); +int SHA384_Final(unsigned char *md, SHA512_CTX *c); +unsigned char *SHA384(const unsigned char *d, size_t n, unsigned char *md); +int SHA512_Init(SHA512_CTX *c); +int SHA512_Update(SHA512_CTX *c, const void *data, size_t len); +int SHA512_Final(unsigned char *md, SHA512_CTX *c); +unsigned char *SHA512(const unsigned char *d, size_t n, unsigned char *md); +void SHA512_Transform(SHA512_CTX *c, const unsigned char *data); +# endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ext/openssl-osx/include/openssl/srtp.h b/ext/openssl-osx/include/openssl/srtp.h new file mode 100644 index 00000000..2279c32b --- /dev/null +++ b/ext/openssl-osx/include/openssl/srtp.h @@ -0,0 +1,147 @@ +/* ssl/srtp.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ +/* ==================================================================== + * Copyright (c) 1998-2006 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +/* + * DTLS code by Eric Rescorla + * + * Copyright (C) 2006, Network Resonance, Inc. Copyright (C) 2011, RTFM, Inc. + */ + +#ifndef HEADER_D1_SRTP_H +# define HEADER_D1_SRTP_H + +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# define SRTP_AES128_CM_SHA1_80 0x0001 +# define SRTP_AES128_CM_SHA1_32 0x0002 +# define SRTP_AES128_F8_SHA1_80 0x0003 +# define SRTP_AES128_F8_SHA1_32 0x0004 +# define SRTP_NULL_SHA1_80 0x0005 +# define SRTP_NULL_SHA1_32 0x0006 + +# ifndef OPENSSL_NO_SRTP + +int SSL_CTX_set_tlsext_use_srtp(SSL_CTX *ctx, const char *profiles); +int SSL_set_tlsext_use_srtp(SSL *ctx, const char *profiles); + +STACK_OF(SRTP_PROTECTION_PROFILE) *SSL_get_srtp_profiles(SSL *ssl); +SRTP_PROTECTION_PROFILE *SSL_get_selected_srtp_profile(SSL *s); + +# endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ext/openssl-osx/include/openssl/ssl.h b/ext/openssl-osx/include/openssl/ssl.h new file mode 100644 index 00000000..2b0f6628 --- /dev/null +++ b/ext/openssl-osx/include/openssl/ssl.h @@ -0,0 +1,3159 @@ +/* ssl/ssl.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ +/* ==================================================================== + * Copyright (c) 1998-2007 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +/* ==================================================================== + * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. + * ECC cipher suite support in OpenSSL originally developed by + * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project. + */ +/* ==================================================================== + * Copyright 2005 Nokia. All rights reserved. + * + * The portions of the attached software ("Contribution") is developed by + * Nokia Corporation and is licensed pursuant to the OpenSSL open source + * license. + * + * The Contribution, originally written by Mika Kousa and Pasi Eronen of + * Nokia Corporation, consists of the "PSK" (Pre-Shared Key) ciphersuites + * support (see RFC 4279) to OpenSSL. + * + * No patent licenses or other rights except those expressly stated in + * the OpenSSL open source license shall be deemed granted or received + * expressly, by implication, estoppel, or otherwise. + * + * No assurances are provided by Nokia that the Contribution does not + * infringe the patent or other intellectual property rights of any third + * party or that the license provides you with all the necessary rights + * to make use of the Contribution. + * + * THE SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. IN + * ADDITION TO THE DISCLAIMERS INCLUDED IN THE LICENSE, NOKIA + * SPECIFICALLY DISCLAIMS ANY LIABILITY FOR CLAIMS BROUGHT BY YOU OR ANY + * OTHER ENTITY BASED ON INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS OR + * OTHERWISE. + */ + +#ifndef HEADER_SSL_H +# define HEADER_SSL_H + +# include + +# ifndef OPENSSL_NO_COMP +# include +# endif +# ifndef OPENSSL_NO_BIO +# include +# endif +# ifndef OPENSSL_NO_DEPRECATED +# ifndef OPENSSL_NO_X509 +# include +# endif +# include +# include +# include +# endif +# include +# include + +# include +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +/* SSLeay version number for ASN.1 encoding of the session information */ +/*- + * Version 0 - initial version + * Version 1 - added the optional peer certificate + */ +# define SSL_SESSION_ASN1_VERSION 0x0001 + +/* text strings for the ciphers */ +# define SSL_TXT_NULL_WITH_MD5 SSL2_TXT_NULL_WITH_MD5 +# define SSL_TXT_RC4_128_WITH_MD5 SSL2_TXT_RC4_128_WITH_MD5 +# define SSL_TXT_RC4_128_EXPORT40_WITH_MD5 SSL2_TXT_RC4_128_EXPORT40_WITH_MD5 +# define SSL_TXT_RC2_128_CBC_WITH_MD5 SSL2_TXT_RC2_128_CBC_WITH_MD5 +# define SSL_TXT_RC2_128_CBC_EXPORT40_WITH_MD5 SSL2_TXT_RC2_128_CBC_EXPORT40_WITH_MD5 +# define SSL_TXT_IDEA_128_CBC_WITH_MD5 SSL2_TXT_IDEA_128_CBC_WITH_MD5 +# define SSL_TXT_DES_64_CBC_WITH_MD5 SSL2_TXT_DES_64_CBC_WITH_MD5 +# define SSL_TXT_DES_64_CBC_WITH_SHA SSL2_TXT_DES_64_CBC_WITH_SHA +# define SSL_TXT_DES_192_EDE3_CBC_WITH_MD5 SSL2_TXT_DES_192_EDE3_CBC_WITH_MD5 +# define SSL_TXT_DES_192_EDE3_CBC_WITH_SHA SSL2_TXT_DES_192_EDE3_CBC_WITH_SHA + +/* + * VRS Additional Kerberos5 entries + */ +# define SSL_TXT_KRB5_DES_64_CBC_SHA SSL3_TXT_KRB5_DES_64_CBC_SHA +# define SSL_TXT_KRB5_DES_192_CBC3_SHA SSL3_TXT_KRB5_DES_192_CBC3_SHA +# define SSL_TXT_KRB5_RC4_128_SHA SSL3_TXT_KRB5_RC4_128_SHA +# define SSL_TXT_KRB5_IDEA_128_CBC_SHA SSL3_TXT_KRB5_IDEA_128_CBC_SHA +# define SSL_TXT_KRB5_DES_64_CBC_MD5 SSL3_TXT_KRB5_DES_64_CBC_MD5 +# define SSL_TXT_KRB5_DES_192_CBC3_MD5 SSL3_TXT_KRB5_DES_192_CBC3_MD5 +# define SSL_TXT_KRB5_RC4_128_MD5 SSL3_TXT_KRB5_RC4_128_MD5 +# define SSL_TXT_KRB5_IDEA_128_CBC_MD5 SSL3_TXT_KRB5_IDEA_128_CBC_MD5 + +# define SSL_TXT_KRB5_DES_40_CBC_SHA SSL3_TXT_KRB5_DES_40_CBC_SHA +# define SSL_TXT_KRB5_RC2_40_CBC_SHA SSL3_TXT_KRB5_RC2_40_CBC_SHA +# define SSL_TXT_KRB5_RC4_40_SHA SSL3_TXT_KRB5_RC4_40_SHA +# define SSL_TXT_KRB5_DES_40_CBC_MD5 SSL3_TXT_KRB5_DES_40_CBC_MD5 +# define SSL_TXT_KRB5_RC2_40_CBC_MD5 SSL3_TXT_KRB5_RC2_40_CBC_MD5 +# define SSL_TXT_KRB5_RC4_40_MD5 SSL3_TXT_KRB5_RC4_40_MD5 + +# define SSL_TXT_KRB5_DES_40_CBC_SHA SSL3_TXT_KRB5_DES_40_CBC_SHA +# define SSL_TXT_KRB5_DES_40_CBC_MD5 SSL3_TXT_KRB5_DES_40_CBC_MD5 +# define SSL_TXT_KRB5_DES_64_CBC_SHA SSL3_TXT_KRB5_DES_64_CBC_SHA +# define SSL_TXT_KRB5_DES_64_CBC_MD5 SSL3_TXT_KRB5_DES_64_CBC_MD5 +# define SSL_TXT_KRB5_DES_192_CBC3_SHA SSL3_TXT_KRB5_DES_192_CBC3_SHA +# define SSL_TXT_KRB5_DES_192_CBC3_MD5 SSL3_TXT_KRB5_DES_192_CBC3_MD5 +# define SSL_MAX_KRB5_PRINCIPAL_LENGTH 256 + +# define SSL_MAX_SSL_SESSION_ID_LENGTH 32 +# define SSL_MAX_SID_CTX_LENGTH 32 + +# define SSL_MIN_RSA_MODULUS_LENGTH_IN_BYTES (512/8) +# define SSL_MAX_KEY_ARG_LENGTH 8 +# define SSL_MAX_MASTER_KEY_LENGTH 48 + +/* These are used to specify which ciphers to use and not to use */ + +# define SSL_TXT_EXP40 "EXPORT40" +# define SSL_TXT_EXP56 "EXPORT56" +# define SSL_TXT_LOW "LOW" +# define SSL_TXT_MEDIUM "MEDIUM" +# define SSL_TXT_HIGH "HIGH" +# define SSL_TXT_FIPS "FIPS" + +# define SSL_TXT_kFZA "kFZA"/* unused! */ +# define SSL_TXT_aFZA "aFZA"/* unused! */ +# define SSL_TXT_eFZA "eFZA"/* unused! */ +# define SSL_TXT_FZA "FZA"/* unused! */ + +# define SSL_TXT_aNULL "aNULL" +# define SSL_TXT_eNULL "eNULL" +# define SSL_TXT_NULL "NULL" + +# define SSL_TXT_kRSA "kRSA" +# define SSL_TXT_kDHr "kDHr" +# define SSL_TXT_kDHd "kDHd" +# define SSL_TXT_kDH "kDH" +# define SSL_TXT_kEDH "kEDH" +# define SSL_TXT_kDHE "kDHE"/* alias for kEDH */ +# define SSL_TXT_kKRB5 "kKRB5" +# define SSL_TXT_kECDHr "kECDHr" +# define SSL_TXT_kECDHe "kECDHe" +# define SSL_TXT_kECDH "kECDH" +# define SSL_TXT_kEECDH "kEECDH" +# define SSL_TXT_kECDHE "kECDHE"/* alias for kEECDH */ +# define SSL_TXT_kPSK "kPSK" +# define SSL_TXT_kGOST "kGOST" +# define SSL_TXT_kSRP "kSRP" + +# define SSL_TXT_aRSA "aRSA" +# define SSL_TXT_aDSS "aDSS" +# define SSL_TXT_aDH "aDH" +# define SSL_TXT_aECDH "aECDH" +# define SSL_TXT_aKRB5 "aKRB5" +# define SSL_TXT_aECDSA "aECDSA" +# define SSL_TXT_aPSK "aPSK" +# define SSL_TXT_aGOST94 "aGOST94" +# define SSL_TXT_aGOST01 "aGOST01" +# define SSL_TXT_aGOST "aGOST" +# define SSL_TXT_aSRP "aSRP" + +# define SSL_TXT_DSS "DSS" +# define SSL_TXT_DH "DH" +# define SSL_TXT_EDH "EDH"/* same as "kEDH:-ADH" */ +# define SSL_TXT_DHE "DHE"/* alias for EDH */ +# define SSL_TXT_ADH "ADH" +# define SSL_TXT_RSA "RSA" +# define SSL_TXT_ECDH "ECDH" +# define SSL_TXT_EECDH "EECDH"/* same as "kEECDH:-AECDH" */ +# define SSL_TXT_ECDHE "ECDHE"/* alias for ECDHE" */ +# define SSL_TXT_AECDH "AECDH" +# define SSL_TXT_ECDSA "ECDSA" +# define SSL_TXT_KRB5 "KRB5" +# define SSL_TXT_PSK "PSK" +# define SSL_TXT_SRP "SRP" + +# define SSL_TXT_DES "DES" +# define SSL_TXT_3DES "3DES" +# define SSL_TXT_RC4 "RC4" +# define SSL_TXT_RC2 "RC2" +# define SSL_TXT_IDEA "IDEA" +# define SSL_TXT_SEED "SEED" +# define SSL_TXT_AES128 "AES128" +# define SSL_TXT_AES256 "AES256" +# define SSL_TXT_AES "AES" +# define SSL_TXT_AES_GCM "AESGCM" +# define SSL_TXT_CAMELLIA128 "CAMELLIA128" +# define SSL_TXT_CAMELLIA256 "CAMELLIA256" +# define SSL_TXT_CAMELLIA "CAMELLIA" + +# define SSL_TXT_MD5 "MD5" +# define SSL_TXT_SHA1 "SHA1" +# define SSL_TXT_SHA "SHA"/* same as "SHA1" */ +# define SSL_TXT_GOST94 "GOST94" +# define SSL_TXT_GOST89MAC "GOST89MAC" +# define SSL_TXT_SHA256 "SHA256" +# define SSL_TXT_SHA384 "SHA384" + +# define SSL_TXT_SSLV2 "SSLv2" +# define SSL_TXT_SSLV3 "SSLv3" +# define SSL_TXT_TLSV1 "TLSv1" +# define SSL_TXT_TLSV1_1 "TLSv1.1" +# define SSL_TXT_TLSV1_2 "TLSv1.2" + +# define SSL_TXT_EXP "EXP" +# define SSL_TXT_EXPORT "EXPORT" + +# define SSL_TXT_ALL "ALL" + +/*- + * COMPLEMENTOF* definitions. These identifiers are used to (de-select) + * ciphers normally not being used. + * Example: "RC4" will activate all ciphers using RC4 including ciphers + * without authentication, which would normally disabled by DEFAULT (due + * the "!ADH" being part of default). Therefore "RC4:!COMPLEMENTOFDEFAULT" + * will make sure that it is also disabled in the specific selection. + * COMPLEMENTOF* identifiers are portable between version, as adjustments + * to the default cipher setup will also be included here. + * + * COMPLEMENTOFDEFAULT does not experience the same special treatment that + * DEFAULT gets, as only selection is being done and no sorting as needed + * for DEFAULT. + */ +# define SSL_TXT_CMPALL "COMPLEMENTOFALL" +# define SSL_TXT_CMPDEF "COMPLEMENTOFDEFAULT" + +/* + * The following cipher list is used by default. It also is substituted when + * an application-defined cipher list string starts with 'DEFAULT'. + */ +# define SSL_DEFAULT_CIPHER_LIST "ALL:!aNULL:!eNULL:!SSLv2" +/* + * As of OpenSSL 1.0.0, ssl_create_cipher_list() in ssl/ssl_ciph.c always + * starts with a reasonable order, and all we have to do for DEFAULT is + * throwing out anonymous and unencrypted ciphersuites! (The latter are not + * actually enabled by ALL, but "ALL:RSA" would enable some of them.) + */ + +/* Used in SSL_set_shutdown()/SSL_get_shutdown(); */ +# define SSL_SENT_SHUTDOWN 1 +# define SSL_RECEIVED_SHUTDOWN 2 + +#ifdef __cplusplus +} +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +# if (defined(OPENSSL_NO_RSA) || defined(OPENSSL_NO_MD5)) && !defined(OPENSSL_NO_SSL2) +# define OPENSSL_NO_SSL2 +# endif + +# define SSL_FILETYPE_ASN1 X509_FILETYPE_ASN1 +# define SSL_FILETYPE_PEM X509_FILETYPE_PEM + +/* + * This is needed to stop compilers complaining about the 'struct ssl_st *' + * function parameters used to prototype callbacks in SSL_CTX. + */ +typedef struct ssl_st *ssl_crock_st; +typedef struct tls_session_ticket_ext_st TLS_SESSION_TICKET_EXT; +typedef struct ssl_method_st SSL_METHOD; +typedef struct ssl_cipher_st SSL_CIPHER; +typedef struct ssl_session_st SSL_SESSION; +typedef struct tls_sigalgs_st TLS_SIGALGS; +typedef struct ssl_conf_ctx_st SSL_CONF_CTX; + +DECLARE_STACK_OF(SSL_CIPHER) + +/* SRTP protection profiles for use with the use_srtp extension (RFC 5764)*/ +typedef struct srtp_protection_profile_st { + const char *name; + unsigned long id; +} SRTP_PROTECTION_PROFILE; + +DECLARE_STACK_OF(SRTP_PROTECTION_PROFILE) + +typedef int (*tls_session_ticket_ext_cb_fn) (SSL *s, + const unsigned char *data, + int len, void *arg); +typedef int (*tls_session_secret_cb_fn) (SSL *s, void *secret, + int *secret_len, + STACK_OF(SSL_CIPHER) *peer_ciphers, + SSL_CIPHER **cipher, void *arg); + +# ifndef OPENSSL_NO_TLSEXT + +/* Typedefs for handling custom extensions */ + +typedef int (*custom_ext_add_cb) (SSL *s, unsigned int ext_type, + const unsigned char **out, + size_t *outlen, int *al, void *add_arg); + +typedef void (*custom_ext_free_cb) (SSL *s, unsigned int ext_type, + const unsigned char *out, void *add_arg); + +typedef int (*custom_ext_parse_cb) (SSL *s, unsigned int ext_type, + const unsigned char *in, + size_t inlen, int *al, void *parse_arg); + +# endif + +# ifndef OPENSSL_NO_SSL_INTERN + +/* used to hold info on the particular ciphers used */ +struct ssl_cipher_st { + int valid; + const char *name; /* text name */ + unsigned long id; /* id, 4 bytes, first is version */ + /* + * changed in 0.9.9: these four used to be portions of a single value + * 'algorithms' + */ + unsigned long algorithm_mkey; /* key exchange algorithm */ + unsigned long algorithm_auth; /* server authentication */ + unsigned long algorithm_enc; /* symmetric encryption */ + unsigned long algorithm_mac; /* symmetric authentication */ + unsigned long algorithm_ssl; /* (major) protocol version */ + unsigned long algo_strength; /* strength and export flags */ + unsigned long algorithm2; /* Extra flags */ + int strength_bits; /* Number of bits really used */ + int alg_bits; /* Number of bits for algorithm */ +}; + +/* Used to hold functions for SSLv2 or SSLv3/TLSv1 functions */ +struct ssl_method_st { + int version; + int (*ssl_new) (SSL *s); + void (*ssl_clear) (SSL *s); + void (*ssl_free) (SSL *s); + int (*ssl_accept) (SSL *s); + int (*ssl_connect) (SSL *s); + int (*ssl_read) (SSL *s, void *buf, int len); + int (*ssl_peek) (SSL *s, void *buf, int len); + int (*ssl_write) (SSL *s, const void *buf, int len); + int (*ssl_shutdown) (SSL *s); + int (*ssl_renegotiate) (SSL *s); + int (*ssl_renegotiate_check) (SSL *s); + long (*ssl_get_message) (SSL *s, int st1, int stn, int mt, long + max, int *ok); + int (*ssl_read_bytes) (SSL *s, int type, unsigned char *buf, int len, + int peek); + int (*ssl_write_bytes) (SSL *s, int type, const void *buf_, int len); + int (*ssl_dispatch_alert) (SSL *s); + long (*ssl_ctrl) (SSL *s, int cmd, long larg, void *parg); + long (*ssl_ctx_ctrl) (SSL_CTX *ctx, int cmd, long larg, void *parg); + const SSL_CIPHER *(*get_cipher_by_char) (const unsigned char *ptr); + int (*put_cipher_by_char) (const SSL_CIPHER *cipher, unsigned char *ptr); + int (*ssl_pending) (const SSL *s); + int (*num_ciphers) (void); + const SSL_CIPHER *(*get_cipher) (unsigned ncipher); + const struct ssl_method_st *(*get_ssl_method) (int version); + long (*get_timeout) (void); + struct ssl3_enc_method *ssl3_enc; /* Extra SSLv3/TLS stuff */ + int (*ssl_version) (void); + long (*ssl_callback_ctrl) (SSL *s, int cb_id, void (*fp) (void)); + long (*ssl_ctx_callback_ctrl) (SSL_CTX *s, int cb_id, void (*fp) (void)); +}; + +/*- + * Lets make this into an ASN.1 type structure as follows + * SSL_SESSION_ID ::= SEQUENCE { + * version INTEGER, -- structure version number + * SSLversion INTEGER, -- SSL version number + * Cipher OCTET STRING, -- the 3 byte cipher ID + * Session_ID OCTET STRING, -- the Session ID + * Master_key OCTET STRING, -- the master key + * KRB5_principal OCTET STRING -- optional Kerberos principal + * Key_Arg [ 0 ] IMPLICIT OCTET STRING, -- the optional Key argument + * Time [ 1 ] EXPLICIT INTEGER, -- optional Start Time + * Timeout [ 2 ] EXPLICIT INTEGER, -- optional Timeout ins seconds + * Peer [ 3 ] EXPLICIT X509, -- optional Peer Certificate + * Session_ID_context [ 4 ] EXPLICIT OCTET STRING, -- the Session ID context + * Verify_result [ 5 ] EXPLICIT INTEGER, -- X509_V_... code for `Peer' + * HostName [ 6 ] EXPLICIT OCTET STRING, -- optional HostName from servername TLS extension + * PSK_identity_hint [ 7 ] EXPLICIT OCTET STRING, -- optional PSK identity hint + * PSK_identity [ 8 ] EXPLICIT OCTET STRING, -- optional PSK identity + * Ticket_lifetime_hint [9] EXPLICIT INTEGER, -- server's lifetime hint for session ticket + * Ticket [10] EXPLICIT OCTET STRING, -- session ticket (clients only) + * Compression_meth [11] EXPLICIT OCTET STRING, -- optional compression method + * SRP_username [ 12 ] EXPLICIT OCTET STRING -- optional SRP username + * } + * Look in ssl/ssl_asn1.c for more details + * I'm using EXPLICIT tags so I can read the damn things using asn1parse :-). + */ +struct ssl_session_st { + int ssl_version; /* what ssl version session info is being + * kept in here? */ + /* only really used in SSLv2 */ + unsigned int key_arg_length; + unsigned char key_arg[SSL_MAX_KEY_ARG_LENGTH]; + int master_key_length; + unsigned char master_key[SSL_MAX_MASTER_KEY_LENGTH]; + /* session_id - valid? */ + unsigned int session_id_length; + unsigned char session_id[SSL_MAX_SSL_SESSION_ID_LENGTH]; + /* + * this is used to determine whether the session is being reused in the + * appropriate context. It is up to the application to set this, via + * SSL_new + */ + unsigned int sid_ctx_length; + unsigned char sid_ctx[SSL_MAX_SID_CTX_LENGTH]; +# ifndef OPENSSL_NO_KRB5 + unsigned int krb5_client_princ_len; + unsigned char krb5_client_princ[SSL_MAX_KRB5_PRINCIPAL_LENGTH]; +# endif /* OPENSSL_NO_KRB5 */ +# ifndef OPENSSL_NO_PSK + char *psk_identity_hint; + char *psk_identity; +# endif + /* + * Used to indicate that session resumption is not allowed. Applications + * can also set this bit for a new session via not_resumable_session_cb + * to disable session caching and tickets. + */ + int not_resumable; + /* The cert is the certificate used to establish this connection */ + struct sess_cert_st /* SESS_CERT */ *sess_cert; + /* + * This is the cert for the other end. On clients, it will be the same as + * sess_cert->peer_key->x509 (the latter is not enough as sess_cert is + * not retained in the external representation of sessions, see + * ssl_asn1.c). + */ + X509 *peer; + /* + * when app_verify_callback accepts a session where the peer's + * certificate is not ok, we must remember the error for session reuse: + */ + long verify_result; /* only for servers */ + int references; + long timeout; + long time; + unsigned int compress_meth; /* Need to lookup the method */ + const SSL_CIPHER *cipher; + unsigned long cipher_id; /* when ASN.1 loaded, this needs to be used + * to load the 'cipher' structure */ + STACK_OF(SSL_CIPHER) *ciphers; /* shared ciphers? */ + CRYPTO_EX_DATA ex_data; /* application specific data */ + /* + * These are used to make removal of session-ids more efficient and to + * implement a maximum cache size. + */ + struct ssl_session_st *prev, *next; +# ifndef OPENSSL_NO_TLSEXT + char *tlsext_hostname; +# ifndef OPENSSL_NO_EC + size_t tlsext_ecpointformatlist_length; + unsigned char *tlsext_ecpointformatlist; /* peer's list */ + size_t tlsext_ellipticcurvelist_length; + unsigned char *tlsext_ellipticcurvelist; /* peer's list */ +# endif /* OPENSSL_NO_EC */ + /* RFC4507 info */ + unsigned char *tlsext_tick; /* Session ticket */ + size_t tlsext_ticklen; /* Session ticket length */ + long tlsext_tick_lifetime_hint; /* Session lifetime hint in seconds */ +# endif +# ifndef OPENSSL_NO_SRP + char *srp_username; +# endif +}; + +# endif + +# define SSL_OP_MICROSOFT_SESS_ID_BUG 0x00000001L +# define SSL_OP_NETSCAPE_CHALLENGE_BUG 0x00000002L +/* Allow initial connection to servers that don't support RI */ +# define SSL_OP_LEGACY_SERVER_CONNECT 0x00000004L +# define SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG 0x00000008L +# define SSL_OP_TLSEXT_PADDING 0x00000010L +# define SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER 0x00000020L +# define SSL_OP_SAFARI_ECDHE_ECDSA_BUG 0x00000040L +# define SSL_OP_SSLEAY_080_CLIENT_DH_BUG 0x00000080L +# define SSL_OP_TLS_D5_BUG 0x00000100L +# define SSL_OP_TLS_BLOCK_PADDING_BUG 0x00000200L + +/* Hasn't done anything since OpenSSL 0.9.7h, retained for compatibility */ +# define SSL_OP_MSIE_SSLV2_RSA_PADDING 0x0 +/* Refers to ancient SSLREF and SSLv2, retained for compatibility */ +# define SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG 0x0 + +/* + * Disable SSL 3.0/TLS 1.0 CBC vulnerability workaround that was added in + * OpenSSL 0.9.6d. Usually (depending on the application protocol) the + * workaround is not needed. Unfortunately some broken SSL/TLS + * implementations cannot handle it at all, which is why we include it in + * SSL_OP_ALL. + */ +/* added in 0.9.6e */ +# define SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS 0x00000800L + +/* + * SSL_OP_ALL: various bug workarounds that should be rather harmless. This + * used to be 0x000FFFFFL before 0.9.7. + */ +# define SSL_OP_ALL 0x80000BFFL + +/* DTLS options */ +# define SSL_OP_NO_QUERY_MTU 0x00001000L +/* Turn on Cookie Exchange (on relevant for servers) */ +# define SSL_OP_COOKIE_EXCHANGE 0x00002000L +/* Don't use RFC4507 ticket extension */ +# define SSL_OP_NO_TICKET 0x00004000L +/* Use Cisco's "speshul" version of DTLS_BAD_VER (as client) */ +# define SSL_OP_CISCO_ANYCONNECT 0x00008000L + +/* As server, disallow session resumption on renegotiation */ +# define SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION 0x00010000L +/* Don't use compression even if supported */ +# define SSL_OP_NO_COMPRESSION 0x00020000L +/* Permit unsafe legacy renegotiation */ +# define SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION 0x00040000L +/* If set, always create a new key when using tmp_ecdh parameters */ +# define SSL_OP_SINGLE_ECDH_USE 0x00080000L +/* If set, always create a new key when using tmp_dh parameters */ +# define SSL_OP_SINGLE_DH_USE 0x00100000L +/* Does nothing: retained for compatibiity */ +# define SSL_OP_EPHEMERAL_RSA 0x0 +/* + * Set on servers to choose the cipher according to the server's preferences + */ +# define SSL_OP_CIPHER_SERVER_PREFERENCE 0x00400000L +/* + * If set, a server will allow a client to issue a SSLv3.0 version number as + * latest version supported in the premaster secret, even when TLSv1.0 + * (version 3.1) was announced in the client hello. Normally this is + * forbidden to prevent version rollback attacks. + */ +# define SSL_OP_TLS_ROLLBACK_BUG 0x00800000L + +# define SSL_OP_NO_SSLv2 0x01000000L +# define SSL_OP_NO_SSLv3 0x02000000L +# define SSL_OP_NO_TLSv1 0x04000000L +# define SSL_OP_NO_TLSv1_2 0x08000000L +# define SSL_OP_NO_TLSv1_1 0x10000000L + +# define SSL_OP_NO_DTLSv1 0x04000000L +# define SSL_OP_NO_DTLSv1_2 0x08000000L + +# define SSL_OP_NO_SSL_MASK (SSL_OP_NO_SSLv2|SSL_OP_NO_SSLv3|\ + SSL_OP_NO_TLSv1|SSL_OP_NO_TLSv1_1|SSL_OP_NO_TLSv1_2) + +/* + * These next two were never actually used for anything since SSLeay zap so + * we have some more flags. + */ +/* + * The next flag deliberately changes the ciphertest, this is a check for the + * PKCS#1 attack + */ +# define SSL_OP_PKCS1_CHECK_1 0x0 +# define SSL_OP_PKCS1_CHECK_2 0x0 + +# define SSL_OP_NETSCAPE_CA_DN_BUG 0x20000000L +# define SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG 0x40000000L +/* + * Make server add server-hello extension from early version of cryptopro + * draft, when GOST ciphersuite is negotiated. Required for interoperability + * with CryptoPro CSP 3.x + */ +# define SSL_OP_CRYPTOPRO_TLSEXT_BUG 0x80000000L + +/* + * Allow SSL_write(..., n) to return r with 0 < r < n (i.e. report success + * when just a single record has been written): + */ +# define SSL_MODE_ENABLE_PARTIAL_WRITE 0x00000001L +/* + * Make it possible to retry SSL_write() with changed buffer location (buffer + * contents must stay the same!); this is not the default to avoid the + * misconception that non-blocking SSL_write() behaves like non-blocking + * write(): + */ +# define SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER 0x00000002L +/* + * Never bother the application with retries if the transport is blocking: + */ +# define SSL_MODE_AUTO_RETRY 0x00000004L +/* Don't attempt to automatically build certificate chain */ +# define SSL_MODE_NO_AUTO_CHAIN 0x00000008L +/* + * Save RAM by releasing read and write buffers when they're empty. (SSL3 and + * TLS only.) "Released" buffers are put onto a free-list in the context or + * just freed (depending on the context's setting for freelist_max_len). + */ +# define SSL_MODE_RELEASE_BUFFERS 0x00000010L +/* + * Send the current time in the Random fields of the ClientHello and + * ServerHello records for compatibility with hypothetical implementations + * that require it. + */ +# define SSL_MODE_SEND_CLIENTHELLO_TIME 0x00000020L +# define SSL_MODE_SEND_SERVERHELLO_TIME 0x00000040L +/* + * Send TLS_FALLBACK_SCSV in the ClientHello. To be set only by applications + * that reconnect with a downgraded protocol version; see + * draft-ietf-tls-downgrade-scsv-00 for details. DO NOT ENABLE THIS if your + * application attempts a normal handshake. Only use this in explicit + * fallback retries, following the guidance in + * draft-ietf-tls-downgrade-scsv-00. + */ +# define SSL_MODE_SEND_FALLBACK_SCSV 0x00000080L + +/* Cert related flags */ +/* + * Many implementations ignore some aspects of the TLS standards such as + * enforcing certifcate chain algorithms. When this is set we enforce them. + */ +# define SSL_CERT_FLAG_TLS_STRICT 0x00000001L + +/* Suite B modes, takes same values as certificate verify flags */ +# define SSL_CERT_FLAG_SUITEB_128_LOS_ONLY 0x10000 +/* Suite B 192 bit only mode */ +# define SSL_CERT_FLAG_SUITEB_192_LOS 0x20000 +/* Suite B 128 bit mode allowing 192 bit algorithms */ +# define SSL_CERT_FLAG_SUITEB_128_LOS 0x30000 + +/* Perform all sorts of protocol violations for testing purposes */ +# define SSL_CERT_FLAG_BROKEN_PROTOCOL 0x10000000 + +/* Flags for building certificate chains */ +/* Treat any existing certificates as untrusted CAs */ +# define SSL_BUILD_CHAIN_FLAG_UNTRUSTED 0x1 +/* Don't include root CA in chain */ +# define SSL_BUILD_CHAIN_FLAG_NO_ROOT 0x2 +/* Just check certificates already there */ +# define SSL_BUILD_CHAIN_FLAG_CHECK 0x4 +/* Ignore verification errors */ +# define SSL_BUILD_CHAIN_FLAG_IGNORE_ERROR 0x8 +/* Clear verification errors from queue */ +# define SSL_BUILD_CHAIN_FLAG_CLEAR_ERROR 0x10 + +/* Flags returned by SSL_check_chain */ +/* Certificate can be used with this session */ +# define CERT_PKEY_VALID 0x1 +/* Certificate can also be used for signing */ +# define CERT_PKEY_SIGN 0x2 +/* EE certificate signing algorithm OK */ +# define CERT_PKEY_EE_SIGNATURE 0x10 +/* CA signature algorithms OK */ +# define CERT_PKEY_CA_SIGNATURE 0x20 +/* EE certificate parameters OK */ +# define CERT_PKEY_EE_PARAM 0x40 +/* CA certificate parameters OK */ +# define CERT_PKEY_CA_PARAM 0x80 +/* Signing explicitly allowed as opposed to SHA1 fallback */ +# define CERT_PKEY_EXPLICIT_SIGN 0x100 +/* Client CA issuer names match (always set for server cert) */ +# define CERT_PKEY_ISSUER_NAME 0x200 +/* Cert type matches client types (always set for server cert) */ +# define CERT_PKEY_CERT_TYPE 0x400 +/* Cert chain suitable to Suite B */ +# define CERT_PKEY_SUITEB 0x800 + +# define SSL_CONF_FLAG_CMDLINE 0x1 +# define SSL_CONF_FLAG_FILE 0x2 +# define SSL_CONF_FLAG_CLIENT 0x4 +# define SSL_CONF_FLAG_SERVER 0x8 +# define SSL_CONF_FLAG_SHOW_ERRORS 0x10 +# define SSL_CONF_FLAG_CERTIFICATE 0x20 +/* Configuration value types */ +# define SSL_CONF_TYPE_UNKNOWN 0x0 +# define SSL_CONF_TYPE_STRING 0x1 +# define SSL_CONF_TYPE_FILE 0x2 +# define SSL_CONF_TYPE_DIR 0x3 + +/* + * Note: SSL[_CTX]_set_{options,mode} use |= op on the previous value, they + * cannot be used to clear bits. + */ + +# define SSL_CTX_set_options(ctx,op) \ + SSL_CTX_ctrl((ctx),SSL_CTRL_OPTIONS,(op),NULL) +# define SSL_CTX_clear_options(ctx,op) \ + SSL_CTX_ctrl((ctx),SSL_CTRL_CLEAR_OPTIONS,(op),NULL) +# define SSL_CTX_get_options(ctx) \ + SSL_CTX_ctrl((ctx),SSL_CTRL_OPTIONS,0,NULL) +# define SSL_set_options(ssl,op) \ + SSL_ctrl((ssl),SSL_CTRL_OPTIONS,(op),NULL) +# define SSL_clear_options(ssl,op) \ + SSL_ctrl((ssl),SSL_CTRL_CLEAR_OPTIONS,(op),NULL) +# define SSL_get_options(ssl) \ + SSL_ctrl((ssl),SSL_CTRL_OPTIONS,0,NULL) + +# define SSL_CTX_set_mode(ctx,op) \ + SSL_CTX_ctrl((ctx),SSL_CTRL_MODE,(op),NULL) +# define SSL_CTX_clear_mode(ctx,op) \ + SSL_CTX_ctrl((ctx),SSL_CTRL_CLEAR_MODE,(op),NULL) +# define SSL_CTX_get_mode(ctx) \ + SSL_CTX_ctrl((ctx),SSL_CTRL_MODE,0,NULL) +# define SSL_clear_mode(ssl,op) \ + SSL_ctrl((ssl),SSL_CTRL_CLEAR_MODE,(op),NULL) +# define SSL_set_mode(ssl,op) \ + SSL_ctrl((ssl),SSL_CTRL_MODE,(op),NULL) +# define SSL_get_mode(ssl) \ + SSL_ctrl((ssl),SSL_CTRL_MODE,0,NULL) +# define SSL_set_mtu(ssl, mtu) \ + SSL_ctrl((ssl),SSL_CTRL_SET_MTU,(mtu),NULL) +# define DTLS_set_link_mtu(ssl, mtu) \ + SSL_ctrl((ssl),DTLS_CTRL_SET_LINK_MTU,(mtu),NULL) +# define DTLS_get_link_min_mtu(ssl) \ + SSL_ctrl((ssl),DTLS_CTRL_GET_LINK_MIN_MTU,0,NULL) + +# define SSL_get_secure_renegotiation_support(ssl) \ + SSL_ctrl((ssl), SSL_CTRL_GET_RI_SUPPORT, 0, NULL) + +# ifndef OPENSSL_NO_HEARTBEATS +# define SSL_heartbeat(ssl) \ + SSL_ctrl((ssl),SSL_CTRL_TLS_EXT_SEND_HEARTBEAT,0,NULL) +# endif + +# define SSL_CTX_set_cert_flags(ctx,op) \ + SSL_CTX_ctrl((ctx),SSL_CTRL_CERT_FLAGS,(op),NULL) +# define SSL_set_cert_flags(s,op) \ + SSL_ctrl((s),SSL_CTRL_CERT_FLAGS,(op),NULL) +# define SSL_CTX_clear_cert_flags(ctx,op) \ + SSL_CTX_ctrl((ctx),SSL_CTRL_CLEAR_CERT_FLAGS,(op),NULL) +# define SSL_clear_cert_flags(s,op) \ + SSL_ctrl((s),SSL_CTRL_CLEAR_CERT_FLAGS,(op),NULL) + +void SSL_CTX_set_msg_callback(SSL_CTX *ctx, + void (*cb) (int write_p, int version, + int content_type, const void *buf, + size_t len, SSL *ssl, void *arg)); +void SSL_set_msg_callback(SSL *ssl, + void (*cb) (int write_p, int version, + int content_type, const void *buf, + size_t len, SSL *ssl, void *arg)); +# define SSL_CTX_set_msg_callback_arg(ctx, arg) SSL_CTX_ctrl((ctx), SSL_CTRL_SET_MSG_CALLBACK_ARG, 0, (arg)) +# define SSL_set_msg_callback_arg(ssl, arg) SSL_ctrl((ssl), SSL_CTRL_SET_MSG_CALLBACK_ARG, 0, (arg)) + +# ifndef OPENSSL_NO_SRP + +# ifndef OPENSSL_NO_SSL_INTERN + +typedef struct srp_ctx_st { + /* param for all the callbacks */ + void *SRP_cb_arg; + /* set client Hello login callback */ + int (*TLS_ext_srp_username_callback) (SSL *, int *, void *); + /* set SRP N/g param callback for verification */ + int (*SRP_verify_param_callback) (SSL *, void *); + /* set SRP client passwd callback */ + char *(*SRP_give_srp_client_pwd_callback) (SSL *, void *); + char *login; + BIGNUM *N, *g, *s, *B, *A; + BIGNUM *a, *b, *v; + char *info; + int strength; + unsigned long srp_Mask; +} SRP_CTX; + +# endif + +/* see tls_srp.c */ +int SSL_SRP_CTX_init(SSL *s); +int SSL_CTX_SRP_CTX_init(SSL_CTX *ctx); +int SSL_SRP_CTX_free(SSL *ctx); +int SSL_CTX_SRP_CTX_free(SSL_CTX *ctx); +int SSL_srp_server_param_with_username(SSL *s, int *ad); +int SRP_generate_server_master_secret(SSL *s, unsigned char *master_key); +int SRP_Calc_A_param(SSL *s); +int SRP_generate_client_master_secret(SSL *s, unsigned char *master_key); + +# endif + +# if defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_WIN32) +# define SSL_MAX_CERT_LIST_DEFAULT 1024*30 + /* 30k max cert list :-) */ +# else +# define SSL_MAX_CERT_LIST_DEFAULT 1024*100 + /* 100k max cert list :-) */ +# endif + +# define SSL_SESSION_CACHE_MAX_SIZE_DEFAULT (1024*20) + +/* + * This callback type is used inside SSL_CTX, SSL, and in the functions that + * set them. It is used to override the generation of SSL/TLS session IDs in + * a server. Return value should be zero on an error, non-zero to proceed. + * Also, callbacks should themselves check if the id they generate is unique + * otherwise the SSL handshake will fail with an error - callbacks can do + * this using the 'ssl' value they're passed by; + * SSL_has_matching_session_id(ssl, id, *id_len) The length value passed in + * is set at the maximum size the session ID can be. In SSLv2 this is 16 + * bytes, whereas SSLv3/TLSv1 it is 32 bytes. The callback can alter this + * length to be less if desired, but under SSLv2 session IDs are supposed to + * be fixed at 16 bytes so the id will be padded after the callback returns + * in this case. It is also an error for the callback to set the size to + * zero. + */ +typedef int (*GEN_SESSION_CB) (const SSL *ssl, unsigned char *id, + unsigned int *id_len); + +typedef struct ssl_comp_st SSL_COMP; + +# ifndef OPENSSL_NO_SSL_INTERN + +struct ssl_comp_st { + int id; + const char *name; +# ifndef OPENSSL_NO_COMP + COMP_METHOD *method; +# else + char *method; +# endif +}; + +DECLARE_STACK_OF(SSL_COMP) +DECLARE_LHASH_OF(SSL_SESSION); + +struct ssl_ctx_st { + const SSL_METHOD *method; + STACK_OF(SSL_CIPHER) *cipher_list; + /* same as above but sorted for lookup */ + STACK_OF(SSL_CIPHER) *cipher_list_by_id; + struct x509_store_st /* X509_STORE */ *cert_store; + LHASH_OF(SSL_SESSION) *sessions; + /* + * Most session-ids that will be cached, default is + * SSL_SESSION_CACHE_MAX_SIZE_DEFAULT. 0 is unlimited. + */ + unsigned long session_cache_size; + struct ssl_session_st *session_cache_head; + struct ssl_session_st *session_cache_tail; + /* + * This can have one of 2 values, ored together, SSL_SESS_CACHE_CLIENT, + * SSL_SESS_CACHE_SERVER, Default is SSL_SESSION_CACHE_SERVER, which + * means only SSL_accept which cache SSL_SESSIONS. + */ + int session_cache_mode; + /* + * If timeout is not 0, it is the default timeout value set when + * SSL_new() is called. This has been put in to make life easier to set + * things up + */ + long session_timeout; + /* + * If this callback is not null, it will be called each time a session id + * is added to the cache. If this function returns 1, it means that the + * callback will do a SSL_SESSION_free() when it has finished using it. + * Otherwise, on 0, it means the callback has finished with it. If + * remove_session_cb is not null, it will be called when a session-id is + * removed from the cache. After the call, OpenSSL will + * SSL_SESSION_free() it. + */ + int (*new_session_cb) (struct ssl_st *ssl, SSL_SESSION *sess); + void (*remove_session_cb) (struct ssl_ctx_st *ctx, SSL_SESSION *sess); + SSL_SESSION *(*get_session_cb) (struct ssl_st *ssl, + unsigned char *data, int len, int *copy); + struct { + int sess_connect; /* SSL new conn - started */ + int sess_connect_renegotiate; /* SSL reneg - requested */ + int sess_connect_good; /* SSL new conne/reneg - finished */ + int sess_accept; /* SSL new accept - started */ + int sess_accept_renegotiate; /* SSL reneg - requested */ + int sess_accept_good; /* SSL accept/reneg - finished */ + int sess_miss; /* session lookup misses */ + int sess_timeout; /* reuse attempt on timeouted session */ + int sess_cache_full; /* session removed due to full cache */ + int sess_hit; /* session reuse actually done */ + int sess_cb_hit; /* session-id that was not in the cache was + * passed back via the callback. This + * indicates that the application is + * supplying session-id's from other + * processes - spooky :-) */ + } stats; + + int references; + + /* if defined, these override the X509_verify_cert() calls */ + int (*app_verify_callback) (X509_STORE_CTX *, void *); + void *app_verify_arg; + /* + * before OpenSSL 0.9.7, 'app_verify_arg' was ignored + * ('app_verify_callback' was called with just one argument) + */ + + /* Default password callback. */ + pem_password_cb *default_passwd_callback; + + /* Default password callback user data. */ + void *default_passwd_callback_userdata; + + /* get client cert callback */ + int (*client_cert_cb) (SSL *ssl, X509 **x509, EVP_PKEY **pkey); + + /* cookie generate callback */ + int (*app_gen_cookie_cb) (SSL *ssl, unsigned char *cookie, + unsigned int *cookie_len); + + /* verify cookie callback */ + int (*app_verify_cookie_cb) (SSL *ssl, unsigned char *cookie, + unsigned int cookie_len); + + CRYPTO_EX_DATA ex_data; + + const EVP_MD *rsa_md5; /* For SSLv2 - name is 'ssl2-md5' */ + const EVP_MD *md5; /* For SSLv3/TLSv1 'ssl3-md5' */ + const EVP_MD *sha1; /* For SSLv3/TLSv1 'ssl3->sha1' */ + + STACK_OF(X509) *extra_certs; + STACK_OF(SSL_COMP) *comp_methods; /* stack of SSL_COMP, SSLv3/TLSv1 */ + + /* Default values used when no per-SSL value is defined follow */ + + /* used if SSL's info_callback is NULL */ + void (*info_callback) (const SSL *ssl, int type, int val); + + /* what we put in client cert requests */ + STACK_OF(X509_NAME) *client_CA; + + /* + * Default values to use in SSL structures follow (these are copied by + * SSL_new) + */ + + unsigned long options; + unsigned long mode; + long max_cert_list; + + struct cert_st /* CERT */ *cert; + int read_ahead; + + /* callback that allows applications to peek at protocol messages */ + void (*msg_callback) (int write_p, int version, int content_type, + const void *buf, size_t len, SSL *ssl, void *arg); + void *msg_callback_arg; + + int verify_mode; + unsigned int sid_ctx_length; + unsigned char sid_ctx[SSL_MAX_SID_CTX_LENGTH]; + /* called 'verify_callback' in the SSL */ + int (*default_verify_callback) (int ok, X509_STORE_CTX *ctx); + + /* Default generate session ID callback. */ + GEN_SESSION_CB generate_session_id; + + X509_VERIFY_PARAM *param; + +# if 0 + int purpose; /* Purpose setting */ + int trust; /* Trust setting */ +# endif + + int quiet_shutdown; + + /* + * Maximum amount of data to send in one fragment. actual record size can + * be more than this due to padding and MAC overheads. + */ + unsigned int max_send_fragment; + +# ifndef OPENSSL_NO_ENGINE + /* + * Engine to pass requests for client certs to + */ + ENGINE *client_cert_engine; +# endif + +# ifndef OPENSSL_NO_TLSEXT + /* TLS extensions servername callback */ + int (*tlsext_servername_callback) (SSL *, int *, void *); + void *tlsext_servername_arg; + /* RFC 4507 session ticket keys */ + unsigned char tlsext_tick_key_name[16]; + unsigned char tlsext_tick_hmac_key[16]; + unsigned char tlsext_tick_aes_key[16]; + /* Callback to support customisation of ticket key setting */ + int (*tlsext_ticket_key_cb) (SSL *ssl, + unsigned char *name, unsigned char *iv, + EVP_CIPHER_CTX *ectx, + HMAC_CTX *hctx, int enc); + + /* certificate status request info */ + /* Callback for status request */ + int (*tlsext_status_cb) (SSL *ssl, void *arg); + void *tlsext_status_arg; + + /* draft-rescorla-tls-opaque-prf-input-00.txt information */ + int (*tlsext_opaque_prf_input_callback) (SSL *, void *peerinput, + size_t len, void *arg); + void *tlsext_opaque_prf_input_callback_arg; +# endif + +# ifndef OPENSSL_NO_PSK + char *psk_identity_hint; + unsigned int (*psk_client_callback) (SSL *ssl, const char *hint, + char *identity, + unsigned int max_identity_len, + unsigned char *psk, + unsigned int max_psk_len); + unsigned int (*psk_server_callback) (SSL *ssl, const char *identity, + unsigned char *psk, + unsigned int max_psk_len); +# endif + +# ifndef OPENSSL_NO_BUF_FREELISTS +# define SSL_MAX_BUF_FREELIST_LEN_DEFAULT 32 + unsigned int freelist_max_len; + struct ssl3_buf_freelist_st *wbuf_freelist; + struct ssl3_buf_freelist_st *rbuf_freelist; +# endif +# ifndef OPENSSL_NO_SRP + SRP_CTX srp_ctx; /* ctx for SRP authentication */ +# endif + +# ifndef OPENSSL_NO_TLSEXT + +# ifndef OPENSSL_NO_NEXTPROTONEG + /* Next protocol negotiation information */ + /* (for experimental NPN extension). */ + + /* + * For a server, this contains a callback function by which the set of + * advertised protocols can be provided. + */ + int (*next_protos_advertised_cb) (SSL *s, const unsigned char **buf, + unsigned int *len, void *arg); + void *next_protos_advertised_cb_arg; + /* + * For a client, this contains a callback function that selects the next + * protocol from the list provided by the server. + */ + int (*next_proto_select_cb) (SSL *s, unsigned char **out, + unsigned char *outlen, + const unsigned char *in, + unsigned int inlen, void *arg); + void *next_proto_select_cb_arg; +# endif + /* SRTP profiles we are willing to do from RFC 5764 */ + STACK_OF(SRTP_PROTECTION_PROFILE) *srtp_profiles; + + /* + * ALPN information (we are in the process of transitioning from NPN to + * ALPN.) + */ + + /*- + * For a server, this contains a callback function that allows the + * server to select the protocol for the connection. + * out: on successful return, this must point to the raw protocol + * name (without the length prefix). + * outlen: on successful return, this contains the length of |*out|. + * in: points to the client's list of supported protocols in + * wire-format. + * inlen: the length of |in|. + */ + int (*alpn_select_cb) (SSL *s, + const unsigned char **out, + unsigned char *outlen, + const unsigned char *in, + unsigned int inlen, void *arg); + void *alpn_select_cb_arg; + + /* + * For a client, this contains the list of supported protocols in wire + * format. + */ + unsigned char *alpn_client_proto_list; + unsigned alpn_client_proto_list_len; + +# ifndef OPENSSL_NO_EC + /* EC extension values inherited by SSL structure */ + size_t tlsext_ecpointformatlist_length; + unsigned char *tlsext_ecpointformatlist; + size_t tlsext_ellipticcurvelist_length; + unsigned char *tlsext_ellipticcurvelist; +# endif /* OPENSSL_NO_EC */ +# endif +}; + +# endif + +# define SSL_SESS_CACHE_OFF 0x0000 +# define SSL_SESS_CACHE_CLIENT 0x0001 +# define SSL_SESS_CACHE_SERVER 0x0002 +# define SSL_SESS_CACHE_BOTH (SSL_SESS_CACHE_CLIENT|SSL_SESS_CACHE_SERVER) +# define SSL_SESS_CACHE_NO_AUTO_CLEAR 0x0080 +/* enough comments already ... see SSL_CTX_set_session_cache_mode(3) */ +# define SSL_SESS_CACHE_NO_INTERNAL_LOOKUP 0x0100 +# define SSL_SESS_CACHE_NO_INTERNAL_STORE 0x0200 +# define SSL_SESS_CACHE_NO_INTERNAL \ + (SSL_SESS_CACHE_NO_INTERNAL_LOOKUP|SSL_SESS_CACHE_NO_INTERNAL_STORE) + +LHASH_OF(SSL_SESSION) *SSL_CTX_sessions(SSL_CTX *ctx); +# define SSL_CTX_sess_number(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_NUMBER,0,NULL) +# define SSL_CTX_sess_connect(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CONNECT,0,NULL) +# define SSL_CTX_sess_connect_good(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CONNECT_GOOD,0,NULL) +# define SSL_CTX_sess_connect_renegotiate(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CONNECT_RENEGOTIATE,0,NULL) +# define SSL_CTX_sess_accept(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_ACCEPT,0,NULL) +# define SSL_CTX_sess_accept_renegotiate(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_ACCEPT_RENEGOTIATE,0,NULL) +# define SSL_CTX_sess_accept_good(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_ACCEPT_GOOD,0,NULL) +# define SSL_CTX_sess_hits(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_HIT,0,NULL) +# define SSL_CTX_sess_cb_hits(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CB_HIT,0,NULL) +# define SSL_CTX_sess_misses(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_MISSES,0,NULL) +# define SSL_CTX_sess_timeouts(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_TIMEOUTS,0,NULL) +# define SSL_CTX_sess_cache_full(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CACHE_FULL,0,NULL) + +void SSL_CTX_sess_set_new_cb(SSL_CTX *ctx, + int (*new_session_cb) (struct ssl_st *ssl, + SSL_SESSION *sess)); +int (*SSL_CTX_sess_get_new_cb(SSL_CTX *ctx)) (struct ssl_st *ssl, + SSL_SESSION *sess); +void SSL_CTX_sess_set_remove_cb(SSL_CTX *ctx, + void (*remove_session_cb) (struct ssl_ctx_st + *ctx, + SSL_SESSION + *sess)); +void (*SSL_CTX_sess_get_remove_cb(SSL_CTX *ctx)) (struct ssl_ctx_st *ctx, + SSL_SESSION *sess); +void SSL_CTX_sess_set_get_cb(SSL_CTX *ctx, + SSL_SESSION *(*get_session_cb) (struct ssl_st + *ssl, + unsigned char + *data, int len, + int *copy)); +SSL_SESSION *(*SSL_CTX_sess_get_get_cb(SSL_CTX *ctx)) (struct ssl_st *ssl, + unsigned char *Data, + int len, int *copy); +void SSL_CTX_set_info_callback(SSL_CTX *ctx, + void (*cb) (const SSL *ssl, int type, + int val)); +void (*SSL_CTX_get_info_callback(SSL_CTX *ctx)) (const SSL *ssl, int type, + int val); +void SSL_CTX_set_client_cert_cb(SSL_CTX *ctx, + int (*client_cert_cb) (SSL *ssl, X509 **x509, + EVP_PKEY **pkey)); +int (*SSL_CTX_get_client_cert_cb(SSL_CTX *ctx)) (SSL *ssl, X509 **x509, + EVP_PKEY **pkey); +# ifndef OPENSSL_NO_ENGINE +int SSL_CTX_set_client_cert_engine(SSL_CTX *ctx, ENGINE *e); +# endif +void SSL_CTX_set_cookie_generate_cb(SSL_CTX *ctx, + int (*app_gen_cookie_cb) (SSL *ssl, + unsigned char + *cookie, + unsigned int + *cookie_len)); +void SSL_CTX_set_cookie_verify_cb(SSL_CTX *ctx, + int (*app_verify_cookie_cb) (SSL *ssl, + unsigned char + *cookie, + unsigned int + cookie_len)); +# ifndef OPENSSL_NO_NEXTPROTONEG +void SSL_CTX_set_next_protos_advertised_cb(SSL_CTX *s, + int (*cb) (SSL *ssl, + const unsigned char + **out, + unsigned int *outlen, + void *arg), void *arg); +void SSL_CTX_set_next_proto_select_cb(SSL_CTX *s, + int (*cb) (SSL *ssl, + unsigned char **out, + unsigned char *outlen, + const unsigned char *in, + unsigned int inlen, + void *arg), void *arg); +void SSL_get0_next_proto_negotiated(const SSL *s, const unsigned char **data, + unsigned *len); +# endif + +# ifndef OPENSSL_NO_TLSEXT +int SSL_select_next_proto(unsigned char **out, unsigned char *outlen, + const unsigned char *in, unsigned int inlen, + const unsigned char *client, + unsigned int client_len); +# endif + +# define OPENSSL_NPN_UNSUPPORTED 0 +# define OPENSSL_NPN_NEGOTIATED 1 +# define OPENSSL_NPN_NO_OVERLAP 2 + +int SSL_CTX_set_alpn_protos(SSL_CTX *ctx, const unsigned char *protos, + unsigned protos_len); +int SSL_set_alpn_protos(SSL *ssl, const unsigned char *protos, + unsigned protos_len); +void SSL_CTX_set_alpn_select_cb(SSL_CTX *ctx, + int (*cb) (SSL *ssl, + const unsigned char **out, + unsigned char *outlen, + const unsigned char *in, + unsigned int inlen, + void *arg), void *arg); +void SSL_get0_alpn_selected(const SSL *ssl, const unsigned char **data, + unsigned *len); + +# ifndef OPENSSL_NO_PSK +/* + * the maximum length of the buffer given to callbacks containing the + * resulting identity/psk + */ +# define PSK_MAX_IDENTITY_LEN 128 +# define PSK_MAX_PSK_LEN 256 +void SSL_CTX_set_psk_client_callback(SSL_CTX *ctx, + unsigned int (*psk_client_callback) (SSL + *ssl, + const + char + *hint, + char + *identity, + unsigned + int + max_identity_len, + unsigned + char + *psk, + unsigned + int + max_psk_len)); +void SSL_set_psk_client_callback(SSL *ssl, + unsigned int (*psk_client_callback) (SSL + *ssl, + const + char + *hint, + char + *identity, + unsigned + int + max_identity_len, + unsigned + char + *psk, + unsigned + int + max_psk_len)); +void SSL_CTX_set_psk_server_callback(SSL_CTX *ctx, + unsigned int (*psk_server_callback) (SSL + *ssl, + const + char + *identity, + unsigned + char + *psk, + unsigned + int + max_psk_len)); +void SSL_set_psk_server_callback(SSL *ssl, + unsigned int (*psk_server_callback) (SSL + *ssl, + const + char + *identity, + unsigned + char + *psk, + unsigned + int + max_psk_len)); +int SSL_CTX_use_psk_identity_hint(SSL_CTX *ctx, const char *identity_hint); +int SSL_use_psk_identity_hint(SSL *s, const char *identity_hint); +const char *SSL_get_psk_identity_hint(const SSL *s); +const char *SSL_get_psk_identity(const SSL *s); +# endif + +# ifndef OPENSSL_NO_TLSEXT +/* Register callbacks to handle custom TLS Extensions for client or server. */ + +int SSL_CTX_add_client_custom_ext(SSL_CTX *ctx, unsigned int ext_type, + custom_ext_add_cb add_cb, + custom_ext_free_cb free_cb, + void *add_arg, + custom_ext_parse_cb parse_cb, + void *parse_arg); + +int SSL_CTX_add_server_custom_ext(SSL_CTX *ctx, unsigned int ext_type, + custom_ext_add_cb add_cb, + custom_ext_free_cb free_cb, + void *add_arg, + custom_ext_parse_cb parse_cb, + void *parse_arg); + +int SSL_extension_supported(unsigned int ext_type); + +# endif + +# define SSL_NOTHING 1 +# define SSL_WRITING 2 +# define SSL_READING 3 +# define SSL_X509_LOOKUP 4 + +/* These will only be used when doing non-blocking IO */ +# define SSL_want_nothing(s) (SSL_want(s) == SSL_NOTHING) +# define SSL_want_read(s) (SSL_want(s) == SSL_READING) +# define SSL_want_write(s) (SSL_want(s) == SSL_WRITING) +# define SSL_want_x509_lookup(s) (SSL_want(s) == SSL_X509_LOOKUP) + +# define SSL_MAC_FLAG_READ_MAC_STREAM 1 +# define SSL_MAC_FLAG_WRITE_MAC_STREAM 2 + +# ifndef OPENSSL_NO_SSL_INTERN + +struct ssl_st { + /* + * protocol version (one of SSL2_VERSION, SSL3_VERSION, TLS1_VERSION, + * DTLS1_VERSION) + */ + int version; + /* SSL_ST_CONNECT or SSL_ST_ACCEPT */ + int type; + /* SSLv3 */ + const SSL_METHOD *method; + /* + * There are 2 BIO's even though they are normally both the same. This + * is so data can be read and written to different handlers + */ +# ifndef OPENSSL_NO_BIO + /* used by SSL_read */ + BIO *rbio; + /* used by SSL_write */ + BIO *wbio; + /* used during session-id reuse to concatenate messages */ + BIO *bbio; +# else + /* used by SSL_read */ + char *rbio; + /* used by SSL_write */ + char *wbio; + char *bbio; +# endif + /* + * This holds a variable that indicates what we were doing when a 0 or -1 + * is returned. This is needed for non-blocking IO so we know what + * request needs re-doing when in SSL_accept or SSL_connect + */ + int rwstate; + /* true when we are actually in SSL_accept() or SSL_connect() */ + int in_handshake; + int (*handshake_func) (SSL *); + /* + * Imagine that here's a boolean member "init" that is switched as soon + * as SSL_set_{accept/connect}_state is called for the first time, so + * that "state" and "handshake_func" are properly initialized. But as + * handshake_func is == 0 until then, we use this test instead of an + * "init" member. + */ + /* are we the server side? - mostly used by SSL_clear */ + int server; + /* + * Generate a new session or reuse an old one. + * NB: For servers, the 'new' session may actually be a previously + * cached session or even the previous session unless + * SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION is set + */ + int new_session; + /* don't send shutdown packets */ + int quiet_shutdown; + /* we have shut things down, 0x01 sent, 0x02 for received */ + int shutdown; + /* where we are */ + int state; + /* where we are when reading */ + int rstate; + BUF_MEM *init_buf; /* buffer used during init */ + void *init_msg; /* pointer to handshake message body, set by + * ssl3_get_message() */ + int init_num; /* amount read/written */ + int init_off; /* amount read/written */ + /* used internally to point at a raw packet */ + unsigned char *packet; + unsigned int packet_length; + struct ssl2_state_st *s2; /* SSLv2 variables */ + struct ssl3_state_st *s3; /* SSLv3 variables */ + struct dtls1_state_st *d1; /* DTLSv1 variables */ + int read_ahead; /* Read as many input bytes as possible (for + * non-blocking reads) */ + /* callback that allows applications to peek at protocol messages */ + void (*msg_callback) (int write_p, int version, int content_type, + const void *buf, size_t len, SSL *ssl, void *arg); + void *msg_callback_arg; + int hit; /* reusing a previous session */ + X509_VERIFY_PARAM *param; +# if 0 + int purpose; /* Purpose setting */ + int trust; /* Trust setting */ +# endif + /* crypto */ + STACK_OF(SSL_CIPHER) *cipher_list; + STACK_OF(SSL_CIPHER) *cipher_list_by_id; + /* + * These are the ones being used, the ones in SSL_SESSION are the ones to + * be 'copied' into these ones + */ + int mac_flags; + EVP_CIPHER_CTX *enc_read_ctx; /* cryptographic state */ + EVP_MD_CTX *read_hash; /* used for mac generation */ +# ifndef OPENSSL_NO_COMP + COMP_CTX *expand; /* uncompress */ +# else + char *expand; +# endif + EVP_CIPHER_CTX *enc_write_ctx; /* cryptographic state */ + EVP_MD_CTX *write_hash; /* used for mac generation */ +# ifndef OPENSSL_NO_COMP + COMP_CTX *compress; /* compression */ +# else + char *compress; +# endif + /* session info */ + /* client cert? */ + /* This is used to hold the server certificate used */ + struct cert_st /* CERT */ *cert; + /* + * the session_id_context is used to ensure sessions are only reused in + * the appropriate context + */ + unsigned int sid_ctx_length; + unsigned char sid_ctx[SSL_MAX_SID_CTX_LENGTH]; + /* This can also be in the session once a session is established */ + SSL_SESSION *session; + /* Default generate session ID callback. */ + GEN_SESSION_CB generate_session_id; + /* Used in SSL2 and SSL3 */ + /* + * 0 don't care about verify failure. + * 1 fail if verify fails + */ + int verify_mode; + /* fail if callback returns 0 */ + int (*verify_callback) (int ok, X509_STORE_CTX *ctx); + /* optional informational callback */ + void (*info_callback) (const SSL *ssl, int type, int val); + /* error bytes to be written */ + int error; + /* actual code */ + int error_code; +# ifndef OPENSSL_NO_KRB5 + /* Kerberos 5 context */ + KSSL_CTX *kssl_ctx; +# endif /* OPENSSL_NO_KRB5 */ +# ifndef OPENSSL_NO_PSK + unsigned int (*psk_client_callback) (SSL *ssl, const char *hint, + char *identity, + unsigned int max_identity_len, + unsigned char *psk, + unsigned int max_psk_len); + unsigned int (*psk_server_callback) (SSL *ssl, const char *identity, + unsigned char *psk, + unsigned int max_psk_len); +# endif + SSL_CTX *ctx; + /* + * set this flag to 1 and a sleep(1) is put into all SSL_read() and + * SSL_write() calls, good for nbio debuging :-) + */ + int debug; + /* extra application data */ + long verify_result; + CRYPTO_EX_DATA ex_data; + /* for server side, keep the list of CA_dn we can use */ + STACK_OF(X509_NAME) *client_CA; + int references; + /* protocol behaviour */ + unsigned long options; + /* API behaviour */ + unsigned long mode; + long max_cert_list; + int first_packet; + /* what was passed, used for SSLv3/TLS rollback check */ + int client_version; + unsigned int max_send_fragment; +# ifndef OPENSSL_NO_TLSEXT + /* TLS extension debug callback */ + void (*tlsext_debug_cb) (SSL *s, int client_server, int type, + unsigned char *data, int len, void *arg); + void *tlsext_debug_arg; + char *tlsext_hostname; + /*- + * no further mod of servername + * 0 : call the servername extension callback. + * 1 : prepare 2, allow last ack just after in server callback. + * 2 : don't call servername callback, no ack in server hello + */ + int servername_done; + /* certificate status request info */ + /* Status type or -1 if no status type */ + int tlsext_status_type; + /* Expect OCSP CertificateStatus message */ + int tlsext_status_expected; + /* OCSP status request only */ + STACK_OF(OCSP_RESPID) *tlsext_ocsp_ids; + X509_EXTENSIONS *tlsext_ocsp_exts; + /* OCSP response received or to be sent */ + unsigned char *tlsext_ocsp_resp; + int tlsext_ocsp_resplen; + /* RFC4507 session ticket expected to be received or sent */ + int tlsext_ticket_expected; +# ifndef OPENSSL_NO_EC + size_t tlsext_ecpointformatlist_length; + /* our list */ + unsigned char *tlsext_ecpointformatlist; + size_t tlsext_ellipticcurvelist_length; + /* our list */ + unsigned char *tlsext_ellipticcurvelist; +# endif /* OPENSSL_NO_EC */ + /* + * draft-rescorla-tls-opaque-prf-input-00.txt information to be used for + * handshakes + */ + void *tlsext_opaque_prf_input; + size_t tlsext_opaque_prf_input_len; + /* TLS Session Ticket extension override */ + TLS_SESSION_TICKET_EXT *tlsext_session_ticket; + /* TLS Session Ticket extension callback */ + tls_session_ticket_ext_cb_fn tls_session_ticket_ext_cb; + void *tls_session_ticket_ext_cb_arg; + /* TLS pre-shared secret session resumption */ + tls_session_secret_cb_fn tls_session_secret_cb; + void *tls_session_secret_cb_arg; + SSL_CTX *initial_ctx; /* initial ctx, used to store sessions */ +# ifndef OPENSSL_NO_NEXTPROTONEG + /* + * Next protocol negotiation. For the client, this is the protocol that + * we sent in NextProtocol and is set when handling ServerHello + * extensions. For a server, this is the client's selected_protocol from + * NextProtocol and is set when handling the NextProtocol message, before + * the Finished message. + */ + unsigned char *next_proto_negotiated; + unsigned char next_proto_negotiated_len; +# endif +# define session_ctx initial_ctx + /* What we'll do */ + STACK_OF(SRTP_PROTECTION_PROFILE) *srtp_profiles; + /* What's been chosen */ + SRTP_PROTECTION_PROFILE *srtp_profile; + /*- + * Is use of the Heartbeat extension negotiated? + * 0: disabled + * 1: enabled + * 2: enabled, but not allowed to send Requests + */ + unsigned int tlsext_heartbeat; + /* Indicates if a HeartbeatRequest is in flight */ + unsigned int tlsext_hb_pending; + /* HeartbeatRequest sequence number */ + unsigned int tlsext_hb_seq; +# else +# define session_ctx ctx +# endif /* OPENSSL_NO_TLSEXT */ + /*- + * 1 if we are renegotiating. + * 2 if we are a server and are inside a handshake + * (i.e. not just sending a HelloRequest) + */ + int renegotiate; +# ifndef OPENSSL_NO_SRP + /* ctx for SRP authentication */ + SRP_CTX srp_ctx; +# endif +# ifndef OPENSSL_NO_TLSEXT + /* + * For a client, this contains the list of supported protocols in wire + * format. + */ + unsigned char *alpn_client_proto_list; + unsigned alpn_client_proto_list_len; +# endif /* OPENSSL_NO_TLSEXT */ +}; + +# endif + +#ifdef __cplusplus +} +#endif + +# include +# include +# include /* This is mostly sslv3 with a few tweaks */ +# include /* Datagram TLS */ +# include +# include /* Support for the use_srtp extension */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* compatibility */ +# define SSL_set_app_data(s,arg) (SSL_set_ex_data(s,0,(char *)arg)) +# define SSL_get_app_data(s) (SSL_get_ex_data(s,0)) +# define SSL_SESSION_set_app_data(s,a) (SSL_SESSION_set_ex_data(s,0,(char *)a)) +# define SSL_SESSION_get_app_data(s) (SSL_SESSION_get_ex_data(s,0)) +# define SSL_CTX_get_app_data(ctx) (SSL_CTX_get_ex_data(ctx,0)) +# define SSL_CTX_set_app_data(ctx,arg) (SSL_CTX_set_ex_data(ctx,0,(char *)arg)) + +/* + * The following are the possible values for ssl->state are are used to + * indicate where we are up to in the SSL connection establishment. The + * macros that follow are about the only things you should need to use and + * even then, only when using non-blocking IO. It can also be useful to work + * out where you were when the connection failed + */ + +# define SSL_ST_CONNECT 0x1000 +# define SSL_ST_ACCEPT 0x2000 +# define SSL_ST_MASK 0x0FFF +# define SSL_ST_INIT (SSL_ST_CONNECT|SSL_ST_ACCEPT) +# define SSL_ST_BEFORE 0x4000 +# define SSL_ST_OK 0x03 +# define SSL_ST_RENEGOTIATE (0x04|SSL_ST_INIT) + +# define SSL_CB_LOOP 0x01 +# define SSL_CB_EXIT 0x02 +# define SSL_CB_READ 0x04 +# define SSL_CB_WRITE 0x08 +# define SSL_CB_ALERT 0x4000/* used in callback */ +# define SSL_CB_READ_ALERT (SSL_CB_ALERT|SSL_CB_READ) +# define SSL_CB_WRITE_ALERT (SSL_CB_ALERT|SSL_CB_WRITE) +# define SSL_CB_ACCEPT_LOOP (SSL_ST_ACCEPT|SSL_CB_LOOP) +# define SSL_CB_ACCEPT_EXIT (SSL_ST_ACCEPT|SSL_CB_EXIT) +# define SSL_CB_CONNECT_LOOP (SSL_ST_CONNECT|SSL_CB_LOOP) +# define SSL_CB_CONNECT_EXIT (SSL_ST_CONNECT|SSL_CB_EXIT) +# define SSL_CB_HANDSHAKE_START 0x10 +# define SSL_CB_HANDSHAKE_DONE 0x20 + +/* Is the SSL_connection established? */ +# define SSL_get_state(a) SSL_state(a) +# define SSL_is_init_finished(a) (SSL_state(a) == SSL_ST_OK) +# define SSL_in_init(a) (SSL_state(a)&SSL_ST_INIT) +# define SSL_in_before(a) (SSL_state(a)&SSL_ST_BEFORE) +# define SSL_in_connect_init(a) (SSL_state(a)&SSL_ST_CONNECT) +# define SSL_in_accept_init(a) (SSL_state(a)&SSL_ST_ACCEPT) + +/* + * The following 2 states are kept in ssl->rstate when reads fail, you should + * not need these + */ +# define SSL_ST_READ_HEADER 0xF0 +# define SSL_ST_READ_BODY 0xF1 +# define SSL_ST_READ_DONE 0xF2 + +/*- + * Obtain latest Finished message + * -- that we sent (SSL_get_finished) + * -- that we expected from peer (SSL_get_peer_finished). + * Returns length (0 == no Finished so far), copies up to 'count' bytes. + */ +size_t SSL_get_finished(const SSL *s, void *buf, size_t count); +size_t SSL_get_peer_finished(const SSL *s, void *buf, size_t count); + +/* + * use either SSL_VERIFY_NONE or SSL_VERIFY_PEER, the last 2 options are + * 'ored' with SSL_VERIFY_PEER if they are desired + */ +# define SSL_VERIFY_NONE 0x00 +# define SSL_VERIFY_PEER 0x01 +# define SSL_VERIFY_FAIL_IF_NO_PEER_CERT 0x02 +# define SSL_VERIFY_CLIENT_ONCE 0x04 + +# define OpenSSL_add_ssl_algorithms() SSL_library_init() +# define SSLeay_add_ssl_algorithms() SSL_library_init() + +/* this is for backward compatibility */ +# if 0 /* NEW_SSLEAY */ +# define SSL_CTX_set_default_verify(a,b,c) SSL_CTX_set_verify(a,b,c) +# define SSL_set_pref_cipher(c,n) SSL_set_cipher_list(c,n) +# define SSL_add_session(a,b) SSL_CTX_add_session((a),(b)) +# define SSL_remove_session(a,b) SSL_CTX_remove_session((a),(b)) +# define SSL_flush_sessions(a,b) SSL_CTX_flush_sessions((a),(b)) +# endif +/* More backward compatibility */ +# define SSL_get_cipher(s) \ + SSL_CIPHER_get_name(SSL_get_current_cipher(s)) +# define SSL_get_cipher_bits(s,np) \ + SSL_CIPHER_get_bits(SSL_get_current_cipher(s),np) +# define SSL_get_cipher_version(s) \ + SSL_CIPHER_get_version(SSL_get_current_cipher(s)) +# define SSL_get_cipher_name(s) \ + SSL_CIPHER_get_name(SSL_get_current_cipher(s)) +# define SSL_get_time(a) SSL_SESSION_get_time(a) +# define SSL_set_time(a,b) SSL_SESSION_set_time((a),(b)) +# define SSL_get_timeout(a) SSL_SESSION_get_timeout(a) +# define SSL_set_timeout(a,b) SSL_SESSION_set_timeout((a),(b)) + +# define d2i_SSL_SESSION_bio(bp,s_id) ASN1_d2i_bio_of(SSL_SESSION,SSL_SESSION_new,d2i_SSL_SESSION,bp,s_id) +# define i2d_SSL_SESSION_bio(bp,s_id) ASN1_i2d_bio_of(SSL_SESSION,i2d_SSL_SESSION,bp,s_id) + +DECLARE_PEM_rw(SSL_SESSION, SSL_SESSION) +# define SSL_AD_REASON_OFFSET 1000/* offset to get SSL_R_... value + * from SSL_AD_... */ +/* These alert types are for SSLv3 and TLSv1 */ +# define SSL_AD_CLOSE_NOTIFY SSL3_AD_CLOSE_NOTIFY +/* fatal */ +# define SSL_AD_UNEXPECTED_MESSAGE SSL3_AD_UNEXPECTED_MESSAGE +/* fatal */ +# define SSL_AD_BAD_RECORD_MAC SSL3_AD_BAD_RECORD_MAC +# define SSL_AD_DECRYPTION_FAILED TLS1_AD_DECRYPTION_FAILED +# define SSL_AD_RECORD_OVERFLOW TLS1_AD_RECORD_OVERFLOW +/* fatal */ +# define SSL_AD_DECOMPRESSION_FAILURE SSL3_AD_DECOMPRESSION_FAILURE +/* fatal */ +# define SSL_AD_HANDSHAKE_FAILURE SSL3_AD_HANDSHAKE_FAILURE +/* Not for TLS */ +# define SSL_AD_NO_CERTIFICATE SSL3_AD_NO_CERTIFICATE +# define SSL_AD_BAD_CERTIFICATE SSL3_AD_BAD_CERTIFICATE +# define SSL_AD_UNSUPPORTED_CERTIFICATE SSL3_AD_UNSUPPORTED_CERTIFICATE +# define SSL_AD_CERTIFICATE_REVOKED SSL3_AD_CERTIFICATE_REVOKED +# define SSL_AD_CERTIFICATE_EXPIRED SSL3_AD_CERTIFICATE_EXPIRED +# define SSL_AD_CERTIFICATE_UNKNOWN SSL3_AD_CERTIFICATE_UNKNOWN +/* fatal */ +# define SSL_AD_ILLEGAL_PARAMETER SSL3_AD_ILLEGAL_PARAMETER +/* fatal */ +# define SSL_AD_UNKNOWN_CA TLS1_AD_UNKNOWN_CA +/* fatal */ +# define SSL_AD_ACCESS_DENIED TLS1_AD_ACCESS_DENIED +/* fatal */ +# define SSL_AD_DECODE_ERROR TLS1_AD_DECODE_ERROR +# define SSL_AD_DECRYPT_ERROR TLS1_AD_DECRYPT_ERROR +/* fatal */ +# define SSL_AD_EXPORT_RESTRICTION TLS1_AD_EXPORT_RESTRICTION +/* fatal */ +# define SSL_AD_PROTOCOL_VERSION TLS1_AD_PROTOCOL_VERSION +/* fatal */ +# define SSL_AD_INSUFFICIENT_SECURITY TLS1_AD_INSUFFICIENT_SECURITY +/* fatal */ +# define SSL_AD_INTERNAL_ERROR TLS1_AD_INTERNAL_ERROR +# define SSL_AD_USER_CANCELLED TLS1_AD_USER_CANCELLED +# define SSL_AD_NO_RENEGOTIATION TLS1_AD_NO_RENEGOTIATION +# define SSL_AD_UNSUPPORTED_EXTENSION TLS1_AD_UNSUPPORTED_EXTENSION +# define SSL_AD_CERTIFICATE_UNOBTAINABLE TLS1_AD_CERTIFICATE_UNOBTAINABLE +# define SSL_AD_UNRECOGNIZED_NAME TLS1_AD_UNRECOGNIZED_NAME +# define SSL_AD_BAD_CERTIFICATE_STATUS_RESPONSE TLS1_AD_BAD_CERTIFICATE_STATUS_RESPONSE +# define SSL_AD_BAD_CERTIFICATE_HASH_VALUE TLS1_AD_BAD_CERTIFICATE_HASH_VALUE +/* fatal */ +# define SSL_AD_UNKNOWN_PSK_IDENTITY TLS1_AD_UNKNOWN_PSK_IDENTITY +/* fatal */ +# define SSL_AD_INAPPROPRIATE_FALLBACK TLS1_AD_INAPPROPRIATE_FALLBACK +# define SSL_ERROR_NONE 0 +# define SSL_ERROR_SSL 1 +# define SSL_ERROR_WANT_READ 2 +# define SSL_ERROR_WANT_WRITE 3 +# define SSL_ERROR_WANT_X509_LOOKUP 4 +# define SSL_ERROR_SYSCALL 5/* look at error stack/return + * value/errno */ +# define SSL_ERROR_ZERO_RETURN 6 +# define SSL_ERROR_WANT_CONNECT 7 +# define SSL_ERROR_WANT_ACCEPT 8 +# define SSL_CTRL_NEED_TMP_RSA 1 +# define SSL_CTRL_SET_TMP_RSA 2 +# define SSL_CTRL_SET_TMP_DH 3 +# define SSL_CTRL_SET_TMP_ECDH 4 +# define SSL_CTRL_SET_TMP_RSA_CB 5 +# define SSL_CTRL_SET_TMP_DH_CB 6 +# define SSL_CTRL_SET_TMP_ECDH_CB 7 +# define SSL_CTRL_GET_SESSION_REUSED 8 +# define SSL_CTRL_GET_CLIENT_CERT_REQUEST 9 +# define SSL_CTRL_GET_NUM_RENEGOTIATIONS 10 +# define SSL_CTRL_CLEAR_NUM_RENEGOTIATIONS 11 +# define SSL_CTRL_GET_TOTAL_RENEGOTIATIONS 12 +# define SSL_CTRL_GET_FLAGS 13 +# define SSL_CTRL_EXTRA_CHAIN_CERT 14 +# define SSL_CTRL_SET_MSG_CALLBACK 15 +# define SSL_CTRL_SET_MSG_CALLBACK_ARG 16 +/* only applies to datagram connections */ +# define SSL_CTRL_SET_MTU 17 +/* Stats */ +# define SSL_CTRL_SESS_NUMBER 20 +# define SSL_CTRL_SESS_CONNECT 21 +# define SSL_CTRL_SESS_CONNECT_GOOD 22 +# define SSL_CTRL_SESS_CONNECT_RENEGOTIATE 23 +# define SSL_CTRL_SESS_ACCEPT 24 +# define SSL_CTRL_SESS_ACCEPT_GOOD 25 +# define SSL_CTRL_SESS_ACCEPT_RENEGOTIATE 26 +# define SSL_CTRL_SESS_HIT 27 +# define SSL_CTRL_SESS_CB_HIT 28 +# define SSL_CTRL_SESS_MISSES 29 +# define SSL_CTRL_SESS_TIMEOUTS 30 +# define SSL_CTRL_SESS_CACHE_FULL 31 +# define SSL_CTRL_OPTIONS 32 +# define SSL_CTRL_MODE 33 +# define SSL_CTRL_GET_READ_AHEAD 40 +# define SSL_CTRL_SET_READ_AHEAD 41 +# define SSL_CTRL_SET_SESS_CACHE_SIZE 42 +# define SSL_CTRL_GET_SESS_CACHE_SIZE 43 +# define SSL_CTRL_SET_SESS_CACHE_MODE 44 +# define SSL_CTRL_GET_SESS_CACHE_MODE 45 +# define SSL_CTRL_GET_MAX_CERT_LIST 50 +# define SSL_CTRL_SET_MAX_CERT_LIST 51 +# define SSL_CTRL_SET_MAX_SEND_FRAGMENT 52 +/* see tls1.h for macros based on these */ +# ifndef OPENSSL_NO_TLSEXT +# define SSL_CTRL_SET_TLSEXT_SERVERNAME_CB 53 +# define SSL_CTRL_SET_TLSEXT_SERVERNAME_ARG 54 +# define SSL_CTRL_SET_TLSEXT_HOSTNAME 55 +# define SSL_CTRL_SET_TLSEXT_DEBUG_CB 56 +# define SSL_CTRL_SET_TLSEXT_DEBUG_ARG 57 +# define SSL_CTRL_GET_TLSEXT_TICKET_KEYS 58 +# define SSL_CTRL_SET_TLSEXT_TICKET_KEYS 59 +# define SSL_CTRL_SET_TLSEXT_OPAQUE_PRF_INPUT 60 +# define SSL_CTRL_SET_TLSEXT_OPAQUE_PRF_INPUT_CB 61 +# define SSL_CTRL_SET_TLSEXT_OPAQUE_PRF_INPUT_CB_ARG 62 +# define SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB 63 +# define SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB_ARG 64 +# define SSL_CTRL_SET_TLSEXT_STATUS_REQ_TYPE 65 +# define SSL_CTRL_GET_TLSEXT_STATUS_REQ_EXTS 66 +# define SSL_CTRL_SET_TLSEXT_STATUS_REQ_EXTS 67 +# define SSL_CTRL_GET_TLSEXT_STATUS_REQ_IDS 68 +# define SSL_CTRL_SET_TLSEXT_STATUS_REQ_IDS 69 +# define SSL_CTRL_GET_TLSEXT_STATUS_REQ_OCSP_RESP 70 +# define SSL_CTRL_SET_TLSEXT_STATUS_REQ_OCSP_RESP 71 +# define SSL_CTRL_SET_TLSEXT_TICKET_KEY_CB 72 +# define SSL_CTRL_SET_TLS_EXT_SRP_USERNAME_CB 75 +# define SSL_CTRL_SET_SRP_VERIFY_PARAM_CB 76 +# define SSL_CTRL_SET_SRP_GIVE_CLIENT_PWD_CB 77 +# define SSL_CTRL_SET_SRP_ARG 78 +# define SSL_CTRL_SET_TLS_EXT_SRP_USERNAME 79 +# define SSL_CTRL_SET_TLS_EXT_SRP_STRENGTH 80 +# define SSL_CTRL_SET_TLS_EXT_SRP_PASSWORD 81 +# ifndef OPENSSL_NO_HEARTBEATS +# define SSL_CTRL_TLS_EXT_SEND_HEARTBEAT 85 +# define SSL_CTRL_GET_TLS_EXT_HEARTBEAT_PENDING 86 +# define SSL_CTRL_SET_TLS_EXT_HEARTBEAT_NO_REQUESTS 87 +# endif +# endif /* OPENSSL_NO_TLSEXT */ +# define DTLS_CTRL_GET_TIMEOUT 73 +# define DTLS_CTRL_HANDLE_TIMEOUT 74 +# define DTLS_CTRL_LISTEN 75 +# define SSL_CTRL_GET_RI_SUPPORT 76 +# define SSL_CTRL_CLEAR_OPTIONS 77 +# define SSL_CTRL_CLEAR_MODE 78 +# define SSL_CTRL_GET_EXTRA_CHAIN_CERTS 82 +# define SSL_CTRL_CLEAR_EXTRA_CHAIN_CERTS 83 +# define SSL_CTRL_CHAIN 88 +# define SSL_CTRL_CHAIN_CERT 89 +# define SSL_CTRL_GET_CURVES 90 +# define SSL_CTRL_SET_CURVES 91 +# define SSL_CTRL_SET_CURVES_LIST 92 +# define SSL_CTRL_GET_SHARED_CURVE 93 +# define SSL_CTRL_SET_ECDH_AUTO 94 +# define SSL_CTRL_SET_SIGALGS 97 +# define SSL_CTRL_SET_SIGALGS_LIST 98 +# define SSL_CTRL_CERT_FLAGS 99 +# define SSL_CTRL_CLEAR_CERT_FLAGS 100 +# define SSL_CTRL_SET_CLIENT_SIGALGS 101 +# define SSL_CTRL_SET_CLIENT_SIGALGS_LIST 102 +# define SSL_CTRL_GET_CLIENT_CERT_TYPES 103 +# define SSL_CTRL_SET_CLIENT_CERT_TYPES 104 +# define SSL_CTRL_BUILD_CERT_CHAIN 105 +# define SSL_CTRL_SET_VERIFY_CERT_STORE 106 +# define SSL_CTRL_SET_CHAIN_CERT_STORE 107 +# define SSL_CTRL_GET_PEER_SIGNATURE_NID 108 +# define SSL_CTRL_GET_SERVER_TMP_KEY 109 +# define SSL_CTRL_GET_RAW_CIPHERLIST 110 +# define SSL_CTRL_GET_EC_POINT_FORMATS 111 +# define SSL_CTRL_GET_CHAIN_CERTS 115 +# define SSL_CTRL_SELECT_CURRENT_CERT 116 +# define SSL_CTRL_SET_CURRENT_CERT 117 +# define SSL_CTRL_CHECK_PROTO_VERSION 119 +# define DTLS_CTRL_SET_LINK_MTU 120 +# define DTLS_CTRL_GET_LINK_MIN_MTU 121 +# define SSL_CERT_SET_FIRST 1 +# define SSL_CERT_SET_NEXT 2 +# define SSL_CERT_SET_SERVER 3 +# define DTLSv1_get_timeout(ssl, arg) \ + SSL_ctrl(ssl,DTLS_CTRL_GET_TIMEOUT,0, (void *)arg) +# define DTLSv1_handle_timeout(ssl) \ + SSL_ctrl(ssl,DTLS_CTRL_HANDLE_TIMEOUT,0, NULL) +# define DTLSv1_listen(ssl, peer) \ + SSL_ctrl(ssl,DTLS_CTRL_LISTEN,0, (void *)peer) +# define SSL_session_reused(ssl) \ + SSL_ctrl((ssl),SSL_CTRL_GET_SESSION_REUSED,0,NULL) +# define SSL_num_renegotiations(ssl) \ + SSL_ctrl((ssl),SSL_CTRL_GET_NUM_RENEGOTIATIONS,0,NULL) +# define SSL_clear_num_renegotiations(ssl) \ + SSL_ctrl((ssl),SSL_CTRL_CLEAR_NUM_RENEGOTIATIONS,0,NULL) +# define SSL_total_renegotiations(ssl) \ + SSL_ctrl((ssl),SSL_CTRL_GET_TOTAL_RENEGOTIATIONS,0,NULL) +# define SSL_CTX_need_tmp_RSA(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_NEED_TMP_RSA,0,NULL) +# define SSL_CTX_set_tmp_rsa(ctx,rsa) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TMP_RSA,0,(char *)rsa) +# define SSL_CTX_set_tmp_dh(ctx,dh) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TMP_DH,0,(char *)dh) +# define SSL_CTX_set_tmp_ecdh(ctx,ecdh) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TMP_ECDH,0,(char *)ecdh) +# define SSL_need_tmp_RSA(ssl) \ + SSL_ctrl(ssl,SSL_CTRL_NEED_TMP_RSA,0,NULL) +# define SSL_set_tmp_rsa(ssl,rsa) \ + SSL_ctrl(ssl,SSL_CTRL_SET_TMP_RSA,0,(char *)rsa) +# define SSL_set_tmp_dh(ssl,dh) \ + SSL_ctrl(ssl,SSL_CTRL_SET_TMP_DH,0,(char *)dh) +# define SSL_set_tmp_ecdh(ssl,ecdh) \ + SSL_ctrl(ssl,SSL_CTRL_SET_TMP_ECDH,0,(char *)ecdh) +# define SSL_CTX_add_extra_chain_cert(ctx,x509) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_EXTRA_CHAIN_CERT,0,(char *)x509) +# define SSL_CTX_get_extra_chain_certs(ctx,px509) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_GET_EXTRA_CHAIN_CERTS,0,px509) +# define SSL_CTX_get_extra_chain_certs_only(ctx,px509) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_GET_EXTRA_CHAIN_CERTS,1,px509) +# define SSL_CTX_clear_extra_chain_certs(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_CLEAR_EXTRA_CHAIN_CERTS,0,NULL) +# define SSL_CTX_set0_chain(ctx,sk) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_CHAIN,0,(char *)sk) +# define SSL_CTX_set1_chain(ctx,sk) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_CHAIN,1,(char *)sk) +# define SSL_CTX_add0_chain_cert(ctx,x509) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_CHAIN_CERT,0,(char *)x509) +# define SSL_CTX_add1_chain_cert(ctx,x509) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_CHAIN_CERT,1,(char *)x509) +# define SSL_CTX_get0_chain_certs(ctx,px509) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_GET_CHAIN_CERTS,0,px509) +# define SSL_CTX_clear_chain_certs(ctx) \ + SSL_CTX_set0_chain(ctx,NULL) +# define SSL_CTX_build_cert_chain(ctx, flags) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_BUILD_CERT_CHAIN, flags, NULL) +# define SSL_CTX_select_current_cert(ctx,x509) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SELECT_CURRENT_CERT,0,(char *)x509) +# define SSL_CTX_set_current_cert(ctx, op) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_CURRENT_CERT, op, NULL) +# define SSL_CTX_set0_verify_cert_store(ctx,st) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_VERIFY_CERT_STORE,0,(char *)st) +# define SSL_CTX_set1_verify_cert_store(ctx,st) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_VERIFY_CERT_STORE,1,(char *)st) +# define SSL_CTX_set0_chain_cert_store(ctx,st) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_CHAIN_CERT_STORE,0,(char *)st) +# define SSL_CTX_set1_chain_cert_store(ctx,st) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_CHAIN_CERT_STORE,1,(char *)st) +# define SSL_set0_chain(ctx,sk) \ + SSL_ctrl(ctx,SSL_CTRL_CHAIN,0,(char *)sk) +# define SSL_set1_chain(ctx,sk) \ + SSL_ctrl(ctx,SSL_CTRL_CHAIN,1,(char *)sk) +# define SSL_add0_chain_cert(ctx,x509) \ + SSL_ctrl(ctx,SSL_CTRL_CHAIN_CERT,0,(char *)x509) +# define SSL_add1_chain_cert(ctx,x509) \ + SSL_ctrl(ctx,SSL_CTRL_CHAIN_CERT,1,(char *)x509) +# define SSL_get0_chain_certs(ctx,px509) \ + SSL_ctrl(ctx,SSL_CTRL_GET_CHAIN_CERTS,0,px509) +# define SSL_clear_chain_certs(ctx) \ + SSL_set0_chain(ctx,NULL) +# define SSL_build_cert_chain(s, flags) \ + SSL_ctrl(s,SSL_CTRL_BUILD_CERT_CHAIN, flags, NULL) +# define SSL_select_current_cert(ctx,x509) \ + SSL_ctrl(ctx,SSL_CTRL_SELECT_CURRENT_CERT,0,(char *)x509) +# define SSL_set_current_cert(ctx,op) \ + SSL_ctrl(ctx,SSL_CTRL_SET_CURRENT_CERT, op, NULL) +# define SSL_set0_verify_cert_store(s,st) \ + SSL_ctrl(s,SSL_CTRL_SET_VERIFY_CERT_STORE,0,(char *)st) +# define SSL_set1_verify_cert_store(s,st) \ + SSL_ctrl(s,SSL_CTRL_SET_VERIFY_CERT_STORE,1,(char *)st) +# define SSL_set0_chain_cert_store(s,st) \ + SSL_ctrl(s,SSL_CTRL_SET_CHAIN_CERT_STORE,0,(char *)st) +# define SSL_set1_chain_cert_store(s,st) \ + SSL_ctrl(s,SSL_CTRL_SET_CHAIN_CERT_STORE,1,(char *)st) +# define SSL_get1_curves(ctx, s) \ + SSL_ctrl(ctx,SSL_CTRL_GET_CURVES,0,(char *)s) +# define SSL_CTX_set1_curves(ctx, clist, clistlen) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_CURVES,clistlen,(char *)clist) +# define SSL_CTX_set1_curves_list(ctx, s) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_CURVES_LIST,0,(char *)s) +# define SSL_set1_curves(ctx, clist, clistlen) \ + SSL_ctrl(ctx,SSL_CTRL_SET_CURVES,clistlen,(char *)clist) +# define SSL_set1_curves_list(ctx, s) \ + SSL_ctrl(ctx,SSL_CTRL_SET_CURVES_LIST,0,(char *)s) +# define SSL_get_shared_curve(s, n) \ + SSL_ctrl(s,SSL_CTRL_GET_SHARED_CURVE,n,NULL) +# define SSL_CTX_set_ecdh_auto(ctx, onoff) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_ECDH_AUTO,onoff,NULL) +# define SSL_set_ecdh_auto(s, onoff) \ + SSL_ctrl(s,SSL_CTRL_SET_ECDH_AUTO,onoff,NULL) +# define SSL_CTX_set1_sigalgs(ctx, slist, slistlen) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_SIGALGS,slistlen,(int *)slist) +# define SSL_CTX_set1_sigalgs_list(ctx, s) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_SIGALGS_LIST,0,(char *)s) +# define SSL_set1_sigalgs(ctx, slist, slistlen) \ + SSL_ctrl(ctx,SSL_CTRL_SET_SIGALGS,clistlen,(int *)slist) +# define SSL_set1_sigalgs_list(ctx, s) \ + SSL_ctrl(ctx,SSL_CTRL_SET_SIGALGS_LIST,0,(char *)s) +# define SSL_CTX_set1_client_sigalgs(ctx, slist, slistlen) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_CLIENT_SIGALGS,slistlen,(int *)slist) +# define SSL_CTX_set1_client_sigalgs_list(ctx, s) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_CLIENT_SIGALGS_LIST,0,(char *)s) +# define SSL_set1_client_sigalgs(ctx, slist, slistlen) \ + SSL_ctrl(ctx,SSL_CTRL_SET_CLIENT_SIGALGS,clistlen,(int *)slist) +# define SSL_set1_client_sigalgs_list(ctx, s) \ + SSL_ctrl(ctx,SSL_CTRL_SET_CLIENT_SIGALGS_LIST,0,(char *)s) +# define SSL_get0_certificate_types(s, clist) \ + SSL_ctrl(s, SSL_CTRL_GET_CLIENT_CERT_TYPES, 0, (char *)clist) +# define SSL_CTX_set1_client_certificate_types(ctx, clist, clistlen) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_CLIENT_CERT_TYPES,clistlen,(char *)clist) +# define SSL_set1_client_certificate_types(s, clist, clistlen) \ + SSL_ctrl(s,SSL_CTRL_SET_CLIENT_CERT_TYPES,clistlen,(char *)clist) +# define SSL_get_peer_signature_nid(s, pn) \ + SSL_ctrl(s,SSL_CTRL_GET_PEER_SIGNATURE_NID,0,pn) +# define SSL_get_server_tmp_key(s, pk) \ + SSL_ctrl(s,SSL_CTRL_GET_SERVER_TMP_KEY,0,pk) +# define SSL_get0_raw_cipherlist(s, plst) \ + SSL_ctrl(s,SSL_CTRL_GET_RAW_CIPHERLIST,0,(char *)plst) +# define SSL_get0_ec_point_formats(s, plst) \ + SSL_ctrl(s,SSL_CTRL_GET_EC_POINT_FORMATS,0,(char *)plst) +# ifndef OPENSSL_NO_BIO +BIO_METHOD *BIO_f_ssl(void); +BIO *BIO_new_ssl(SSL_CTX *ctx, int client); +BIO *BIO_new_ssl_connect(SSL_CTX *ctx); +BIO *BIO_new_buffer_ssl_connect(SSL_CTX *ctx); +int BIO_ssl_copy_session_id(BIO *to, BIO *from); +void BIO_ssl_shutdown(BIO *ssl_bio); + +# endif + +int SSL_CTX_set_cipher_list(SSL_CTX *, const char *str); +SSL_CTX *SSL_CTX_new(const SSL_METHOD *meth); +void SSL_CTX_free(SSL_CTX *); +long SSL_CTX_set_timeout(SSL_CTX *ctx, long t); +long SSL_CTX_get_timeout(const SSL_CTX *ctx); +X509_STORE *SSL_CTX_get_cert_store(const SSL_CTX *); +void SSL_CTX_set_cert_store(SSL_CTX *, X509_STORE *); +int SSL_want(const SSL *s); +int SSL_clear(SSL *s); + +void SSL_CTX_flush_sessions(SSL_CTX *ctx, long tm); + +const SSL_CIPHER *SSL_get_current_cipher(const SSL *s); +int SSL_CIPHER_get_bits(const SSL_CIPHER *c, int *alg_bits); +char *SSL_CIPHER_get_version(const SSL_CIPHER *c); +const char *SSL_CIPHER_get_name(const SSL_CIPHER *c); +unsigned long SSL_CIPHER_get_id(const SSL_CIPHER *c); + +int SSL_get_fd(const SSL *s); +int SSL_get_rfd(const SSL *s); +int SSL_get_wfd(const SSL *s); +const char *SSL_get_cipher_list(const SSL *s, int n); +char *SSL_get_shared_ciphers(const SSL *s, char *buf, int len); +int SSL_get_read_ahead(const SSL *s); +int SSL_pending(const SSL *s); +# ifndef OPENSSL_NO_SOCK +int SSL_set_fd(SSL *s, int fd); +int SSL_set_rfd(SSL *s, int fd); +int SSL_set_wfd(SSL *s, int fd); +# endif +# ifndef OPENSSL_NO_BIO +void SSL_set_bio(SSL *s, BIO *rbio, BIO *wbio); +BIO *SSL_get_rbio(const SSL *s); +BIO *SSL_get_wbio(const SSL *s); +# endif +int SSL_set_cipher_list(SSL *s, const char *str); +void SSL_set_read_ahead(SSL *s, int yes); +int SSL_get_verify_mode(const SSL *s); +int SSL_get_verify_depth(const SSL *s); +int (*SSL_get_verify_callback(const SSL *s)) (int, X509_STORE_CTX *); +void SSL_set_verify(SSL *s, int mode, + int (*callback) (int ok, X509_STORE_CTX *ctx)); +void SSL_set_verify_depth(SSL *s, int depth); +void SSL_set_cert_cb(SSL *s, int (*cb) (SSL *ssl, void *arg), void *arg); +# ifndef OPENSSL_NO_RSA +int SSL_use_RSAPrivateKey(SSL *ssl, RSA *rsa); +# endif +int SSL_use_RSAPrivateKey_ASN1(SSL *ssl, unsigned char *d, long len); +int SSL_use_PrivateKey(SSL *ssl, EVP_PKEY *pkey); +int SSL_use_PrivateKey_ASN1(int pk, SSL *ssl, const unsigned char *d, + long len); +int SSL_use_certificate(SSL *ssl, X509 *x); +int SSL_use_certificate_ASN1(SSL *ssl, const unsigned char *d, int len); + +# ifndef OPENSSL_NO_TLSEXT +/* Set serverinfo data for the current active cert. */ +int SSL_CTX_use_serverinfo(SSL_CTX *ctx, const unsigned char *serverinfo, + size_t serverinfo_length); +# ifndef OPENSSL_NO_STDIO +int SSL_CTX_use_serverinfo_file(SSL_CTX *ctx, const char *file); +# endif /* NO_STDIO */ + +# endif + +# ifndef OPENSSL_NO_STDIO +int SSL_use_RSAPrivateKey_file(SSL *ssl, const char *file, int type); +int SSL_use_PrivateKey_file(SSL *ssl, const char *file, int type); +int SSL_use_certificate_file(SSL *ssl, const char *file, int type); +int SSL_CTX_use_RSAPrivateKey_file(SSL_CTX *ctx, const char *file, int type); +int SSL_CTX_use_PrivateKey_file(SSL_CTX *ctx, const char *file, int type); +int SSL_CTX_use_certificate_file(SSL_CTX *ctx, const char *file, int type); +/* PEM type */ +int SSL_CTX_use_certificate_chain_file(SSL_CTX *ctx, const char *file); +STACK_OF(X509_NAME) *SSL_load_client_CA_file(const char *file); +int SSL_add_file_cert_subjects_to_stack(STACK_OF(X509_NAME) *stackCAs, + const char *file); +# ifndef OPENSSL_SYS_VMS +/* XXXXX: Better scheme needed! [was: #ifndef MAC_OS_pre_X] */ +# ifndef OPENSSL_SYS_MACINTOSH_CLASSIC +int SSL_add_dir_cert_subjects_to_stack(STACK_OF(X509_NAME) *stackCAs, + const char *dir); +# endif +# endif + +# endif + +void SSL_load_error_strings(void); +const char *SSL_state_string(const SSL *s); +const char *SSL_rstate_string(const SSL *s); +const char *SSL_state_string_long(const SSL *s); +const char *SSL_rstate_string_long(const SSL *s); +long SSL_SESSION_get_time(const SSL_SESSION *s); +long SSL_SESSION_set_time(SSL_SESSION *s, long t); +long SSL_SESSION_get_timeout(const SSL_SESSION *s); +long SSL_SESSION_set_timeout(SSL_SESSION *s, long t); +void SSL_copy_session_id(SSL *to, const SSL *from); +X509 *SSL_SESSION_get0_peer(SSL_SESSION *s); +int SSL_SESSION_set1_id_context(SSL_SESSION *s, const unsigned char *sid_ctx, + unsigned int sid_ctx_len); + +SSL_SESSION *SSL_SESSION_new(void); +const unsigned char *SSL_SESSION_get_id(const SSL_SESSION *s, + unsigned int *len); +unsigned int SSL_SESSION_get_compress_id(const SSL_SESSION *s); +# ifndef OPENSSL_NO_FP_API +int SSL_SESSION_print_fp(FILE *fp, const SSL_SESSION *ses); +# endif +# ifndef OPENSSL_NO_BIO +int SSL_SESSION_print(BIO *fp, const SSL_SESSION *ses); +# endif +void SSL_SESSION_free(SSL_SESSION *ses); +int i2d_SSL_SESSION(SSL_SESSION *in, unsigned char **pp); +int SSL_set_session(SSL *to, SSL_SESSION *session); +int SSL_CTX_add_session(SSL_CTX *s, SSL_SESSION *c); +int SSL_CTX_remove_session(SSL_CTX *, SSL_SESSION *c); +int SSL_CTX_set_generate_session_id(SSL_CTX *, GEN_SESSION_CB); +int SSL_set_generate_session_id(SSL *, GEN_SESSION_CB); +int SSL_has_matching_session_id(const SSL *ssl, const unsigned char *id, + unsigned int id_len); +SSL_SESSION *d2i_SSL_SESSION(SSL_SESSION **a, const unsigned char **pp, + long length); + +# ifdef HEADER_X509_H +X509 *SSL_get_peer_certificate(const SSL *s); +# endif + +STACK_OF(X509) *SSL_get_peer_cert_chain(const SSL *s); + +int SSL_CTX_get_verify_mode(const SSL_CTX *ctx); +int SSL_CTX_get_verify_depth(const SSL_CTX *ctx); +int (*SSL_CTX_get_verify_callback(const SSL_CTX *ctx)) (int, + X509_STORE_CTX *); +void SSL_CTX_set_verify(SSL_CTX *ctx, int mode, + int (*callback) (int, X509_STORE_CTX *)); +void SSL_CTX_set_verify_depth(SSL_CTX *ctx, int depth); +void SSL_CTX_set_cert_verify_callback(SSL_CTX *ctx, + int (*cb) (X509_STORE_CTX *, void *), + void *arg); +void SSL_CTX_set_cert_cb(SSL_CTX *c, int (*cb) (SSL *ssl, void *arg), + void *arg); +# ifndef OPENSSL_NO_RSA +int SSL_CTX_use_RSAPrivateKey(SSL_CTX *ctx, RSA *rsa); +# endif +int SSL_CTX_use_RSAPrivateKey_ASN1(SSL_CTX *ctx, const unsigned char *d, + long len); +int SSL_CTX_use_PrivateKey(SSL_CTX *ctx, EVP_PKEY *pkey); +int SSL_CTX_use_PrivateKey_ASN1(int pk, SSL_CTX *ctx, + const unsigned char *d, long len); +int SSL_CTX_use_certificate(SSL_CTX *ctx, X509 *x); +int SSL_CTX_use_certificate_ASN1(SSL_CTX *ctx, int len, + const unsigned char *d); + +void SSL_CTX_set_default_passwd_cb(SSL_CTX *ctx, pem_password_cb *cb); +void SSL_CTX_set_default_passwd_cb_userdata(SSL_CTX *ctx, void *u); + +int SSL_CTX_check_private_key(const SSL_CTX *ctx); +int SSL_check_private_key(const SSL *ctx); + +int SSL_CTX_set_session_id_context(SSL_CTX *ctx, const unsigned char *sid_ctx, + unsigned int sid_ctx_len); + +SSL *SSL_new(SSL_CTX *ctx); +int SSL_set_session_id_context(SSL *ssl, const unsigned char *sid_ctx, + unsigned int sid_ctx_len); + +int SSL_CTX_set_purpose(SSL_CTX *s, int purpose); +int SSL_set_purpose(SSL *s, int purpose); +int SSL_CTX_set_trust(SSL_CTX *s, int trust); +int SSL_set_trust(SSL *s, int trust); + +int SSL_CTX_set1_param(SSL_CTX *ctx, X509_VERIFY_PARAM *vpm); +int SSL_set1_param(SSL *ssl, X509_VERIFY_PARAM *vpm); + +X509_VERIFY_PARAM *SSL_CTX_get0_param(SSL_CTX *ctx); +X509_VERIFY_PARAM *SSL_get0_param(SSL *ssl); + +# ifndef OPENSSL_NO_SRP +int SSL_CTX_set_srp_username(SSL_CTX *ctx, char *name); +int SSL_CTX_set_srp_password(SSL_CTX *ctx, char *password); +int SSL_CTX_set_srp_strength(SSL_CTX *ctx, int strength); +int SSL_CTX_set_srp_client_pwd_callback(SSL_CTX *ctx, + char *(*cb) (SSL *, void *)); +int SSL_CTX_set_srp_verify_param_callback(SSL_CTX *ctx, + int (*cb) (SSL *, void *)); +int SSL_CTX_set_srp_username_callback(SSL_CTX *ctx, + int (*cb) (SSL *, int *, void *)); +int SSL_CTX_set_srp_cb_arg(SSL_CTX *ctx, void *arg); + +int SSL_set_srp_server_param(SSL *s, const BIGNUM *N, const BIGNUM *g, + BIGNUM *sa, BIGNUM *v, char *info); +int SSL_set_srp_server_param_pw(SSL *s, const char *user, const char *pass, + const char *grp); + +BIGNUM *SSL_get_srp_g(SSL *s); +BIGNUM *SSL_get_srp_N(SSL *s); + +char *SSL_get_srp_username(SSL *s); +char *SSL_get_srp_userinfo(SSL *s); +# endif + +void SSL_certs_clear(SSL *s); +void SSL_free(SSL *ssl); +int SSL_accept(SSL *ssl); +int SSL_connect(SSL *ssl); +int SSL_read(SSL *ssl, void *buf, int num); +int SSL_peek(SSL *ssl, void *buf, int num); +int SSL_write(SSL *ssl, const void *buf, int num); +long SSL_ctrl(SSL *ssl, int cmd, long larg, void *parg); +long SSL_callback_ctrl(SSL *, int, void (*)(void)); +long SSL_CTX_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg); +long SSL_CTX_callback_ctrl(SSL_CTX *, int, void (*)(void)); + +int SSL_get_error(const SSL *s, int ret_code); +const char *SSL_get_version(const SSL *s); + +/* This sets the 'default' SSL version that SSL_new() will create */ +int SSL_CTX_set_ssl_version(SSL_CTX *ctx, const SSL_METHOD *meth); + +# ifndef OPENSSL_NO_SSL2 +const SSL_METHOD *SSLv2_method(void); /* SSLv2 */ +const SSL_METHOD *SSLv2_server_method(void); /* SSLv2 */ +const SSL_METHOD *SSLv2_client_method(void); /* SSLv2 */ +# endif + +# ifndef OPENSSL_NO_SSL3_METHOD +const SSL_METHOD *SSLv3_method(void); /* SSLv3 */ +const SSL_METHOD *SSLv3_server_method(void); /* SSLv3 */ +const SSL_METHOD *SSLv3_client_method(void); /* SSLv3 */ +# endif + +const SSL_METHOD *SSLv23_method(void); /* Negotiate highest available SSL/TLS + * version */ +const SSL_METHOD *SSLv23_server_method(void); /* Negotiate highest available + * SSL/TLS version */ +const SSL_METHOD *SSLv23_client_method(void); /* Negotiate highest available + * SSL/TLS version */ + +const SSL_METHOD *TLSv1_method(void); /* TLSv1.0 */ +const SSL_METHOD *TLSv1_server_method(void); /* TLSv1.0 */ +const SSL_METHOD *TLSv1_client_method(void); /* TLSv1.0 */ + +const SSL_METHOD *TLSv1_1_method(void); /* TLSv1.1 */ +const SSL_METHOD *TLSv1_1_server_method(void); /* TLSv1.1 */ +const SSL_METHOD *TLSv1_1_client_method(void); /* TLSv1.1 */ + +const SSL_METHOD *TLSv1_2_method(void); /* TLSv1.2 */ +const SSL_METHOD *TLSv1_2_server_method(void); /* TLSv1.2 */ +const SSL_METHOD *TLSv1_2_client_method(void); /* TLSv1.2 */ + +const SSL_METHOD *DTLSv1_method(void); /* DTLSv1.0 */ +const SSL_METHOD *DTLSv1_server_method(void); /* DTLSv1.0 */ +const SSL_METHOD *DTLSv1_client_method(void); /* DTLSv1.0 */ + +const SSL_METHOD *DTLSv1_2_method(void); /* DTLSv1.2 */ +const SSL_METHOD *DTLSv1_2_server_method(void); /* DTLSv1.2 */ +const SSL_METHOD *DTLSv1_2_client_method(void); /* DTLSv1.2 */ + +const SSL_METHOD *DTLS_method(void); /* DTLS 1.0 and 1.2 */ +const SSL_METHOD *DTLS_server_method(void); /* DTLS 1.0 and 1.2 */ +const SSL_METHOD *DTLS_client_method(void); /* DTLS 1.0 and 1.2 */ + +STACK_OF(SSL_CIPHER) *SSL_get_ciphers(const SSL *s); + +int SSL_do_handshake(SSL *s); +int SSL_renegotiate(SSL *s); +int SSL_renegotiate_abbreviated(SSL *s); +int SSL_renegotiate_pending(SSL *s); +int SSL_shutdown(SSL *s); + +const SSL_METHOD *SSL_CTX_get_ssl_method(SSL_CTX *ctx); +const SSL_METHOD *SSL_get_ssl_method(SSL *s); +int SSL_set_ssl_method(SSL *s, const SSL_METHOD *method); +const char *SSL_alert_type_string_long(int value); +const char *SSL_alert_type_string(int value); +const char *SSL_alert_desc_string_long(int value); +const char *SSL_alert_desc_string(int value); + +void SSL_set_client_CA_list(SSL *s, STACK_OF(X509_NAME) *name_list); +void SSL_CTX_set_client_CA_list(SSL_CTX *ctx, STACK_OF(X509_NAME) *name_list); +STACK_OF(X509_NAME) *SSL_get_client_CA_list(const SSL *s); +STACK_OF(X509_NAME) *SSL_CTX_get_client_CA_list(const SSL_CTX *s); +int SSL_add_client_CA(SSL *ssl, X509 *x); +int SSL_CTX_add_client_CA(SSL_CTX *ctx, X509 *x); + +void SSL_set_connect_state(SSL *s); +void SSL_set_accept_state(SSL *s); + +long SSL_get_default_timeout(const SSL *s); + +int SSL_library_init(void); + +char *SSL_CIPHER_description(const SSL_CIPHER *, char *buf, int size); +STACK_OF(X509_NAME) *SSL_dup_CA_list(STACK_OF(X509_NAME) *sk); + +SSL *SSL_dup(SSL *ssl); + +X509 *SSL_get_certificate(const SSL *ssl); +/* + * EVP_PKEY + */ struct evp_pkey_st *SSL_get_privatekey(const SSL *ssl); + +X509 *SSL_CTX_get0_certificate(const SSL_CTX *ctx); +EVP_PKEY *SSL_CTX_get0_privatekey(const SSL_CTX *ctx); + +void SSL_CTX_set_quiet_shutdown(SSL_CTX *ctx, int mode); +int SSL_CTX_get_quiet_shutdown(const SSL_CTX *ctx); +void SSL_set_quiet_shutdown(SSL *ssl, int mode); +int SSL_get_quiet_shutdown(const SSL *ssl); +void SSL_set_shutdown(SSL *ssl, int mode); +int SSL_get_shutdown(const SSL *ssl); +int SSL_version(const SSL *ssl); +int SSL_CTX_set_default_verify_paths(SSL_CTX *ctx); +int SSL_CTX_load_verify_locations(SSL_CTX *ctx, const char *CAfile, + const char *CApath); +# define SSL_get0_session SSL_get_session/* just peek at pointer */ +SSL_SESSION *SSL_get_session(const SSL *ssl); +SSL_SESSION *SSL_get1_session(SSL *ssl); /* obtain a reference count */ +SSL_CTX *SSL_get_SSL_CTX(const SSL *ssl); +SSL_CTX *SSL_set_SSL_CTX(SSL *ssl, SSL_CTX *ctx); +void SSL_set_info_callback(SSL *ssl, + void (*cb) (const SSL *ssl, int type, int val)); +void (*SSL_get_info_callback(const SSL *ssl)) (const SSL *ssl, int type, + int val); +int SSL_state(const SSL *ssl); +void SSL_set_state(SSL *ssl, int state); + +void SSL_set_verify_result(SSL *ssl, long v); +long SSL_get_verify_result(const SSL *ssl); + +int SSL_set_ex_data(SSL *ssl, int idx, void *data); +void *SSL_get_ex_data(const SSL *ssl, int idx); +int SSL_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func); + +int SSL_SESSION_set_ex_data(SSL_SESSION *ss, int idx, void *data); +void *SSL_SESSION_get_ex_data(const SSL_SESSION *ss, int idx); +int SSL_SESSION_get_ex_new_index(long argl, void *argp, + CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, + CRYPTO_EX_free *free_func); + +int SSL_CTX_set_ex_data(SSL_CTX *ssl, int idx, void *data); +void *SSL_CTX_get_ex_data(const SSL_CTX *ssl, int idx); +int SSL_CTX_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, + CRYPTO_EX_free *free_func); + +int SSL_get_ex_data_X509_STORE_CTX_idx(void); + +# define SSL_CTX_sess_set_cache_size(ctx,t) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_SESS_CACHE_SIZE,t,NULL) +# define SSL_CTX_sess_get_cache_size(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_GET_SESS_CACHE_SIZE,0,NULL) +# define SSL_CTX_set_session_cache_mode(ctx,m) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_SESS_CACHE_MODE,m,NULL) +# define SSL_CTX_get_session_cache_mode(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_GET_SESS_CACHE_MODE,0,NULL) + +# define SSL_CTX_get_default_read_ahead(ctx) SSL_CTX_get_read_ahead(ctx) +# define SSL_CTX_set_default_read_ahead(ctx,m) SSL_CTX_set_read_ahead(ctx,m) +# define SSL_CTX_get_read_ahead(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_GET_READ_AHEAD,0,NULL) +# define SSL_CTX_set_read_ahead(ctx,m) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_READ_AHEAD,m,NULL) +# define SSL_CTX_get_max_cert_list(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_GET_MAX_CERT_LIST,0,NULL) +# define SSL_CTX_set_max_cert_list(ctx,m) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_MAX_CERT_LIST,m,NULL) +# define SSL_get_max_cert_list(ssl) \ + SSL_ctrl(ssl,SSL_CTRL_GET_MAX_CERT_LIST,0,NULL) +# define SSL_set_max_cert_list(ssl,m) \ + SSL_ctrl(ssl,SSL_CTRL_SET_MAX_CERT_LIST,m,NULL) + +# define SSL_CTX_set_max_send_fragment(ctx,m) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_MAX_SEND_FRAGMENT,m,NULL) +# define SSL_set_max_send_fragment(ssl,m) \ + SSL_ctrl(ssl,SSL_CTRL_SET_MAX_SEND_FRAGMENT,m,NULL) + + /* NB: the keylength is only applicable when is_export is true */ +# ifndef OPENSSL_NO_RSA +void SSL_CTX_set_tmp_rsa_callback(SSL_CTX *ctx, + RSA *(*cb) (SSL *ssl, int is_export, + int keylength)); + +void SSL_set_tmp_rsa_callback(SSL *ssl, + RSA *(*cb) (SSL *ssl, int is_export, + int keylength)); +# endif +# ifndef OPENSSL_NO_DH +void SSL_CTX_set_tmp_dh_callback(SSL_CTX *ctx, + DH *(*dh) (SSL *ssl, int is_export, + int keylength)); +void SSL_set_tmp_dh_callback(SSL *ssl, + DH *(*dh) (SSL *ssl, int is_export, + int keylength)); +# endif +# ifndef OPENSSL_NO_ECDH +void SSL_CTX_set_tmp_ecdh_callback(SSL_CTX *ctx, + EC_KEY *(*ecdh) (SSL *ssl, int is_export, + int keylength)); +void SSL_set_tmp_ecdh_callback(SSL *ssl, + EC_KEY *(*ecdh) (SSL *ssl, int is_export, + int keylength)); +# endif + +# ifndef OPENSSL_NO_COMP +const COMP_METHOD *SSL_get_current_compression(SSL *s); +const COMP_METHOD *SSL_get_current_expansion(SSL *s); +const char *SSL_COMP_get_name(const COMP_METHOD *comp); +STACK_OF(SSL_COMP) *SSL_COMP_get_compression_methods(void); +STACK_OF(SSL_COMP) *SSL_COMP_set0_compression_methods(STACK_OF(SSL_COMP) + *meths); +void SSL_COMP_free_compression_methods(void); +int SSL_COMP_add_compression_method(int id, COMP_METHOD *cm); +# else +const void *SSL_get_current_compression(SSL *s); +const void *SSL_get_current_expansion(SSL *s); +const char *SSL_COMP_get_name(const void *comp); +void *SSL_COMP_get_compression_methods(void); +int SSL_COMP_add_compression_method(int id, void *cm); +# endif + +const SSL_CIPHER *SSL_CIPHER_find(SSL *ssl, const unsigned char *ptr); + +/* TLS extensions functions */ +int SSL_set_session_ticket_ext(SSL *s, void *ext_data, int ext_len); + +int SSL_set_session_ticket_ext_cb(SSL *s, tls_session_ticket_ext_cb_fn cb, + void *arg); + +/* Pre-shared secret session resumption functions */ +int SSL_set_session_secret_cb(SSL *s, + tls_session_secret_cb_fn tls_session_secret_cb, + void *arg); + +void SSL_set_debug(SSL *s, int debug); +int SSL_cache_hit(SSL *s); +int SSL_is_server(SSL *s); + +SSL_CONF_CTX *SSL_CONF_CTX_new(void); +int SSL_CONF_CTX_finish(SSL_CONF_CTX *cctx); +void SSL_CONF_CTX_free(SSL_CONF_CTX *cctx); +unsigned int SSL_CONF_CTX_set_flags(SSL_CONF_CTX *cctx, unsigned int flags); +unsigned int SSL_CONF_CTX_clear_flags(SSL_CONF_CTX *cctx, unsigned int flags); +int SSL_CONF_CTX_set1_prefix(SSL_CONF_CTX *cctx, const char *pre); + +void SSL_CONF_CTX_set_ssl(SSL_CONF_CTX *cctx, SSL *ssl); +void SSL_CONF_CTX_set_ssl_ctx(SSL_CONF_CTX *cctx, SSL_CTX *ctx); + +int SSL_CONF_cmd(SSL_CONF_CTX *cctx, const char *cmd, const char *value); +int SSL_CONF_cmd_argv(SSL_CONF_CTX *cctx, int *pargc, char ***pargv); +int SSL_CONF_cmd_value_type(SSL_CONF_CTX *cctx, const char *cmd); + +# ifndef OPENSSL_NO_SSL_TRACE +void SSL_trace(int write_p, int version, int content_type, + const void *buf, size_t len, SSL *ssl, void *arg); +const char *SSL_CIPHER_standard_name(const SSL_CIPHER *c); +# endif + +# ifndef OPENSSL_NO_UNIT_TEST +const struct openssl_ssl_test_functions *SSL_test_functions(void); +# endif + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_SSL_strings(void); + +/* Error codes for the SSL functions. */ + +/* Function codes. */ +# define SSL_F_CHECK_SUITEB_CIPHER_LIST 331 +# define SSL_F_CLIENT_CERTIFICATE 100 +# define SSL_F_CLIENT_FINISHED 167 +# define SSL_F_CLIENT_HELLO 101 +# define SSL_F_CLIENT_MASTER_KEY 102 +# define SSL_F_D2I_SSL_SESSION 103 +# define SSL_F_DO_DTLS1_WRITE 245 +# define SSL_F_DO_SSL3_WRITE 104 +# define SSL_F_DTLS1_ACCEPT 246 +# define SSL_F_DTLS1_ADD_CERT_TO_BUF 295 +# define SSL_F_DTLS1_BUFFER_RECORD 247 +# define SSL_F_DTLS1_CHECK_TIMEOUT_NUM 316 +# define SSL_F_DTLS1_CLIENT_HELLO 248 +# define SSL_F_DTLS1_CONNECT 249 +# define SSL_F_DTLS1_ENC 250 +# define SSL_F_DTLS1_GET_HELLO_VERIFY 251 +# define SSL_F_DTLS1_GET_MESSAGE 252 +# define SSL_F_DTLS1_GET_MESSAGE_FRAGMENT 253 +# define SSL_F_DTLS1_GET_RECORD 254 +# define SSL_F_DTLS1_HANDLE_TIMEOUT 297 +# define SSL_F_DTLS1_HEARTBEAT 305 +# define SSL_F_DTLS1_OUTPUT_CERT_CHAIN 255 +# define SSL_F_DTLS1_PREPROCESS_FRAGMENT 288 +# define SSL_F_DTLS1_PROCESS_OUT_OF_SEQ_MESSAGE 256 +# define SSL_F_DTLS1_PROCESS_RECORD 257 +# define SSL_F_DTLS1_READ_BYTES 258 +# define SSL_F_DTLS1_READ_FAILED 259 +# define SSL_F_DTLS1_SEND_CERTIFICATE_REQUEST 260 +# define SSL_F_DTLS1_SEND_CLIENT_CERTIFICATE 261 +# define SSL_F_DTLS1_SEND_CLIENT_KEY_EXCHANGE 262 +# define SSL_F_DTLS1_SEND_CLIENT_VERIFY 263 +# define SSL_F_DTLS1_SEND_HELLO_VERIFY_REQUEST 264 +# define SSL_F_DTLS1_SEND_SERVER_CERTIFICATE 265 +# define SSL_F_DTLS1_SEND_SERVER_HELLO 266 +# define SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE 267 +# define SSL_F_DTLS1_WRITE_APP_DATA_BYTES 268 +# define SSL_F_GET_CLIENT_FINISHED 105 +# define SSL_F_GET_CLIENT_HELLO 106 +# define SSL_F_GET_CLIENT_MASTER_KEY 107 +# define SSL_F_GET_SERVER_FINISHED 108 +# define SSL_F_GET_SERVER_HELLO 109 +# define SSL_F_GET_SERVER_VERIFY 110 +# define SSL_F_I2D_SSL_SESSION 111 +# define SSL_F_READ_N 112 +# define SSL_F_REQUEST_CERTIFICATE 113 +# define SSL_F_SERVER_FINISH 239 +# define SSL_F_SERVER_HELLO 114 +# define SSL_F_SERVER_VERIFY 240 +# define SSL_F_SSL23_ACCEPT 115 +# define SSL_F_SSL23_CLIENT_HELLO 116 +# define SSL_F_SSL23_CONNECT 117 +# define SSL_F_SSL23_GET_CLIENT_HELLO 118 +# define SSL_F_SSL23_GET_SERVER_HELLO 119 +# define SSL_F_SSL23_PEEK 237 +# define SSL_F_SSL23_READ 120 +# define SSL_F_SSL23_WRITE 121 +# define SSL_F_SSL2_ACCEPT 122 +# define SSL_F_SSL2_CONNECT 123 +# define SSL_F_SSL2_ENC_INIT 124 +# define SSL_F_SSL2_GENERATE_KEY_MATERIAL 241 +# define SSL_F_SSL2_PEEK 234 +# define SSL_F_SSL2_READ 125 +# define SSL_F_SSL2_READ_INTERNAL 236 +# define SSL_F_SSL2_SET_CERTIFICATE 126 +# define SSL_F_SSL2_WRITE 127 +# define SSL_F_SSL3_ACCEPT 128 +# define SSL_F_SSL3_ADD_CERT_TO_BUF 296 +# define SSL_F_SSL3_CALLBACK_CTRL 233 +# define SSL_F_SSL3_CHANGE_CIPHER_STATE 129 +# define SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM 130 +# define SSL_F_SSL3_CHECK_CLIENT_HELLO 304 +# define SSL_F_SSL3_CLIENT_HELLO 131 +# define SSL_F_SSL3_CONNECT 132 +# define SSL_F_SSL3_CTRL 213 +# define SSL_F_SSL3_CTX_CTRL 133 +# define SSL_F_SSL3_DIGEST_CACHED_RECORDS 293 +# define SSL_F_SSL3_DO_CHANGE_CIPHER_SPEC 292 +# define SSL_F_SSL3_ENC 134 +# define SSL_F_SSL3_GENERATE_KEY_BLOCK 238 +# define SSL_F_SSL3_GET_CERTIFICATE_REQUEST 135 +# define SSL_F_SSL3_GET_CERT_STATUS 289 +# define SSL_F_SSL3_GET_CERT_VERIFY 136 +# define SSL_F_SSL3_GET_CLIENT_CERTIFICATE 137 +# define SSL_F_SSL3_GET_CLIENT_HELLO 138 +# define SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE 139 +# define SSL_F_SSL3_GET_FINISHED 140 +# define SSL_F_SSL3_GET_KEY_EXCHANGE 141 +# define SSL_F_SSL3_GET_MESSAGE 142 +# define SSL_F_SSL3_GET_NEW_SESSION_TICKET 283 +# define SSL_F_SSL3_GET_NEXT_PROTO 306 +# define SSL_F_SSL3_GET_RECORD 143 +# define SSL_F_SSL3_GET_SERVER_CERTIFICATE 144 +# define SSL_F_SSL3_GET_SERVER_DONE 145 +# define SSL_F_SSL3_GET_SERVER_HELLO 146 +# define SSL_F_SSL3_HANDSHAKE_MAC 285 +# define SSL_F_SSL3_NEW_SESSION_TICKET 287 +# define SSL_F_SSL3_OUTPUT_CERT_CHAIN 147 +# define SSL_F_SSL3_PEEK 235 +# define SSL_F_SSL3_READ_BYTES 148 +# define SSL_F_SSL3_READ_N 149 +# define SSL_F_SSL3_SEND_CERTIFICATE_REQUEST 150 +# define SSL_F_SSL3_SEND_CLIENT_CERTIFICATE 151 +# define SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE 152 +# define SSL_F_SSL3_SEND_CLIENT_VERIFY 153 +# define SSL_F_SSL3_SEND_SERVER_CERTIFICATE 154 +# define SSL_F_SSL3_SEND_SERVER_HELLO 242 +# define SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE 155 +# define SSL_F_SSL3_SETUP_KEY_BLOCK 157 +# define SSL_F_SSL3_SETUP_READ_BUFFER 156 +# define SSL_F_SSL3_SETUP_WRITE_BUFFER 291 +# define SSL_F_SSL3_WRITE_BYTES 158 +# define SSL_F_SSL3_WRITE_PENDING 159 +# define SSL_F_SSL_ADD_CERT_CHAIN 318 +# define SSL_F_SSL_ADD_CERT_TO_BUF 319 +# define SSL_F_SSL_ADD_CLIENTHELLO_RENEGOTIATE_EXT 298 +# define SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT 277 +# define SSL_F_SSL_ADD_CLIENTHELLO_USE_SRTP_EXT 307 +# define SSL_F_SSL_ADD_DIR_CERT_SUBJECTS_TO_STACK 215 +# define SSL_F_SSL_ADD_FILE_CERT_SUBJECTS_TO_STACK 216 +# define SSL_F_SSL_ADD_SERVERHELLO_RENEGOTIATE_EXT 299 +# define SSL_F_SSL_ADD_SERVERHELLO_TLSEXT 278 +# define SSL_F_SSL_ADD_SERVERHELLO_USE_SRTP_EXT 308 +# define SSL_F_SSL_BAD_METHOD 160 +# define SSL_F_SSL_BUILD_CERT_CHAIN 332 +# define SSL_F_SSL_BYTES_TO_CIPHER_LIST 161 +# define SSL_F_SSL_CERT_DUP 221 +# define SSL_F_SSL_CERT_INST 222 +# define SSL_F_SSL_CERT_INSTANTIATE 214 +# define SSL_F_SSL_CERT_NEW 162 +# define SSL_F_SSL_CHECK_PRIVATE_KEY 163 +# define SSL_F_SSL_CHECK_SERVERHELLO_TLSEXT 280 +# define SSL_F_SSL_CHECK_SRVR_ECC_CERT_AND_ALG 279 +# define SSL_F_SSL_CIPHER_PROCESS_RULESTR 230 +# define SSL_F_SSL_CIPHER_STRENGTH_SORT 231 +# define SSL_F_SSL_CLEAR 164 +# define SSL_F_SSL_COMP_ADD_COMPRESSION_METHOD 165 +# define SSL_F_SSL_CONF_CMD 334 +# define SSL_F_SSL_CREATE_CIPHER_LIST 166 +# define SSL_F_SSL_CTRL 232 +# define SSL_F_SSL_CTX_CHECK_PRIVATE_KEY 168 +# define SSL_F_SSL_CTX_MAKE_PROFILES 309 +# define SSL_F_SSL_CTX_NEW 169 +# define SSL_F_SSL_CTX_SET_CIPHER_LIST 269 +# define SSL_F_SSL_CTX_SET_CLIENT_CERT_ENGINE 290 +# define SSL_F_SSL_CTX_SET_PURPOSE 226 +# define SSL_F_SSL_CTX_SET_SESSION_ID_CONTEXT 219 +# define SSL_F_SSL_CTX_SET_SSL_VERSION 170 +# define SSL_F_SSL_CTX_SET_TRUST 229 +# define SSL_F_SSL_CTX_USE_CERTIFICATE 171 +# define SSL_F_SSL_CTX_USE_CERTIFICATE_ASN1 172 +# define SSL_F_SSL_CTX_USE_CERTIFICATE_CHAIN_FILE 220 +# define SSL_F_SSL_CTX_USE_CERTIFICATE_FILE 173 +# define SSL_F_SSL_CTX_USE_PRIVATEKEY 174 +# define SSL_F_SSL_CTX_USE_PRIVATEKEY_ASN1 175 +# define SSL_F_SSL_CTX_USE_PRIVATEKEY_FILE 176 +# define SSL_F_SSL_CTX_USE_PSK_IDENTITY_HINT 272 +# define SSL_F_SSL_CTX_USE_RSAPRIVATEKEY 177 +# define SSL_F_SSL_CTX_USE_RSAPRIVATEKEY_ASN1 178 +# define SSL_F_SSL_CTX_USE_RSAPRIVATEKEY_FILE 179 +# define SSL_F_SSL_CTX_USE_SERVERINFO 336 +# define SSL_F_SSL_CTX_USE_SERVERINFO_FILE 337 +# define SSL_F_SSL_DO_HANDSHAKE 180 +# define SSL_F_SSL_GET_NEW_SESSION 181 +# define SSL_F_SSL_GET_PREV_SESSION 217 +# define SSL_F_SSL_GET_SERVER_CERT_INDEX 322 +# define SSL_F_SSL_GET_SERVER_SEND_CERT 182 +# define SSL_F_SSL_GET_SERVER_SEND_PKEY 317 +# define SSL_F_SSL_GET_SIGN_PKEY 183 +# define SSL_F_SSL_INIT_WBIO_BUFFER 184 +# define SSL_F_SSL_LOAD_CLIENT_CA_FILE 185 +# define SSL_F_SSL_NEW 186 +# define SSL_F_SSL_PARSE_CLIENTHELLO_RENEGOTIATE_EXT 300 +# define SSL_F_SSL_PARSE_CLIENTHELLO_TLSEXT 302 +# define SSL_F_SSL_PARSE_CLIENTHELLO_USE_SRTP_EXT 310 +# define SSL_F_SSL_PARSE_SERVERHELLO_RENEGOTIATE_EXT 301 +# define SSL_F_SSL_PARSE_SERVERHELLO_TLSEXT 303 +# define SSL_F_SSL_PARSE_SERVERHELLO_USE_SRTP_EXT 311 +# define SSL_F_SSL_PEEK 270 +# define SSL_F_SSL_PREPARE_CLIENTHELLO_TLSEXT 281 +# define SSL_F_SSL_PREPARE_SERVERHELLO_TLSEXT 282 +# define SSL_F_SSL_READ 223 +# define SSL_F_SSL_RSA_PRIVATE_DECRYPT 187 +# define SSL_F_SSL_RSA_PUBLIC_ENCRYPT 188 +# define SSL_F_SSL_SCAN_CLIENTHELLO_TLSEXT 320 +# define SSL_F_SSL_SCAN_SERVERHELLO_TLSEXT 321 +# define SSL_F_SSL_SESSION_NEW 189 +# define SSL_F_SSL_SESSION_PRINT_FP 190 +# define SSL_F_SSL_SESSION_SET1_ID_CONTEXT 312 +# define SSL_F_SSL_SESS_CERT_NEW 225 +# define SSL_F_SSL_SET_CERT 191 +# define SSL_F_SSL_SET_CIPHER_LIST 271 +# define SSL_F_SSL_SET_FD 192 +# define SSL_F_SSL_SET_PKEY 193 +# define SSL_F_SSL_SET_PURPOSE 227 +# define SSL_F_SSL_SET_RFD 194 +# define SSL_F_SSL_SET_SESSION 195 +# define SSL_F_SSL_SET_SESSION_ID_CONTEXT 218 +# define SSL_F_SSL_SET_SESSION_TICKET_EXT 294 +# define SSL_F_SSL_SET_TRUST 228 +# define SSL_F_SSL_SET_WFD 196 +# define SSL_F_SSL_SHUTDOWN 224 +# define SSL_F_SSL_SRP_CTX_INIT 313 +# define SSL_F_SSL_UNDEFINED_CONST_FUNCTION 243 +# define SSL_F_SSL_UNDEFINED_FUNCTION 197 +# define SSL_F_SSL_UNDEFINED_VOID_FUNCTION 244 +# define SSL_F_SSL_USE_CERTIFICATE 198 +# define SSL_F_SSL_USE_CERTIFICATE_ASN1 199 +# define SSL_F_SSL_USE_CERTIFICATE_FILE 200 +# define SSL_F_SSL_USE_PRIVATEKEY 201 +# define SSL_F_SSL_USE_PRIVATEKEY_ASN1 202 +# define SSL_F_SSL_USE_PRIVATEKEY_FILE 203 +# define SSL_F_SSL_USE_PSK_IDENTITY_HINT 273 +# define SSL_F_SSL_USE_RSAPRIVATEKEY 204 +# define SSL_F_SSL_USE_RSAPRIVATEKEY_ASN1 205 +# define SSL_F_SSL_USE_RSAPRIVATEKEY_FILE 206 +# define SSL_F_SSL_VERIFY_CERT_CHAIN 207 +# define SSL_F_SSL_WRITE 208 +# define SSL_F_TLS12_CHECK_PEER_SIGALG 333 +# define SSL_F_TLS1_CERT_VERIFY_MAC 286 +# define SSL_F_TLS1_CHANGE_CIPHER_STATE 209 +# define SSL_F_TLS1_CHECK_SERVERHELLO_TLSEXT 274 +# define SSL_F_TLS1_ENC 210 +# define SSL_F_TLS1_EXPORT_KEYING_MATERIAL 314 +# define SSL_F_TLS1_GET_CURVELIST 338 +# define SSL_F_TLS1_HEARTBEAT 315 +# define SSL_F_TLS1_PREPARE_CLIENTHELLO_TLSEXT 275 +# define SSL_F_TLS1_PREPARE_SERVERHELLO_TLSEXT 276 +# define SSL_F_TLS1_PRF 284 +# define SSL_F_TLS1_SETUP_KEY_BLOCK 211 +# define SSL_F_TLS1_SET_SERVER_SIGALGS 335 +# define SSL_F_WRITE_PENDING 212 + +/* Reason codes. */ +# define SSL_R_APP_DATA_IN_HANDSHAKE 100 +# define SSL_R_ATTEMPT_TO_REUSE_SESSION_IN_DIFFERENT_CONTEXT 272 +# define SSL_R_BAD_ALERT_RECORD 101 +# define SSL_R_BAD_AUTHENTICATION_TYPE 102 +# define SSL_R_BAD_CHANGE_CIPHER_SPEC 103 +# define SSL_R_BAD_CHECKSUM 104 +# define SSL_R_BAD_DATA 390 +# define SSL_R_BAD_DATA_RETURNED_BY_CALLBACK 106 +# define SSL_R_BAD_DECOMPRESSION 107 +# define SSL_R_BAD_DH_G_LENGTH 108 +# define SSL_R_BAD_DH_PUB_KEY_LENGTH 109 +# define SSL_R_BAD_DH_P_LENGTH 110 +# define SSL_R_BAD_DIGEST_LENGTH 111 +# define SSL_R_BAD_DSA_SIGNATURE 112 +# define SSL_R_BAD_ECC_CERT 304 +# define SSL_R_BAD_ECDSA_SIGNATURE 305 +# define SSL_R_BAD_ECPOINT 306 +# define SSL_R_BAD_HANDSHAKE_LENGTH 332 +# define SSL_R_BAD_HELLO_REQUEST 105 +# define SSL_R_BAD_LENGTH 271 +# define SSL_R_BAD_MAC_DECODE 113 +# define SSL_R_BAD_MAC_LENGTH 333 +# define SSL_R_BAD_MESSAGE_TYPE 114 +# define SSL_R_BAD_PACKET_LENGTH 115 +# define SSL_R_BAD_PROTOCOL_VERSION_NUMBER 116 +# define SSL_R_BAD_PSK_IDENTITY_HINT_LENGTH 316 +# define SSL_R_BAD_RESPONSE_ARGUMENT 117 +# define SSL_R_BAD_RSA_DECRYPT 118 +# define SSL_R_BAD_RSA_ENCRYPT 119 +# define SSL_R_BAD_RSA_E_LENGTH 120 +# define SSL_R_BAD_RSA_MODULUS_LENGTH 121 +# define SSL_R_BAD_RSA_SIGNATURE 122 +# define SSL_R_BAD_SIGNATURE 123 +# define SSL_R_BAD_SRP_A_LENGTH 347 +# define SSL_R_BAD_SRP_B_LENGTH 348 +# define SSL_R_BAD_SRP_G_LENGTH 349 +# define SSL_R_BAD_SRP_N_LENGTH 350 +# define SSL_R_BAD_SRP_PARAMETERS 371 +# define SSL_R_BAD_SRP_S_LENGTH 351 +# define SSL_R_BAD_SRTP_MKI_VALUE 352 +# define SSL_R_BAD_SRTP_PROTECTION_PROFILE_LIST 353 +# define SSL_R_BAD_SSL_FILETYPE 124 +# define SSL_R_BAD_SSL_SESSION_ID_LENGTH 125 +# define SSL_R_BAD_STATE 126 +# define SSL_R_BAD_VALUE 384 +# define SSL_R_BAD_WRITE_RETRY 127 +# define SSL_R_BIO_NOT_SET 128 +# define SSL_R_BLOCK_CIPHER_PAD_IS_WRONG 129 +# define SSL_R_BN_LIB 130 +# define SSL_R_CA_DN_LENGTH_MISMATCH 131 +# define SSL_R_CA_DN_TOO_LONG 132 +# define SSL_R_CCS_RECEIVED_EARLY 133 +# define SSL_R_CERTIFICATE_VERIFY_FAILED 134 +# define SSL_R_CERT_CB_ERROR 377 +# define SSL_R_CERT_LENGTH_MISMATCH 135 +# define SSL_R_CHALLENGE_IS_DIFFERENT 136 +# define SSL_R_CIPHER_CODE_WRONG_LENGTH 137 +# define SSL_R_CIPHER_OR_HASH_UNAVAILABLE 138 +# define SSL_R_CIPHER_TABLE_SRC_ERROR 139 +# define SSL_R_CLIENTHELLO_TLSEXT 226 +# define SSL_R_COMPRESSED_LENGTH_TOO_LONG 140 +# define SSL_R_COMPRESSION_DISABLED 343 +# define SSL_R_COMPRESSION_FAILURE 141 +# define SSL_R_COMPRESSION_ID_NOT_WITHIN_PRIVATE_RANGE 307 +# define SSL_R_COMPRESSION_LIBRARY_ERROR 142 +# define SSL_R_CONNECTION_ID_IS_DIFFERENT 143 +# define SSL_R_CONNECTION_TYPE_NOT_SET 144 +# define SSL_R_COOKIE_MISMATCH 308 +# define SSL_R_DATA_BETWEEN_CCS_AND_FINISHED 145 +# define SSL_R_DATA_LENGTH_TOO_LONG 146 +# define SSL_R_DECRYPTION_FAILED 147 +# define SSL_R_DECRYPTION_FAILED_OR_BAD_RECORD_MAC 281 +# define SSL_R_DH_PUBLIC_VALUE_LENGTH_IS_WRONG 148 +# define SSL_R_DIGEST_CHECK_FAILED 149 +# define SSL_R_DTLS_MESSAGE_TOO_BIG 334 +# define SSL_R_DUPLICATE_COMPRESSION_ID 309 +# define SSL_R_ECC_CERT_NOT_FOR_KEY_AGREEMENT 317 +# define SSL_R_ECC_CERT_NOT_FOR_SIGNING 318 +# define SSL_R_ECC_CERT_SHOULD_HAVE_RSA_SIGNATURE 322 +# define SSL_R_ECC_CERT_SHOULD_HAVE_SHA1_SIGNATURE 323 +# define SSL_R_ECDH_REQUIRED_FOR_SUITEB_MODE 374 +# define SSL_R_ECGROUP_TOO_LARGE_FOR_CIPHER 310 +# define SSL_R_EMPTY_SRTP_PROTECTION_PROFILE_LIST 354 +# define SSL_R_ENCRYPTED_LENGTH_TOO_LONG 150 +# define SSL_R_ERROR_GENERATING_TMP_RSA_KEY 282 +# define SSL_R_ERROR_IN_RECEIVED_CIPHER_LIST 151 +# define SSL_R_EXCESSIVE_MESSAGE_SIZE 152 +# define SSL_R_EXTRA_DATA_IN_MESSAGE 153 +# define SSL_R_GOT_A_FIN_BEFORE_A_CCS 154 +# define SSL_R_GOT_NEXT_PROTO_BEFORE_A_CCS 355 +# define SSL_R_GOT_NEXT_PROTO_WITHOUT_EXTENSION 356 +# define SSL_R_HTTPS_PROXY_REQUEST 155 +# define SSL_R_HTTP_REQUEST 156 +# define SSL_R_ILLEGAL_PADDING 283 +# define SSL_R_ILLEGAL_SUITEB_DIGEST 380 +# define SSL_R_INAPPROPRIATE_FALLBACK 373 +# define SSL_R_INCONSISTENT_COMPRESSION 340 +# define SSL_R_INVALID_CHALLENGE_LENGTH 158 +# define SSL_R_INVALID_COMMAND 280 +# define SSL_R_INVALID_COMPRESSION_ALGORITHM 341 +# define SSL_R_INVALID_NULL_CMD_NAME 385 +# define SSL_R_INVALID_PURPOSE 278 +# define SSL_R_INVALID_SERVERINFO_DATA 388 +# define SSL_R_INVALID_SRP_USERNAME 357 +# define SSL_R_INVALID_STATUS_RESPONSE 328 +# define SSL_R_INVALID_TICKET_KEYS_LENGTH 325 +# define SSL_R_INVALID_TRUST 279 +# define SSL_R_KEY_ARG_TOO_LONG 284 +# define SSL_R_KRB5 285 +# define SSL_R_KRB5_C_CC_PRINC 286 +# define SSL_R_KRB5_C_GET_CRED 287 +# define SSL_R_KRB5_C_INIT 288 +# define SSL_R_KRB5_C_MK_REQ 289 +# define SSL_R_KRB5_S_BAD_TICKET 290 +# define SSL_R_KRB5_S_INIT 291 +# define SSL_R_KRB5_S_RD_REQ 292 +# define SSL_R_KRB5_S_TKT_EXPIRED 293 +# define SSL_R_KRB5_S_TKT_NYV 294 +# define SSL_R_KRB5_S_TKT_SKEW 295 +# define SSL_R_LENGTH_MISMATCH 159 +# define SSL_R_LENGTH_TOO_SHORT 160 +# define SSL_R_LIBRARY_BUG 274 +# define SSL_R_LIBRARY_HAS_NO_CIPHERS 161 +# define SSL_R_MESSAGE_TOO_LONG 296 +# define SSL_R_MISSING_DH_DSA_CERT 162 +# define SSL_R_MISSING_DH_KEY 163 +# define SSL_R_MISSING_DH_RSA_CERT 164 +# define SSL_R_MISSING_DSA_SIGNING_CERT 165 +# define SSL_R_MISSING_ECDH_CERT 382 +# define SSL_R_MISSING_ECDSA_SIGNING_CERT 381 +# define SSL_R_MISSING_EXPORT_TMP_DH_KEY 166 +# define SSL_R_MISSING_EXPORT_TMP_RSA_KEY 167 +# define SSL_R_MISSING_RSA_CERTIFICATE 168 +# define SSL_R_MISSING_RSA_ENCRYPTING_CERT 169 +# define SSL_R_MISSING_RSA_SIGNING_CERT 170 +# define SSL_R_MISSING_SRP_PARAM 358 +# define SSL_R_MISSING_TMP_DH_KEY 171 +# define SSL_R_MISSING_TMP_ECDH_KEY 311 +# define SSL_R_MISSING_TMP_RSA_KEY 172 +# define SSL_R_MISSING_TMP_RSA_PKEY 173 +# define SSL_R_MISSING_VERIFY_MESSAGE 174 +# define SSL_R_MULTIPLE_SGC_RESTARTS 346 +# define SSL_R_NON_SSLV2_INITIAL_PACKET 175 +# define SSL_R_NO_CERTIFICATES_RETURNED 176 +# define SSL_R_NO_CERTIFICATE_ASSIGNED 177 +# define SSL_R_NO_CERTIFICATE_RETURNED 178 +# define SSL_R_NO_CERTIFICATE_SET 179 +# define SSL_R_NO_CERTIFICATE_SPECIFIED 180 +# define SSL_R_NO_CIPHERS_AVAILABLE 181 +# define SSL_R_NO_CIPHERS_PASSED 182 +# define SSL_R_NO_CIPHERS_SPECIFIED 183 +# define SSL_R_NO_CIPHER_LIST 184 +# define SSL_R_NO_CIPHER_MATCH 185 +# define SSL_R_NO_CLIENT_CERT_METHOD 331 +# define SSL_R_NO_CLIENT_CERT_RECEIVED 186 +# define SSL_R_NO_COMPRESSION_SPECIFIED 187 +# define SSL_R_NO_GOST_CERTIFICATE_SENT_BY_PEER 330 +# define SSL_R_NO_METHOD_SPECIFIED 188 +# define SSL_R_NO_PEM_EXTENSIONS 389 +# define SSL_R_NO_PRIVATEKEY 189 +# define SSL_R_NO_PRIVATE_KEY_ASSIGNED 190 +# define SSL_R_NO_PROTOCOLS_AVAILABLE 191 +# define SSL_R_NO_PUBLICKEY 192 +# define SSL_R_NO_RENEGOTIATION 339 +# define SSL_R_NO_REQUIRED_DIGEST 324 +# define SSL_R_NO_SHARED_CIPHER 193 +# define SSL_R_NO_SHARED_SIGATURE_ALGORITHMS 376 +# define SSL_R_NO_SRTP_PROFILES 359 +# define SSL_R_NO_VERIFY_CALLBACK 194 +# define SSL_R_NULL_SSL_CTX 195 +# define SSL_R_NULL_SSL_METHOD_PASSED 196 +# define SSL_R_OLD_SESSION_CIPHER_NOT_RETURNED 197 +# define SSL_R_OLD_SESSION_COMPRESSION_ALGORITHM_NOT_RETURNED 344 +# define SSL_R_ONLY_DTLS_1_2_ALLOWED_IN_SUITEB_MODE 387 +# define SSL_R_ONLY_TLS_1_2_ALLOWED_IN_SUITEB_MODE 379 +# define SSL_R_ONLY_TLS_ALLOWED_IN_FIPS_MODE 297 +# define SSL_R_OPAQUE_PRF_INPUT_TOO_LONG 327 +# define SSL_R_PACKET_LENGTH_TOO_LONG 198 +# define SSL_R_PARSE_TLSEXT 227 +# define SSL_R_PATH_TOO_LONG 270 +# define SSL_R_PEER_DID_NOT_RETURN_A_CERTIFICATE 199 +# define SSL_R_PEER_ERROR 200 +# define SSL_R_PEER_ERROR_CERTIFICATE 201 +# define SSL_R_PEER_ERROR_NO_CERTIFICATE 202 +# define SSL_R_PEER_ERROR_NO_CIPHER 203 +# define SSL_R_PEER_ERROR_UNSUPPORTED_CERTIFICATE_TYPE 204 +# define SSL_R_PEM_NAME_BAD_PREFIX 391 +# define SSL_R_PEM_NAME_TOO_SHORT 392 +# define SSL_R_PRE_MAC_LENGTH_TOO_LONG 205 +# define SSL_R_PROBLEMS_MAPPING_CIPHER_FUNCTIONS 206 +# define SSL_R_PROTOCOL_IS_SHUTDOWN 207 +# define SSL_R_PSK_IDENTITY_NOT_FOUND 223 +# define SSL_R_PSK_NO_CLIENT_CB 224 +# define SSL_R_PSK_NO_SERVER_CB 225 +# define SSL_R_PUBLIC_KEY_ENCRYPT_ERROR 208 +# define SSL_R_PUBLIC_KEY_IS_NOT_RSA 209 +# define SSL_R_PUBLIC_KEY_NOT_RSA 210 +# define SSL_R_READ_BIO_NOT_SET 211 +# define SSL_R_READ_TIMEOUT_EXPIRED 312 +# define SSL_R_READ_WRONG_PACKET_TYPE 212 +# define SSL_R_RECORD_LENGTH_MISMATCH 213 +# define SSL_R_RECORD_TOO_LARGE 214 +# define SSL_R_RECORD_TOO_SMALL 298 +# define SSL_R_RENEGOTIATE_EXT_TOO_LONG 335 +# define SSL_R_RENEGOTIATION_ENCODING_ERR 336 +# define SSL_R_RENEGOTIATION_MISMATCH 337 +# define SSL_R_REQUIRED_CIPHER_MISSING 215 +# define SSL_R_REQUIRED_COMPRESSSION_ALGORITHM_MISSING 342 +# define SSL_R_REUSE_CERT_LENGTH_NOT_ZERO 216 +# define SSL_R_REUSE_CERT_TYPE_NOT_ZERO 217 +# define SSL_R_REUSE_CIPHER_LIST_NOT_ZERO 218 +# define SSL_R_SCSV_RECEIVED_WHEN_RENEGOTIATING 345 +# define SSL_R_SERVERHELLO_TLSEXT 275 +# define SSL_R_SESSION_ID_CONTEXT_UNINITIALIZED 277 +# define SSL_R_SHORT_READ 219 +# define SSL_R_SIGNATURE_ALGORITHMS_ERROR 360 +# define SSL_R_SIGNATURE_FOR_NON_SIGNING_CERTIFICATE 220 +# define SSL_R_SRP_A_CALC 361 +# define SSL_R_SRTP_COULD_NOT_ALLOCATE_PROFILES 362 +# define SSL_R_SRTP_PROTECTION_PROFILE_LIST_TOO_LONG 363 +# define SSL_R_SRTP_UNKNOWN_PROTECTION_PROFILE 364 +# define SSL_R_SSL23_DOING_SESSION_ID_REUSE 221 +# define SSL_R_SSL2_CONNECTION_ID_TOO_LONG 299 +# define SSL_R_SSL3_EXT_INVALID_ECPOINTFORMAT 321 +# define SSL_R_SSL3_EXT_INVALID_SERVERNAME 319 +# define SSL_R_SSL3_EXT_INVALID_SERVERNAME_TYPE 320 +# define SSL_R_SSL3_SESSION_ID_TOO_LONG 300 +# define SSL_R_SSL3_SESSION_ID_TOO_SHORT 222 +# define SSL_R_SSLV3_ALERT_BAD_CERTIFICATE 1042 +# define SSL_R_SSLV3_ALERT_BAD_RECORD_MAC 1020 +# define SSL_R_SSLV3_ALERT_CERTIFICATE_EXPIRED 1045 +# define SSL_R_SSLV3_ALERT_CERTIFICATE_REVOKED 1044 +# define SSL_R_SSLV3_ALERT_CERTIFICATE_UNKNOWN 1046 +# define SSL_R_SSLV3_ALERT_DECOMPRESSION_FAILURE 1030 +# define SSL_R_SSLV3_ALERT_HANDSHAKE_FAILURE 1040 +# define SSL_R_SSLV3_ALERT_ILLEGAL_PARAMETER 1047 +# define SSL_R_SSLV3_ALERT_NO_CERTIFICATE 1041 +# define SSL_R_SSLV3_ALERT_UNEXPECTED_MESSAGE 1010 +# define SSL_R_SSLV3_ALERT_UNSUPPORTED_CERTIFICATE 1043 +# define SSL_R_SSL_CTX_HAS_NO_DEFAULT_SSL_VERSION 228 +# define SSL_R_SSL_HANDSHAKE_FAILURE 229 +# define SSL_R_SSL_LIBRARY_HAS_NO_CIPHERS 230 +# define SSL_R_SSL_SESSION_ID_CALLBACK_FAILED 301 +# define SSL_R_SSL_SESSION_ID_CONFLICT 302 +# define SSL_R_SSL_SESSION_ID_CONTEXT_TOO_LONG 273 +# define SSL_R_SSL_SESSION_ID_HAS_BAD_LENGTH 303 +# define SSL_R_SSL_SESSION_ID_IS_DIFFERENT 231 +# define SSL_R_TLSV1_ALERT_ACCESS_DENIED 1049 +# define SSL_R_TLSV1_ALERT_DECODE_ERROR 1050 +# define SSL_R_TLSV1_ALERT_DECRYPTION_FAILED 1021 +# define SSL_R_TLSV1_ALERT_DECRYPT_ERROR 1051 +# define SSL_R_TLSV1_ALERT_EXPORT_RESTRICTION 1060 +# define SSL_R_TLSV1_ALERT_INAPPROPRIATE_FALLBACK 1086 +# define SSL_R_TLSV1_ALERT_INSUFFICIENT_SECURITY 1071 +# define SSL_R_TLSV1_ALERT_INTERNAL_ERROR 1080 +# define SSL_R_TLSV1_ALERT_NO_RENEGOTIATION 1100 +# define SSL_R_TLSV1_ALERT_PROTOCOL_VERSION 1070 +# define SSL_R_TLSV1_ALERT_RECORD_OVERFLOW 1022 +# define SSL_R_TLSV1_ALERT_UNKNOWN_CA 1048 +# define SSL_R_TLSV1_ALERT_USER_CANCELLED 1090 +# define SSL_R_TLSV1_BAD_CERTIFICATE_HASH_VALUE 1114 +# define SSL_R_TLSV1_BAD_CERTIFICATE_STATUS_RESPONSE 1113 +# define SSL_R_TLSV1_CERTIFICATE_UNOBTAINABLE 1111 +# define SSL_R_TLSV1_UNRECOGNIZED_NAME 1112 +# define SSL_R_TLSV1_UNSUPPORTED_EXTENSION 1110 +# define SSL_R_TLS_CLIENT_CERT_REQ_WITH_ANON_CIPHER 232 +# define SSL_R_TLS_HEARTBEAT_PEER_DOESNT_ACCEPT 365 +# define SSL_R_TLS_HEARTBEAT_PENDING 366 +# define SSL_R_TLS_ILLEGAL_EXPORTER_LABEL 367 +# define SSL_R_TLS_INVALID_ECPOINTFORMAT_LIST 157 +# define SSL_R_TLS_PEER_DID_NOT_RESPOND_WITH_CERTIFICATE_LIST 233 +# define SSL_R_TLS_RSA_ENCRYPTED_VALUE_LENGTH_IS_WRONG 234 +# define SSL_R_TRIED_TO_USE_UNSUPPORTED_CIPHER 235 +# define SSL_R_UNABLE_TO_DECODE_DH_CERTS 236 +# define SSL_R_UNABLE_TO_DECODE_ECDH_CERTS 313 +# define SSL_R_UNABLE_TO_EXTRACT_PUBLIC_KEY 237 +# define SSL_R_UNABLE_TO_FIND_DH_PARAMETERS 238 +# define SSL_R_UNABLE_TO_FIND_ECDH_PARAMETERS 314 +# define SSL_R_UNABLE_TO_FIND_PUBLIC_KEY_PARAMETERS 239 +# define SSL_R_UNABLE_TO_FIND_SSL_METHOD 240 +# define SSL_R_UNABLE_TO_LOAD_SSL2_MD5_ROUTINES 241 +# define SSL_R_UNABLE_TO_LOAD_SSL3_MD5_ROUTINES 242 +# define SSL_R_UNABLE_TO_LOAD_SSL3_SHA1_ROUTINES 243 +# define SSL_R_UNEXPECTED_MESSAGE 244 +# define SSL_R_UNEXPECTED_RECORD 245 +# define SSL_R_UNINITIALIZED 276 +# define SSL_R_UNKNOWN_ALERT_TYPE 246 +# define SSL_R_UNKNOWN_CERTIFICATE_TYPE 247 +# define SSL_R_UNKNOWN_CIPHER_RETURNED 248 +# define SSL_R_UNKNOWN_CIPHER_TYPE 249 +# define SSL_R_UNKNOWN_CMD_NAME 386 +# define SSL_R_UNKNOWN_DIGEST 368 +# define SSL_R_UNKNOWN_KEY_EXCHANGE_TYPE 250 +# define SSL_R_UNKNOWN_PKEY_TYPE 251 +# define SSL_R_UNKNOWN_PROTOCOL 252 +# define SSL_R_UNKNOWN_REMOTE_ERROR_TYPE 253 +# define SSL_R_UNKNOWN_SSL_VERSION 254 +# define SSL_R_UNKNOWN_STATE 255 +# define SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED 338 +# define SSL_R_UNSUPPORTED_CIPHER 256 +# define SSL_R_UNSUPPORTED_COMPRESSION_ALGORITHM 257 +# define SSL_R_UNSUPPORTED_DIGEST_TYPE 326 +# define SSL_R_UNSUPPORTED_ELLIPTIC_CURVE 315 +# define SSL_R_UNSUPPORTED_PROTOCOL 258 +# define SSL_R_UNSUPPORTED_SSL_VERSION 259 +# define SSL_R_UNSUPPORTED_STATUS_TYPE 329 +# define SSL_R_USE_SRTP_NOT_NEGOTIATED 369 +# define SSL_R_WRITE_BIO_NOT_SET 260 +# define SSL_R_WRONG_CERTIFICATE_TYPE 383 +# define SSL_R_WRONG_CIPHER_RETURNED 261 +# define SSL_R_WRONG_CURVE 378 +# define SSL_R_WRONG_MESSAGE_TYPE 262 +# define SSL_R_WRONG_NUMBER_OF_KEY_BITS 263 +# define SSL_R_WRONG_SIGNATURE_LENGTH 264 +# define SSL_R_WRONG_SIGNATURE_SIZE 265 +# define SSL_R_WRONG_SIGNATURE_TYPE 370 +# define SSL_R_WRONG_SSL_VERSION 266 +# define SSL_R_WRONG_VERSION_NUMBER 267 +# define SSL_R_X509_LIB 268 +# define SSL_R_X509_VERIFICATION_SETUP_PROBLEMS 269 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/ext/openssl-osx/include/openssl/ssl2.h b/ext/openssl-osx/include/openssl/ssl2.h new file mode 100644 index 00000000..03c7dd8c --- /dev/null +++ b/ext/openssl-osx/include/openssl/ssl2.h @@ -0,0 +1,265 @@ +/* ssl/ssl2.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_SSL2_H +# define HEADER_SSL2_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Protocol Version Codes */ +# define SSL2_VERSION 0x0002 +# define SSL2_VERSION_MAJOR 0x00 +# define SSL2_VERSION_MINOR 0x02 +/* #define SSL2_CLIENT_VERSION 0x0002 */ +/* #define SSL2_SERVER_VERSION 0x0002 */ + +/* Protocol Message Codes */ +# define SSL2_MT_ERROR 0 +# define SSL2_MT_CLIENT_HELLO 1 +# define SSL2_MT_CLIENT_MASTER_KEY 2 +# define SSL2_MT_CLIENT_FINISHED 3 +# define SSL2_MT_SERVER_HELLO 4 +# define SSL2_MT_SERVER_VERIFY 5 +# define SSL2_MT_SERVER_FINISHED 6 +# define SSL2_MT_REQUEST_CERTIFICATE 7 +# define SSL2_MT_CLIENT_CERTIFICATE 8 + +/* Error Message Codes */ +# define SSL2_PE_UNDEFINED_ERROR 0x0000 +# define SSL2_PE_NO_CIPHER 0x0001 +# define SSL2_PE_NO_CERTIFICATE 0x0002 +# define SSL2_PE_BAD_CERTIFICATE 0x0004 +# define SSL2_PE_UNSUPPORTED_CERTIFICATE_TYPE 0x0006 + +/* Cipher Kind Values */ +# define SSL2_CK_NULL_WITH_MD5 0x02000000/* v3 */ +# define SSL2_CK_RC4_128_WITH_MD5 0x02010080 +# define SSL2_CK_RC4_128_EXPORT40_WITH_MD5 0x02020080 +# define SSL2_CK_RC2_128_CBC_WITH_MD5 0x02030080 +# define SSL2_CK_RC2_128_CBC_EXPORT40_WITH_MD5 0x02040080 +# define SSL2_CK_IDEA_128_CBC_WITH_MD5 0x02050080 +# define SSL2_CK_DES_64_CBC_WITH_MD5 0x02060040 +# define SSL2_CK_DES_64_CBC_WITH_SHA 0x02060140/* v3 */ +# define SSL2_CK_DES_192_EDE3_CBC_WITH_MD5 0x020700c0 +# define SSL2_CK_DES_192_EDE3_CBC_WITH_SHA 0x020701c0/* v3 */ +# define SSL2_CK_RC4_64_WITH_MD5 0x02080080/* MS hack */ + +# define SSL2_CK_DES_64_CFB64_WITH_MD5_1 0x02ff0800/* SSLeay */ +# define SSL2_CK_NULL 0x02ff0810/* SSLeay */ + +# define SSL2_TXT_DES_64_CFB64_WITH_MD5_1 "DES-CFB-M1" +# define SSL2_TXT_NULL_WITH_MD5 "NULL-MD5" +# define SSL2_TXT_RC4_128_WITH_MD5 "RC4-MD5" +# define SSL2_TXT_RC4_128_EXPORT40_WITH_MD5 "EXP-RC4-MD5" +# define SSL2_TXT_RC2_128_CBC_WITH_MD5 "RC2-CBC-MD5" +# define SSL2_TXT_RC2_128_CBC_EXPORT40_WITH_MD5 "EXP-RC2-CBC-MD5" +# define SSL2_TXT_IDEA_128_CBC_WITH_MD5 "IDEA-CBC-MD5" +# define SSL2_TXT_DES_64_CBC_WITH_MD5 "DES-CBC-MD5" +# define SSL2_TXT_DES_64_CBC_WITH_SHA "DES-CBC-SHA" +# define SSL2_TXT_DES_192_EDE3_CBC_WITH_MD5 "DES-CBC3-MD5" +# define SSL2_TXT_DES_192_EDE3_CBC_WITH_SHA "DES-CBC3-SHA" +# define SSL2_TXT_RC4_64_WITH_MD5 "RC4-64-MD5" + +# define SSL2_TXT_NULL "NULL" + +/* Flags for the SSL_CIPHER.algorithm2 field */ +# define SSL2_CF_5_BYTE_ENC 0x01 +# define SSL2_CF_8_BYTE_ENC 0x02 + +/* Certificate Type Codes */ +# define SSL2_CT_X509_CERTIFICATE 0x01 + +/* Authentication Type Code */ +# define SSL2_AT_MD5_WITH_RSA_ENCRYPTION 0x01 + +# define SSL2_MAX_SSL_SESSION_ID_LENGTH 32 + +/* Upper/Lower Bounds */ +# define SSL2_MAX_MASTER_KEY_LENGTH_IN_BITS 256 +# ifdef OPENSSL_SYS_MPE +# define SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER 29998u +# else +# define SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER 32767u + /* 2^15-1 */ +# endif +# define SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER 16383/* 2^14-1 */ + +# define SSL2_CHALLENGE_LENGTH 16 +/* + * #define SSL2_CHALLENGE_LENGTH 32 + */ +# define SSL2_MIN_CHALLENGE_LENGTH 16 +# define SSL2_MAX_CHALLENGE_LENGTH 32 +# define SSL2_CONNECTION_ID_LENGTH 16 +# define SSL2_MAX_CONNECTION_ID_LENGTH 16 +# define SSL2_SSL_SESSION_ID_LENGTH 16 +# define SSL2_MAX_CERT_CHALLENGE_LENGTH 32 +# define SSL2_MIN_CERT_CHALLENGE_LENGTH 16 +# define SSL2_MAX_KEY_MATERIAL_LENGTH 24 + +# ifndef HEADER_SSL_LOCL_H +# define CERT char +# endif + +# ifndef OPENSSL_NO_SSL_INTERN + +typedef struct ssl2_state_st { + int three_byte_header; + int clear_text; /* clear text */ + int escape; /* not used in SSLv2 */ + int ssl2_rollback; /* used if SSLv23 rolled back to SSLv2 */ + /* + * non-blocking io info, used to make sure the same args were passwd + */ + unsigned int wnum; /* number of bytes sent so far */ + int wpend_tot; + const unsigned char *wpend_buf; + int wpend_off; /* offset to data to write */ + int wpend_len; /* number of bytes passwd to write */ + int wpend_ret; /* number of bytes to return to caller */ + /* buffer raw data */ + int rbuf_left; + int rbuf_offs; + unsigned char *rbuf; + unsigned char *wbuf; + unsigned char *write_ptr; /* used to point to the start due to 2/3 byte + * header. */ + unsigned int padding; + unsigned int rlength; /* passed to ssl2_enc */ + int ract_data_length; /* Set when things are encrypted. */ + unsigned int wlength; /* passed to ssl2_enc */ + int wact_data_length; /* Set when things are decrypted. */ + unsigned char *ract_data; + unsigned char *wact_data; + unsigned char *mac_data; + unsigned char *read_key; + unsigned char *write_key; + /* Stuff specifically to do with this SSL session */ + unsigned int challenge_length; + unsigned char challenge[SSL2_MAX_CHALLENGE_LENGTH]; + unsigned int conn_id_length; + unsigned char conn_id[SSL2_MAX_CONNECTION_ID_LENGTH]; + unsigned int key_material_length; + unsigned char key_material[SSL2_MAX_KEY_MATERIAL_LENGTH * 2]; + unsigned long read_sequence; + unsigned long write_sequence; + struct { + unsigned int conn_id_length; + unsigned int cert_type; + unsigned int cert_length; + unsigned int csl; + unsigned int clear; + unsigned int enc; + unsigned char ccl[SSL2_MAX_CERT_CHALLENGE_LENGTH]; + unsigned int cipher_spec_length; + unsigned int session_id_length; + unsigned int clen; + unsigned int rlen; + } tmp; +} SSL2_STATE; + +# endif + +/* SSLv2 */ +/* client */ +# define SSL2_ST_SEND_CLIENT_HELLO_A (0x10|SSL_ST_CONNECT) +# define SSL2_ST_SEND_CLIENT_HELLO_B (0x11|SSL_ST_CONNECT) +# define SSL2_ST_GET_SERVER_HELLO_A (0x20|SSL_ST_CONNECT) +# define SSL2_ST_GET_SERVER_HELLO_B (0x21|SSL_ST_CONNECT) +# define SSL2_ST_SEND_CLIENT_MASTER_KEY_A (0x30|SSL_ST_CONNECT) +# define SSL2_ST_SEND_CLIENT_MASTER_KEY_B (0x31|SSL_ST_CONNECT) +# define SSL2_ST_SEND_CLIENT_FINISHED_A (0x40|SSL_ST_CONNECT) +# define SSL2_ST_SEND_CLIENT_FINISHED_B (0x41|SSL_ST_CONNECT) +# define SSL2_ST_SEND_CLIENT_CERTIFICATE_A (0x50|SSL_ST_CONNECT) +# define SSL2_ST_SEND_CLIENT_CERTIFICATE_B (0x51|SSL_ST_CONNECT) +# define SSL2_ST_SEND_CLIENT_CERTIFICATE_C (0x52|SSL_ST_CONNECT) +# define SSL2_ST_SEND_CLIENT_CERTIFICATE_D (0x53|SSL_ST_CONNECT) +# define SSL2_ST_GET_SERVER_VERIFY_A (0x60|SSL_ST_CONNECT) +# define SSL2_ST_GET_SERVER_VERIFY_B (0x61|SSL_ST_CONNECT) +# define SSL2_ST_GET_SERVER_FINISHED_A (0x70|SSL_ST_CONNECT) +# define SSL2_ST_GET_SERVER_FINISHED_B (0x71|SSL_ST_CONNECT) +# define SSL2_ST_CLIENT_START_ENCRYPTION (0x80|SSL_ST_CONNECT) +# define SSL2_ST_X509_GET_CLIENT_CERTIFICATE (0x90|SSL_ST_CONNECT) +/* server */ +# define SSL2_ST_GET_CLIENT_HELLO_A (0x10|SSL_ST_ACCEPT) +# define SSL2_ST_GET_CLIENT_HELLO_B (0x11|SSL_ST_ACCEPT) +# define SSL2_ST_GET_CLIENT_HELLO_C (0x12|SSL_ST_ACCEPT) +# define SSL2_ST_SEND_SERVER_HELLO_A (0x20|SSL_ST_ACCEPT) +# define SSL2_ST_SEND_SERVER_HELLO_B (0x21|SSL_ST_ACCEPT) +# define SSL2_ST_GET_CLIENT_MASTER_KEY_A (0x30|SSL_ST_ACCEPT) +# define SSL2_ST_GET_CLIENT_MASTER_KEY_B (0x31|SSL_ST_ACCEPT) +# define SSL2_ST_SEND_SERVER_VERIFY_A (0x40|SSL_ST_ACCEPT) +# define SSL2_ST_SEND_SERVER_VERIFY_B (0x41|SSL_ST_ACCEPT) +# define SSL2_ST_SEND_SERVER_VERIFY_C (0x42|SSL_ST_ACCEPT) +# define SSL2_ST_GET_CLIENT_FINISHED_A (0x50|SSL_ST_ACCEPT) +# define SSL2_ST_GET_CLIENT_FINISHED_B (0x51|SSL_ST_ACCEPT) +# define SSL2_ST_SEND_SERVER_FINISHED_A (0x60|SSL_ST_ACCEPT) +# define SSL2_ST_SEND_SERVER_FINISHED_B (0x61|SSL_ST_ACCEPT) +# define SSL2_ST_SEND_REQUEST_CERTIFICATE_A (0x70|SSL_ST_ACCEPT) +# define SSL2_ST_SEND_REQUEST_CERTIFICATE_B (0x71|SSL_ST_ACCEPT) +# define SSL2_ST_SEND_REQUEST_CERTIFICATE_C (0x72|SSL_ST_ACCEPT) +# define SSL2_ST_SEND_REQUEST_CERTIFICATE_D (0x73|SSL_ST_ACCEPT) +# define SSL2_ST_SERVER_START_ENCRYPTION (0x80|SSL_ST_ACCEPT) +# define SSL2_ST_X509_GET_SERVER_CERTIFICATE (0x90|SSL_ST_ACCEPT) + +#ifdef __cplusplus +} +#endif +#endif diff --git a/ext/openssl-osx/include/openssl/ssl23.h b/ext/openssl-osx/include/openssl/ssl23.h new file mode 100644 index 00000000..9de4685a --- /dev/null +++ b/ext/openssl-osx/include/openssl/ssl23.h @@ -0,0 +1,84 @@ +/* ssl/ssl23.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_SSL23_H +# define HEADER_SSL23_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * client + */ +/* write to server */ +# define SSL23_ST_CW_CLNT_HELLO_A (0x210|SSL_ST_CONNECT) +# define SSL23_ST_CW_CLNT_HELLO_B (0x211|SSL_ST_CONNECT) +/* read from server */ +# define SSL23_ST_CR_SRVR_HELLO_A (0x220|SSL_ST_CONNECT) +# define SSL23_ST_CR_SRVR_HELLO_B (0x221|SSL_ST_CONNECT) + +/* server */ +/* read from client */ +# define SSL23_ST_SR_CLNT_HELLO_A (0x210|SSL_ST_ACCEPT) +# define SSL23_ST_SR_CLNT_HELLO_B (0x211|SSL_ST_ACCEPT) + +#ifdef __cplusplus +} +#endif +#endif diff --git a/ext/openssl-osx/include/openssl/ssl3.h b/ext/openssl-osx/include/openssl/ssl3.h new file mode 100644 index 00000000..e681d50a --- /dev/null +++ b/ext/openssl-osx/include/openssl/ssl3.h @@ -0,0 +1,774 @@ +/* ssl/ssl3.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ +/* ==================================================================== + * Copyright (c) 1998-2002 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +/* ==================================================================== + * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. + * ECC cipher suite support in OpenSSL originally developed by + * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project. + */ + +#ifndef HEADER_SSL3_H +# define HEADER_SSL3_H + +# ifndef OPENSSL_NO_COMP +# include +# endif +# include +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Signalling cipher suite value from RFC 5746 + * (TLS_EMPTY_RENEGOTIATION_INFO_SCSV) + */ +# define SSL3_CK_SCSV 0x030000FF + +/* + * Signalling cipher suite value from draft-ietf-tls-downgrade-scsv-00 + * (TLS_FALLBACK_SCSV) + */ +# define SSL3_CK_FALLBACK_SCSV 0x03005600 + +# define SSL3_CK_RSA_NULL_MD5 0x03000001 +# define SSL3_CK_RSA_NULL_SHA 0x03000002 +# define SSL3_CK_RSA_RC4_40_MD5 0x03000003 +# define SSL3_CK_RSA_RC4_128_MD5 0x03000004 +# define SSL3_CK_RSA_RC4_128_SHA 0x03000005 +# define SSL3_CK_RSA_RC2_40_MD5 0x03000006 +# define SSL3_CK_RSA_IDEA_128_SHA 0x03000007 +# define SSL3_CK_RSA_DES_40_CBC_SHA 0x03000008 +# define SSL3_CK_RSA_DES_64_CBC_SHA 0x03000009 +# define SSL3_CK_RSA_DES_192_CBC3_SHA 0x0300000A + +# define SSL3_CK_DH_DSS_DES_40_CBC_SHA 0x0300000B +# define SSL3_CK_DH_DSS_DES_64_CBC_SHA 0x0300000C +# define SSL3_CK_DH_DSS_DES_192_CBC3_SHA 0x0300000D +# define SSL3_CK_DH_RSA_DES_40_CBC_SHA 0x0300000E +# define SSL3_CK_DH_RSA_DES_64_CBC_SHA 0x0300000F +# define SSL3_CK_DH_RSA_DES_192_CBC3_SHA 0x03000010 + +# define SSL3_CK_EDH_DSS_DES_40_CBC_SHA 0x03000011 +# define SSL3_CK_DHE_DSS_DES_40_CBC_SHA SSL3_CK_EDH_DSS_DES_40_CBC_SHA +# define SSL3_CK_EDH_DSS_DES_64_CBC_SHA 0x03000012 +# define SSL3_CK_DHE_DSS_DES_64_CBC_SHA SSL3_CK_EDH_DSS_DES_64_CBC_SHA +# define SSL3_CK_EDH_DSS_DES_192_CBC3_SHA 0x03000013 +# define SSL3_CK_DHE_DSS_DES_192_CBC3_SHA SSL3_CK_EDH_DSS_DES_192_CBC3_SHA +# define SSL3_CK_EDH_RSA_DES_40_CBC_SHA 0x03000014 +# define SSL3_CK_DHE_RSA_DES_40_CBC_SHA SSL3_CK_EDH_RSA_DES_40_CBC_SHA +# define SSL3_CK_EDH_RSA_DES_64_CBC_SHA 0x03000015 +# define SSL3_CK_DHE_RSA_DES_64_CBC_SHA SSL3_CK_EDH_RSA_DES_64_CBC_SHA +# define SSL3_CK_EDH_RSA_DES_192_CBC3_SHA 0x03000016 +# define SSL3_CK_DHE_RSA_DES_192_CBC3_SHA SSL3_CK_EDH_RSA_DES_192_CBC3_SHA + +# define SSL3_CK_ADH_RC4_40_MD5 0x03000017 +# define SSL3_CK_ADH_RC4_128_MD5 0x03000018 +# define SSL3_CK_ADH_DES_40_CBC_SHA 0x03000019 +# define SSL3_CK_ADH_DES_64_CBC_SHA 0x0300001A +# define SSL3_CK_ADH_DES_192_CBC_SHA 0x0300001B + +# if 0 +# define SSL3_CK_FZA_DMS_NULL_SHA 0x0300001C +# define SSL3_CK_FZA_DMS_FZA_SHA 0x0300001D +# if 0 /* Because it clashes with KRB5, is never + * used any more, and is safe to remove + * according to David Hopwood + * of the + * ietf-tls list */ +# define SSL3_CK_FZA_DMS_RC4_SHA 0x0300001E +# endif +# endif + +/* + * VRS Additional Kerberos5 entries + */ +# define SSL3_CK_KRB5_DES_64_CBC_SHA 0x0300001E +# define SSL3_CK_KRB5_DES_192_CBC3_SHA 0x0300001F +# define SSL3_CK_KRB5_RC4_128_SHA 0x03000020 +# define SSL3_CK_KRB5_IDEA_128_CBC_SHA 0x03000021 +# define SSL3_CK_KRB5_DES_64_CBC_MD5 0x03000022 +# define SSL3_CK_KRB5_DES_192_CBC3_MD5 0x03000023 +# define SSL3_CK_KRB5_RC4_128_MD5 0x03000024 +# define SSL3_CK_KRB5_IDEA_128_CBC_MD5 0x03000025 + +# define SSL3_CK_KRB5_DES_40_CBC_SHA 0x03000026 +# define SSL3_CK_KRB5_RC2_40_CBC_SHA 0x03000027 +# define SSL3_CK_KRB5_RC4_40_SHA 0x03000028 +# define SSL3_CK_KRB5_DES_40_CBC_MD5 0x03000029 +# define SSL3_CK_KRB5_RC2_40_CBC_MD5 0x0300002A +# define SSL3_CK_KRB5_RC4_40_MD5 0x0300002B + +# define SSL3_TXT_RSA_NULL_MD5 "NULL-MD5" +# define SSL3_TXT_RSA_NULL_SHA "NULL-SHA" +# define SSL3_TXT_RSA_RC4_40_MD5 "EXP-RC4-MD5" +# define SSL3_TXT_RSA_RC4_128_MD5 "RC4-MD5" +# define SSL3_TXT_RSA_RC4_128_SHA "RC4-SHA" +# define SSL3_TXT_RSA_RC2_40_MD5 "EXP-RC2-CBC-MD5" +# define SSL3_TXT_RSA_IDEA_128_SHA "IDEA-CBC-SHA" +# define SSL3_TXT_RSA_DES_40_CBC_SHA "EXP-DES-CBC-SHA" +# define SSL3_TXT_RSA_DES_64_CBC_SHA "DES-CBC-SHA" +# define SSL3_TXT_RSA_DES_192_CBC3_SHA "DES-CBC3-SHA" + +# define SSL3_TXT_DH_DSS_DES_40_CBC_SHA "EXP-DH-DSS-DES-CBC-SHA" +# define SSL3_TXT_DH_DSS_DES_64_CBC_SHA "DH-DSS-DES-CBC-SHA" +# define SSL3_TXT_DH_DSS_DES_192_CBC3_SHA "DH-DSS-DES-CBC3-SHA" +# define SSL3_TXT_DH_RSA_DES_40_CBC_SHA "EXP-DH-RSA-DES-CBC-SHA" +# define SSL3_TXT_DH_RSA_DES_64_CBC_SHA "DH-RSA-DES-CBC-SHA" +# define SSL3_TXT_DH_RSA_DES_192_CBC3_SHA "DH-RSA-DES-CBC3-SHA" + +# define SSL3_TXT_DHE_DSS_DES_40_CBC_SHA "EXP-DHE-DSS-DES-CBC-SHA" +# define SSL3_TXT_DHE_DSS_DES_64_CBC_SHA "DHE-DSS-DES-CBC-SHA" +# define SSL3_TXT_DHE_DSS_DES_192_CBC3_SHA "DHE-DSS-DES-CBC3-SHA" +# define SSL3_TXT_DHE_RSA_DES_40_CBC_SHA "EXP-DHE-RSA-DES-CBC-SHA" +# define SSL3_TXT_DHE_RSA_DES_64_CBC_SHA "DHE-RSA-DES-CBC-SHA" +# define SSL3_TXT_DHE_RSA_DES_192_CBC3_SHA "DHE-RSA-DES-CBC3-SHA" + +/* + * This next block of six "EDH" labels is for backward compatibility with + * older versions of OpenSSL. New code should use the six "DHE" labels above + * instead: + */ +# define SSL3_TXT_EDH_DSS_DES_40_CBC_SHA "EXP-EDH-DSS-DES-CBC-SHA" +# define SSL3_TXT_EDH_DSS_DES_64_CBC_SHA "EDH-DSS-DES-CBC-SHA" +# define SSL3_TXT_EDH_DSS_DES_192_CBC3_SHA "EDH-DSS-DES-CBC3-SHA" +# define SSL3_TXT_EDH_RSA_DES_40_CBC_SHA "EXP-EDH-RSA-DES-CBC-SHA" +# define SSL3_TXT_EDH_RSA_DES_64_CBC_SHA "EDH-RSA-DES-CBC-SHA" +# define SSL3_TXT_EDH_RSA_DES_192_CBC3_SHA "EDH-RSA-DES-CBC3-SHA" + +# define SSL3_TXT_ADH_RC4_40_MD5 "EXP-ADH-RC4-MD5" +# define SSL3_TXT_ADH_RC4_128_MD5 "ADH-RC4-MD5" +# define SSL3_TXT_ADH_DES_40_CBC_SHA "EXP-ADH-DES-CBC-SHA" +# define SSL3_TXT_ADH_DES_64_CBC_SHA "ADH-DES-CBC-SHA" +# define SSL3_TXT_ADH_DES_192_CBC_SHA "ADH-DES-CBC3-SHA" + +# if 0 +# define SSL3_TXT_FZA_DMS_NULL_SHA "FZA-NULL-SHA" +# define SSL3_TXT_FZA_DMS_FZA_SHA "FZA-FZA-CBC-SHA" +# define SSL3_TXT_FZA_DMS_RC4_SHA "FZA-RC4-SHA" +# endif + +# define SSL3_TXT_KRB5_DES_64_CBC_SHA "KRB5-DES-CBC-SHA" +# define SSL3_TXT_KRB5_DES_192_CBC3_SHA "KRB5-DES-CBC3-SHA" +# define SSL3_TXT_KRB5_RC4_128_SHA "KRB5-RC4-SHA" +# define SSL3_TXT_KRB5_IDEA_128_CBC_SHA "KRB5-IDEA-CBC-SHA" +# define SSL3_TXT_KRB5_DES_64_CBC_MD5 "KRB5-DES-CBC-MD5" +# define SSL3_TXT_KRB5_DES_192_CBC3_MD5 "KRB5-DES-CBC3-MD5" +# define SSL3_TXT_KRB5_RC4_128_MD5 "KRB5-RC4-MD5" +# define SSL3_TXT_KRB5_IDEA_128_CBC_MD5 "KRB5-IDEA-CBC-MD5" + +# define SSL3_TXT_KRB5_DES_40_CBC_SHA "EXP-KRB5-DES-CBC-SHA" +# define SSL3_TXT_KRB5_RC2_40_CBC_SHA "EXP-KRB5-RC2-CBC-SHA" +# define SSL3_TXT_KRB5_RC4_40_SHA "EXP-KRB5-RC4-SHA" +# define SSL3_TXT_KRB5_DES_40_CBC_MD5 "EXP-KRB5-DES-CBC-MD5" +# define SSL3_TXT_KRB5_RC2_40_CBC_MD5 "EXP-KRB5-RC2-CBC-MD5" +# define SSL3_TXT_KRB5_RC4_40_MD5 "EXP-KRB5-RC4-MD5" + +# define SSL3_SSL_SESSION_ID_LENGTH 32 +# define SSL3_MAX_SSL_SESSION_ID_LENGTH 32 + +# define SSL3_MASTER_SECRET_SIZE 48 +# define SSL3_RANDOM_SIZE 32 +# define SSL3_SESSION_ID_SIZE 32 +# define SSL3_RT_HEADER_LENGTH 5 + +# define SSL3_HM_HEADER_LENGTH 4 + +# ifndef SSL3_ALIGN_PAYLOAD + /* + * Some will argue that this increases memory footprint, but it's not + * actually true. Point is that malloc has to return at least 64-bit aligned + * pointers, meaning that allocating 5 bytes wastes 3 bytes in either case. + * Suggested pre-gaping simply moves these wasted bytes from the end of + * allocated region to its front, but makes data payload aligned, which + * improves performance:-) + */ +# define SSL3_ALIGN_PAYLOAD 8 +# else +# if (SSL3_ALIGN_PAYLOAD&(SSL3_ALIGN_PAYLOAD-1))!=0 +# error "insane SSL3_ALIGN_PAYLOAD" +# undef SSL3_ALIGN_PAYLOAD +# endif +# endif + +/* + * This is the maximum MAC (digest) size used by the SSL library. Currently + * maximum of 20 is used by SHA1, but we reserve for future extension for + * 512-bit hashes. + */ + +# define SSL3_RT_MAX_MD_SIZE 64 + +/* + * Maximum block size used in all ciphersuites. Currently 16 for AES. + */ + +# define SSL_RT_MAX_CIPHER_BLOCK_SIZE 16 + +# define SSL3_RT_MAX_EXTRA (16384) + +/* Maximum plaintext length: defined by SSL/TLS standards */ +# define SSL3_RT_MAX_PLAIN_LENGTH 16384 +/* Maximum compression overhead: defined by SSL/TLS standards */ +# define SSL3_RT_MAX_COMPRESSED_OVERHEAD 1024 + +/* + * The standards give a maximum encryption overhead of 1024 bytes. In + * practice the value is lower than this. The overhead is the maximum number + * of padding bytes (256) plus the mac size. + */ +# define SSL3_RT_MAX_ENCRYPTED_OVERHEAD (256 + SSL3_RT_MAX_MD_SIZE) + +/* + * OpenSSL currently only uses a padding length of at most one block so the + * send overhead is smaller. + */ + +# define SSL3_RT_SEND_MAX_ENCRYPTED_OVERHEAD \ + (SSL_RT_MAX_CIPHER_BLOCK_SIZE + SSL3_RT_MAX_MD_SIZE) + +/* If compression isn't used don't include the compression overhead */ + +# ifdef OPENSSL_NO_COMP +# define SSL3_RT_MAX_COMPRESSED_LENGTH SSL3_RT_MAX_PLAIN_LENGTH +# else +# define SSL3_RT_MAX_COMPRESSED_LENGTH \ + (SSL3_RT_MAX_PLAIN_LENGTH+SSL3_RT_MAX_COMPRESSED_OVERHEAD) +# endif +# define SSL3_RT_MAX_ENCRYPTED_LENGTH \ + (SSL3_RT_MAX_ENCRYPTED_OVERHEAD+SSL3_RT_MAX_COMPRESSED_LENGTH) +# define SSL3_RT_MAX_PACKET_SIZE \ + (SSL3_RT_MAX_ENCRYPTED_LENGTH+SSL3_RT_HEADER_LENGTH) + +# define SSL3_MD_CLIENT_FINISHED_CONST "\x43\x4C\x4E\x54" +# define SSL3_MD_SERVER_FINISHED_CONST "\x53\x52\x56\x52" + +# define SSL3_VERSION 0x0300 +# define SSL3_VERSION_MAJOR 0x03 +# define SSL3_VERSION_MINOR 0x00 + +# define SSL3_RT_CHANGE_CIPHER_SPEC 20 +# define SSL3_RT_ALERT 21 +# define SSL3_RT_HANDSHAKE 22 +# define SSL3_RT_APPLICATION_DATA 23 +# define TLS1_RT_HEARTBEAT 24 + +/* Pseudo content types to indicate additional parameters */ +# define TLS1_RT_CRYPTO 0x1000 +# define TLS1_RT_CRYPTO_PREMASTER (TLS1_RT_CRYPTO | 0x1) +# define TLS1_RT_CRYPTO_CLIENT_RANDOM (TLS1_RT_CRYPTO | 0x2) +# define TLS1_RT_CRYPTO_SERVER_RANDOM (TLS1_RT_CRYPTO | 0x3) +# define TLS1_RT_CRYPTO_MASTER (TLS1_RT_CRYPTO | 0x4) + +# define TLS1_RT_CRYPTO_READ 0x0000 +# define TLS1_RT_CRYPTO_WRITE 0x0100 +# define TLS1_RT_CRYPTO_MAC (TLS1_RT_CRYPTO | 0x5) +# define TLS1_RT_CRYPTO_KEY (TLS1_RT_CRYPTO | 0x6) +# define TLS1_RT_CRYPTO_IV (TLS1_RT_CRYPTO | 0x7) +# define TLS1_RT_CRYPTO_FIXED_IV (TLS1_RT_CRYPTO | 0x8) + +/* Pseudo content type for SSL/TLS header info */ +# define SSL3_RT_HEADER 0x100 + +# define SSL3_AL_WARNING 1 +# define SSL3_AL_FATAL 2 + +# define SSL3_AD_CLOSE_NOTIFY 0 +# define SSL3_AD_UNEXPECTED_MESSAGE 10/* fatal */ +# define SSL3_AD_BAD_RECORD_MAC 20/* fatal */ +# define SSL3_AD_DECOMPRESSION_FAILURE 30/* fatal */ +# define SSL3_AD_HANDSHAKE_FAILURE 40/* fatal */ +# define SSL3_AD_NO_CERTIFICATE 41 +# define SSL3_AD_BAD_CERTIFICATE 42 +# define SSL3_AD_UNSUPPORTED_CERTIFICATE 43 +# define SSL3_AD_CERTIFICATE_REVOKED 44 +# define SSL3_AD_CERTIFICATE_EXPIRED 45 +# define SSL3_AD_CERTIFICATE_UNKNOWN 46 +# define SSL3_AD_ILLEGAL_PARAMETER 47/* fatal */ + +# define TLS1_HB_REQUEST 1 +# define TLS1_HB_RESPONSE 2 + +# ifndef OPENSSL_NO_SSL_INTERN + +typedef struct ssl3_record_st { + /* type of record */ + /* + * r + */ int type; + /* How many bytes available */ + /* + * rw + */ unsigned int length; + /* read/write offset into 'buf' */ + /* + * r + */ unsigned int off; + /* pointer to the record data */ + /* + * rw + */ unsigned char *data; + /* where the decode bytes are */ + /* + * rw + */ unsigned char *input; + /* only used with decompression - malloc()ed */ + /* + * r + */ unsigned char *comp; + /* epoch number, needed by DTLS1 */ + /* + * r + */ unsigned long epoch; + /* sequence number, needed by DTLS1 */ + /* + * r + */ unsigned char seq_num[8]; +} SSL3_RECORD; + +typedef struct ssl3_buffer_st { + /* at least SSL3_RT_MAX_PACKET_SIZE bytes, see ssl3_setup_buffers() */ + unsigned char *buf; + /* buffer size */ + size_t len; + /* where to 'copy from' */ + int offset; + /* how many bytes left */ + int left; +} SSL3_BUFFER; + +# endif + +# define SSL3_CT_RSA_SIGN 1 +# define SSL3_CT_DSS_SIGN 2 +# define SSL3_CT_RSA_FIXED_DH 3 +# define SSL3_CT_DSS_FIXED_DH 4 +# define SSL3_CT_RSA_EPHEMERAL_DH 5 +# define SSL3_CT_DSS_EPHEMERAL_DH 6 +# define SSL3_CT_FORTEZZA_DMS 20 +/* + * SSL3_CT_NUMBER is used to size arrays and it must be large enough to + * contain all of the cert types defined either for SSLv3 and TLSv1. + */ +# define SSL3_CT_NUMBER 9 + +# define SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS 0x0001 +# define SSL3_FLAGS_DELAY_CLIENT_FINISHED 0x0002 +# define SSL3_FLAGS_POP_BUFFER 0x0004 +# define TLS1_FLAGS_TLS_PADDING_BUG 0x0008 +# define TLS1_FLAGS_SKIP_CERT_VERIFY 0x0010 +# define TLS1_FLAGS_KEEP_HANDSHAKE 0x0020 +/* + * Set when the handshake is ready to process peer's ChangeCipherSpec message. + * Cleared after the message has been processed. + */ +# define SSL3_FLAGS_CCS_OK 0x0080 + +/* SSL3_FLAGS_SGC_RESTART_DONE is no longer used */ +# define SSL3_FLAGS_SGC_RESTART_DONE 0x0040 + +# ifndef OPENSSL_NO_SSL_INTERN + +typedef struct ssl3_state_st { + long flags; + int delay_buf_pop_ret; + unsigned char read_sequence[8]; + int read_mac_secret_size; + unsigned char read_mac_secret[EVP_MAX_MD_SIZE]; + unsigned char write_sequence[8]; + int write_mac_secret_size; + unsigned char write_mac_secret[EVP_MAX_MD_SIZE]; + unsigned char server_random[SSL3_RANDOM_SIZE]; + unsigned char client_random[SSL3_RANDOM_SIZE]; + /* flags for countermeasure against known-IV weakness */ + int need_empty_fragments; + int empty_fragment_done; + /* The value of 'extra' when the buffers were initialized */ + int init_extra; + SSL3_BUFFER rbuf; /* read IO goes into here */ + SSL3_BUFFER wbuf; /* write IO goes into here */ + SSL3_RECORD rrec; /* each decoded record goes in here */ + SSL3_RECORD wrec; /* goes out from here */ + /* + * storage for Alert/Handshake protocol data received but not yet + * processed by ssl3_read_bytes: + */ + unsigned char alert_fragment[2]; + unsigned int alert_fragment_len; + unsigned char handshake_fragment[4]; + unsigned int handshake_fragment_len; + /* partial write - check the numbers match */ + unsigned int wnum; /* number of bytes sent so far */ + int wpend_tot; /* number bytes written */ + int wpend_type; + int wpend_ret; /* number of bytes submitted */ + const unsigned char *wpend_buf; + /* used during startup, digest all incoming/outgoing packets */ + BIO *handshake_buffer; + /* + * When set of handshake digests is determined, buffer is hashed and + * freed and MD_CTX-es for all required digests are stored in this array + */ + EVP_MD_CTX **handshake_dgst; + /* + * Set whenever an expected ChangeCipherSpec message is processed. + * Unset when the peer's Finished message is received. + * Unexpected ChangeCipherSpec messages trigger a fatal alert. + */ + int change_cipher_spec; + int warn_alert; + int fatal_alert; + /* + * we allow one fatal and one warning alert to be outstanding, send close + * alert via the warning alert + */ + int alert_dispatch; + unsigned char send_alert[2]; + /* + * This flag is set when we should renegotiate ASAP, basically when there + * is no more data in the read or write buffers + */ + int renegotiate; + int total_renegotiations; + int num_renegotiations; + int in_read_app_data; + /* + * Opaque PRF input as used for the current handshake. These fields are + * used only if TLSEXT_TYPE_opaque_prf_input is defined (otherwise, they + * are merely present to improve binary compatibility) + */ + void *client_opaque_prf_input; + size_t client_opaque_prf_input_len; + void *server_opaque_prf_input; + size_t server_opaque_prf_input_len; + struct { + /* actually only needs to be 16+20 */ + unsigned char cert_verify_md[EVP_MAX_MD_SIZE * 2]; + /* actually only need to be 16+20 for SSLv3 and 12 for TLS */ + unsigned char finish_md[EVP_MAX_MD_SIZE * 2]; + int finish_md_len; + unsigned char peer_finish_md[EVP_MAX_MD_SIZE * 2]; + int peer_finish_md_len; + unsigned long message_size; + int message_type; + /* used to hold the new cipher we are going to use */ + const SSL_CIPHER *new_cipher; +# ifndef OPENSSL_NO_DH + DH *dh; +# endif +# ifndef OPENSSL_NO_ECDH + EC_KEY *ecdh; /* holds short lived ECDH key */ +# endif + /* used when SSL_ST_FLUSH_DATA is entered */ + int next_state; + int reuse_message; + /* used for certificate requests */ + int cert_req; + int ctype_num; + char ctype[SSL3_CT_NUMBER]; + STACK_OF(X509_NAME) *ca_names; + int use_rsa_tmp; + int key_block_length; + unsigned char *key_block; + const EVP_CIPHER *new_sym_enc; + const EVP_MD *new_hash; + int new_mac_pkey_type; + int new_mac_secret_size; +# ifndef OPENSSL_NO_COMP + const SSL_COMP *new_compression; +# else + char *new_compression; +# endif + int cert_request; + } tmp; + + /* Connection binding to prevent renegotiation attacks */ + unsigned char previous_client_finished[EVP_MAX_MD_SIZE]; + unsigned char previous_client_finished_len; + unsigned char previous_server_finished[EVP_MAX_MD_SIZE]; + unsigned char previous_server_finished_len; + int send_connection_binding; /* TODOEKR */ + +# ifndef OPENSSL_NO_NEXTPROTONEG + /* + * Set if we saw the Next Protocol Negotiation extension from our peer. + */ + int next_proto_neg_seen; +# endif + +# ifndef OPENSSL_NO_TLSEXT +# ifndef OPENSSL_NO_EC + /* + * This is set to true if we believe that this is a version of Safari + * running on OS X 10.6 or newer. We wish to know this because Safari on + * 10.8 .. 10.8.3 has broken ECDHE-ECDSA support. + */ + char is_probably_safari; +# endif /* !OPENSSL_NO_EC */ + + /* + * ALPN information (we are in the process of transitioning from NPN to + * ALPN.) + */ + + /* + * In a server these point to the selected ALPN protocol after the + * ClientHello has been processed. In a client these contain the protocol + * that the server selected once the ServerHello has been processed. + */ + unsigned char *alpn_selected; + unsigned alpn_selected_len; +# endif /* OPENSSL_NO_TLSEXT */ +} SSL3_STATE; + +# endif + +/* SSLv3 */ +/* + * client + */ +/* extra state */ +# define SSL3_ST_CW_FLUSH (0x100|SSL_ST_CONNECT) +# ifndef OPENSSL_NO_SCTP +# define DTLS1_SCTP_ST_CW_WRITE_SOCK (0x310|SSL_ST_CONNECT) +# define DTLS1_SCTP_ST_CR_READ_SOCK (0x320|SSL_ST_CONNECT) +# endif +/* write to server */ +# define SSL3_ST_CW_CLNT_HELLO_A (0x110|SSL_ST_CONNECT) +# define SSL3_ST_CW_CLNT_HELLO_B (0x111|SSL_ST_CONNECT) +/* read from server */ +# define SSL3_ST_CR_SRVR_HELLO_A (0x120|SSL_ST_CONNECT) +# define SSL3_ST_CR_SRVR_HELLO_B (0x121|SSL_ST_CONNECT) +# define DTLS1_ST_CR_HELLO_VERIFY_REQUEST_A (0x126|SSL_ST_CONNECT) +# define DTLS1_ST_CR_HELLO_VERIFY_REQUEST_B (0x127|SSL_ST_CONNECT) +# define SSL3_ST_CR_CERT_A (0x130|SSL_ST_CONNECT) +# define SSL3_ST_CR_CERT_B (0x131|SSL_ST_CONNECT) +# define SSL3_ST_CR_KEY_EXCH_A (0x140|SSL_ST_CONNECT) +# define SSL3_ST_CR_KEY_EXCH_B (0x141|SSL_ST_CONNECT) +# define SSL3_ST_CR_CERT_REQ_A (0x150|SSL_ST_CONNECT) +# define SSL3_ST_CR_CERT_REQ_B (0x151|SSL_ST_CONNECT) +# define SSL3_ST_CR_SRVR_DONE_A (0x160|SSL_ST_CONNECT) +# define SSL3_ST_CR_SRVR_DONE_B (0x161|SSL_ST_CONNECT) +/* write to server */ +# define SSL3_ST_CW_CERT_A (0x170|SSL_ST_CONNECT) +# define SSL3_ST_CW_CERT_B (0x171|SSL_ST_CONNECT) +# define SSL3_ST_CW_CERT_C (0x172|SSL_ST_CONNECT) +# define SSL3_ST_CW_CERT_D (0x173|SSL_ST_CONNECT) +# define SSL3_ST_CW_KEY_EXCH_A (0x180|SSL_ST_CONNECT) +# define SSL3_ST_CW_KEY_EXCH_B (0x181|SSL_ST_CONNECT) +# define SSL3_ST_CW_CERT_VRFY_A (0x190|SSL_ST_CONNECT) +# define SSL3_ST_CW_CERT_VRFY_B (0x191|SSL_ST_CONNECT) +# define SSL3_ST_CW_CHANGE_A (0x1A0|SSL_ST_CONNECT) +# define SSL3_ST_CW_CHANGE_B (0x1A1|SSL_ST_CONNECT) +# ifndef OPENSSL_NO_NEXTPROTONEG +# define SSL3_ST_CW_NEXT_PROTO_A (0x200|SSL_ST_CONNECT) +# define SSL3_ST_CW_NEXT_PROTO_B (0x201|SSL_ST_CONNECT) +# endif +# define SSL3_ST_CW_FINISHED_A (0x1B0|SSL_ST_CONNECT) +# define SSL3_ST_CW_FINISHED_B (0x1B1|SSL_ST_CONNECT) +/* read from server */ +# define SSL3_ST_CR_CHANGE_A (0x1C0|SSL_ST_CONNECT) +# define SSL3_ST_CR_CHANGE_B (0x1C1|SSL_ST_CONNECT) +# define SSL3_ST_CR_FINISHED_A (0x1D0|SSL_ST_CONNECT) +# define SSL3_ST_CR_FINISHED_B (0x1D1|SSL_ST_CONNECT) +# define SSL3_ST_CR_SESSION_TICKET_A (0x1E0|SSL_ST_CONNECT) +# define SSL3_ST_CR_SESSION_TICKET_B (0x1E1|SSL_ST_CONNECT) +# define SSL3_ST_CR_CERT_STATUS_A (0x1F0|SSL_ST_CONNECT) +# define SSL3_ST_CR_CERT_STATUS_B (0x1F1|SSL_ST_CONNECT) + +/* server */ +/* extra state */ +# define SSL3_ST_SW_FLUSH (0x100|SSL_ST_ACCEPT) +# ifndef OPENSSL_NO_SCTP +# define DTLS1_SCTP_ST_SW_WRITE_SOCK (0x310|SSL_ST_ACCEPT) +# define DTLS1_SCTP_ST_SR_READ_SOCK (0x320|SSL_ST_ACCEPT) +# endif +/* read from client */ +/* Do not change the number values, they do matter */ +# define SSL3_ST_SR_CLNT_HELLO_A (0x110|SSL_ST_ACCEPT) +# define SSL3_ST_SR_CLNT_HELLO_B (0x111|SSL_ST_ACCEPT) +# define SSL3_ST_SR_CLNT_HELLO_C (0x112|SSL_ST_ACCEPT) +# define SSL3_ST_SR_CLNT_HELLO_D (0x115|SSL_ST_ACCEPT) +/* write to client */ +# define DTLS1_ST_SW_HELLO_VERIFY_REQUEST_A (0x113|SSL_ST_ACCEPT) +# define DTLS1_ST_SW_HELLO_VERIFY_REQUEST_B (0x114|SSL_ST_ACCEPT) +# define SSL3_ST_SW_HELLO_REQ_A (0x120|SSL_ST_ACCEPT) +# define SSL3_ST_SW_HELLO_REQ_B (0x121|SSL_ST_ACCEPT) +# define SSL3_ST_SW_HELLO_REQ_C (0x122|SSL_ST_ACCEPT) +# define SSL3_ST_SW_SRVR_HELLO_A (0x130|SSL_ST_ACCEPT) +# define SSL3_ST_SW_SRVR_HELLO_B (0x131|SSL_ST_ACCEPT) +# define SSL3_ST_SW_CERT_A (0x140|SSL_ST_ACCEPT) +# define SSL3_ST_SW_CERT_B (0x141|SSL_ST_ACCEPT) +# define SSL3_ST_SW_KEY_EXCH_A (0x150|SSL_ST_ACCEPT) +# define SSL3_ST_SW_KEY_EXCH_B (0x151|SSL_ST_ACCEPT) +# define SSL3_ST_SW_CERT_REQ_A (0x160|SSL_ST_ACCEPT) +# define SSL3_ST_SW_CERT_REQ_B (0x161|SSL_ST_ACCEPT) +# define SSL3_ST_SW_SRVR_DONE_A (0x170|SSL_ST_ACCEPT) +# define SSL3_ST_SW_SRVR_DONE_B (0x171|SSL_ST_ACCEPT) +/* read from client */ +# define SSL3_ST_SR_CERT_A (0x180|SSL_ST_ACCEPT) +# define SSL3_ST_SR_CERT_B (0x181|SSL_ST_ACCEPT) +# define SSL3_ST_SR_KEY_EXCH_A (0x190|SSL_ST_ACCEPT) +# define SSL3_ST_SR_KEY_EXCH_B (0x191|SSL_ST_ACCEPT) +# define SSL3_ST_SR_CERT_VRFY_A (0x1A0|SSL_ST_ACCEPT) +# define SSL3_ST_SR_CERT_VRFY_B (0x1A1|SSL_ST_ACCEPT) +# define SSL3_ST_SR_CHANGE_A (0x1B0|SSL_ST_ACCEPT) +# define SSL3_ST_SR_CHANGE_B (0x1B1|SSL_ST_ACCEPT) +# ifndef OPENSSL_NO_NEXTPROTONEG +# define SSL3_ST_SR_NEXT_PROTO_A (0x210|SSL_ST_ACCEPT) +# define SSL3_ST_SR_NEXT_PROTO_B (0x211|SSL_ST_ACCEPT) +# endif +# define SSL3_ST_SR_FINISHED_A (0x1C0|SSL_ST_ACCEPT) +# define SSL3_ST_SR_FINISHED_B (0x1C1|SSL_ST_ACCEPT) +/* write to client */ +# define SSL3_ST_SW_CHANGE_A (0x1D0|SSL_ST_ACCEPT) +# define SSL3_ST_SW_CHANGE_B (0x1D1|SSL_ST_ACCEPT) +# define SSL3_ST_SW_FINISHED_A (0x1E0|SSL_ST_ACCEPT) +# define SSL3_ST_SW_FINISHED_B (0x1E1|SSL_ST_ACCEPT) +# define SSL3_ST_SW_SESSION_TICKET_A (0x1F0|SSL_ST_ACCEPT) +# define SSL3_ST_SW_SESSION_TICKET_B (0x1F1|SSL_ST_ACCEPT) +# define SSL3_ST_SW_CERT_STATUS_A (0x200|SSL_ST_ACCEPT) +# define SSL3_ST_SW_CERT_STATUS_B (0x201|SSL_ST_ACCEPT) + +# define SSL3_MT_HELLO_REQUEST 0 +# define SSL3_MT_CLIENT_HELLO 1 +# define SSL3_MT_SERVER_HELLO 2 +# define SSL3_MT_NEWSESSION_TICKET 4 +# define SSL3_MT_CERTIFICATE 11 +# define SSL3_MT_SERVER_KEY_EXCHANGE 12 +# define SSL3_MT_CERTIFICATE_REQUEST 13 +# define SSL3_MT_SERVER_DONE 14 +# define SSL3_MT_CERTIFICATE_VERIFY 15 +# define SSL3_MT_CLIENT_KEY_EXCHANGE 16 +# define SSL3_MT_FINISHED 20 +# define SSL3_MT_CERTIFICATE_STATUS 22 +# ifndef OPENSSL_NO_NEXTPROTONEG +# define SSL3_MT_NEXT_PROTO 67 +# endif +# define DTLS1_MT_HELLO_VERIFY_REQUEST 3 + +# define SSL3_MT_CCS 1 + +/* These are used when changing over to a new cipher */ +# define SSL3_CC_READ 0x01 +# define SSL3_CC_WRITE 0x02 +# define SSL3_CC_CLIENT 0x10 +# define SSL3_CC_SERVER 0x20 +# define SSL3_CHANGE_CIPHER_CLIENT_WRITE (SSL3_CC_CLIENT|SSL3_CC_WRITE) +# define SSL3_CHANGE_CIPHER_SERVER_READ (SSL3_CC_SERVER|SSL3_CC_READ) +# define SSL3_CHANGE_CIPHER_CLIENT_READ (SSL3_CC_CLIENT|SSL3_CC_READ) +# define SSL3_CHANGE_CIPHER_SERVER_WRITE (SSL3_CC_SERVER|SSL3_CC_WRITE) + +#ifdef __cplusplus +} +#endif +#endif diff --git a/ext/openssl-osx/include/openssl/stack.h b/ext/openssl-osx/include/openssl/stack.h new file mode 100644 index 00000000..eb072166 --- /dev/null +++ b/ext/openssl-osx/include/openssl/stack.h @@ -0,0 +1,107 @@ +/* crypto/stack/stack.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_STACK_H +# define HEADER_STACK_H + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct stack_st { + int num; + char **data; + int sorted; + int num_alloc; + int (*comp) (const void *, const void *); +} _STACK; /* Use STACK_OF(...) instead */ + +# define M_sk_num(sk) ((sk) ? (sk)->num:-1) +# define M_sk_value(sk,n) ((sk) ? (sk)->data[n] : NULL) + +int sk_num(const _STACK *); +void *sk_value(const _STACK *, int); + +void *sk_set(_STACK *, int, void *); + +_STACK *sk_new(int (*cmp) (const void *, const void *)); +_STACK *sk_new_null(void); +void sk_free(_STACK *); +void sk_pop_free(_STACK *st, void (*func) (void *)); +_STACK *sk_deep_copy(_STACK *, void *(*)(void *), void (*)(void *)); +int sk_insert(_STACK *sk, void *data, int where); +void *sk_delete(_STACK *st, int loc); +void *sk_delete_ptr(_STACK *st, void *p); +int sk_find(_STACK *st, void *data); +int sk_find_ex(_STACK *st, void *data); +int sk_push(_STACK *st, void *data); +int sk_unshift(_STACK *st, void *data); +void *sk_shift(_STACK *st); +void *sk_pop(_STACK *st); +void sk_zero(_STACK *st); +int (*sk_set_cmp_func(_STACK *sk, int (*c) (const void *, const void *))) + (const void *, const void *); +_STACK *sk_dup(_STACK *st); +void sk_sort(_STACK *st); +int sk_is_sorted(const _STACK *st); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ext/openssl-osx/include/openssl/symhacks.h b/ext/openssl-osx/include/openssl/symhacks.h new file mode 100644 index 00000000..239fa4fb --- /dev/null +++ b/ext/openssl-osx/include/openssl/symhacks.h @@ -0,0 +1,516 @@ +/* ==================================================================== + * Copyright (c) 1999 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_SYMHACKS_H +# define HEADER_SYMHACKS_H + +# include + +/* + * Hacks to solve the problem with linkers incapable of handling very long + * symbol names. In the case of VMS, the limit is 31 characters on VMS for + * VAX. + */ +/* + * Note that this affects util/libeay.num and util/ssleay.num... you may + * change those manually, but that's not recommended, as those files are + * controlled centrally and updated on Unix, and the central definition may + * disagree with yours, which in turn may come with shareable library + * incompatibilities. + */ +# ifdef OPENSSL_SYS_VMS + +/* Hack a long name in crypto/ex_data.c */ +# undef CRYPTO_get_ex_data_implementation +# define CRYPTO_get_ex_data_implementation CRYPTO_get_ex_data_impl +# undef CRYPTO_set_ex_data_implementation +# define CRYPTO_set_ex_data_implementation CRYPTO_set_ex_data_impl + +/* Hack a long name in crypto/asn1/a_mbstr.c */ +# undef ASN1_STRING_set_default_mask_asc +# define ASN1_STRING_set_default_mask_asc ASN1_STRING_set_def_mask_asc + +# if 0 /* No longer needed, since safestack macro + * magic does the job */ +/* Hack the names created with DECLARE_ASN1_SET_OF(PKCS7_SIGNER_INFO) */ +# undef i2d_ASN1_SET_OF_PKCS7_SIGNER_INFO +# define i2d_ASN1_SET_OF_PKCS7_SIGNER_INFO i2d_ASN1_SET_OF_PKCS7_SIGINF +# undef d2i_ASN1_SET_OF_PKCS7_SIGNER_INFO +# define d2i_ASN1_SET_OF_PKCS7_SIGNER_INFO d2i_ASN1_SET_OF_PKCS7_SIGINF +# endif + +# if 0 /* No longer needed, since safestack macro + * magic does the job */ +/* Hack the names created with DECLARE_ASN1_SET_OF(PKCS7_RECIP_INFO) */ +# undef i2d_ASN1_SET_OF_PKCS7_RECIP_INFO +# define i2d_ASN1_SET_OF_PKCS7_RECIP_INFO i2d_ASN1_SET_OF_PKCS7_RECINF +# undef d2i_ASN1_SET_OF_PKCS7_RECIP_INFO +# define d2i_ASN1_SET_OF_PKCS7_RECIP_INFO d2i_ASN1_SET_OF_PKCS7_RECINF +# endif + +# if 0 /* No longer needed, since safestack macro + * magic does the job */ +/* Hack the names created with DECLARE_ASN1_SET_OF(ACCESS_DESCRIPTION) */ +# undef i2d_ASN1_SET_OF_ACCESS_DESCRIPTION +# define i2d_ASN1_SET_OF_ACCESS_DESCRIPTION i2d_ASN1_SET_OF_ACC_DESC +# undef d2i_ASN1_SET_OF_ACCESS_DESCRIPTION +# define d2i_ASN1_SET_OF_ACCESS_DESCRIPTION d2i_ASN1_SET_OF_ACC_DESC +# endif + +/* Hack the names created with DECLARE_PEM_rw(NETSCAPE_CERT_SEQUENCE) */ +# undef PEM_read_NETSCAPE_CERT_SEQUENCE +# define PEM_read_NETSCAPE_CERT_SEQUENCE PEM_read_NS_CERT_SEQ +# undef PEM_write_NETSCAPE_CERT_SEQUENCE +# define PEM_write_NETSCAPE_CERT_SEQUENCE PEM_write_NS_CERT_SEQ +# undef PEM_read_bio_NETSCAPE_CERT_SEQUENCE +# define PEM_read_bio_NETSCAPE_CERT_SEQUENCE PEM_read_bio_NS_CERT_SEQ +# undef PEM_write_bio_NETSCAPE_CERT_SEQUENCE +# define PEM_write_bio_NETSCAPE_CERT_SEQUENCE PEM_write_bio_NS_CERT_SEQ +# undef PEM_write_cb_bio_NETSCAPE_CERT_SEQUENCE +# define PEM_write_cb_bio_NETSCAPE_CERT_SEQUENCE PEM_write_cb_bio_NS_CERT_SEQ + +/* Hack the names created with DECLARE_PEM_rw(PKCS8_PRIV_KEY_INFO) */ +# undef PEM_read_PKCS8_PRIV_KEY_INFO +# define PEM_read_PKCS8_PRIV_KEY_INFO PEM_read_P8_PRIV_KEY_INFO +# undef PEM_write_PKCS8_PRIV_KEY_INFO +# define PEM_write_PKCS8_PRIV_KEY_INFO PEM_write_P8_PRIV_KEY_INFO +# undef PEM_read_bio_PKCS8_PRIV_KEY_INFO +# define PEM_read_bio_PKCS8_PRIV_KEY_INFO PEM_read_bio_P8_PRIV_KEY_INFO +# undef PEM_write_bio_PKCS8_PRIV_KEY_INFO +# define PEM_write_bio_PKCS8_PRIV_KEY_INFO PEM_write_bio_P8_PRIV_KEY_INFO +# undef PEM_write_cb_bio_PKCS8_PRIV_KEY_INFO +# define PEM_write_cb_bio_PKCS8_PRIV_KEY_INFO PEM_wrt_cb_bio_P8_PRIV_KEY_INFO + +/* Hack other PEM names */ +# undef PEM_write_bio_PKCS8PrivateKey_nid +# define PEM_write_bio_PKCS8PrivateKey_nid PEM_write_bio_PKCS8PrivKey_nid + +/* Hack some long X509 names */ +# undef X509_REVOKED_get_ext_by_critical +# define X509_REVOKED_get_ext_by_critical X509_REVOKED_get_ext_by_critic +# undef X509_policy_tree_get0_user_policies +# define X509_policy_tree_get0_user_policies X509_pcy_tree_get0_usr_policies +# undef X509_policy_node_get0_qualifiers +# define X509_policy_node_get0_qualifiers X509_pcy_node_get0_qualifiers +# undef X509_STORE_CTX_get_explicit_policy +# define X509_STORE_CTX_get_explicit_policy X509_STORE_CTX_get_expl_policy +# undef X509_STORE_CTX_get0_current_issuer +# define X509_STORE_CTX_get0_current_issuer X509_STORE_CTX_get0_cur_issuer + +/* Hack some long CRYPTO names */ +# undef CRYPTO_set_dynlock_destroy_callback +# define CRYPTO_set_dynlock_destroy_callback CRYPTO_set_dynlock_destroy_cb +# undef CRYPTO_set_dynlock_create_callback +# define CRYPTO_set_dynlock_create_callback CRYPTO_set_dynlock_create_cb +# undef CRYPTO_set_dynlock_lock_callback +# define CRYPTO_set_dynlock_lock_callback CRYPTO_set_dynlock_lock_cb +# undef CRYPTO_get_dynlock_lock_callback +# define CRYPTO_get_dynlock_lock_callback CRYPTO_get_dynlock_lock_cb +# undef CRYPTO_get_dynlock_destroy_callback +# define CRYPTO_get_dynlock_destroy_callback CRYPTO_get_dynlock_destroy_cb +# undef CRYPTO_get_dynlock_create_callback +# define CRYPTO_get_dynlock_create_callback CRYPTO_get_dynlock_create_cb +# undef CRYPTO_set_locked_mem_ex_functions +# define CRYPTO_set_locked_mem_ex_functions CRYPTO_set_locked_mem_ex_funcs +# undef CRYPTO_get_locked_mem_ex_functions +# define CRYPTO_get_locked_mem_ex_functions CRYPTO_get_locked_mem_ex_funcs + +/* Hack some long SSL/TLS names */ +# undef SSL_CTX_set_default_verify_paths +# define SSL_CTX_set_default_verify_paths SSL_CTX_set_def_verify_paths +# undef SSL_get_ex_data_X509_STORE_CTX_idx +# define SSL_get_ex_data_X509_STORE_CTX_idx SSL_get_ex_d_X509_STORE_CTX_idx +# undef SSL_add_file_cert_subjects_to_stack +# define SSL_add_file_cert_subjects_to_stack SSL_add_file_cert_subjs_to_stk +# undef SSL_add_dir_cert_subjects_to_stack +# define SSL_add_dir_cert_subjects_to_stack SSL_add_dir_cert_subjs_to_stk +# undef SSL_CTX_use_certificate_chain_file +# define SSL_CTX_use_certificate_chain_file SSL_CTX_use_cert_chain_file +# undef SSL_CTX_set_cert_verify_callback +# define SSL_CTX_set_cert_verify_callback SSL_CTX_set_cert_verify_cb +# undef SSL_CTX_set_default_passwd_cb_userdata +# define SSL_CTX_set_default_passwd_cb_userdata SSL_CTX_set_def_passwd_cb_ud +# undef SSL_COMP_get_compression_methods +# define SSL_COMP_get_compression_methods SSL_COMP_get_compress_methods +# undef SSL_COMP_set0_compression_methods +# define SSL_COMP_set0_compression_methods SSL_COMP_set0_compress_methods +# undef SSL_COMP_free_compression_methods +# define SSL_COMP_free_compression_methods SSL_COMP_free_compress_methods +# undef ssl_add_clienthello_renegotiate_ext +# define ssl_add_clienthello_renegotiate_ext ssl_add_clienthello_reneg_ext +# undef ssl_add_serverhello_renegotiate_ext +# define ssl_add_serverhello_renegotiate_ext ssl_add_serverhello_reneg_ext +# undef ssl_parse_clienthello_renegotiate_ext +# define ssl_parse_clienthello_renegotiate_ext ssl_parse_clienthello_reneg_ext +# undef ssl_parse_serverhello_renegotiate_ext +# define ssl_parse_serverhello_renegotiate_ext ssl_parse_serverhello_reneg_ext +# undef SSL_srp_server_param_with_username +# define SSL_srp_server_param_with_username SSL_srp_server_param_with_un +# undef SSL_CTX_set_srp_client_pwd_callback +# define SSL_CTX_set_srp_client_pwd_callback SSL_CTX_set_srp_client_pwd_cb +# undef SSL_CTX_set_srp_verify_param_callback +# define SSL_CTX_set_srp_verify_param_callback SSL_CTX_set_srp_vfy_param_cb +# undef SSL_CTX_set_srp_username_callback +# define SSL_CTX_set_srp_username_callback SSL_CTX_set_srp_un_cb +# undef ssl_add_clienthello_use_srtp_ext +# define ssl_add_clienthello_use_srtp_ext ssl_add_clihello_use_srtp_ext +# undef ssl_add_serverhello_use_srtp_ext +# define ssl_add_serverhello_use_srtp_ext ssl_add_serhello_use_srtp_ext +# undef ssl_parse_clienthello_use_srtp_ext +# define ssl_parse_clienthello_use_srtp_ext ssl_parse_clihello_use_srtp_ext +# undef ssl_parse_serverhello_use_srtp_ext +# define ssl_parse_serverhello_use_srtp_ext ssl_parse_serhello_use_srtp_ext +# undef SSL_CTX_set_next_protos_advertised_cb +# define SSL_CTX_set_next_protos_advertised_cb SSL_CTX_set_next_protos_adv_cb +# undef SSL_CTX_set_next_proto_select_cb +# define SSL_CTX_set_next_proto_select_cb SSL_CTX_set_next_proto_sel_cb + +# undef tls1_send_server_supplemental_data +# define tls1_send_server_supplemental_data tls1_send_server_suppl_data +# undef tls1_send_client_supplemental_data +# define tls1_send_client_supplemental_data tls1_send_client_suppl_data +# undef tls1_get_server_supplemental_data +# define tls1_get_server_supplemental_data tls1_get_server_suppl_data +# undef tls1_get_client_supplemental_data +# define tls1_get_client_supplemental_data tls1_get_client_suppl_data + +# undef ssl3_cbc_record_digest_supported +# define ssl3_cbc_record_digest_supported ssl3_cbc_record_digest_support +# undef ssl_check_clienthello_tlsext_late +# define ssl_check_clienthello_tlsext_late ssl_check_clihello_tlsext_late +# undef ssl_check_clienthello_tlsext_early +# define ssl_check_clienthello_tlsext_early ssl_check_clihello_tlsext_early + +/* Hack some RSA long names */ +# undef RSA_padding_check_PKCS1_OAEP_mgf1 +# define RSA_padding_check_PKCS1_OAEP_mgf1 RSA_pad_check_PKCS1_OAEP_mgf1 + +/* Hack some ENGINE long names */ +# undef ENGINE_get_default_BN_mod_exp_crt +# define ENGINE_get_default_BN_mod_exp_crt ENGINE_get_def_BN_mod_exp_crt +# undef ENGINE_set_default_BN_mod_exp_crt +# define ENGINE_set_default_BN_mod_exp_crt ENGINE_set_def_BN_mod_exp_crt +# undef ENGINE_set_load_privkey_function +# define ENGINE_set_load_privkey_function ENGINE_set_load_privkey_fn +# undef ENGINE_get_load_privkey_function +# define ENGINE_get_load_privkey_function ENGINE_get_load_privkey_fn +# undef ENGINE_unregister_pkey_asn1_meths +# define ENGINE_unregister_pkey_asn1_meths ENGINE_unreg_pkey_asn1_meths +# undef ENGINE_register_all_pkey_asn1_meths +# define ENGINE_register_all_pkey_asn1_meths ENGINE_reg_all_pkey_asn1_meths +# undef ENGINE_set_default_pkey_asn1_meths +# define ENGINE_set_default_pkey_asn1_meths ENGINE_set_def_pkey_asn1_meths +# undef ENGINE_get_pkey_asn1_meth_engine +# define ENGINE_get_pkey_asn1_meth_engine ENGINE_get_pkey_asn1_meth_eng +# undef ENGINE_set_load_ssl_client_cert_function +# define ENGINE_set_load_ssl_client_cert_function \ + ENGINE_set_ld_ssl_clnt_cert_fn +# undef ENGINE_get_ssl_client_cert_function +# define ENGINE_get_ssl_client_cert_function ENGINE_get_ssl_client_cert_fn + +/* Hack some long OCSP names */ +# undef OCSP_REQUEST_get_ext_by_critical +# define OCSP_REQUEST_get_ext_by_critical OCSP_REQUEST_get_ext_by_crit +# undef OCSP_BASICRESP_get_ext_by_critical +# define OCSP_BASICRESP_get_ext_by_critical OCSP_BASICRESP_get_ext_by_crit +# undef OCSP_SINGLERESP_get_ext_by_critical +# define OCSP_SINGLERESP_get_ext_by_critical OCSP_SINGLERESP_get_ext_by_crit + +/* Hack some long DES names */ +# undef _ossl_old_des_ede3_cfb64_encrypt +# define _ossl_old_des_ede3_cfb64_encrypt _ossl_odes_ede3_cfb64_encrypt +# undef _ossl_old_des_ede3_ofb64_encrypt +# define _ossl_old_des_ede3_ofb64_encrypt _ossl_odes_ede3_ofb64_encrypt + +/* Hack some long EVP names */ +# undef OPENSSL_add_all_algorithms_noconf +# define OPENSSL_add_all_algorithms_noconf OPENSSL_add_all_algo_noconf +# undef OPENSSL_add_all_algorithms_conf +# define OPENSSL_add_all_algorithms_conf OPENSSL_add_all_algo_conf +# undef EVP_PKEY_meth_set_verify_recover +# define EVP_PKEY_meth_set_verify_recover EVP_PKEY_meth_set_vrfy_recover + +/* Hack some long EC names */ +# undef EC_GROUP_set_point_conversion_form +# define EC_GROUP_set_point_conversion_form EC_GROUP_set_point_conv_form +# undef EC_GROUP_get_point_conversion_form +# define EC_GROUP_get_point_conversion_form EC_GROUP_get_point_conv_form +# undef EC_GROUP_clear_free_all_extra_data +# define EC_GROUP_clear_free_all_extra_data EC_GROUP_clr_free_all_xtra_data +# undef EC_KEY_set_public_key_affine_coordinates +# define EC_KEY_set_public_key_affine_coordinates \ + EC_KEY_set_pub_key_aff_coords +# undef EC_POINT_set_Jprojective_coordinates_GFp +# define EC_POINT_set_Jprojective_coordinates_GFp \ + EC_POINT_set_Jproj_coords_GFp +# undef EC_POINT_get_Jprojective_coordinates_GFp +# define EC_POINT_get_Jprojective_coordinates_GFp \ + EC_POINT_get_Jproj_coords_GFp +# undef EC_POINT_set_affine_coordinates_GFp +# define EC_POINT_set_affine_coordinates_GFp EC_POINT_set_affine_coords_GFp +# undef EC_POINT_get_affine_coordinates_GFp +# define EC_POINT_get_affine_coordinates_GFp EC_POINT_get_affine_coords_GFp +# undef EC_POINT_set_compressed_coordinates_GFp +# define EC_POINT_set_compressed_coordinates_GFp EC_POINT_set_compr_coords_GFp +# undef EC_POINT_set_affine_coordinates_GF2m +# define EC_POINT_set_affine_coordinates_GF2m EC_POINT_set_affine_coords_GF2m +# undef EC_POINT_get_affine_coordinates_GF2m +# define EC_POINT_get_affine_coordinates_GF2m EC_POINT_get_affine_coords_GF2m +# undef EC_POINT_set_compressed_coordinates_GF2m +# define EC_POINT_set_compressed_coordinates_GF2m \ + EC_POINT_set_compr_coords_GF2m +# undef ec_GF2m_simple_group_clear_finish +# define ec_GF2m_simple_group_clear_finish ec_GF2m_simple_grp_clr_finish +# undef ec_GF2m_simple_group_check_discriminant +# define ec_GF2m_simple_group_check_discriminant ec_GF2m_simple_grp_chk_discrim +# undef ec_GF2m_simple_point_clear_finish +# define ec_GF2m_simple_point_clear_finish ec_GF2m_simple_pt_clr_finish +# undef ec_GF2m_simple_point_set_to_infinity +# define ec_GF2m_simple_point_set_to_infinity ec_GF2m_simple_pt_set_to_inf +# undef ec_GF2m_simple_points_make_affine +# define ec_GF2m_simple_points_make_affine ec_GF2m_simple_pts_make_affine +# undef ec_GF2m_simple_point_set_affine_coordinates +# define ec_GF2m_simple_point_set_affine_coordinates \ + ec_GF2m_smp_pt_set_af_coords +# undef ec_GF2m_simple_point_get_affine_coordinates +# define ec_GF2m_simple_point_get_affine_coordinates \ + ec_GF2m_smp_pt_get_af_coords +# undef ec_GF2m_simple_set_compressed_coordinates +# define ec_GF2m_simple_set_compressed_coordinates \ + ec_GF2m_smp_set_compr_coords +# undef ec_GFp_simple_group_set_curve_GFp +# define ec_GFp_simple_group_set_curve_GFp ec_GFp_simple_grp_set_curve_GFp +# undef ec_GFp_simple_group_get_curve_GFp +# define ec_GFp_simple_group_get_curve_GFp ec_GFp_simple_grp_get_curve_GFp +# undef ec_GFp_simple_group_clear_finish +# define ec_GFp_simple_group_clear_finish ec_GFp_simple_grp_clear_finish +# undef ec_GFp_simple_group_set_generator +# define ec_GFp_simple_group_set_generator ec_GFp_simple_grp_set_generator +# undef ec_GFp_simple_group_get0_generator +# define ec_GFp_simple_group_get0_generator ec_GFp_simple_grp_gt0_generator +# undef ec_GFp_simple_group_get_cofactor +# define ec_GFp_simple_group_get_cofactor ec_GFp_simple_grp_get_cofactor +# undef ec_GFp_simple_point_clear_finish +# define ec_GFp_simple_point_clear_finish ec_GFp_simple_pt_clear_finish +# undef ec_GFp_simple_point_set_to_infinity +# define ec_GFp_simple_point_set_to_infinity ec_GFp_simple_pt_set_to_inf +# undef ec_GFp_simple_points_make_affine +# define ec_GFp_simple_points_make_affine ec_GFp_simple_pts_make_affine +# undef ec_GFp_simple_set_Jprojective_coordinates_GFp +# define ec_GFp_simple_set_Jprojective_coordinates_GFp \ + ec_GFp_smp_set_Jproj_coords_GFp +# undef ec_GFp_simple_get_Jprojective_coordinates_GFp +# define ec_GFp_simple_get_Jprojective_coordinates_GFp \ + ec_GFp_smp_get_Jproj_coords_GFp +# undef ec_GFp_simple_point_set_affine_coordinates_GFp +# define ec_GFp_simple_point_set_affine_coordinates_GFp \ + ec_GFp_smp_pt_set_af_coords_GFp +# undef ec_GFp_simple_point_get_affine_coordinates_GFp +# define ec_GFp_simple_point_get_affine_coordinates_GFp \ + ec_GFp_smp_pt_get_af_coords_GFp +# undef ec_GFp_simple_set_compressed_coordinates_GFp +# define ec_GFp_simple_set_compressed_coordinates_GFp \ + ec_GFp_smp_set_compr_coords_GFp +# undef ec_GFp_simple_point_set_affine_coordinates +# define ec_GFp_simple_point_set_affine_coordinates \ + ec_GFp_smp_pt_set_af_coords +# undef ec_GFp_simple_point_get_affine_coordinates +# define ec_GFp_simple_point_get_affine_coordinates \ + ec_GFp_smp_pt_get_af_coords +# undef ec_GFp_simple_set_compressed_coordinates +# define ec_GFp_simple_set_compressed_coordinates \ + ec_GFp_smp_set_compr_coords +# undef ec_GFp_simple_group_check_discriminant +# define ec_GFp_simple_group_check_discriminant ec_GFp_simple_grp_chk_discrim + +/* Hack som long STORE names */ +# undef STORE_method_set_initialise_function +# define STORE_method_set_initialise_function STORE_meth_set_initialise_fn +# undef STORE_method_set_cleanup_function +# define STORE_method_set_cleanup_function STORE_meth_set_cleanup_fn +# undef STORE_method_set_generate_function +# define STORE_method_set_generate_function STORE_meth_set_generate_fn +# undef STORE_method_set_modify_function +# define STORE_method_set_modify_function STORE_meth_set_modify_fn +# undef STORE_method_set_revoke_function +# define STORE_method_set_revoke_function STORE_meth_set_revoke_fn +# undef STORE_method_set_delete_function +# define STORE_method_set_delete_function STORE_meth_set_delete_fn +# undef STORE_method_set_list_start_function +# define STORE_method_set_list_start_function STORE_meth_set_list_start_fn +# undef STORE_method_set_list_next_function +# define STORE_method_set_list_next_function STORE_meth_set_list_next_fn +# undef STORE_method_set_list_end_function +# define STORE_method_set_list_end_function STORE_meth_set_list_end_fn +# undef STORE_method_set_update_store_function +# define STORE_method_set_update_store_function STORE_meth_set_update_store_fn +# undef STORE_method_set_lock_store_function +# define STORE_method_set_lock_store_function STORE_meth_set_lock_store_fn +# undef STORE_method_set_unlock_store_function +# define STORE_method_set_unlock_store_function STORE_meth_set_unlock_store_fn +# undef STORE_method_get_initialise_function +# define STORE_method_get_initialise_function STORE_meth_get_initialise_fn +# undef STORE_method_get_cleanup_function +# define STORE_method_get_cleanup_function STORE_meth_get_cleanup_fn +# undef STORE_method_get_generate_function +# define STORE_method_get_generate_function STORE_meth_get_generate_fn +# undef STORE_method_get_modify_function +# define STORE_method_get_modify_function STORE_meth_get_modify_fn +# undef STORE_method_get_revoke_function +# define STORE_method_get_revoke_function STORE_meth_get_revoke_fn +# undef STORE_method_get_delete_function +# define STORE_method_get_delete_function STORE_meth_get_delete_fn +# undef STORE_method_get_list_start_function +# define STORE_method_get_list_start_function STORE_meth_get_list_start_fn +# undef STORE_method_get_list_next_function +# define STORE_method_get_list_next_function STORE_meth_get_list_next_fn +# undef STORE_method_get_list_end_function +# define STORE_method_get_list_end_function STORE_meth_get_list_end_fn +# undef STORE_method_get_update_store_function +# define STORE_method_get_update_store_function STORE_meth_get_update_store_fn +# undef STORE_method_get_lock_store_function +# define STORE_method_get_lock_store_function STORE_meth_get_lock_store_fn +# undef STORE_method_get_unlock_store_function +# define STORE_method_get_unlock_store_function STORE_meth_get_unlock_store_fn + +/* Hack some long TS names */ +# undef TS_RESP_CTX_set_status_info_cond +# define TS_RESP_CTX_set_status_info_cond TS_RESP_CTX_set_stat_info_cond +# undef TS_RESP_CTX_set_clock_precision_digits +# define TS_RESP_CTX_set_clock_precision_digits TS_RESP_CTX_set_clk_prec_digits +# undef TS_CONF_set_clock_precision_digits +# define TS_CONF_set_clock_precision_digits TS_CONF_set_clk_prec_digits + +/* Hack some long CMS names */ +# undef CMS_RecipientInfo_ktri_get0_algs +# define CMS_RecipientInfo_ktri_get0_algs CMS_RecipInfo_ktri_get0_algs +# undef CMS_RecipientInfo_ktri_get0_signer_id +# define CMS_RecipientInfo_ktri_get0_signer_id CMS_RecipInfo_ktri_get0_sigr_id +# undef CMS_OtherRevocationInfoFormat_it +# define CMS_OtherRevocationInfoFormat_it CMS_OtherRevocInfoFormat_it +# undef CMS_KeyAgreeRecipientIdentifier_it +# define CMS_KeyAgreeRecipientIdentifier_it CMS_KeyAgreeRecipIdentifier_it +# undef CMS_OriginatorIdentifierOrKey_it +# define CMS_OriginatorIdentifierOrKey_it CMS_OriginatorIdOrKey_it +# undef cms_SignerIdentifier_get0_signer_id +# define cms_SignerIdentifier_get0_signer_id cms_SignerId_get0_signer_id +# undef CMS_RecipientInfo_kari_get0_orig_id +# define CMS_RecipientInfo_kari_get0_orig_id CMS_RecipInfo_kari_get0_orig_id +# undef CMS_RecipientInfo_kari_get0_reks +# define CMS_RecipientInfo_kari_get0_reks CMS_RecipInfo_kari_get0_reks +# undef CMS_RecipientEncryptedKey_cert_cmp +# define CMS_RecipientEncryptedKey_cert_cmp CMS_RecipEncryptedKey_cert_cmp +# undef CMS_RecipientInfo_kari_set0_pkey +# define CMS_RecipientInfo_kari_set0_pkey CMS_RecipInfo_kari_set0_pkey +# undef CMS_RecipientEncryptedKey_get0_id +# define CMS_RecipientEncryptedKey_get0_id CMS_RecipEncryptedKey_get0_id +# undef CMS_RecipientInfo_kari_orig_id_cmp +# define CMS_RecipientInfo_kari_orig_id_cmp CMS_RecipInfo_kari_orig_id_cmp + +/* Hack some long DTLS1 names */ +# undef dtls1_retransmit_buffered_messages +# define dtls1_retransmit_buffered_messages dtls1_retransmit_buffered_msgs + +/* Hack some long SRP names */ +# undef SRP_generate_server_master_secret +# define SRP_generate_server_master_secret SRP_gen_server_master_secret +# undef SRP_generate_client_master_secret +# define SRP_generate_client_master_secret SRP_gen_client_master_secret + +/* Hack some long UI names */ +# undef UI_method_get_prompt_constructor +# define UI_method_get_prompt_constructor UI_method_get_prompt_constructr +# undef UI_method_set_prompt_constructor +# define UI_method_set_prompt_constructor UI_method_set_prompt_constructr + +# endif /* defined OPENSSL_SYS_VMS */ + +/* Case insensitive linking causes problems.... */ +# if defined(OPENSSL_SYS_VMS) || defined(OPENSSL_SYS_OS2) +# undef ERR_load_CRYPTO_strings +# define ERR_load_CRYPTO_strings ERR_load_CRYPTOlib_strings +# undef OCSP_crlID_new +# define OCSP_crlID_new OCSP_crlID2_new + +# undef d2i_ECPARAMETERS +# define d2i_ECPARAMETERS d2i_UC_ECPARAMETERS +# undef i2d_ECPARAMETERS +# define i2d_ECPARAMETERS i2d_UC_ECPARAMETERS +# undef d2i_ECPKPARAMETERS +# define d2i_ECPKPARAMETERS d2i_UC_ECPKPARAMETERS +# undef i2d_ECPKPARAMETERS +# define i2d_ECPKPARAMETERS i2d_UC_ECPKPARAMETERS + +/* + * These functions do not seem to exist! However, I'm paranoid... Original + * command in x509v3.h: These functions are being redefined in another + * directory, and clash when the linker is case-insensitive, so let's hide + * them a little, by giving them an extra 'o' at the beginning of the name... + */ +# undef X509v3_cleanup_extensions +# define X509v3_cleanup_extensions oX509v3_cleanup_extensions +# undef X509v3_add_extension +# define X509v3_add_extension oX509v3_add_extension +# undef X509v3_add_netscape_extensions +# define X509v3_add_netscape_extensions oX509v3_add_netscape_extensions +# undef X509v3_add_standard_extensions +# define X509v3_add_standard_extensions oX509v3_add_standard_extensions + +/* This one clashes with CMS_data_create */ +# undef cms_Data_create +# define cms_Data_create priv_cms_Data_create + +# endif + +#endif /* ! defined HEADER_VMS_IDHACKS_H */ diff --git a/ext/openssl-osx/include/openssl/tls1.h b/ext/openssl-osx/include/openssl/tls1.h new file mode 100644 index 00000000..5929607f --- /dev/null +++ b/ext/openssl-osx/include/openssl/tls1.h @@ -0,0 +1,813 @@ +/* ssl/tls1.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ +/* ==================================================================== + * Copyright (c) 1998-2006 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +/* ==================================================================== + * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. + * + * Portions of the attached software ("Contribution") are developed by + * SUN MICROSYSTEMS, INC., and are contributed to the OpenSSL project. + * + * The Contribution is licensed pursuant to the OpenSSL open source + * license provided above. + * + * ECC cipher suite support in OpenSSL originally written by + * Vipul Gupta and Sumit Gupta of Sun Microsystems Laboratories. + * + */ +/* ==================================================================== + * Copyright 2005 Nokia. All rights reserved. + * + * The portions of the attached software ("Contribution") is developed by + * Nokia Corporation and is licensed pursuant to the OpenSSL open source + * license. + * + * The Contribution, originally written by Mika Kousa and Pasi Eronen of + * Nokia Corporation, consists of the "PSK" (Pre-Shared Key) ciphersuites + * support (see RFC 4279) to OpenSSL. + * + * No patent licenses or other rights except those expressly stated in + * the OpenSSL open source license shall be deemed granted or received + * expressly, by implication, estoppel, or otherwise. + * + * No assurances are provided by Nokia that the Contribution does not + * infringe the patent or other intellectual property rights of any third + * party or that the license provides you with all the necessary rights + * to make use of the Contribution. + * + * THE SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. IN + * ADDITION TO THE DISCLAIMERS INCLUDED IN THE LICENSE, NOKIA + * SPECIFICALLY DISCLAIMS ANY LIABILITY FOR CLAIMS BROUGHT BY YOU OR ANY + * OTHER ENTITY BASED ON INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS OR + * OTHERWISE. + */ + +#ifndef HEADER_TLS1_H +# define HEADER_TLS1_H + +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# define TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES 0 + +# define TLS1_VERSION 0x0301 +# define TLS1_1_VERSION 0x0302 +# define TLS1_2_VERSION 0x0303 +# define TLS_MAX_VERSION TLS1_2_VERSION + +# define TLS1_VERSION_MAJOR 0x03 +# define TLS1_VERSION_MINOR 0x01 + +# define TLS1_1_VERSION_MAJOR 0x03 +# define TLS1_1_VERSION_MINOR 0x02 + +# define TLS1_2_VERSION_MAJOR 0x03 +# define TLS1_2_VERSION_MINOR 0x03 + +# define TLS1_get_version(s) \ + ((s->version >> 8) == TLS1_VERSION_MAJOR ? s->version : 0) + +# define TLS1_get_client_version(s) \ + ((s->client_version >> 8) == TLS1_VERSION_MAJOR ? s->client_version : 0) + +# define TLS1_AD_DECRYPTION_FAILED 21 +# define TLS1_AD_RECORD_OVERFLOW 22 +# define TLS1_AD_UNKNOWN_CA 48/* fatal */ +# define TLS1_AD_ACCESS_DENIED 49/* fatal */ +# define TLS1_AD_DECODE_ERROR 50/* fatal */ +# define TLS1_AD_DECRYPT_ERROR 51 +# define TLS1_AD_EXPORT_RESTRICTION 60/* fatal */ +# define TLS1_AD_PROTOCOL_VERSION 70/* fatal */ +# define TLS1_AD_INSUFFICIENT_SECURITY 71/* fatal */ +# define TLS1_AD_INTERNAL_ERROR 80/* fatal */ +# define TLS1_AD_INAPPROPRIATE_FALLBACK 86/* fatal */ +# define TLS1_AD_USER_CANCELLED 90 +# define TLS1_AD_NO_RENEGOTIATION 100 +/* codes 110-114 are from RFC3546 */ +# define TLS1_AD_UNSUPPORTED_EXTENSION 110 +# define TLS1_AD_CERTIFICATE_UNOBTAINABLE 111 +# define TLS1_AD_UNRECOGNIZED_NAME 112 +# define TLS1_AD_BAD_CERTIFICATE_STATUS_RESPONSE 113 +# define TLS1_AD_BAD_CERTIFICATE_HASH_VALUE 114 +# define TLS1_AD_UNKNOWN_PSK_IDENTITY 115/* fatal */ + +/* ExtensionType values from RFC3546 / RFC4366 / RFC6066 */ +# define TLSEXT_TYPE_server_name 0 +# define TLSEXT_TYPE_max_fragment_length 1 +# define TLSEXT_TYPE_client_certificate_url 2 +# define TLSEXT_TYPE_trusted_ca_keys 3 +# define TLSEXT_TYPE_truncated_hmac 4 +# define TLSEXT_TYPE_status_request 5 +/* ExtensionType values from RFC4681 */ +# define TLSEXT_TYPE_user_mapping 6 +/* ExtensionType values from RFC5878 */ +# define TLSEXT_TYPE_client_authz 7 +# define TLSEXT_TYPE_server_authz 8 +/* ExtensionType values from RFC6091 */ +# define TLSEXT_TYPE_cert_type 9 + +/* ExtensionType values from RFC4492 */ +# define TLSEXT_TYPE_elliptic_curves 10 +# define TLSEXT_TYPE_ec_point_formats 11 + +/* ExtensionType value from RFC5054 */ +# define TLSEXT_TYPE_srp 12 + +/* ExtensionType values from RFC5246 */ +# define TLSEXT_TYPE_signature_algorithms 13 + +/* ExtensionType value from RFC5764 */ +# define TLSEXT_TYPE_use_srtp 14 + +/* ExtensionType value from RFC5620 */ +# define TLSEXT_TYPE_heartbeat 15 + +/* ExtensionType value from draft-ietf-tls-applayerprotoneg-00 */ +# define TLSEXT_TYPE_application_layer_protocol_negotiation 16 + +/* + * ExtensionType value for TLS padding extension. + * http://www.iana.org/assignments/tls-extensiontype-values/tls-extensiontype-values.xhtml + * http://tools.ietf.org/html/draft-agl-tls-padding-03 + */ +# define TLSEXT_TYPE_padding 21 + +/* ExtensionType value from RFC4507 */ +# define TLSEXT_TYPE_session_ticket 35 + +/* ExtensionType value from draft-rescorla-tls-opaque-prf-input-00.txt */ +# if 0 +/* + * will have to be provided externally for now , + * i.e. build with -DTLSEXT_TYPE_opaque_prf_input=38183 + * using whatever extension number you'd like to try + */ +# define TLSEXT_TYPE_opaque_prf_input ?? +# endif + +/* Temporary extension type */ +# define TLSEXT_TYPE_renegotiate 0xff01 + +# ifndef OPENSSL_NO_NEXTPROTONEG +/* This is not an IANA defined extension number */ +# define TLSEXT_TYPE_next_proto_neg 13172 +# endif + +/* NameType value from RFC 3546 */ +# define TLSEXT_NAMETYPE_host_name 0 +/* status request value from RFC 3546 */ +# define TLSEXT_STATUSTYPE_ocsp 1 + +/* ECPointFormat values from draft-ietf-tls-ecc-12 */ +# define TLSEXT_ECPOINTFORMAT_first 0 +# define TLSEXT_ECPOINTFORMAT_uncompressed 0 +# define TLSEXT_ECPOINTFORMAT_ansiX962_compressed_prime 1 +# define TLSEXT_ECPOINTFORMAT_ansiX962_compressed_char2 2 +# define TLSEXT_ECPOINTFORMAT_last 2 + +/* Signature and hash algorithms from RFC 5246 */ + +# define TLSEXT_signature_anonymous 0 +# define TLSEXT_signature_rsa 1 +# define TLSEXT_signature_dsa 2 +# define TLSEXT_signature_ecdsa 3 + +/* Total number of different signature algorithms */ +# define TLSEXT_signature_num 4 + +# define TLSEXT_hash_none 0 +# define TLSEXT_hash_md5 1 +# define TLSEXT_hash_sha1 2 +# define TLSEXT_hash_sha224 3 +# define TLSEXT_hash_sha256 4 +# define TLSEXT_hash_sha384 5 +# define TLSEXT_hash_sha512 6 + +/* Total number of different digest algorithms */ + +# define TLSEXT_hash_num 7 + +/* Flag set for unrecognised algorithms */ +# define TLSEXT_nid_unknown 0x1000000 + +/* ECC curves */ + +# define TLSEXT_curve_P_256 23 +# define TLSEXT_curve_P_384 24 + +# ifndef OPENSSL_NO_TLSEXT + +# define TLSEXT_MAXLEN_host_name 255 + +const char *SSL_get_servername(const SSL *s, const int type); +int SSL_get_servername_type(const SSL *s); +/* + * SSL_export_keying_material exports a value derived from the master secret, + * as specified in RFC 5705. It writes |olen| bytes to |out| given a label and + * optional context. (Since a zero length context is allowed, the |use_context| + * flag controls whether a context is included.) It returns 1 on success and + * zero otherwise. + */ +int SSL_export_keying_material(SSL *s, unsigned char *out, size_t olen, + const char *label, size_t llen, + const unsigned char *p, size_t plen, + int use_context); + +int SSL_get_sigalgs(SSL *s, int idx, + int *psign, int *phash, int *psignandhash, + unsigned char *rsig, unsigned char *rhash); + +int SSL_get_shared_sigalgs(SSL *s, int idx, + int *psign, int *phash, int *psignandhash, + unsigned char *rsig, unsigned char *rhash); + +int SSL_check_chain(SSL *s, X509 *x, EVP_PKEY *pk, STACK_OF(X509) *chain); + +# define SSL_set_tlsext_host_name(s,name) \ +SSL_ctrl(s,SSL_CTRL_SET_TLSEXT_HOSTNAME,TLSEXT_NAMETYPE_host_name,(char *)name) + +# define SSL_set_tlsext_debug_callback(ssl, cb) \ +SSL_callback_ctrl(ssl,SSL_CTRL_SET_TLSEXT_DEBUG_CB,(void (*)(void))cb) + +# define SSL_set_tlsext_debug_arg(ssl, arg) \ +SSL_ctrl(ssl,SSL_CTRL_SET_TLSEXT_DEBUG_ARG,0, (void *)arg) + +# define SSL_set_tlsext_status_type(ssl, type) \ +SSL_ctrl(ssl,SSL_CTRL_SET_TLSEXT_STATUS_REQ_TYPE,type, NULL) + +# define SSL_get_tlsext_status_exts(ssl, arg) \ +SSL_ctrl(ssl,SSL_CTRL_GET_TLSEXT_STATUS_REQ_EXTS,0, (void *)arg) + +# define SSL_set_tlsext_status_exts(ssl, arg) \ +SSL_ctrl(ssl,SSL_CTRL_SET_TLSEXT_STATUS_REQ_EXTS,0, (void *)arg) + +# define SSL_get_tlsext_status_ids(ssl, arg) \ +SSL_ctrl(ssl,SSL_CTRL_GET_TLSEXT_STATUS_REQ_IDS,0, (void *)arg) + +# define SSL_set_tlsext_status_ids(ssl, arg) \ +SSL_ctrl(ssl,SSL_CTRL_SET_TLSEXT_STATUS_REQ_IDS,0, (void *)arg) + +# define SSL_get_tlsext_status_ocsp_resp(ssl, arg) \ +SSL_ctrl(ssl,SSL_CTRL_GET_TLSEXT_STATUS_REQ_OCSP_RESP,0, (void *)arg) + +# define SSL_set_tlsext_status_ocsp_resp(ssl, arg, arglen) \ +SSL_ctrl(ssl,SSL_CTRL_SET_TLSEXT_STATUS_REQ_OCSP_RESP,arglen, (void *)arg) + +# define SSL_CTX_set_tlsext_servername_callback(ctx, cb) \ +SSL_CTX_callback_ctrl(ctx,SSL_CTRL_SET_TLSEXT_SERVERNAME_CB,(void (*)(void))cb) + +# define SSL_TLSEXT_ERR_OK 0 +# define SSL_TLSEXT_ERR_ALERT_WARNING 1 +# define SSL_TLSEXT_ERR_ALERT_FATAL 2 +# define SSL_TLSEXT_ERR_NOACK 3 + +# define SSL_CTX_set_tlsext_servername_arg(ctx, arg) \ +SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TLSEXT_SERVERNAME_ARG,0, (void *)arg) + +# define SSL_CTX_get_tlsext_ticket_keys(ctx, keys, keylen) \ + SSL_CTX_ctrl((ctx),SSL_CTRL_GET_TLSEXT_TICKET_KEYS,(keylen),(keys)) +# define SSL_CTX_set_tlsext_ticket_keys(ctx, keys, keylen) \ + SSL_CTX_ctrl((ctx),SSL_CTRL_SET_TLSEXT_TICKET_KEYS,(keylen),(keys)) + +# define SSL_CTX_set_tlsext_status_cb(ssl, cb) \ +SSL_CTX_callback_ctrl(ssl,SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB,(void (*)(void))cb) + +# define SSL_CTX_set_tlsext_status_arg(ssl, arg) \ +SSL_CTX_ctrl(ssl,SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB_ARG,0, (void *)arg) + +# define SSL_set_tlsext_opaque_prf_input(s, src, len) \ +SSL_ctrl(s,SSL_CTRL_SET_TLSEXT_OPAQUE_PRF_INPUT, len, src) +# define SSL_CTX_set_tlsext_opaque_prf_input_callback(ctx, cb) \ +SSL_CTX_callback_ctrl(ctx,SSL_CTRL_SET_TLSEXT_OPAQUE_PRF_INPUT_CB, (void (*)(void))cb) +# define SSL_CTX_set_tlsext_opaque_prf_input_callback_arg(ctx, arg) \ +SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TLSEXT_OPAQUE_PRF_INPUT_CB_ARG, 0, arg) + +# define SSL_CTX_set_tlsext_ticket_key_cb(ssl, cb) \ +SSL_CTX_callback_ctrl(ssl,SSL_CTRL_SET_TLSEXT_TICKET_KEY_CB,(void (*)(void))cb) + +# ifndef OPENSSL_NO_HEARTBEATS +# define SSL_TLSEXT_HB_ENABLED 0x01 +# define SSL_TLSEXT_HB_DONT_SEND_REQUESTS 0x02 +# define SSL_TLSEXT_HB_DONT_RECV_REQUESTS 0x04 + +# define SSL_get_tlsext_heartbeat_pending(ssl) \ + SSL_ctrl((ssl),SSL_CTRL_GET_TLS_EXT_HEARTBEAT_PENDING,0,NULL) +# define SSL_set_tlsext_heartbeat_no_requests(ssl, arg) \ + SSL_ctrl((ssl),SSL_CTRL_SET_TLS_EXT_HEARTBEAT_NO_REQUESTS,arg,NULL) +# endif +# endif + +/* PSK ciphersuites from 4279 */ +# define TLS1_CK_PSK_WITH_RC4_128_SHA 0x0300008A +# define TLS1_CK_PSK_WITH_3DES_EDE_CBC_SHA 0x0300008B +# define TLS1_CK_PSK_WITH_AES_128_CBC_SHA 0x0300008C +# define TLS1_CK_PSK_WITH_AES_256_CBC_SHA 0x0300008D + +/* + * Additional TLS ciphersuites from expired Internet Draft + * draft-ietf-tls-56-bit-ciphersuites-01.txt (available if + * TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES is defined, see s3_lib.c). We + * actually treat them like SSL 3.0 ciphers, which we probably shouldn't. + * Note that the first two are actually not in the IDs. + */ +# define TLS1_CK_RSA_EXPORT1024_WITH_RC4_56_MD5 0x03000060/* not in + * ID */ +# define TLS1_CK_RSA_EXPORT1024_WITH_RC2_CBC_56_MD5 0x03000061/* not in + * ID */ +# define TLS1_CK_RSA_EXPORT1024_WITH_DES_CBC_SHA 0x03000062 +# define TLS1_CK_DHE_DSS_EXPORT1024_WITH_DES_CBC_SHA 0x03000063 +# define TLS1_CK_RSA_EXPORT1024_WITH_RC4_56_SHA 0x03000064 +# define TLS1_CK_DHE_DSS_EXPORT1024_WITH_RC4_56_SHA 0x03000065 +# define TLS1_CK_DHE_DSS_WITH_RC4_128_SHA 0x03000066 + +/* AES ciphersuites from RFC3268 */ + +# define TLS1_CK_RSA_WITH_AES_128_SHA 0x0300002F +# define TLS1_CK_DH_DSS_WITH_AES_128_SHA 0x03000030 +# define TLS1_CK_DH_RSA_WITH_AES_128_SHA 0x03000031 +# define TLS1_CK_DHE_DSS_WITH_AES_128_SHA 0x03000032 +# define TLS1_CK_DHE_RSA_WITH_AES_128_SHA 0x03000033 +# define TLS1_CK_ADH_WITH_AES_128_SHA 0x03000034 + +# define TLS1_CK_RSA_WITH_AES_256_SHA 0x03000035 +# define TLS1_CK_DH_DSS_WITH_AES_256_SHA 0x03000036 +# define TLS1_CK_DH_RSA_WITH_AES_256_SHA 0x03000037 +# define TLS1_CK_DHE_DSS_WITH_AES_256_SHA 0x03000038 +# define TLS1_CK_DHE_RSA_WITH_AES_256_SHA 0x03000039 +# define TLS1_CK_ADH_WITH_AES_256_SHA 0x0300003A + +/* TLS v1.2 ciphersuites */ +# define TLS1_CK_RSA_WITH_NULL_SHA256 0x0300003B +# define TLS1_CK_RSA_WITH_AES_128_SHA256 0x0300003C +# define TLS1_CK_RSA_WITH_AES_256_SHA256 0x0300003D +# define TLS1_CK_DH_DSS_WITH_AES_128_SHA256 0x0300003E +# define TLS1_CK_DH_RSA_WITH_AES_128_SHA256 0x0300003F +# define TLS1_CK_DHE_DSS_WITH_AES_128_SHA256 0x03000040 + +/* Camellia ciphersuites from RFC4132 */ +# define TLS1_CK_RSA_WITH_CAMELLIA_128_CBC_SHA 0x03000041 +# define TLS1_CK_DH_DSS_WITH_CAMELLIA_128_CBC_SHA 0x03000042 +# define TLS1_CK_DH_RSA_WITH_CAMELLIA_128_CBC_SHA 0x03000043 +# define TLS1_CK_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA 0x03000044 +# define TLS1_CK_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA 0x03000045 +# define TLS1_CK_ADH_WITH_CAMELLIA_128_CBC_SHA 0x03000046 + +/* TLS v1.2 ciphersuites */ +# define TLS1_CK_DHE_RSA_WITH_AES_128_SHA256 0x03000067 +# define TLS1_CK_DH_DSS_WITH_AES_256_SHA256 0x03000068 +# define TLS1_CK_DH_RSA_WITH_AES_256_SHA256 0x03000069 +# define TLS1_CK_DHE_DSS_WITH_AES_256_SHA256 0x0300006A +# define TLS1_CK_DHE_RSA_WITH_AES_256_SHA256 0x0300006B +# define TLS1_CK_ADH_WITH_AES_128_SHA256 0x0300006C +# define TLS1_CK_ADH_WITH_AES_256_SHA256 0x0300006D + +/* Camellia ciphersuites from RFC4132 */ +# define TLS1_CK_RSA_WITH_CAMELLIA_256_CBC_SHA 0x03000084 +# define TLS1_CK_DH_DSS_WITH_CAMELLIA_256_CBC_SHA 0x03000085 +# define TLS1_CK_DH_RSA_WITH_CAMELLIA_256_CBC_SHA 0x03000086 +# define TLS1_CK_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA 0x03000087 +# define TLS1_CK_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA 0x03000088 +# define TLS1_CK_ADH_WITH_CAMELLIA_256_CBC_SHA 0x03000089 + +/* SEED ciphersuites from RFC4162 */ +# define TLS1_CK_RSA_WITH_SEED_SHA 0x03000096 +# define TLS1_CK_DH_DSS_WITH_SEED_SHA 0x03000097 +# define TLS1_CK_DH_RSA_WITH_SEED_SHA 0x03000098 +# define TLS1_CK_DHE_DSS_WITH_SEED_SHA 0x03000099 +# define TLS1_CK_DHE_RSA_WITH_SEED_SHA 0x0300009A +# define TLS1_CK_ADH_WITH_SEED_SHA 0x0300009B + +/* TLS v1.2 GCM ciphersuites from RFC5288 */ +# define TLS1_CK_RSA_WITH_AES_128_GCM_SHA256 0x0300009C +# define TLS1_CK_RSA_WITH_AES_256_GCM_SHA384 0x0300009D +# define TLS1_CK_DHE_RSA_WITH_AES_128_GCM_SHA256 0x0300009E +# define TLS1_CK_DHE_RSA_WITH_AES_256_GCM_SHA384 0x0300009F +# define TLS1_CK_DH_RSA_WITH_AES_128_GCM_SHA256 0x030000A0 +# define TLS1_CK_DH_RSA_WITH_AES_256_GCM_SHA384 0x030000A1 +# define TLS1_CK_DHE_DSS_WITH_AES_128_GCM_SHA256 0x030000A2 +# define TLS1_CK_DHE_DSS_WITH_AES_256_GCM_SHA384 0x030000A3 +# define TLS1_CK_DH_DSS_WITH_AES_128_GCM_SHA256 0x030000A4 +# define TLS1_CK_DH_DSS_WITH_AES_256_GCM_SHA384 0x030000A5 +# define TLS1_CK_ADH_WITH_AES_128_GCM_SHA256 0x030000A6 +# define TLS1_CK_ADH_WITH_AES_256_GCM_SHA384 0x030000A7 + +/* + * ECC ciphersuites from draft-ietf-tls-ecc-12.txt with changes soon to be in + * draft 13 + */ +# define TLS1_CK_ECDH_ECDSA_WITH_NULL_SHA 0x0300C001 +# define TLS1_CK_ECDH_ECDSA_WITH_RC4_128_SHA 0x0300C002 +# define TLS1_CK_ECDH_ECDSA_WITH_DES_192_CBC3_SHA 0x0300C003 +# define TLS1_CK_ECDH_ECDSA_WITH_AES_128_CBC_SHA 0x0300C004 +# define TLS1_CK_ECDH_ECDSA_WITH_AES_256_CBC_SHA 0x0300C005 + +# define TLS1_CK_ECDHE_ECDSA_WITH_NULL_SHA 0x0300C006 +# define TLS1_CK_ECDHE_ECDSA_WITH_RC4_128_SHA 0x0300C007 +# define TLS1_CK_ECDHE_ECDSA_WITH_DES_192_CBC3_SHA 0x0300C008 +# define TLS1_CK_ECDHE_ECDSA_WITH_AES_128_CBC_SHA 0x0300C009 +# define TLS1_CK_ECDHE_ECDSA_WITH_AES_256_CBC_SHA 0x0300C00A + +# define TLS1_CK_ECDH_RSA_WITH_NULL_SHA 0x0300C00B +# define TLS1_CK_ECDH_RSA_WITH_RC4_128_SHA 0x0300C00C +# define TLS1_CK_ECDH_RSA_WITH_DES_192_CBC3_SHA 0x0300C00D +# define TLS1_CK_ECDH_RSA_WITH_AES_128_CBC_SHA 0x0300C00E +# define TLS1_CK_ECDH_RSA_WITH_AES_256_CBC_SHA 0x0300C00F + +# define TLS1_CK_ECDHE_RSA_WITH_NULL_SHA 0x0300C010 +# define TLS1_CK_ECDHE_RSA_WITH_RC4_128_SHA 0x0300C011 +# define TLS1_CK_ECDHE_RSA_WITH_DES_192_CBC3_SHA 0x0300C012 +# define TLS1_CK_ECDHE_RSA_WITH_AES_128_CBC_SHA 0x0300C013 +# define TLS1_CK_ECDHE_RSA_WITH_AES_256_CBC_SHA 0x0300C014 + +# define TLS1_CK_ECDH_anon_WITH_NULL_SHA 0x0300C015 +# define TLS1_CK_ECDH_anon_WITH_RC4_128_SHA 0x0300C016 +# define TLS1_CK_ECDH_anon_WITH_DES_192_CBC3_SHA 0x0300C017 +# define TLS1_CK_ECDH_anon_WITH_AES_128_CBC_SHA 0x0300C018 +# define TLS1_CK_ECDH_anon_WITH_AES_256_CBC_SHA 0x0300C019 + +/* SRP ciphersuites from RFC 5054 */ +# define TLS1_CK_SRP_SHA_WITH_3DES_EDE_CBC_SHA 0x0300C01A +# define TLS1_CK_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA 0x0300C01B +# define TLS1_CK_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA 0x0300C01C +# define TLS1_CK_SRP_SHA_WITH_AES_128_CBC_SHA 0x0300C01D +# define TLS1_CK_SRP_SHA_RSA_WITH_AES_128_CBC_SHA 0x0300C01E +# define TLS1_CK_SRP_SHA_DSS_WITH_AES_128_CBC_SHA 0x0300C01F +# define TLS1_CK_SRP_SHA_WITH_AES_256_CBC_SHA 0x0300C020 +# define TLS1_CK_SRP_SHA_RSA_WITH_AES_256_CBC_SHA 0x0300C021 +# define TLS1_CK_SRP_SHA_DSS_WITH_AES_256_CBC_SHA 0x0300C022 + +/* ECDH HMAC based ciphersuites from RFC5289 */ + +# define TLS1_CK_ECDHE_ECDSA_WITH_AES_128_SHA256 0x0300C023 +# define TLS1_CK_ECDHE_ECDSA_WITH_AES_256_SHA384 0x0300C024 +# define TLS1_CK_ECDH_ECDSA_WITH_AES_128_SHA256 0x0300C025 +# define TLS1_CK_ECDH_ECDSA_WITH_AES_256_SHA384 0x0300C026 +# define TLS1_CK_ECDHE_RSA_WITH_AES_128_SHA256 0x0300C027 +# define TLS1_CK_ECDHE_RSA_WITH_AES_256_SHA384 0x0300C028 +# define TLS1_CK_ECDH_RSA_WITH_AES_128_SHA256 0x0300C029 +# define TLS1_CK_ECDH_RSA_WITH_AES_256_SHA384 0x0300C02A + +/* ECDH GCM based ciphersuites from RFC5289 */ +# define TLS1_CK_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 0x0300C02B +# define TLS1_CK_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 0x0300C02C +# define TLS1_CK_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 0x0300C02D +# define TLS1_CK_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 0x0300C02E +# define TLS1_CK_ECDHE_RSA_WITH_AES_128_GCM_SHA256 0x0300C02F +# define TLS1_CK_ECDHE_RSA_WITH_AES_256_GCM_SHA384 0x0300C030 +# define TLS1_CK_ECDH_RSA_WITH_AES_128_GCM_SHA256 0x0300C031 +# define TLS1_CK_ECDH_RSA_WITH_AES_256_GCM_SHA384 0x0300C032 + +/* + * XXX * Backward compatibility alert: + * Older versions of OpenSSL gave + * some DHE ciphers names with "EDH" + * instead of "DHE". Going forward, we + * should be using DHE + * everywhere, though we may indefinitely maintain + * aliases for users + * or configurations that used "EDH" + + */ +# define TLS1_TXT_RSA_EXPORT1024_WITH_RC4_56_MD5 "EXP1024-RC4-MD5" +# define TLS1_TXT_RSA_EXPORT1024_WITH_RC2_CBC_56_MD5 "EXP1024-RC2-CBC-MD5" +# define TLS1_TXT_RSA_EXPORT1024_WITH_DES_CBC_SHA "EXP1024-DES-CBC-SHA" +# define TLS1_TXT_DHE_DSS_EXPORT1024_WITH_DES_CBC_SHA "EXP1024-DHE-DSS-DES-CBC-SHA" +# define TLS1_TXT_RSA_EXPORT1024_WITH_RC4_56_SHA "EXP1024-RC4-SHA" +# define TLS1_TXT_DHE_DSS_EXPORT1024_WITH_RC4_56_SHA "EXP1024-DHE-DSS-RC4-SHA" +# define TLS1_TXT_DHE_DSS_WITH_RC4_128_SHA "DHE-DSS-RC4-SHA" + +/* AES ciphersuites from RFC3268 */ +# define TLS1_TXT_RSA_WITH_AES_128_SHA "AES128-SHA" +# define TLS1_TXT_DH_DSS_WITH_AES_128_SHA "DH-DSS-AES128-SHA" +# define TLS1_TXT_DH_RSA_WITH_AES_128_SHA "DH-RSA-AES128-SHA" +# define TLS1_TXT_DHE_DSS_WITH_AES_128_SHA "DHE-DSS-AES128-SHA" +# define TLS1_TXT_DHE_RSA_WITH_AES_128_SHA "DHE-RSA-AES128-SHA" +# define TLS1_TXT_ADH_WITH_AES_128_SHA "ADH-AES128-SHA" + +# define TLS1_TXT_RSA_WITH_AES_256_SHA "AES256-SHA" +# define TLS1_TXT_DH_DSS_WITH_AES_256_SHA "DH-DSS-AES256-SHA" +# define TLS1_TXT_DH_RSA_WITH_AES_256_SHA "DH-RSA-AES256-SHA" +# define TLS1_TXT_DHE_DSS_WITH_AES_256_SHA "DHE-DSS-AES256-SHA" +# define TLS1_TXT_DHE_RSA_WITH_AES_256_SHA "DHE-RSA-AES256-SHA" +# define TLS1_TXT_ADH_WITH_AES_256_SHA "ADH-AES256-SHA" + +/* ECC ciphersuites from draft-ietf-tls-ecc-01.txt (Mar 15, 2001) */ +# define TLS1_TXT_ECDH_ECDSA_WITH_NULL_SHA "ECDH-ECDSA-NULL-SHA" +# define TLS1_TXT_ECDH_ECDSA_WITH_RC4_128_SHA "ECDH-ECDSA-RC4-SHA" +# define TLS1_TXT_ECDH_ECDSA_WITH_DES_192_CBC3_SHA "ECDH-ECDSA-DES-CBC3-SHA" +# define TLS1_TXT_ECDH_ECDSA_WITH_AES_128_CBC_SHA "ECDH-ECDSA-AES128-SHA" +# define TLS1_TXT_ECDH_ECDSA_WITH_AES_256_CBC_SHA "ECDH-ECDSA-AES256-SHA" + +# define TLS1_TXT_ECDHE_ECDSA_WITH_NULL_SHA "ECDHE-ECDSA-NULL-SHA" +# define TLS1_TXT_ECDHE_ECDSA_WITH_RC4_128_SHA "ECDHE-ECDSA-RC4-SHA" +# define TLS1_TXT_ECDHE_ECDSA_WITH_DES_192_CBC3_SHA "ECDHE-ECDSA-DES-CBC3-SHA" +# define TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_CBC_SHA "ECDHE-ECDSA-AES128-SHA" +# define TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_CBC_SHA "ECDHE-ECDSA-AES256-SHA" + +# define TLS1_TXT_ECDH_RSA_WITH_NULL_SHA "ECDH-RSA-NULL-SHA" +# define TLS1_TXT_ECDH_RSA_WITH_RC4_128_SHA "ECDH-RSA-RC4-SHA" +# define TLS1_TXT_ECDH_RSA_WITH_DES_192_CBC3_SHA "ECDH-RSA-DES-CBC3-SHA" +# define TLS1_TXT_ECDH_RSA_WITH_AES_128_CBC_SHA "ECDH-RSA-AES128-SHA" +# define TLS1_TXT_ECDH_RSA_WITH_AES_256_CBC_SHA "ECDH-RSA-AES256-SHA" + +# define TLS1_TXT_ECDHE_RSA_WITH_NULL_SHA "ECDHE-RSA-NULL-SHA" +# define TLS1_TXT_ECDHE_RSA_WITH_RC4_128_SHA "ECDHE-RSA-RC4-SHA" +# define TLS1_TXT_ECDHE_RSA_WITH_DES_192_CBC3_SHA "ECDHE-RSA-DES-CBC3-SHA" +# define TLS1_TXT_ECDHE_RSA_WITH_AES_128_CBC_SHA "ECDHE-RSA-AES128-SHA" +# define TLS1_TXT_ECDHE_RSA_WITH_AES_256_CBC_SHA "ECDHE-RSA-AES256-SHA" + +# define TLS1_TXT_ECDH_anon_WITH_NULL_SHA "AECDH-NULL-SHA" +# define TLS1_TXT_ECDH_anon_WITH_RC4_128_SHA "AECDH-RC4-SHA" +# define TLS1_TXT_ECDH_anon_WITH_DES_192_CBC3_SHA "AECDH-DES-CBC3-SHA" +# define TLS1_TXT_ECDH_anon_WITH_AES_128_CBC_SHA "AECDH-AES128-SHA" +# define TLS1_TXT_ECDH_anon_WITH_AES_256_CBC_SHA "AECDH-AES256-SHA" + +/* PSK ciphersuites from RFC 4279 */ +# define TLS1_TXT_PSK_WITH_RC4_128_SHA "PSK-RC4-SHA" +# define TLS1_TXT_PSK_WITH_3DES_EDE_CBC_SHA "PSK-3DES-EDE-CBC-SHA" +# define TLS1_TXT_PSK_WITH_AES_128_CBC_SHA "PSK-AES128-CBC-SHA" +# define TLS1_TXT_PSK_WITH_AES_256_CBC_SHA "PSK-AES256-CBC-SHA" + +/* SRP ciphersuite from RFC 5054 */ +# define TLS1_TXT_SRP_SHA_WITH_3DES_EDE_CBC_SHA "SRP-3DES-EDE-CBC-SHA" +# define TLS1_TXT_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA "SRP-RSA-3DES-EDE-CBC-SHA" +# define TLS1_TXT_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA "SRP-DSS-3DES-EDE-CBC-SHA" +# define TLS1_TXT_SRP_SHA_WITH_AES_128_CBC_SHA "SRP-AES-128-CBC-SHA" +# define TLS1_TXT_SRP_SHA_RSA_WITH_AES_128_CBC_SHA "SRP-RSA-AES-128-CBC-SHA" +# define TLS1_TXT_SRP_SHA_DSS_WITH_AES_128_CBC_SHA "SRP-DSS-AES-128-CBC-SHA" +# define TLS1_TXT_SRP_SHA_WITH_AES_256_CBC_SHA "SRP-AES-256-CBC-SHA" +# define TLS1_TXT_SRP_SHA_RSA_WITH_AES_256_CBC_SHA "SRP-RSA-AES-256-CBC-SHA" +# define TLS1_TXT_SRP_SHA_DSS_WITH_AES_256_CBC_SHA "SRP-DSS-AES-256-CBC-SHA" + +/* Camellia ciphersuites from RFC4132 */ +# define TLS1_TXT_RSA_WITH_CAMELLIA_128_CBC_SHA "CAMELLIA128-SHA" +# define TLS1_TXT_DH_DSS_WITH_CAMELLIA_128_CBC_SHA "DH-DSS-CAMELLIA128-SHA" +# define TLS1_TXT_DH_RSA_WITH_CAMELLIA_128_CBC_SHA "DH-RSA-CAMELLIA128-SHA" +# define TLS1_TXT_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA "DHE-DSS-CAMELLIA128-SHA" +# define TLS1_TXT_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA "DHE-RSA-CAMELLIA128-SHA" +# define TLS1_TXT_ADH_WITH_CAMELLIA_128_CBC_SHA "ADH-CAMELLIA128-SHA" + +# define TLS1_TXT_RSA_WITH_CAMELLIA_256_CBC_SHA "CAMELLIA256-SHA" +# define TLS1_TXT_DH_DSS_WITH_CAMELLIA_256_CBC_SHA "DH-DSS-CAMELLIA256-SHA" +# define TLS1_TXT_DH_RSA_WITH_CAMELLIA_256_CBC_SHA "DH-RSA-CAMELLIA256-SHA" +# define TLS1_TXT_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA "DHE-DSS-CAMELLIA256-SHA" +# define TLS1_TXT_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA "DHE-RSA-CAMELLIA256-SHA" +# define TLS1_TXT_ADH_WITH_CAMELLIA_256_CBC_SHA "ADH-CAMELLIA256-SHA" + +/* SEED ciphersuites from RFC4162 */ +# define TLS1_TXT_RSA_WITH_SEED_SHA "SEED-SHA" +# define TLS1_TXT_DH_DSS_WITH_SEED_SHA "DH-DSS-SEED-SHA" +# define TLS1_TXT_DH_RSA_WITH_SEED_SHA "DH-RSA-SEED-SHA" +# define TLS1_TXT_DHE_DSS_WITH_SEED_SHA "DHE-DSS-SEED-SHA" +# define TLS1_TXT_DHE_RSA_WITH_SEED_SHA "DHE-RSA-SEED-SHA" +# define TLS1_TXT_ADH_WITH_SEED_SHA "ADH-SEED-SHA" + +/* TLS v1.2 ciphersuites */ +# define TLS1_TXT_RSA_WITH_NULL_SHA256 "NULL-SHA256" +# define TLS1_TXT_RSA_WITH_AES_128_SHA256 "AES128-SHA256" +# define TLS1_TXT_RSA_WITH_AES_256_SHA256 "AES256-SHA256" +# define TLS1_TXT_DH_DSS_WITH_AES_128_SHA256 "DH-DSS-AES128-SHA256" +# define TLS1_TXT_DH_RSA_WITH_AES_128_SHA256 "DH-RSA-AES128-SHA256" +# define TLS1_TXT_DHE_DSS_WITH_AES_128_SHA256 "DHE-DSS-AES128-SHA256" +# define TLS1_TXT_DHE_RSA_WITH_AES_128_SHA256 "DHE-RSA-AES128-SHA256" +# define TLS1_TXT_DH_DSS_WITH_AES_256_SHA256 "DH-DSS-AES256-SHA256" +# define TLS1_TXT_DH_RSA_WITH_AES_256_SHA256 "DH-RSA-AES256-SHA256" +# define TLS1_TXT_DHE_DSS_WITH_AES_256_SHA256 "DHE-DSS-AES256-SHA256" +# define TLS1_TXT_DHE_RSA_WITH_AES_256_SHA256 "DHE-RSA-AES256-SHA256" +# define TLS1_TXT_ADH_WITH_AES_128_SHA256 "ADH-AES128-SHA256" +# define TLS1_TXT_ADH_WITH_AES_256_SHA256 "ADH-AES256-SHA256" + +/* TLS v1.2 GCM ciphersuites from RFC5288 */ +# define TLS1_TXT_RSA_WITH_AES_128_GCM_SHA256 "AES128-GCM-SHA256" +# define TLS1_TXT_RSA_WITH_AES_256_GCM_SHA384 "AES256-GCM-SHA384" +# define TLS1_TXT_DHE_RSA_WITH_AES_128_GCM_SHA256 "DHE-RSA-AES128-GCM-SHA256" +# define TLS1_TXT_DHE_RSA_WITH_AES_256_GCM_SHA384 "DHE-RSA-AES256-GCM-SHA384" +# define TLS1_TXT_DH_RSA_WITH_AES_128_GCM_SHA256 "DH-RSA-AES128-GCM-SHA256" +# define TLS1_TXT_DH_RSA_WITH_AES_256_GCM_SHA384 "DH-RSA-AES256-GCM-SHA384" +# define TLS1_TXT_DHE_DSS_WITH_AES_128_GCM_SHA256 "DHE-DSS-AES128-GCM-SHA256" +# define TLS1_TXT_DHE_DSS_WITH_AES_256_GCM_SHA384 "DHE-DSS-AES256-GCM-SHA384" +# define TLS1_TXT_DH_DSS_WITH_AES_128_GCM_SHA256 "DH-DSS-AES128-GCM-SHA256" +# define TLS1_TXT_DH_DSS_WITH_AES_256_GCM_SHA384 "DH-DSS-AES256-GCM-SHA384" +# define TLS1_TXT_ADH_WITH_AES_128_GCM_SHA256 "ADH-AES128-GCM-SHA256" +# define TLS1_TXT_ADH_WITH_AES_256_GCM_SHA384 "ADH-AES256-GCM-SHA384" + +/* ECDH HMAC based ciphersuites from RFC5289 */ + +# define TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_SHA256 "ECDHE-ECDSA-AES128-SHA256" +# define TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_SHA384 "ECDHE-ECDSA-AES256-SHA384" +# define TLS1_TXT_ECDH_ECDSA_WITH_AES_128_SHA256 "ECDH-ECDSA-AES128-SHA256" +# define TLS1_TXT_ECDH_ECDSA_WITH_AES_256_SHA384 "ECDH-ECDSA-AES256-SHA384" +# define TLS1_TXT_ECDHE_RSA_WITH_AES_128_SHA256 "ECDHE-RSA-AES128-SHA256" +# define TLS1_TXT_ECDHE_RSA_WITH_AES_256_SHA384 "ECDHE-RSA-AES256-SHA384" +# define TLS1_TXT_ECDH_RSA_WITH_AES_128_SHA256 "ECDH-RSA-AES128-SHA256" +# define TLS1_TXT_ECDH_RSA_WITH_AES_256_SHA384 "ECDH-RSA-AES256-SHA384" + +/* ECDH GCM based ciphersuites from RFC5289 */ +# define TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 "ECDHE-ECDSA-AES128-GCM-SHA256" +# define TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 "ECDHE-ECDSA-AES256-GCM-SHA384" +# define TLS1_TXT_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 "ECDH-ECDSA-AES128-GCM-SHA256" +# define TLS1_TXT_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 "ECDH-ECDSA-AES256-GCM-SHA384" +# define TLS1_TXT_ECDHE_RSA_WITH_AES_128_GCM_SHA256 "ECDHE-RSA-AES128-GCM-SHA256" +# define TLS1_TXT_ECDHE_RSA_WITH_AES_256_GCM_SHA384 "ECDHE-RSA-AES256-GCM-SHA384" +# define TLS1_TXT_ECDH_RSA_WITH_AES_128_GCM_SHA256 "ECDH-RSA-AES128-GCM-SHA256" +# define TLS1_TXT_ECDH_RSA_WITH_AES_256_GCM_SHA384 "ECDH-RSA-AES256-GCM-SHA384" + +# define TLS_CT_RSA_SIGN 1 +# define TLS_CT_DSS_SIGN 2 +# define TLS_CT_RSA_FIXED_DH 3 +# define TLS_CT_DSS_FIXED_DH 4 +# define TLS_CT_ECDSA_SIGN 64 +# define TLS_CT_RSA_FIXED_ECDH 65 +# define TLS_CT_ECDSA_FIXED_ECDH 66 +# define TLS_CT_GOST94_SIGN 21 +# define TLS_CT_GOST01_SIGN 22 +/* + * when correcting this number, correct also SSL3_CT_NUMBER in ssl3.h (see + * comment there) + */ +# define TLS_CT_NUMBER 9 + +# define TLS1_FINISH_MAC_LENGTH 12 + +# define TLS_MD_MAX_CONST_SIZE 20 +# define TLS_MD_CLIENT_FINISH_CONST "client finished" +# define TLS_MD_CLIENT_FINISH_CONST_SIZE 15 +# define TLS_MD_SERVER_FINISH_CONST "server finished" +# define TLS_MD_SERVER_FINISH_CONST_SIZE 15 +# define TLS_MD_SERVER_WRITE_KEY_CONST "server write key" +# define TLS_MD_SERVER_WRITE_KEY_CONST_SIZE 16 +# define TLS_MD_KEY_EXPANSION_CONST "key expansion" +# define TLS_MD_KEY_EXPANSION_CONST_SIZE 13 +# define TLS_MD_CLIENT_WRITE_KEY_CONST "client write key" +# define TLS_MD_CLIENT_WRITE_KEY_CONST_SIZE 16 +# define TLS_MD_SERVER_WRITE_KEY_CONST "server write key" +# define TLS_MD_SERVER_WRITE_KEY_CONST_SIZE 16 +# define TLS_MD_IV_BLOCK_CONST "IV block" +# define TLS_MD_IV_BLOCK_CONST_SIZE 8 +# define TLS_MD_MASTER_SECRET_CONST "master secret" +# define TLS_MD_MASTER_SECRET_CONST_SIZE 13 + +# ifdef CHARSET_EBCDIC +# undef TLS_MD_CLIENT_FINISH_CONST +/* + * client finished + */ +# define TLS_MD_CLIENT_FINISH_CONST "\x63\x6c\x69\x65\x6e\x74\x20\x66\x69\x6e\x69\x73\x68\x65\x64" + +# undef TLS_MD_SERVER_FINISH_CONST +/* + * server finished + */ +# define TLS_MD_SERVER_FINISH_CONST "\x73\x65\x72\x76\x65\x72\x20\x66\x69\x6e\x69\x73\x68\x65\x64" + +# undef TLS_MD_SERVER_WRITE_KEY_CONST +/* + * server write key + */ +# define TLS_MD_SERVER_WRITE_KEY_CONST "\x73\x65\x72\x76\x65\x72\x20\x77\x72\x69\x74\x65\x20\x6b\x65\x79" + +# undef TLS_MD_KEY_EXPANSION_CONST +/* + * key expansion + */ +# define TLS_MD_KEY_EXPANSION_CONST "\x6b\x65\x79\x20\x65\x78\x70\x61\x6e\x73\x69\x6f\x6e" + +# undef TLS_MD_CLIENT_WRITE_KEY_CONST +/* + * client write key + */ +# define TLS_MD_CLIENT_WRITE_KEY_CONST "\x63\x6c\x69\x65\x6e\x74\x20\x77\x72\x69\x74\x65\x20\x6b\x65\x79" + +# undef TLS_MD_SERVER_WRITE_KEY_CONST +/* + * server write key + */ +# define TLS_MD_SERVER_WRITE_KEY_CONST "\x73\x65\x72\x76\x65\x72\x20\x77\x72\x69\x74\x65\x20\x6b\x65\x79" + +# undef TLS_MD_IV_BLOCK_CONST +/* + * IV block + */ +# define TLS_MD_IV_BLOCK_CONST "\x49\x56\x20\x62\x6c\x6f\x63\x6b" + +# undef TLS_MD_MASTER_SECRET_CONST +/* + * master secret + */ +# define TLS_MD_MASTER_SECRET_CONST "\x6d\x61\x73\x74\x65\x72\x20\x73\x65\x63\x72\x65\x74" +# endif + +/* TLS Session Ticket extension struct */ +struct tls_session_ticket_ext_st { + unsigned short length; + void *data; +}; + +#ifdef __cplusplus +} +#endif +#endif diff --git a/ext/openssl-osx/include/openssl/x509.h b/ext/openssl-osx/include/openssl/x509.h new file mode 100644 index 00000000..99337b84 --- /dev/null +++ b/ext/openssl-osx/include/openssl/x509.h @@ -0,0 +1,1327 @@ +/* crypto/x509/x509.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ +/* ==================================================================== + * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. + * ECDH support in OpenSSL originally developed by + * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project. + */ + +#ifndef HEADER_X509_H +# define HEADER_X509_H + +# include +# include +# ifndef OPENSSL_NO_BUFFER +# include +# endif +# ifndef OPENSSL_NO_EVP +# include +# endif +# ifndef OPENSSL_NO_BIO +# include +# endif +# include +# include +# include + +# ifndef OPENSSL_NO_EC +# include +# endif + +# ifndef OPENSSL_NO_ECDSA +# include +# endif + +# ifndef OPENSSL_NO_ECDH +# include +# endif + +# ifndef OPENSSL_NO_DEPRECATED +# ifndef OPENSSL_NO_RSA +# include +# endif +# ifndef OPENSSL_NO_DSA +# include +# endif +# ifndef OPENSSL_NO_DH +# include +# endif +# endif + +# ifndef OPENSSL_NO_SHA +# include +# endif +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# ifdef OPENSSL_SYS_WIN32 +/* Under Win32 these are defined in wincrypt.h */ +# undef X509_NAME +# undef X509_CERT_PAIR +# undef X509_EXTENSIONS +# endif + +# define X509_FILETYPE_PEM 1 +# define X509_FILETYPE_ASN1 2 +# define X509_FILETYPE_DEFAULT 3 + +# define X509v3_KU_DIGITAL_SIGNATURE 0x0080 +# define X509v3_KU_NON_REPUDIATION 0x0040 +# define X509v3_KU_KEY_ENCIPHERMENT 0x0020 +# define X509v3_KU_DATA_ENCIPHERMENT 0x0010 +# define X509v3_KU_KEY_AGREEMENT 0x0008 +# define X509v3_KU_KEY_CERT_SIGN 0x0004 +# define X509v3_KU_CRL_SIGN 0x0002 +# define X509v3_KU_ENCIPHER_ONLY 0x0001 +# define X509v3_KU_DECIPHER_ONLY 0x8000 +# define X509v3_KU_UNDEF 0xffff + +typedef struct X509_objects_st { + int nid; + int (*a2i) (void); + int (*i2a) (void); +} X509_OBJECTS; + +struct X509_algor_st { + ASN1_OBJECT *algorithm; + ASN1_TYPE *parameter; +} /* X509_ALGOR */ ; + +DECLARE_ASN1_SET_OF(X509_ALGOR) + +typedef STACK_OF(X509_ALGOR) X509_ALGORS; + +typedef struct X509_val_st { + ASN1_TIME *notBefore; + ASN1_TIME *notAfter; +} X509_VAL; + +struct X509_pubkey_st { + X509_ALGOR *algor; + ASN1_BIT_STRING *public_key; + EVP_PKEY *pkey; +}; + +typedef struct X509_sig_st { + X509_ALGOR *algor; + ASN1_OCTET_STRING *digest; +} X509_SIG; + +typedef struct X509_name_entry_st { + ASN1_OBJECT *object; + ASN1_STRING *value; + int set; + int size; /* temp variable */ +} X509_NAME_ENTRY; + +DECLARE_STACK_OF(X509_NAME_ENTRY) +DECLARE_ASN1_SET_OF(X509_NAME_ENTRY) + +/* we always keep X509_NAMEs in 2 forms. */ +struct X509_name_st { + STACK_OF(X509_NAME_ENTRY) *entries; + int modified; /* true if 'bytes' needs to be built */ +# ifndef OPENSSL_NO_BUFFER + BUF_MEM *bytes; +# else + char *bytes; +# endif +/* unsigned long hash; Keep the hash around for lookups */ + unsigned char *canon_enc; + int canon_enclen; +} /* X509_NAME */ ; + +DECLARE_STACK_OF(X509_NAME) + +# define X509_EX_V_NETSCAPE_HACK 0x8000 +# define X509_EX_V_INIT 0x0001 +typedef struct X509_extension_st { + ASN1_OBJECT *object; + ASN1_BOOLEAN critical; + ASN1_OCTET_STRING *value; +} X509_EXTENSION; + +typedef STACK_OF(X509_EXTENSION) X509_EXTENSIONS; + +DECLARE_STACK_OF(X509_EXTENSION) +DECLARE_ASN1_SET_OF(X509_EXTENSION) + +/* a sequence of these are used */ +typedef struct x509_attributes_st { + ASN1_OBJECT *object; + int single; /* 0 for a set, 1 for a single item (which is + * wrong) */ + union { + char *ptr; + /* + * 0 + */ STACK_OF(ASN1_TYPE) *set; + /* + * 1 + */ ASN1_TYPE *single; + } value; +} X509_ATTRIBUTE; + +DECLARE_STACK_OF(X509_ATTRIBUTE) +DECLARE_ASN1_SET_OF(X509_ATTRIBUTE) + +typedef struct X509_req_info_st { + ASN1_ENCODING enc; + ASN1_INTEGER *version; + X509_NAME *subject; + X509_PUBKEY *pubkey; + /* d=2 hl=2 l= 0 cons: cont: 00 */ + STACK_OF(X509_ATTRIBUTE) *attributes; /* [ 0 ] */ +} X509_REQ_INFO; + +typedef struct X509_req_st { + X509_REQ_INFO *req_info; + X509_ALGOR *sig_alg; + ASN1_BIT_STRING *signature; + int references; +} X509_REQ; + +typedef struct x509_cinf_st { + ASN1_INTEGER *version; /* [ 0 ] default of v1 */ + ASN1_INTEGER *serialNumber; + X509_ALGOR *signature; + X509_NAME *issuer; + X509_VAL *validity; + X509_NAME *subject; + X509_PUBKEY *key; + ASN1_BIT_STRING *issuerUID; /* [ 1 ] optional in v2 */ + ASN1_BIT_STRING *subjectUID; /* [ 2 ] optional in v2 */ + STACK_OF(X509_EXTENSION) *extensions; /* [ 3 ] optional in v3 */ + ASN1_ENCODING enc; +} X509_CINF; + +/* + * This stuff is certificate "auxiliary info" it contains details which are + * useful in certificate stores and databases. When used this is tagged onto + * the end of the certificate itself + */ + +typedef struct x509_cert_aux_st { + STACK_OF(ASN1_OBJECT) *trust; /* trusted uses */ + STACK_OF(ASN1_OBJECT) *reject; /* rejected uses */ + ASN1_UTF8STRING *alias; /* "friendly name" */ + ASN1_OCTET_STRING *keyid; /* key id of private key */ + STACK_OF(X509_ALGOR) *other; /* other unspecified info */ +} X509_CERT_AUX; + +struct x509_st { + X509_CINF *cert_info; + X509_ALGOR *sig_alg; + ASN1_BIT_STRING *signature; + int valid; + int references; + char *name; + CRYPTO_EX_DATA ex_data; + /* These contain copies of various extension values */ + long ex_pathlen; + long ex_pcpathlen; + unsigned long ex_flags; + unsigned long ex_kusage; + unsigned long ex_xkusage; + unsigned long ex_nscert; + ASN1_OCTET_STRING *skid; + AUTHORITY_KEYID *akid; + X509_POLICY_CACHE *policy_cache; + STACK_OF(DIST_POINT) *crldp; + STACK_OF(GENERAL_NAME) *altname; + NAME_CONSTRAINTS *nc; +# ifndef OPENSSL_NO_RFC3779 + STACK_OF(IPAddressFamily) *rfc3779_addr; + struct ASIdentifiers_st *rfc3779_asid; +# endif +# ifndef OPENSSL_NO_SHA + unsigned char sha1_hash[SHA_DIGEST_LENGTH]; +# endif + X509_CERT_AUX *aux; +} /* X509 */ ; + +DECLARE_STACK_OF(X509) +DECLARE_ASN1_SET_OF(X509) + +/* This is used for a table of trust checking functions */ + +typedef struct x509_trust_st { + int trust; + int flags; + int (*check_trust) (struct x509_trust_st *, X509 *, int); + char *name; + int arg1; + void *arg2; +} X509_TRUST; + +DECLARE_STACK_OF(X509_TRUST) + +typedef struct x509_cert_pair_st { + X509 *forward; + X509 *reverse; +} X509_CERT_PAIR; + +/* standard trust ids */ + +# define X509_TRUST_DEFAULT -1/* Only valid in purpose settings */ + +# define X509_TRUST_COMPAT 1 +# define X509_TRUST_SSL_CLIENT 2 +# define X509_TRUST_SSL_SERVER 3 +# define X509_TRUST_EMAIL 4 +# define X509_TRUST_OBJECT_SIGN 5 +# define X509_TRUST_OCSP_SIGN 6 +# define X509_TRUST_OCSP_REQUEST 7 +# define X509_TRUST_TSA 8 + +/* Keep these up to date! */ +# define X509_TRUST_MIN 1 +# define X509_TRUST_MAX 8 + +/* trust_flags values */ +# define X509_TRUST_DYNAMIC 1 +# define X509_TRUST_DYNAMIC_NAME 2 + +/* check_trust return codes */ + +# define X509_TRUST_TRUSTED 1 +# define X509_TRUST_REJECTED 2 +# define X509_TRUST_UNTRUSTED 3 + +/* Flags for X509_print_ex() */ + +# define X509_FLAG_COMPAT 0 +# define X509_FLAG_NO_HEADER 1L +# define X509_FLAG_NO_VERSION (1L << 1) +# define X509_FLAG_NO_SERIAL (1L << 2) +# define X509_FLAG_NO_SIGNAME (1L << 3) +# define X509_FLAG_NO_ISSUER (1L << 4) +# define X509_FLAG_NO_VALIDITY (1L << 5) +# define X509_FLAG_NO_SUBJECT (1L << 6) +# define X509_FLAG_NO_PUBKEY (1L << 7) +# define X509_FLAG_NO_EXTENSIONS (1L << 8) +# define X509_FLAG_NO_SIGDUMP (1L << 9) +# define X509_FLAG_NO_AUX (1L << 10) +# define X509_FLAG_NO_ATTRIBUTES (1L << 11) +# define X509_FLAG_NO_IDS (1L << 12) + +/* Flags specific to X509_NAME_print_ex() */ + +/* The field separator information */ + +# define XN_FLAG_SEP_MASK (0xf << 16) + +# define XN_FLAG_COMPAT 0/* Traditional SSLeay: use old + * X509_NAME_print */ +# define XN_FLAG_SEP_COMMA_PLUS (1 << 16)/* RFC2253 ,+ */ +# define XN_FLAG_SEP_CPLUS_SPC (2 << 16)/* ,+ spaced: more readable */ +# define XN_FLAG_SEP_SPLUS_SPC (3 << 16)/* ;+ spaced */ +# define XN_FLAG_SEP_MULTILINE (4 << 16)/* One line per field */ + +# define XN_FLAG_DN_REV (1 << 20)/* Reverse DN order */ + +/* How the field name is shown */ + +# define XN_FLAG_FN_MASK (0x3 << 21) + +# define XN_FLAG_FN_SN 0/* Object short name */ +# define XN_FLAG_FN_LN (1 << 21)/* Object long name */ +# define XN_FLAG_FN_OID (2 << 21)/* Always use OIDs */ +# define XN_FLAG_FN_NONE (3 << 21)/* No field names */ + +# define XN_FLAG_SPC_EQ (1 << 23)/* Put spaces round '=' */ + +/* + * This determines if we dump fields we don't recognise: RFC2253 requires + * this. + */ + +# define XN_FLAG_DUMP_UNKNOWN_FIELDS (1 << 24) + +# define XN_FLAG_FN_ALIGN (1 << 25)/* Align field names to 20 + * characters */ + +/* Complete set of RFC2253 flags */ + +# define XN_FLAG_RFC2253 (ASN1_STRFLGS_RFC2253 | \ + XN_FLAG_SEP_COMMA_PLUS | \ + XN_FLAG_DN_REV | \ + XN_FLAG_FN_SN | \ + XN_FLAG_DUMP_UNKNOWN_FIELDS) + +/* readable oneline form */ + +# define XN_FLAG_ONELINE (ASN1_STRFLGS_RFC2253 | \ + ASN1_STRFLGS_ESC_QUOTE | \ + XN_FLAG_SEP_CPLUS_SPC | \ + XN_FLAG_SPC_EQ | \ + XN_FLAG_FN_SN) + +/* readable multiline form */ + +# define XN_FLAG_MULTILINE (ASN1_STRFLGS_ESC_CTRL | \ + ASN1_STRFLGS_ESC_MSB | \ + XN_FLAG_SEP_MULTILINE | \ + XN_FLAG_SPC_EQ | \ + XN_FLAG_FN_LN | \ + XN_FLAG_FN_ALIGN) + +struct x509_revoked_st { + ASN1_INTEGER *serialNumber; + ASN1_TIME *revocationDate; + STACK_OF(X509_EXTENSION) /* optional */ *extensions; + /* Set up if indirect CRL */ + STACK_OF(GENERAL_NAME) *issuer; + /* Revocation reason */ + int reason; + int sequence; /* load sequence */ +}; + +DECLARE_STACK_OF(X509_REVOKED) +DECLARE_ASN1_SET_OF(X509_REVOKED) + +typedef struct X509_crl_info_st { + ASN1_INTEGER *version; + X509_ALGOR *sig_alg; + X509_NAME *issuer; + ASN1_TIME *lastUpdate; + ASN1_TIME *nextUpdate; + STACK_OF(X509_REVOKED) *revoked; + STACK_OF(X509_EXTENSION) /* [0] */ *extensions; + ASN1_ENCODING enc; +} X509_CRL_INFO; + +struct X509_crl_st { + /* actual signature */ + X509_CRL_INFO *crl; + X509_ALGOR *sig_alg; + ASN1_BIT_STRING *signature; + int references; + int flags; + /* Copies of various extensions */ + AUTHORITY_KEYID *akid; + ISSUING_DIST_POINT *idp; + /* Convenient breakdown of IDP */ + int idp_flags; + int idp_reasons; + /* CRL and base CRL numbers for delta processing */ + ASN1_INTEGER *crl_number; + ASN1_INTEGER *base_crl_number; +# ifndef OPENSSL_NO_SHA + unsigned char sha1_hash[SHA_DIGEST_LENGTH]; +# endif + STACK_OF(GENERAL_NAMES) *issuers; + const X509_CRL_METHOD *meth; + void *meth_data; +} /* X509_CRL */ ; + +DECLARE_STACK_OF(X509_CRL) +DECLARE_ASN1_SET_OF(X509_CRL) + +typedef struct private_key_st { + int version; + /* The PKCS#8 data types */ + X509_ALGOR *enc_algor; + ASN1_OCTET_STRING *enc_pkey; /* encrypted pub key */ + /* When decrypted, the following will not be NULL */ + EVP_PKEY *dec_pkey; + /* used to encrypt and decrypt */ + int key_length; + char *key_data; + int key_free; /* true if we should auto free key_data */ + /* expanded version of 'enc_algor' */ + EVP_CIPHER_INFO cipher; + int references; +} X509_PKEY; + +# ifndef OPENSSL_NO_EVP +typedef struct X509_info_st { + X509 *x509; + X509_CRL *crl; + X509_PKEY *x_pkey; + EVP_CIPHER_INFO enc_cipher; + int enc_len; + char *enc_data; + int references; +} X509_INFO; + +DECLARE_STACK_OF(X509_INFO) +# endif + +/* + * The next 2 structures and their 8 routines were sent to me by Pat Richard + * and are used to manipulate Netscapes spki structures - + * useful if you are writing a CA web page + */ +typedef struct Netscape_spkac_st { + X509_PUBKEY *pubkey; + ASN1_IA5STRING *challenge; /* challenge sent in atlas >= PR2 */ +} NETSCAPE_SPKAC; + +typedef struct Netscape_spki_st { + NETSCAPE_SPKAC *spkac; /* signed public key and challenge */ + X509_ALGOR *sig_algor; + ASN1_BIT_STRING *signature; +} NETSCAPE_SPKI; + +/* Netscape certificate sequence structure */ +typedef struct Netscape_certificate_sequence { + ASN1_OBJECT *type; + STACK_OF(X509) *certs; +} NETSCAPE_CERT_SEQUENCE; + +/*- Unused (and iv length is wrong) +typedef struct CBCParameter_st + { + unsigned char iv[8]; + } CBC_PARAM; +*/ + +/* Password based encryption structure */ + +typedef struct PBEPARAM_st { + ASN1_OCTET_STRING *salt; + ASN1_INTEGER *iter; +} PBEPARAM; + +/* Password based encryption V2 structures */ + +typedef struct PBE2PARAM_st { + X509_ALGOR *keyfunc; + X509_ALGOR *encryption; +} PBE2PARAM; + +typedef struct PBKDF2PARAM_st { +/* Usually OCTET STRING but could be anything */ + ASN1_TYPE *salt; + ASN1_INTEGER *iter; + ASN1_INTEGER *keylength; + X509_ALGOR *prf; +} PBKDF2PARAM; + +/* PKCS#8 private key info structure */ + +struct pkcs8_priv_key_info_st { + /* Flag for various broken formats */ + int broken; +# define PKCS8_OK 0 +# define PKCS8_NO_OCTET 1 +# define PKCS8_EMBEDDED_PARAM 2 +# define PKCS8_NS_DB 3 +# define PKCS8_NEG_PRIVKEY 4 + ASN1_INTEGER *version; + X509_ALGOR *pkeyalg; + /* Should be OCTET STRING but some are broken */ + ASN1_TYPE *pkey; + STACK_OF(X509_ATTRIBUTE) *attributes; +}; + +#ifdef __cplusplus +} +#endif + +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# define X509_EXT_PACK_UNKNOWN 1 +# define X509_EXT_PACK_STRING 2 + +# define X509_get_version(x) ASN1_INTEGER_get((x)->cert_info->version) +/* #define X509_get_serialNumber(x) ((x)->cert_info->serialNumber) */ +# define X509_get_notBefore(x) ((x)->cert_info->validity->notBefore) +# define X509_get_notAfter(x) ((x)->cert_info->validity->notAfter) +# define X509_extract_key(x) X509_get_pubkey(x)/*****/ +# define X509_REQ_get_version(x) ASN1_INTEGER_get((x)->req_info->version) +# define X509_REQ_get_subject_name(x) ((x)->req_info->subject) +# define X509_REQ_extract_key(a) X509_REQ_get_pubkey(a) +# define X509_name_cmp(a,b) X509_NAME_cmp((a),(b)) +# define X509_get_signature_type(x) EVP_PKEY_type(OBJ_obj2nid((x)->sig_alg->algorithm)) + +# define X509_CRL_get_version(x) ASN1_INTEGER_get((x)->crl->version) +# define X509_CRL_get_lastUpdate(x) ((x)->crl->lastUpdate) +# define X509_CRL_get_nextUpdate(x) ((x)->crl->nextUpdate) +# define X509_CRL_get_issuer(x) ((x)->crl->issuer) +# define X509_CRL_get_REVOKED(x) ((x)->crl->revoked) + +void X509_CRL_set_default_method(const X509_CRL_METHOD *meth); +X509_CRL_METHOD *X509_CRL_METHOD_new(int (*crl_init) (X509_CRL *crl), + int (*crl_free) (X509_CRL *crl), + int (*crl_lookup) (X509_CRL *crl, + X509_REVOKED **ret, + ASN1_INTEGER *ser, + X509_NAME *issuer), + int (*crl_verify) (X509_CRL *crl, + EVP_PKEY *pk)); +void X509_CRL_METHOD_free(X509_CRL_METHOD *m); + +void X509_CRL_set_meth_data(X509_CRL *crl, void *dat); +void *X509_CRL_get_meth_data(X509_CRL *crl); + +/* + * This one is only used so that a binary form can output, as in + * i2d_X509_NAME(X509_get_X509_PUBKEY(x),&buf) + */ +# define X509_get_X509_PUBKEY(x) ((x)->cert_info->key) + +const char *X509_verify_cert_error_string(long n); + +# ifndef OPENSSL_NO_EVP +int X509_verify(X509 *a, EVP_PKEY *r); + +int X509_REQ_verify(X509_REQ *a, EVP_PKEY *r); +int X509_CRL_verify(X509_CRL *a, EVP_PKEY *r); +int NETSCAPE_SPKI_verify(NETSCAPE_SPKI *a, EVP_PKEY *r); + +NETSCAPE_SPKI *NETSCAPE_SPKI_b64_decode(const char *str, int len); +char *NETSCAPE_SPKI_b64_encode(NETSCAPE_SPKI *x); +EVP_PKEY *NETSCAPE_SPKI_get_pubkey(NETSCAPE_SPKI *x); +int NETSCAPE_SPKI_set_pubkey(NETSCAPE_SPKI *x, EVP_PKEY *pkey); + +int NETSCAPE_SPKI_print(BIO *out, NETSCAPE_SPKI *spki); + +int X509_signature_dump(BIO *bp, const ASN1_STRING *sig, int indent); +int X509_signature_print(BIO *bp, X509_ALGOR *alg, ASN1_STRING *sig); + +int X509_sign(X509 *x, EVP_PKEY *pkey, const EVP_MD *md); +int X509_sign_ctx(X509 *x, EVP_MD_CTX *ctx); +int X509_http_nbio(OCSP_REQ_CTX *rctx, X509 **pcert); +int X509_REQ_sign(X509_REQ *x, EVP_PKEY *pkey, const EVP_MD *md); +int X509_REQ_sign_ctx(X509_REQ *x, EVP_MD_CTX *ctx); +int X509_CRL_sign(X509_CRL *x, EVP_PKEY *pkey, const EVP_MD *md); +int X509_CRL_sign_ctx(X509_CRL *x, EVP_MD_CTX *ctx); +int X509_CRL_http_nbio(OCSP_REQ_CTX *rctx, X509_CRL **pcrl); +int NETSCAPE_SPKI_sign(NETSCAPE_SPKI *x, EVP_PKEY *pkey, const EVP_MD *md); + +int X509_pubkey_digest(const X509 *data, const EVP_MD *type, + unsigned char *md, unsigned int *len); +int X509_digest(const X509 *data, const EVP_MD *type, + unsigned char *md, unsigned int *len); +int X509_CRL_digest(const X509_CRL *data, const EVP_MD *type, + unsigned char *md, unsigned int *len); +int X509_REQ_digest(const X509_REQ *data, const EVP_MD *type, + unsigned char *md, unsigned int *len); +int X509_NAME_digest(const X509_NAME *data, const EVP_MD *type, + unsigned char *md, unsigned int *len); +# endif + +# ifndef OPENSSL_NO_FP_API +X509 *d2i_X509_fp(FILE *fp, X509 **x509); +int i2d_X509_fp(FILE *fp, X509 *x509); +X509_CRL *d2i_X509_CRL_fp(FILE *fp, X509_CRL **crl); +int i2d_X509_CRL_fp(FILE *fp, X509_CRL *crl); +X509_REQ *d2i_X509_REQ_fp(FILE *fp, X509_REQ **req); +int i2d_X509_REQ_fp(FILE *fp, X509_REQ *req); +# ifndef OPENSSL_NO_RSA +RSA *d2i_RSAPrivateKey_fp(FILE *fp, RSA **rsa); +int i2d_RSAPrivateKey_fp(FILE *fp, RSA *rsa); +RSA *d2i_RSAPublicKey_fp(FILE *fp, RSA **rsa); +int i2d_RSAPublicKey_fp(FILE *fp, RSA *rsa); +RSA *d2i_RSA_PUBKEY_fp(FILE *fp, RSA **rsa); +int i2d_RSA_PUBKEY_fp(FILE *fp, RSA *rsa); +# endif +# ifndef OPENSSL_NO_DSA +DSA *d2i_DSA_PUBKEY_fp(FILE *fp, DSA **dsa); +int i2d_DSA_PUBKEY_fp(FILE *fp, DSA *dsa); +DSA *d2i_DSAPrivateKey_fp(FILE *fp, DSA **dsa); +int i2d_DSAPrivateKey_fp(FILE *fp, DSA *dsa); +# endif +# ifndef OPENSSL_NO_EC +EC_KEY *d2i_EC_PUBKEY_fp(FILE *fp, EC_KEY **eckey); +int i2d_EC_PUBKEY_fp(FILE *fp, EC_KEY *eckey); +EC_KEY *d2i_ECPrivateKey_fp(FILE *fp, EC_KEY **eckey); +int i2d_ECPrivateKey_fp(FILE *fp, EC_KEY *eckey); +# endif +X509_SIG *d2i_PKCS8_fp(FILE *fp, X509_SIG **p8); +int i2d_PKCS8_fp(FILE *fp, X509_SIG *p8); +PKCS8_PRIV_KEY_INFO *d2i_PKCS8_PRIV_KEY_INFO_fp(FILE *fp, + PKCS8_PRIV_KEY_INFO **p8inf); +int i2d_PKCS8_PRIV_KEY_INFO_fp(FILE *fp, PKCS8_PRIV_KEY_INFO *p8inf); +int i2d_PKCS8PrivateKeyInfo_fp(FILE *fp, EVP_PKEY *key); +int i2d_PrivateKey_fp(FILE *fp, EVP_PKEY *pkey); +EVP_PKEY *d2i_PrivateKey_fp(FILE *fp, EVP_PKEY **a); +int i2d_PUBKEY_fp(FILE *fp, EVP_PKEY *pkey); +EVP_PKEY *d2i_PUBKEY_fp(FILE *fp, EVP_PKEY **a); +# endif + +# ifndef OPENSSL_NO_BIO +X509 *d2i_X509_bio(BIO *bp, X509 **x509); +int i2d_X509_bio(BIO *bp, X509 *x509); +X509_CRL *d2i_X509_CRL_bio(BIO *bp, X509_CRL **crl); +int i2d_X509_CRL_bio(BIO *bp, X509_CRL *crl); +X509_REQ *d2i_X509_REQ_bio(BIO *bp, X509_REQ **req); +int i2d_X509_REQ_bio(BIO *bp, X509_REQ *req); +# ifndef OPENSSL_NO_RSA +RSA *d2i_RSAPrivateKey_bio(BIO *bp, RSA **rsa); +int i2d_RSAPrivateKey_bio(BIO *bp, RSA *rsa); +RSA *d2i_RSAPublicKey_bio(BIO *bp, RSA **rsa); +int i2d_RSAPublicKey_bio(BIO *bp, RSA *rsa); +RSA *d2i_RSA_PUBKEY_bio(BIO *bp, RSA **rsa); +int i2d_RSA_PUBKEY_bio(BIO *bp, RSA *rsa); +# endif +# ifndef OPENSSL_NO_DSA +DSA *d2i_DSA_PUBKEY_bio(BIO *bp, DSA **dsa); +int i2d_DSA_PUBKEY_bio(BIO *bp, DSA *dsa); +DSA *d2i_DSAPrivateKey_bio(BIO *bp, DSA **dsa); +int i2d_DSAPrivateKey_bio(BIO *bp, DSA *dsa); +# endif +# ifndef OPENSSL_NO_EC +EC_KEY *d2i_EC_PUBKEY_bio(BIO *bp, EC_KEY **eckey); +int i2d_EC_PUBKEY_bio(BIO *bp, EC_KEY *eckey); +EC_KEY *d2i_ECPrivateKey_bio(BIO *bp, EC_KEY **eckey); +int i2d_ECPrivateKey_bio(BIO *bp, EC_KEY *eckey); +# endif +X509_SIG *d2i_PKCS8_bio(BIO *bp, X509_SIG **p8); +int i2d_PKCS8_bio(BIO *bp, X509_SIG *p8); +PKCS8_PRIV_KEY_INFO *d2i_PKCS8_PRIV_KEY_INFO_bio(BIO *bp, + PKCS8_PRIV_KEY_INFO **p8inf); +int i2d_PKCS8_PRIV_KEY_INFO_bio(BIO *bp, PKCS8_PRIV_KEY_INFO *p8inf); +int i2d_PKCS8PrivateKeyInfo_bio(BIO *bp, EVP_PKEY *key); +int i2d_PrivateKey_bio(BIO *bp, EVP_PKEY *pkey); +EVP_PKEY *d2i_PrivateKey_bio(BIO *bp, EVP_PKEY **a); +int i2d_PUBKEY_bio(BIO *bp, EVP_PKEY *pkey); +EVP_PKEY *d2i_PUBKEY_bio(BIO *bp, EVP_PKEY **a); +# endif + +X509 *X509_dup(X509 *x509); +X509_ATTRIBUTE *X509_ATTRIBUTE_dup(X509_ATTRIBUTE *xa); +X509_EXTENSION *X509_EXTENSION_dup(X509_EXTENSION *ex); +X509_CRL *X509_CRL_dup(X509_CRL *crl); +X509_REVOKED *X509_REVOKED_dup(X509_REVOKED *rev); +X509_REQ *X509_REQ_dup(X509_REQ *req); +X509_ALGOR *X509_ALGOR_dup(X509_ALGOR *xn); +int X509_ALGOR_set0(X509_ALGOR *alg, ASN1_OBJECT *aobj, int ptype, + void *pval); +void X509_ALGOR_get0(ASN1_OBJECT **paobj, int *pptype, void **ppval, + X509_ALGOR *algor); +void X509_ALGOR_set_md(X509_ALGOR *alg, const EVP_MD *md); +int X509_ALGOR_cmp(const X509_ALGOR *a, const X509_ALGOR *b); + +X509_NAME *X509_NAME_dup(X509_NAME *xn); +X509_NAME_ENTRY *X509_NAME_ENTRY_dup(X509_NAME_ENTRY *ne); + +int X509_cmp_time(const ASN1_TIME *s, time_t *t); +int X509_cmp_current_time(const ASN1_TIME *s); +ASN1_TIME *X509_time_adj(ASN1_TIME *s, long adj, time_t *t); +ASN1_TIME *X509_time_adj_ex(ASN1_TIME *s, + int offset_day, long offset_sec, time_t *t); +ASN1_TIME *X509_gmtime_adj(ASN1_TIME *s, long adj); + +const char *X509_get_default_cert_area(void); +const char *X509_get_default_cert_dir(void); +const char *X509_get_default_cert_file(void); +const char *X509_get_default_cert_dir_env(void); +const char *X509_get_default_cert_file_env(void); +const char *X509_get_default_private_dir(void); + +X509_REQ *X509_to_X509_REQ(X509 *x, EVP_PKEY *pkey, const EVP_MD *md); +X509 *X509_REQ_to_X509(X509_REQ *r, int days, EVP_PKEY *pkey); + +DECLARE_ASN1_FUNCTIONS(X509_ALGOR) +DECLARE_ASN1_ENCODE_FUNCTIONS(X509_ALGORS, X509_ALGORS, X509_ALGORS) +DECLARE_ASN1_FUNCTIONS(X509_VAL) + +DECLARE_ASN1_FUNCTIONS(X509_PUBKEY) + +int X509_PUBKEY_set(X509_PUBKEY **x, EVP_PKEY *pkey); +EVP_PKEY *X509_PUBKEY_get(X509_PUBKEY *key); +int X509_get_pubkey_parameters(EVP_PKEY *pkey, STACK_OF(X509) *chain); +int i2d_PUBKEY(EVP_PKEY *a, unsigned char **pp); +EVP_PKEY *d2i_PUBKEY(EVP_PKEY **a, const unsigned char **pp, long length); +# ifndef OPENSSL_NO_RSA +int i2d_RSA_PUBKEY(RSA *a, unsigned char **pp); +RSA *d2i_RSA_PUBKEY(RSA **a, const unsigned char **pp, long length); +# endif +# ifndef OPENSSL_NO_DSA +int i2d_DSA_PUBKEY(DSA *a, unsigned char **pp); +DSA *d2i_DSA_PUBKEY(DSA **a, const unsigned char **pp, long length); +# endif +# ifndef OPENSSL_NO_EC +int i2d_EC_PUBKEY(EC_KEY *a, unsigned char **pp); +EC_KEY *d2i_EC_PUBKEY(EC_KEY **a, const unsigned char **pp, long length); +# endif + +DECLARE_ASN1_FUNCTIONS(X509_SIG) +DECLARE_ASN1_FUNCTIONS(X509_REQ_INFO) +DECLARE_ASN1_FUNCTIONS(X509_REQ) + +DECLARE_ASN1_FUNCTIONS(X509_ATTRIBUTE) +X509_ATTRIBUTE *X509_ATTRIBUTE_create(int nid, int atrtype, void *value); + +DECLARE_ASN1_FUNCTIONS(X509_EXTENSION) +DECLARE_ASN1_ENCODE_FUNCTIONS(X509_EXTENSIONS, X509_EXTENSIONS, X509_EXTENSIONS) + +DECLARE_ASN1_FUNCTIONS(X509_NAME_ENTRY) + +DECLARE_ASN1_FUNCTIONS(X509_NAME) + +int X509_NAME_set(X509_NAME **xn, X509_NAME *name); + +DECLARE_ASN1_FUNCTIONS(X509_CINF) + +DECLARE_ASN1_FUNCTIONS(X509) +DECLARE_ASN1_FUNCTIONS(X509_CERT_AUX) + +DECLARE_ASN1_FUNCTIONS(X509_CERT_PAIR) + +int X509_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func); +int X509_set_ex_data(X509 *r, int idx, void *arg); +void *X509_get_ex_data(X509 *r, int idx); +int i2d_X509_AUX(X509 *a, unsigned char **pp); +X509 *d2i_X509_AUX(X509 **a, const unsigned char **pp, long length); + +int i2d_re_X509_tbs(X509 *x, unsigned char **pp); + +void X509_get0_signature(ASN1_BIT_STRING **psig, X509_ALGOR **palg, + const X509 *x); +int X509_get_signature_nid(const X509 *x); + +int X509_alias_set1(X509 *x, unsigned char *name, int len); +int X509_keyid_set1(X509 *x, unsigned char *id, int len); +unsigned char *X509_alias_get0(X509 *x, int *len); +unsigned char *X509_keyid_get0(X509 *x, int *len); +int (*X509_TRUST_set_default(int (*trust) (int, X509 *, int))) (int, X509 *, + int); +int X509_TRUST_set(int *t, int trust); +int X509_add1_trust_object(X509 *x, ASN1_OBJECT *obj); +int X509_add1_reject_object(X509 *x, ASN1_OBJECT *obj); +void X509_trust_clear(X509 *x); +void X509_reject_clear(X509 *x); + +DECLARE_ASN1_FUNCTIONS(X509_REVOKED) +DECLARE_ASN1_FUNCTIONS(X509_CRL_INFO) +DECLARE_ASN1_FUNCTIONS(X509_CRL) + +int X509_CRL_add0_revoked(X509_CRL *crl, X509_REVOKED *rev); +int X509_CRL_get0_by_serial(X509_CRL *crl, + X509_REVOKED **ret, ASN1_INTEGER *serial); +int X509_CRL_get0_by_cert(X509_CRL *crl, X509_REVOKED **ret, X509 *x); + +X509_PKEY *X509_PKEY_new(void); +void X509_PKEY_free(X509_PKEY *a); +int i2d_X509_PKEY(X509_PKEY *a, unsigned char **pp); +X509_PKEY *d2i_X509_PKEY(X509_PKEY **a, const unsigned char **pp, + long length); + +DECLARE_ASN1_FUNCTIONS(NETSCAPE_SPKI) +DECLARE_ASN1_FUNCTIONS(NETSCAPE_SPKAC) +DECLARE_ASN1_FUNCTIONS(NETSCAPE_CERT_SEQUENCE) + +# ifndef OPENSSL_NO_EVP +X509_INFO *X509_INFO_new(void); +void X509_INFO_free(X509_INFO *a); +char *X509_NAME_oneline(X509_NAME *a, char *buf, int size); + +int ASN1_verify(i2d_of_void *i2d, X509_ALGOR *algor1, + ASN1_BIT_STRING *signature, char *data, EVP_PKEY *pkey); + +int ASN1_digest(i2d_of_void *i2d, const EVP_MD *type, char *data, + unsigned char *md, unsigned int *len); + +int ASN1_sign(i2d_of_void *i2d, X509_ALGOR *algor1, + X509_ALGOR *algor2, ASN1_BIT_STRING *signature, + char *data, EVP_PKEY *pkey, const EVP_MD *type); + +int ASN1_item_digest(const ASN1_ITEM *it, const EVP_MD *type, void *data, + unsigned char *md, unsigned int *len); + +int ASN1_item_verify(const ASN1_ITEM *it, X509_ALGOR *algor1, + ASN1_BIT_STRING *signature, void *data, EVP_PKEY *pkey); + +int ASN1_item_sign(const ASN1_ITEM *it, X509_ALGOR *algor1, + X509_ALGOR *algor2, ASN1_BIT_STRING *signature, void *data, + EVP_PKEY *pkey, const EVP_MD *type); +int ASN1_item_sign_ctx(const ASN1_ITEM *it, X509_ALGOR *algor1, + X509_ALGOR *algor2, ASN1_BIT_STRING *signature, + void *asn, EVP_MD_CTX *ctx); +# endif + +int X509_set_version(X509 *x, long version); +int X509_set_serialNumber(X509 *x, ASN1_INTEGER *serial); +ASN1_INTEGER *X509_get_serialNumber(X509 *x); +int X509_set_issuer_name(X509 *x, X509_NAME *name); +X509_NAME *X509_get_issuer_name(X509 *a); +int X509_set_subject_name(X509 *x, X509_NAME *name); +X509_NAME *X509_get_subject_name(X509 *a); +int X509_set_notBefore(X509 *x, const ASN1_TIME *tm); +int X509_set_notAfter(X509 *x, const ASN1_TIME *tm); +int X509_set_pubkey(X509 *x, EVP_PKEY *pkey); +EVP_PKEY *X509_get_pubkey(X509 *x); +ASN1_BIT_STRING *X509_get0_pubkey_bitstr(const X509 *x); +int X509_certificate_type(X509 *x, EVP_PKEY *pubkey /* optional */ ); + +int X509_REQ_set_version(X509_REQ *x, long version); +int X509_REQ_set_subject_name(X509_REQ *req, X509_NAME *name); +int X509_REQ_set_pubkey(X509_REQ *x, EVP_PKEY *pkey); +EVP_PKEY *X509_REQ_get_pubkey(X509_REQ *req); +int X509_REQ_extension_nid(int nid); +int *X509_REQ_get_extension_nids(void); +void X509_REQ_set_extension_nids(int *nids); +STACK_OF(X509_EXTENSION) *X509_REQ_get_extensions(X509_REQ *req); +int X509_REQ_add_extensions_nid(X509_REQ *req, STACK_OF(X509_EXTENSION) *exts, + int nid); +int X509_REQ_add_extensions(X509_REQ *req, STACK_OF(X509_EXTENSION) *exts); +int X509_REQ_get_attr_count(const X509_REQ *req); +int X509_REQ_get_attr_by_NID(const X509_REQ *req, int nid, int lastpos); +int X509_REQ_get_attr_by_OBJ(const X509_REQ *req, ASN1_OBJECT *obj, + int lastpos); +X509_ATTRIBUTE *X509_REQ_get_attr(const X509_REQ *req, int loc); +X509_ATTRIBUTE *X509_REQ_delete_attr(X509_REQ *req, int loc); +int X509_REQ_add1_attr(X509_REQ *req, X509_ATTRIBUTE *attr); +int X509_REQ_add1_attr_by_OBJ(X509_REQ *req, + const ASN1_OBJECT *obj, int type, + const unsigned char *bytes, int len); +int X509_REQ_add1_attr_by_NID(X509_REQ *req, + int nid, int type, + const unsigned char *bytes, int len); +int X509_REQ_add1_attr_by_txt(X509_REQ *req, + const char *attrname, int type, + const unsigned char *bytes, int len); + +int X509_CRL_set_version(X509_CRL *x, long version); +int X509_CRL_set_issuer_name(X509_CRL *x, X509_NAME *name); +int X509_CRL_set_lastUpdate(X509_CRL *x, const ASN1_TIME *tm); +int X509_CRL_set_nextUpdate(X509_CRL *x, const ASN1_TIME *tm); +int X509_CRL_sort(X509_CRL *crl); + +int X509_REVOKED_set_serialNumber(X509_REVOKED *x, ASN1_INTEGER *serial); +int X509_REVOKED_set_revocationDate(X509_REVOKED *r, ASN1_TIME *tm); + +X509_CRL *X509_CRL_diff(X509_CRL *base, X509_CRL *newer, + EVP_PKEY *skey, const EVP_MD *md, unsigned int flags); + +int X509_REQ_check_private_key(X509_REQ *x509, EVP_PKEY *pkey); + +int X509_check_private_key(X509 *x509, EVP_PKEY *pkey); +int X509_chain_check_suiteb(int *perror_depth, + X509 *x, STACK_OF(X509) *chain, + unsigned long flags); +int X509_CRL_check_suiteb(X509_CRL *crl, EVP_PKEY *pk, unsigned long flags); +STACK_OF(X509) *X509_chain_up_ref(STACK_OF(X509) *chain); + +int X509_issuer_and_serial_cmp(const X509 *a, const X509 *b); +unsigned long X509_issuer_and_serial_hash(X509 *a); + +int X509_issuer_name_cmp(const X509 *a, const X509 *b); +unsigned long X509_issuer_name_hash(X509 *a); + +int X509_subject_name_cmp(const X509 *a, const X509 *b); +unsigned long X509_subject_name_hash(X509 *x); + +# ifndef OPENSSL_NO_MD5 +unsigned long X509_issuer_name_hash_old(X509 *a); +unsigned long X509_subject_name_hash_old(X509 *x); +# endif + +int X509_cmp(const X509 *a, const X509 *b); +int X509_NAME_cmp(const X509_NAME *a, const X509_NAME *b); +unsigned long X509_NAME_hash(X509_NAME *x); +unsigned long X509_NAME_hash_old(X509_NAME *x); + +int X509_CRL_cmp(const X509_CRL *a, const X509_CRL *b); +int X509_CRL_match(const X509_CRL *a, const X509_CRL *b); +# ifndef OPENSSL_NO_FP_API +int X509_print_ex_fp(FILE *bp, X509 *x, unsigned long nmflag, + unsigned long cflag); +int X509_print_fp(FILE *bp, X509 *x); +int X509_CRL_print_fp(FILE *bp, X509_CRL *x); +int X509_REQ_print_fp(FILE *bp, X509_REQ *req); +int X509_NAME_print_ex_fp(FILE *fp, X509_NAME *nm, int indent, + unsigned long flags); +# endif + +# ifndef OPENSSL_NO_BIO +int X509_NAME_print(BIO *bp, X509_NAME *name, int obase); +int X509_NAME_print_ex(BIO *out, X509_NAME *nm, int indent, + unsigned long flags); +int X509_print_ex(BIO *bp, X509 *x, unsigned long nmflag, + unsigned long cflag); +int X509_print(BIO *bp, X509 *x); +int X509_ocspid_print(BIO *bp, X509 *x); +int X509_CERT_AUX_print(BIO *bp, X509_CERT_AUX *x, int indent); +int X509_CRL_print(BIO *bp, X509_CRL *x); +int X509_REQ_print_ex(BIO *bp, X509_REQ *x, unsigned long nmflag, + unsigned long cflag); +int X509_REQ_print(BIO *bp, X509_REQ *req); +# endif + +int X509_NAME_entry_count(X509_NAME *name); +int X509_NAME_get_text_by_NID(X509_NAME *name, int nid, char *buf, int len); +int X509_NAME_get_text_by_OBJ(X509_NAME *name, ASN1_OBJECT *obj, + char *buf, int len); + +/* + * NOTE: you should be passsing -1, not 0 as lastpos. The functions that use + * lastpos, search after that position on. + */ +int X509_NAME_get_index_by_NID(X509_NAME *name, int nid, int lastpos); +int X509_NAME_get_index_by_OBJ(X509_NAME *name, ASN1_OBJECT *obj, + int lastpos); +X509_NAME_ENTRY *X509_NAME_get_entry(X509_NAME *name, int loc); +X509_NAME_ENTRY *X509_NAME_delete_entry(X509_NAME *name, int loc); +int X509_NAME_add_entry(X509_NAME *name, X509_NAME_ENTRY *ne, + int loc, int set); +int X509_NAME_add_entry_by_OBJ(X509_NAME *name, ASN1_OBJECT *obj, int type, + unsigned char *bytes, int len, int loc, + int set); +int X509_NAME_add_entry_by_NID(X509_NAME *name, int nid, int type, + unsigned char *bytes, int len, int loc, + int set); +X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_txt(X509_NAME_ENTRY **ne, + const char *field, int type, + const unsigned char *bytes, + int len); +X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_NID(X509_NAME_ENTRY **ne, int nid, + int type, unsigned char *bytes, + int len); +int X509_NAME_add_entry_by_txt(X509_NAME *name, const char *field, int type, + const unsigned char *bytes, int len, int loc, + int set); +X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_OBJ(X509_NAME_ENTRY **ne, + ASN1_OBJECT *obj, int type, + const unsigned char *bytes, + int len); +int X509_NAME_ENTRY_set_object(X509_NAME_ENTRY *ne, ASN1_OBJECT *obj); +int X509_NAME_ENTRY_set_data(X509_NAME_ENTRY *ne, int type, + const unsigned char *bytes, int len); +ASN1_OBJECT *X509_NAME_ENTRY_get_object(X509_NAME_ENTRY *ne); +ASN1_STRING *X509_NAME_ENTRY_get_data(X509_NAME_ENTRY *ne); + +int X509v3_get_ext_count(const STACK_OF(X509_EXTENSION) *x); +int X509v3_get_ext_by_NID(const STACK_OF(X509_EXTENSION) *x, + int nid, int lastpos); +int X509v3_get_ext_by_OBJ(const STACK_OF(X509_EXTENSION) *x, + ASN1_OBJECT *obj, int lastpos); +int X509v3_get_ext_by_critical(const STACK_OF(X509_EXTENSION) *x, + int crit, int lastpos); +X509_EXTENSION *X509v3_get_ext(const STACK_OF(X509_EXTENSION) *x, int loc); +X509_EXTENSION *X509v3_delete_ext(STACK_OF(X509_EXTENSION) *x, int loc); +STACK_OF(X509_EXTENSION) *X509v3_add_ext(STACK_OF(X509_EXTENSION) **x, + X509_EXTENSION *ex, int loc); + +int X509_get_ext_count(X509 *x); +int X509_get_ext_by_NID(X509 *x, int nid, int lastpos); +int X509_get_ext_by_OBJ(X509 *x, ASN1_OBJECT *obj, int lastpos); +int X509_get_ext_by_critical(X509 *x, int crit, int lastpos); +X509_EXTENSION *X509_get_ext(X509 *x, int loc); +X509_EXTENSION *X509_delete_ext(X509 *x, int loc); +int X509_add_ext(X509 *x, X509_EXTENSION *ex, int loc); +void *X509_get_ext_d2i(X509 *x, int nid, int *crit, int *idx); +int X509_add1_ext_i2d(X509 *x, int nid, void *value, int crit, + unsigned long flags); + +int X509_CRL_get_ext_count(X509_CRL *x); +int X509_CRL_get_ext_by_NID(X509_CRL *x, int nid, int lastpos); +int X509_CRL_get_ext_by_OBJ(X509_CRL *x, ASN1_OBJECT *obj, int lastpos); +int X509_CRL_get_ext_by_critical(X509_CRL *x, int crit, int lastpos); +X509_EXTENSION *X509_CRL_get_ext(X509_CRL *x, int loc); +X509_EXTENSION *X509_CRL_delete_ext(X509_CRL *x, int loc); +int X509_CRL_add_ext(X509_CRL *x, X509_EXTENSION *ex, int loc); +void *X509_CRL_get_ext_d2i(X509_CRL *x, int nid, int *crit, int *idx); +int X509_CRL_add1_ext_i2d(X509_CRL *x, int nid, void *value, int crit, + unsigned long flags); + +int X509_REVOKED_get_ext_count(X509_REVOKED *x); +int X509_REVOKED_get_ext_by_NID(X509_REVOKED *x, int nid, int lastpos); +int X509_REVOKED_get_ext_by_OBJ(X509_REVOKED *x, ASN1_OBJECT *obj, + int lastpos); +int X509_REVOKED_get_ext_by_critical(X509_REVOKED *x, int crit, int lastpos); +X509_EXTENSION *X509_REVOKED_get_ext(X509_REVOKED *x, int loc); +X509_EXTENSION *X509_REVOKED_delete_ext(X509_REVOKED *x, int loc); +int X509_REVOKED_add_ext(X509_REVOKED *x, X509_EXTENSION *ex, int loc); +void *X509_REVOKED_get_ext_d2i(X509_REVOKED *x, int nid, int *crit, int *idx); +int X509_REVOKED_add1_ext_i2d(X509_REVOKED *x, int nid, void *value, int crit, + unsigned long flags); + +X509_EXTENSION *X509_EXTENSION_create_by_NID(X509_EXTENSION **ex, + int nid, int crit, + ASN1_OCTET_STRING *data); +X509_EXTENSION *X509_EXTENSION_create_by_OBJ(X509_EXTENSION **ex, + ASN1_OBJECT *obj, int crit, + ASN1_OCTET_STRING *data); +int X509_EXTENSION_set_object(X509_EXTENSION *ex, ASN1_OBJECT *obj); +int X509_EXTENSION_set_critical(X509_EXTENSION *ex, int crit); +int X509_EXTENSION_set_data(X509_EXTENSION *ex, ASN1_OCTET_STRING *data); +ASN1_OBJECT *X509_EXTENSION_get_object(X509_EXTENSION *ex); +ASN1_OCTET_STRING *X509_EXTENSION_get_data(X509_EXTENSION *ne); +int X509_EXTENSION_get_critical(X509_EXTENSION *ex); + +int X509at_get_attr_count(const STACK_OF(X509_ATTRIBUTE) *x); +int X509at_get_attr_by_NID(const STACK_OF(X509_ATTRIBUTE) *x, int nid, + int lastpos); +int X509at_get_attr_by_OBJ(const STACK_OF(X509_ATTRIBUTE) *sk, + ASN1_OBJECT *obj, int lastpos); +X509_ATTRIBUTE *X509at_get_attr(const STACK_OF(X509_ATTRIBUTE) *x, int loc); +X509_ATTRIBUTE *X509at_delete_attr(STACK_OF(X509_ATTRIBUTE) *x, int loc); +STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr(STACK_OF(X509_ATTRIBUTE) **x, + X509_ATTRIBUTE *attr); +STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr_by_OBJ(STACK_OF(X509_ATTRIBUTE) + **x, const ASN1_OBJECT *obj, + int type, + const unsigned char *bytes, + int len); +STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr_by_NID(STACK_OF(X509_ATTRIBUTE) + **x, int nid, int type, + const unsigned char *bytes, + int len); +STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr_by_txt(STACK_OF(X509_ATTRIBUTE) + **x, const char *attrname, + int type, + const unsigned char *bytes, + int len); +void *X509at_get0_data_by_OBJ(STACK_OF(X509_ATTRIBUTE) *x, ASN1_OBJECT *obj, + int lastpos, int type); +X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_NID(X509_ATTRIBUTE **attr, int nid, + int atrtype, const void *data, + int len); +X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_OBJ(X509_ATTRIBUTE **attr, + const ASN1_OBJECT *obj, + int atrtype, const void *data, + int len); +X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_txt(X509_ATTRIBUTE **attr, + const char *atrname, int type, + const unsigned char *bytes, + int len); +int X509_ATTRIBUTE_set1_object(X509_ATTRIBUTE *attr, const ASN1_OBJECT *obj); +int X509_ATTRIBUTE_set1_data(X509_ATTRIBUTE *attr, int attrtype, + const void *data, int len); +void *X509_ATTRIBUTE_get0_data(X509_ATTRIBUTE *attr, int idx, int atrtype, + void *data); +int X509_ATTRIBUTE_count(X509_ATTRIBUTE *attr); +ASN1_OBJECT *X509_ATTRIBUTE_get0_object(X509_ATTRIBUTE *attr); +ASN1_TYPE *X509_ATTRIBUTE_get0_type(X509_ATTRIBUTE *attr, int idx); + +int EVP_PKEY_get_attr_count(const EVP_PKEY *key); +int EVP_PKEY_get_attr_by_NID(const EVP_PKEY *key, int nid, int lastpos); +int EVP_PKEY_get_attr_by_OBJ(const EVP_PKEY *key, ASN1_OBJECT *obj, + int lastpos); +X509_ATTRIBUTE *EVP_PKEY_get_attr(const EVP_PKEY *key, int loc); +X509_ATTRIBUTE *EVP_PKEY_delete_attr(EVP_PKEY *key, int loc); +int EVP_PKEY_add1_attr(EVP_PKEY *key, X509_ATTRIBUTE *attr); +int EVP_PKEY_add1_attr_by_OBJ(EVP_PKEY *key, + const ASN1_OBJECT *obj, int type, + const unsigned char *bytes, int len); +int EVP_PKEY_add1_attr_by_NID(EVP_PKEY *key, + int nid, int type, + const unsigned char *bytes, int len); +int EVP_PKEY_add1_attr_by_txt(EVP_PKEY *key, + const char *attrname, int type, + const unsigned char *bytes, int len); + +int X509_verify_cert(X509_STORE_CTX *ctx); + +/* lookup a cert from a X509 STACK */ +X509 *X509_find_by_issuer_and_serial(STACK_OF(X509) *sk, X509_NAME *name, + ASN1_INTEGER *serial); +X509 *X509_find_by_subject(STACK_OF(X509) *sk, X509_NAME *name); + +DECLARE_ASN1_FUNCTIONS(PBEPARAM) +DECLARE_ASN1_FUNCTIONS(PBE2PARAM) +DECLARE_ASN1_FUNCTIONS(PBKDF2PARAM) + +int PKCS5_pbe_set0_algor(X509_ALGOR *algor, int alg, int iter, + const unsigned char *salt, int saltlen); + +X509_ALGOR *PKCS5_pbe_set(int alg, int iter, + const unsigned char *salt, int saltlen); +X509_ALGOR *PKCS5_pbe2_set(const EVP_CIPHER *cipher, int iter, + unsigned char *salt, int saltlen); +X509_ALGOR *PKCS5_pbe2_set_iv(const EVP_CIPHER *cipher, int iter, + unsigned char *salt, int saltlen, + unsigned char *aiv, int prf_nid); + +X509_ALGOR *PKCS5_pbkdf2_set(int iter, unsigned char *salt, int saltlen, + int prf_nid, int keylen); + +/* PKCS#8 utilities */ + +DECLARE_ASN1_FUNCTIONS(PKCS8_PRIV_KEY_INFO) + +EVP_PKEY *EVP_PKCS82PKEY(PKCS8_PRIV_KEY_INFO *p8); +PKCS8_PRIV_KEY_INFO *EVP_PKEY2PKCS8(EVP_PKEY *pkey); +PKCS8_PRIV_KEY_INFO *EVP_PKEY2PKCS8_broken(EVP_PKEY *pkey, int broken); +PKCS8_PRIV_KEY_INFO *PKCS8_set_broken(PKCS8_PRIV_KEY_INFO *p8, int broken); + +int PKCS8_pkey_set0(PKCS8_PRIV_KEY_INFO *priv, ASN1_OBJECT *aobj, + int version, int ptype, void *pval, + unsigned char *penc, int penclen); +int PKCS8_pkey_get0(ASN1_OBJECT **ppkalg, + const unsigned char **pk, int *ppklen, + X509_ALGOR **pa, PKCS8_PRIV_KEY_INFO *p8); + +int X509_PUBKEY_set0_param(X509_PUBKEY *pub, ASN1_OBJECT *aobj, + int ptype, void *pval, + unsigned char *penc, int penclen); +int X509_PUBKEY_get0_param(ASN1_OBJECT **ppkalg, + const unsigned char **pk, int *ppklen, + X509_ALGOR **pa, X509_PUBKEY *pub); + +int X509_check_trust(X509 *x, int id, int flags); +int X509_TRUST_get_count(void); +X509_TRUST *X509_TRUST_get0(int idx); +int X509_TRUST_get_by_id(int id); +int X509_TRUST_add(int id, int flags, int (*ck) (X509_TRUST *, X509 *, int), + char *name, int arg1, void *arg2); +void X509_TRUST_cleanup(void); +int X509_TRUST_get_flags(X509_TRUST *xp); +char *X509_TRUST_get0_name(X509_TRUST *xp); +int X509_TRUST_get_trust(X509_TRUST *xp); + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_X509_strings(void); + +/* Error codes for the X509 functions. */ + +/* Function codes. */ +# define X509_F_ADD_CERT_DIR 100 +# define X509_F_BY_FILE_CTRL 101 +# define X509_F_CHECK_POLICY 145 +# define X509_F_DIR_CTRL 102 +# define X509_F_GET_CERT_BY_SUBJECT 103 +# define X509_F_NETSCAPE_SPKI_B64_DECODE 129 +# define X509_F_NETSCAPE_SPKI_B64_ENCODE 130 +# define X509_F_X509AT_ADD1_ATTR 135 +# define X509_F_X509V3_ADD_EXT 104 +# define X509_F_X509_ATTRIBUTE_CREATE_BY_NID 136 +# define X509_F_X509_ATTRIBUTE_CREATE_BY_OBJ 137 +# define X509_F_X509_ATTRIBUTE_CREATE_BY_TXT 140 +# define X509_F_X509_ATTRIBUTE_GET0_DATA 139 +# define X509_F_X509_ATTRIBUTE_SET1_DATA 138 +# define X509_F_X509_CHECK_PRIVATE_KEY 128 +# define X509_F_X509_CRL_DIFF 105 +# define X509_F_X509_CRL_PRINT_FP 147 +# define X509_F_X509_EXTENSION_CREATE_BY_NID 108 +# define X509_F_X509_EXTENSION_CREATE_BY_OBJ 109 +# define X509_F_X509_GET_PUBKEY_PARAMETERS 110 +# define X509_F_X509_LOAD_CERT_CRL_FILE 132 +# define X509_F_X509_LOAD_CERT_FILE 111 +# define X509_F_X509_LOAD_CRL_FILE 112 +# define X509_F_X509_NAME_ADD_ENTRY 113 +# define X509_F_X509_NAME_ENTRY_CREATE_BY_NID 114 +# define X509_F_X509_NAME_ENTRY_CREATE_BY_TXT 131 +# define X509_F_X509_NAME_ENTRY_SET_OBJECT 115 +# define X509_F_X509_NAME_ONELINE 116 +# define X509_F_X509_NAME_PRINT 117 +# define X509_F_X509_PRINT_EX_FP 118 +# define X509_F_X509_PUBKEY_GET 119 +# define X509_F_X509_PUBKEY_SET 120 +# define X509_F_X509_REQ_CHECK_PRIVATE_KEY 144 +# define X509_F_X509_REQ_PRINT_EX 121 +# define X509_F_X509_REQ_PRINT_FP 122 +# define X509_F_X509_REQ_TO_X509 123 +# define X509_F_X509_STORE_ADD_CERT 124 +# define X509_F_X509_STORE_ADD_CRL 125 +# define X509_F_X509_STORE_CTX_GET1_ISSUER 146 +# define X509_F_X509_STORE_CTX_INIT 143 +# define X509_F_X509_STORE_CTX_NEW 142 +# define X509_F_X509_STORE_CTX_PURPOSE_INHERIT 134 +# define X509_F_X509_TO_X509_REQ 126 +# define X509_F_X509_TRUST_ADD 133 +# define X509_F_X509_TRUST_SET 141 +# define X509_F_X509_VERIFY_CERT 127 + +/* Reason codes. */ +# define X509_R_AKID_MISMATCH 110 +# define X509_R_BAD_X509_FILETYPE 100 +# define X509_R_BASE64_DECODE_ERROR 118 +# define X509_R_CANT_CHECK_DH_KEY 114 +# define X509_R_CERT_ALREADY_IN_HASH_TABLE 101 +# define X509_R_CRL_ALREADY_DELTA 127 +# define X509_R_CRL_VERIFY_FAILURE 131 +# define X509_R_ERR_ASN1_LIB 102 +# define X509_R_IDP_MISMATCH 128 +# define X509_R_INVALID_DIRECTORY 113 +# define X509_R_INVALID_FIELD_NAME 119 +# define X509_R_INVALID_TRUST 123 +# define X509_R_ISSUER_MISMATCH 129 +# define X509_R_KEY_TYPE_MISMATCH 115 +# define X509_R_KEY_VALUES_MISMATCH 116 +# define X509_R_LOADING_CERT_DIR 103 +# define X509_R_LOADING_DEFAULTS 104 +# define X509_R_METHOD_NOT_SUPPORTED 124 +# define X509_R_NEWER_CRL_NOT_NEWER 132 +# define X509_R_NO_CERT_SET_FOR_US_TO_VERIFY 105 +# define X509_R_NO_CRL_NUMBER 130 +# define X509_R_PUBLIC_KEY_DECODE_ERROR 125 +# define X509_R_PUBLIC_KEY_ENCODE_ERROR 126 +# define X509_R_SHOULD_RETRY 106 +# define X509_R_UNABLE_TO_FIND_PARAMETERS_IN_CHAIN 107 +# define X509_R_UNABLE_TO_GET_CERTS_PUBLIC_KEY 108 +# define X509_R_UNKNOWN_KEY_TYPE 117 +# define X509_R_UNKNOWN_NID 109 +# define X509_R_UNKNOWN_PURPOSE_ID 121 +# define X509_R_UNKNOWN_TRUST_ID 120 +# define X509_R_UNSUPPORTED_ALGORITHM 111 +# define X509_R_WRONG_LOOKUP_TYPE 112 +# define X509_R_WRONG_TYPE 122 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/ext/openssl-osx/include/openssl/x509_vfy.h b/ext/openssl-osx/include/openssl/x509_vfy.h new file mode 100644 index 00000000..a6f0df54 --- /dev/null +++ b/ext/openssl-osx/include/openssl/x509_vfy.h @@ -0,0 +1,641 @@ +/* crypto/x509/x509_vfy.h */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_X509_H +# include +/* + * openssl/x509.h ends up #include-ing this file at about the only + * appropriate moment. + */ +#endif + +#ifndef HEADER_X509_VFY_H +# define HEADER_X509_VFY_H + +# include +# ifndef OPENSSL_NO_LHASH +# include +# endif +# include +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# if 0 +/* Outer object */ +typedef struct x509_hash_dir_st { + int num_dirs; + char **dirs; + int *dirs_type; + int num_dirs_alloced; +} X509_HASH_DIR_CTX; +# endif + +typedef struct x509_file_st { + int num_paths; /* number of paths to files or directories */ + int num_alloced; + char **paths; /* the list of paths or directories */ + int *path_type; +} X509_CERT_FILE_CTX; + +/*******************************/ +/*- +SSL_CTX -> X509_STORE + -> X509_LOOKUP + ->X509_LOOKUP_METHOD + -> X509_LOOKUP + ->X509_LOOKUP_METHOD + +SSL -> X509_STORE_CTX + ->X509_STORE + +The X509_STORE holds the tables etc for verification stuff. +A X509_STORE_CTX is used while validating a single certificate. +The X509_STORE has X509_LOOKUPs for looking up certs. +The X509_STORE then calls a function to actually verify the +certificate chain. +*/ + +# define X509_LU_RETRY -1 +# define X509_LU_FAIL 0 +# define X509_LU_X509 1 +# define X509_LU_CRL 2 +# define X509_LU_PKEY 3 + +typedef struct x509_object_st { + /* one of the above types */ + int type; + union { + char *ptr; + X509 *x509; + X509_CRL *crl; + EVP_PKEY *pkey; + } data; +} X509_OBJECT; + +typedef struct x509_lookup_st X509_LOOKUP; + +DECLARE_STACK_OF(X509_LOOKUP) +DECLARE_STACK_OF(X509_OBJECT) + +/* This is a static that defines the function interface */ +typedef struct x509_lookup_method_st { + const char *name; + int (*new_item) (X509_LOOKUP *ctx); + void (*free) (X509_LOOKUP *ctx); + int (*init) (X509_LOOKUP *ctx); + int (*shutdown) (X509_LOOKUP *ctx); + int (*ctrl) (X509_LOOKUP *ctx, int cmd, const char *argc, long argl, + char **ret); + int (*get_by_subject) (X509_LOOKUP *ctx, int type, X509_NAME *name, + X509_OBJECT *ret); + int (*get_by_issuer_serial) (X509_LOOKUP *ctx, int type, X509_NAME *name, + ASN1_INTEGER *serial, X509_OBJECT *ret); + int (*get_by_fingerprint) (X509_LOOKUP *ctx, int type, + unsigned char *bytes, int len, + X509_OBJECT *ret); + int (*get_by_alias) (X509_LOOKUP *ctx, int type, char *str, int len, + X509_OBJECT *ret); +} X509_LOOKUP_METHOD; + +typedef struct X509_VERIFY_PARAM_ID_st X509_VERIFY_PARAM_ID; + +/* + * This structure hold all parameters associated with a verify operation by + * including an X509_VERIFY_PARAM structure in related structures the + * parameters used can be customized + */ + +typedef struct X509_VERIFY_PARAM_st { + char *name; + time_t check_time; /* Time to use */ + unsigned long inh_flags; /* Inheritance flags */ + unsigned long flags; /* Various verify flags */ + int purpose; /* purpose to check untrusted certificates */ + int trust; /* trust setting to check */ + int depth; /* Verify depth */ + STACK_OF(ASN1_OBJECT) *policies; /* Permissible policies */ + X509_VERIFY_PARAM_ID *id; /* opaque ID data */ +} X509_VERIFY_PARAM; + +DECLARE_STACK_OF(X509_VERIFY_PARAM) + +/* + * This is used to hold everything. It is used for all certificate + * validation. Once we have a certificate chain, the 'verify' function is + * then called to actually check the cert chain. + */ +struct x509_store_st { + /* The following is a cache of trusted certs */ + int cache; /* if true, stash any hits */ + STACK_OF(X509_OBJECT) *objs; /* Cache of all objects */ + /* These are external lookup methods */ + STACK_OF(X509_LOOKUP) *get_cert_methods; + X509_VERIFY_PARAM *param; + /* Callbacks for various operations */ + /* called to verify a certificate */ + int (*verify) (X509_STORE_CTX *ctx); + /* error callback */ + int (*verify_cb) (int ok, X509_STORE_CTX *ctx); + /* get issuers cert from ctx */ + int (*get_issuer) (X509 **issuer, X509_STORE_CTX *ctx, X509 *x); + /* check issued */ + int (*check_issued) (X509_STORE_CTX *ctx, X509 *x, X509 *issuer); + /* Check revocation status of chain */ + int (*check_revocation) (X509_STORE_CTX *ctx); + /* retrieve CRL */ + int (*get_crl) (X509_STORE_CTX *ctx, X509_CRL **crl, X509 *x); + /* Check CRL validity */ + int (*check_crl) (X509_STORE_CTX *ctx, X509_CRL *crl); + /* Check certificate against CRL */ + int (*cert_crl) (X509_STORE_CTX *ctx, X509_CRL *crl, X509 *x); + STACK_OF(X509) *(*lookup_certs) (X509_STORE_CTX *ctx, X509_NAME *nm); + STACK_OF(X509_CRL) *(*lookup_crls) (X509_STORE_CTX *ctx, X509_NAME *nm); + int (*cleanup) (X509_STORE_CTX *ctx); + CRYPTO_EX_DATA ex_data; + int references; +} /* X509_STORE */ ; + +int X509_STORE_set_depth(X509_STORE *store, int depth); + +# define X509_STORE_set_verify_cb_func(ctx,func) ((ctx)->verify_cb=(func)) +# define X509_STORE_set_verify_func(ctx,func) ((ctx)->verify=(func)) + +/* This is the functions plus an instance of the local variables. */ +struct x509_lookup_st { + int init; /* have we been started */ + int skip; /* don't use us. */ + X509_LOOKUP_METHOD *method; /* the functions */ + char *method_data; /* method data */ + X509_STORE *store_ctx; /* who owns us */ +} /* X509_LOOKUP */ ; + +/* + * This is a used when verifying cert chains. Since the gathering of the + * cert chain can take some time (and have to be 'retried', this needs to be + * kept and passed around. + */ +struct x509_store_ctx_st { /* X509_STORE_CTX */ + X509_STORE *ctx; + /* used when looking up certs */ + int current_method; + /* The following are set by the caller */ + /* The cert to check */ + X509 *cert; + /* chain of X509s - untrusted - passed in */ + STACK_OF(X509) *untrusted; + /* set of CRLs passed in */ + STACK_OF(X509_CRL) *crls; + X509_VERIFY_PARAM *param; + /* Other info for use with get_issuer() */ + void *other_ctx; + /* Callbacks for various operations */ + /* called to verify a certificate */ + int (*verify) (X509_STORE_CTX *ctx); + /* error callback */ + int (*verify_cb) (int ok, X509_STORE_CTX *ctx); + /* get issuers cert from ctx */ + int (*get_issuer) (X509 **issuer, X509_STORE_CTX *ctx, X509 *x); + /* check issued */ + int (*check_issued) (X509_STORE_CTX *ctx, X509 *x, X509 *issuer); + /* Check revocation status of chain */ + int (*check_revocation) (X509_STORE_CTX *ctx); + /* retrieve CRL */ + int (*get_crl) (X509_STORE_CTX *ctx, X509_CRL **crl, X509 *x); + /* Check CRL validity */ + int (*check_crl) (X509_STORE_CTX *ctx, X509_CRL *crl); + /* Check certificate against CRL */ + int (*cert_crl) (X509_STORE_CTX *ctx, X509_CRL *crl, X509 *x); + int (*check_policy) (X509_STORE_CTX *ctx); + STACK_OF(X509) *(*lookup_certs) (X509_STORE_CTX *ctx, X509_NAME *nm); + STACK_OF(X509_CRL) *(*lookup_crls) (X509_STORE_CTX *ctx, X509_NAME *nm); + int (*cleanup) (X509_STORE_CTX *ctx); + /* The following is built up */ + /* if 0, rebuild chain */ + int valid; + /* index of last untrusted cert */ + int last_untrusted; + /* chain of X509s - built up and trusted */ + STACK_OF(X509) *chain; + /* Valid policy tree */ + X509_POLICY_TREE *tree; + /* Require explicit policy value */ + int explicit_policy; + /* When something goes wrong, this is why */ + int error_depth; + int error; + X509 *current_cert; + /* cert currently being tested as valid issuer */ + X509 *current_issuer; + /* current CRL */ + X509_CRL *current_crl; + /* score of current CRL */ + int current_crl_score; + /* Reason mask */ + unsigned int current_reasons; + /* For CRL path validation: parent context */ + X509_STORE_CTX *parent; + CRYPTO_EX_DATA ex_data; +} /* X509_STORE_CTX */ ; + +void X509_STORE_CTX_set_depth(X509_STORE_CTX *ctx, int depth); + +# define X509_STORE_CTX_set_app_data(ctx,data) \ + X509_STORE_CTX_set_ex_data(ctx,0,data) +# define X509_STORE_CTX_get_app_data(ctx) \ + X509_STORE_CTX_get_ex_data(ctx,0) + +# define X509_L_FILE_LOAD 1 +# define X509_L_ADD_DIR 2 + +# define X509_LOOKUP_load_file(x,name,type) \ + X509_LOOKUP_ctrl((x),X509_L_FILE_LOAD,(name),(long)(type),NULL) + +# define X509_LOOKUP_add_dir(x,name,type) \ + X509_LOOKUP_ctrl((x),X509_L_ADD_DIR,(name),(long)(type),NULL) + +# define X509_V_OK 0 +/* illegal error (for uninitialized values, to avoid X509_V_OK): 1 */ + +# define X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT 2 +# define X509_V_ERR_UNABLE_TO_GET_CRL 3 +# define X509_V_ERR_UNABLE_TO_DECRYPT_CERT_SIGNATURE 4 +# define X509_V_ERR_UNABLE_TO_DECRYPT_CRL_SIGNATURE 5 +# define X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY 6 +# define X509_V_ERR_CERT_SIGNATURE_FAILURE 7 +# define X509_V_ERR_CRL_SIGNATURE_FAILURE 8 +# define X509_V_ERR_CERT_NOT_YET_VALID 9 +# define X509_V_ERR_CERT_HAS_EXPIRED 10 +# define X509_V_ERR_CRL_NOT_YET_VALID 11 +# define X509_V_ERR_CRL_HAS_EXPIRED 12 +# define X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD 13 +# define X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD 14 +# define X509_V_ERR_ERROR_IN_CRL_LAST_UPDATE_FIELD 15 +# define X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD 16 +# define X509_V_ERR_OUT_OF_MEM 17 +# define X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT 18 +# define X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN 19 +# define X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY 20 +# define X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE 21 +# define X509_V_ERR_CERT_CHAIN_TOO_LONG 22 +# define X509_V_ERR_CERT_REVOKED 23 +# define X509_V_ERR_INVALID_CA 24 +# define X509_V_ERR_PATH_LENGTH_EXCEEDED 25 +# define X509_V_ERR_INVALID_PURPOSE 26 +# define X509_V_ERR_CERT_UNTRUSTED 27 +# define X509_V_ERR_CERT_REJECTED 28 +/* These are 'informational' when looking for issuer cert */ +# define X509_V_ERR_SUBJECT_ISSUER_MISMATCH 29 +# define X509_V_ERR_AKID_SKID_MISMATCH 30 +# define X509_V_ERR_AKID_ISSUER_SERIAL_MISMATCH 31 +# define X509_V_ERR_KEYUSAGE_NO_CERTSIGN 32 + +# define X509_V_ERR_UNABLE_TO_GET_CRL_ISSUER 33 +# define X509_V_ERR_UNHANDLED_CRITICAL_EXTENSION 34 +# define X509_V_ERR_KEYUSAGE_NO_CRL_SIGN 35 +# define X509_V_ERR_UNHANDLED_CRITICAL_CRL_EXTENSION 36 +# define X509_V_ERR_INVALID_NON_CA 37 +# define X509_V_ERR_PROXY_PATH_LENGTH_EXCEEDED 38 +# define X509_V_ERR_KEYUSAGE_NO_DIGITAL_SIGNATURE 39 +# define X509_V_ERR_PROXY_CERTIFICATES_NOT_ALLOWED 40 + +# define X509_V_ERR_INVALID_EXTENSION 41 +# define X509_V_ERR_INVALID_POLICY_EXTENSION 42 +# define X509_V_ERR_NO_EXPLICIT_POLICY 43 +# define X509_V_ERR_DIFFERENT_CRL_SCOPE 44 +# define X509_V_ERR_UNSUPPORTED_EXTENSION_FEATURE 45 + +# define X509_V_ERR_UNNESTED_RESOURCE 46 + +# define X509_V_ERR_PERMITTED_VIOLATION 47 +# define X509_V_ERR_EXCLUDED_VIOLATION 48 +# define X509_V_ERR_SUBTREE_MINMAX 49 +# define X509_V_ERR_UNSUPPORTED_CONSTRAINT_TYPE 51 +# define X509_V_ERR_UNSUPPORTED_CONSTRAINT_SYNTAX 52 +# define X509_V_ERR_UNSUPPORTED_NAME_SYNTAX 53 +# define X509_V_ERR_CRL_PATH_VALIDATION_ERROR 54 + +/* Suite B mode algorithm violation */ +# define X509_V_ERR_SUITE_B_INVALID_VERSION 56 +# define X509_V_ERR_SUITE_B_INVALID_ALGORITHM 57 +# define X509_V_ERR_SUITE_B_INVALID_CURVE 58 +# define X509_V_ERR_SUITE_B_INVALID_SIGNATURE_ALGORITHM 59 +# define X509_V_ERR_SUITE_B_LOS_NOT_ALLOWED 60 +# define X509_V_ERR_SUITE_B_CANNOT_SIGN_P_384_WITH_P_256 61 + +/* Host, email and IP check errors */ +# define X509_V_ERR_HOSTNAME_MISMATCH 62 +# define X509_V_ERR_EMAIL_MISMATCH 63 +# define X509_V_ERR_IP_ADDRESS_MISMATCH 64 + +/* The application is not happy */ +# define X509_V_ERR_APPLICATION_VERIFICATION 50 + +/* Certificate verify flags */ + +/* Send issuer+subject checks to verify_cb */ +# define X509_V_FLAG_CB_ISSUER_CHECK 0x1 +/* Use check time instead of current time */ +# define X509_V_FLAG_USE_CHECK_TIME 0x2 +/* Lookup CRLs */ +# define X509_V_FLAG_CRL_CHECK 0x4 +/* Lookup CRLs for whole chain */ +# define X509_V_FLAG_CRL_CHECK_ALL 0x8 +/* Ignore unhandled critical extensions */ +# define X509_V_FLAG_IGNORE_CRITICAL 0x10 +/* Disable workarounds for broken certificates */ +# define X509_V_FLAG_X509_STRICT 0x20 +/* Enable proxy certificate validation */ +# define X509_V_FLAG_ALLOW_PROXY_CERTS 0x40 +/* Enable policy checking */ +# define X509_V_FLAG_POLICY_CHECK 0x80 +/* Policy variable require-explicit-policy */ +# define X509_V_FLAG_EXPLICIT_POLICY 0x100 +/* Policy variable inhibit-any-policy */ +# define X509_V_FLAG_INHIBIT_ANY 0x200 +/* Policy variable inhibit-policy-mapping */ +# define X509_V_FLAG_INHIBIT_MAP 0x400 +/* Notify callback that policy is OK */ +# define X509_V_FLAG_NOTIFY_POLICY 0x800 +/* Extended CRL features such as indirect CRLs, alternate CRL signing keys */ +# define X509_V_FLAG_EXTENDED_CRL_SUPPORT 0x1000 +/* Delta CRL support */ +# define X509_V_FLAG_USE_DELTAS 0x2000 +/* Check selfsigned CA signature */ +# define X509_V_FLAG_CHECK_SS_SIGNATURE 0x4000 +/* Use trusted store first */ +# define X509_V_FLAG_TRUSTED_FIRST 0x8000 +/* Suite B 128 bit only mode: not normally used */ +# define X509_V_FLAG_SUITEB_128_LOS_ONLY 0x10000 +/* Suite B 192 bit only mode */ +# define X509_V_FLAG_SUITEB_192_LOS 0x20000 +/* Suite B 128 bit mode allowing 192 bit algorithms */ +# define X509_V_FLAG_SUITEB_128_LOS 0x30000 + +/* Allow partial chains if at least one certificate is in trusted store */ +# define X509_V_FLAG_PARTIAL_CHAIN 0x80000 + +# define X509_VP_FLAG_DEFAULT 0x1 +# define X509_VP_FLAG_OVERWRITE 0x2 +# define X509_VP_FLAG_RESET_FLAGS 0x4 +# define X509_VP_FLAG_LOCKED 0x8 +# define X509_VP_FLAG_ONCE 0x10 + +/* Internal use: mask of policy related options */ +# define X509_V_FLAG_POLICY_MASK (X509_V_FLAG_POLICY_CHECK \ + | X509_V_FLAG_EXPLICIT_POLICY \ + | X509_V_FLAG_INHIBIT_ANY \ + | X509_V_FLAG_INHIBIT_MAP) + +int X509_OBJECT_idx_by_subject(STACK_OF(X509_OBJECT) *h, int type, + X509_NAME *name); +X509_OBJECT *X509_OBJECT_retrieve_by_subject(STACK_OF(X509_OBJECT) *h, + int type, X509_NAME *name); +X509_OBJECT *X509_OBJECT_retrieve_match(STACK_OF(X509_OBJECT) *h, + X509_OBJECT *x); +void X509_OBJECT_up_ref_count(X509_OBJECT *a); +void X509_OBJECT_free_contents(X509_OBJECT *a); +X509_STORE *X509_STORE_new(void); +void X509_STORE_free(X509_STORE *v); + +STACK_OF(X509) *X509_STORE_get1_certs(X509_STORE_CTX *st, X509_NAME *nm); +STACK_OF(X509_CRL) *X509_STORE_get1_crls(X509_STORE_CTX *st, X509_NAME *nm); +int X509_STORE_set_flags(X509_STORE *ctx, unsigned long flags); +int X509_STORE_set_purpose(X509_STORE *ctx, int purpose); +int X509_STORE_set_trust(X509_STORE *ctx, int trust); +int X509_STORE_set1_param(X509_STORE *ctx, X509_VERIFY_PARAM *pm); + +void X509_STORE_set_verify_cb(X509_STORE *ctx, + int (*verify_cb) (int, X509_STORE_CTX *)); + +void X509_STORE_set_lookup_crls_cb(X509_STORE *ctx, + STACK_OF(X509_CRL) *(*cb) (X509_STORE_CTX + *ctx, + X509_NAME *nm)); + +X509_STORE_CTX *X509_STORE_CTX_new(void); + +int X509_STORE_CTX_get1_issuer(X509 **issuer, X509_STORE_CTX *ctx, X509 *x); + +void X509_STORE_CTX_free(X509_STORE_CTX *ctx); +int X509_STORE_CTX_init(X509_STORE_CTX *ctx, X509_STORE *store, + X509 *x509, STACK_OF(X509) *chain); +void X509_STORE_CTX_trusted_stack(X509_STORE_CTX *ctx, STACK_OF(X509) *sk); +void X509_STORE_CTX_cleanup(X509_STORE_CTX *ctx); + +X509_STORE *X509_STORE_CTX_get0_store(X509_STORE_CTX *ctx); + +X509_LOOKUP *X509_STORE_add_lookup(X509_STORE *v, X509_LOOKUP_METHOD *m); + +X509_LOOKUP_METHOD *X509_LOOKUP_hash_dir(void); +X509_LOOKUP_METHOD *X509_LOOKUP_file(void); + +int X509_STORE_add_cert(X509_STORE *ctx, X509 *x); +int X509_STORE_add_crl(X509_STORE *ctx, X509_CRL *x); + +int X509_STORE_get_by_subject(X509_STORE_CTX *vs, int type, X509_NAME *name, + X509_OBJECT *ret); + +int X509_LOOKUP_ctrl(X509_LOOKUP *ctx, int cmd, const char *argc, + long argl, char **ret); + +# ifndef OPENSSL_NO_STDIO +int X509_load_cert_file(X509_LOOKUP *ctx, const char *file, int type); +int X509_load_crl_file(X509_LOOKUP *ctx, const char *file, int type); +int X509_load_cert_crl_file(X509_LOOKUP *ctx, const char *file, int type); +# endif + +X509_LOOKUP *X509_LOOKUP_new(X509_LOOKUP_METHOD *method); +void X509_LOOKUP_free(X509_LOOKUP *ctx); +int X509_LOOKUP_init(X509_LOOKUP *ctx); +int X509_LOOKUP_by_subject(X509_LOOKUP *ctx, int type, X509_NAME *name, + X509_OBJECT *ret); +int X509_LOOKUP_by_issuer_serial(X509_LOOKUP *ctx, int type, X509_NAME *name, + ASN1_INTEGER *serial, X509_OBJECT *ret); +int X509_LOOKUP_by_fingerprint(X509_LOOKUP *ctx, int type, + unsigned char *bytes, int len, + X509_OBJECT *ret); +int X509_LOOKUP_by_alias(X509_LOOKUP *ctx, int type, char *str, int len, + X509_OBJECT *ret); +int X509_LOOKUP_shutdown(X509_LOOKUP *ctx); + +# ifndef OPENSSL_NO_STDIO +int X509_STORE_load_locations(X509_STORE *ctx, + const char *file, const char *dir); +int X509_STORE_set_default_paths(X509_STORE *ctx); +# endif + +int X509_STORE_CTX_get_ex_new_index(long argl, void *argp, + CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, + CRYPTO_EX_free *free_func); +int X509_STORE_CTX_set_ex_data(X509_STORE_CTX *ctx, int idx, void *data); +void *X509_STORE_CTX_get_ex_data(X509_STORE_CTX *ctx, int idx); +int X509_STORE_CTX_get_error(X509_STORE_CTX *ctx); +void X509_STORE_CTX_set_error(X509_STORE_CTX *ctx, int s); +int X509_STORE_CTX_get_error_depth(X509_STORE_CTX *ctx); +X509 *X509_STORE_CTX_get_current_cert(X509_STORE_CTX *ctx); +X509 *X509_STORE_CTX_get0_current_issuer(X509_STORE_CTX *ctx); +X509_CRL *X509_STORE_CTX_get0_current_crl(X509_STORE_CTX *ctx); +X509_STORE_CTX *X509_STORE_CTX_get0_parent_ctx(X509_STORE_CTX *ctx); +STACK_OF(X509) *X509_STORE_CTX_get_chain(X509_STORE_CTX *ctx); +STACK_OF(X509) *X509_STORE_CTX_get1_chain(X509_STORE_CTX *ctx); +void X509_STORE_CTX_set_cert(X509_STORE_CTX *c, X509 *x); +void X509_STORE_CTX_set_chain(X509_STORE_CTX *c, STACK_OF(X509) *sk); +void X509_STORE_CTX_set0_crls(X509_STORE_CTX *c, STACK_OF(X509_CRL) *sk); +int X509_STORE_CTX_set_purpose(X509_STORE_CTX *ctx, int purpose); +int X509_STORE_CTX_set_trust(X509_STORE_CTX *ctx, int trust); +int X509_STORE_CTX_purpose_inherit(X509_STORE_CTX *ctx, int def_purpose, + int purpose, int trust); +void X509_STORE_CTX_set_flags(X509_STORE_CTX *ctx, unsigned long flags); +void X509_STORE_CTX_set_time(X509_STORE_CTX *ctx, unsigned long flags, + time_t t); +void X509_STORE_CTX_set_verify_cb(X509_STORE_CTX *ctx, + int (*verify_cb) (int, X509_STORE_CTX *)); + +X509_POLICY_TREE *X509_STORE_CTX_get0_policy_tree(X509_STORE_CTX *ctx); +int X509_STORE_CTX_get_explicit_policy(X509_STORE_CTX *ctx); + +X509_VERIFY_PARAM *X509_STORE_CTX_get0_param(X509_STORE_CTX *ctx); +void X509_STORE_CTX_set0_param(X509_STORE_CTX *ctx, X509_VERIFY_PARAM *param); +int X509_STORE_CTX_set_default(X509_STORE_CTX *ctx, const char *name); + +/* X509_VERIFY_PARAM functions */ + +X509_VERIFY_PARAM *X509_VERIFY_PARAM_new(void); +void X509_VERIFY_PARAM_free(X509_VERIFY_PARAM *param); +int X509_VERIFY_PARAM_inherit(X509_VERIFY_PARAM *to, + const X509_VERIFY_PARAM *from); +int X509_VERIFY_PARAM_set1(X509_VERIFY_PARAM *to, + const X509_VERIFY_PARAM *from); +int X509_VERIFY_PARAM_set1_name(X509_VERIFY_PARAM *param, const char *name); +int X509_VERIFY_PARAM_set_flags(X509_VERIFY_PARAM *param, + unsigned long flags); +int X509_VERIFY_PARAM_clear_flags(X509_VERIFY_PARAM *param, + unsigned long flags); +unsigned long X509_VERIFY_PARAM_get_flags(X509_VERIFY_PARAM *param); +int X509_VERIFY_PARAM_set_purpose(X509_VERIFY_PARAM *param, int purpose); +int X509_VERIFY_PARAM_set_trust(X509_VERIFY_PARAM *param, int trust); +void X509_VERIFY_PARAM_set_depth(X509_VERIFY_PARAM *param, int depth); +void X509_VERIFY_PARAM_set_time(X509_VERIFY_PARAM *param, time_t t); +int X509_VERIFY_PARAM_add0_policy(X509_VERIFY_PARAM *param, + ASN1_OBJECT *policy); +int X509_VERIFY_PARAM_set1_policies(X509_VERIFY_PARAM *param, + STACK_OF(ASN1_OBJECT) *policies); + +int X509_VERIFY_PARAM_set1_host(X509_VERIFY_PARAM *param, + const char *name, size_t namelen); +int X509_VERIFY_PARAM_add1_host(X509_VERIFY_PARAM *param, + const char *name, size_t namelen); +void X509_VERIFY_PARAM_set_hostflags(X509_VERIFY_PARAM *param, + unsigned int flags); +char *X509_VERIFY_PARAM_get0_peername(X509_VERIFY_PARAM *); +int X509_VERIFY_PARAM_set1_email(X509_VERIFY_PARAM *param, + const char *email, size_t emaillen); +int X509_VERIFY_PARAM_set1_ip(X509_VERIFY_PARAM *param, + const unsigned char *ip, size_t iplen); +int X509_VERIFY_PARAM_set1_ip_asc(X509_VERIFY_PARAM *param, + const char *ipasc); + +int X509_VERIFY_PARAM_get_depth(const X509_VERIFY_PARAM *param); +const char *X509_VERIFY_PARAM_get0_name(const X509_VERIFY_PARAM *param); + +int X509_VERIFY_PARAM_add0_table(X509_VERIFY_PARAM *param); +int X509_VERIFY_PARAM_get_count(void); +const X509_VERIFY_PARAM *X509_VERIFY_PARAM_get0(int id); +const X509_VERIFY_PARAM *X509_VERIFY_PARAM_lookup(const char *name); +void X509_VERIFY_PARAM_table_cleanup(void); + +int X509_policy_check(X509_POLICY_TREE **ptree, int *pexplicit_policy, + STACK_OF(X509) *certs, + STACK_OF(ASN1_OBJECT) *policy_oids, unsigned int flags); + +void X509_policy_tree_free(X509_POLICY_TREE *tree); + +int X509_policy_tree_level_count(const X509_POLICY_TREE *tree); +X509_POLICY_LEVEL *X509_policy_tree_get0_level(const X509_POLICY_TREE *tree, + int i); + +STACK_OF(X509_POLICY_NODE) *X509_policy_tree_get0_policies(const + X509_POLICY_TREE + *tree); + +STACK_OF(X509_POLICY_NODE) *X509_policy_tree_get0_user_policies(const + X509_POLICY_TREE + *tree); + +int X509_policy_level_node_count(X509_POLICY_LEVEL *level); + +X509_POLICY_NODE *X509_policy_level_get0_node(X509_POLICY_LEVEL *level, + int i); + +const ASN1_OBJECT *X509_policy_node_get0_policy(const X509_POLICY_NODE *node); + +STACK_OF(POLICYQUALINFO) *X509_policy_node_get0_qualifiers(const + X509_POLICY_NODE + *node); +const X509_POLICY_NODE *X509_policy_node_get0_parent(const X509_POLICY_NODE + *node); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/ext/openssl-osx/libcrypto.a b/ext/openssl-osx/libcrypto.a new file mode 100644 index 0000000000000000000000000000000000000000..037d63345ca5cee1e4461745841da4566a57dff1 GIT binary patch literal 2700624 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 CVvm1snPEJ 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%0AO<*5*8F&kLIrsqB3O);74Za3m1MUKO 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%0D+S=1zAK|@2+vPgZfYoo&oqN{q6_x4c9 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�U-&5=Mh{_mihc*bR_K?5{0(X({3I7|UkFS1DPFM` zPxJ}=)J{i&u*W~6K*YC^wF1|mgUW|nQud4CKFIPvil228x=i?J9OH>cHx}w8z63wY z&74)ef_rXv;wWCyxv#-}ec&cN%|2+4p^eZ=@XKAqy(c?;xjSgTI?q?`O|-Qqk!^U0 zx6;KuhlI73NAzagfN=w{L!2BL!v5OHnS-2PI{ps$uXprKw6)biy6A9*bIW@37{{}b zcq^Q{1AfL3CapE&)ID?lMp2PM-S&k7vF|f0MifaqB(Zt|0#beTm1v+H;Te^wd2P z@c+l-In$GQ9t;7`;huX>FE0mp?!!HuH+y9`!jr$N$Mc%UbEl{Oa?kxIPyV+&{y)+d z1KpN-?u}mD`#hcR_2Qo4@m%cDZ}QyQH!qO?lBfSYp8EhVFDH5YS`Qe+)rJXy`=6ek z4|wIQ=Rv@u`zmnj`4G6LdOCl{bKmR9T;!!S%5xv$@oRN>AoEuqU9-yp{RbY;rC#}O z@!HQ{z4r4LFTX=Po;y6AM?IOZdTHf*^!>d2p6byL_1s#Y8R+Tn^R>pKulD%g^U}K1 zqq80^l%u^61DW$Z`YT@EH+pgFy?P(y$v@xYpXcc_)hnO1p4(r;#D0OH4vRgRfA?e# z^U71t?m*|4JbGrGP;lOARmt4b=Ty$FTFQaMO*Qtcz~*+g9x_K#N0+$hyv`_v&61)b zwR@6Vl3@;l)mCO&^U}1awt9JnRf|X>Y}spnGD&$0f+Rdx5M-7nDHC=ZC9N27&azYI zurpfO=>u)BWRi(&IL7)EDnaGr`g3_B=T z?MXz*o|nnIwDu%$;&lHo?;P9AQ8U>pXp?%@&zQW|EUB(iyEqR_GEShyH2XAW?}yzHHZNN z!kM`s)L+h%X%eSYPMhS`h#4ZsS~hSyPX$;g^(d1UJ1Kji!Le7JXrvD>F4}QLLEaunp~jP{kx@z1w5V z@MRz39M+C0uki5hlec|RgHdwF=QK%8d)ks#+chmbcS0j)No&;?`wkdnC0ILWE9kDA zRa(`yycv%vvC7lul&O0#`SuszNhXW)!Z@w$X5k9QD&#HmQ>ryf?b@$!p`FPj83+j~ zvH=$jD!`ML9VdH9Xzanw8>4ke_4t_E&QlEG z7n+#q{JEtjaBF3A)YVp1w{i6E!gd{AQZ|o1jq}8{p=3$f+)CTvL^Zw{rCtl{fB2dB zX3U#+3WvkZE1NrG>P(M2I5fpnS^b3Cen~}JyD5>(9iH(e=Qc(~+7Q370PG22~x?VZqa{ylnMbS=Q|ro~8JA zwMU8M%+mdaxwyT$g-%h=bnmGsZ}=pXC-U_B;_Fl=O`0&tEK|*_Q>D+VU$oqE`4{ukvELCUWGHNY3@^>~dDf|J&a?3qXAX1p4=d&uSf{G^nhSY^ z^!lqx;L}=y%ijN8J|F)@s!HBeunA9c z)%hriVaP;`Csr0b1xY5xDOi#v`Q2Cntiv{`bIaa&UEhIbY&{@YJKkGG!EQo(2O1;) z)t11QcvIc!Rfd&FP?)o}-|rpTC75+^$P(sxsHs)|L&c$su`PJqv7Za}&5ed>as`pO zixhTLH0&2HtVLn_M#FyP!kBDS{2a*+Y%yM!ozZ9GF}lFIWUX@kv`i4YmfG@>pbM;f{iLAQ%H1QvzxVv2-gzSm0fYZHdf_x}Qu} zLovmtJ+Ki^$k?z5O9||L5+PcVmdkhlv}B@t3S(%Q9~>wKyI??VBfXdPr*{J>+0`FF zBXPBokvJ8?UH)Gl2!kcA4UYnYdIuA9nvHJ&jhN>V5{H-Mz`Sf`VuT9YqNcE4Pkt z#a=A5hCkiUq$f!XCM8AS_}9BX!(^GF8o#!;LV2d{dZ)U~?=H?Kqq2uM*|kpg(v0l% zTUb%3V*emiK35HL)lTZVozjmego3+IsAfVVQR=-fD5(aP@|ucEq`wVA=a!ubD_C*7 zWL|CvJ6$qfQV7`0y#u>H?OJ>3n+VX7iD96YOxRVq!wRtN zDoSr+;V6cnW!;}VEEQRdc>$`8>7Etqd^|tdz*6t7;Lfz-^VNr_p420$o)j&817iA) zit-bf|38k|6gbTOT~|jOs?tpms4v{)aHGSu4)1Ze#^E&%I}DZsT5yj3&C$PN8b|B6`=-XJ5)5E3JB7UV?MewvN_D8^P!MC? zg6k1l2>ZHj`fPf2bCJFF&W|0gi){vHyEcyQMT?L!ukT=7_pilurAH$^N> z)TYws%fgR!#_bPxtSBfpMzrlC2%XL$n9{RU2VzQqcJxEHNvSJL@w*4(2$!q#T&|XQ zx!PMgY-MRM)swrk6(M)dfkZjQTGElIOEOUpW0!$`ww(H$cX74oya(&8DjGG zI8P^gkDi8~>`f7m>akjBamOcz+`d!Wm}GfQa&~U2k~-G;HE3rFm^*nge6*~UD@hyP zo!jyh`#`8XJ=;%)ltUmwlgoxFWT=&EOl3c_OGp<}#goYO#8k)Esam9)hBCtyX#V>BW|J+ zku@g0v*?d^J#8aisg2koB_J+6HYnzVGPab$NI$C;qQ-=HmgU#OBWTI#y9w=^ZuKAk zLGLHoB2A&zxPF_dQej=AI*##woq;56G&G`J|@lbOP4LEo%WOnlfs1OjDu5obyeg>!H4e zCgVS#!%Y|CQhzwfPqaACHn^;>Dd@NMpRm|;{Oiax{r-*kr0lnaD4PTcV^J?1 zhi-X0Mph4DJC1W<$UG0`pE@VGg8perLHcA#FuU@SzkFo!h`c#`o*$vmEqyy{v2{*n z?;5*SdL(_ui0)@i_p?B`?dA^JNijA^@+VpWx{mS9ar8vV-Au;rq5A+*V_v>)WW-^Cj|u}EI)-qM#tqZwYiwvCSb zzf^co`M0{tH-lU%-waG$<wl*kLcd!nfwm#ex4c}!Hd+^&J%LlN2>#+ zr%w(|&KMr#@V_hqwOcE2KiorIa<7e$9w<2+CDjC=nl^X}n10r*HpR;R$Y8ucm-HaS z9Yws>L}WGTtY1r`@OfFLK5ZF+<3FDK#MkfDy(~(d*fp-8piak);r>hAe|`L~`*(i4 zQ`ZL)%3}WxX&U7JlNn-noH-T;dxzG5QDWylvv`Pf?#aQ}ABeZ>Sa%qkk zKvS?u?Zj}Z9(v^NV#4*Dnr8jPvm^K#(I@4!kJC%mY#rEU3S*`fHzHXEH7B4RWvFc< z7F{z<895j)i|ekMP3}x7WQxhzguD5i8g>Uhud!)aW1^<1w$9%wIA%Yp8Tv7a*w}>g zw=uV5{O(JHVQ7W2u)20?!(xFm-*n@GrikmB*&%w4Ir*E^ z143D_C3B29Oqq{IBHB%nr`es1V~g$X*8$FF@9SAjwXLxhv*9(LG-Au_hSyMn{jTTR z?XEov352_4YbRtTyAtNZC3Zrw$LX7%=JzT;Y#|x$#bTfF(=`L+evQomnVyNA3GNQo zgUnjQE&}4qoQMtHBcdlN^1R zqvwF=8Go3BWgqnekm;iMb)e#Rfs(%jWONlT1;tnB{Qr&H^zH_~1btPUy-AVDb=%(= z-d+S<=`I5C#^;0jE8!m^;)M=Jg0e3f1daj!4fEmP)8JU}F_7oRpr3&UN}t1qW%OyKKf>NI)KC7;7^F(>A04g-CGQbX@_r6VPTg+Nc*kV< z$H1rZ9}bQK|A9wxW#1^ft%pIXEq)zH9mW^!8kIK-I&*gMLXfGwIChQ^J^#f}cVFo5 zfnNdt2<{KcCNcp&4o(0c0#$zZf-1i*P*-LVq@Godr}I;N91W`cWQRl_7T+JfeQbNZO}2h<{0DpftwUlxM|*zG zgzSlX{=W>ddh^y4mWSjdp-)BJLXfP*rxHHJ>7(#`7w`Y^>Y?_#9-Izp+kKiw{QDqH zEq*;%4%UO>n+K}=PZ%6c?{F8M02OZpsCb_ZvhlRPuHwHmDAr?cTFOOwJdI!TzA7jA zZ-P(dm{+gf%_m^(78t90RpO8f#3H>1G z+6$ZFjK2(y0ylt|^2hH0rSFZP^tlF9elBwKdWX}&BcT_As?Q?q9*4X9DE)(=9}j&$ zQ2Kqmb5uXs;2aJ8cc9W;4~h>P$4EZ3&!F`9Iw(C(2TueK1Pj1CP6;BwR|a(}Ne*q^Ah)H#9EX7M(`Uwt`Tdyy*k#&i3Ri@aVtubo;62mQ8UWQ}(2RdzI(b zUPb|({q;llSdZso&rRPR@|^6sf8*)%eUCoYqmS|EZ+P@cUb=I=w5EAw@>S1WGYePkH)l5|}@8(Fcd_RbE`4eTB@uGPk;Ls%UFXY5}%gm&czHYw4sZBcaCg`99p0GpNp*>Lzr@rOFA$` zm{&P_Zke&{syCm+jZH;{sBhk(4VnpaS(Md*GZxEmle6&{PhdONFQ}%WuDY=u)0$8d zt4PG^K&C|5U(&bvZ9PjK9j9u73CSkti0LE&I+pxRKGQIR!Y#zyf zV@)&WfhNeagj9mY5>oA^rKTE-i6vMVW*aPq#x*7W`VVJ4gsWZ!G&$UKB5+{q6R#KH!m?YUnybG5%vWC}Eu@$p+Ut%dWOM|Ti zNXCCkGo|F%El0-uBa(Axj${fkFlI4EW1ec(YQqq$)7bD}Lg`wEYX`P%wKe$#87(}| zEF@#$wzO_(CP8EWl<_M6yq;H?^C^9ksd>)o$){OkH=|~jxvAfSID-?iu&BP#+8bdy z)7U1hO@obQ3aT^4)jWa8j+-ZN-5m@zwfd#TzRj9@T9WG*P0hu2RhlYSKi@ZqChgs@1ezxE;Hd20aiGwr@9|EAeJu`|zx|5E-M!MkIZFnwK;b2MvN;(;1~mq~kTK(C^yVEWv^l|PE{V~P_u_3{1;`B3xV`PCd@Qfrd`J~bI@!DKO#+V>@>c*vAcD9 zB6Ve{)MgLFRL4ZQtWm=($=DAW|0gPUt{<_0JwJ@pIRB5bX-eChV|8=5rpV7EM-%zdSj6YkM5^;m+7t7#xv9>_<+8=T zT*dxl>@C=Zb636#r2EjVZ)xgb!!tnJy4aY3XkXLONclg>#fHI+XrT`r`$-Y)rbr>} zsf4BtWA-|?_gjQ_9Q1Fo{9EQ1=F7u}a>3XuoTe&n)CY;zLWYedU_>fu@?s}})q2%x z)4x#Qy6y$TnO8qb@xBisS)n;-`*EDP;H$+$nmVr%@#iVEi$$B3K&`n+K88TvRpk57 zw(ocf@fa22kEARl{H@R*b zOT*W@n&y~BftuUe3)Ec3ZXmC~@tr`;8NCOu<__KhHFt0sD0%hFb@=kCp-Zn*Ksujz zSyuS5_=lQ)%clPX%$h6x6-Y-GzZ+zlFx~?ypErP-V_Xf=ZN@u6%@HnRZbN;y@^J>V zMt+)OEC&_u1dzW$Z^0lvp5qY{==l(|_4q#{Z(O&@|2=*x-_fA*g*)U&A2T<-71aBE zg1jwq?m779I(HH73C?{Fh&P-Y*oa4dU9a*B+_!sfrIbwk{7|gp3QEqYn(T4W@$Ym)o6G)&h+AhFI|zLyczG=mo^(I@)Bvr zwT!CEN-EumvER5h`U)Bu2wQ=XF=nWkjM(j1H>0A-MPS{Y^_CDA^#{TKyB7pXDf>;r zEC(@ayCoIDE0j;O?@StM>y-&9ff@si|Bb4d;Xd`wxOKccz}*Z-zu>sFp?;wqunuHr z{dvZ#4|2b2yeXtF`NHGX8W&&PPBESBao`sjuPVOgz4~mwrP$`8I|;8HjaTnOhN4f= zAk(|dAkg_GPeZ-2WKtu)6+8ewBH#3j|Euw;#=XJ4jEL~E`Yb;Wc#EvV~CF>r>EWwth(mMSUxG=5UUk})u6@y2*F@579 zo-$#1x2}~jL*4^h#IsyHNIzf5*7#$Mt%UmqFa0ii|0cFjXnKULg`)&1b4xLLn7Pl z2_cuQmkQR1LpIXkH-5kTG(s&+Hc&3BMh0>jotX30$>%qTXN<^Kt8*X!I)__ZE)0UT zjRJa%;Y?@iN~BgzwyqHzFKt~Tu{m=FKcyPe6ic8PY8@q)s)6JVm75HX0@+#?p?PJc z1v0*GZJKK6)^$w-p<;>Bt)2BdWk|X;@=)u!FbxxcdgDR_%ox>62Qe$GAz7 za@G0j_O*ucG3UP+Tiw{1G|>X8B%#t64wDtUt0(xs8vhMWb^gYRW9WUCCwLQ~sm|Ye zl;@yG+LK^1S39%@qfuicssmqX{{*@m=hI@=6eeL*tPGlL^fSzHuOxr!ioUb{*xq z?RA=s_A3xQA9}Y(AB1Yi1cTi)*G^nxTI#BVsQNsA&fOaSTAin%R^{nJ*9}JB}Kcy<=e+|@FSKmc6)_oGx*z^%lW7r=uMqK3dlmRB+ z&3d{#|2Oe#ysUgEd=>tcp8xCkFZTS}k3nP6;B3|TgfH>J^?glaP&GB_PeTjSznerp zYOC5a;s4=YQ9nf!a^kV!P3j^jl4oBdA)^i8rTrrjM3wS1b z?pn{S=TX2j-*aE!$*lL>mwG%mdGz}|x3-1n&s@8E?mv2QU+~Qb_Di(N-8)KGmL9X*7tgVss=l_6F0Q;z3T$a%XuorQKjB z(*4n^7iEBPt(_qsAixZGRXDZnOPi^-TC*C`FHt+kOWl9b`PRurM;v7axOSZ&ODz|< znO1~x{cp#w2|87cUxojh@#~7b%zW$Zbo__vruhQ%t%`pwadJrCzvwo?Ye(bPeB#pg z#jYoP{~BognoDPK3`}b=+F^(80mrWrqu&@`SeAPWou{6z*;jNvjk&Z`XERw0h9_@o z)F->zgBWQtI8j#{j&txEk?CKGiw(lt6Uk0xj)6i0ql{#WBst^6Z^L7ca_Sa$<_M?g zc*fUffozpiS8U?BX!IFYke;QuPcVY!*qd*mN_vV2WacZeIxBrP^g!BY6p`tinxGL|l2 zm^&Rzq#nIpYOxo3>Xsh4^yj>biJlUg zZw-|Q&g06Aua(^~8WNM`1C1K1f5+`$MzDGhAhUNP;URS>G@4^Yz;Y_)2I*uXoFas%uS|C$(7XxjoSAgHlJok6u>Sr0>;0M&0ozpz6RCls z)XmEnE2=q}H!%ua=UJL}#FbZ)NUCciV?t9_q_Ky>xC`2*bMN{Yhtnu7O!w)aM>>?Y zQKU9ScloQLxHtJ{aZ}Xa;oW<4Uq!O3nOxDRS!SC`y`Z#QJ^oN}hg<516dr-1 zGB%YuLBI4Jv%t zd~_PA>N7<`nT|J-BkgrR2{y%CM;lc!4}+qns+Ikz&UF%_#mb#eS=Yo==L^4S z>v|v2oSj6J)4IvfIg*J6eP7F@XM@dIOjB*}n7+fj^0MLkDEa|5ydW~3GWXIDLUc~f z2@Hh$Ms6>oXn7j-IF@o&eHN&^!7-q@!R&dKw%g)%N%WnS>}=*e#*BYeJMO034_XkX zo3(Y^lw13>zMD6OC_mCGl}ak<$2moDXf?Hx<66yBXlgZ6vgf-y-ydn(i{_Jch3$3J~H>Ho+Xsmhi1`T+u`JSMCX3cnav}yFc(W72&spz{Is`Pb2oxVD-E-33$;my)l&z$t}O4b`L zZByTubo+by4pKy4-*?5}^iA6pbLiXWQD3lB^wpfK^mRg=zJIkznDYG*yjl9{VQ0^? z4E1f%vbKc{b&0m7L_8qg!{)7Qj4^whl|Mb(js;UT5t3RNda7 zjsB`*ZacY}mgUV%$<@|fP+wCQTi9OT(1vYp%@VdY!zRN_*3`tXAFXe!J0|9A?~G-y z{IjsUpAily4IMrxNMDu8@{#H)wIU!c5&8K)6!&U+t_O`+z$@r ztBmy@=eU@y&8q4#IW#84%SouQDOTUeCV=&|i3_S*>P@MdJppx`4JCEVF)FPvsG+Ip zy!PgV<_qg;BP`TX-C^gs{MYaRVG=z$)hm-CYzM`y|19lG@Rn3q=R@gC~|13gwidjr4LF>>7| z|BLtoJ>>r_Kk4x(^gs{M?{jo!5kfsgzmA{u(7Hok?p)|RisQ$C(qkOqfgW%0aGvF@_-jqZl7sVnKN^KgC)U2<=P9>^8F6MrCA{#M7gIE#<< zi4i`X%Wx3#{>dBGk>Km#1n^;pH#zJARX*oCJlo-Pa1!)AcZ>C0;`CSgx%k^W|9@Fm z*yQ;)!=v=x0>^>RfGW>l!nerd>w>OwSPnfXhnb9g&xfvZsDmDqgXr_{FL3eYKM8+O zF7i*#@@w6rG7wEB{-$mhT1VKHsBRd_RFt zdanVQtBqd^js`CW_Xo9Ky7Vsw#WxO=-d_Qw_YmaGcI9Hym5$I~0Hr4z+JxnHEVKvk z2YSkX7ydv$`PbktcJk!EK8ycKXon!T1(bdZKop&`YyK@C_UJ>KGb6hgSAfv zXY`Q&Z~XRxPv=^Q|8>G2qc7Bbr|{>q_&N8&tPlQ$i+3A%0P!vc_1&`xe$B}T@pb-% z^qdX-NS8m!-It&0d3Wd|+|KMei@T|AxMItst+WR%ahS^pX2 zQ}MNCRC+!J{XnOu=&ShY`|NUXAF!VAuLR+Y0IQ(uJMq!b_weXrpff&>j{x@u--lQI z&?dff5A*n5g#IPykGb$)5T4_OUkzR5(+NFjZ-+wT8*|UcF8}gln;Dju{0sQ0{AYp6 z*Kt|=vc;6#tvhGR{b!8B{)Rs&clrOw?@;)j1SRJI!vE&dRk+rnO3p=|9PBY;=X!GF zKZl>!3p z@h|o0k9qD^?mG+gJV_zFja%Th>RxKFQOBZivI^8o?RS}Zif+QKg z8k!b^2K$slGi$%X;|I*SmcdT@A$#-%G$JW@qqMJ|#yZ3-V=JpDpHWd(wQxCaeyrZJ zKDQLsdZdSo4MTK!>_CeAYa5AD_5oAuM2(u7QSVYRD|LjFj!kTpP4eQOFZd;ZNa%x$X+)Q8e zMeT6L7fqgQ4ROr6$LiL`@&6}wIA7wyE;}3{k4N*P%Qe^MS@$@KXQblOWyjX=Q2euE zM(uE#8fk68RaI3wwQ_3UI&C-;DX`RyFN^flQ*mNA)?~ z$vt^s{%w|T|N6``6254CzKZ#Zm)~us*S|h*H8DSLdO>~G`{`|~KCkA+&%Qs4OvD}5 z=Nua~tj|xePx12S?&nlTLVVQcs{@AH`c(fD+@JS4z8%%4v5i6QWdreVE5Drsw%MNgx8JLc zgfH5DPj~6M{BAS7{_S`FFO*);etWT1*!)<==5syBXGal4l+XJ*mZ#-(-Z-benaBxn$>>M|gW=wN6vd3?YG=2{g<`i>NS4?n)Lr}gJxr4b^z{(jmk+3l? zY^4)(t}1-(9y=_dre#H@^80>g=H8uM^|j}Hf1l6qkKcQLSgvcX zx#pT{j`!R%*Ub1U(M!h3CUOx*_)Z#jl}7rDc~6O%E1`KQp(>dMVe~@t7AvEuJ_>F9Q%Q7YW-qoK+v4E&Ql<^#BX$VIdd>HO&#b?m)9bnoWK;sh7 z?~3LI&Ih0MrcX6K^6;Et)LQZIySg4a8FESdM)5lZhnyd1&}ihPPP}7_58ae|3UW~a z#6$hw{|jj~(xrk4xkma88fE3GxC|QOdsT~{bf)zU(0Kl`kshXRYXDyt(2Tr$2sj@r zetQ)k^N!)!i~{p+G-PAACZ3-7zds<2bCe9!Z1J!>D+A(Z-c@TfrX>dd^t}5%KyCr} zX=7ldi*jcv89@D>Fnr(gAunau;2-PYCP3!puaM2~#xpTM4*iV$He~QJBfTD<4$yCy zmLAHbjC9brZf3}c1g^`lz+czn2Drz8N6))kHMvZSJwV3g@W=e1wh@m`oCiT*+yzP8 zI46#{b|b9h9+hr7>s~}bQ8y|IT)%UXCR$=14+rMJ91GLoB_=rsD-Tl3!%k>Zeo09w zW;)fhymT4XU+Ne(amb`RaZXZ9;$SwvL)maVk2tx{ke_4HPumdphI;2>z0;%eBn+CH zVTWaIAqBu@OkEzT?h2ijPs=Zv037vWqSEq?S7Nwyl6w>JaEnql))O0H&(lYi$I8o5 z$G*Z3W!w5Az)bkphniM(VIjeefd1HnF$jm z^Se9fdsMxR0PRo2!F2!B#z*&n_7Q$e_j?+B2Wac@W4iyY(P7JD;ztY9ou|?71dX;n zj2HLKuQKe$dVJq+|cvg2JD1KJh%F~2VcU3I=Io6rfjhr34c(R~O%=J$ctzVNi!e-S_C_dh^4 z!p{fo3Al~$bWg>P>COh-=qGq*=0N9s_#3qQ`&+OY&8;YrwOTZrYABzc1Iq z2ZMG5VVK|Fwe*GOIm!p%Hp0_QTN|eP@1S!7FXb)+?SA|+L5IzPm!1b2*Zn7fK1`#h zf_6QAOm}yU9s$}Z=*o0^TKMFA4%$}ym~Px>v??Bv;#s){G&g=scO~dWik=7B{cuYs z$^~xN(TH>p)56Dqb_IS+_r+THCIoD+g{S)feoXgACetd8qw%cVfq!f9%LM&tjlK*t z2Y!=4zh9%z0xcWAEYL@3^icPKY^3?uJDHYhjGrK6k`%3TA9^~Mm|=P-O3Aj8j6 zZq_C8=P37RK%DgvlCIqGfaH%;?mh~30c5x^s>hYIJn+;qkocn&=6wrEGTf;ePy+*7CM<)F_}_(3$VOogul&bv3r z&+!UvlqjbLbi7*xUW@Tmn!;;<;~gUSIi9;g(ThNzt?*;OS&u1)@pMyoByiSO#>IDs zVeb|O`YPlr`D+0mPY%>Kv`yTXHf~N@Z5z4`j?QXupGl6qo9Obi*W*sI^Jlq>m z$%uyqn@npIeh_*2H{$T;nB@sY=Qt@#;VcvOEev}M<;J@M$j`9`-z%hZf)V$F2s|Bm zFkj(T;A4s7$9MEhMdy2ck;>;VluK)cTao9#Dx3>oUqd$KuRuHi0tYa?tMFrh9TZO{ z;GGKJ1GrM*wTQD$;p`K6HWFoW?6+0nw9)=f;p>2(R(fV4UC9dP*n{sthAoHwpD6qo z@O4V(bfl%f!ZVQ;rl0)rNQ+7FA4EK`-;{K~MukU$ZvcKGy?{juXTSHd!c7Rvw2_DJ zfrUzEj#p{ND|CbYzbgC~aGSzcAT5)X4tt;@^M(Ai(6K?`k>DxD4`lIJG(1|vUqcv! z=ctA^Yxq75pQwfX5|WLuJ%Jc_D-BQ6@SYm~Mh$;h!-r{jp@y%~bhu5^fwtd9yy|`* zgn})x##5u=xD&|Bf0afzW$+>c%mL^#1_AC2@6ky(8fh8>@Wi2<04{ZkkYItYFp$!O z(sEE|5l;Vjm8p?10~2DrMr^tqaek$bM>x+;gS15yZ1jY=L7>?C5KZl%qbqp$$V5nb+VBaWbr1M4n1vj>#6X%eesBBee!iJyfZ&k z#c=5Q7&M`);gDsfhw!TBWzlu?&M7e#!=cAw&_pbT!yAj2;ElygIae%x+2Q5X%g{^I z%FK_Z@=l-sqUxGk*Ipxw1ZZw=8g!aB89Gr<39bE9<$y(|U+vI6eDwodUZKKNFi@Ib zo(K*-KLkO`3$L5`aQ1}X*(9%ye~DS>eHN!m!P#_gTIgj=GzuM*!!P!8GI(P&Lde|G z1p3+(iGEXdoZik!qj}rCM$_A+Mi$K?(4AF^0|L*kv<91A#dMlqxhs$J*~>;pp8KAV zSi@Wv=hl@J7s2FN9k?vs_~$;iZXE{)R{73PH3kZb-vFy&6uKLJgcyE_ABI)p`78Fa zRTvX8Ji`=SF6Ry4D3=m2=Wv00LKwaun7MCOe=wBuJ{j`TBhBq^bGr#LJP1$2PKKM` zRqPG)@)Nnx*>@|Dex{)SY0w`Gle`aQN8nds6?c-FMt7HEdPMKFxxEB9e;7hD>%|$* z0Ox$lt-kS?&LGbgN%N4#v*t2gPc4CZu2xtVPK~Oq+-a%cXFJyCb9hBCixwx_VJLBkOZD;2FHX?ic-<4&lmi0^g! zL!p-m{ZDTSr#_E?4qJtb9Qc+l6&Fd&10|}~)qY@_Ewwb*u`Nv=3S9)UI$J90H%FN* z#$>734GBOafz|;<-bXX~X6emK~5PDC3!132fSbq{m4t;P!Nqp3Ayo@>lwFL=ILUL#< zfdr>A!91f9|3 z1fd>?CyHbggCXK7y5nGT35ZT38ocE5M%jY?2=@nUQnmgA{$|l`zahO2ks_xCBB#)H zcX-?CHhA(ZD!u=lAo|ZIM1zMN*1@rfI>LU(v8pNMJS%X7ZV8nq8DaCm!(9dLU)LM=nrf$mu=nf-G5QPPn65Sb}OR+0kI z4*&+HUX>GL^h_WhI+ZbmXS5O&C3GvP0j1iTv@SLmvd7a^hBmUpTe59PugCfPvQ%+? zlInqv!VHxrZN9UnRDX3)P*13c+fs3eH7Lnu^PGZNDiA9>#^K~> zl!Trn&@9cfUlO{I5KY2P5=1?Wg%hc?L4ffpUj`i(Xj||)8=U(+_n_I4 z(1ePH2E*gDL|_px2}j7{KrD7eNLf!-k-L0o>@fyi}=RD|Lph%F%;sv zi7+5OX?J_43$Ig*VdYIDHpG?Ue(YNo#}V({8?MAtq6a~y9*2!8tP?w;@8(Mgl&=NF z9-8df8Up*!(`}0PG`4ajqQ3}H=dI~ylZxB#+~v~{0iwJb2MKSTTmxb1u+fKwFy}sd z`@vFNbI^=$9P(&U<0~s0=Um4`#r8Md5EUJ5ijIuE!E}A(jr~piBco$XQ3I~O!4wtQ zKbke_VT_r%uw=#WQQ*;l+?>QSbcm0~Z>7R{K^U>TNm)gI!e>x-g>g8!stDb5f*IYU;t2op1?xK_J znyz2|seAp4ueW>Y=;l8Le0b*2j1O+>{`io^mWYdg**?g&VAT%`o*Mkn#OAIo@9Nv@ z)lCiksvq3+_H&1Z_9%1w^R?Z-4=ow=?Scmj9!TsvGq-BnYqpy|>386orO~mEwD`L4 z*9FUa-*Vb@@yaK^95w9L;WJLX{O*Cdj?sf}-uT9$_D^L#5$>G*`i_^Q=k7T+<#1Vb z%dfxibbEaBn2qI$O?y@htQmK4ulq8;9roPz+rN76n!+&|BQkE=ed(~Q=Z?Nzp7z3H zC$9L%fz9`??p$^4@t5zrCieB0;(mIvq(P$?9=Mx;k~8T-1qFn2R>P6d$oJ==+v1_^S|%^&qsuzv+_4J3o^7!MZ809m$Uk_N1RS?|&}!!GDEDwHmgzWA{&P zUO8oE>A}Twk36di|Yjyl!m=)6mFHx|FtZ=AE!#IGhFf8z0>{SyvM zeSvid--_bdwfCmytRMbu*ut>W2T$F7ATes~clH${{vG`9l+WL&o!@q5!Gx^)?&$o@ z<`C=sog;d89hq~_j$2Av&e)d|T>W{_$$rPD9^HFckG+T9e=_Upp$C^Nxbm~>+a6f( z&tKQpfBVfdm6k`>KM)c$;f{NMtZw(yfpO-_KM&`;(dFy4SB+V7{e9`?(9YMtc-^+= ztM6J^d~sOolglD{?7jHAdmj0*Y{(H1Pc!`ld{*>0fqL#IE21`*HKKH-`=%5He-j(xpXhdVTWL=8=`wvA;~} zvh>Bjf6;wHt|Q|E+vzp8UXuU#M`OC&kh*_a>vytOZYncvx%uvI58pny=aBEa4lC?WZ2O@tKA}X(zVNnK)_2tCim-Z@GQiv;p6YxG_BA z=V|SFM_!(I)4$eV`p8dTnxhxa4jy`Yw1EPn2;b)Q`GP|%((sYO@K z`10~iFMam!_ltUEbv^RK-M3e*9N2x;)|wR~mcH`XgxaaY2j5xN^O;?5cMU(auz z@64IDX!rA@6MDbW=Hp@S-ZifIwd5--Z_nR-!<_q`>;8+U{_O{M{&440UE0?~#jknw zZz0Q4`V~$5+lf|J6n}W}kNuAwet6jS7P}mGzO#41jV(@Wnm*{I&wAf} zyY>2ESMUCQaQK4v|NG?cH#4>kSWAwEW-t|NmkC zhvjqcJLv0=jx77Kd}rppg|C-;#&+HD^^&nO{+%BA)bkB9#}58>+#`bvTb_C*^wOQZ zV~&2(*Yx=O&kDMvx)R&QKm7E(#uF(u1M*gVaOKviznm<&?T0yUg?;k!$~i|ST$;M} zk1Hxug5T}(OHSQ{t5-bcc{KTkd)C?yUKI89bxldPHg&po+B36Ot^YNychF5=-hHIi z^?9>B^J-T;IPA%jUsgK$Rqc3h*wn}$3vy1CMAskde%YEk8auTqYqi?kw_CT*t1C{u zz3KF!>vEqw^xh?ly3g8qytjQr_vpM|zrAaD_S%~!+g49q{M(GHj|@Il{m!#p?WT{O zbZ_jxW8fQ6ub1rE_V&I7U-y4*W7*7@Z@)X!ar(o5x8K>}?f>lq{`VdD|J@j<6Z!x? z_uw1tCfK`j4>GHw8N=$W3XaV?ThMMghJBcs<~=fLIp{rF|yd4+35XI1>=dZlSq= z{Q++Wya6x`kl|_HMSgCc9SC@da<>dJt*&Wr;9s@elcR64;z*c}v-=Aiw-yuMz>i{6*e^0>; zfK1nFK-krVE>raRfYi$lNWG>5Qm<@4^3z_Q`tjUML%(CKuulN=zM#`4k$S>D->WD6 z_u|(B^j&~9z%2^WzS0UeZ7byc0U-0U6p;F419k(19lXfbL_n5%Z$Rd2 zcR=PV?J2tho<_mY-3UncM}W-FcL156ZvZks{|PAa9gz81fhBPxKQWzQnu;Iu@oqro z>tF>tfzK#^@&zMaWR3X*aKeKM?pAPTh%7TFDR;br zaf*(-5^_-I1VmZ{e;?&WUJE+PM9{6u-9^C&MGsf*Fa?=5#v82MW(5HRJr?jXFwmCz zAQIApI3WAJehTN@SiHhHM>ay?oEytfIOod>70&sx2NcfvGTP)*Cg;hPD_qQ-DV%d> zZz!B|XFCg z^o+!;g6xb^aYtyWIPeiSfa1J9SlQvmfedvw=(MbYg6Y|?GRc^9Uv4q%OnJWGZAlqC zZc<)5N`EzB*(*^tEyLP-rr!pHB3qVt`H+%2C&| zh}8HjBK6jZUZH+eA(Uy*Sp|_PIh%;|D59wyp8wR2?#9^27^`@s9o>w{voCn=dhCo_Mn^dJ{Pj1n+h2T z;Jz_HhF1WP3)#`V02xfftN$C~LWaN;l%YUtUANp0Lk$OXyCp7-bo!m{S=o?4%5xIF`!)tcCR#x7lx{s-I}k$h zB22$!jMaV69J~ z%TzDghPQ@^s#TvN+K;Mlu0*qISg><=m@_5BH8{kT5srF!8TGo9QiF`N&}iZ?G=sIv z=nG{`H*Z6ETIRg~28MkHUW)V>NVuLX+PNPF zYd@ehGJW7dNTIA}v4{uN-%>G+!9RDN^t^KpzNvx_jmlDyOg&^l!sbmb$9v@^YHESG zax2tp=!6jdc0iVmwT`ACmde%e*0a4DoXB>zSWgoT%7kG|C}SKP!dyEtN5OQ zmx~&OgP2@*m_6LS=1dW(si!BY!5&&TiVne2@iM4X8FBW3IIr3ZloicG@ORwLy2dNz|AbzwdI+6ahdjX)bMba zLbaj#sNXm_j6I~ca9QMvYh_RQKFb1h7;rLUAWb8O<;~i``oGUR1MVPB4wy!YviA!`m?@ z#AK;>Nnl~X{sGJdTRC_6NAfLoR?qz^B+34r#?SSMveV{E3=TOgNEH2GeWL8N6U89G zg}xd+_OLK#VhD^BJF>vqmI2t?$~PzD z^jr;^YlgU<`ZDPqEJ_vf+tG~@YiZDFGzI$4usegfZKUG!*4+KdE^RNN&s^WD&l{v~ z_h~7UX=uBgzKOxk687kiUbp@&9I5iJ1suLiaEc zp>aMPi*ppwR>Xz~q8OUcj*dI0a@z^A?zL3V)4joFW-U7IsYNY;^qwH1_XcJo252R;RPeqdQLw&T_oUHk z4xG;8=!YHz11k!LJ^_sG%6nvjdU`Hpkgbi$hG0M=A`x{1=6yv+cMO(p@KpL(Dt_lc zN}QQ!6N9Fnu5o6(kC{+c7^+Hq1YBU)exIVSP^~tHg=Z|S#=j70?iX~NjmS4 zh5m79y5VSNHsE2XP_(=a0hHSmP)!jzi-48DhJiohd<8j$ATjO*GFQ`NuyTt@_8_|Y@&p`D_kUL=bDt>+Jm@#9VO}{rd z_tfF#zsDUC?>yb>Uyjo)OB2zI#O<`zQnBg^TWgg1TYOVD-iCx)jht?n1{xez_z=o6 z;n^V+;W*u*^b)eag)%lNVa^>lX2hzgdha=g*1lKZr%lh{OaYm`1rqR>G&qjva!i|rtWA^+xNlW1=rk1IDWX* zegpC^y75Z?{u!j|1(70ryFuVW8G{g`2TVYYzgzzXiUr7 zj!d}0ehW0|(%7BaYVlVW#3fWG#SNN|L6BvmJuco+-^zKc&cm$i1gld^RBdBtoxh^B zNJ`5=>%4jSrStQ;26Nlv6}6>dxI{bzg@?SXK(s8VP{sdpi@HNC9fy#Y9B*xBZhlp< z6Xo?=X*D^t0tvAwVS23L2TzrTFT@0N{w9Va`_Y;F1bp5jJS>~OTa2)>5yhbZpNnUf?w z;1E-|d;S&ZQ5xH^zEyW=6Ytz^d3!5Lho8Lox)_2G7-C)CYad<|5%ZH^uzM`lP59hJe%3At5w{D_dmWqS;?+&^29b`~*)L!RT&V5q<>MpVKyL52(iGc@=VYkvp|{(62~hwAab8(Wqivdkafq1o~7nORBjK2!UH8Qx_bn&E$@w$WUEs1^Lr z+%~Hhd{5W@&{FuGacn=mJ*mTKlcWBWW6SB=W-n_DX|cumX=Bjv##WB)XWYY^QC%a@ zUY);JkG|RDp4lRyVsEKAwtmi0SX9@>e*Iv7ci8}wa~}#l%&$I%cTJo>`U;bK^p(xA zTgr~b?y%gpqt|gqT}y6q=^~0p=a=uh!x$}!0vhMqVB@|+*BbUG9Ce}<(euPn6vJ_6 zJ?e-RS%rBEY5EU-b|4&)p8*-~vS2z7SSo&i6R*7xIFY}fNEbi4;o2%){HBNNANbD~ z60&hnqmmO|M@IF(K6=0nH^#&! z3`$H&P8pm!WazN8+lG%wzkTGW(PPHmG49U0vL;||B5PzXn_;(dx zFd&AYp?`##R&zcM&&r=bSP!9GyIg89t>#=G>BB*ri(e$@HvlsJPJkH6hPF}AgS9S9 zv4z&+&Rrv1GqPfRfZGw^9u?r`9^K0zXHTeUHRmfCKjqAaTbDaCzj{ALHTK zJ&b<`AoY4q(W}63vcnWI}Awu z>j0_WazMsk1Ss@Zbl7MJ|4RX>zZsDFzurpnJp{;fJ^)BL`N};;xo-w!xpz~r1t8@d z!YGH(4M=%Y02v-<7K(KDZt2UP5%A!&67@R@ygT3)z^eiIDcl~g1Q1O%bSfa4ekjk1 zyA}{@)82feoIdz5KWKA7$h$lVX#>D|-3pNT@&y_?=^rb&6Oj4LJz;$SUx5w9G2nPs zK8Jrb_>q4;Ao(6p@E$;>lb>$XCrUvZAk&R9^Va9Kpk0GsHquIcD1U~+dCnKl_98tV zeHd2QckYJY1tU&ipzUhI7i` zM?OB>8ExR)8gAf=H9QeI81&8>enjK>U6W(i=u zX>mQE;fC!3SWO!>y1s_ax`aRRu+A8GcTES{;uv(+83RYX@Zwi$^mHw3jKz>SJMvt9PItZZX({QZ+h&YGKU0Iz*TQcYAj2Cn z$n#g$#gkNcyedr}qhH1N^*>q{XL!cBn=b_IL38&$Fxn|8@w%v&|M@c1-KzN;sGelX z!@J4EF(k&Crg3-~v44cqyQWQk{-_FujC{xb$B(|IJrH{F(-|K+!IK~f^C5h_=xf@X zYxV5FcX53c7hU*;%ze3H1-hJ(8*9eoTLE8p)oxJL_nQ@{r&>@K1W@gQ`a%G8qM#lQ zpr(TAi{F9eX5X4M<^;_8nzOD?n2;8z&q=KFx~l^9;hMI)Do~&I1vOBgO`!Vg)9??F z#G1S~`XtO%X0u^?|2rbjEM4czrvCY!}qD4pK=YR ziwEIN8JIPRM~25?k}ZZ)YDiP0^T)PZ+U~L}*@C&K(u%$Id!zO`Hmh{Up;o)+ahQ#2 z7KZO*)U*&vVvSRf4b$Ywg+5VxnJ2*vvtFbH-_y5oeVVg7s9p)c>xH%q@&>dvHSEWK ze5=RdQ(m3`B;w%UgK>zsJZ%vU#so|1ApVhB%f>w@5Cp5(Y46zZI1nL;)&@LFn;-G} zuzW0)!719zHc@C>K&65cKy$w)5(QfcOa+I?g!w0EiQ>Lq$*h3eS?^ve5{CWvqA&`i zvqJYgdOqmCJ zzQjr}=F1~nJkBZ%u8RA?;r<)>+||3u&B86rrQofw98Fy=e}M$ES1}l zvdRO_uPh6n1r2jq#~cR_S}LlT?9sP0yBG8oeHCU+-R=b-#(rp7nq=!7TSfx4w=6~i zV?P9ABV9|k#QtGfTvxHHG^HAWx~17Vm&QfyoLplGs|XeRVGBY}kuz*bCdVh;Gy{&!|#bs{0P z^h5)r-Y(^r<2tOeaQA{<{OCy)IUi#4oZ&jJNMY7Myeip z0mRt-zGOZk)E3Fy4@Q~Ht+6L9i?>vKR63#>fx3-GGLw-^-yHY3(o4xq@0*0@PH!F3 zyTg8^JKTaKh=`3ffjevaU#ilJ+7g2LCC~mrDO<%VwkYG$i$qn5L;VNQS9@wOACIbN zb!-wf#opIFe>b#1W#%bNMwfY3_q-kJ!Ki?kedd2LuFJ;$2XuM-PCt$TlK4&s#Ak2l z8FctCjSu~;wVVfe29WcO6@c`=UBRx3ejM+B5YVduDQ_|$I$_1wg*I< zt2zF}vyx*zzKuAyK;5s0oAU|jfU6ar2{&bveh{!w;p`4U^3F5x`&X#ZR zAJXVBZ@(=e(f9on@JY?@xx^vqsmUWXQ+jU*ueEyso0mQ!J$d-3QE9>~9Urh-WcZ+p z%*f6!%EPBtwjCd9UZL`%%kN9w>z6&fXtp%b*OWRZaT2xzOwB0CzYmd4%bk|Za6$}i z{-ucI!tCPNMRxBd0KdHhx_qJKS<#l@lMwd$8TeSAV$W0FidDp9d=m?Y_#9R$;4szF zX+~x+`o7$=kdZ$F5W$JS2`a?Ru8#9$(4PYGH=s&#QjpX5vsxS`%R08F~&n7E)w));{xJMT6kuX<0O-Y3j z&VGDt!HjDwtBYwwQEnj`j+G88%M?2+Omh%9e|(rf{RH+u`xkbe;N3t+RH35*kzRA8 zg5*bDn9;WiXa(flEuY@_5ho9S76@P&&|9(KBS+OT@ zR{lW#pUkTW+j$SnfpEg4b9gup+O>z&r`RA>4&%klg&MaT^Aw(~LAHrOq+D`m`}FjKpO_JVArV-)SAcT^;kZiI_zsiunKa(>%L7a?Xf!hm zJ;yokP_+~}?;IR1Mx!z)K0AH-N&UlVhk@^{FxN1`029e)Is@`Sxw`?b)dXXVaW-MmVR^!o|*G+^GLakG(eOud$VeO_e( zaxjL4q>jhMmn**{-IXVhoua%j`|$*4F);nW!I-g^iFiXy)(LRhr^NxMi!$=Q@+$WPB1 z%wRM=KM z6L5_AEWeP&Jlt9JE3k?U^M%DnO~_WrW8G(e#wQZLB7yn-)%eh}uw$Tb-RD9N`yP(9 zxl>XOA5D3=v*^P8Hi)0!7h+#9U<%y)j)?~3_W?J)@cZNp!iNDK1tk3yKz`>u0?6+S zC%$h6%7lpTBi>C%`gG8vHF}n!j{%*1DIUS!33SSRAG#8*0Oa@1a6o=vVQ>8E8t6j) zllaGZD}H}{K^*X3fc$QI8Ia+Y0^)reI!F2Qdx!K`MQ7hj|2#m5GUq55uOP=Wq+1n4 z+J&3%aMD>R2zLP*@ACZ$j|BWt;YEO_6loEs?kd{e36E0;}x-% z=7bVCS82f`GU*UP=7acg&5j!iT;A>^uq6a&oao-(`oSe#%dWJ*vG2+hcTspeCq!tmxt_q=ED-w4Bf ztc-{AWbS!9>BI0DseC+8-92wR^1|?mQ9kbrpYJi^H+-&CJ{yG3Z^&T7$EPwl5UPb{J!r2up02D*whDnNYmqEe!I$o@)G6zf(EgP$DMT2rQwJ5#O zRW%T(d*Q8@`6PEkID`J6MsElDb`jL%sv3b{NRs$S=RVeYL7{v#IOlq*J~qXtLxhZf z?%VGn9enJFe=~5ABWpQy6i)X-S_~qg+!x7VB1@a&v>b$K_#6&b)dwP&dtoM^C3y#P z1sr^N`_=)?Haa~cg-~pDC_A8dto=RV%m-D6Z!q0ifk}+nEiq=P#F%XoW7bHFSs*bM zBOfk32(tsxK2-g5RrN!PjcCI~w50HHRrQvBQ&2TMO;`bAopQmaUigrwzN)+8uCKb$ ziw*Q**LX3uIvFC-i(RiUk>ib}uByvH5Dlc7>uth`YLC~T)2?*Mn{P<&(d!8E`OS5-SG#H@G;bXV0$ zyn%$ypK?>FaH5X^QPa6h#m`3FI9Us`>il6UR2Wtfrqde__pzQQo>?kPBEm48jL&lm z_?b@5KDeqb63WZY%m$x&K>?pIr06JQOCGV-U)#8Sa*f>QP=IzLdbPW;Z=nJX*XD09 zBP5O@$b%CRrgIBBV48yQlnZwpA$#ywu$bm(N+?coIlesk=CeB(Zg zKKMmufZ4VK+3K0WJ*8qN{j&&wDW^#H95YradH0eP6BE43p$p6@BHR_WC6u0o-9B=I zUl>TsC5e0f;;9F=xh8?z?6%{+n`m3};v>j=TzrsfvOj2)4(fa)Uf{eBLY5GwZDO?Y z;eKAKnFoacW%;}hZWq*Q7y(~H5~OTApOlxBlmtj=;3)y_1vZ)iL(_CbW`nl0{OO|7 z_!ra1w25>b_oi#Gp$*l8Mz-^5v`uN`m#*Ki)sq?0cpr+7`dKzs2HV9Zlxab|Ak5aZUPksNt~BdmNxoYga)_*O9qE6kVV z*(E8Uvb-8T!C=m>f0z9kcL{hH8~d{jaJV*iz-*D|&v^PHlAfgcu^6(!jqeNSkACb& z%u=g<>|%tG{Xe(2I_Pw}?!xqq)=o~U@-+G})+^65;731ZMTVmfsX&bEB7m0r&@vy& zOUD(1-G_3EgQ6Dr&^#ZS<3lrj=y)GG&WDcnq3J#}&4;Ecl>G^<)18hwR7ZF*osAWj`kSup|U9`mp(wEc-Ctw8B2DMv~Zvv0elN za{n@`Pdutw^WrOz`{={sP4-NeC<^RUL%%b3Zamgn8D#Hv87wx^m=8H!9J}P`=gLV-=t3j7iHcGSMh-}c_eavdE+8D;( z20jNDKa8~&xmJ+oK_;6fU}Yc&QZikYHq1Ms_E>Q$0di$KlE^ZMA8{L6Au1NF;~jqn zmu2D&8R^%5AYrVLzPD?VcuBEZ_5_{PvJaqm{X7znSTOuTM`S9!*Ri$fXG<7@|7_{d z#!(;a__NJ}FN@(XP6rujm2~M2gL+%L&j330^yaFDo2rlV+QRl#YjL z<3MKq@qIv;c3o88{(z~xRu(Xc{xm53C%2X&pI!5ov=;>+tV5S^rzwpB;~cd-jwc$& z!NiN&jLbv^u$}h=%mcImvZt^@n9H2JL&{ zujJP@yb1q%`89`IVnu%CwDaXx9yiGTzsRp+Ob9ZuJ@U-5q*momd!7YlWYO-!{`E_~ zZ(l%3i7Is`iZu!E+>b$U&0Q%gLA*E{WDQ9#*lLAO0zW2X3Byg4RZmne4EBMdhDCuo zAE>Bgc#8rh2TPdm=|Rv$?7N<2g9l#iNwzXaz1eZvY;U)@J4lYx@uf3WohZV4%oD~C zNFG1%R*_*AkE^)`GEs-~Fl|Oy0KnlXD`O5|I-uQEVcP~W&~ZR_NHiV3MNZLn%?#vO z*9iGr(N<>-qk=2pjNLkC1_qExuBv|^FXZ{@`#`~ca?}+4Z@sa9W%HG;`jXc zBlLS0%~ae&N&|4DGqvGKgbh%qmYnBK$?r;?T!eyJX1)YHHQ>jQ8?5i#{mlv?UwW)Q zvIR~9%YUWe<4T(({6u2QXNh=vfTOX8<8*Q9L)dE1^0HYfhsnwl2YqCf zc|jB^3UoIZ5IoY20h&bn0A+;(wI{NIy%IY^<6ET+IKNd`J%NS;W&H&j26Tl)Lx8F- zEEp(zS}>S_vbS}jgIZdLN`d%m;l>EV-rCU=U&@vHxOj51&W>+D9s`aB1SfUE4*fk8 z&|+N+B#yF7rR{++0(n2(KF2RD8pMn%7SFY+XQ41rU>K7bvywfLr5GgnbAIPJ2PaRL zU>!?9Je;=hR_WKg+-Ftkjw;Mlgz;8{dEjq2ftg5S{(%+1gP+N-|L``tIM>{)HX`@5 zuB1Zdg3M!Y$HM)?syCrLpbG#{@*mtca!JDdY_rQfk8!XDeeT@43@arIa!H63z~KlE9C1s{;BG9PsAr zORfUT`Se>${Y*an(x@NLVS;{sJ;@i}p(p9eo@BAFC+Q7FBr3*RUA$cg`wi9Rd$Jva z%hz{|7eg7N?hx>AKPdJ0j@6Tsha2{c=aC8c9w5T_n1joSjAc;$}Amtr|)hK#2c!*t^z zevoo%f=mx$@yE0x$h3ekKFIV0VS141MZ(M=QypPZkm)1B@*qs{+8g0r|ep12i5i%Qf$S;|yp)NHa3!tS74g zyK8f1TMMRV<>cm=vPuf0tkd&ztfhtG1a9l(>BZJ*Ii~FC)23w==2#1-+pYQ2iVAY4 z;lyw7=afvhau0E7ajuClH%CZM+uK?HBaf>ylGbZ?4n##Vq!wZ$WaLyqlOF~?sbe! z9yuiCPScPcplhH#A)2h0~UtMVrmXBE#j`3w}YDcedu zD>SttIm{(%9`YVrg%d{&Pf8z_q+qgw;{;3^HCDmFgo8#77cgnq$dPc589pi@eTa$Q zs{C#}I~HX->=!$f%$W&At*~6rFU+-;lol0D$L4aC3{jV!#=7i{uqnF#a?|Qq)G<6O z7ookB!c7|i!#y2*1Hd;qfIc|DouK$)0_ax-xGz_H9RuhdEDc?Scn$)_0lsmWX?3`? zFA#cJK~Dz#6xKJo0eUX=*ZTnIiJ)%+WV)6F_%DQ8PuG0#F%KJIOKc3xi>-oDqz`s_7do6(e9O&pdLmvlZx^Ds;2p9}_GvJ=irqwm*Ta0pA z12=6d40kEYlKF5u=tle_&?gRq+sFsHlflP)hzp=!5#a8u_$~^d|8j}HydyBcqr7he z=xab{`K|zD`OblVm?~fD@#)1fof`mIzPN+ePwz#bvwRBxnXc3T|3Pr;>52p20PtNO zK<@}T<(~}qm;ZWzdp+E`ycffzyww5pIRW8tF1ug2VihhwfPOdVEZ;OhmM_odWBI-T z$nu@p$ydJ2p9ydqw?3=3J@`@1D}X70kKt^r5G8Ln-nTagxIeS_ z!qfjH{8&Hc0mcH}3wRS?E+E8&4py)?U_9KHBfO#4*X>~k3i_>}pTTs`Aix6(J`PB| z9ss2L>42<1gK>72QN9eH06ObSbO0UmV19f@F)v2G?*iz%0^Hja-)jN%=ixr3+9~55 z4nEe${-7J}l=MEJGaX|?q`v(_0{r3D_3r^b>UBi`y(8#@L2qd9%Wulxh#&KL1t9a8 zb9Kz;Vg>I4WIhi?I3u4e7;O#$o%wtnAoVjV_;Nd$&r1NA&sBiT=ZQG8%g~eI$AL~g zhXv4i;wJgOYU|I>Q=7^EUH~0ueXXX#cvezwT7Z9w3U_k=y)WpDCn$i<4GxUw7o6Fp z>-#<2MtL!ws$f}OI3dM^P~3<2-hdTzlREUMF1V=2dp-$@}*v%;z#{oY3AneWqh8V- z3AZthp}Pm%#(R(ME^r(5i|&qa8|kLo483efPm|f7eiUw_K9J9YAItrV0Qy^S8~Vq# z#F>I{8~W4z9NdQfbUzKZp+DV^z-{PHw+n7Vf4b+wZRk(;Ot=mG>An|wQUBZkI?rcj zdBP6gTQ1}u0Jl+|boT=v%dqT zNrf8=`n_7X^nh@K;MU74PKApEeYO_v+JJCf;MU9a5)}^9(W~cb;miTyerxGpzm6fV zx+7n{1>LEI`wDJ7U-rPQ*PC4`+}of(q=j1-5bk;KT@Cs3Kz~f*dk}7;J+Qncz-{z% zbl(BDUaxKkjr9u4lzw#BHT&t=0d7Ms&0%=9AKMwW5&6-Z;BHd-knd;wV!-!3=(L1n zJtF-e+=d=>?^k^9Gd#YH489!!d^mE}PyQ-|y9V+f2aE=+QEu)z>;ZQ<;0=IwgfrsD zE0+7#z46mc8&dL(r+gJZ>DcS;jgM|jocp$an|A&fKcE3v4Xo5WI9NHQ^5@izM$Z01(z$hL_wrO zgez0fu3&+JISP(faI}JHfJnYMRlzs~k!OP5N5L=!%?bjD_%PfNkaX&u1jsu|dEcnm z>!5JvB~AIbM~L}-G5QtaEEBFe5NEmZ>`meFifWDV%*X z-f4o){+;hR^6(w;0CA*+?+>2YL4Eknd05do|F}lsoQK@3aL#S+RygN2zfw5oG7l@9 zbD9wCJ*#3kWYf*(M<52yGdT>LCNKv6f<`~6;p|Tg9-iM};Mp2}3F0v5BQ<=GhU@2C zY}Dx48veM3chm544d0{TKWjMp2Coi9nr^)`9DS3Q=R*yjtKsSlS4hKxla@bEXgDqD z5JWuH8opVRbDc)#nfV5PxrU$7_<4nu!Bel{Yc!k|s|L?+T3Bp18$Ni*@Z=0myc&C> zyhO2mO)+pUT7Hh#i%z+LO!LPar5^+582t!2x!Axp9lP^OvD+(uI(NIt=!JAl?4H|a zGIpPpfEE|y zzDQ%vR`>~7avL7GWwONOnF?3i{UAo(xG7{vxuu2vq5Zb+C1Ez1-lhyO*x~}S2&iqN!79x+QC$#wp37%3)_@b`~elae#%lnqjJ6kWjZ&Ez6#s!)=<1E^D6D$)KUu z$@t|kJPJRw5FpG=TTB>85GAjyED2P3vPz0$`<;wUna@iof1mrrJ ztwxbMYYl&KeC%xQBR%&ytFhzQp9<;t@nQP;W8B^F>yF=l`uO$&>3cspI(5%`2>M}3 zURauatoBNBEa#qAr}-FrKUs^gCllplgfaGh@*B@R?~LYCrKHsgpS~F18DWgQpWGVb zo|l5y44;uI3~T7Q_kI@3FsPPBm@8G7al&UTDz4#URz9}~pKDPfhL5rL(*_^UmsobU zgvFaJ9p>$V{+@rqjf)bUi&{cw-fy)ih)8^hb6z_jo)_T{3)uLcFo2!c0~9)}bX=(% z5p-Ol9AR`^BpqZ;4F*Aoqz7}%J#R8PK3TO4Ae}gFZrxL^d)REwYy^Prji?L&{Mv~#&iyqhL`?y~c_7i&)+yUs| zeyfJJ6=kDA*(z;C`*>In@1DDP9ftjUuszhV0GTWln$J+e>2^IN<1vgTb|cg4lWcN( z=*w`p9JDZ~taZC?Meqx35A7!eGftYa#ItB!Z1hF~E%X;#jQE-Da*)&Q>Y;HQ;WkMe zdSa>gRO7f*<9Lr8u!v&}uV_5&G@fTAkBvMFHJ;zKOm#>eE3CQ;4NZ6}oS|zr{c*RE zJ>Br#qxmMo7a^ma>z6Rz&6|)CSorpIx>iWc=5(!=nAPce0T?G+Obzb{ZM-FMhFdw$ zT@wEWKem1PN^S4?c|Qg(OKm!&1Im3;tH3W+Hw@Qnxc^dQI`~ZW4yq+FCPHFNh{UMA z#F!*LQAcoL*-q!$HE=r}%lLnXV_P3#HEGzw^V}p+`6jx=j!h$Ox%bo9!-;*J^!GvEE`pwKZ?vrc@;u~;bKhQv<#ax{Iuie*n%z$= z#{wemAvN@MC7!}bq@}@w8?Tk;(qJpMRoqqBymT1?qY72-M$r1iQI99x6u zo@T#a_73)J7P_hyK&oh4eW0OJINb{$!uK?)lhL+#B?3!nG9)w%MPM!1uVP~)rJNP) zQWcDaD=x`xUb;dk<`?gV^9$&u1msb`Ui{PIec=4Tx~gEg4EBTw#@u8_H5j2#uy@o~ z8TngZ#mwSUU-g0)TY~gR8qFdkw%Us^6_U0_VPc~|V}hpNm)yL0?(FQV^ecf3R(k5` zd6AnpYaQN`hD^Tq>pAz@uEKN%dx@72*i|*hqDpbHh?Y)oy);VkHWh6SLU6CGH%$NY zhv8;Smi!ckfhn3d%o*;v6wb5a8KS}@A`Fwq_&o1}-?!KH8KJz~Yr6qH^;M+s;U0}u zLbl}b-)rkQ+y|z4>@)`Aej8rI8fSAh;5e^T&!Z5D`&?`7 zDK2b#04d$eW42)d(O{F1GBhh{%=I=+V@`#8R&a-= zmg~Ud$q#4)Gy__lsPwbI*YE&FY4!1^&@GD%XO!vjS6s+U1Fz_&8qyFz+K%%M#ScW? zo8W%3E7(x~g;MwU3lQ1Z9s)c;_!nDwEd~^&QJ3)FvBC-dS$Aq0UEu(&GxDFI|WlJzIPu-QP z;Ky8bSN@F{wiZ0X5wRTaRWh6}#-MY@$P2O%b8s=Z8#dw}nso#YmTP{5Lux7MpueOy zxtmhz?%PhVQ^_d-FXYK%FdhbHTS6px@9VbofU& z%oiaol8wybdMs7qRk8I(sm%gnTSnjm9Oa)vwqm={q40gAI|<=#-J!tr`~c z3!=&Sb$w+I=&i~?RG5Ym)NoFr$g;8Ql@@hBU{80KSK9tbS1aKvc%^0A({yCN4~MO{HYBH1&CC(7>_gvQPM8G;S&P?%n)L?~~Us zp7DF1#K||w+|5N80`Rd^yoUeCt#Qb_(XM-~*e74=nr#!KzxOYdvw%^<#L-4Ju0Xxpk9JRQ+tkm3t- z=lR2QQDF)Yh7D~hRqX|SmPMSXA1Krqss#SnqlC2f6ni7zZ}oofw;1<&5vzJxp6mT~HKpPGCZ*}}V(fOUCqLFW4XvPg@i>vt z($M@z_iZZ)E#1y@_d!z^4X@TY+!9|LS=$AY2i~Y+-z1 zp67X5lOPcULwSPicN$yL8fhlD}qcP6Rry~eMzVu z4!t>N$S;g+Kz_i%&Q|QRZ~=0Nw+4`PZ4=-u3OEo#a8F9C~#EoDSFx zun6!vzPveK`e%2GPHzT`XdP%O@3Q!_8Ltq02 zPBt&h70YTR*8D;%t|T*YO~QJ<4I5a+$SUAQ3%Mo3gh_WLQm4pic!R=)2Z3{!$FzJL zS&8i(SVv$aMbith6Qsm6ZF-J1cUF-#yI8V9HG`yL(sp`GpK2=3#kxWvBpB)&kzr|R zQeigsd`!y9p6ZSDFYgUWNXA73+}}Y&ZR;R9IC*qN;)vnHlM_b|88KY=iVYt0yY2rl z_a^XFRoCD51w)KT3|eZ@qFyj)RMdb-K~aG)3IYNuDjE>NpbQZbMN1XTfbnvH*0~Oa z7OmPk4|Nul5}Yc|wvJV6Zv+)>tJo?$-`^h2-S?1)ectzZp8x$2*09&wd+p)uv(MRU zuQO_3`JnNm4b$Oli;Xk1+0B%YcB;H!MY%QtCV!tJ9|&%D+(X%wsWZ!>+MBY*R#Xib zSw__dQ1y9+rTFeKsbTcS4AX~3!h{Fa=L<|t=1dthzp{)o8d)lV35os{mC1oaeS~;J zjqM+jR4*i3I{K0LBiBD`tTrj&LHMT}0~`SC?dYBH3-^9W*K<9;i+}e&?KQqq^y|Dz zklr8Qe`2o%!~c0quEEJw0Q(`|KPG=PwDu7A8T})XI~KWaG5)^L-j7Y?zs$QF<##83 zHO3zcU+q@n%Fm1CvlTz|u>399s`5XJ@&5{6 z`TPpL_s3Md>Ks1-EJN?;-LmceCl;HB$LO7T8>fEw0Dp1sZzj37c`8)<$lu)CBmUj+ zWzQ`!{x#6vuT66LCbaKw(Pz8-2FLXJx%~9a=&+mvWBGl9A9|SnC6D>CA*KmJ8O0qyM< zeLv4;hhhKiF@6f#x2xoIUctA!=!?-)f1DTNkBjMzjHM5CddJ21d>cKQFO>feV)+!t z_z?otK;cr_la7Q$9M6pzBHJ5kmgM&`~{F zbAB2+8eh<>p#8i&0s5EF(fER14(-!cU_sDF?zh4$^E@(xB${eypK4!>%#QzdVq8IVSf!a)%?w z`GHl}1#-MKjmD??cOi7x{})1s{Z)mG`th6?zZ^QWOP(9ukvkTs^O!vy-3?d@T?{-9 z*bzN{J#wo}>=EQETE4rIOThQnqxfIrH}9`+(Zr+Ap_`z+-Aey}o1^T;7bSjUR?S`G~^XBmT$LQWM`f&6PLGNJr^11T%?gxJWe4Sh91=P6(xmNgeIaK@v z{wAidiQG#){~eG%@Lz&Inz_~U*Mjth{~&z%zkB{|AVI{&Ozhr8pqeQbF0I3ojoj^Jamn3aJc4! z_l5JPx#FJ=*Zi_G^Qq)DN40mj?#qhjB);w;hd5mK*S-$dy=R2ObzeHu;kw6GIb8Se z%N(wI`$~_K=l#N|dp~S`(&4Ll_Ib_8=$Y$7$JcY+mk!r6UmNT)?FQb#;d<9t>~Ou; z^UO9 zHMe@(Rt5Mo0j}%V%k&D`?XUokJnxO4wO)65SN#94XBh^@&Nd7j8fE?6hZnx{%)|fQ z$%epRT<;X}uM=l;NKgYbU2d{*_$gbpCM(+(rcXIIbSGy*TA#gzmvrK3X*`qpbg ze&&@r)Njjd_!@ zc8KAOvZe5vcIa@ODarBsx7^U{-*Q5q|12l+__xL3<4;;SZvWQnztWH=m^Z_C;s=!8 z6FWxq7TM9kOJ>K3y@__**eh$tjlbMBjX0^2R^o+sdDWz|h-GAWQ3uI%4cY8|07nzd zF@=gL<)*iI3yuqa6;&HBV;bib66GgMI;SEahw%2?q>MEm^UY~$*N+?s@y(x8KFrzN z(A)BB@w>Wxnm-@Vr!@QBP__j)G%+*$%v7`A)$PsPl}OroZG)fOV1>UG+>>Sx%Y zwtSJc41c~)#8ZA+?{&c7euAuLdZNTKB|2-Mbhjon-|adOx}{%x@(Jtd<+8qz;aP+C z5lt_iiJkZ?7@v$+a!v=F5Ty9C2KIEodGxi{@n;R}>3}aB z$?Fyi!|}hh%y5qXla-SZOfMr4PsAS{@z=c9k(@|MoBw5hV_va3HgkYV!INfR2NkKX z#+(jl=Qw$uV_bo9yIe^P_))KFX85$2-D z*sL)>PBYZK3T|5Y0CH?FWIDYUOv?AZj+G3B#(~B5G(!bMs_w5wEuEeP+`(yv=XC<0 zPG#0P|DAOD6kC8fu5r84&1r^JSd}u8>2&`E)0rWi9)ZrIE$dty=+NTU<8BG^wpskhx)4sIX(;keG}fuQ`gLEO+V$uqrkAUC zU9?t1z{X-8hC<|X!?3m__{zY!5 zv(D*ElMeNabRKV6M+ee%ot2@ZdaAt4QslF~>e|2a{Z&OuW4$=~;cl5Z%j9ikvcBrx z_vpX#1-IW7INg0$V9_Hh^vZ-^)%kdnme8X~xub8ElN>N3*eL8BVe5pwA`I7a;p@S% zdoFZw%Efu^mv{7#f}*9rAX8nTQ~+nFPMI5wXi@D`+^({s8!t@NT!RT_uDVb;8#0}G zi=|mGzVy(qHk?7OP5Q7-pjOthTE?kqXf^3W!gbqZOi`_Z0m#!bX-wq)ptA-VK6>*T zm{(BuWl?Q=@kSJPJG#GDXjhzh-YMucMUDb9(7WP|C@z+QnWj>-kFGa;XG*2WKe_0X z)kOylES{+UM(e+R`mdB)>MfXRTj}6@L05)y8AC4Vp*yendcQSI`=n3gTDh=Ehk4hmci8~C$oWMwq>V=ri0e(#K+v# zcier0l#jO-n0myZrZNwE2^7cI>&Uf$8Ea zb38!Y?S`QL0L|GnojgFJVf$3eI-j`lHx(T^)E+&%T;Ba(>hfuj=H?przuy6%+oB&Z@j@Zwf7*Re2frdDX`06)oiF8k-@J}qPD)2}kUDcZFtbkIk>Y-( z@B5h>)^@(t-{~7VjoXt|P7Gq@8~-h2eK^{!0^(_&J|d=f7x(AU=(Y6g63FAq+5E3x zeu5aBWR#y6D>yMfF-fp8KQT*iVSZwPp!?~T_9Sax&9g58HQwd(q}${spqgqIhJPSw2s`<&O)kL}mw{NA4 z@8fqnbGG1%8F*UGtvI)uS61G+GAE37|8f0CjBwGg9qt__ZHje}w77SDbb_Hbt2Oz83G7-O?uj+PVpJz7pnu8+0{eaBWa)|v0x^a5&M zj`*mn*4y#1@-oJBJ7~ST;AiN3i{t-|YfgGvJM(&?@Nyup84BkCIlWmp1E~58!hg%#wTWx*IA~uV z(S4AUU8OPp?lHYxW9e<2-oJLq&F}Bf*SLBp|7TcL?nC~+26hH62lfSCYvKoIj z;;-iLFNME9`7DU>XTw*29}nNxU-=A#_VpKiEOM&9{Fg%ho-w`lvGlf1uT_lyew*C# z*KUOALBm(?Z><9s^?GkpB3cyG`D1YnWFqepNyRBKOx4)pDC)hKR;lGr_Cl*`OFOqwMKlKao+H&~BS2g|~#CnU$xsw~q zr9pn8FLC9Z7vopLSG$aW@B3BqgQ0ypi|&V<+T|xPe#e;J9srC{RY~%ujm_~uL#mFC!YhzM}9^xyLne~i=cf!h(6cJ zRlwgI$d$+BMmah88RZA%92t{49Jvz8Z3n+oAeRU2uS1o~{&`M2yagS$!)wT>9q=d0 z;je)X?dJ({mEJx3b|HS;s!JWM1I@MkDeiWa^0DiYmEzBK{IlTq4fyyFMCD2DWG8n# z{C0udz?fVg=&)S&U!(depA!D|$Bs@h{uU;wgW+!m_5yz7Xgww$1pOMYH;~sAk^S5v z602kMA4I!)D_t>7q<0g1UqA7G6_dNx$)(}@`bn-H+Sf<)f*377p|Cu?f>eJ^i}Bfa zUzM@zUgM9%JMbJ@d)&q7$$#jA>qf_~-NGX6=dNmiW~@YMu|An*Ns zR8Ok6LqDGlPHw$}s~x<{!CM?$;ovn6s-DVUZ#Zb`|KI$4jwQeIXixdps68%mxY}%~ z!_}_W3a4PTz4zBq|2*LM>cc-eT>bo#aONhBg%5?3uJQXHhij}WUFGUJ=$$Ih zawM;3$4(B{GbF6Y|Au+S(6AE!B0*{T{XM{s3S<nu% zy4HN2Z328{fa?{lm$^E?M+7)?LnNc4PhNgffS(xP{R8~%0DmgLD+Bzu0p2;l(*a%@ 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%0D-h<*RtZ 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Ŏ^Vv%SxOxvJR)HXtc#QAUZ1ztoV@RLT1$7Ew@ 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

      aNQGI$^2DSh2Xa508~}YKyK1**~-26 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 z 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%0A^L``_q+mtb7gR)k+NLi^YQjRw~PsCCcf_ zLS>#ZSDB+U%CIs`$+MOv{mMhi{mQ*c-WQ60X}gp>N1gf|%5BOm%0A^Lpa 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 GI{z<-KN$l6 literal 0 HcmV?d00001

    8g@B6QKH}7f-GHPUm_|0VaQ4K6>JcY6loo{-paO3S!W~Uc^aW(i&7&p_$QHe7r)w;Ne z^K8*=PQd{{cPggf)t^Z7e%*1kUI%AL^>L>h-Eay=+c>&5W!l8)E~n-+pNBxsamIvk zQ|gP|Vh!U?I;G(hq-k0_W#POb5k5=>&w-#l*^2!xeHpfcC#(7#RM0m7B2{; z>hrW>p#<4&TB*g&MX~P5vG7cy9q;oma-}Y9;iapdd~s+00=teRT}YPN8N%t~W=@#d zaLUXXQ#c!FY_>+@Av|%|GH31uuGn(xbYlZKxuCJZrHPI)g>tz(ic0trRR`(^HK?J{ zUJE<-(uFJ~I;?wEZ0pb+55s#gx5n6s$D)LDwbYJf74WW%`()~|Sat2W>?|mSJ?Rl0 ziQF2~lQiF> z3mawCVzIYlG7Lq0QFCJyi5|&|kfHQ;V%c4*=U5p+E!C$#e_B(0RJ9$;^XE@n7B37= zIs&T0bLLMPC$4I{R9TeSIUKkuHg#{Od=TXWu6|mv@NwPnR59ipPX} zmc-fw^nKi2M)J>eIkqqg)O_{GAgi1-=H7@w^MDkQyAdd}#`57OTK$+>f9fwhkCaDC z%#;JzT{ew{)J5!NXm`Afjhs&QgTx+Kq7g-Y9aQ-TMEVF;s_9mBO!a@X|+vTrQl$XiGKG9+zYGcdyC3O@e;gnBy;gu?f6mCk;Z;OqE-d$j7 zCz8B=meUVAP&}ngHCCH3(H2lSSY#RoPJ2Mw*^1tChPji=&cm5T&8wUa$ZYQ3F4~>7 zdPE7F8{5;B8=K3K=JD5&iu{cK9!L_!?*lR|kAIQ5obsCQR^{8Z{K&@m)j(ntUka3e z&DG?;7AXI$cPKyOOhqVG-1!M)iV@eCU3VNj4HR3M^;Poo#@NMyd9T2%G8)me1?KYt z^RU1?Juru3dDn_s^VBepL-ZQ2ENPg>c9An%<1XY}>vaqLhT#h~8vGhH$F7aH&cm@( z^H_Lg((tZL6Gvz2bt#+Lbk|sZ`u1hy$l~{GT0X(K-)1FZ(xqidl%Sx(?*uY#1#W^W zx%#PX()UT)m!p_u%fH%}$C#(yEsw?R%YVIZZ6yAi@v@fi)h;Y$60he zco<6f;U|94C$rk9r{RADa0GMS@kBIiqh!`kNu?Tg5Wi3Rp%a>yAD*#Wt93jnVIk{FP5V6e^rb=Im1fvgh9jHyVk zEzOKcc8<}_DY1Lyo%g<_e`@!!S({lNiL~Q3M4G5J$RDZs1sv28snzKmpp5ODl!P7I7C?6|7Tq^g3F zd%2Vb=dHH;!=yshQb7}Yq^ZR@?LxgNnVl%L5K}fBXI61C>j*KXr5_4R>jtr+Go6Fc zP^iwHUBN4gvDP8^0U{n(Vwx|P5ifF_`qnR&e-m9FIL^zP29PCi>WrFA>B|SlQg*un zm+F@*m|sGe-Cnx%(u0ju9#CAoL#jhMT)QWEG6GdaNhkg^+MLvV z!kJ^IGdR>007_#L{l4d_-P7+FE#XVF^h`+y^V;pWqB^cDjzf zmys*u@$N2`wM;HoOWgGirOW5SH%0Aq;B>NHI&J0Hb>_sSwF|XGq1l;Tsr;_m-i24$ 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 z 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�W?H+&F<^LXrlKaH_S>ZOG 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