From fba676c405d1054cf01e738830555079c1d89354 Mon Sep 17 00:00:00 2001 From: Diego Waxemberg Date: Thu, 16 Oct 2014 21:19:36 -0400 Subject: [PATCH] added openss --- build-openssl.sh | 124 + libs/openssl/include/openssl/aes.h | 147 + libs/openssl/include/openssl/asn1.h | 1404 +++++++ libs/openssl/include/openssl/asn1_mac.h | 578 +++ libs/openssl/include/openssl/asn1t.h | 960 +++++ libs/openssl/include/openssl/bio.h | 847 ++++ libs/openssl/include/openssl/blowfish.h | 129 + libs/openssl/include/openssl/bn.h | 902 +++++ libs/openssl/include/openssl/buffer.h | 119 + libs/openssl/include/openssl/camellia.h | 130 + libs/openssl/include/openssl/cast.h | 107 + libs/openssl/include/openssl/cmac.h | 82 + libs/openssl/include/openssl/cms.h | 501 +++ libs/openssl/include/openssl/comp.h | 80 + libs/openssl/include/openssl/conf.h | 263 ++ libs/openssl/include/openssl/conf_api.h | 89 + libs/openssl/include/openssl/crypto.h | 611 +++ libs/openssl/include/openssl/des.h | 248 ++ libs/openssl/include/openssl/des_old.h | 446 +++ libs/openssl/include/openssl/dh.h | 280 ++ libs/openssl/include/openssl/dsa.h | 327 ++ libs/openssl/include/openssl/dso.h | 409 ++ libs/openssl/include/openssl/dtls1.h | 287 ++ libs/openssl/include/openssl/e_os2.h | 315 ++ libs/openssl/include/openssl/ebcdic.h | 19 + libs/openssl/include/openssl/ec.h | 1167 ++++++ libs/openssl/include/openssl/ecdh.h | 125 + libs/openssl/include/openssl/ecdsa.h | 260 ++ libs/openssl/include/openssl/engine.h | 842 ++++ libs/openssl/include/openssl/err.h | 386 ++ libs/openssl/include/openssl/evp.h | 1409 +++++++ libs/openssl/include/openssl/hmac.h | 110 + libs/openssl/include/openssl/idea.h | 103 + libs/openssl/include/openssl/krb5_asn.h | 256 ++ libs/openssl/include/openssl/kssl.h | 192 + libs/openssl/include/openssl/lhash.h | 241 ++ libs/openssl/include/openssl/md4.h | 120 + libs/openssl/include/openssl/md5.h | 120 + libs/openssl/include/openssl/mdc2.h | 98 + libs/openssl/include/openssl/modes.h | 135 + libs/openssl/include/openssl/obj_mac.h | 4032 ++++++++++++++++++++ libs/openssl/include/openssl/objects.h | 1138 ++++++ libs/openssl/include/openssl/ocsp.h | 623 +++ libs/openssl/include/openssl/opensslconf.h | 232 ++ libs/openssl/include/openssl/opensslv.h | 89 + libs/openssl/include/openssl/ossl_typ.h | 202 + libs/openssl/include/openssl/pem.h | 641 ++++ libs/openssl/include/openssl/pem2.h | 70 + libs/openssl/include/openssl/pkcs12.h | 331 ++ libs/openssl/include/openssl/pkcs7.h | 500 +++ libs/openssl/include/openssl/pqueue.h | 94 + libs/openssl/include/openssl/rand.h | 150 + libs/openssl/include/openssl/rc2.h | 103 + libs/openssl/include/openssl/rc4.h | 90 + libs/openssl/include/openssl/ripemd.h | 107 + libs/openssl/include/openssl/rsa.h | 582 +++ libs/openssl/include/openssl/safestack.h | 2663 +++++++++++++ libs/openssl/include/openssl/seed.h | 139 + libs/openssl/include/openssl/sha.h | 214 ++ libs/openssl/include/openssl/srp.h | 172 + libs/openssl/include/openssl/srtp.h | 145 + libs/openssl/include/openssl/ssl.h | 2590 +++++++++++++ libs/openssl/include/openssl/ssl2.h | 272 ++ libs/openssl/include/openssl/ssl23.h | 83 + libs/openssl/include/openssl/ssl3.h | 694 ++++ libs/openssl/include/openssl/stack.h | 108 + libs/openssl/include/openssl/symhacks.h | 481 +++ libs/openssl/include/openssl/tls1.h | 741 ++++ libs/openssl/include/openssl/ts.h | 858 +++++ libs/openssl/include/openssl/txt_db.h | 112 + libs/openssl/include/openssl/ui.h | 383 ++ libs/openssl/include/openssl/ui_compat.h | 83 + libs/openssl/include/openssl/whrlpool.h | 41 + libs/openssl/include/openssl/x509.h | 1297 +++++++ libs/openssl/include/openssl/x509_vfy.h | 567 +++ libs/openssl/include/openssl/x509v3.h | 1007 +++++ libs/openssl/lib/libcrypto.a | Bin 0 -> 13630532 bytes libs/openssl/lib/libssl.a | Bin 0 -> 2442116 bytes 78 files changed, 36602 insertions(+) create mode 100755 build-openssl.sh create mode 100644 libs/openssl/include/openssl/aes.h create mode 100644 libs/openssl/include/openssl/asn1.h create mode 100644 libs/openssl/include/openssl/asn1_mac.h create mode 100644 libs/openssl/include/openssl/asn1t.h create mode 100644 libs/openssl/include/openssl/bio.h create mode 100644 libs/openssl/include/openssl/blowfish.h create mode 100644 libs/openssl/include/openssl/bn.h create mode 100644 libs/openssl/include/openssl/buffer.h create mode 100644 libs/openssl/include/openssl/camellia.h create mode 100644 libs/openssl/include/openssl/cast.h create mode 100644 libs/openssl/include/openssl/cmac.h create mode 100644 libs/openssl/include/openssl/cms.h create mode 100644 libs/openssl/include/openssl/comp.h create mode 100644 libs/openssl/include/openssl/conf.h create mode 100644 libs/openssl/include/openssl/conf_api.h create mode 100644 libs/openssl/include/openssl/crypto.h create mode 100644 libs/openssl/include/openssl/des.h create mode 100644 libs/openssl/include/openssl/des_old.h create mode 100644 libs/openssl/include/openssl/dh.h create mode 100644 libs/openssl/include/openssl/dsa.h create mode 100644 libs/openssl/include/openssl/dso.h create mode 100644 libs/openssl/include/openssl/dtls1.h create mode 100644 libs/openssl/include/openssl/e_os2.h create mode 100644 libs/openssl/include/openssl/ebcdic.h create mode 100644 libs/openssl/include/openssl/ec.h create mode 100644 libs/openssl/include/openssl/ecdh.h create mode 100644 libs/openssl/include/openssl/ecdsa.h create mode 100644 libs/openssl/include/openssl/engine.h create mode 100644 libs/openssl/include/openssl/err.h create mode 100644 libs/openssl/include/openssl/evp.h create mode 100644 libs/openssl/include/openssl/hmac.h create mode 100644 libs/openssl/include/openssl/idea.h create mode 100644 libs/openssl/include/openssl/krb5_asn.h create mode 100644 libs/openssl/include/openssl/kssl.h create mode 100644 libs/openssl/include/openssl/lhash.h create mode 100644 libs/openssl/include/openssl/md4.h create mode 100644 libs/openssl/include/openssl/md5.h create mode 100644 libs/openssl/include/openssl/mdc2.h create mode 100644 libs/openssl/include/openssl/modes.h create mode 100644 libs/openssl/include/openssl/obj_mac.h create mode 100644 libs/openssl/include/openssl/objects.h create mode 100644 libs/openssl/include/openssl/ocsp.h create mode 100644 libs/openssl/include/openssl/opensslconf.h create mode 100644 libs/openssl/include/openssl/opensslv.h create mode 100644 libs/openssl/include/openssl/ossl_typ.h create mode 100644 libs/openssl/include/openssl/pem.h create mode 100644 libs/openssl/include/openssl/pem2.h create mode 100644 libs/openssl/include/openssl/pkcs12.h create mode 100644 libs/openssl/include/openssl/pkcs7.h create mode 100644 libs/openssl/include/openssl/pqueue.h create mode 100644 libs/openssl/include/openssl/rand.h create mode 100644 libs/openssl/include/openssl/rc2.h create mode 100644 libs/openssl/include/openssl/rc4.h create mode 100644 libs/openssl/include/openssl/ripemd.h create mode 100644 libs/openssl/include/openssl/rsa.h create mode 100644 libs/openssl/include/openssl/safestack.h create mode 100644 libs/openssl/include/openssl/seed.h create mode 100644 libs/openssl/include/openssl/sha.h create mode 100644 libs/openssl/include/openssl/srp.h create mode 100644 libs/openssl/include/openssl/srtp.h create mode 100644 libs/openssl/include/openssl/ssl.h create mode 100644 libs/openssl/include/openssl/ssl2.h create mode 100644 libs/openssl/include/openssl/ssl23.h create mode 100644 libs/openssl/include/openssl/ssl3.h create mode 100644 libs/openssl/include/openssl/stack.h create mode 100644 libs/openssl/include/openssl/symhacks.h create mode 100644 libs/openssl/include/openssl/tls1.h create mode 100644 libs/openssl/include/openssl/ts.h create mode 100644 libs/openssl/include/openssl/txt_db.h create mode 100644 libs/openssl/include/openssl/ui.h create mode 100644 libs/openssl/include/openssl/ui_compat.h create mode 100644 libs/openssl/include/openssl/whrlpool.h create mode 100644 libs/openssl/include/openssl/x509.h create mode 100644 libs/openssl/include/openssl/x509_vfy.h create mode 100644 libs/openssl/include/openssl/x509v3.h create mode 100644 libs/openssl/lib/libcrypto.a create mode 100644 libs/openssl/lib/libssl.a diff --git a/build-openssl.sh b/build-openssl.sh new file mode 100755 index 0000000..8aafd96 --- /dev/null +++ b/build-openssl.sh @@ -0,0 +1,124 @@ +#!/bin/bash + +# Yay shell scripting! This script builds a static version of +# OpenSSL ${OPENSSL_VERSION} for iOS 7.0 that contains code for +# armv6, armv7, arm7s and i386. + +#set -x + +# Setup paths to stuff we need + +OPENSSL_VERSION="1.0.1h" + +DEVELOPER="/Applications/Xcode.app/Contents/Developer" + +SDK_VERSION="7.1" +MIN_VERSION="7.1" + +IPHONEOS_PLATFORM="${DEVELOPER}/Platforms/iPhoneOS.platform" +IPHONEOS_SDK="${IPHONEOS_PLATFORM}/Developer/SDKs/iPhoneOS.sdk" +IPHONEOS_GCC="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang" + +IPHONESIMULATOR_PLATFORM="${DEVELOPER}/Platforms/iPhoneSimulator.platform" +IPHONESIMULATOR_SDK="${IPHONESIMULATOR_PLATFORM}/Developer/SDKs/iPhoneSimulator.sdk" +IPHONESIMULATOR_GCC="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang" + +# Make sure things actually exist + +if [ ! -d "$IPHONEOS_PLATFORM" ]; then + echo "Cannot find $IPHONEOS_PLATFORM" + exit 1 +fi + +if [ ! -d "$IPHONEOS_SDK" ]; then + echo "Cannot find $IPHONEOS_SDK" + exit 1 +fi + +if [ ! -x "$IPHONEOS_GCC" ]; then + echo "Cannot find $IPHONEOS_GCC" + exit 1 +fi + +if [ ! -d "$IPHONESIMULATOR_PLATFORM" ]; then + echo "Cannot find $IPHONESIMULATOR_PLATFORM" + exit 1 +fi + +if [ ! -d "$IPHONESIMULATOR_SDK" ]; then + echo "Cannot find $IPHONESIMULATOR_SDK" + exit 1 +fi + +if [ ! -x "$IPHONESIMULATOR_GCC" ]; then + echo "Cannot find $IPHONESIMULATOR_GCC" + exit 1 +fi + +# Clean up whatever was left from our previous build + +rm -rf include lib +rm -rf /tmp/openssl-${OPENSSL_VERSION}-* +rm -rf /tmp/openssl-${OPENSSL_VERSION}-*.*-log + +build() +{ + TARGET=$1 + ARCH=$2 + GCC=$3 + SDK=$4 + EXTRA=$5 + rm -rf "openssl-${OPENSSL_VERSION}" + tar xfz "openssl-${OPENSSL_VERSION}.tar.gz" + pushd . + cd "openssl-${OPENSSL_VERSION}" + ./Configure ${TARGET} --openssldir="/tmp/openssl-${OPENSSL_VERSION}-${ARCH}" ${EXTRA} &> "/tmp/openssl-${OPENSSL_VERSION}-${ARCH}.log" + perl -i -pe 's|static volatile sig_atomic_t intr_signal|static volatile int intr_signal|' crypto/ui/ui_openssl.c + perl -i -pe "s|^CC= gcc|CC= ${GCC} -arch ${ARCH} -miphoneos-version-min=${MIN_VERSION}|g" Makefile + perl -i -pe "s|^CFLAG= (.*)|CFLAG= -isysroot ${SDK} \$1|g" Makefile + make &> "/tmp/openssl-${OPENSSL_VERSION}-${ARCH}.build-log" + make install &> "/tmp/openssl-${OPENSSL_VERSION}-${ARCH}.install-log" + popd + rm -rf "openssl-${OPENSSL_VERSION}" +} + +mkdir openssl +cd openssl +if [ ! -e ${OPENSSL_VERSION}.tar.gz ]; then +echo "Downloading ${OPENSSL_VERSION}.tar.gz" +curl -O http://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz +else +echo "Using ${OPENSSL_VERSION}.tar.gz" +fi + + +build "BSD-generic32" "armv7" "${IPHONEOS_GCC}" "${IPHONEOS_SDK}" "" +build "BSD-generic32" "armv7s" "${IPHONEOS_GCC}" "${IPHONEOS_SDK}" "" +build "BSD-generic64" "arm64" "${IPHONEOS_GCC}" "${IPHONEOS_SDK}" "" +build "BSD-generic32" "i386" "${IPHONESIMULATOR_GCC}" "${IPHONESIMULATOR_SDK}" "" +build "BSD-generic64" "x86_64" "${IPHONESIMULATOR_GCC}" "${IPHONESIMULATOR_SDK}" "-DOPENSSL_NO_ASM" + +# + +mkdir include +cp -r /tmp/openssl-${OPENSSL_VERSION}-i386/include/openssl include/ + +mkdir lib +lipo \ + "/tmp/openssl-${OPENSSL_VERSION}-armv7/lib/libcrypto.a" \ + "/tmp/openssl-${OPENSSL_VERSION}-armv7s/lib/libcrypto.a" \ + "/tmp/openssl-${OPENSSL_VERSION}-arm64/lib/libcrypto.a" \ + "/tmp/openssl-${OPENSSL_VERSION}-i386/lib/libcrypto.a" \ + "/tmp/openssl-${OPENSSL_VERSION}-x86_64/lib/libcrypto.a" \ + -create -output lib/libcrypto.a +lipo \ + "/tmp/openssl-${OPENSSL_VERSION}-armv7/lib/libssl.a" \ + "/tmp/openssl-${OPENSSL_VERSION}-armv7s/lib/libssl.a" \ + "/tmp/openssl-${OPENSSL_VERSION}-arm64/lib/libssl.a" \ + "/tmp/openssl-${OPENSSL_VERSION}-i386/lib/libssl.a" \ + "/tmp/openssl-${OPENSSL_VERSION}-x86_64/lib/libssl.a" \ + -create -output lib/libssl.a + +rm -rf "/tmp/openssl-${OPENSSL_VERSION}-*" +rm -rf "/tmp/openssl-${OPENSSL_VERSION}-*.*-log" + diff --git a/libs/openssl/include/openssl/aes.h b/libs/openssl/include/openssl/aes.h new file mode 100644 index 0000000..031abf0 --- /dev/null +++ b/libs/openssl/include/openssl/aes.h @@ -0,0 +1,147 @@ +/* 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/libs/openssl/include/openssl/asn1.h b/libs/openssl/include/openssl/asn1.h new file mode 100644 index 0000000..220a0c8 --- /dev/null +++ b/libs/openssl/include/openssl/asn1.h @@ -0,0 +1,1404 @@ +/* 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 */ +typedef 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 */ + } ASN1_OBJECT; + +#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(ASN1_TYPE *a, 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(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(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); + +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_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_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/libs/openssl/include/openssl/asn1_mac.h b/libs/openssl/include/openssl/asn1_mac.h new file mode 100644 index 0000000..87bd0e9 --- /dev/null +++ b/libs/openssl/include/openssl/asn1_mac.h @@ -0,0 +1,578 @@ +/* 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/libs/openssl/include/openssl/asn1t.h b/libs/openssl/include/openssl/asn1t.h new file mode 100644 index 0000000..d230e4b --- /dev/null +++ b/libs/openssl/include/openssl/asn1t.h @@ -0,0 +1,960 @@ +/* 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/libs/openssl/include/openssl/bio.h b/libs/openssl/include/openssl/bio.h new file mode 100644 index 0000000..05699ab --- /dev/null +++ b/libs/openssl/include/openssl/bio.h @@ -0,0 +1,847 @@ +/* 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 */ + +#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) + +/* 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 +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(char *host_port); +BIO *BIO_new_accept(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/libs/openssl/include/openssl/blowfish.h b/libs/openssl/include/openssl/blowfish.h new file mode 100644 index 0000000..4b6c892 --- /dev/null +++ b/libs/openssl/include/openssl/blowfish.h @@ -0,0 +1,129 @@ +/* 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/libs/openssl/include/openssl/bn.h b/libs/openssl/include/openssl/bn.h new file mode 100644 index 0000000..21a1a3f --- /dev/null +++ b/libs/openssl/include/openssl/bn.h @@ -0,0 +1,902 @@ +/* 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 + +/* 2011-02-22 SMS. + * In various places, a size_t variable or a type cast to size_t was + * used to perform integer-only operations on pointers. This failed on + * VMS with 64-bit pointers (CC /POINTER_SIZE = 64) because size_t is + * still only 32 bits. What's needed in these cases is an integer type + * with the same size as a pointer, which size_t is not certain to be. + * The only fix here is VMS-specific. + */ +#if defined(OPENSSL_SYS_VMS) +# if __INITIAL_POINTER_SIZE == 64 +# define PTR_SIZE_INT long long +# else /* __INITIAL_POINTER_SIZE == 64 */ +# define PTR_SIZE_INT int +# endif /* __INITIAL_POINTER_SIZE == 64 [else] */ +#else /* defined(OPENSSL_SYS_VMS) */ +# define PTR_SIZE_INT size_t +#endif /* defined(OPENSSL_SYS_VMS) [else] */ + +#define BN_DEFAULT_BITS 1280 + +#define BN_FLG_MALLOCED 0x01 +#define BN_FLG_STATIC_DATA 0x02 +#define BN_FLG_CONSTTIME 0x04 /* 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. + */ + +#ifndef OPENSSL_NO_DEPRECATED +#define BN_FLG_EXP_CONSTTIME BN_FLG_CONSTTIME /* deprecated name for the flag */ + /* 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. + */ + +int BN_GF2m_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b); /*r = a + b*/ +#define BN_GF2m_sub(r, a, b) BN_GF2m_add(r, a, b) +int BN_GF2m_mod(BIGNUM *r, const BIGNUM *a, const BIGNUM *p); /*r=a mod p*/ +int BN_GF2m_mod_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + const BIGNUM *p, BN_CTX *ctx); /* r = (a * b) mod p */ +int BN_GF2m_mod_sqr(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, + BN_CTX *ctx); /* r = (a * a) mod p */ +int BN_GF2m_mod_inv(BIGNUM *r, const BIGNUM *b, const BIGNUM *p, + BN_CTX *ctx); /* r = (1 / 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 = (a ^ b) mod p */ +int BN_GF2m_mod_sqrt(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, + BN_CTX *ctx); /* r = sqrt(a) mod p */ +int BN_GF2m_mod_solve_quad(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, + BN_CTX *ctx); /* r^2 + r = a mod p */ +#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. + */ +int BN_GF2m_mod_arr(BIGNUM *r, const BIGNUM *a, const int p[]); + /* r = a mod p */ +int BN_GF2m_mod_mul_arr(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + const int p[], BN_CTX *ctx); /* r = (a * b) mod p */ +int BN_GF2m_mod_sqr_arr(BIGNUM *r, const BIGNUM *a, const int p[], + BN_CTX *ctx); /* r = (a * a) mod p */ +int BN_GF2m_mod_inv_arr(BIGNUM *r, const BIGNUM *b, const int p[], + BN_CTX *ctx); /* r = (1 / 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 = (a ^ b) mod p */ +int BN_GF2m_mod_sqrt_arr(BIGNUM *r, const BIGNUM *a, + const int p[], BN_CTX *ctx); /* r = sqrt(a) mod p */ +int BN_GF2m_mod_solve_quad_arr(BIGNUM *r, const BIGNUM *a, + const int p[], BN_CTX *ctx); /* r^2 + r = a mod p */ +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); \ + } 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/libs/openssl/include/openssl/buffer.h b/libs/openssl/include/openssl/buffer.h new file mode 100644 index 0000000..f8da32b --- /dev/null +++ b/libs/openssl/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); +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/libs/openssl/include/openssl/camellia.h b/libs/openssl/include/openssl/camellia.h new file mode 100644 index 0000000..67911e0 --- /dev/null +++ b/libs/openssl/include/openssl/camellia.h @@ -0,0 +1,130 @@ +/* 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/libs/openssl/include/openssl/cast.h b/libs/openssl/include/openssl/cast.h new file mode 100644 index 0000000..203922e --- /dev/null +++ b/libs/openssl/include/openssl/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/libs/openssl/include/openssl/cmac.h b/libs/openssl/include/openssl/cmac.h new file mode 100644 index 0000000..712e92d --- /dev/null +++ b/libs/openssl/include/openssl/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/libs/openssl/include/openssl/cms.h b/libs/openssl/include/openssl/cms.h new file mode 100644 index 0000000..36994fa --- /dev/null +++ b/libs/openssl/include/openssl/cms.h @@ -0,0 +1,501 @@ +/* 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; + +DECLARE_STACK_OF(CMS_SignerInfo) +DECLARE_STACK_OF(GENERAL_NAMES) +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_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 + +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); +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_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); +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); +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 + +/* 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_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_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_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_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/libs/openssl/include/openssl/comp.h b/libs/openssl/include/openssl/comp.h new file mode 100644 index 0000000..4b405c7 --- /dev/null +++ b/libs/openssl/include/openssl/comp.h @@ -0,0 +1,80 @@ + +#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/libs/openssl/include/openssl/conf.h b/libs/openssl/include/openssl/conf.h new file mode 100644 index 0000000..c219997 --- /dev/null +++ b/libs/openssl/include/openssl/conf.h @@ -0,0 +1,263 @@ +/* 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/libs/openssl/include/openssl/conf_api.h b/libs/openssl/include/openssl/conf_api.h new file mode 100644 index 0000000..87a954a --- /dev/null +++ b/libs/openssl/include/openssl/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/libs/openssl/include/openssl/crypto.h b/libs/openssl/include/openssl/crypto.h new file mode 100644 index 0000000..f92fc51 --- /dev/null +++ b/libs/openssl/include/openssl/crypto.h @@ -0,0 +1,611 @@ +/* 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; + int dummy; /* gcc is screwing up this data structure :-( */ + }; +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/libs/openssl/include/openssl/des.h b/libs/openssl/include/openssl/des.h new file mode 100644 index 0000000..1eaedcb --- /dev/null +++ b/libs/openssl/include/openssl/des.h @@ -0,0 +1,248 @@ +/* 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/libs/openssl/include/openssl/des_old.h b/libs/openssl/include/openssl/des_old.h new file mode 100644 index 0000000..2b2c372 --- /dev/null +++ b/libs/openssl/include/openssl/des_old.h @@ -0,0 +1,446 @@ +/* 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/libs/openssl/include/openssl/dh.h b/libs/openssl/include/openssl/dh.h new file mode 100644 index 0000000..ea59e61 --- /dev/null +++ b/libs/openssl/include/openssl/dh.h @@ -0,0 +1,280 @@ +/* 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 +#define DH_FLAG_NO_EXP_CONSTTIME 0x02 /* 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. + */ + +/* 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); + 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); /* Can be null */ + + 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 + +/* 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); +DH * d2i_DHparams(DH **a,const unsigned char **pp, long length); +int i2d_DHparams(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 + +#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_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_CTRL_DH_PARAMGEN_PRIME_LEN (EVP_PKEY_ALG_CTRL + 1) +#define EVP_PKEY_CTRL_DH_PARAMGEN_GENERATOR (EVP_PKEY_ALG_CTRL + 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_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_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 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/libs/openssl/include/openssl/dsa.h b/libs/openssl/include/openssl/dsa.h new file mode 100644 index 0000000..a6f6d0b --- /dev/null +++ b/libs/openssl/include/openssl/dsa.h @@ -0,0 +1,327 @@ +/* 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 +#define DSA_FLAG_NO_EXP_CONSTTIME 0x02 /* 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. + */ + +/* 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); + int (*bn_mod_exp)(DSA *dsa, BIGNUM *r, BIGNUM *a, const BIGNUM *p, + const BIGNUM *m, BN_CTX *ctx, + BN_MONT_CTX *m_ctx); /* Can be null */ + 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_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_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 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/libs/openssl/include/openssl/dso.h b/libs/openssl/include/openssl/dso.h new file mode 100644 index 0000000..839f2e0 --- /dev/null +++ b/libs/openssl/include/openssl/dso.h @@ -0,0 +1,409 @@ +/* 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/libs/openssl/include/openssl/dtls1.h b/libs/openssl/include/openssl/dtls1.h new file mode 100644 index 0000000..e65d501 --- /dev/null +++ b/libs/openssl/include/openssl/dtls1.h @@ -0,0 +1,287 @@ +/* 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_BAD_VER 0x0100 + +#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 + +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 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; + 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/libs/openssl/include/openssl/e_os2.h b/libs/openssl/include/openssl/e_os2.h new file mode 100644 index 0000000..d22c036 --- /dev/null +++ b/libs/openssl/include/openssl/e_os2.h @@ -0,0 +1,315 @@ +/* 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(__CYGWIN32__) || defined(OPENSSL_SYSNAME_CYGWIN32) +# 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/libs/openssl/include/openssl/ebcdic.h b/libs/openssl/include/openssl/ebcdic.h new file mode 100644 index 0000000..6d65afc --- /dev/null +++ b/libs/openssl/include/openssl/ebcdic.h @@ -0,0 +1,19 @@ +/* crypto/ebcdic.h */ + +#ifndef HEADER_EBCDIC_H +#define HEADER_EBCDIC_H + +#include + +/* 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); + +#endif diff --git a/libs/openssl/include/openssl/ec.h b/libs/openssl/include/openssl/ec.h new file mode 100644 index 0000000..dfe8710 --- /dev/null +++ b/libs/openssl/include/openssl/ec.h @@ -0,0 +1,1167 @@ +/* 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); + +/** 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); + + +/********************************************************************/ +/* 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 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_CTRL_EC_PARAMGEN_CURVE_NID, nid, NULL) + + +#define EVP_PKEY_CTRL_EC_PARAMGEN_CURVE_NID (EVP_PKEY_ALG_CTRL + 1) + +/* 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_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_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_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_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_PKPARAMETERS2GROUP_FAILURE 127 +#define EC_R_POINT_AT_INFINITY 106 +#define EC_R_POINT_IS_NOT_ON_CURVE 107 +#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/libs/openssl/include/openssl/ecdh.h b/libs/openssl/include/openssl/ecdh.h new file mode 100644 index 0000000..8887102 --- /dev/null +++ b/libs/openssl/include/openssl/ecdh.h @@ -0,0 +1,125 @@ +/* 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 + +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); + + +/* 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/libs/openssl/include/openssl/ecdsa.h b/libs/openssl/include/openssl/ecdsa.h new file mode 100644 index 0000000..7fb5254 --- /dev/null +++ b/libs/openssl/include/openssl/ecdsa.h @@ -0,0 +1,260 @@ +/* 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); + + +/* 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_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/libs/openssl/include/openssl/engine.h b/libs/openssl/include/openssl/engine.h new file mode 100644 index 0000000..f8be497 --- /dev/null +++ b/libs/openssl/include/openssl/engine.h @@ -0,0 +1,842 @@ +/* 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(). */ +/* #define ENGINE_FLAGS_MALLOCED 0x0001 */ /* Not used */ + +/* 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_rsax(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/libs/openssl/include/openssl/err.h b/libs/openssl/include/openssl/err.h new file mode 100644 index 0000000..974cc9c --- /dev/null +++ b/libs/openssl/include/openssl/err.h @@ -0,0 +1,386 @@ +/* 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/libs/openssl/include/openssl/evp.h b/libs/openssl/include/openssl/evp.h new file mode 100644 index 0000000..faeb3c2 --- /dev/null +++ b/libs/openssl/include/openssl/evp.h @@ -0,0 +1,1409 @@ +/* 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_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); + +#define EVP_MD_FLAG_ONESHOT 0x0001 /* digest can only handle a single + * block */ + +#define EVP_MD_FLAG_PKEY_DIGEST 0x0002 /* digest is a "clone" digest used + * which is a copy of an existing + * one for a specific public key type. + * EVP_dss1() etc */ + +/* 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 + +#define EVP_MD_FLAG_FIPS 0x0400 /* Note if suitable for use in FIPS mode */ + +/* 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; + int key_len; /* Default value for variable length ciphers */ + int iv_len; + unsigned long flags; /* Various flags */ + int (*init)(EVP_CIPHER_CTX *ctx, const unsigned char *key, + const unsigned char *iv, int enc); /* init key */ + int (*do_cipher)(EVP_CIPHER_CTX *ctx, unsigned char *out, + const unsigned char *in, size_t inl);/* encrypt/decrypt data */ + int (*cleanup)(EVP_CIPHER_CTX *); /* cleanup ctx */ + int ctx_size; /* how big ctx->cipher_data needs to be */ + int (*set_asn1_parameters)(EVP_CIPHER_CTX *, ASN1_TYPE *); /* Populate a ASN1_TYPE with parameters */ + int (*get_asn1_parameters)(EVP_CIPHER_CTX *, ASN1_TYPE *); /* Get parameters from a ASN1_TYPE */ + int (*ctrl)(EVP_CIPHER_CTX *, int type, int arg, void *ptr); /* Miscellaneous operations */ + void *app_data; /* Application 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_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 + +/* 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 + +/* 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 + { + int num; /* number saved in a partial encode/decode */ + int length; /* 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 */ + unsigned char enc_data[80]; /* data to encode */ + int line_num; /* number read on current line */ + 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, + 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); +/* 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_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_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); +#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 +#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 + +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_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_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_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_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_WRONG_FINAL_BLOCK_LENGTH 109 +#define EVP_R_WRONG_PUBLIC_KEY_TYPE 110 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/libs/openssl/include/openssl/hmac.h b/libs/openssl/include/openssl/hmac.h new file mode 100644 index 0000000..1be0022 --- /dev/null +++ b/libs/openssl/include/openssl/hmac.h @@ -0,0 +1,110 @@ +/* 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); + +#define HMAC_cleanup(ctx) HMAC_CTX_cleanup(ctx) /* deprecated */ + +int HMAC_Init(HMAC_CTX *ctx, const void *key, int len, + const EVP_MD *md); /* deprecated */ +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/libs/openssl/include/openssl/idea.h b/libs/openssl/include/openssl/idea.h new file mode 100644 index 0000000..e9a1e7f --- /dev/null +++ b/libs/openssl/include/openssl/idea.h @@ -0,0 +1,103 @@ +/* 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/libs/openssl/include/openssl/krb5_asn.h b/libs/openssl/include/openssl/krb5_asn.h new file mode 100644 index 0000000..41725d0 --- /dev/null +++ b/libs/openssl/include/openssl/krb5_asn.h @@ -0,0 +1,256 @@ +/* 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/libs/openssl/include/openssl/kssl.h b/libs/openssl/include/openssl/kssl.h new file mode 100644 index 0000000..e4df843 --- /dev/null +++ b/libs/openssl/include/openssl/kssl.h @@ -0,0 +1,192 @@ +/* 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/libs/openssl/include/openssl/lhash.h b/libs/openssl/include/openssl/lhash.h new file mode 100644 index 0000000..e7d8763 --- /dev/null +++ b/libs/openssl/include/openssl/lhash.h @@ -0,0 +1,241 @@ +/* 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/libs/openssl/include/openssl/md4.h b/libs/openssl/include/openssl/md4.h new file mode 100644 index 0000000..a55368a --- /dev/null +++ b/libs/openssl/include/openssl/md4.h @@ -0,0 +1,120 @@ +/* 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/libs/openssl/include/openssl/md5.h b/libs/openssl/include/openssl/md5.h new file mode 100644 index 0000000..541cc92 --- /dev/null +++ b/libs/openssl/include/openssl/md5.h @@ -0,0 +1,120 @@ +/* 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/libs/openssl/include/openssl/mdc2.h b/libs/openssl/include/openssl/mdc2.h new file mode 100644 index 0000000..f3e8e57 --- /dev/null +++ b/libs/openssl/include/openssl/mdc2.h @@ -0,0 +1,98 @@ +/* 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/libs/openssl/include/openssl/modes.h b/libs/openssl/include/openssl/modes.h new file mode 100644 index 0000000..f18215b --- /dev/null +++ b/libs/openssl/include/openssl/modes.h @@ -0,0 +1,135 @@ +/* ==================================================================== + * 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 + +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); diff --git a/libs/openssl/include/openssl/obj_mac.h b/libs/openssl/include/openssl/obj_mac.h new file mode 100644 index 0000000..b5ea7cd --- /dev/null +++ b/libs/openssl/include/openssl/obj_mac.h @@ -0,0 +1,4032 @@ +/* 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_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 + diff --git a/libs/openssl/include/openssl/objects.h b/libs/openssl/include/openssl/objects.h new file mode 100644 index 0000000..bd0ee52 --- /dev/null +++ b/libs/openssl/include/openssl/objects.h @@ -0,0 +1,1138 @@ +/* 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/libs/openssl/include/openssl/ocsp.h b/libs/openssl/include/openssl/ocsp.h new file mode 100644 index 0000000..31e4574 --- /dev/null +++ b/libs/openssl/include/openssl/ocsp.h @@ -0,0 +1,623 @@ +/* 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, char *path, OCSP_REQUEST *req); +OCSP_REQ_CTX *OCSP_sendreq_new(BIO *io, char *path, OCSP_REQUEST *req, + int maxline); +int OCSP_sendreq_nbio(OCSP_RESPONSE **presp, OCSP_REQ_CTX *rctx); +void OCSP_REQ_CTX_free(OCSP_REQ_CTX *rctx); +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(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/libs/openssl/include/openssl/opensslconf.h b/libs/openssl/include/openssl/opensslconf.h new file mode 100644 index 0000000..ef409a1 --- /dev/null +++ b/libs/openssl/include/openssl/opensslconf.h @@ -0,0 +1,232 @@ +/* opensslconf.h */ +/* WARNING: Generated automatically from opensslconf.h.in by Configure. */ + +/* OpenSSL was configured with the following options: */ +#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_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_STORE +# define OPENSSL_NO_STORE +#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_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_STORE) && !defined(NO_STORE) +# define NO_STORE +# endif +#endif + +/* 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 "/tmp/openssl-1.0.1h-i386/lib/engines" +#define OPENSSLDIR "/tmp/openssl-1.0.1h-i386" +#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. + */ +#undef RC4_CHUNK +#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 int +#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 */ +#define RC4_INDEX +#endif + +#if defined(HEADER_BF_LOCL_H) && !defined(CONFIG_HEADER_BF_LOCL_H) +#define CONFIG_HEADER_BF_LOCL_H +#undef 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 */ diff --git a/libs/openssl/include/openssl/opensslv.h b/libs/openssl/include/openssl/opensslv.h new file mode 100644 index 0000000..c3b6ace --- /dev/null +++ b/libs/openssl/include/openssl/opensslv.h @@ -0,0 +1,89 @@ +#ifndef HEADER_OPENSSLV_H +#define HEADER_OPENSSLV_H + +/* 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 0x1000108fL +#ifdef OPENSSL_FIPS +#define OPENSSL_VERSION_TEXT "OpenSSL 1.0.1h-fips 5 Jun 2014" +#else +#define OPENSSL_VERSION_TEXT "OpenSSL 1.0.1h 5 Jun 2014" +#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" + + +#endif /* HEADER_OPENSSLV_H */ diff --git a/libs/openssl/include/openssl/ossl_typ.h b/libs/openssl/include/openssl/ossl_typ.h new file mode 100644 index 0000000..ea9227f --- /dev/null +++ b/libs/openssl/include/openssl/ossl_typ.h @@ -0,0 +1,202 @@ +/* ==================================================================== + * 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 + +#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_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; + +#endif /* def HEADER_OPENSSL_TYPES_H */ diff --git a/libs/openssl/include/openssl/pem.h b/libs/openssl/include/openssl/pem.h new file mode 100644 index 0000000..8a6abab --- /dev/null +++ b/libs/openssl/include/openssl/pem.h @@ -0,0 +1,641 @@ +/* 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_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,char *hdr,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,char *name,char *hdr,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) + +#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_PARAMETERS 140 +#define PEM_F_PEM_READ_BIO_PRIVATEKEY 123 +#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/libs/openssl/include/openssl/pem2.h b/libs/openssl/include/openssl/pem2.h new file mode 100644 index 0000000..f31790d --- /dev/null +++ b/libs/openssl/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/libs/openssl/include/openssl/pkcs12.h b/libs/openssl/include/openssl/pkcs12.h new file mode 100644 index 0000000..b17eb9f --- /dev/null +++ b/libs/openssl/include/openssl/pkcs12.h @@ -0,0 +1,331 @@ +/* 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/libs/openssl/include/openssl/pkcs7.h b/libs/openssl/include/openssl/pkcs7.h new file mode 100644 index 0000000..04f6037 --- /dev/null +++ b/libs/openssl/include/openssl/pkcs7.h @@ -0,0 +1,500 @@ +/* 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_type_is_encrypted(a) \ + (OBJ_obj2nid((a)->type) == NID_pkcs7_encrypted) + +#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/libs/openssl/include/openssl/pqueue.h b/libs/openssl/include/openssl/pqueue.h new file mode 100644 index 0000000..87fc903 --- /dev/null +++ b/libs/openssl/include/openssl/pqueue.h @@ -0,0 +1,94 @@ +/* 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 + +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); + +#endif /* ! HEADER_PQUEUE_H */ diff --git a/libs/openssl/include/openssl/rand.h b/libs/openssl/include/openssl/rand.h new file mode 100644 index 0000000..bb5520e --- /dev/null +++ b/libs/openssl/include/openssl/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/libs/openssl/include/openssl/rc2.h b/libs/openssl/include/openssl/rc2.h new file mode 100644 index 0000000..e542ec9 --- /dev/null +++ b/libs/openssl/include/openssl/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/libs/openssl/include/openssl/rc4.h b/libs/openssl/include/openssl/rc4.h new file mode 100644 index 0000000..88ceb46 --- /dev/null +++ b/libs/openssl/include/openssl/rc4.h @@ -0,0 +1,90 @@ +/* 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/libs/openssl/include/openssl/ripemd.h b/libs/openssl/include/openssl/ripemd.h new file mode 100644 index 0000000..189bd8c --- /dev/null +++ b/libs/openssl/include/openssl/ripemd.h @@ -0,0 +1,107 @@ +/* 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/libs/openssl/include/openssl/rsa.h b/libs/openssl/include/openssl/rsa.h new file mode 100644 index 0000000..5f269e5 --- /dev/null +++ b/libs/openssl/include/openssl/rsa.h @@ -0,0 +1,582 @@ +/* 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); + 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); /* Can be null */ + int (*init)(RSA *rsa); /* called at new */ + int (*finish)(RSA *rsa); /* called at free */ + int flags; /* RSA_METHOD_FLAG_* things */ + char *app_data; /* may be needed! */ +/* 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 +# define OPENSSL_RSA_MAX_PUBEXP_BITS 64 /* exponent limit enforced for "large" modulus only */ +#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 + +#define RSA_FLAG_NO_BLINDING 0x0080 /* 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_CONSTTIME 0x0100 /* 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. + */ +#ifndef OPENSSL_NO_DEPRECATED +#define RSA_FLAG_NO_EXP_CONSTTIME RSA_FLAG_NO_CONSTTIME /* 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. + */ +#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_CTRL_RSA_MGF1_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_CTRL_GET_RSA_MGF1_MD, 0, (void *)pmd) + +#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 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) + +#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_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_BUILTIN_KEYGEN 129 +#define RSA_F_RSA_CHECK_KEY 123 +#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_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_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_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_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_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_LENGTH 143 +#define RSA_R_INVALID_HEADER 137 +#define RSA_R_INVALID_KEYBITS 145 +#define RSA_R_INVALID_MESSAGE_LENGTH 131 +#define RSA_R_INVALID_MGF1_MD 156 +#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_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_MASK_DIGEST 151 +#define RSA_R_UNKNOWN_PADDING_TYPE 118 +#define RSA_R_UNKNOWN_PSS_DIGEST 152 +#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/libs/openssl/include/openssl/safestack.h b/libs/openssl/include/openssl/safestack.h new file mode 100644 index 0000000..ea3aa0d --- /dev/null +++ b/libs/openssl/include/openssl/safestack.h @@ -0,0 +1,2663 @@ +/* ==================================================================== + * 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 + +#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_FREE_FUNC(type, p) \ + ((void (*)(void *)) ((1 ? p : (void (*)(type *))0))) + +#define CHECKED_SK_FREE_FUNC2(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; \ + }; + +#define IMPLEMENT_STACK_OF(type) /* nada (obsolete in new safestack approach)*/ + + +/* 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. + * +o * 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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_FUNC2(OPENSSL_STRING, 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_FUNC2(OPENSSL_BLOCK, 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_FUNC2(OPENSSL_PSTRING, 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) +/* End of util/mkstack.pl block, you may now edit :-) */ + +#endif /* !defined HEADER_SAFESTACK_H */ diff --git a/libs/openssl/include/openssl/seed.h b/libs/openssl/include/openssl/seed.h new file mode 100644 index 0000000..c50fdd3 --- /dev/null +++ b/libs/openssl/include/openssl/seed.h @@ -0,0 +1,139 @@ +/* + * 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 + +#ifdef AES_LONG /* look whether we need 'long' to get 32 bits */ +# 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/libs/openssl/include/openssl/sha.h b/libs/openssl/include/openssl/sha.h new file mode 100644 index 0000000..8a6bf4b --- /dev/null +++ b/libs/openssl/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. + */ +#define SHA512_CBLOCK (SHA_LBLOCK*8) /* SHA-512 treats input data as a + * contiguous array of 64 bit + * wide big-endian values. */ +#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/libs/openssl/include/openssl/srp.h b/libs/openssl/include/openssl/srp.h new file mode 100644 index 0000000..7ec7825 --- /dev/null +++ b/libs/openssl/include/openssl/srp.h @@ -0,0 +1,172 @@ +/* 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/libs/openssl/include/openssl/srtp.h b/libs/openssl/include/openssl/srtp.h new file mode 100644 index 0000000..c0cf33e --- /dev/null +++ b/libs/openssl/include/openssl/srtp.h @@ -0,0 +1,145 @@ +/* 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). + * + */ +/* + 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 + +#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 + +int SSL_CTX_set_tlsext_use_srtp(SSL_CTX *ctx, const char *profiles); +int SSL_set_tlsext_use_srtp(SSL *ctx, const char *profiles); +SRTP_PROTECTION_PROFILE *SSL_get_selected_srtp_profile(SSL *s); + +STACK_OF(SRTP_PROTECTION_PROFILE) *SSL_get_srtp_profiles(SSL *ssl); +SRTP_PROTECTION_PROFILE *SSL_get_selected_srtp_profile(SSL *s); + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/libs/openssl/include/openssl/ssl.h b/libs/openssl/include/openssl/ssl.h new file mode 100644 index 0000000..4c1242c --- /dev/null +++ b/libs/openssl/include/openssl/ssl.h @@ -0,0 +1,2590 @@ +/* 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" /* no such ciphersuites supported! */ +#define SSL_TXT_kDHd "kDHd" /* no such ciphersuites supported! */ +#define SSL_TXT_kDH "kDH" /* no such ciphersuites supported! */ +#define SSL_TXT_kEDH "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_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" /* no such ciphersuites supported! */ +#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_DSS "DSS" +#define SSL_TXT_DH "DH" +#define SSL_TXT_EDH "EDH" /* same as "kEDH:-ADH" */ +#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_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; + +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_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. */ +#define SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS 0x00000800L /* added in 0.9.6e */ + +/* 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 +/* Set to always use the tmp_rsa key when doing RSA operations, + * even when this violates protocol specs */ +#define SSL_OP_EPHEMERAL_RSA 0x00200000L +/* 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 + +/* 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 + +/* 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 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 + +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 */ + + void (*info_callback)(const SSL *ssl,int type,int val); /* used if SSL's info_callback is NULL */ + + /* 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]; + int (*default_verify_callback)(int ok,X509_STORE_CTX *ctx); /* called 'verify_callback' in the SSL */ + + /* 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; +#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); + +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); +void SSL_get0_next_proto_negotiated(const SSL *s, + const unsigned char **data, unsigned *len); + +#define OPENSSL_NPN_UNSUPPORTED 0 +#define OPENSSL_NPN_NEGOTIATED 1 +#define OPENSSL_NPN_NO_OVERLAP 2 +#endif + +#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 + +#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; + int type; /* SSL_ST_CONNECT or SSL_ST_ACCEPT */ + + const SSL_METHOD *method; /* SSLv3 */ + + /* 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 + BIO *rbio; /* used by SSL_read */ + BIO *wbio; /* used by SSL_write */ + BIO *bbio; /* used during session-id reuse to concatenate + * messages */ +#else + char *rbio; /* used by SSL_read */ + char *wbio; /* used by SSL_write */ + 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. + */ + + int server; /* are we the server side? - mostly used by SSL_clear*/ + + int new_session;/* 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 quiet_shutdown;/* don't send shutdown packets */ + int shutdown; /* we have shut things down, 0x01 sent, 0x02 + * for received */ + int state; /* where we are */ + int rstate; /* where we are when reading */ + + 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 */ + int verify_mode; /* 0 don't care about verify failure. + * 1 fail if verify fails */ + int (*verify_callback)(int ok,X509_STORE_CTX *ctx); /* fail if callback returns 0 */ + + void (*info_callback)(const SSL *ssl,int type,int val); /* optional informational callback */ + + int error; /* error bytes to be written */ + int error_code; /* actual code */ + +#ifndef OPENSSL_NO_KRB5 + KSSL_CTX *kssl_ctx; /* Kerberos 5 context */ +#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; + unsigned long options; /* protocol behaviour */ + unsigned long mode; /* API behaviour */ + long max_cert_list; + int first_packet; + int client_version; /* what was passed, used for + * SSLv3/TLS rollback check */ + 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; + int servername_done; /* 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 + */ + /* 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; + unsigned char *tlsext_ecpointformatlist; /* our list */ + size_t tlsext_ellipticcurvelist_length; + unsigned char *tlsext_ellipticcurvelist; /* our list */ +#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 + + STACK_OF(SRTP_PROTECTION_PROFILE) *srtp_profiles; /* What we'll do */ + SRTP_PROTECTION_PROFILE *srtp_profile; /* What's been chosen */ + + unsigned int tlsext_heartbeat; /* Is use of the Heartbeat extension negotiated? + 0: disabled + 1: enabled + 2: enabled, but not allowed to send Requests + */ + unsigned int tlsext_hb_pending; /* Indicates if a HeartbeatRequest is in flight */ + unsigned int tlsext_hb_seq; /* HeartbeatRequest sequence number */ +#else +#define session_ctx ctx +#endif /* OPENSSL_NO_TLSEXT */ + + int renegotiate;/* 1 if we are renegotiating. + * 2 if we are a server and are inside a handshake + * (i.e. not just sending a HelloRequest) */ + +#ifndef OPENSSL_NO_SRP + SRP_CTX srp_ctx; /* ctx for SRP authentication */ +#endif + }; + +#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 +#define SSL_AD_UNEXPECTED_MESSAGE SSL3_AD_UNEXPECTED_MESSAGE /* fatal */ +#define SSL_AD_BAD_RECORD_MAC SSL3_AD_BAD_RECORD_MAC /* fatal */ +#define SSL_AD_DECRYPTION_FAILED TLS1_AD_DECRYPTION_FAILED +#define SSL_AD_RECORD_OVERFLOW TLS1_AD_RECORD_OVERFLOW +#define SSL_AD_DECOMPRESSION_FAILURE SSL3_AD_DECOMPRESSION_FAILURE/* fatal */ +#define SSL_AD_HANDSHAKE_FAILURE SSL3_AD_HANDSHAKE_FAILURE/* fatal */ +#define SSL_AD_NO_CERTIFICATE SSL3_AD_NO_CERTIFICATE /* Not for TLS */ +#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 +#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 /* fatal */ +#define SSL_AD_DECRYPT_ERROR TLS1_AD_DECRYPT_ERROR +#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 /* fatal */ +#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 +#define SSL_AD_UNKNOWN_PSK_IDENTITY TLS1_AD_UNKNOWN_PSK_IDENTITY /* fatal */ + +#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 + +#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 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_clear_extra_chain_certs(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_CLEAR_EXTRA_CHAIN_CERTS,0,NULL) + +#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); +#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_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); +int SSL_CTX_use_certificate_chain_file(SSL_CTX *ctx, const char *file); /* PEM type */ +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 +#ifndef OPENSSL_SYS_MACINTOSH_CLASSIC /* XXXXX: Better scheme needed! [was: #ifndef MAC_OS_pre_X] */ +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); +#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); + +#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_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 + +const SSL_METHOD *SSLv3_method(void); /* SSLv3 */ +const SSL_METHOD *SSLv3_server_method(void); /* SSLv3 */ +const SSL_METHOD *SSLv3_client_method(void); /* SSLv3 */ + +const SSL_METHOD *SSLv23_method(void); /* SSLv3 but can rollback to v2 */ +const SSL_METHOD *SSLv23_server_method(void); /* SSLv3 but can rollback to v2 */ +const SSL_METHOD *SSLv23_client_method(void); /* SSLv3 but can rollback to v2 */ + +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 */ + +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_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(SSL *ssl); + +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); +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 + +/* 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); + +/* 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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_PURPOSE 278 +#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_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_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_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_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_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_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_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_CIPHER_RETURNED 261 +#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/libs/openssl/include/openssl/ssl2.h b/libs/openssl/include/openssl/ssl2.h new file mode 100644 index 0000000..eb25dcb --- /dev/null +++ b/libs/openssl/include/openssl/ssl2.h @@ -0,0 +1,272 @@ +/* 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/libs/openssl/include/openssl/ssl23.h b/libs/openssl/include/openssl/ssl23.h new file mode 100644 index 0000000..d322898 --- /dev/null +++ b/libs/openssl/include/openssl/ssl23.h @@ -0,0 +1,83 @@ +/* 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/libs/openssl/include/openssl/ssl3.h b/libs/openssl/include/openssl/ssl3.h new file mode 100644 index 0000000..37f19e3 --- /dev/null +++ b/libs/openssl/include/openssl/ssl3.h @@ -0,0 +1,694 @@ +/* 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 draft-ietf-tls-renegotiation-03.txt */ +#define SSL3_CK_SCSV 0x030000FF + +#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_EDH_DSS_DES_64_CBC_SHA 0x03000012 +#define SSL3_CK_EDH_DSS_DES_192_CBC3_SHA 0x03000013 +#define SSL3_CK_EDH_RSA_DES_40_CBC_SHA 0x03000014 +#define SSL3_CK_EDH_RSA_DES_64_CBC_SHA 0x03000015 +#define SSL3_CK_EDH_RSA_DES_192_CBC3_SHA 0x03000016 + +#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_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 + +#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 + +#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 + { +/*r */ int type; /* type of record */ +/*rw*/ unsigned int length; /* How many bytes available */ +/*r */ unsigned int off; /* read/write offset into 'buf' */ +/*rw*/ unsigned char *data; /* pointer to the record data */ +/*rw*/ unsigned char *input; /* where the decode bytes are */ +/*r */ unsigned char *comp; /* only used with decompression - malloc()ed */ +/*r */ unsigned long epoch; /* epoch number, needed by DTLS1 */ +/*r */ unsigned char seq_num[8]; /* sequence number, needed by DTLS1 */ + } SSL3_RECORD; + +typedef struct ssl3_buffer_st + { + unsigned char *buf; /* at least SSL3_RT_MAX_PACKET_SIZE bytes, + * see ssl3_setup_buffers() */ + size_t len; /* buffer size */ + int offset; /* where to 'copy from' */ + int left; /* how many bytes 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 +#define SSL3_FLAGS_CCS_OK 0x0080 + +/* SSL3_FLAGS_SGC_RESTART_DONE is set when we + * restart a handshake because of MS SGC and so prevents us + * from restarting the handshake in a loop. It's reset on a + * renegotiation, so effectively limits the client to one restart + * per negotiation. This limits the possibility of a DDoS + * attack where the client handshakes in a loop using SGC to + * restart. Servers which permit renegotiation can still be + * effected, but we can't prevent that. + */ +#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; + /* this is set whenerver we see a change_cipher_spec message + * come in when we are not looking for one */ + 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 */ +#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) +/* 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/libs/openssl/include/openssl/stack.h b/libs/openssl/include/openssl/stack.h new file mode 100644 index 0000000..ce35e55 --- /dev/null +++ b/libs/openssl/include/openssl/stack.h @@ -0,0 +1,108 @@ +/* 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 *)); +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/libs/openssl/include/openssl/symhacks.h b/libs/openssl/include/openssl/symhacks.h new file mode 100644 index 0000000..bd2f000 --- /dev/null +++ b/libs/openssl/include/openssl/symhacks.h @@ -0,0 +1,481 @@ +/* ==================================================================== + * 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 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_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 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 long ENGINE 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 + +/* 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/libs/openssl/include/openssl/tls1.h b/libs/openssl/include/openssl/tls1.h new file mode 100644 index 0000000..c992091 --- /dev/null +++ b/libs/openssl/include/openssl/tls1.h @@ -0,0 +1,741 @@ +/* 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_2_VERSION 0x0303 +#define TLS1_2_VERSION_MAJOR 0x03 +#define TLS1_2_VERSION_MINOR 0x03 + +#define TLS1_1_VERSION 0x0302 +#define TLS1_1_VERSION_MAJOR 0x03 +#define TLS1_1_VERSION_MINOR 0x02 + +#define TLS1_VERSION 0x0301 +#define TLS1_VERSION_MAJOR 0x03 +#define TLS1_VERSION_MINOR 0x01 + +#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_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 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 + +#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 + +#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); + +#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 + * Inconsistency alert: + * The OpenSSL names of ciphers with ephemeral DH here include the string + * "DHE", while elsewhere it has always been "EDH". + * (The alias for the list of all such ciphers also is "EDH".) + * The specifications speak of "EDH"; maybe we should allow both forms + * for everything. */ +#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 +#define TLS_MD_CLIENT_FINISH_CONST "\x63\x6c\x69\x65\x6e\x74\x20\x66\x69\x6e\x69\x73\x68\x65\x64" /*client finished*/ +#undef TLS_MD_SERVER_FINISH_CONST +#define TLS_MD_SERVER_FINISH_CONST "\x73\x65\x72\x76\x65\x72\x20\x66\x69\x6e\x69\x73\x68\x65\x64" /*server finished*/ +#undef TLS_MD_SERVER_WRITE_KEY_CONST +#define TLS_MD_SERVER_WRITE_KEY_CONST "\x73\x65\x72\x76\x65\x72\x20\x77\x72\x69\x74\x65\x20\x6b\x65\x79" /*server write key*/ +#undef TLS_MD_KEY_EXPANSION_CONST +#define TLS_MD_KEY_EXPANSION_CONST "\x6b\x65\x79\x20\x65\x78\x70\x61\x6e\x73\x69\x6f\x6e" /*key expansion*/ +#undef TLS_MD_CLIENT_WRITE_KEY_CONST +#define TLS_MD_CLIENT_WRITE_KEY_CONST "\x63\x6c\x69\x65\x6e\x74\x20\x77\x72\x69\x74\x65\x20\x6b\x65\x79" /*client write key*/ +#undef TLS_MD_SERVER_WRITE_KEY_CONST +#define TLS_MD_SERVER_WRITE_KEY_CONST "\x73\x65\x72\x76\x65\x72\x20\x77\x72\x69\x74\x65\x20\x6b\x65\x79" /*server write key*/ +#undef TLS_MD_IV_BLOCK_CONST +#define TLS_MD_IV_BLOCK_CONST "\x49\x56\x20\x62\x6c\x6f\x63\x6b" /*IV block*/ +#undef TLS_MD_MASTER_SECRET_CONST +#define TLS_MD_MASTER_SECRET_CONST "\x6d\x61\x73\x74\x65\x72\x20\x73\x65\x63\x72\x65\x74" /*master secret*/ +#endif + +/* TLS Session Ticket extension struct */ +struct tls_session_ticket_ext_st + { + unsigned short length; + void *data; + }; + +#ifdef __cplusplus +} +#endif +#endif diff --git a/libs/openssl/include/openssl/ts.h b/libs/openssl/include/openssl/ts.h new file mode 100644 index 0000000..c2448e3 --- /dev/null +++ b/libs/openssl/include/openssl/ts.h @@ -0,0 +1,858 @@ +/* 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/libs/openssl/include/openssl/txt_db.h b/libs/openssl/include/openssl/txt_db.h new file mode 100644 index 0000000..6abe435 --- /dev/null +++ b/libs/openssl/include/openssl/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/libs/openssl/include/openssl/ui.h b/libs/openssl/include/openssl/ui.h new file mode 100644 index 0000000..bd78aa4 --- /dev/null +++ b/libs/openssl/include/openssl/ui.h @@ -0,0 +1,383 @@ +/* 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/libs/openssl/include/openssl/ui_compat.h b/libs/openssl/include/openssl/ui_compat.h new file mode 100644 index 0000000..b35c9bb --- /dev/null +++ b/libs/openssl/include/openssl/ui_compat.h @@ -0,0 +1,83 @@ +/* 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/libs/openssl/include/openssl/whrlpool.h b/libs/openssl/include/openssl/whrlpool.h new file mode 100644 index 0000000..9e01f5b --- /dev/null +++ b/libs/openssl/include/openssl/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/libs/openssl/include/openssl/x509.h b/libs/openssl/include/openssl/x509.h new file mode 100644 index 0000000..092dd74 --- /dev/null +++ b/libs/openssl/include/openssl/x509.h @@ -0,0 +1,1297 @@ +/* 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) + +/* 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 { +ASN1_TYPE *salt; /* Usually OCTET STRING but could be anything */ +ASN1_INTEGER *iter; +ASN1_INTEGER *keylength; +X509_ALGOR *prf; +} PBKDF2PARAM; + + +/* PKCS#8 private key info structure */ + +struct pkcs8_priv_key_info_st + { + int broken; /* Flag for various broken formats */ +#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; + ASN1_TYPE *pkey; /* Should be OCTET STRING but some are broken */ + 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_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 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_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); + +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 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); + +int X509_REQ_check_private_key(X509_REQ *x509,EVP_PKEY *pkey); + +int X509_check_private_key(X509 *x509,EVP_PKEY *pkey); + +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_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_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_ERR_ASN1_LIB 102 +#define X509_R_INVALID_DIRECTORY 113 +#define X509_R_INVALID_FIELD_NAME 119 +#define X509_R_INVALID_TRUST 123 +#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_NO_CERT_SET_FOR_US_TO_VERIFY 105 +#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/libs/openssl/include/openssl/x509_vfy.h b/libs/openssl/include/openssl/x509_vfy.h new file mode 100644 index 0000000..fe09b30 --- /dev/null +++ b/libs/openssl/include/openssl/x509_vfy.h @@ -0,0 +1,567 @@ +/* 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; + +/* 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; + +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 */ + int (*verify)(X509_STORE_CTX *ctx); /* called to verify a certificate */ + int (*verify_cb)(int ok,X509_STORE_CTX *ctx); /* error callback */ + int (*get_issuer)(X509 **issuer, X509_STORE_CTX *ctx, X509 *x); /* get issuers cert from ctx */ + int (*check_issued)(X509_STORE_CTX *ctx, X509 *x, X509 *issuer); /* check issued */ + int (*check_revocation)(X509_STORE_CTX *ctx); /* Check revocation status of chain */ + int (*get_crl)(X509_STORE_CTX *ctx, X509_CRL **crl, X509 *x); /* retrieve CRL */ + int (*check_crl)(X509_STORE_CTX *ctx, X509_CRL *crl); /* Check CRL validity */ + int (*cert_crl)(X509_STORE_CTX *ctx, X509_CRL *crl, X509 *x); /* Check certificate against CRL */ + 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; + int current_method; /* used when looking up certs */ + + /* The following are set by the caller */ + X509 *cert; /* The cert to check */ + STACK_OF(X509) *untrusted; /* chain of X509s - untrusted - passed in */ + STACK_OF(X509_CRL) *crls; /* set of CRLs passed in */ + + X509_VERIFY_PARAM *param; + void *other_ctx; /* Other info for use with get_issuer() */ + + /* Callbacks for various operations */ + int (*verify)(X509_STORE_CTX *ctx); /* called to verify a certificate */ + int (*verify_cb)(int ok,X509_STORE_CTX *ctx); /* error callback */ + int (*get_issuer)(X509 **issuer, X509_STORE_CTX *ctx, X509 *x); /* get issuers cert from ctx */ + int (*check_issued)(X509_STORE_CTX *ctx, X509 *x, X509 *issuer); /* check issued */ + int (*check_revocation)(X509_STORE_CTX *ctx); /* Check revocation status of chain */ + int (*get_crl)(X509_STORE_CTX *ctx, X509_CRL **crl, X509 *x); /* retrieve CRL */ + int (*check_crl)(X509_STORE_CTX *ctx, X509_CRL *crl); /* Check CRL validity */ + int (*cert_crl)(X509_STORE_CTX *ctx, X509_CRL *crl, X509 *x); /* Check certificate against CRL */ + 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 */ + int valid; /* if 0, rebuild chain */ + int last_untrusted; /* index of last untrusted cert */ + STACK_OF(X509) *chain; /* chain of X509s - built up and trusted */ + X509_POLICY_TREE *tree; /* Valid policy tree */ + + int explicit_policy; /* Require explicit policy value */ + + /* When something goes wrong, this is why */ + int error_depth; + int error; + X509 *current_cert; + X509 *current_issuer; /* cert currently being tested as valid issuer */ + X509_CRL *current_crl; /* current CRL */ + + int current_crl_score; /* score of current CRL */ + unsigned int current_reasons; /* Reason mask */ + + X509_STORE_CTX *parent; /* For CRL path validation: parent context */ + + 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 + +/* 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 + + +#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 *)); + +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_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_get_depth(const X509_VERIFY_PARAM *param); + +int X509_VERIFY_PARAM_add0_table(X509_VERIFY_PARAM *param); +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/libs/openssl/include/openssl/x509v3.h b/libs/openssl/include/openssl/x509v3.h new file mode 100644 index 0000000..b308abe --- /dev/null +++ b/libs/openssl/include/openssl/x509v3.h @@ -0,0 +1,1007 @@ +/* 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 + +/* 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_SS 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 + +#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 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); + + +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); + +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_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_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_MULTIPLE_RDNS 161 +#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_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/libs/openssl/lib/libcrypto.a b/libs/openssl/lib/libcrypto.a new file mode 100644 index 0000000000000000000000000000000000000000..94bfa99c60af6ac6686ddf8b501e2a96df01144f GIT binary patch literal 13630532 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

=1JT$g3%ro5%Dv0# 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∓uAQLPcFZBGP21a5ef7GxGL_86~ekqequ)UgA zkBBxkZ4`r>o9i};XDtJ`%^`6ga8<6Qe`u(OyVLSYi^Vfxr*u_g%_S|>4QK~z>I>KE zC`bb2Gi(BqD8yJwPX-D+z9)}SbQx_hSEP}#Se%kYLPac2NVy3~3kT{JOj!t=HQJuL z3dCCLHq@@Ws%i7pzM8{aiVletF^8PYsD+%G1p+NhnD~i7hKR32I#%K5K-bC2P%ox2 z=oDip*2P;USK;f$o}wa7OKDH#s#GB~D-d4P+GhnYP4fXR;;n23E((#9b^vj_Fs7c=!MjU-g#yf|wvFFqo9ae$W> zhuOTufX&OgtD9QZnThN=b{9+~NTO1NNzhv%LKeCqRW0k#xz)Y6*2!1t(Hc5tqubDv zNg2M!Hr+@kEhF|y*t3zs%KJE z@1X@+cAFv_ebLS?>?7OVg&qt6wBi^nNm(`b04vzhJJeEux32RkfK0Df^Fw2$;ck4D z7WaDdZh97%^D*XGD2t2aB0R$k@m?!yAKbJBeN^ulc~kLHAc1PTz+gzerX>wd0^edb zvEpSe98Ak%p@nR})+zb3oOE4q=GN(?MOQ+@tBBT0K_Zk8tnI@@I67o_C8E>In6nQ) z=l?&18F*XUhXvp0F@zq~$rfkTeVt9nbz6_w+}fGLKUo1vVN;Z^BbXdZ0q8;ULX-1@=N4OrTME>`SS{UB0x`kq9#V!Wx7O|qWv zFMCB<>>tEB_ShoX%$Th>A!iy#sT8&b39}8DG`ppLurpg9Xjf@qxKYO=tg8w;50oA% za*dEDWY!_MI^qXt+VqSLMB~tUChbPWal7W2Op06z&Ubx-m)ZRtF`>3<-t!(2!g`B+CBhcLiXN4=3h+#g0c7;mncgu1IN^-IREm z)n%G@lUX|fZYWmI_{`mFX(KRbS4POK`zEeJ@!Jg-T+W{?rQ++n8n4ei_0u?;8hhK9tb9UCIiB-f0&)5&TM2by+< zoh~!*nP5n@#urev3nX@oig4&J?|B*>k1Y{ZcHE`&1ze^*(9c~8wmljX2x$vV0uDeV z6D!}C9gd6*xwUW(v76C^EXh`!blmmxmIu;=mp^p15I#t<*Cnc^q1O^lpkeP#Q;K^4 zaY;Bm{~nQyI)%iQq#@%?&~37{lR5#T6CHlD7&66*y=A7u-jTIOPI$)*uCb7HQ`b#{ zrFe8Vt!o7AID7^l^;!ZR*VjY}6iC$D=_H22`WuQNu2tNf%T%un9=FlRV#bdU@-#GP zyMeJWsk|{BUm)Ulkd)S|F!XV;u*5_O-^4OKSL0FGib@p`Zz=D1+G*AmUemJThYhFc zni9j)V)DCVrgmV=J%blNULvc$lH^2QWYP;S!FNxf62OpYQi6q5tc{*kb15k1_NirV z(IE51O=TIm-k}?CEt%^>I$Y-2Kb?#C`6-!Py3$Hj3hyL|su45k7%ZBurt|^_FzAST zm@H);kcE3DfaY9cGJv^*5%WGNUM5vS)-fqzUsJLqJ|V(K1SjlU;YT|hW1y>x@247* z1N{T>x!E&YIc6-`-GQ**o*7U^IpX~4ru8j#S946FnYC5Esh!C{^iw#3m#sjCRp8Vi zLTYAeks@h-&Q~F>OEAGxfZj-(izy~anTiA@2A+_=q9F}SPcjY1^STM1_Sq7stg;9( z6F=(|a@&GioQb?AsMD|>qOZg9&g`MMznZs06=MWbx!16!5+WWZL?oRM(PTnqlt_jm zkTiBj*xXpX?pg_SZ>eLj-()j^_h5rFaX-NE#%6yXKiuUT5}z{+89Z%>xNnFved3Ky z?3HAIM53gO;r^Sr_&0zs%M%KUS($jvVBmXtG1}bJY~Bd-E3E?)HP_)m^>wIRQ62ag zSX&3~NANJ<*ovG4-7`mqf_oa9h8NW9l;OB?r&zXzCmE(V12kFJ17=(g0~q~ujL>jj zsHEdzH4T(7w}nBSw2Ik=G-+sf2u~JC(68>!HY)>`YGf3P)XK!A9H?bvk2=}eBWIfI zk(HG_;_2)On#>+SKYMbegqO1}yp?sEA;)DZgvAEeGqdty*lpHpw36}-t%52O# z;?~YKm~Q~#6PuwAl*4?X7H67=YuRjVDPIprx@1Z^n`Jt>rlXnCGfe3prg&Mc86!?t zy~dIcXNfYQgnS9D11rj{UDGW@379n)F#~msUqzUf!LGW#3TSPqir+HJr&qz(cc|g0 zq!5$wg7!cv?i6^U>}4m_ZC#L^e08rnvpmG~gkjb1?1c3my@Z6U?0ZqYaeaMbg29$P zRF=2lO(kvPz02%{i}ZvcZ@;_Z4Ixv>V$2q_AS|VzE;}@?$1ya09gbz#QSC=H=FUPA zKF3N_Z69yLx(f8iF>;;Mk#Q6+3v`%oI?z2X(b8{B+CY#Uw399sX&+=S5MS179-X8< z7KY)ZVP&KOh?|0L^2Ob)xbUn6Yv!;h1+RQ~fN70qMbXviJ#8N0F5mNur(ZjVwZ2aT*jqzh^=k)rSM(fO%ejv0j_O!h+b}v zwila!MOiaG<}CT38uKA*PaX~!Qni9QBtLkIU zf)A=8AF}prP@NwRaF!gRW*jXxI1=ksHS<`Ts%kOpm$5;;!gGKZ-Ym>CicA{Ho~-O_ zqc9@vR2g-7N{D%(sC_v?N)F);g#qxjD^>Qw=r9|T6cAXlQeusx)6S#zw zxY^W*&RJVeM+;sbapyJOc}EYo0x-j3P5=!uZtMvVyPrD&Y{JX)EvCaz&Anb)HU(IX zkC_#^H}&CjS}iwhGGA{s(!814)mb-K3wQ~~zWyVr2u(>$UU3PZCM2-wAjD#FosraD zj&x8kDQt8SU`q{>T*nt(*`0D5O2!BlVtWGSDtBCXgpUNvZUknffa8c0LKV%RuAJBD zus@Qs-(wY=>&$v_%k99+mw2hOZ3=E5}Gq&BUu+f-|I=UH>vC2Kpl9i$Jo zb@68BNnr}6rzauQF?3658^@OL-Y(Btsyl8TDGhd2cXY^Dq>MW`-Y^$UT-9}JL)#!X zOmIq#U0Aj{l&#bxGXOd#96E%R@p#JfUF;hfo1$&>0$#D@DA@XXJmBkhlHI77fNorju-VnfNIQmvow8M{ItEZf?a&{(9U>_(#x8Y4 zknj!tL&K}9s<<5$zQY6Wv4c{N2n&i;>utU0Lpd={Dq#Z&eu^9)we}d83t%TFL`+B9 z!;qxBxV%pKdJTj9D5a~hjVd0!afV$F>CW0!Yc6YX5>kjwUBhS#PQpd&a1!pilX43_ zw;4-tZIT9Wym-y3RV|-dlXfY=4^<_~{aDn=76})JWD=o3iy-eSGo&md6CIwlbZo-| zkK!oQegs4)6j^-cNda%U1q**nnr-notCqm&s)eZ8ibcyH@o^5eh?6oHG{!!Oa?3soWVENVKtz9k)w9&x((Hv@KFx=-cM+BdZ{>t>1E>NxYn|I zJ@)&&nyGrPsfsfhTxULm7n;p7CRkuXkWew5U8bdIpsZM^j*sJP!rPm8UNQFQxA!;V(EgiPP+LrTaKN=GNbWWE!S$xQ-u-kDBHmS^mze5hwmD9f{eX*>%c>sbJL zp6N~7Tn-+A&BWU}xR)lceZ2%ZP83{XDsR60QR>A)K-!_I(G$u%M%$i_5$NTJxjDu1 zy1{;Yj0;N(6p|#g28axwb#2c`nBl#TG6+51x-ll@Q(Ur180L|&@n4Ji(2l^`@URI> z3S;;PkMKqo?OFjhE=*5syVcz@A~qzO`)(O*8wjyK4iOBc@r?`P7Tfu%7Voyl1(60c zp(O3vrU9>Qa`#NMZ!YRx!|i?CUaEZr+blB$FthHS2#0s)B<0^Vg~i;+ZIf9>w`+Af z?z6Ie4R5(9#0Vp5{TK>u2RVWsk8VJNmYM=)^ee*Od8;m3U6qUfR;^ie@tTX*R;{@# zm%F5D6&QxSs;cVJHEVLY%PzfSwUKU}D>n#i^02a>mdxLe-hbzVc{rVeUm1Qg@Y}%u za)#btj`NJa_n^=TxqUdE0zQ9pRjx(8xE?FDv@~Pi;h5&x4k%Ec=9iuZT_#=;jpBd# zGd4Q<@qr&)7!h{%3~f-Ke{a}C4H=yp`8F^z$x8%Q$o@TSs5R;glsblP?QO?y|HC8g zYkpT7v(>_UNw*0@sih9-i2ojbKy(y8`D|BIIcONjow~#o%JtigY}_8d4Ad~Ui;V5(vFv8;=iPg3D{Vw zY-@{TXrm9WoJzU03~-rZA}`OXA34-5-;Y^wvVt!Hz3;3jT8m@r$D(Ke38D@~4Jt=n z{+8kQ3H&~S-*kV^!jA8wmD}^3@^9X`Cx7(Wk5&}-O+_=mSg7pIJ#*sNdq*l;qsos> zK8|%%5(Q#P*t{P&vWGd?8t)s`KhHtZ{(mq;|qnEpw1fl zC#9mXGjd&vtCyTO_VSS^N1bTz1-XIsli!&k=@!p|)~q`U1Km;OH4`JH+VT9aNzZ#o$DXTL-&$6!KH2d}M5WD{L)?t*epVHZQ&W)EQ?o#c1(~V}nO#7WZ_2=iL+k z#}yM76qg{c-A6u+++Eu7OQtj<8v8=wjNA>2JC}R{Xs#naHDf;UFBJZ8KO@t4BtJD5 z=&6d%-@m<7M0!UXW8dFDZx4L`MbmG@;ui{x*9{V{)e^7C=NR+lM{3V~_4vZEXWos@ zn1dXB+q00L`uLeIt*4h|6W!;WzQ46QKec$lFY*8V*DxNp7Iv+tH*=5FPoAjC*Ocv< zL>VytD-K4domSjcyubLRBJ~&ibAIZn0Y+*^VdD70ea|Abrirb^3yO`!b;ainM5jG> zU^3qdf5&b%mS>lu%9@FdrD(;<;-bAr*KI`Z7B$ADSO4DM4(*0~>oDXiZZGWa9{ARY zV=o^5a?ORW@9tg&ul60DRXqP&Ro!J(Rjr*R>c3VKM<+kkcINK&H+TPaZj<^yD_VX>Va7KnyBFeiuJlXFKgZfvd-IeY6?*JDW#6noecJU-erhUjJSnt| z!LK)~O*(gr-DpWoYk6z6*fi&5LglBPRk@c-(S_xEUurAM!4LkBm)&Y{pQcq&L}Udk z`{s_q_e#+PGtg2#cVH|(dwq0cR5^2EbbYkAt#xs0YwOr^Cys4=$51(;XQN)M!!_9U z>oZQt<0ok#D*36knoe}1Nw-pcn%!>bMUEd;&fa_CSnjz9{*8X;%;MZ)8GQQh^O^I0 zTp`h9=kXKA=D(xY`AmBJS{1pw!2M|P^y0+vMW$B5^Hs$Q%@sb=)W&~0K703^+y%v& zViRI|@ZWRY=6qIRZtncn6UX-ddlj#}nUl}){t;Eq`Dtb4X>a7G_VM~ci*wEKT(k$V z|D^b{qrmg6m+XG`f(r0)kGY_GHtc@??YnAb{&RlnG$+M7%yS3!pk9CL*=R4L&wPJr z&**phi+Aq16M2Xv51($^QFy=gly_&BKhqj@*A=7tqwW*O9(ucM&vOSx^E3893%dEK zS8~iTqR}0()}dVMC!;wn@Bhcif%W^2G(<}#&zJ*b9^2LV6VY4qW_0}ej0?+focHeh zc{soFf7cdHOf7CdGFf)y$3HAi9@$^{KyB-hsWO}`)#DN#e|e&HIgb;E$NuWHiAUd> zSKd}=EzCb&_Jgv^KXSb6(_cC?Z${mr8FPO1W0Sh;?{-83{rGxE*I;h(XL6f1Z`>Gl za(6(CeqkW4zA;)hRJpA4g3ELIx@}Hmu|;T3M)8*CunrtEj(8%=am7Mc=jFL&Lvy1m zt`P0del~(wWMAr)4e0ovS=AtCvRYKm_)eRgaLrjK7F-PC*R_2>zRPAf@*EKHEnYrW z$q|Xm2{!zYHCzOFE)${T2v=Vt#_K_y5&v5qb#}Fn+<>vF9t>ATcu63_^JO=lW7=hJ zL{c1aSBft^^P9^2U^_+z`#QOprn5UR0+U1i44#aC>YVLJDeCHAUN91dlkN!5HW&)S zatC=@icE(1;1q2u4GhVDtJydDC-mX}H-7($-#hqC;rCnoW})+Z27Zh1I|siUeiz`k z2EQxttHtjc{95qqz^@O#A^dK|@5}hzgWoRvzJ}j7@cTRbp2zQp_)XyV8h-zR-_P+o zfZtpAP2%@U{7&FE6Me_I_?>|t|Mt&{o?(CTmGWr(O>`jNm=%4UH2xkT{W5-+MN#jQ zDu-Un_|w3?;mMJH5Wh z8AXR?#_5rM1HYB<>opvyHv#!aklues`mX}}A>>KZKIv!iy9n}o)b65+X#Cs2p789F z-mUyf@V^TBVUJIGO!;fUe*pBo9-s7f{Hl;nCyvW;yh7#gfqV_HwVpibO6Bhce>v!- z9-s6)K8H=}W=qbNpJ=w<|zbfv?Z?kB~lF z`OVh^D2)th2oMG(U1NlS1el{bvNBW20^ZI!o{`>^=i{RVqiS+aM zRl?35wX+X)z76aN&kpGal>a*T4}reV!f*I zlAZ*gaYlKM{}%KC@NL{lzpnfTz~2uV?VjV4ei1)j|KETd(_eH7;soq5$XS0#Kd5$I zgPn&#k9l@T-+>?VKZqmq->vpqVXp^Rr)Q7!7PYqs<##>k2G1VpwW>b`{VPDP@$^YA zQ2tZkp9T7Kk5BplGR5-$S(%B?{YdBMz+Nwl^H2J_%17HZz7O=bJwEBL;(z@J3r`gs(`iS%puT>v{j zQn{}{?p0tfd2*zmRX*;Y^>ii(R+h7$B>k;{)OvM9w9Mj{ydc0eYcj<9dkGJb_haQLZIH1QK zJu=_4->Jt|JzlTJt$IWpM6N-Ph=b4@^jOeiUXNGkajhN^3z4tV<8nPBR)R0pV@{9f z=y8!A7wU1o9_Q(CwjL|=h=bT$f#Wp*Pe+-voZEPgc8z_UUzVf)RyI2t#{GIe+C`q@ zJ{0{}@ijRAmY(DOA1zavyK(-PisQZ?eNN9OVS9(3{}$)}MdkNH=6mpi_A7wBhwFmp zPeZ0m&vD<2*6TU$q0uru$Ne(;H`RRsx}R2?_rm5LJH@gFMTU_F3kDDu!zdgrsf^FQ}&vQAq0Z+how7ajhPcmDr)=aZgI zEaPdswxPLRruHy#ie)q%@_E&vn`HN>zL6fROsUx{U!If2f?y0_do8DEW@ou#gxiwo zx)L>tsUk6m3BE)!`iv&8=Nbp}F%Tak*Iff~g2_IoX_mCmEzUpTXum3E)a}M?o?(4l zE|jq7#7kZ!68fClv>aUy)qw}o_BMW_G((&2w47AJdXy59DNOT>YL{c3R3Sv+hIVLRY3Y)V!gwwz_~t#}q^1VHpr+cU3iD>L^Gy zGv&ThWj?0o;w=~RA;^|Q<#hV8g=TM8uN;$pb;wdTQ^%Z!nHctJ1s8iKYYVfRg%5Xg zC_~;%hvx&l1Z-4?y8Cb0#?@(2OItg>Q0yXMqw4@$u)4O}8Ys10yt<=pfJGWx?HCw= zA8?23inni*wfmScb~+qAGArUO#1%RiGqQzbV`JHy>Nhpit;0+;lHm?FnBBtkFjbI1 z%hg?jH*|Hb@9A%E;}^)Kc5&~}Av8gpA6}&szB29mq4UF4YcWgAzt*{M!%Yom%?tDX z7UfL)_b}SotiPqW59A>C9_|Ua70VBh{QWNT!rzA;^=W<~IsjYP2>%}Q!qn&A&pCBKC1wT24MMJe>`wj#@`PY+jf)aC=R~!!N!M zn~&w z-+$)M{t@TBd-fj~pPvSS=i6XT*Vaq+H~$bnTR(A{`m2B)Kc7~BWBv;NZ1sSC;=SC*f;tQ^Pk{M1Kh>?q)D z#;uqq!@O?my4EkZey_Ent+s7v+Y4=Fw6iyVbgO9HTA0&~xew4AMEkbF{oV70UaS1N zlHqTiL7SK(-4T8A+`Z9xi;5VTKX1=?bOHRiZ~^=&pTSXjBlY*kqp_{6e}8=T*#Bxh zyY25W2fC~6^|mt6Dlg`b&Q0Wvqx{g0VC#a@FjH#gGwYA`4(%xXkE17szEG%X`%>HY z;QhdQ=uf>ofOI%Rpt14wIn%mhAUe-Tl(nrxzNzQWsoX32c1|VQv1mNXnVAvJp`18& zIp%=3+ce&tT{e24Au7w=c_4?G7S5lHVUBLW5c67p^y{TB(8pVUUHE^GNBch4eO2uu z&R5La2kK799crZ~^+*4_!{%k;_`I>v?*9xq3`Dm^7tY?xS&tV*4tXlgZ$*Cg4nX%C z9VU%hmj><6M*L^A-VFYIYWosrdtdji8t^^4eF?jx(A&}uyXEyqPwTi%1@^gag)`(zw{8(^z`0uV4hJARWFY;&o2R+^XtO@Lft@Y z##RAap!W0Kvs+h#E?0WAdwy%Q>tZ02I-mFt-5+b^>=`5VhGKI{W$?<*iQl=WqBvIk z(_-23&-@hY3a%;3Aw66dPh5xN+*=Fp7iJHKe?qeW{cy?phC>)|tgi$IBoQja3$}!<^fm^?pei4wB}XGyzXP`w@b}C6*ceMtl?&!bVt=d`Tpp9)V}kpisf4S{QRR`LkxBm z7Z&e93<`(=+NfEN?QO2zH}%EQ{M6lQtJtlv*yG3II<&bm@1TUQ(A7~-;%aAo;?;g2GAWmp7#nhUrH`#ITYe>SKUrpT|G_NC z&APR42kOfu-G2saucHn7%QJ!Ecz^k=yr#-;OSD=$BgiaZ3i+wNGP(a_KHpsDm*P75 zJnS@=OB&_T*lmT%;$oEOUt)zw+>UKi5B)2OtB$ZHMEe5&&~5Guvyq>zRvK%GDrC+- zTF>5oN96zYD)B`R{4?)-&+O=#`RFWdjWFJizStA9qpy?3-y@_SR(=ooyFp_P*6~U2 z1fPAlZQygB_73n#Q=fDv`0TGXgMTBAp9h~b`J^{0ABzvi8$cI5KIt0pCve;e{*^dh z4nAq>lde?#`@vrhdWok``dsiUke}DVKOgj2;FG34>Dk~jzaM~qI_L`UZT?B4L;DOn zljs_a&jbDbDbd%pbNLAA{ihiJ4uJnAI-zfXZ~Y_vL-1+u3e2ZYfPM*lYoGL2RR2Qo z9|ir8r%(EB)yJH{_Jls(s8!jDHsNYR^9DbHQgk z-T)tCT-sjmTUBGV%;#37W=Id$5 zaol@37x!t ziu*3~e){XAPn?JzA^o`OpAGv@g8rJP zPx?XSuLl1i(D!?M(wP4d`}01)ygukb&pzos)!zdB?VxY;^hsZ*{66qM4|vvF*T$Fho0t!#KVz`Zx$>WZZ~Y^Ud2%VAL(u;@=vO^`($9iVe;$MW zKG08rZ~Y^Uc_`6efO%KUu}9zV^hw_jKI_YN@E-(?`;@Ccq%qGPor89y4|2RN?uFbi zFwBv=>x4At$(gSm;5UQ5(o2W*O7MAIybS(o(74~a>xA?o@b5)FdQRXv0KEWw(u_0d z)78GLGXOo;vws%o!_ejW~W5eA4)Pgf!;#q#jj*-vAnNQjf?dy;{@XiS(}ojWuU3ebNiS zXS{v^K86va)4{j#BRv;C)&u;abFpj&Lx2&&UIBljKLR~p@p+0fw2OgPD2;>2eH_Q@ zQSaF|q5WQ-LzrdpMV@2s60wW^T+f-uztQs^oIlTV=&~;UPd#V-#dRa|o}=LXiJrfL z_Hl-ue-*Mnhd$>?{-qQ1D;m-|frxF;-Rnj_u zw?;Xv-{otOD(X$Vaef6GuqSL~3ruT-+GaIwIuTAaWm~tLOtW@|YFghC0@E5fnQvy& zSmu~G4W+r}lynla)5|t6!-Hlv8z27S=81TD&7bMR44o`WwicB(dtpQjhe+EJlPxla z;%R2x5yQ+H4t6Ee)_|IT_YZ_+YJ-~KS{u$YlZK|u513)j5I*064=iFubFX|rD>)Zu zU!1ks>B5F377Id&>XzaVN~B=wOmfa|6|SM*_dU>0U3%H2GRANBcH z0bTzO(@dk5{;>JJli08(K6JisIvX|?yytw_eBX37pgL+D`LOvu+W5aAoQ#KGd>=O7 z$Fj_6f~*Jjk40nuK5VY;S=gZNV<;CtZQO3$-vu~hT$blJbYkRquU-opeSm0e3C3)2 z-$Gfs_c1BQ-)Z>a_0)*>=;{8}MftJ`LB1b0^c==+Tvr@I4laC34C z7r$}d8ocT9_K_JYu6ylY4$Pb^KV{yseMja;FTN9

bBxoGi=7!}>Pzp8uwWZ4<# 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

m{&+$n(_Tju! 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

    YWYQXESYbY$J@213FbIs>Gcbj-MVnW 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

    3yLPD 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

    X1F(_qOuy3pP+`#EP$CJ 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

    szu}S=V?L^N;9Wa!liOr%&8_BrHjHm}Ab% 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⩔em!NJx^jyvB#6s6I`ZGjoE+;F66KcdQwgn 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