From 43e901121dba6188930f7881c8a2d40d0f939b83 Mon Sep 17 00:00:00 2001 From: sagudev Date: Thu, 8 Apr 2021 15:11:07 +0200 Subject: [PATCH 1/2] init wasm --- native/wdecryptor.cc | 29 + .../include/crypto/__DECC_INCLUDE_EPILOGUE.H | 16 + .../include/crypto/__DECC_INCLUDE_PROLOGUE.H | 20 + openssl-wasm/include/crypto/aria.h | 50 + openssl-wasm/include/crypto/asn1.h | 113 + openssl-wasm/include/crypto/async.h | 15 + openssl-wasm/include/crypto/bn.h | 90 + openssl-wasm/include/crypto/bn_conf.h | 28 + openssl-wasm/include/crypto/bn_conf.h.in | 27 + openssl-wasm/include/crypto/bn_dh.h | 24 + openssl-wasm/include/crypto/bn_srp.h | 32 + openssl-wasm/include/crypto/chacha.h | 42 + openssl-wasm/include/crypto/cryptlib.h | 35 + openssl-wasm/include/crypto/ctype.h | 82 + openssl-wasm/include/crypto/dso_conf.h | 17 + openssl-wasm/include/crypto/dso_conf.h.in | 31 + openssl-wasm/include/crypto/ec.h | 53 + openssl-wasm/include/crypto/engine.h | 20 + openssl-wasm/include/crypto/err.h | 19 + openssl-wasm/include/crypto/evp.h | 442 ++ openssl-wasm/include/crypto/lhash.h | 15 + openssl-wasm/include/crypto/md32_common.h | 256 + openssl-wasm/include/crypto/objects.h | 12 + openssl-wasm/include/crypto/poly1305.h | 21 + openssl-wasm/include/crypto/rand.h | 134 + openssl-wasm/include/crypto/sha.h | 19 + openssl-wasm/include/crypto/siphash.h | 25 + openssl-wasm/include/crypto/sm2.h | 78 + openssl-wasm/include/crypto/sm2err.h | 65 + openssl-wasm/include/crypto/sm3.h | 39 + openssl-wasm/include/crypto/sm4.h | 37 + openssl-wasm/include/crypto/store.h | 28 + openssl-wasm/include/crypto/x509.h | 286 + .../internal/__DECC_INCLUDE_EPILOGUE.H | 16 + .../internal/__DECC_INCLUDE_PROLOGUE.H | 20 + openssl-wasm/include/internal/bio.h | 33 + openssl-wasm/include/internal/comp.h | 12 + openssl-wasm/include/internal/conf.h | 30 + openssl-wasm/include/internal/constant_time.h | 387 ++ openssl-wasm/include/internal/cryptlib.h | 99 + openssl-wasm/include/internal/dane.h | 103 + openssl-wasm/include/internal/dso.h | 165 + openssl-wasm/include/internal/dsoerr.h | 82 + openssl-wasm/include/internal/err.h | 15 + openssl-wasm/include/internal/nelem.h | 14 + openssl-wasm/include/internal/numbers.h | 68 + openssl-wasm/include/internal/o_dir.h | 52 + openssl-wasm/include/internal/o_str.h | 17 + openssl-wasm/include/internal/refcount.h | 150 + openssl-wasm/include/internal/sockets.h | 155 + openssl-wasm/include/internal/sslconf.h | 20 + openssl-wasm/include/internal/thread_once.h | 137 + openssl-wasm/include/internal/tsan_assist.h | 144 + .../include/openssl/__DECC_INCLUDE_EPILOGUE.H | 22 + .../include/openssl/__DECC_INCLUDE_PROLOGUE.H | 26 + openssl-wasm/include/openssl/aes.h | 92 + openssl-wasm/include/openssl/asn1.h | 886 +++ openssl-wasm/include/openssl/asn1_mac.h | 10 + openssl-wasm/include/openssl/asn1err.h | 256 + openssl-wasm/include/openssl/asn1t.h | 945 +++ openssl-wasm/include/openssl/async.h | 76 + openssl-wasm/include/openssl/asyncerr.h | 42 + openssl-wasm/include/openssl/bio.h | 801 +++ openssl-wasm/include/openssl/bioerr.h | 124 + openssl-wasm/include/openssl/blowfish.h | 61 + openssl-wasm/include/openssl/bn.h | 539 ++ openssl-wasm/include/openssl/bnerr.h | 100 + openssl-wasm/include/openssl/buffer.h | 58 + openssl-wasm/include/openssl/buffererr.h | 34 + openssl-wasm/include/openssl/camellia.h | 83 + openssl-wasm/include/openssl/cast.h | 53 + openssl-wasm/include/openssl/cmac.h | 41 + openssl-wasm/include/openssl/cms.h | 339 ++ openssl-wasm/include/openssl/cmserr.h | 202 + openssl-wasm/include/openssl/comp.h | 53 + openssl-wasm/include/openssl/comperr.h | 44 + openssl-wasm/include/openssl/conf.h | 168 + openssl-wasm/include/openssl/conf_api.h | 40 + openssl-wasm/include/openssl/conferr.h | 76 + openssl-wasm/include/openssl/crypto.h | 445 ++ openssl-wasm/include/openssl/cryptoerr.h | 57 + openssl-wasm/include/openssl/ct.h | 474 ++ openssl-wasm/include/openssl/cterr.h | 80 + openssl-wasm/include/openssl/des.h | 174 + openssl-wasm/include/openssl/dh.h | 340 ++ openssl-wasm/include/openssl/dherr.h | 88 + openssl-wasm/include/openssl/dsa.h | 244 + openssl-wasm/include/openssl/dsaerr.h | 72 + openssl-wasm/include/openssl/dtls1.h | 55 + openssl-wasm/include/openssl/e_os2.h | 300 + openssl-wasm/include/openssl/ebcdic.h | 33 + openssl-wasm/include/openssl/ec.h | 1481 +++++ openssl-wasm/include/openssl/ecdh.h | 10 + openssl-wasm/include/openssl/ecdsa.h | 10 + openssl-wasm/include/openssl/ecerr.h | 276 + openssl-wasm/include/openssl/engine.h | 751 +++ openssl-wasm/include/openssl/engineerr.h | 111 + openssl-wasm/include/openssl/err.h | 274 + openssl-wasm/include/openssl/evp.h | 1666 ++++++ openssl-wasm/include/openssl/evperr.h | 204 + openssl-wasm/include/openssl/hmac.h | 51 + openssl-wasm/include/openssl/idea.h | 64 + openssl-wasm/include/openssl/kdf.h | 97 + openssl-wasm/include/openssl/kdferr.h | 55 + openssl-wasm/include/openssl/lhash.h | 241 + openssl-wasm/include/openssl/md2.h | 44 + openssl-wasm/include/openssl/md4.h | 51 + openssl-wasm/include/openssl/md5.h | 50 + openssl-wasm/include/openssl/mdc2.h | 42 + openssl-wasm/include/openssl/modes.h | 208 + openssl-wasm/include/openssl/obj_mac.h | 5198 +++++++++++++++++ openssl-wasm/include/openssl/objects.h | 175 + openssl-wasm/include/openssl/objectserr.h | 42 + openssl-wasm/include/openssl/ocsp.h | 352 ++ openssl-wasm/include/openssl/ocsperr.h | 78 + openssl-wasm/include/openssl/opensslconf.h | 200 + openssl-wasm/include/openssl/opensslconf.h.in | 160 + openssl-wasm/include/openssl/opensslv.h | 101 + openssl-wasm/include/openssl/ossl_typ.h | 197 + openssl-wasm/include/openssl/pem.h | 378 ++ openssl-wasm/include/openssl/pem2.h | 13 + openssl-wasm/include/openssl/pemerr.h | 105 + openssl-wasm/include/openssl/pkcs12.h | 223 + openssl-wasm/include/openssl/pkcs12err.h | 81 + openssl-wasm/include/openssl/pkcs7.h | 319 + openssl-wasm/include/openssl/pkcs7err.h | 103 + openssl-wasm/include/openssl/rand.h | 77 + openssl-wasm/include/openssl/rand_drbg.h | 130 + openssl-wasm/include/openssl/randerr.h | 94 + openssl-wasm/include/openssl/rc2.h | 51 + openssl-wasm/include/openssl/rc4.h | 36 + openssl-wasm/include/openssl/rc5.h | 63 + openssl-wasm/include/openssl/ripemd.h | 47 + openssl-wasm/include/openssl/rsa.h | 513 ++ openssl-wasm/include/openssl/rsaerr.h | 167 + openssl-wasm/include/openssl/safestack.h | 207 + openssl-wasm/include/openssl/seed.h | 96 + openssl-wasm/include/openssl/sha.h | 119 + openssl-wasm/include/openssl/srp.h | 135 + openssl-wasm/include/openssl/srtp.h | 50 + openssl-wasm/include/openssl/ssl.h | 2438 ++++++++ openssl-wasm/include/openssl/ssl2.h | 24 + openssl-wasm/include/openssl/ssl3.h | 342 ++ openssl-wasm/include/openssl/sslerr.h | 773 +++ openssl-wasm/include/openssl/stack.h | 83 + openssl-wasm/include/openssl/store.h | 266 + openssl-wasm/include/openssl/storeerr.h | 91 + openssl-wasm/include/openssl/symhacks.h | 37 + openssl-wasm/include/openssl/tls1.h | 1237 ++++ openssl-wasm/include/openssl/ts.h | 559 ++ openssl-wasm/include/openssl/tserr.h | 132 + openssl-wasm/include/openssl/txt_db.h | 57 + openssl-wasm/include/openssl/ui.h | 368 ++ openssl-wasm/include/openssl/uierr.h | 65 + openssl-wasm/include/openssl/whrlpool.h | 48 + openssl-wasm/include/openssl/x509.h | 1050 ++++ openssl-wasm/include/openssl/x509_vfy.h | 632 ++ openssl-wasm/include/openssl/x509err.h | 129 + openssl-wasm/include/openssl/x509v3.h | 938 +++ openssl-wasm/include/openssl/x509v3err.h | 162 + openssl-wasm/lib/libcrypto.a | Bin 0 -> 3084270 bytes openssl-wasm/lib/libssl.a | Bin 0 -> 666736 bytes openssl.sh | 19 + package.json | 3 +- wdecryptor.js | 1 + wdecryptor.wasm | Bin 0 -> 35944 bytes 166 files changed, 36101 insertions(+), 1 deletion(-) create mode 100644 native/wdecryptor.cc create mode 100644 openssl-wasm/include/crypto/__DECC_INCLUDE_EPILOGUE.H create mode 100644 openssl-wasm/include/crypto/__DECC_INCLUDE_PROLOGUE.H create mode 100644 openssl-wasm/include/crypto/aria.h create mode 100644 openssl-wasm/include/crypto/asn1.h create mode 100644 openssl-wasm/include/crypto/async.h create mode 100644 openssl-wasm/include/crypto/bn.h create mode 100644 openssl-wasm/include/crypto/bn_conf.h create mode 100644 openssl-wasm/include/crypto/bn_conf.h.in create mode 100644 openssl-wasm/include/crypto/bn_dh.h create mode 100644 openssl-wasm/include/crypto/bn_srp.h create mode 100644 openssl-wasm/include/crypto/chacha.h create mode 100644 openssl-wasm/include/crypto/cryptlib.h create mode 100644 openssl-wasm/include/crypto/ctype.h create mode 100644 openssl-wasm/include/crypto/dso_conf.h create mode 100644 openssl-wasm/include/crypto/dso_conf.h.in create mode 100644 openssl-wasm/include/crypto/ec.h create mode 100644 openssl-wasm/include/crypto/engine.h create mode 100644 openssl-wasm/include/crypto/err.h create mode 100644 openssl-wasm/include/crypto/evp.h create mode 100644 openssl-wasm/include/crypto/lhash.h create mode 100644 openssl-wasm/include/crypto/md32_common.h create mode 100644 openssl-wasm/include/crypto/objects.h create mode 100644 openssl-wasm/include/crypto/poly1305.h create mode 100644 openssl-wasm/include/crypto/rand.h create mode 100644 openssl-wasm/include/crypto/sha.h create mode 100644 openssl-wasm/include/crypto/siphash.h create mode 100644 openssl-wasm/include/crypto/sm2.h create mode 100644 openssl-wasm/include/crypto/sm2err.h create mode 100644 openssl-wasm/include/crypto/sm3.h create mode 100644 openssl-wasm/include/crypto/sm4.h create mode 100644 openssl-wasm/include/crypto/store.h create mode 100644 openssl-wasm/include/crypto/x509.h create mode 100644 openssl-wasm/include/internal/__DECC_INCLUDE_EPILOGUE.H create mode 100644 openssl-wasm/include/internal/__DECC_INCLUDE_PROLOGUE.H create mode 100644 openssl-wasm/include/internal/bio.h create mode 100644 openssl-wasm/include/internal/comp.h create mode 100644 openssl-wasm/include/internal/conf.h create mode 100644 openssl-wasm/include/internal/constant_time.h create mode 100644 openssl-wasm/include/internal/cryptlib.h create mode 100644 openssl-wasm/include/internal/dane.h create mode 100644 openssl-wasm/include/internal/dso.h create mode 100644 openssl-wasm/include/internal/dsoerr.h create mode 100644 openssl-wasm/include/internal/err.h create mode 100644 openssl-wasm/include/internal/nelem.h create mode 100644 openssl-wasm/include/internal/numbers.h create mode 100644 openssl-wasm/include/internal/o_dir.h create mode 100644 openssl-wasm/include/internal/o_str.h create mode 100644 openssl-wasm/include/internal/refcount.h create mode 100644 openssl-wasm/include/internal/sockets.h create mode 100644 openssl-wasm/include/internal/sslconf.h create mode 100644 openssl-wasm/include/internal/thread_once.h create mode 100644 openssl-wasm/include/internal/tsan_assist.h create mode 100644 openssl-wasm/include/openssl/__DECC_INCLUDE_EPILOGUE.H create mode 100644 openssl-wasm/include/openssl/__DECC_INCLUDE_PROLOGUE.H create mode 100644 openssl-wasm/include/openssl/aes.h create mode 100644 openssl-wasm/include/openssl/asn1.h create mode 100644 openssl-wasm/include/openssl/asn1_mac.h create mode 100644 openssl-wasm/include/openssl/asn1err.h create mode 100644 openssl-wasm/include/openssl/asn1t.h create mode 100644 openssl-wasm/include/openssl/async.h create mode 100644 openssl-wasm/include/openssl/asyncerr.h create mode 100644 openssl-wasm/include/openssl/bio.h create mode 100644 openssl-wasm/include/openssl/bioerr.h create mode 100644 openssl-wasm/include/openssl/blowfish.h create mode 100644 openssl-wasm/include/openssl/bn.h create mode 100644 openssl-wasm/include/openssl/bnerr.h create mode 100644 openssl-wasm/include/openssl/buffer.h create mode 100644 openssl-wasm/include/openssl/buffererr.h create mode 100644 openssl-wasm/include/openssl/camellia.h create mode 100644 openssl-wasm/include/openssl/cast.h create mode 100644 openssl-wasm/include/openssl/cmac.h create mode 100644 openssl-wasm/include/openssl/cms.h create mode 100644 openssl-wasm/include/openssl/cmserr.h create mode 100644 openssl-wasm/include/openssl/comp.h create mode 100644 openssl-wasm/include/openssl/comperr.h create mode 100644 openssl-wasm/include/openssl/conf.h create mode 100644 openssl-wasm/include/openssl/conf_api.h create mode 100644 openssl-wasm/include/openssl/conferr.h create mode 100644 openssl-wasm/include/openssl/crypto.h create mode 100644 openssl-wasm/include/openssl/cryptoerr.h create mode 100644 openssl-wasm/include/openssl/ct.h create mode 100644 openssl-wasm/include/openssl/cterr.h create mode 100644 openssl-wasm/include/openssl/des.h create mode 100644 openssl-wasm/include/openssl/dh.h create mode 100644 openssl-wasm/include/openssl/dherr.h create mode 100644 openssl-wasm/include/openssl/dsa.h create mode 100644 openssl-wasm/include/openssl/dsaerr.h create mode 100644 openssl-wasm/include/openssl/dtls1.h create mode 100644 openssl-wasm/include/openssl/e_os2.h create mode 100644 openssl-wasm/include/openssl/ebcdic.h create mode 100644 openssl-wasm/include/openssl/ec.h create mode 100644 openssl-wasm/include/openssl/ecdh.h create mode 100644 openssl-wasm/include/openssl/ecdsa.h create mode 100644 openssl-wasm/include/openssl/ecerr.h create mode 100644 openssl-wasm/include/openssl/engine.h create mode 100644 openssl-wasm/include/openssl/engineerr.h create mode 100644 openssl-wasm/include/openssl/err.h create mode 100644 openssl-wasm/include/openssl/evp.h create mode 100644 openssl-wasm/include/openssl/evperr.h create mode 100644 openssl-wasm/include/openssl/hmac.h create mode 100644 openssl-wasm/include/openssl/idea.h create mode 100644 openssl-wasm/include/openssl/kdf.h create mode 100644 openssl-wasm/include/openssl/kdferr.h create mode 100644 openssl-wasm/include/openssl/lhash.h create mode 100644 openssl-wasm/include/openssl/md2.h create mode 100644 openssl-wasm/include/openssl/md4.h create mode 100644 openssl-wasm/include/openssl/md5.h create mode 100644 openssl-wasm/include/openssl/mdc2.h create mode 100644 openssl-wasm/include/openssl/modes.h create mode 100644 openssl-wasm/include/openssl/obj_mac.h create mode 100644 openssl-wasm/include/openssl/objects.h create mode 100644 openssl-wasm/include/openssl/objectserr.h create mode 100644 openssl-wasm/include/openssl/ocsp.h create mode 100644 openssl-wasm/include/openssl/ocsperr.h create mode 100644 openssl-wasm/include/openssl/opensslconf.h create mode 100644 openssl-wasm/include/openssl/opensslconf.h.in create mode 100644 openssl-wasm/include/openssl/opensslv.h create mode 100644 openssl-wasm/include/openssl/ossl_typ.h create mode 100644 openssl-wasm/include/openssl/pem.h create mode 100644 openssl-wasm/include/openssl/pem2.h create mode 100644 openssl-wasm/include/openssl/pemerr.h create mode 100644 openssl-wasm/include/openssl/pkcs12.h create mode 100644 openssl-wasm/include/openssl/pkcs12err.h create mode 100644 openssl-wasm/include/openssl/pkcs7.h create mode 100644 openssl-wasm/include/openssl/pkcs7err.h create mode 100644 openssl-wasm/include/openssl/rand.h create mode 100644 openssl-wasm/include/openssl/rand_drbg.h create mode 100644 openssl-wasm/include/openssl/randerr.h create mode 100644 openssl-wasm/include/openssl/rc2.h create mode 100644 openssl-wasm/include/openssl/rc4.h create mode 100644 openssl-wasm/include/openssl/rc5.h create mode 100644 openssl-wasm/include/openssl/ripemd.h create mode 100644 openssl-wasm/include/openssl/rsa.h create mode 100644 openssl-wasm/include/openssl/rsaerr.h create mode 100644 openssl-wasm/include/openssl/safestack.h create mode 100644 openssl-wasm/include/openssl/seed.h create mode 100644 openssl-wasm/include/openssl/sha.h create mode 100644 openssl-wasm/include/openssl/srp.h create mode 100644 openssl-wasm/include/openssl/srtp.h create mode 100644 openssl-wasm/include/openssl/ssl.h create mode 100644 openssl-wasm/include/openssl/ssl2.h create mode 100644 openssl-wasm/include/openssl/ssl3.h create mode 100644 openssl-wasm/include/openssl/sslerr.h create mode 100644 openssl-wasm/include/openssl/stack.h create mode 100644 openssl-wasm/include/openssl/store.h create mode 100644 openssl-wasm/include/openssl/storeerr.h create mode 100644 openssl-wasm/include/openssl/symhacks.h create mode 100644 openssl-wasm/include/openssl/tls1.h create mode 100644 openssl-wasm/include/openssl/ts.h create mode 100644 openssl-wasm/include/openssl/tserr.h create mode 100644 openssl-wasm/include/openssl/txt_db.h create mode 100644 openssl-wasm/include/openssl/ui.h create mode 100644 openssl-wasm/include/openssl/uierr.h create mode 100644 openssl-wasm/include/openssl/whrlpool.h create mode 100644 openssl-wasm/include/openssl/x509.h create mode 100644 openssl-wasm/include/openssl/x509_vfy.h create mode 100644 openssl-wasm/include/openssl/x509err.h create mode 100644 openssl-wasm/include/openssl/x509v3.h create mode 100644 openssl-wasm/include/openssl/x509v3err.h create mode 100644 openssl-wasm/lib/libcrypto.a create mode 100644 openssl-wasm/lib/libssl.a create mode 100755 openssl.sh create mode 100644 wdecryptor.js create mode 100755 wdecryptor.wasm diff --git a/native/wdecryptor.cc b/native/wdecryptor.cc new file mode 100644 index 0000000..587f9e9 --- /dev/null +++ b/native/wdecryptor.cc @@ -0,0 +1,29 @@ +#include +#include "decryptor.h" +#include + +using namespace emscripten; + +std::string GetKey(char* trackId) { + char key[16]; + getKey(trackId, key); + return std::string(key, 16); +} + +void DecryptFile(char* decKey, const char* inputfn, const char* outputfn) { + decryptFile(decKey, inputfn, outputfn); + return; +} + +unsigned char* DecryptBuffer(char* decKey, long arrlen, unsigned char* buffer, unsigned char* output) { + unsigned char* decrypted = new unsigned char[arrlen]; + decryptBytes(decKey, arrlen, buffer, decrypted); + + return decrypted; +} + +EMSCRIPTEN_BINDINGS(decryptor) { + function("getKey", &GetKey, allow_raw_pointers()); + function("decryptFile", &DecryptFile, allow_raw_pointers()); + function("decryptBuffer", &DecryptBuffer, allow_raw_pointers()); +} \ No newline at end of file diff --git a/openssl-wasm/include/crypto/__DECC_INCLUDE_EPILOGUE.H b/openssl-wasm/include/crypto/__DECC_INCLUDE_EPILOGUE.H new file mode 100644 index 0000000..c350018 --- /dev/null +++ b/openssl-wasm/include/crypto/__DECC_INCLUDE_EPILOGUE.H @@ -0,0 +1,16 @@ +/* + * Copyright 2016 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* + * This file is only used by HP C on VMS, and is included automatically + * after each header file from this directory + */ + +/* restore state. Must correspond to the save in __decc_include_prologue.h */ +#pragma names restore diff --git a/openssl-wasm/include/crypto/__DECC_INCLUDE_PROLOGUE.H b/openssl-wasm/include/crypto/__DECC_INCLUDE_PROLOGUE.H new file mode 100644 index 0000000..9a9c777 --- /dev/null +++ b/openssl-wasm/include/crypto/__DECC_INCLUDE_PROLOGUE.H @@ -0,0 +1,20 @@ +/* + * Copyright 2016 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* + * This file is only used by HP C on VMS, and is included automatically + * after each header file from this directory + */ + +/* save state */ +#pragma names save +/* have the compiler shorten symbols larger than 31 chars to 23 chars + * followed by a 8 hex char CRC + */ +#pragma names as_is,shortened diff --git a/openssl-wasm/include/crypto/aria.h b/openssl-wasm/include/crypto/aria.h new file mode 100644 index 0000000..03a6295 --- /dev/null +++ b/openssl-wasm/include/crypto/aria.h @@ -0,0 +1,50 @@ +/* + * Copyright 2006-2018 The OpenSSL Project Authors. All Rights Reserved. + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + + /* Copyright (c) 2017 National Security Research Institute. All rights reserved. */ + +#ifndef OSSL_CRYPTO_ARIA_H +# define OSSL_CRYPTO_ARIA_H + +# include + +# ifdef OPENSSL_NO_ARIA +# error ARIA is disabled. +# endif + +# define ARIA_ENCRYPT 1 +# define ARIA_DECRYPT 0 + +# define ARIA_BLOCK_SIZE 16 /* Size of each encryption/decryption block */ +# define ARIA_MAX_KEYS 17 /* Number of keys needed in the worst case */ + +typedef union { + unsigned char c[ARIA_BLOCK_SIZE]; + unsigned int u[ARIA_BLOCK_SIZE / sizeof(unsigned int)]; +} ARIA_u128; + +typedef unsigned char ARIA_c128[ARIA_BLOCK_SIZE]; + +struct aria_key_st { + ARIA_u128 rd_key[ARIA_MAX_KEYS]; + unsigned int rounds; +}; +typedef struct aria_key_st ARIA_KEY; + + +int aria_set_encrypt_key(const unsigned char *userKey, const int bits, + ARIA_KEY *key); +int aria_set_decrypt_key(const unsigned char *userKey, const int bits, + ARIA_KEY *key); + +void aria_encrypt(const unsigned char *in, unsigned char *out, + const ARIA_KEY *key); + +#endif diff --git a/openssl-wasm/include/crypto/asn1.h b/openssl-wasm/include/crypto/asn1.h new file mode 100644 index 0000000..9c9b4d8 --- /dev/null +++ b/openssl-wasm/include/crypto/asn1.h @@ -0,0 +1,113 @@ +/* + * Copyright 2015-2018 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* Internal ASN1 structures and functions: not for application use */ + +/* ASN1 public key method structure */ + +struct evp_pkey_asn1_method_st { + int pkey_id; + int pkey_base_id; + unsigned long pkey_flags; + char *pem_str; + char *info; + 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 (*priv_decode) (EVP_PKEY *pk, const 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); + int (*pkey_size) (const EVP_PKEY *pk); + int (*pkey_bits) (const EVP_PKEY *pk); + int (*pkey_security_bits) (const EVP_PKEY *pk); + 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); + int (*sig_print) (BIO *out, + const X509_ALGOR *sigalg, const ASN1_STRING *sig, + int indent, ASN1_PCTX *pctx); + void (*pkey_free) (EVP_PKEY *pkey); + int (*pkey_ctrl) (EVP_PKEY *pkey, int op, long arg1, void *arg2); + /* Legacy functions for old PEM */ + int (*old_priv_decode) (EVP_PKEY *pkey, + const unsigned char **pder, int derlen); + int (*old_priv_encode) (const EVP_PKEY *pkey, unsigned char **pder); + /* Custom ASN1 signature verification */ + int (*item_verify) (EVP_MD_CTX *ctx, const ASN1_ITEM *it, void *asn, + X509_ALGOR *a, ASN1_BIT_STRING *sig, EVP_PKEY *pkey); + int (*item_sign) (EVP_MD_CTX *ctx, const ASN1_ITEM *it, void *asn, + X509_ALGOR *alg1, X509_ALGOR *alg2, + ASN1_BIT_STRING *sig); + int (*siginf_set) (X509_SIG_INFO *siginf, const X509_ALGOR *alg, + const ASN1_STRING *sig); + /* Check */ + int (*pkey_check) (const EVP_PKEY *pk); + int (*pkey_public_check) (const EVP_PKEY *pk); + int (*pkey_param_check) (const EVP_PKEY *pk); + /* Get/set raw private/public key data */ + int (*set_priv_key) (EVP_PKEY *pk, const unsigned char *priv, size_t len); + int (*set_pub_key) (EVP_PKEY *pk, const unsigned char *pub, size_t len); + int (*get_priv_key) (const EVP_PKEY *pk, unsigned char *priv, size_t *len); + int (*get_pub_key) (const EVP_PKEY *pk, unsigned char *pub, size_t *len); +} /* EVP_PKEY_ASN1_METHOD */ ; + +DEFINE_STACK_OF_CONST(EVP_PKEY_ASN1_METHOD) + +extern const EVP_PKEY_ASN1_METHOD cmac_asn1_meth; +extern const EVP_PKEY_ASN1_METHOD dh_asn1_meth; +extern const EVP_PKEY_ASN1_METHOD dhx_asn1_meth; +extern const EVP_PKEY_ASN1_METHOD dsa_asn1_meths[5]; +extern const EVP_PKEY_ASN1_METHOD eckey_asn1_meth; +extern const EVP_PKEY_ASN1_METHOD ecx25519_asn1_meth; +extern const EVP_PKEY_ASN1_METHOD ecx448_asn1_meth; +extern const EVP_PKEY_ASN1_METHOD ed25519_asn1_meth; +extern const EVP_PKEY_ASN1_METHOD ed448_asn1_meth; +extern const EVP_PKEY_ASN1_METHOD sm2_asn1_meth; +extern const EVP_PKEY_ASN1_METHOD poly1305_asn1_meth; + +extern const EVP_PKEY_ASN1_METHOD hmac_asn1_meth; +extern const EVP_PKEY_ASN1_METHOD rsa_asn1_meths[2]; +extern const EVP_PKEY_ASN1_METHOD rsa_pss_asn1_meth; +extern const EVP_PKEY_ASN1_METHOD siphash_asn1_meth; + +/* + * These are used internally in the ASN1_OBJECT to keep track of whether the + * names and data need to be free()ed + */ +# define ASN1_OBJECT_FLAG_DYNAMIC 0x01/* internal use */ +# define ASN1_OBJECT_FLAG_CRITICAL 0x02/* critical x509v3 object id */ +# define ASN1_OBJECT_FLAG_DYNAMIC_STRINGS 0x04/* internal use */ +# define ASN1_OBJECT_FLAG_DYNAMIC_DATA 0x08/* internal use */ +struct asn1_object_st { + const char *sn, *ln; + int nid; + int length; + const unsigned char *data; /* data remains const after init */ + int flags; /* Should we free this one */ +}; + +/* ASN1 print context structure */ + +struct asn1_pctx_st { + unsigned long flags; + unsigned long nm_flags; + unsigned long cert_flags; + unsigned long oid_flags; + unsigned long str_flags; +} /* ASN1_PCTX */ ; + +int asn1_d2i_read_bio(BIO *in, BUF_MEM **pb); diff --git a/openssl-wasm/include/crypto/async.h b/openssl-wasm/include/crypto/async.h new file mode 100644 index 0000000..dc8e937 --- /dev/null +++ b/openssl-wasm/include/crypto/async.h @@ -0,0 +1,15 @@ +/* + * Copyright 2016-2018 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include + +int async_init(void); +void async_deinit(void); +void async_delete_thread_state(void); + diff --git a/openssl-wasm/include/crypto/bn.h b/openssl-wasm/include/crypto/bn.h new file mode 100644 index 0000000..60afda1 --- /dev/null +++ b/openssl-wasm/include/crypto/bn.h @@ -0,0 +1,90 @@ +/* + * Copyright 2014-2018 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OSSL_CRYPTO_BN_H +# define OSSL_CRYPTO_BN_H + +# include +# include + +BIGNUM *bn_wexpand(BIGNUM *a, int words); +BIGNUM *bn_expand2(BIGNUM *a, int words); + +void bn_correct_top(BIGNUM *a); + +/* + * Determine the modified width-(w+1) Non-Adjacent Form (wNAF) of 'scalar'. + * This is an array r[] of values that are either zero or odd with an + * absolute value less than 2^w satisfying scalar = \sum_j r[j]*2^j where at + * most one of any w+1 consecutive digits is non-zero with the exception that + * the most significant digit may be only w-1 zeros away from that next + * non-zero digit. + */ +signed char *bn_compute_wNAF(const BIGNUM *scalar, int w, size_t *ret_len); + +int bn_get_top(const BIGNUM *a); + +int bn_get_dmax(const BIGNUM *a); + +/* Set all words to zero */ +void bn_set_all_zero(BIGNUM *a); + +/* + * Copy the internal BIGNUM words into out which holds size elements (and size + * must be bigger than top) + */ +int bn_copy_words(BN_ULONG *out, const BIGNUM *in, int size); + +BN_ULONG *bn_get_words(const BIGNUM *a); + +/* + * Set the internal data words in a to point to words which contains size + * elements. The BN_FLG_STATIC_DATA flag is set + */ +void bn_set_static_words(BIGNUM *a, const BN_ULONG *words, int size); + +/* + * Copy words into the BIGNUM |a|, reallocating space as necessary. + * The negative flag of |a| is not modified. + * Returns 1 on success and 0 on failure. + */ +/* + * |num_words| is int because bn_expand2 takes an int. This is an internal + * function so we simply trust callers not to pass negative values. + */ +int bn_set_words(BIGNUM *a, const BN_ULONG *words, int num_words); + +/* + * Some BIGNUM functions assume most significant limb to be non-zero, which + * is customarily arranged by bn_correct_top. Output from below functions + * is not processed with bn_correct_top, and for this reason it may not be + * returned out of public API. It may only be passed internally into other + * functions known to support non-minimal or zero-padded BIGNUMs. Even + * though the goal is to facilitate constant-time-ness, not each subroutine + * is constant-time by itself. They all have pre-conditions, consult source + * code... + */ +int bn_mul_mont_fixed_top(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + BN_MONT_CTX *mont, BN_CTX *ctx); +int bn_to_mont_fixed_top(BIGNUM *r, const BIGNUM *a, BN_MONT_CTX *mont, + BN_CTX *ctx); +int bn_from_mont_fixed_top(BIGNUM *r, const BIGNUM *a, BN_MONT_CTX *mont, + BN_CTX *ctx); +int bn_mod_add_fixed_top(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + const BIGNUM *m); +int bn_mod_sub_fixed_top(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + const BIGNUM *m); +int bn_mul_fixed_top(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx); +int bn_sqr_fixed_top(BIGNUM *r, const BIGNUM *a, BN_CTX *ctx); +int bn_lshift_fixed_top(BIGNUM *r, const BIGNUM *a, int n); +int bn_rshift_fixed_top(BIGNUM *r, const BIGNUM *a, int n); +int bn_div_fixed_top(BIGNUM *dv, BIGNUM *rem, const BIGNUM *m, + const BIGNUM *d, BN_CTX *ctx); + +#endif diff --git a/openssl-wasm/include/crypto/bn_conf.h b/openssl-wasm/include/crypto/bn_conf.h new file mode 100644 index 0000000..5312ef5 --- /dev/null +++ b/openssl-wasm/include/crypto/bn_conf.h @@ -0,0 +1,28 @@ +/* WARNING: do not edit! */ +/* Generated by Makefile from include/crypto/bn_conf.h.in */ +/* + * Copyright 2016 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OSSL_CRYPTO_BN_CONF_H +# define OSSL_CRYPTO_BN_CONF_H + +/* + * The contents of this file are not used in the UEFI build, as + * both 32-bit and 64-bit builds are supported from a single run + * of the Configure script. + */ + +/* Should we define BN_DIV2W here? */ + +/* Only one for the following should be defined */ +#define SIXTY_FOUR_BIT_LONG +#undef SIXTY_FOUR_BIT +#undef THIRTY_TWO_BIT + +#endif diff --git a/openssl-wasm/include/crypto/bn_conf.h.in b/openssl-wasm/include/crypto/bn_conf.h.in new file mode 100644 index 0000000..b6b9eb7 --- /dev/null +++ b/openssl-wasm/include/crypto/bn_conf.h.in @@ -0,0 +1,27 @@ +{- join("\n",map { "/* $_ */" } @autowarntext) -} +/* + * Copyright 2016 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OSSL_CRYPTO_BN_CONF_H +# define OSSL_CRYPTO_BN_CONF_H + +/* + * The contents of this file are not used in the UEFI build, as + * both 32-bit and 64-bit builds are supported from a single run + * of the Configure script. + */ + +/* Should we define BN_DIV2W here? */ + +/* Only one for the following should be defined */ +{- $config{b64l} ? "#define" : "#undef" -} SIXTY_FOUR_BIT_LONG +{- $config{b64} ? "#define" : "#undef" -} SIXTY_FOUR_BIT +{- $config{b32} ? "#define" : "#undef" -} THIRTY_TWO_BIT + +#endif diff --git a/openssl-wasm/include/crypto/bn_dh.h b/openssl-wasm/include/crypto/bn_dh.h new file mode 100644 index 0000000..70ebca2 --- /dev/null +++ b/openssl-wasm/include/crypto/bn_dh.h @@ -0,0 +1,24 @@ +/* + * Copyright 2015-2016 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#define declare_dh_bn(x) \ + extern const BIGNUM _bignum_dh##x##_p; \ + extern const BIGNUM _bignum_dh##x##_g; \ + extern const BIGNUM _bignum_dh##x##_q; + +declare_dh_bn(1024_160) +declare_dh_bn(2048_224) +declare_dh_bn(2048_256) + +extern const BIGNUM _bignum_ffdhe2048_p; +extern const BIGNUM _bignum_ffdhe3072_p; +extern const BIGNUM _bignum_ffdhe4096_p; +extern const BIGNUM _bignum_ffdhe6144_p; +extern const BIGNUM _bignum_ffdhe8192_p; +extern const BIGNUM _bignum_const_2; diff --git a/openssl-wasm/include/crypto/bn_srp.h b/openssl-wasm/include/crypto/bn_srp.h new file mode 100644 index 0000000..d4b282a --- /dev/null +++ b/openssl-wasm/include/crypto/bn_srp.h @@ -0,0 +1,32 @@ +/* + * Copyright 2014-2016 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_NO_SRP + +extern const BIGNUM bn_group_1024; + +extern const BIGNUM bn_group_1536; + +extern const BIGNUM bn_group_2048; + +extern const BIGNUM bn_group_3072; + +extern const BIGNUM bn_group_4096; + +extern const BIGNUM bn_group_6144; + +extern const BIGNUM bn_group_8192; + +extern const BIGNUM bn_generator_19; + +extern const BIGNUM bn_generator_5; + +extern const BIGNUM bn_generator_2; + +#endif diff --git a/openssl-wasm/include/crypto/chacha.h b/openssl-wasm/include/crypto/chacha.h new file mode 100644 index 0000000..4029400 --- /dev/null +++ b/openssl-wasm/include/crypto/chacha.h @@ -0,0 +1,42 @@ +/* + * Copyright 2015-2018 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OSSL_CRYPTO_CHACHA_H +#define OSSL_CRYPTO_CHACHA_H + +#include + +/* + * ChaCha20_ctr32 encrypts |len| bytes from |inp| with the given key and + * nonce and writes the result to |out|, which may be equal to |inp|. + * The |key| is not 32 bytes of verbatim key material though, but the + * said material collected into 8 32-bit elements array in host byte + * order. Same approach applies to nonce: the |counter| argument is + * pointer to concatenated nonce and counter values collected into 4 + * 32-bit elements. This, passing crypto material collected into 32-bit + * elements as opposite to passing verbatim byte vectors, is chosen for + * efficiency in multi-call scenarios. + */ +void ChaCha20_ctr32(unsigned char *out, const unsigned char *inp, + size_t len, const unsigned int key[8], + const unsigned int counter[4]); +/* + * You can notice that there is no key setup procedure. Because it's + * as trivial as collecting bytes into 32-bit elements, it's reckoned + * that below macro is sufficient. + */ +#define CHACHA_U8TOU32(p) ( \ + ((unsigned int)(p)[0]) | ((unsigned int)(p)[1]<<8) | \ + ((unsigned int)(p)[2]<<16) | ((unsigned int)(p)[3]<<24) ) + +#define CHACHA_KEY_SIZE 32 +#define CHACHA_CTR_SIZE 16 +#define CHACHA_BLK_SIZE 64 + +#endif diff --git a/openssl-wasm/include/crypto/cryptlib.h b/openssl-wasm/include/crypto/cryptlib.h new file mode 100644 index 0000000..38b5dac --- /dev/null +++ b/openssl-wasm/include/crypto/cryptlib.h @@ -0,0 +1,35 @@ +/* + * Copyright 2016-2018 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include "internal/cryptlib.h" + +/* This file is not scanned by mkdef.pl, whereas cryptlib.h is */ + +struct thread_local_inits_st { + int async; + int err_state; + int rand; +}; + +int ossl_init_thread_start(uint64_t opts); + +/* + * OPENSSL_INIT flags. The primary list of these is in crypto.h. Flags below + * are those omitted from crypto.h because they are "reserved for internal + * use". + */ +# define OPENSSL_INIT_ZLIB 0x00010000L +# define OPENSSL_INIT_BASE_ONLY 0x00040000L + +/* OPENSSL_INIT_THREAD flags */ +# define OPENSSL_INIT_THREAD_ASYNC 0x01 +# define OPENSSL_INIT_THREAD_ERR_STATE 0x02 +# define OPENSSL_INIT_THREAD_RAND 0x04 + +void ossl_malloc_setup_failures(void); diff --git a/openssl-wasm/include/crypto/ctype.h b/openssl-wasm/include/crypto/ctype.h new file mode 100644 index 0000000..81ef8f5 --- /dev/null +++ b/openssl-wasm/include/crypto/ctype.h @@ -0,0 +1,82 @@ +/* + * Copyright 2017-2019 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* + * This version of ctype.h provides a standardised and platform + * independent implementation that supports seven bit ASCII characters. + * The specific intent is to not pass extended ASCII characters (> 127) + * even if the host operating system would. + * + * There is EBCDIC support included for machines which use this. However, + * there are a number of concerns about how well EBCDIC is supported + * throughout the rest of the source code. Refer to issue #4154 for + * details. + */ +#ifndef OSSL_CRYPTO_CTYPE_H +# define OSSL_CRYPTO_CTYPE_H + +# define CTYPE_MASK_lower 0x1 +# define CTYPE_MASK_upper 0x2 +# define CTYPE_MASK_digit 0x4 +# define CTYPE_MASK_space 0x8 +# define CTYPE_MASK_xdigit 0x10 +# define CTYPE_MASK_blank 0x20 +# define CTYPE_MASK_cntrl 0x40 +# define CTYPE_MASK_graph 0x80 +# define CTYPE_MASK_print 0x100 +# define CTYPE_MASK_punct 0x200 +# define CTYPE_MASK_base64 0x400 +# define CTYPE_MASK_asn1print 0x800 + +# define CTYPE_MASK_alpha (CTYPE_MASK_lower | CTYPE_MASK_upper) +# define CTYPE_MASK_alnum (CTYPE_MASK_alpha | CTYPE_MASK_digit) + +/* + * The ascii mask assumes that any other classification implies that + * the character is ASCII and that there are no ASCII characters + * that aren't in any of the classifications. + * + * This assumption holds at the moment, but it might not in the future. + */ +# define CTYPE_MASK_ascii (~0) + +# ifdef CHARSET_EBCDIC +int ossl_toascii(int c); +int ossl_fromascii(int c); +# else +# define ossl_toascii(c) (c) +# define ossl_fromascii(c) (c) +# endif +int ossl_ctype_check(int c, unsigned int mask); +int ossl_tolower(int c); +int ossl_toupper(int c); + +int ascii_isdigit(const char inchar); + +# define ossl_isalnum(c) (ossl_ctype_check((c), CTYPE_MASK_alnum)) +# define ossl_isalpha(c) (ossl_ctype_check((c), CTYPE_MASK_alpha)) +# ifdef CHARSET_EBCDIC +# define ossl_isascii(c) (ossl_ctype_check((c), CTYPE_MASK_ascii)) +# else +# define ossl_isascii(c) (((c) & ~127) == 0) +# endif +# define ossl_isblank(c) (ossl_ctype_check((c), CTYPE_MASK_blank)) +# define ossl_iscntrl(c) (ossl_ctype_check((c), CTYPE_MASK_cntrl)) +# define ossl_isdigit(c) (ossl_ctype_check((c), CTYPE_MASK_digit)) +# define ossl_isgraph(c) (ossl_ctype_check((c), CTYPE_MASK_graph)) +# define ossl_islower(c) (ossl_ctype_check((c), CTYPE_MASK_lower)) +# define ossl_isprint(c) (ossl_ctype_check((c), CTYPE_MASK_print)) +# define ossl_ispunct(c) (ossl_ctype_check((c), CTYPE_MASK_punct)) +# define ossl_isspace(c) (ossl_ctype_check((c), CTYPE_MASK_space)) +# define ossl_isupper(c) (ossl_ctype_check((c), CTYPE_MASK_upper)) +# define ossl_isxdigit(c) (ossl_ctype_check((c), CTYPE_MASK_xdigit)) +# define ossl_isbase64(c) (ossl_ctype_check((c), CTYPE_MASK_base64)) +# define ossl_isasn1print(c) (ossl_ctype_check((c), CTYPE_MASK_asn1print)) + +#endif diff --git a/openssl-wasm/include/crypto/dso_conf.h b/openssl-wasm/include/crypto/dso_conf.h new file mode 100644 index 0000000..4b1167c --- /dev/null +++ b/openssl-wasm/include/crypto/dso_conf.h @@ -0,0 +1,17 @@ +/* WARNING: do not edit! */ +/* Generated by Makefile from include/crypto/dso_conf.h.in */ +/* + * Copyright 2016-2019 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OSSL_CRYPTO_DSO_CONF_H +# define OSSL_CRYPTO_DSO_CONF_H +# define DSO_DLFCN +# define HAVE_DLFCN_H +# define DSO_EXTENSION ".so" +#endif diff --git a/openssl-wasm/include/crypto/dso_conf.h.in b/openssl-wasm/include/crypto/dso_conf.h.in new file mode 100644 index 0000000..57a09b1 --- /dev/null +++ b/openssl-wasm/include/crypto/dso_conf.h.in @@ -0,0 +1,31 @@ +{- join("\n",map { "/* $_ */" } @autowarntext) -} +/* + * Copyright 2016-2019 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OSSL_CRYPTO_DSO_CONF_H +# define OSSL_CRYPTO_DSO_CONF_H +{- # The DSO code currently always implements all functions so that no + # applications will have to worry about that from a compilation point + # of view. However, the "method"s may return zero unless that platform + # has support compiled in for them. Currently each method is enabled + # by a define "DSO_" ... we translate the "dso_scheme" config + # string entry into using the following logic; + my $scheme = $disabled{dso} ? undef : uc $target{dso_scheme}; + if (!$scheme) { + $scheme = "NONE"; + } + my @macros = ( "DSO_$scheme" ); + if ($scheme eq 'DLFCN') { + @macros = ( "DSO_DLFCN", "HAVE_DLFCN_H" ); + } elsif ($scheme eq "DLFCN_NO_H") { + @macros = ( "DSO_DLFCN" ); + } + join("\n", map { "# define $_" } @macros); -} +# define DSO_EXTENSION "{- $target{dso_extension} -}" +#endif diff --git a/openssl-wasm/include/crypto/ec.h b/openssl-wasm/include/crypto/ec.h new file mode 100644 index 0000000..fe52ae7 --- /dev/null +++ b/openssl-wasm/include/crypto/ec.h @@ -0,0 +1,53 @@ +/* + * Copyright 2018 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* Internal EC functions for other submodules: not for application use */ + +#ifndef OSSL_CRYPTO_EC_H +# define OSSL_CRYPTO_EC_H +# include + +# ifndef OPENSSL_NO_EC + +# include + +/*- + * Computes the multiplicative inverse of x in the range + * [1,EC_GROUP::order), where EC_GROUP::order is the cardinality of the + * subgroup generated by the generator G: + * + * res := x^(-1) (mod EC_GROUP::order). + * + * This function expects the following two conditions to hold: + * - the EC_GROUP order is prime, and + * - x is included in the range [1, EC_GROUP::order). + * + * This function returns 1 on success, 0 on error. + * + * If the EC_GROUP order is even, this function explicitly returns 0 as + * an error. + * In case any of the two conditions stated above is not satisfied, + * the correctness of its output is not guaranteed, even if the return + * value could still be 1 (as primality testing and a conditional modular + * reduction round on the input can be omitted by the underlying + * implementations for better SCA properties on regular input values). + */ +__owur int ec_group_do_inverse_ord(const EC_GROUP *group, BIGNUM *res, + const BIGNUM *x, BN_CTX *ctx); + +/*- + * ECDH Key Derivation Function as defined in ANSI X9.63 + */ +int ecdh_KDF_X9_63(unsigned char *out, size_t outlen, + const unsigned char *Z, size_t Zlen, + const unsigned char *sinfo, size_t sinfolen, + const EVP_MD *md); + +# endif /* OPENSSL_NO_EC */ +#endif diff --git a/openssl-wasm/include/crypto/engine.h b/openssl-wasm/include/crypto/engine.h new file mode 100644 index 0000000..f80ae3e --- /dev/null +++ b/openssl-wasm/include/crypto/engine.h @@ -0,0 +1,20 @@ +/* + * Copyright 2016 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include + +void engine_load_openssl_int(void); +void engine_load_devcrypto_int(void); +void engine_load_rdrand_int(void); +void engine_load_dynamic_int(void); +void engine_load_padlock_int(void); +void engine_load_capi_int(void); +void engine_load_dasync_int(void); +void engine_load_afalg_int(void); +void engine_cleanup_int(void); diff --git a/openssl-wasm/include/crypto/err.h b/openssl-wasm/include/crypto/err.h new file mode 100644 index 0000000..8ab0e5b --- /dev/null +++ b/openssl-wasm/include/crypto/err.h @@ -0,0 +1,19 @@ +/* + * Copyright 2016-2018 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OSSL_CRYPTO_ERR_H +# define OSSL_CRYPTO_ERR_H + +int err_load_crypto_strings_int(void); +void err_cleanup(void); +void err_delete_thread_state(void); +int err_shelve_state(void **); +void err_unshelve_state(void *); + +#endif diff --git a/openssl-wasm/include/crypto/evp.h b/openssl-wasm/include/crypto/evp.h new file mode 100644 index 0000000..d86aed3 --- /dev/null +++ b/openssl-wasm/include/crypto/evp.h @@ -0,0 +1,442 @@ +/* + * Copyright 2015-2018 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include +#include "internal/refcount.h" + +/* + * Don't free up md_ctx->pctx in EVP_MD_CTX_reset, use the reserved flag + * values in evp.h + */ +#define EVP_MD_CTX_FLAG_KEEP_PKEY_CTX 0x0400 + +struct evp_pkey_ctx_st { + /* Method associated with this operation */ + const EVP_PKEY_METHOD *pmeth; + /* Engine that implements this method or NULL if builtin */ + ENGINE *engine; + /* Key: may be NULL */ + EVP_PKEY *pkey; + /* Peer key for key agreement, may be NULL */ + EVP_PKEY *peerkey; + /* Actual operation */ + int operation; + /* Algorithm specific data */ + void *data; + /* Application specific data */ + void *app_data; + /* Keygen callback */ + EVP_PKEY_gen_cb *pkey_gencb; + /* implementation specific keygen data */ + int *keygen_info; + int keygen_info_count; +} /* EVP_PKEY_CTX */ ; + +#define EVP_PKEY_FLAG_DYNAMIC 1 + +struct evp_pkey_method_st { + int pkey_id; + int flags; + int (*init) (EVP_PKEY_CTX *ctx); + int (*copy) (EVP_PKEY_CTX *dst, EVP_PKEY_CTX *src); + void (*cleanup) (EVP_PKEY_CTX *ctx); + int (*paramgen_init) (EVP_PKEY_CTX *ctx); + int (*paramgen) (EVP_PKEY_CTX *ctx, EVP_PKEY *pkey); + int (*keygen_init) (EVP_PKEY_CTX *ctx); + int (*keygen) (EVP_PKEY_CTX *ctx, EVP_PKEY *pkey); + 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); + 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); + int (*verify_recover_init) (EVP_PKEY_CTX *ctx); + int (*verify_recover) (EVP_PKEY_CTX *ctx, + unsigned char *rout, size_t *routlen, + const unsigned char *sig, size_t siglen); + 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); + 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); + int (*encrypt_init) (EVP_PKEY_CTX *ctx); + int (*encrypt) (EVP_PKEY_CTX *ctx, unsigned char *out, size_t *outlen, + const unsigned char *in, size_t inlen); + 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); + int (*derive_init) (EVP_PKEY_CTX *ctx); + int (*derive) (EVP_PKEY_CTX *ctx, unsigned char *key, size_t *keylen); + 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); + int (*digestsign) (EVP_MD_CTX *ctx, unsigned char *sig, size_t *siglen, + const unsigned char *tbs, size_t tbslen); + int (*digestverify) (EVP_MD_CTX *ctx, const unsigned char *sig, + size_t siglen, const unsigned char *tbs, + size_t tbslen); + int (*check) (EVP_PKEY *pkey); + int (*public_check) (EVP_PKEY *pkey); + int (*param_check) (EVP_PKEY *pkey); + + int (*digest_custom) (EVP_PKEY_CTX *ctx, EVP_MD_CTX *mctx); +} /* EVP_PKEY_METHOD */ ; + +DEFINE_STACK_OF_CONST(EVP_PKEY_METHOD) + +void evp_pkey_set_cb_translate(BN_GENCB *cb, EVP_PKEY_CTX *ctx); + +extern const EVP_PKEY_METHOD cmac_pkey_meth; +extern const EVP_PKEY_METHOD dh_pkey_meth; +extern const EVP_PKEY_METHOD dhx_pkey_meth; +extern const EVP_PKEY_METHOD dsa_pkey_meth; +extern const EVP_PKEY_METHOD ec_pkey_meth; +extern const EVP_PKEY_METHOD sm2_pkey_meth; +extern const EVP_PKEY_METHOD ecx25519_pkey_meth; +extern const EVP_PKEY_METHOD ecx448_pkey_meth; +extern const EVP_PKEY_METHOD ed25519_pkey_meth; +extern const EVP_PKEY_METHOD ed448_pkey_meth; +extern const EVP_PKEY_METHOD hmac_pkey_meth; +extern const EVP_PKEY_METHOD rsa_pkey_meth; +extern const EVP_PKEY_METHOD rsa_pss_pkey_meth; +extern const EVP_PKEY_METHOD scrypt_pkey_meth; +extern const EVP_PKEY_METHOD tls1_prf_pkey_meth; +extern const EVP_PKEY_METHOD hkdf_pkey_meth; +extern const EVP_PKEY_METHOD poly1305_pkey_meth; +extern const EVP_PKEY_METHOD siphash_pkey_meth; + +struct evp_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); + 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 */ ; + +struct evp_cipher_st { + int nid; + int block_size; + /* Default value for variable length ciphers */ + int key_len; + int iv_len; + /* Various flags */ + unsigned long flags; + /* init key */ + int (*init) (EVP_CIPHER_CTX *ctx, const unsigned char *key, + const unsigned char *iv, int enc); + /* encrypt/decrypt data */ + int (*do_cipher) (EVP_CIPHER_CTX *ctx, unsigned char *out, + const unsigned char *in, size_t inl); + /* cleanup ctx */ + int (*cleanup) (EVP_CIPHER_CTX *); + /* how big ctx->cipher_data needs to be */ + int ctx_size; + /* Populate a ASN1_TYPE with parameters */ + int (*set_asn1_parameters) (EVP_CIPHER_CTX *, ASN1_TYPE *); + /* Get parameters from a ASN1_TYPE */ + int (*get_asn1_parameters) (EVP_CIPHER_CTX *, ASN1_TYPE *); + /* Miscellaneous operations */ + int (*ctrl) (EVP_CIPHER_CTX *, int type, int arg, void *ptr); + /* Application data */ + void *app_data; +} /* EVP_CIPHER */ ; + +/* Macros to code block cipher wrappers */ + +/* Wrapper functions for each cipher mode */ + +#define EVP_C_DATA(kstruct, ctx) \ + ((kstruct *)EVP_CIPHER_CTX_get_cipher_data(ctx)) + +#define BLOCK_CIPHER_ecb_loop() \ + size_t i, bl; \ + bl = EVP_CIPHER_CTX_cipher(ctx)->block_size; \ + if (inl < bl) return 1;\ + inl -= bl; \ + for (i=0; i <= inl; i+=bl) + +#define BLOCK_CIPHER_func_ecb(cname, cprefix, kstruct, ksched) \ +static int cname##_ecb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t inl) \ +{\ + BLOCK_CIPHER_ecb_loop() \ + cprefix##_ecb_encrypt(in + i, out + i, &EVP_C_DATA(kstruct,ctx)->ksched, EVP_CIPHER_CTX_encrypting(ctx)); \ + return 1;\ +} + +#define EVP_MAXCHUNK ((size_t)1<<(sizeof(long)*8-2)) + +#define BLOCK_CIPHER_func_ofb(cname, cprefix, cbits, kstruct, ksched) \ + static int cname##_ofb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t inl) \ +{\ + while(inl>=EVP_MAXCHUNK) {\ + int num = EVP_CIPHER_CTX_num(ctx);\ + cprefix##_ofb##cbits##_encrypt(in, out, (long)EVP_MAXCHUNK, &EVP_C_DATA(kstruct,ctx)->ksched, EVP_CIPHER_CTX_iv_noconst(ctx), &num); \ + EVP_CIPHER_CTX_set_num(ctx, num);\ + inl-=EVP_MAXCHUNK;\ + in +=EVP_MAXCHUNK;\ + out+=EVP_MAXCHUNK;\ + }\ + if (inl) {\ + int num = EVP_CIPHER_CTX_num(ctx);\ + cprefix##_ofb##cbits##_encrypt(in, out, (long)inl, &EVP_C_DATA(kstruct,ctx)->ksched, EVP_CIPHER_CTX_iv_noconst(ctx), &num); \ + EVP_CIPHER_CTX_set_num(ctx, num);\ + }\ + return 1;\ +} + +#define BLOCK_CIPHER_func_cbc(cname, cprefix, kstruct, ksched) \ +static int cname##_cbc_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t inl) \ +{\ + while(inl>=EVP_MAXCHUNK) \ + {\ + cprefix##_cbc_encrypt(in, out, (long)EVP_MAXCHUNK, &EVP_C_DATA(kstruct,ctx)->ksched, EVP_CIPHER_CTX_iv_noconst(ctx), EVP_CIPHER_CTX_encrypting(ctx));\ + inl-=EVP_MAXCHUNK;\ + in +=EVP_MAXCHUNK;\ + out+=EVP_MAXCHUNK;\ + }\ + if (inl)\ + cprefix##_cbc_encrypt(in, out, (long)inl, &EVP_C_DATA(kstruct,ctx)->ksched, EVP_CIPHER_CTX_iv_noconst(ctx), EVP_CIPHER_CTX_encrypting(ctx));\ + return 1;\ +} + +#define BLOCK_CIPHER_func_cfb(cname, cprefix, cbits, kstruct, ksched) \ +static int cname##_cfb##cbits##_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t inl) \ +{\ + size_t chunk = EVP_MAXCHUNK;\ + if (cbits == 1) chunk >>= 3;\ + if (inl < chunk) chunk = inl;\ + while (inl && inl >= chunk)\ + {\ + int num = EVP_CIPHER_CTX_num(ctx);\ + cprefix##_cfb##cbits##_encrypt(in, out, (long) \ + ((cbits == 1) \ + && !EVP_CIPHER_CTX_test_flags(ctx, EVP_CIPH_FLAG_LENGTH_BITS) \ + ? chunk*8 : chunk), \ + &EVP_C_DATA(kstruct, ctx)->ksched, EVP_CIPHER_CTX_iv_noconst(ctx),\ + &num, EVP_CIPHER_CTX_encrypting(ctx));\ + EVP_CIPHER_CTX_set_num(ctx, num);\ + inl -= chunk;\ + in += chunk;\ + out += chunk;\ + if (inl < chunk) chunk = inl;\ + }\ + return 1;\ +} + +#define BLOCK_CIPHER_all_funcs(cname, cprefix, cbits, kstruct, ksched) \ + BLOCK_CIPHER_func_cbc(cname, cprefix, kstruct, ksched) \ + BLOCK_CIPHER_func_cfb(cname, cprefix, cbits, kstruct, ksched) \ + BLOCK_CIPHER_func_ecb(cname, cprefix, kstruct, ksched) \ + BLOCK_CIPHER_func_ofb(cname, cprefix, cbits, kstruct, ksched) + +#define BLOCK_CIPHER_def1(cname, nmode, mode, MODE, kstruct, nid, block_size, \ + key_len, iv_len, flags, init_key, cleanup, \ + set_asn1, get_asn1, ctrl) \ +static const EVP_CIPHER cname##_##mode = { \ + nid##_##nmode, block_size, key_len, iv_len, \ + flags | EVP_CIPH_##MODE##_MODE, \ + init_key, \ + cname##_##mode##_cipher, \ + cleanup, \ + sizeof(kstruct), \ + set_asn1, get_asn1,\ + ctrl, \ + NULL \ +}; \ +const EVP_CIPHER *EVP_##cname##_##mode(void) { return &cname##_##mode; } + +#define BLOCK_CIPHER_def_cbc(cname, kstruct, nid, block_size, key_len, \ + iv_len, flags, init_key, cleanup, set_asn1, \ + get_asn1, ctrl) \ +BLOCK_CIPHER_def1(cname, cbc, cbc, CBC, kstruct, nid, block_size, key_len, \ + iv_len, flags, init_key, cleanup, set_asn1, get_asn1, ctrl) + +#define BLOCK_CIPHER_def_cfb(cname, kstruct, nid, key_len, \ + iv_len, cbits, flags, init_key, cleanup, \ + set_asn1, get_asn1, ctrl) \ +BLOCK_CIPHER_def1(cname, cfb##cbits, cfb##cbits, CFB, kstruct, nid, 1, \ + key_len, iv_len, flags, init_key, cleanup, set_asn1, \ + get_asn1, ctrl) + +#define BLOCK_CIPHER_def_ofb(cname, kstruct, nid, key_len, \ + iv_len, cbits, flags, init_key, cleanup, \ + set_asn1, get_asn1, ctrl) \ +BLOCK_CIPHER_def1(cname, ofb##cbits, ofb, OFB, kstruct, nid, 1, \ + key_len, iv_len, flags, init_key, cleanup, set_asn1, \ + get_asn1, ctrl) + +#define BLOCK_CIPHER_def_ecb(cname, kstruct, nid, block_size, key_len, \ + flags, init_key, cleanup, set_asn1, \ + get_asn1, ctrl) \ +BLOCK_CIPHER_def1(cname, ecb, ecb, ECB, kstruct, nid, block_size, key_len, \ + 0, flags, init_key, cleanup, set_asn1, get_asn1, ctrl) + +#define BLOCK_CIPHER_defs(cname, kstruct, \ + nid, block_size, key_len, iv_len, cbits, flags, \ + init_key, cleanup, set_asn1, get_asn1, ctrl) \ +BLOCK_CIPHER_def_cbc(cname, kstruct, nid, block_size, key_len, iv_len, flags, \ + init_key, cleanup, set_asn1, get_asn1, ctrl) \ +BLOCK_CIPHER_def_cfb(cname, kstruct, nid, key_len, iv_len, cbits, \ + flags, init_key, cleanup, set_asn1, get_asn1, ctrl) \ +BLOCK_CIPHER_def_ofb(cname, kstruct, nid, key_len, iv_len, cbits, \ + flags, init_key, cleanup, set_asn1, get_asn1, ctrl) \ +BLOCK_CIPHER_def_ecb(cname, kstruct, nid, block_size, key_len, flags, \ + init_key, cleanup, set_asn1, get_asn1, ctrl) + +/*- +#define BLOCK_CIPHER_defs(cname, kstruct, \ + nid, block_size, key_len, iv_len, flags,\ + init_key, cleanup, set_asn1, get_asn1, ctrl)\ +static const EVP_CIPHER cname##_cbc = {\ + nid##_cbc, block_size, key_len, iv_len, \ + flags | EVP_CIPH_CBC_MODE,\ + init_key,\ + cname##_cbc_cipher,\ + cleanup,\ + sizeof(EVP_CIPHER_CTX)-sizeof((((EVP_CIPHER_CTX *)NULL)->c))+\ + sizeof((((EVP_CIPHER_CTX *)NULL)->c.kstruct)),\ + set_asn1, get_asn1,\ + ctrl, \ + NULL \ +};\ +const EVP_CIPHER *EVP_##cname##_cbc(void) { return &cname##_cbc; }\ +static const EVP_CIPHER cname##_cfb = {\ + nid##_cfb64, 1, key_len, iv_len, \ + flags | EVP_CIPH_CFB_MODE,\ + init_key,\ + cname##_cfb_cipher,\ + cleanup,\ + sizeof(EVP_CIPHER_CTX)-sizeof((((EVP_CIPHER_CTX *)NULL)->c))+\ + sizeof((((EVP_CIPHER_CTX *)NULL)->c.kstruct)),\ + set_asn1, get_asn1,\ + ctrl,\ + NULL \ +};\ +const EVP_CIPHER *EVP_##cname##_cfb(void) { return &cname##_cfb; }\ +static const EVP_CIPHER cname##_ofb = {\ + nid##_ofb64, 1, key_len, iv_len, \ + flags | EVP_CIPH_OFB_MODE,\ + init_key,\ + cname##_ofb_cipher,\ + cleanup,\ + sizeof(EVP_CIPHER_CTX)-sizeof((((EVP_CIPHER_CTX *)NULL)->c))+\ + sizeof((((EVP_CIPHER_CTX *)NULL)->c.kstruct)),\ + set_asn1, get_asn1,\ + ctrl,\ + NULL \ +};\ +const EVP_CIPHER *EVP_##cname##_ofb(void) { return &cname##_ofb; }\ +static const EVP_CIPHER cname##_ecb = {\ + nid##_ecb, block_size, key_len, iv_len, \ + flags | EVP_CIPH_ECB_MODE,\ + init_key,\ + cname##_ecb_cipher,\ + cleanup,\ + sizeof(EVP_CIPHER_CTX)-sizeof((((EVP_CIPHER_CTX *)NULL)->c))+\ + sizeof((((EVP_CIPHER_CTX *)NULL)->c.kstruct)),\ + set_asn1, get_asn1,\ + ctrl,\ + NULL \ +};\ +const EVP_CIPHER *EVP_##cname##_ecb(void) { return &cname##_ecb; } +*/ + +#define IMPLEMENT_BLOCK_CIPHER(cname, ksched, cprefix, kstruct, nid, \ + block_size, key_len, iv_len, cbits, \ + flags, init_key, \ + cleanup, set_asn1, get_asn1, ctrl) \ + BLOCK_CIPHER_all_funcs(cname, cprefix, cbits, kstruct, ksched) \ + BLOCK_CIPHER_defs(cname, kstruct, nid, block_size, key_len, iv_len, \ + cbits, flags, init_key, cleanup, set_asn1, \ + get_asn1, ctrl) + +#define IMPLEMENT_CFBR(cipher,cprefix,kstruct,ksched,keysize,cbits,iv_len,fl) \ + BLOCK_CIPHER_func_cfb(cipher##_##keysize,cprefix,cbits,kstruct,ksched) \ + BLOCK_CIPHER_def_cfb(cipher##_##keysize,kstruct, \ + NID_##cipher##_##keysize, keysize/8, iv_len, cbits, \ + (fl)|EVP_CIPH_FLAG_DEFAULT_ASN1, \ + cipher##_init_key, NULL, NULL, NULL, NULL) + + +# ifndef OPENSSL_NO_EC + +#define X25519_KEYLEN 32 +#define X448_KEYLEN 56 +#define ED448_KEYLEN 57 + +#define MAX_KEYLEN ED448_KEYLEN + +typedef struct { + unsigned char pubkey[MAX_KEYLEN]; + unsigned char *privkey; +} ECX_KEY; + +#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; + CRYPTO_REF_COUNT references; + const EVP_PKEY_ASN1_METHOD *ameth; + ENGINE *engine; + ENGINE *pmeth_engine; /* If not NULL public key ENGINE to use */ + union { + void *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 */ + ECX_KEY *ecx; /* X25519, X448, Ed25519, Ed448 */ +# endif + } pkey; + int save_parameters; + STACK_OF(X509_ATTRIBUTE) *attributes; /* [ 0 ] */ + CRYPTO_RWLOCK *lock; +} /* EVP_PKEY */ ; + + +void openssl_add_all_ciphers_int(void); +void openssl_add_all_digests_int(void); +void evp_cleanup_int(void); +void evp_app_cleanup_int(void); + +/* Pulling defines out of C source files */ + +#define EVP_RC4_KEY_SIZE 16 +#ifndef TLS1_1_VERSION +# define TLS1_1_VERSION 0x0302 +#endif + +void evp_encode_ctx_set_flags(EVP_ENCODE_CTX *ctx, unsigned int flags); + +/* EVP_ENCODE_CTX flags */ +/* Don't generate new lines when encoding */ +#define EVP_ENCODE_CTX_NO_NEWLINES 1 +/* Use the SRP base64 alphabet instead of the standard one */ +#define EVP_ENCODE_CTX_USE_SRP_ALPHABET 2 diff --git a/openssl-wasm/include/crypto/lhash.h b/openssl-wasm/include/crypto/lhash.h new file mode 100644 index 0000000..ab060cc --- /dev/null +++ b/openssl-wasm/include/crypto/lhash.h @@ -0,0 +1,15 @@ +/* + * Copyright 2018 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OSSL_CRYPTO_LHASH_H +# define OSSL_CRYPTO_LHASH_H + +unsigned long openssl_lh_strcasehash(const char *); + +#endif diff --git a/openssl-wasm/include/crypto/md32_common.h b/openssl-wasm/include/crypto/md32_common.h new file mode 100644 index 0000000..1124e9c --- /dev/null +++ b/openssl-wasm/include/crypto/md32_common.h @@ -0,0 +1,256 @@ +/* + * Copyright 1999-2018 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/*- + * This is a generic 32 bit "collector" for message digest algorithms. + * Whenever needed it collects input character stream into chunks of + * 32 bit values and invokes a block function that performs actual hash + * calculations. + * + * Porting guide. + * + * Obligatory macros: + * + * DATA_ORDER_IS_BIG_ENDIAN or DATA_ORDER_IS_LITTLE_ENDIAN + * this macro defines byte order of input stream. + * HASH_CBLOCK + * size of a unit chunk HASH_BLOCK operates on. + * HASH_LONG + * has to be at least 32 bit wide. + * HASH_CTX + * context structure that at least contains following + * members: + * typedef struct { + * ... + * HASH_LONG Nl,Nh; + * either { + * HASH_LONG data[HASH_LBLOCK]; + * unsigned char data[HASH_CBLOCK]; + * }; + * unsigned int num; + * ... + * } HASH_CTX; + * data[] vector is expected to be zeroed upon first call to + * HASH_UPDATE. + * HASH_UPDATE + * name of "Update" function, implemented here. + * HASH_TRANSFORM + * name of "Transform" function, implemented here. + * HASH_FINAL + * name of "Final" function, implemented here. + * HASH_BLOCK_DATA_ORDER + * name of "block" function capable of treating *unaligned* input + * message in original (data) byte order, implemented externally. + * HASH_MAKE_STRING + * macro converting context variables to an ASCII hash string. + * + * MD5 example: + * + * #define DATA_ORDER_IS_LITTLE_ENDIAN + * + * #define HASH_LONG MD5_LONG + * #define HASH_CTX MD5_CTX + * #define HASH_CBLOCK MD5_CBLOCK + * #define HASH_UPDATE MD5_Update + * #define HASH_TRANSFORM MD5_Transform + * #define HASH_FINAL MD5_Final + * #define HASH_BLOCK_DATA_ORDER md5_block_data_order + */ + +#include + +#if !defined(DATA_ORDER_IS_BIG_ENDIAN) && !defined(DATA_ORDER_IS_LITTLE_ENDIAN) +# error "DATA_ORDER must be defined!" +#endif + +#ifndef HASH_CBLOCK +# error "HASH_CBLOCK must be defined!" +#endif +#ifndef HASH_LONG +# error "HASH_LONG must be defined!" +#endif +#ifndef HASH_CTX +# error "HASH_CTX must be defined!" +#endif + +#ifndef HASH_UPDATE +# error "HASH_UPDATE must be defined!" +#endif +#ifndef HASH_TRANSFORM +# error "HASH_TRANSFORM must be defined!" +#endif +#ifndef HASH_FINAL +# error "HASH_FINAL must be defined!" +#endif + +#ifndef HASH_BLOCK_DATA_ORDER +# error "HASH_BLOCK_DATA_ORDER must be defined!" +#endif + +#define ROTATE(a,n) (((a)<<(n))|(((a)&0xffffffff)>>(32-(n)))) + +#if defined(DATA_ORDER_IS_BIG_ENDIAN) + +# define HOST_c2l(c,l) (l =(((unsigned long)(*((c)++)))<<24), \ + l|=(((unsigned long)(*((c)++)))<<16), \ + l|=(((unsigned long)(*((c)++)))<< 8), \ + l|=(((unsigned long)(*((c)++))) ) ) +# define HOST_l2c(l,c) (*((c)++)=(unsigned char)(((l)>>24)&0xff), \ + *((c)++)=(unsigned char)(((l)>>16)&0xff), \ + *((c)++)=(unsigned char)(((l)>> 8)&0xff), \ + *((c)++)=(unsigned char)(((l) )&0xff), \ + l) + +#elif defined(DATA_ORDER_IS_LITTLE_ENDIAN) + +# define HOST_c2l(c,l) (l =(((unsigned long)(*((c)++))) ), \ + l|=(((unsigned long)(*((c)++)))<< 8), \ + l|=(((unsigned long)(*((c)++)))<<16), \ + l|=(((unsigned long)(*((c)++)))<<24) ) +# define HOST_l2c(l,c) (*((c)++)=(unsigned char)(((l) )&0xff), \ + *((c)++)=(unsigned char)(((l)>> 8)&0xff), \ + *((c)++)=(unsigned char)(((l)>>16)&0xff), \ + *((c)++)=(unsigned char)(((l)>>24)&0xff), \ + l) + +#endif + +/* + * Time for some action :-) + */ + +int HASH_UPDATE(HASH_CTX *c, const void *data_, size_t len) +{ + const unsigned char *data = data_; + unsigned char *p; + HASH_LONG l; + size_t n; + + if (len == 0) + return 1; + + l = (c->Nl + (((HASH_LONG) len) << 3)) & 0xffffffffUL; + if (l < c->Nl) /* overflow */ + c->Nh++; + c->Nh += (HASH_LONG) (len >> 29); /* might cause compiler warning on + * 16-bit */ + c->Nl = l; + + n = c->num; + if (n != 0) { + p = (unsigned char *)c->data; + + if (len >= HASH_CBLOCK || len + n >= HASH_CBLOCK) { + memcpy(p + n, data, HASH_CBLOCK - n); + HASH_BLOCK_DATA_ORDER(c, p, 1); + n = HASH_CBLOCK - n; + data += n; + len -= n; + c->num = 0; + /* + * We use memset rather than OPENSSL_cleanse() here deliberately. + * Using OPENSSL_cleanse() here could be a performance issue. It + * will get properly cleansed on finalisation so this isn't a + * security problem. + */ + memset(p, 0, HASH_CBLOCK); /* keep it zeroed */ + } else { + memcpy(p + n, data, len); + c->num += (unsigned int)len; + return 1; + } + } + + n = len / HASH_CBLOCK; + if (n > 0) { + HASH_BLOCK_DATA_ORDER(c, data, n); + n *= HASH_CBLOCK; + data += n; + len -= n; + } + + if (len != 0) { + p = (unsigned char *)c->data; + c->num = (unsigned int)len; + memcpy(p, data, len); + } + return 1; +} + +void HASH_TRANSFORM(HASH_CTX *c, const unsigned char *data) +{ + HASH_BLOCK_DATA_ORDER(c, data, 1); +} + +int HASH_FINAL(unsigned char *md, HASH_CTX *c) +{ + unsigned char *p = (unsigned char *)c->data; + size_t n = c->num; + + p[n] = 0x80; /* there is always room for one */ + n++; + + if (n > (HASH_CBLOCK - 8)) { + memset(p + n, 0, HASH_CBLOCK - n); + n = 0; + HASH_BLOCK_DATA_ORDER(c, p, 1); + } + memset(p + n, 0, HASH_CBLOCK - 8 - n); + + p += HASH_CBLOCK - 8; +#if defined(DATA_ORDER_IS_BIG_ENDIAN) + (void)HOST_l2c(c->Nh, p); + (void)HOST_l2c(c->Nl, p); +#elif defined(DATA_ORDER_IS_LITTLE_ENDIAN) + (void)HOST_l2c(c->Nl, p); + (void)HOST_l2c(c->Nh, p); +#endif + p -= HASH_CBLOCK; + HASH_BLOCK_DATA_ORDER(c, p, 1); + c->num = 0; + OPENSSL_cleanse(p, HASH_CBLOCK); + +#ifndef HASH_MAKE_STRING +# error "HASH_MAKE_STRING must be defined!" +#else + HASH_MAKE_STRING(c, md); +#endif + + return 1; +} + +#ifndef MD32_REG_T +# if defined(__alpha) || defined(__sparcv9) || defined(__mips) +# define MD32_REG_T long +/* + * This comment was originally written for MD5, which is why it + * discusses A-D. But it basically applies to all 32-bit digests, + * which is why it was moved to common header file. + * + * In case you wonder why A-D are declared as long and not + * as MD5_LONG. Doing so results in slight performance + * boost on LP64 architectures. The catch is we don't + * really care if 32 MSBs of a 64-bit register get polluted + * with eventual overflows as we *save* only 32 LSBs in + * *either* case. Now declaring 'em long excuses the compiler + * from keeping 32 MSBs zeroed resulting in 13% performance + * improvement under SPARC Solaris7/64 and 5% under AlphaLinux. + * Well, to be honest it should say that this *prevents* + * performance degradation. + */ +# else +/* + * Above is not absolute and there are LP64 compilers that + * generate better code if MD32_REG_T is defined int. The above + * pre-processor condition reflects the circumstances under which + * the conclusion was made and is subject to further extension. + */ +# define MD32_REG_T int +# endif +#endif diff --git a/openssl-wasm/include/crypto/objects.h b/openssl-wasm/include/crypto/objects.h new file mode 100644 index 0000000..76e1b4d --- /dev/null +++ b/openssl-wasm/include/crypto/objects.h @@ -0,0 +1,12 @@ +/* + * Copyright 2016 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include + +void obj_cleanup_int(void); diff --git a/openssl-wasm/include/crypto/poly1305.h b/openssl-wasm/include/crypto/poly1305.h new file mode 100644 index 0000000..5fef239 --- /dev/null +++ b/openssl-wasm/include/crypto/poly1305.h @@ -0,0 +1,21 @@ +/* + * Copyright 2015-2016 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include + +#define POLY1305_BLOCK_SIZE 16 +#define POLY1305_DIGEST_SIZE 16 +#define POLY1305_KEY_SIZE 32 + +typedef struct poly1305_context POLY1305; + +size_t Poly1305_ctx_size(void); +void Poly1305_Init(POLY1305 *ctx, const unsigned char key[32]); +void Poly1305_Update(POLY1305 *ctx, const unsigned char *inp, size_t len); +void Poly1305_Final(POLY1305 *ctx, unsigned char mac[16]); diff --git a/openssl-wasm/include/crypto/rand.h b/openssl-wasm/include/crypto/rand.h new file mode 100644 index 0000000..5350d3a --- /dev/null +++ b/openssl-wasm/include/crypto/rand.h @@ -0,0 +1,134 @@ +/* + * Copyright 2016-2019 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* + * Licensed under the OpenSSL licenses, (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * https://www.openssl.org/source/license.html + * or in the file LICENSE in the source distribution. + */ + +#ifndef OSSL_CRYPTO_RAND_H +# define OSSL_CRYPTO_RAND_H + +# include + +/* forward declaration */ +typedef struct rand_pool_st RAND_POOL; + +void rand_cleanup_int(void); +void rand_drbg_cleanup_int(void); +void drbg_delete_thread_state(void); + +/* Hardware-based seeding functions. */ +size_t rand_acquire_entropy_from_tsc(RAND_POOL *pool); +size_t rand_acquire_entropy_from_cpu(RAND_POOL *pool); + +/* DRBG entropy callbacks. */ +size_t rand_drbg_get_entropy(RAND_DRBG *drbg, + unsigned char **pout, + int entropy, size_t min_len, size_t max_len, + int prediction_resistance); +void rand_drbg_cleanup_entropy(RAND_DRBG *drbg, + unsigned char *out, size_t outlen); +size_t rand_drbg_get_nonce(RAND_DRBG *drbg, + unsigned char **pout, + int entropy, size_t min_len, size_t max_len); +void rand_drbg_cleanup_nonce(RAND_DRBG *drbg, + unsigned char *out, size_t outlen); + +size_t rand_drbg_get_additional_data(RAND_POOL *pool, unsigned char **pout); + +void rand_drbg_cleanup_additional_data(RAND_POOL *pool, unsigned char *out); + +/* + * RAND_POOL functions + */ +RAND_POOL *rand_pool_new(int entropy_requested, int secure, + size_t min_len, size_t max_len); +RAND_POOL *rand_pool_attach(const unsigned char *buffer, size_t len, + size_t entropy); +void rand_pool_free(RAND_POOL *pool); + +const unsigned char *rand_pool_buffer(RAND_POOL *pool); +unsigned char *rand_pool_detach(RAND_POOL *pool); +void rand_pool_reattach(RAND_POOL *pool, unsigned char *buffer); + +size_t rand_pool_entropy(RAND_POOL *pool); +size_t rand_pool_length(RAND_POOL *pool); + +size_t rand_pool_entropy_available(RAND_POOL *pool); +size_t rand_pool_entropy_needed(RAND_POOL *pool); +/* |entropy_factor| expresses how many bits of data contain 1 bit of entropy */ +size_t rand_pool_bytes_needed(RAND_POOL *pool, unsigned int entropy_factor); +size_t rand_pool_bytes_remaining(RAND_POOL *pool); + +int rand_pool_add(RAND_POOL *pool, + const unsigned char *buffer, size_t len, size_t entropy); +unsigned char *rand_pool_add_begin(RAND_POOL *pool, size_t len); +int rand_pool_add_end(RAND_POOL *pool, size_t len, size_t entropy); + + +/* + * Add random bytes to the pool to acquire requested amount of entropy + * + * This function is platform specific and tries to acquire the requested + * amount of entropy by polling platform specific entropy sources. + * + * If the function succeeds in acquiring at least |entropy_requested| bits + * of entropy, the total entropy count is returned. If it fails, it returns + * an entropy count of 0. + */ +size_t rand_pool_acquire_entropy(RAND_POOL *pool); + +/* + * Add some application specific nonce data + * + * This function is platform specific and adds some application specific + * data to the nonce used for instantiating the drbg. + * + * This data currently consists of the process and thread id, and a high + * resolution timestamp. The data does not include an atomic counter, + * because that is added by the calling function rand_drbg_get_nonce(). + * + * Returns 1 on success and 0 on failure. + */ +int rand_pool_add_nonce_data(RAND_POOL *pool); + + +/* + * Add some platform specific additional data + * + * This function is platform specific and adds some random noise to the + * additional data used for generating random bytes and for reseeding + * the drbg. + * + * Returns 1 on success and 0 on failure. + */ +int rand_pool_add_additional_data(RAND_POOL *pool); + +/* + * Initialise the random pool reseeding sources. + * + * Returns 1 on success and 0 on failure. + */ +int rand_pool_init(void); + +/* + * Finalise the random pool reseeding sources. + */ +void rand_pool_cleanup(void); + +/* + * Control the random pool use of open file descriptors. + */ +void rand_pool_keep_random_devices_open(int keep); + +#endif diff --git a/openssl-wasm/include/crypto/sha.h b/openssl-wasm/include/crypto/sha.h new file mode 100644 index 0000000..6d15edb --- /dev/null +++ b/openssl-wasm/include/crypto/sha.h @@ -0,0 +1,19 @@ +/* + * Copyright 2018 The OpenSSL Project Authors. All Rights Reserved. + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OSSL_CRYPTO_SHA_H +# define OSSL_CRYPTO_SHA_H + +# include + +int sha512_224_init(SHA512_CTX *); +int sha512_256_init(SHA512_CTX *); + +#endif diff --git a/openssl-wasm/include/crypto/siphash.h b/openssl-wasm/include/crypto/siphash.h new file mode 100644 index 0000000..9573680 --- /dev/null +++ b/openssl-wasm/include/crypto/siphash.h @@ -0,0 +1,25 @@ +/* + * Copyright 2017-2018 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include + +#define SIPHASH_BLOCK_SIZE 8 +#define SIPHASH_KEY_SIZE 16 +#define SIPHASH_MIN_DIGEST_SIZE 8 +#define SIPHASH_MAX_DIGEST_SIZE 16 + +typedef struct siphash_st SIPHASH; + +size_t SipHash_ctx_size(void); +size_t SipHash_hash_size(SIPHASH *ctx); +int SipHash_set_hash_size(SIPHASH *ctx, size_t hash_size); +int SipHash_Init(SIPHASH *ctx, const unsigned char *k, + int crounds, int drounds); +void SipHash_Update(SIPHASH *ctx, const unsigned char *in, size_t inlen); +int SipHash_Final(SIPHASH *ctx, unsigned char *out, size_t outlen); diff --git a/openssl-wasm/include/crypto/sm2.h b/openssl-wasm/include/crypto/sm2.h new file mode 100644 index 0000000..76ee80b --- /dev/null +++ b/openssl-wasm/include/crypto/sm2.h @@ -0,0 +1,78 @@ +/* + * Copyright 2017-2018 The OpenSSL Project Authors. All Rights Reserved. + * Copyright 2017 Ribose Inc. All Rights Reserved. + * Ported from Ribose contributions from Botan. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OSSL_CRYPTO_SM2_H +# define OSSL_CRYPTO_SM2_H +# include + +# ifndef OPENSSL_NO_SM2 + +# include + +/* The default user id as specified in GM/T 0009-2012 */ +# define SM2_DEFAULT_USERID "1234567812345678" + +int sm2_compute_z_digest(uint8_t *out, + const EVP_MD *digest, + const uint8_t *id, + const size_t id_len, + const EC_KEY *key); + +/* + * SM2 signature operation. Computes Z and then signs H(Z || msg) using SM2 + */ +ECDSA_SIG *sm2_do_sign(const EC_KEY *key, + const EVP_MD *digest, + const uint8_t *id, + const size_t id_len, + const uint8_t *msg, size_t msg_len); + +int sm2_do_verify(const EC_KEY *key, + const EVP_MD *digest, + const ECDSA_SIG *signature, + const uint8_t *id, + const size_t id_len, + const uint8_t *msg, size_t msg_len); + +/* + * SM2 signature generation. + */ +int sm2_sign(const unsigned char *dgst, int dgstlen, + unsigned char *sig, unsigned int *siglen, EC_KEY *eckey); + +/* + * SM2 signature verification. + */ +int sm2_verify(const unsigned char *dgst, int dgstlen, + const unsigned char *sig, int siglen, EC_KEY *eckey); + +/* + * SM2 encryption + */ +int sm2_ciphertext_size(const EC_KEY *key, const EVP_MD *digest, size_t msg_len, + size_t *ct_size); + +int sm2_plaintext_size(const EC_KEY *key, const EVP_MD *digest, size_t msg_len, + size_t *pt_size); + +int sm2_encrypt(const EC_KEY *key, + const EVP_MD *digest, + const uint8_t *msg, + size_t msg_len, + uint8_t *ciphertext_buf, size_t *ciphertext_len); + +int sm2_decrypt(const EC_KEY *key, + const EVP_MD *digest, + const uint8_t *ciphertext, + size_t ciphertext_len, uint8_t *ptext_buf, size_t *ptext_len); + +# endif /* OPENSSL_NO_SM2 */ +#endif diff --git a/openssl-wasm/include/crypto/sm2err.h b/openssl-wasm/include/crypto/sm2err.h new file mode 100644 index 0000000..d1c0ee2 --- /dev/null +++ b/openssl-wasm/include/crypto/sm2err.h @@ -0,0 +1,65 @@ +/* + * Generated by util/mkerr.pl DO NOT EDIT + * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OSSL_CRYPTO_SM2ERR_H +# define OSSL_CRYPTO_SM2ERR_H + +# ifndef HEADER_SYMHACKS_H +# include +# endif + +# include + +# ifndef OPENSSL_NO_SM2 + +# ifdef __cplusplus +extern "C" +# endif +int ERR_load_SM2_strings(void); + +/* + * SM2 function codes. + */ +# define SM2_F_PKEY_SM2_COPY 115 +# define SM2_F_PKEY_SM2_CTRL 109 +# define SM2_F_PKEY_SM2_CTRL_STR 110 +# define SM2_F_PKEY_SM2_DIGEST_CUSTOM 114 +# define SM2_F_PKEY_SM2_INIT 111 +# define SM2_F_PKEY_SM2_SIGN 112 +# define SM2_F_SM2_COMPUTE_MSG_HASH 100 +# define SM2_F_SM2_COMPUTE_USERID_DIGEST 101 +# define SM2_F_SM2_COMPUTE_Z_DIGEST 113 +# define SM2_F_SM2_DECRYPT 102 +# define SM2_F_SM2_ENCRYPT 103 +# define SM2_F_SM2_PLAINTEXT_SIZE 104 +# define SM2_F_SM2_SIGN 105 +# define SM2_F_SM2_SIG_GEN 106 +# define SM2_F_SM2_SIG_VERIFY 107 +# define SM2_F_SM2_VERIFY 108 + +/* + * SM2 reason codes. + */ +# define SM2_R_ASN1_ERROR 100 +# define SM2_R_BAD_SIGNATURE 101 +# define SM2_R_BUFFER_TOO_SMALL 107 +# define SM2_R_DIST_ID_TOO_LARGE 110 +# define SM2_R_ID_NOT_SET 112 +# define SM2_R_ID_TOO_LARGE 111 +# define SM2_R_INVALID_CURVE 108 +# define SM2_R_INVALID_DIGEST 102 +# define SM2_R_INVALID_DIGEST_TYPE 103 +# define SM2_R_INVALID_ENCODING 104 +# define SM2_R_INVALID_FIELD 105 +# define SM2_R_NO_PARAMETERS_SET 109 +# define SM2_R_USER_ID_TOO_LARGE 106 + +# endif +#endif diff --git a/openssl-wasm/include/crypto/sm3.h b/openssl-wasm/include/crypto/sm3.h new file mode 100644 index 0000000..97e7460 --- /dev/null +++ b/openssl-wasm/include/crypto/sm3.h @@ -0,0 +1,39 @@ +/* + * Copyright 2017 The OpenSSL Project Authors. All Rights Reserved. + * Copyright 2017 Ribose Inc. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OSSL_CRYPTO_SM3_H +# define OSSL_CRYPTO_SM3_H + +# include + +# ifdef OPENSSL_NO_SM3 +# error SM3 is disabled. +# endif + +# define SM3_DIGEST_LENGTH 32 +# define SM3_WORD unsigned int + +# define SM3_CBLOCK 64 +# define SM3_LBLOCK (SM3_CBLOCK/4) + +typedef struct SM3state_st { + SM3_WORD A, B, C, D, E, F, G, H; + SM3_WORD Nl, Nh; + SM3_WORD data[SM3_LBLOCK]; + unsigned int num; +} SM3_CTX; + +int sm3_init(SM3_CTX *c); +int sm3_update(SM3_CTX *c, const void *data, size_t len); +int sm3_final(unsigned char *md, SM3_CTX *c); + +void sm3_block_data_order(SM3_CTX *c, const void *p, size_t num); + +#endif diff --git a/openssl-wasm/include/crypto/sm4.h b/openssl-wasm/include/crypto/sm4.h new file mode 100644 index 0000000..abe28f3 --- /dev/null +++ b/openssl-wasm/include/crypto/sm4.h @@ -0,0 +1,37 @@ +/* + * Copyright 2017 The OpenSSL Project Authors. All Rights Reserved. + * Copyright 2017 Ribose Inc. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OSSL_CRYPTO_SM4_H +# define OSSL_CRYPTO_SM4_H + +# include +# include + +# ifdef OPENSSL_NO_SM4 +# error SM4 is disabled. +# endif + +# define SM4_ENCRYPT 1 +# define SM4_DECRYPT 0 + +# define SM4_BLOCK_SIZE 16 +# define SM4_KEY_SCHEDULE 32 + +typedef struct SM4_KEY_st { + uint32_t rk[SM4_KEY_SCHEDULE]; +} SM4_KEY; + +int SM4_set_key(const uint8_t *key, SM4_KEY *ks); + +void SM4_encrypt(const uint8_t *in, uint8_t *out, const SM4_KEY *ks); + +void SM4_decrypt(const uint8_t *in, uint8_t *out, const SM4_KEY *ks); + +#endif diff --git a/openssl-wasm/include/crypto/store.h b/openssl-wasm/include/crypto/store.h new file mode 100644 index 0000000..428d3c6 --- /dev/null +++ b/openssl-wasm/include/crypto/store.h @@ -0,0 +1,28 @@ +/* + * Copyright 2016-2019 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OSSL_CRYPTO_STORE_H +# define OSSL_CRYPTO_STORE_H + +# include +# include +# include + +/* + * Two functions to read PEM data off an already opened BIO. To be used + * instead of OSSLSTORE_open() and OSSLSTORE_close(). Everything is done + * as usual with OSSLSTORE_load() and OSSLSTORE_eof(). + */ +OSSL_STORE_CTX *ossl_store_attach_pem_bio(BIO *bp, const UI_METHOD *ui_method, + void *ui_data); +int ossl_store_detach_pem_bio(OSSL_STORE_CTX *ctx); + +void ossl_store_cleanup_int(void); + +#endif diff --git a/openssl-wasm/include/crypto/x509.h b/openssl-wasm/include/crypto/x509.h new file mode 100644 index 0000000..b53c2b0 --- /dev/null +++ b/openssl-wasm/include/crypto/x509.h @@ -0,0 +1,286 @@ +/* + * Copyright 2015-2018 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include "internal/refcount.h" + +/* Internal X509 structures and functions: not for application use */ + +/* Note: unless otherwise stated a field pointer is mandatory and should + * never be set to NULL: the ASN.1 code and accessors rely on mandatory + * fields never being NULL. + */ + +/* + * name entry structure, equivalent to AttributeTypeAndValue defined + * in RFC5280 et al. + */ +struct X509_name_entry_st { + ASN1_OBJECT *object; /* AttributeType */ + ASN1_STRING *value; /* AttributeValue */ + int set; /* index of RDNSequence for this entry */ + int size; /* temp variable */ +}; + +/* Name from RFC 5280. */ +struct X509_name_st { + STACK_OF(X509_NAME_ENTRY) *entries; /* DN components */ + int modified; /* true if 'bytes' needs to be built */ + BUF_MEM *bytes; /* cached encoding: cannot be NULL */ + /* canonical encoding used for rapid Name comparison */ + unsigned char *canon_enc; + int canon_enclen; +} /* X509_NAME */ ; + +/* Signature info structure */ + +struct x509_sig_info_st { + /* NID of message digest */ + int mdnid; + /* NID of public key algorithm */ + int pknid; + /* Security bits */ + int secbits; + /* Various flags */ + uint32_t flags; +}; + +/* PKCS#10 certificate request */ + +struct X509_req_info_st { + ASN1_ENCODING enc; /* cached encoding of signed part */ + ASN1_INTEGER *version; /* version, defaults to v1(0) so can be NULL */ + X509_NAME *subject; /* certificate request DN */ + X509_PUBKEY *pubkey; /* public key of request */ + /* + * Zero or more attributes. + * NB: although attributes is a mandatory field some broken + * encodings omit it so this may be NULL in that case. + */ + STACK_OF(X509_ATTRIBUTE) *attributes; +}; + +struct X509_req_st { + X509_REQ_INFO req_info; /* signed certificate request data */ + X509_ALGOR sig_alg; /* signature algorithm */ + ASN1_BIT_STRING *signature; /* signature */ + CRYPTO_REF_COUNT references; + CRYPTO_RWLOCK *lock; +}; + +struct X509_crl_info_st { + ASN1_INTEGER *version; /* version: defaults to v1(0) so may be NULL */ + X509_ALGOR sig_alg; /* signature algorithm */ + X509_NAME *issuer; /* CRL issuer name */ + ASN1_TIME *lastUpdate; /* lastUpdate field */ + ASN1_TIME *nextUpdate; /* nextUpdate field: optional */ + STACK_OF(X509_REVOKED) *revoked; /* revoked entries: optional */ + STACK_OF(X509_EXTENSION) *extensions; /* extensions: optional */ + ASN1_ENCODING enc; /* encoding of signed portion of CRL */ +}; + +struct X509_crl_st { + X509_CRL_INFO crl; /* signed CRL data */ + X509_ALGOR sig_alg; /* CRL signature algorithm */ + ASN1_BIT_STRING signature; /* CRL signature */ + CRYPTO_REF_COUNT references; + int flags; + /* + * Cached copies of decoded extension values, since extensions + * are optional any of these can be NULL. + */ + 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; + STACK_OF(GENERAL_NAMES) *issuers; + /* hash of CRL */ + unsigned char sha1_hash[SHA_DIGEST_LENGTH]; + /* alternative method to handle this CRL */ + const X509_CRL_METHOD *meth; + void *meth_data; + CRYPTO_RWLOCK *lock; +}; + +struct x509_revoked_st { + ASN1_INTEGER serialNumber; /* revoked entry serial number */ + ASN1_TIME *revocationDate; /* revocation date */ + STACK_OF(X509_EXTENSION) *extensions; /* CRL entry extensions: optional */ + /* decoded value of CRLissuer extension: set if indirect CRL */ + STACK_OF(GENERAL_NAME) *issuer; + /* revocation reason: set to CRL_REASON_NONE if reason extension absent */ + int reason; + /* + * CRL entries are reordered for faster lookup of serial numbers. This + * field contains the original load sequence for this entry. + */ + int sequence; +}; + +/* + * 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. OpenSSL specific structure not defined + * in any RFC. + */ + +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 */ +}; + +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; +}; + +struct x509_st { + X509_CINF cert_info; + X509_ALGOR sig_alg; + ASN1_BIT_STRING signature; + X509_SIG_INFO siginf; + CRYPTO_REF_COUNT references; + CRYPTO_EX_DATA ex_data; + /* These contain copies of various extension values */ + long ex_pathlen; + long ex_pcpathlen; + uint32_t ex_flags; + uint32_t ex_kusage; + uint32_t ex_xkusage; + uint32_t 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 + unsigned char sha1_hash[SHA_DIGEST_LENGTH]; + X509_CERT_AUX *aux; + CRYPTO_RWLOCK *lock; + volatile int ex_cached; +} /* X509 */ ; + +/* + * 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; + /* The following are set by the caller */ + /* The cert to check */ + X509 *cert; + /* chain of X509s - untrusted - passed in */ + STACK_OF(X509) *untrusted; + /* set of CRLs passed in */ + STACK_OF(X509_CRL) *crls; + X509_VERIFY_PARAM *param; + /* Other info for use with get_issuer() */ + void *other_ctx; + /* Callbacks for various operations */ + /* called to verify a certificate */ + int (*verify) (X509_STORE_CTX *ctx); + /* error callback */ + int (*verify_cb) (int ok, X509_STORE_CTX *ctx); + /* get issuers cert from ctx */ + int (*get_issuer) (X509 **issuer, X509_STORE_CTX *ctx, X509 *x); + /* check issued */ + int (*check_issued) (X509_STORE_CTX *ctx, X509 *x, X509 *issuer); + /* Check revocation status of chain */ + int (*check_revocation) (X509_STORE_CTX *ctx); + /* retrieve CRL */ + int (*get_crl) (X509_STORE_CTX *ctx, X509_CRL **crl, X509 *x); + /* Check CRL validity */ + int (*check_crl) (X509_STORE_CTX *ctx, X509_CRL *crl); + /* Check certificate against CRL */ + int (*cert_crl) (X509_STORE_CTX *ctx, X509_CRL *crl, X509 *x); + /* Check policy status of the chain */ + int (*check_policy) (X509_STORE_CTX *ctx); + STACK_OF(X509) *(*lookup_certs) (X509_STORE_CTX *ctx, X509_NAME *nm); + STACK_OF(X509_CRL) *(*lookup_crls) (X509_STORE_CTX *ctx, X509_NAME *nm); + int (*cleanup) (X509_STORE_CTX *ctx); + /* The following is built up */ + /* if 0, rebuild chain */ + int valid; + /* number of untrusted certs */ + int num_untrusted; + /* chain of X509s - built up and trusted */ + STACK_OF(X509) *chain; + /* Valid policy tree */ + X509_POLICY_TREE *tree; + /* Require explicit policy value */ + int explicit_policy; + /* When something goes wrong, this is why */ + int error_depth; + int error; + X509 *current_cert; + /* cert currently being tested as valid issuer */ + X509 *current_issuer; + /* current CRL */ + X509_CRL *current_crl; + /* score of current CRL */ + int current_crl_score; + /* Reason mask */ + unsigned int current_reasons; + /* For CRL path validation: parent context */ + X509_STORE_CTX *parent; + CRYPTO_EX_DATA ex_data; + SSL_DANE *dane; + /* signed via bare TA public key, rather than CA certificate */ + int bare_ta_signed; +}; + +/* PKCS#8 private key info structure */ + +struct pkcs8_priv_key_info_st { + ASN1_INTEGER *version; + X509_ALGOR *pkeyalg; + ASN1_OCTET_STRING *pkey; + STACK_OF(X509_ATTRIBUTE) *attributes; +}; + +struct X509_sig_st { + X509_ALGOR *algor; + ASN1_OCTET_STRING *digest; +}; + +struct x509_object_st { + /* one of the above types */ + X509_LOOKUP_TYPE type; + union { + char *ptr; + X509 *x509; + X509_CRL *crl; + EVP_PKEY *pkey; + } data; +}; + +int a2i_ipadd(unsigned char *ipout, const char *ipasc); +int x509_set1_time(ASN1_TIME **ptm, const ASN1_TIME *tm); + +void x509_init_sig_info(X509 *x); diff --git a/openssl-wasm/include/internal/__DECC_INCLUDE_EPILOGUE.H b/openssl-wasm/include/internal/__DECC_INCLUDE_EPILOGUE.H new file mode 100644 index 0000000..c350018 --- /dev/null +++ b/openssl-wasm/include/internal/__DECC_INCLUDE_EPILOGUE.H @@ -0,0 +1,16 @@ +/* + * Copyright 2016 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* + * This file is only used by HP C on VMS, and is included automatically + * after each header file from this directory + */ + +/* restore state. Must correspond to the save in __decc_include_prologue.h */ +#pragma names restore diff --git a/openssl-wasm/include/internal/__DECC_INCLUDE_PROLOGUE.H b/openssl-wasm/include/internal/__DECC_INCLUDE_PROLOGUE.H new file mode 100644 index 0000000..9a9c777 --- /dev/null +++ b/openssl-wasm/include/internal/__DECC_INCLUDE_PROLOGUE.H @@ -0,0 +1,20 @@ +/* + * Copyright 2016 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* + * This file is only used by HP C on VMS, and is included automatically + * after each header file from this directory + */ + +/* save state */ +#pragma names save +/* have the compiler shorten symbols larger than 31 chars to 23 chars + * followed by a 8 hex char CRC + */ +#pragma names as_is,shortened diff --git a/openssl-wasm/include/internal/bio.h b/openssl-wasm/include/internal/bio.h new file mode 100644 index 0000000..c343b27 --- /dev/null +++ b/openssl-wasm/include/internal/bio.h @@ -0,0 +1,33 @@ +/* + * Copyright 2016-2018 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include + +struct bio_method_st { + int type; + char *name; + int (*bwrite) (BIO *, const char *, size_t, size_t *); + int (*bwrite_old) (BIO *, const char *, int); + int (*bread) (BIO *, char *, size_t, size_t *); + int (*bread_old) (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 *); +}; + +void bio_free_ex_data(BIO *bio); +void bio_cleanup(void); + + +/* Old style to new style BIO_METHOD conversion functions */ +int bwrite_conv(BIO *bio, const char *data, size_t datal, size_t *written); +int bread_conv(BIO *bio, char *data, size_t datal, size_t *read); diff --git a/openssl-wasm/include/internal/comp.h b/openssl-wasm/include/internal/comp.h new file mode 100644 index 0000000..ac6e38b --- /dev/null +++ b/openssl-wasm/include/internal/comp.h @@ -0,0 +1,12 @@ +/* + * Copyright 2016 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include + +void comp_zlib_cleanup_int(void); diff --git a/openssl-wasm/include/internal/conf.h b/openssl-wasm/include/internal/conf.h new file mode 100644 index 0000000..163fea8 --- /dev/null +++ b/openssl-wasm/include/internal/conf.h @@ -0,0 +1,30 @@ +/* + * Copyright 2016-2019 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OSSL_INTERNAL_CONF_H +# define OSSL_INTERNAL_CONF_H + +#include + +#define DEFAULT_CONF_MFLAGS \ + (CONF_MFLAGS_DEFAULT_SECTION | \ + CONF_MFLAGS_IGNORE_MISSING_FILE | \ + CONF_MFLAGS_IGNORE_RETURN_CODES) + +struct ossl_init_settings_st { + char *filename; + char *appname; + unsigned long flags; +}; + +int openssl_config_int(const OPENSSL_INIT_SETTINGS *); +void openssl_no_config_int(void); +void conf_modules_free_int(void); + +#endif diff --git a/openssl-wasm/include/internal/constant_time.h b/openssl-wasm/include/internal/constant_time.h new file mode 100644 index 0000000..6600a1d --- /dev/null +++ b/openssl-wasm/include/internal/constant_time.h @@ -0,0 +1,387 @@ +/* + * Copyright 2014-2019 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OSSL_INTERNAL_CONSTANT_TIME_H +# define OSSL_INTERNAL_CONSTANT_TIME_H + +# include +# include +# include /* For 'ossl_inline' */ + +/*- + * The boolean methods return a bitmask of all ones (0xff...f) for true + * and 0 for false. This is useful for choosing a value based on the result + * of a conditional in constant time. For example, + * if (a < b) { + * c = a; + * } else { + * c = b; + * } + * can be written as + * unsigned int lt = constant_time_lt(a, b); + * c = constant_time_select(lt, a, b); + */ + +/* Returns the given value with the MSB copied to all the other bits. */ +static ossl_inline unsigned int constant_time_msb(unsigned int a); +/* Convenience method for uint32_t. */ +static ossl_inline uint32_t constant_time_msb_32(uint32_t a); +/* Convenience method for uint64_t. */ +static ossl_inline uint64_t constant_time_msb_64(uint64_t a); + +/* Returns 0xff..f if a < b and 0 otherwise. */ +static ossl_inline unsigned int constant_time_lt(unsigned int a, + unsigned int b); +/* Convenience method for getting an 8-bit mask. */ +static ossl_inline unsigned char constant_time_lt_8(unsigned int a, + unsigned int b); +/* Convenience method for uint64_t. */ +static ossl_inline uint64_t constant_time_lt_64(uint64_t a, uint64_t b); + +/* Returns 0xff..f if a >= b and 0 otherwise. */ +static ossl_inline unsigned int constant_time_ge(unsigned int a, + unsigned int b); +/* Convenience method for getting an 8-bit mask. */ +static ossl_inline unsigned char constant_time_ge_8(unsigned int a, + unsigned int b); + +/* Returns 0xff..f if a == 0 and 0 otherwise. */ +static ossl_inline unsigned int constant_time_is_zero(unsigned int a); +/* Convenience method for getting an 8-bit mask. */ +static ossl_inline unsigned char constant_time_is_zero_8(unsigned int a); +/* Convenience method for getting a 32-bit mask. */ +static ossl_inline uint32_t constant_time_is_zero_32(uint32_t a); + +/* Returns 0xff..f if a == b and 0 otherwise. */ +static ossl_inline unsigned int constant_time_eq(unsigned int a, + unsigned int b); +/* Convenience method for getting an 8-bit mask. */ +static ossl_inline unsigned char constant_time_eq_8(unsigned int a, + unsigned int b); +/* Signed integers. */ +static ossl_inline unsigned int constant_time_eq_int(int a, int b); +/* Convenience method for getting an 8-bit mask. */ +static ossl_inline unsigned char constant_time_eq_int_8(int a, int b); + +/*- + * Returns (mask & a) | (~mask & b). + * + * When |mask| is all 1s or all 0s (as returned by the methods above), + * the select methods return either |a| (if |mask| is nonzero) or |b| + * (if |mask| is zero). + */ +static ossl_inline unsigned int constant_time_select(unsigned int mask, + unsigned int a, + unsigned int b); +/* Convenience method for unsigned chars. */ +static ossl_inline unsigned char constant_time_select_8(unsigned char mask, + unsigned char a, + unsigned char b); + +/* Convenience method for uint32_t. */ +static ossl_inline uint32_t constant_time_select_32(uint32_t mask, uint32_t a, + uint32_t b); + +/* Convenience method for uint64_t. */ +static ossl_inline uint64_t constant_time_select_64(uint64_t mask, uint64_t a, + uint64_t b); +/* Convenience method for signed integers. */ +static ossl_inline int constant_time_select_int(unsigned int mask, int a, + int b); + + +static ossl_inline unsigned int constant_time_msb(unsigned int a) +{ + return 0 - (a >> (sizeof(a) * 8 - 1)); +} + + +static ossl_inline uint32_t constant_time_msb_32(uint32_t a) +{ + return 0 - (a >> 31); +} + +static ossl_inline uint64_t constant_time_msb_64(uint64_t a) +{ + return 0 - (a >> 63); +} + +static ossl_inline size_t constant_time_msb_s(size_t a) +{ + return 0 - (a >> (sizeof(a) * 8 - 1)); +} + +static ossl_inline unsigned int constant_time_lt(unsigned int a, + unsigned int b) +{ + return constant_time_msb(a ^ ((a ^ b) | ((a - b) ^ b))); +} + +static ossl_inline size_t constant_time_lt_s(size_t a, size_t b) +{ + return constant_time_msb_s(a ^ ((a ^ b) | ((a - b) ^ b))); +} + +static ossl_inline unsigned char constant_time_lt_8(unsigned int a, + unsigned int b) +{ + return (unsigned char)constant_time_lt(a, b); +} + +static ossl_inline uint64_t constant_time_lt_64(uint64_t a, uint64_t b) +{ + return constant_time_msb_64(a ^ ((a ^ b) | ((a - b) ^ b))); +} + +static ossl_inline unsigned int constant_time_ge(unsigned int a, + unsigned int b) +{ + return ~constant_time_lt(a, b); +} + +static ossl_inline size_t constant_time_ge_s(size_t a, size_t b) +{ + return ~constant_time_lt_s(a, b); +} + +static ossl_inline unsigned char constant_time_ge_8(unsigned int a, + unsigned int b) +{ + return (unsigned char)constant_time_ge(a, b); +} + +static ossl_inline unsigned char constant_time_ge_8_s(size_t a, size_t b) +{ + return (unsigned char)constant_time_ge_s(a, b); +} + +static ossl_inline unsigned int constant_time_is_zero(unsigned int a) +{ + return constant_time_msb(~a & (a - 1)); +} + +static ossl_inline size_t constant_time_is_zero_s(size_t a) +{ + return constant_time_msb_s(~a & (a - 1)); +} + +static ossl_inline unsigned char constant_time_is_zero_8(unsigned int a) +{ + return (unsigned char)constant_time_is_zero(a); +} + +static ossl_inline uint32_t constant_time_is_zero_32(uint32_t a) +{ + return constant_time_msb_32(~a & (a - 1)); +} + +static ossl_inline unsigned int constant_time_eq(unsigned int a, + unsigned int b) +{ + return constant_time_is_zero(a ^ b); +} + +static ossl_inline size_t constant_time_eq_s(size_t a, size_t b) +{ + return constant_time_is_zero_s(a ^ b); +} + +static ossl_inline unsigned char constant_time_eq_8(unsigned int a, + unsigned int b) +{ + return (unsigned char)constant_time_eq(a, b); +} + +static ossl_inline unsigned char constant_time_eq_8_s(size_t a, size_t b) +{ + return (unsigned char)constant_time_eq_s(a, b); +} + +static ossl_inline unsigned int constant_time_eq_int(int a, int b) +{ + return constant_time_eq((unsigned)(a), (unsigned)(b)); +} + +static ossl_inline unsigned char constant_time_eq_int_8(int a, int b) +{ + return constant_time_eq_8((unsigned)(a), (unsigned)(b)); +} + +/* + * Returns the value unmodified, but avoids optimizations. + * The barriers prevent the compiler from narrowing down the + * possible value range of the mask and ~mask in the select + * statements, which avoids the recognition of the select + * and turning it into a conditional load or branch. + */ +static ossl_inline unsigned int value_barrier(unsigned int a) +{ +#if !defined(OPENSSL_NO_ASM) && defined(__GNUC__) + unsigned int r; + __asm__("" : "=r"(r) : "0"(a)); +#else + volatile unsigned int r = a; +#endif + return r; +} + +/* Convenience method for uint32_t. */ +static ossl_inline uint32_t value_barrier_32(uint32_t a) +{ +#if !defined(OPENSSL_NO_ASM) && defined(__GNUC__) + uint32_t r; + __asm__("" : "=r"(r) : "0"(a)); +#else + volatile uint32_t r = a; +#endif + return r; +} + +/* Convenience method for uint64_t. */ +static ossl_inline uint64_t value_barrier_64(uint64_t a) +{ +#if !defined(OPENSSL_NO_ASM) && defined(__GNUC__) + uint64_t r; + __asm__("" : "=r"(r) : "0"(a)); +#else + volatile uint64_t r = a; +#endif + return r; +} + +/* Convenience method for size_t. */ +static ossl_inline size_t value_barrier_s(size_t a) +{ +#if !defined(OPENSSL_NO_ASM) && defined(__GNUC__) + size_t r; + __asm__("" : "=r"(r) : "0"(a)); +#else + volatile size_t r = a; +#endif + return r; +} + +static ossl_inline unsigned int constant_time_select(unsigned int mask, + unsigned int a, + unsigned int b) +{ + return (value_barrier(mask) & a) | (value_barrier(~mask) & b); +} + +static ossl_inline size_t constant_time_select_s(size_t mask, + size_t a, + size_t b) +{ + return (value_barrier_s(mask) & a) | (value_barrier_s(~mask) & b); +} + +static ossl_inline unsigned char constant_time_select_8(unsigned char mask, + unsigned char a, + unsigned char b) +{ + return (unsigned char)constant_time_select(mask, a, b); +} + +static ossl_inline int constant_time_select_int(unsigned int mask, int a, + int b) +{ + return (int)constant_time_select(mask, (unsigned)(a), (unsigned)(b)); +} + +static ossl_inline int constant_time_select_int_s(size_t mask, int a, int b) +{ + return (int)constant_time_select((unsigned)mask, (unsigned)(a), + (unsigned)(b)); +} + +static ossl_inline uint32_t constant_time_select_32(uint32_t mask, uint32_t a, + uint32_t b) +{ + return (value_barrier_32(mask) & a) | (value_barrier_32(~mask) & b); +} + +static ossl_inline uint64_t constant_time_select_64(uint64_t mask, uint64_t a, + uint64_t b) +{ + return (value_barrier_64(mask) & a) | (value_barrier_64(~mask) & b); +} + +/* + * mask must be 0xFFFFFFFF or 0x00000000. + * + * if (mask) { + * uint32_t tmp = *a; + * + * *a = *b; + * *b = tmp; + * } + */ +static ossl_inline void constant_time_cond_swap_32(uint32_t mask, uint32_t *a, + uint32_t *b) +{ + uint32_t xor = *a ^ *b; + + xor &= mask; + *a ^= xor; + *b ^= xor; +} + +/* + * mask must be 0xFFFFFFFF or 0x00000000. + * + * if (mask) { + * uint64_t tmp = *a; + * + * *a = *b; + * *b = tmp; + * } + */ +static ossl_inline void constant_time_cond_swap_64(uint64_t mask, uint64_t *a, + uint64_t *b) +{ + uint64_t xor = *a ^ *b; + + xor &= mask; + *a ^= xor; + *b ^= xor; +} + +/* + * table is a two dimensional array of bytes. Each row has rowsize elements. + * Copies row number idx into out. rowsize and numrows are not considered + * private. + */ +static ossl_inline void constant_time_lookup(void *out, + const void *table, + size_t rowsize, + size_t numrows, + size_t idx) +{ + size_t i, j; + const unsigned char *tablec = (const unsigned char *)table; + unsigned char *outc = (unsigned char *)out; + unsigned char mask; + + memset(out, 0, rowsize); + + /* Note idx may underflow - but that is well defined */ + for (i = 0; i < numrows; i++, idx--) { + mask = (unsigned char)constant_time_is_zero_s(idx); + for (j = 0; j < rowsize; j++) + *(outc + j) |= constant_time_select_8(mask, *(tablec++), 0); + } +} + +/* + * Expected usage pattern is to unconditionally set error and then + * wipe it if there was no actual error. |clear| is 1 or 0. + */ +void err_clear_last_constant_time(int clear); + +#endif /* OSSL_INTERNAL_CONSTANT_TIME_H */ diff --git a/openssl-wasm/include/internal/cryptlib.h b/openssl-wasm/include/internal/cryptlib.h new file mode 100644 index 0000000..6e7291a --- /dev/null +++ b/openssl-wasm/include/internal/cryptlib.h @@ -0,0 +1,99 @@ +/* + * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OSSL_INTERNAL_CRYPTLIB_H +# define OSSL_INTERNAL_CRYPTLIB_H + +# include +# include + +# ifdef OPENSSL_USE_APPLINK +# undef BIO_FLAGS_UPLINK +# define BIO_FLAGS_UPLINK 0x8000 +# include "ms/uplink.h" +# endif + +# include +# include +# include +# include +# include "internal/nelem.h" + +#ifdef NDEBUG +# define ossl_assert(x) ((x) != 0) +#else +__owur static ossl_inline int ossl_assert_int(int expr, const char *exprstr, + const char *file, int line) +{ + if (!expr) + OPENSSL_die(exprstr, file, line); + + return expr; +} + +# define ossl_assert(x) ossl_assert_int((x) != 0, "Assertion failed: "#x, \ + __FILE__, __LINE__) + +#endif + +typedef struct ex_callback_st EX_CALLBACK; + +DEFINE_STACK_OF(EX_CALLBACK) + +typedef struct app_mem_info_st APP_INFO; + +typedef struct mem_st MEM; +DEFINE_LHASH_OF(MEM); + +# define OPENSSL_CONF "openssl.cnf" + +# ifndef OPENSSL_SYS_VMS +# define X509_CERT_AREA OPENSSLDIR +# define X509_CERT_DIR OPENSSLDIR "/certs" +# define X509_CERT_FILE OPENSSLDIR "/cert.pem" +# define X509_PRIVATE_DIR OPENSSLDIR "/private" +# define CTLOG_FILE OPENSSLDIR "/ct_log_list.cnf" +# else +# define X509_CERT_AREA "OSSL$DATAROOT:[000000]" +# define X509_CERT_DIR "OSSL$DATAROOT:[CERTS]" +# define X509_CERT_FILE "OSSL$DATAROOT:[000000]cert.pem" +# define X509_PRIVATE_DIR "OSSL$DATAROOT:[PRIVATE]" +# define CTLOG_FILE "OSSL$DATAROOT:[000000]ct_log_list.cnf" +# endif + +# define X509_CERT_DIR_EVP "SSL_CERT_DIR" +# define X509_CERT_FILE_EVP "SSL_CERT_FILE" +# define CTLOG_FILE_EVP "CTLOG_FILE" + +/* size of string representations */ +# define DECIMAL_SIZE(type) ((sizeof(type)*8+2)/3+1) +# define HEX_SIZE(type) (sizeof(type)*2) + +void OPENSSL_cpuid_setup(void); +extern unsigned int OPENSSL_ia32cap_P[]; +void OPENSSL_showfatal(const char *fmta, ...); +void crypto_cleanup_all_ex_data_int(void); +int openssl_init_fork_handlers(void); +int openssl_get_fork_id(void); + +char *ossl_safe_getenv(const char *name); + +extern CRYPTO_RWLOCK *memdbg_lock; +int openssl_strerror_r(int errnum, char *buf, size_t buflen); +# if !defined(OPENSSL_NO_STDIO) +FILE *openssl_fopen(const char *filename, const char *mode); +# else +void *openssl_fopen(const char *filename, const char *mode); +# endif + +uint32_t OPENSSL_rdtsc(void); +size_t OPENSSL_instrument_bus(unsigned int *, size_t); +size_t OPENSSL_instrument_bus2(unsigned int *, size_t, size_t); + +#endif diff --git a/openssl-wasm/include/internal/dane.h b/openssl-wasm/include/internal/dane.h new file mode 100644 index 0000000..7a39bd7 --- /dev/null +++ b/openssl-wasm/include/internal/dane.h @@ -0,0 +1,103 @@ +/* + * Copyright 2015-2016 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OSSL_INTERNAL_DANE_H +#define OSSL_INTERNAL_DANE_H + +#include + +/*- + * Certificate usages: + * https://tools.ietf.org/html/rfc6698#section-2.1.1 + */ +#define DANETLS_USAGE_PKIX_TA 0 +#define DANETLS_USAGE_PKIX_EE 1 +#define DANETLS_USAGE_DANE_TA 2 +#define DANETLS_USAGE_DANE_EE 3 +#define DANETLS_USAGE_LAST DANETLS_USAGE_DANE_EE + +/*- + * Selectors: + * https://tools.ietf.org/html/rfc6698#section-2.1.2 + */ +#define DANETLS_SELECTOR_CERT 0 +#define DANETLS_SELECTOR_SPKI 1 +#define DANETLS_SELECTOR_LAST DANETLS_SELECTOR_SPKI + +/*- + * Matching types: + * https://tools.ietf.org/html/rfc6698#section-2.1.3 + */ +#define DANETLS_MATCHING_FULL 0 +#define DANETLS_MATCHING_2256 1 +#define DANETLS_MATCHING_2512 2 +#define DANETLS_MATCHING_LAST DANETLS_MATCHING_2512 + +typedef struct danetls_record_st { + uint8_t usage; + uint8_t selector; + uint8_t mtype; + unsigned char *data; + size_t dlen; + EVP_PKEY *spki; +} danetls_record; + +DEFINE_STACK_OF(danetls_record) + +/* + * Shared DANE context + */ +struct dane_ctx_st { + const EVP_MD **mdevp; /* mtype -> digest */ + uint8_t *mdord; /* mtype -> preference */ + uint8_t mdmax; /* highest supported mtype */ + unsigned long flags; /* feature bitmask */ +}; + +/* + * Per connection DANE state + */ +struct ssl_dane_st { + struct dane_ctx_st *dctx; + STACK_OF(danetls_record) *trecs; + STACK_OF(X509) *certs; /* DANE-TA(2) Cert(0) Full(0) certs */ + danetls_record *mtlsa; /* Matching TLSA record */ + X509 *mcert; /* DANE matched cert */ + uint32_t umask; /* Usages present */ + int mdpth; /* Depth of matched cert */ + int pdpth; /* Depth of PKIX trust */ + unsigned long flags; /* feature bitmask */ +}; + +#define DANETLS_ENABLED(dane) \ + ((dane) != NULL && sk_danetls_record_num((dane)->trecs) > 0) + +#define DANETLS_USAGE_BIT(u) (((uint32_t)1) << u) + +#define DANETLS_PKIX_TA_MASK (DANETLS_USAGE_BIT(DANETLS_USAGE_PKIX_TA)) +#define DANETLS_PKIX_EE_MASK (DANETLS_USAGE_BIT(DANETLS_USAGE_PKIX_EE)) +#define DANETLS_DANE_TA_MASK (DANETLS_USAGE_BIT(DANETLS_USAGE_DANE_TA)) +#define DANETLS_DANE_EE_MASK (DANETLS_USAGE_BIT(DANETLS_USAGE_DANE_EE)) + +#define DANETLS_PKIX_MASK (DANETLS_PKIX_TA_MASK | DANETLS_PKIX_EE_MASK) +#define DANETLS_DANE_MASK (DANETLS_DANE_TA_MASK | DANETLS_DANE_EE_MASK) +#define DANETLS_TA_MASK (DANETLS_PKIX_TA_MASK | DANETLS_DANE_TA_MASK) +#define DANETLS_EE_MASK (DANETLS_PKIX_EE_MASK | DANETLS_DANE_EE_MASK) + +#define DANETLS_HAS_PKIX(dane) ((dane) && ((dane)->umask & DANETLS_PKIX_MASK)) +#define DANETLS_HAS_DANE(dane) ((dane) && ((dane)->umask & DANETLS_DANE_MASK)) +#define DANETLS_HAS_TA(dane) ((dane) && ((dane)->umask & DANETLS_TA_MASK)) +#define DANETLS_HAS_EE(dane) ((dane) && ((dane)->umask & DANETLS_EE_MASK)) + +#define DANETLS_HAS_PKIX_TA(dane) ((dane)&&((dane)->umask & DANETLS_PKIX_TA_MASK)) +#define DANETLS_HAS_PKIX_EE(dane) ((dane)&&((dane)->umask & DANETLS_PKIX_EE_MASK)) +#define DANETLS_HAS_DANE_TA(dane) ((dane)&&((dane)->umask & DANETLS_DANE_TA_MASK)) +#define DANETLS_HAS_DANE_EE(dane) ((dane)&&((dane)->umask & DANETLS_DANE_EE_MASK)) + +#endif /* OSSL_INTERNAL_DANE_H */ diff --git a/openssl-wasm/include/internal/dso.h b/openssl-wasm/include/internal/dso.h new file mode 100644 index 0000000..c57c0c4 --- /dev/null +++ b/openssl-wasm/include/internal/dso.h @@ -0,0 +1,165 @@ +/* + * Copyright 2000-2018 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OSSL_INTERNAL_DSO_H +# define OSSL_INTERNAL_DSO_H + +# include +# include "internal/dsoerr.h" + +/* 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 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". 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 + +/* + * Don't unload the DSO when we call DSO_free() + */ +# define DSO_FLAG_NO_UNLOAD_ON_FREE 0x04 + +/* + * 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; +typedef struct dso_meth_st DSO_METHOD; + +/* + * 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 independently 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 independently 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 *); + +DSO *DSO_new(void); +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); + +/* + * These functions can be used to get/set the platform-independent 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); + +/* + * The all-singing all-dancing load function, you normally pass NULL for the + * first and third parameters. Use DSO_up_ref 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 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 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 characters [including + * trailing zero] to accommodate 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); + +/* + * Like DSO_pathbyaddr() but instead returns a handle to the DSO for the symbol + * or NULL on error. + */ +DSO *DSO_dsobyaddr(void *addr, int flags); + +/* + * 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); + +int ERR_load_DSO_strings(void); + +#endif diff --git a/openssl-wasm/include/internal/dsoerr.h b/openssl-wasm/include/internal/dsoerr.h new file mode 100644 index 0000000..94d642a --- /dev/null +++ b/openssl-wasm/include/internal/dsoerr.h @@ -0,0 +1,82 @@ +/* + * Generated by util/mkerr.pl DO NOT EDIT + * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OSSL_INTERNAL_DSOERR_H +# define OSSL_INTERNAL_DSOERR_H + +# ifndef HEADER_SYMHACKS_H +# include +# endif + +# ifdef __cplusplus +extern "C" +# endif +int ERR_load_DSO_strings(void); + +/* + * DSO function codes. + */ +# define DSO_F_DLFCN_BIND_FUNC 100 +# 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_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_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_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 105 +# define DSO_F_DSO_SET_FILENAME 129 +# define DSO_F_DSO_UP_REF 114 +# 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 101 +# define DSO_F_WIN32_GLOBALLOOKUP 142 +# 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 109 +# define DSO_F_WIN32_SPLITTER 136 +# define DSO_F_WIN32_UNLOAD 121 + +/* + * DSO 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_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 + +#endif diff --git a/openssl-wasm/include/internal/err.h b/openssl-wasm/include/internal/err.h new file mode 100644 index 0000000..88dde70 --- /dev/null +++ b/openssl-wasm/include/internal/err.h @@ -0,0 +1,15 @@ +/* + * Copyright 2016 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OSSL_INTERNAL_ERR_H +# define OSSL_INTERNAL_ERR_H + +void err_free_strings_int(void); + +#endif diff --git a/openssl-wasm/include/internal/nelem.h b/openssl-wasm/include/internal/nelem.h new file mode 100644 index 0000000..699ef88 --- /dev/null +++ b/openssl-wasm/include/internal/nelem.h @@ -0,0 +1,14 @@ +/* + * Copyright 2017 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OSSL_INTERNAL_NELEM_H +# define OSSL_INTERNAL_NELEM_H + +# define OSSL_NELEM(x) (sizeof(x)/sizeof((x)[0])) +#endif diff --git a/openssl-wasm/include/internal/numbers.h b/openssl-wasm/include/internal/numbers.h new file mode 100644 index 0000000..f5ade52 --- /dev/null +++ b/openssl-wasm/include/internal/numbers.h @@ -0,0 +1,68 @@ +/* + * Copyright 2015-2016 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OSSL_INTERNAL_NUMBERS_H +# define OSSL_INTERNAL_NUMBERS_H + +# include + +# if (-1 & 3) == 0x03 /* Two's complement */ + +# define __MAXUINT__(T) ((T) -1) +# define __MAXINT__(T) ((T) ((((T) 1) << ((sizeof(T) * CHAR_BIT) - 1)) ^ __MAXUINT__(T))) +# define __MININT__(T) (-__MAXINT__(T) - 1) + +# elif (-1 & 3) == 0x02 /* One's complement */ + +# define __MAXUINT__(T) (((T) -1) + 1) +# define __MAXINT__(T) ((T) ((((T) 1) << ((sizeof(T) * CHAR_BIT) - 1)) ^ __MAXUINT__(T))) +# define __MININT__(T) (-__MAXINT__(T)) + +# elif (-1 & 3) == 0x01 /* Sign/magnitude */ + +# define __MAXINT__(T) ((T) (((((T) 1) << ((sizeof(T) * CHAR_BIT) - 2)) - 1) | (((T) 1) << ((sizeof(T) * CHAR_BIT) - 2)))) +# define __MAXUINT__(T) ((T) (__MAXINT__(T) | (((T) 1) << ((sizeof(T) * CHAR_BIT) - 1)))) +# define __MININT__(T) (-__MAXINT__(T)) + +# else + +# error "do not know the integer encoding on this architecture" + +# endif + +# ifndef INT8_MAX +# define INT8_MIN __MININT__(int8_t) +# define INT8_MAX __MAXINT__(int8_t) +# define UINT8_MAX __MAXUINT__(uint8_t) +# endif + +# ifndef INT16_MAX +# define INT16_MIN __MININT__(int16_t) +# define INT16_MAX __MAXINT__(int16_t) +# define UINT16_MAX __MAXUINT__(uint16_t) +# endif + +# ifndef INT32_MAX +# define INT32_MIN __MININT__(int32_t) +# define INT32_MAX __MAXINT__(int32_t) +# define UINT32_MAX __MAXUINT__(uint32_t) +# endif + +# ifndef INT64_MAX +# define INT64_MIN __MININT__(int64_t) +# define INT64_MAX __MAXINT__(int64_t) +# define UINT64_MAX __MAXUINT__(uint64_t) +# endif + +# ifndef SIZE_MAX +# define SIZE_MAX __MAXUINT__(size_t) +# endif + +#endif + diff --git a/openssl-wasm/include/internal/o_dir.h b/openssl-wasm/include/internal/o_dir.h new file mode 100644 index 0000000..dafc8dd --- /dev/null +++ b/openssl-wasm/include/internal/o_dir.h @@ -0,0 +1,52 @@ +/* + * Copyright 2004-2018 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* + * This file is dual-licensed and is also available under the following + * terms: + * + * Copyright (c) 2004, Richard Levitte + * 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. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 THE REGENTS 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. + */ + +#ifndef OSSL_INTERNAL_O_DIR_H +# define OSSL_INTERNAL_O_DIR_H + +typedef struct OPENSSL_dir_context_st OPENSSL_DIR_CTX; + +/* + * returns NULL on error or end-of-directory. If it is end-of-directory, + * errno will be zero + */ +const char *OPENSSL_DIR_read(OPENSSL_DIR_CTX **ctx, const char *directory); +/* returns 1 on success, 0 on error */ +int OPENSSL_DIR_end(OPENSSL_DIR_CTX **ctx); + +#endif /* LPDIR_H */ diff --git a/openssl-wasm/include/internal/o_str.h b/openssl-wasm/include/internal/o_str.h new file mode 100644 index 0000000..15c12e8 --- /dev/null +++ b/openssl-wasm/include/internal/o_str.h @@ -0,0 +1,17 @@ +/* + * Copyright 2003-2016 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OSSL_INTERNAL_O_STR_H +# define OSSL_INTERNAL_O_STR_H + +# include /* to get size_t */ + +int OPENSSL_memcmp(const void *p1, const void *p2, size_t n); + +#endif diff --git a/openssl-wasm/include/internal/refcount.h b/openssl-wasm/include/internal/refcount.h new file mode 100644 index 0000000..8fb536e --- /dev/null +++ b/openssl-wasm/include/internal/refcount.h @@ -0,0 +1,150 @@ +/* + * Copyright 2016-2019 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ +#ifndef OSSL_INTERNAL_REFCOUNT_H +# define OSSL_INTERNAL_REFCOUNT_H + +/* Used to checking reference counts, most while doing perl5 stuff :-) */ +# if defined(OPENSSL_NO_STDIO) +# if defined(REF_PRINT) +# error "REF_PRINT requires stdio" +# endif +# endif + +# if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L \ + && !defined(__STDC_NO_ATOMICS__) +# include +# define HAVE_C11_ATOMICS +# endif + +# if defined(HAVE_C11_ATOMICS) && defined(ATOMIC_INT_LOCK_FREE) \ + && ATOMIC_INT_LOCK_FREE > 0 + +# define HAVE_ATOMICS 1 + +typedef _Atomic int CRYPTO_REF_COUNT; + +static inline int CRYPTO_UP_REF(_Atomic int *val, int *ret, void *lock) +{ + *ret = atomic_fetch_add_explicit(val, 1, memory_order_relaxed) + 1; + return 1; +} + +/* + * Changes to shared structure other than reference counter have to be + * serialized. And any kind of serialization implies a release fence. This + * means that by the time reference counter is decremented all other + * changes are visible on all processors. Hence decrement itself can be + * relaxed. In case it hits zero, object will be destructed. Since it's + * last use of the object, destructor programmer might reason that access + * to mutable members doesn't have to be serialized anymore, which would + * otherwise imply an acquire fence. Hence conditional acquire fence... + */ +static inline int CRYPTO_DOWN_REF(_Atomic int *val, int *ret, void *lock) +{ + *ret = atomic_fetch_sub_explicit(val, 1, memory_order_relaxed) - 1; + if (*ret == 0) + atomic_thread_fence(memory_order_acquire); + return 1; +} + +# elif defined(__GNUC__) && defined(__ATOMIC_RELAXED) && __GCC_ATOMIC_INT_LOCK_FREE > 0 + +# define HAVE_ATOMICS 1 + +typedef int CRYPTO_REF_COUNT; + +static __inline__ int CRYPTO_UP_REF(int *val, int *ret, void *lock) +{ + *ret = __atomic_fetch_add(val, 1, __ATOMIC_RELAXED) + 1; + return 1; +} + +static __inline__ int CRYPTO_DOWN_REF(int *val, int *ret, void *lock) +{ + *ret = __atomic_fetch_sub(val, 1, __ATOMIC_RELAXED) - 1; + if (*ret == 0) + __atomic_thread_fence(__ATOMIC_ACQUIRE); + return 1; +} + +# elif defined(_MSC_VER) && _MSC_VER>=1200 + +# define HAVE_ATOMICS 1 + +typedef volatile int CRYPTO_REF_COUNT; + +# if (defined(_M_ARM) && _M_ARM>=7 && !defined(_WIN32_WCE)) || defined(_M_ARM64) +# include +# if defined(_M_ARM64) && !defined(_ARM_BARRIER_ISH) +# define _ARM_BARRIER_ISH _ARM64_BARRIER_ISH +# endif + +static __inline int CRYPTO_UP_REF(volatile int *val, int *ret, void *lock) +{ + *ret = _InterlockedExchangeAdd_nf(val, 1) + 1; + return 1; +} + +static __inline int CRYPTO_DOWN_REF(volatile int *val, int *ret, void *lock) +{ + *ret = _InterlockedExchangeAdd_nf(val, -1) - 1; + if (*ret == 0) + __dmb(_ARM_BARRIER_ISH); + return 1; +} +# else +# if !defined(_WIN32_WCE) +# pragma intrinsic(_InterlockedExchangeAdd) +# else +# if _WIN32_WCE >= 0x600 + extern long __cdecl _InterlockedExchangeAdd(long volatile*, long); +# else + /* under Windows CE we still have old-style Interlocked* functions */ + extern long __cdecl InterlockedExchangeAdd(long volatile*, long); +# define _InterlockedExchangeAdd InterlockedExchangeAdd +# endif +# endif + +static __inline int CRYPTO_UP_REF(volatile int *val, int *ret, void *lock) +{ + *ret = _InterlockedExchangeAdd(val, 1) + 1; + return 1; +} + +static __inline int CRYPTO_DOWN_REF(volatile int *val, int *ret, void *lock) +{ + *ret = _InterlockedExchangeAdd(val, -1) - 1; + return 1; +} +# endif + +# else + +typedef int CRYPTO_REF_COUNT; + +# define CRYPTO_UP_REF(val, ret, lock) CRYPTO_atomic_add(val, 1, ret, lock) +# define CRYPTO_DOWN_REF(val, ret, lock) CRYPTO_atomic_add(val, -1, ret, lock) + +# endif + +# if !defined(NDEBUG) && !defined(OPENSSL_NO_STDIO) +# define REF_ASSERT_ISNT(test) \ + (void)((test) ? (OPENSSL_die("refcount error", __FILE__, __LINE__), 1) : 0) +# else +# define REF_ASSERT_ISNT(i) +# endif + +# ifdef REF_PRINT +# define REF_PRINT_COUNT(a, b) \ + fprintf(stderr, "%p:%4d:%s\n", b, b->references, a) +# else +# define REF_PRINT_COUNT(a, b) +# endif + +#endif diff --git a/openssl-wasm/include/internal/sockets.h b/openssl-wasm/include/internal/sockets.h new file mode 100644 index 0000000..39186ef --- /dev/null +++ b/openssl-wasm/include/internal/sockets.h @@ -0,0 +1,155 @@ +/* + * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + + +#ifndef OSSL_INTERNAL_SOCKETS_H +# define OSSL_INTERNAL_SOCKETS_H + +# if defined(OPENSSL_SYS_VXWORKS) || defined(OPENSSL_SYS_UEFI) +# define NO_SYS_PARAM_H +# endif +# ifdef WIN32 +# define NO_SYS_UN_H +# endif +# ifdef OPENSSL_SYS_VMS +# define NO_SYS_PARAM_H +# define NO_SYS_UN_H +# endif + +# ifdef OPENSSL_NO_SOCK + +# elif defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS) +# if defined(__DJGPP__) +# include +# include +# include +# include +# elif defined(_WIN32_WCE) && _WIN32_WCE<410 +# define getservbyname _masked_declaration_getservbyname +# endif +# if !defined(IPPROTO_IP) + /* winsock[2].h was included already? */ +# include +# endif +# ifdef getservbyname + /* this is used to be wcecompat/include/winsock_extras.h */ +# undef getservbyname +struct servent *PASCAL getservbyname(const char *, const char *); +# endif + +# ifdef _WIN64 +/* + * Even though sizeof(SOCKET) is 8, it's safe to cast it to int, because + * the value constitutes an index in per-process table of limited size + * and not a real pointer. And we also depend on fact that all processors + * Windows run on happen to be two's-complement, which allows to + * interchange INVALID_SOCKET and -1. + */ +# define socket(d,t,p) ((int)socket(d,t,p)) +# define accept(s,f,l) ((int)accept(s,f,l)) +# endif + +# else + +# ifndef NO_SYS_PARAM_H +# include +# endif +# ifdef OPENSSL_SYS_VXWORKS +# include +# endif + +# include +# if defined(OPENSSL_SYS_VMS_NODECC) +# include +# include +# include +# else +# include +# ifndef NO_SYS_UN_H +# include +# ifndef UNIX_PATH_MAX +# define UNIX_PATH_MAX sizeof(((struct sockaddr_un *)NULL)->sun_path) +# endif +# endif +# ifdef FILIO_H +# include /* FIONBIO in some SVR4, e.g. unixware, solaris */ +# endif +# include +# include +# include +# endif + +# ifdef OPENSSL_SYS_AIX +# include +# endif + +# ifndef VMS +# include +# else +# if !defined(TCPIP_TYPE_SOCKETSHR) && defined(__VMS_VER) && (__VMS_VER > 70000000) + /* ioctl is only in VMS > 7.0 and when socketshr is not used */ +# include +# endif +# include +# if defined(TCPIP_TYPE_SOCKETSHR) +# include +# endif +# endif + +# ifndef INVALID_SOCKET +# define INVALID_SOCKET (-1) +# endif +# endif + +/* + * Some IPv6 implementations are broken, you can disable them in known + * bad versions. + */ +# if !defined(OPENSSL_USE_IPV6) +# if defined(AF_INET6) +# define OPENSSL_USE_IPV6 1 +# else +# define OPENSSL_USE_IPV6 0 +# endif +# endif + +# define get_last_socket_error() errno +# define clear_socket_error() errno=0 + +# if defined(OPENSSL_SYS_WINDOWS) +# undef get_last_socket_error +# undef clear_socket_error +# define get_last_socket_error() WSAGetLastError() +# define clear_socket_error() WSASetLastError(0) +# define readsocket(s,b,n) recv((s),(b),(n),0) +# define writesocket(s,b,n) send((s),(b),(n),0) +# elif defined(__DJGPP__) +# define WATT32 +# define WATT32_NO_OLDIES +# define closesocket(s) close_s(s) +# define readsocket(s,b,n) read_s(s,b,n) +# define writesocket(s,b,n) send(s,b,n,0) +# elif defined(OPENSSL_SYS_VMS) +# define ioctlsocket(a,b,c) ioctl(a,b,c) +# define closesocket(s) close(s) +# define readsocket(s,b,n) recv((s),(b),(n),0) +# define writesocket(s,b,n) send((s),(b),(n),0) +# elif defined(OPENSSL_SYS_VXWORKS) +# define ioctlsocket(a,b,c) ioctl((a),(b),(int)(c)) +# define closesocket(s) close(s) +# define readsocket(s,b,n) read((s),(b),(n)) +# define writesocket(s,b,n) write((s),(char *)(b),(n)) +# else +# define ioctlsocket(a,b,c) ioctl(a,b,c) +# define closesocket(s) close(s) +# define readsocket(s,b,n) read((s),(b),(n)) +# define writesocket(s,b,n) write((s),(b),(n)) +# endif + +#endif diff --git a/openssl-wasm/include/internal/sslconf.h b/openssl-wasm/include/internal/sslconf.h new file mode 100644 index 0000000..92c8941 --- /dev/null +++ b/openssl-wasm/include/internal/sslconf.h @@ -0,0 +1,20 @@ +/* + * Copyright 2018 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OSSL_INTERNAL_SSLCONF_H +# define OSSL_INTERNAL_SSLCONF_H + +typedef struct ssl_conf_cmd_st SSL_CONF_CMD; + +const SSL_CONF_CMD *conf_ssl_get(size_t idx, const char **name, size_t *cnt); +int conf_ssl_name_find(const char *name, size_t *idx); +void conf_ssl_get_cmd(const SSL_CONF_CMD *cmd, size_t idx, char **cmdstr, + char **arg); + +#endif diff --git a/openssl-wasm/include/internal/thread_once.h b/openssl-wasm/include/internal/thread_once.h new file mode 100644 index 0000000..8f8aa6e --- /dev/null +++ b/openssl-wasm/include/internal/thread_once.h @@ -0,0 +1,137 @@ +/* + * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include + +/* + * DEFINE_RUN_ONCE: Define an initialiser function that should be run exactly + * once. It takes no arguments and returns and int result (1 for success or + * 0 for failure). Typical usage might be: + * + * DEFINE_RUN_ONCE(myinitfunc) + * { + * do_some_initialisation(); + * if (init_is_successful()) + * return 1; + * + * return 0; + * } + */ +#define DEFINE_RUN_ONCE(init) \ + static int init(void); \ + int init##_ossl_ret_ = 0; \ + void init##_ossl_(void) \ + { \ + init##_ossl_ret_ = init(); \ + } \ + static int init(void) + +/* + * DECLARE_RUN_ONCE: Declare an initialiser function that should be run exactly + * once that has been defined in another file via DEFINE_RUN_ONCE(). + */ +#define DECLARE_RUN_ONCE(init) \ + extern int init##_ossl_ret_; \ + void init##_ossl_(void); + +/* + * DEFINE_RUN_ONCE_STATIC: Define an initialiser function that should be run + * exactly once. This function will be declared as static within the file. It + * takes no arguments and returns and int result (1 for success or 0 for + * failure). Typical usage might be: + * + * DEFINE_RUN_ONCE_STATIC(myinitfunc) + * { + * do_some_initialisation(); + * if (init_is_successful()) + * return 1; + * + * return 0; + * } + */ +#define DEFINE_RUN_ONCE_STATIC(init) \ + static int init(void); \ + static int init##_ossl_ret_ = 0; \ + static void init##_ossl_(void) \ + { \ + init##_ossl_ret_ = init(); \ + } \ + static int init(void) + +/* + * DEFINE_RUN_ONCE_STATIC_ALT: Define an alternative initialiser function. This + * function will be declared as static within the file. It takes no arguments + * and returns an int result (1 for success or 0 for failure). An alternative + * initialiser function is expected to be associated with a primary initialiser + * function defined via DEFINE_ONCE_STATIC where both functions use the same + * CRYPTO_ONCE object to synchronise. Where an alternative initialiser function + * is used only one of the primary or the alternative initialiser function will + * ever be called - and that function will be called exactly once. Definition + * of an alternative initialiser function MUST occur AFTER the definition of the + * primary initialiser function. + * + * Typical usage might be: + * + * DEFINE_RUN_ONCE_STATIC(myinitfunc) + * { + * do_some_initialisation(); + * if (init_is_successful()) + * return 1; + * + * return 0; + * } + * + * DEFINE_RUN_ONCE_STATIC_ALT(myaltinitfunc, myinitfunc) + * { + * do_some_alternative_initialisation(); + * if (init_is_successful()) + * return 1; + * + * return 0; + * } + */ +#define DEFINE_RUN_ONCE_STATIC_ALT(initalt, init) \ + static int initalt(void); \ + static void initalt##_ossl_(void) \ + { \ + init##_ossl_ret_ = initalt(); \ + } \ + static int initalt(void) + +/* + * RUN_ONCE - use CRYPTO_THREAD_run_once, and check if the init succeeded + * @once: pointer to static object of type CRYPTO_ONCE + * @init: function name that was previously given to DEFINE_RUN_ONCE, + * DEFINE_RUN_ONCE_STATIC or DECLARE_RUN_ONCE. This function + * must return 1 for success or 0 for failure. + * + * The return value is 1 on success (*) or 0 in case of error. + * + * (*) by convention, since the init function must return 1 on success. + */ +#define RUN_ONCE(once, init) \ + (CRYPTO_THREAD_run_once(once, init##_ossl_) ? init##_ossl_ret_ : 0) + +/* + * RUN_ONCE_ALT - use CRYPTO_THREAD_run_once, to run an alternative initialiser + * function and check if that initialisation succeeded + * @once: pointer to static object of type CRYPTO_ONCE + * @initalt: alternative initialiser function name that was previously given to + * DEFINE_RUN_ONCE_STATIC_ALT. This function must return 1 for + * success or 0 for failure. + * @init: primary initialiser function name that was previously given to + * DEFINE_RUN_ONCE_STATIC. This function must return 1 for success or + * 0 for failure. + * + * The return value is 1 on success (*) or 0 in case of error. + * + * (*) by convention, since the init function must return 1 on success. + */ +#define RUN_ONCE_ALT(once, initalt, init) \ + (CRYPTO_THREAD_run_once(once, initalt##_ossl_) ? init##_ossl_ret_ : 0) diff --git a/openssl-wasm/include/internal/tsan_assist.h b/openssl-wasm/include/internal/tsan_assist.h new file mode 100644 index 0000000..cc30162 --- /dev/null +++ b/openssl-wasm/include/internal/tsan_assist.h @@ -0,0 +1,144 @@ +/* + * Copyright 2018-2019 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* + * Contemporary compilers implement lock-free atomic memory access + * primitives that facilitate writing "thread-opportunistic" or even real + * multi-threading low-overhead code. "Thread-opportunistic" is when + * exact result is not required, e.g. some statistics, or execution flow + * doesn't have to be unambiguous. Simplest example is lazy "constant" + * initialization when one can synchronize on variable itself, e.g. + * + * if (var == NOT_YET_INITIALIZED) + * var = function_returning_same_value(); + * + * This does work provided that loads and stores are single-instruction + * operations (and integer ones are on *all* supported platforms), but + * it upsets Thread Sanitizer. Suggested solution is + * + * if (tsan_load(&var) == NOT_YET_INITIALIZED) + * tsan_store(&var, function_returning_same_value()); + * + * Production machine code would be the same, so one can wonder why + * bother. Having Thread Sanitizer accept "thread-opportunistic" code + * allows to move on trouble-shooting real bugs. + * + * Resolving Thread Sanitizer nits was the initial purpose for this module, + * but it was later extended with more nuanced primitives that are useful + * even in "non-opportunistic" scenarios. Most notably verifying if a shared + * structure is fully initialized and bypassing the initialization lock. + * It's suggested to view macros defined in this module as "annotations" for + * thread-safe lock-free code, "Thread-Safe ANnotations"... + * + * It's assumed that ATOMIC_{LONG|INT}_LOCK_FREE are assigned same value as + * ATOMIC_POINTER_LOCK_FREE. And check for >= 2 ensures that corresponding + * code is inlined. It should be noted that statistics counters become + * accurate in such case. + * + * Special note about TSAN_QUALIFIER. It might be undesired to use it in + * a shared header. Because whether operation on specific variable or member + * is atomic or not might be irrelevant in other modules. In such case one + * can use TSAN_QUALIFIER in cast specifically when it has to count. + */ + +#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L \ + && !defined(__STDC_NO_ATOMICS__) +# include + +# if defined(ATOMIC_POINTER_LOCK_FREE) \ + && ATOMIC_POINTER_LOCK_FREE >= 2 +# define TSAN_QUALIFIER _Atomic +# define tsan_load(ptr) atomic_load_explicit((ptr), memory_order_relaxed) +# define tsan_store(ptr, val) atomic_store_explicit((ptr), (val), memory_order_relaxed) +# define tsan_counter(ptr) atomic_fetch_add_explicit((ptr), 1, memory_order_relaxed) +# define tsan_decr(ptr) atomic_fetch_add_explicit((ptr), -1, memory_order_relaxed) +# define tsan_ld_acq(ptr) atomic_load_explicit((ptr), memory_order_acquire) +# define tsan_st_rel(ptr, val) atomic_store_explicit((ptr), (val), memory_order_release) +# endif + +#elif defined(__GNUC__) && defined(__ATOMIC_RELAXED) + +# if defined(__GCC_ATOMIC_POINTER_LOCK_FREE) \ + && __GCC_ATOMIC_POINTER_LOCK_FREE >= 2 +# define TSAN_QUALIFIER volatile +# define tsan_load(ptr) __atomic_load_n((ptr), __ATOMIC_RELAXED) +# define tsan_store(ptr, val) __atomic_store_n((ptr), (val), __ATOMIC_RELAXED) +# define tsan_counter(ptr) __atomic_fetch_add((ptr), 1, __ATOMIC_RELAXED) +# define tsan_decr(ptr) __atomic_fetch_add((ptr), -1, __ATOMIC_RELAXED) +# define tsan_ld_acq(ptr) __atomic_load_n((ptr), __ATOMIC_ACQUIRE) +# define tsan_st_rel(ptr, val) __atomic_store_n((ptr), (val), __ATOMIC_RELEASE) +# endif + +#elif defined(_MSC_VER) && _MSC_VER>=1200 \ + && (defined(_M_IX86) || defined(_M_AMD64) || defined(_M_X64) || \ + defined(_M_ARM64) || (defined(_M_ARM) && _M_ARM >= 7 && !defined(_WIN32_WCE))) +/* + * There is subtle dependency on /volatile: command-line option. + * "ms" implies same semantic as memory_order_acquire for loads and + * memory_order_release for stores, while "iso" - memory_order_relaxed for + * either. Real complication is that defaults are different on x86 and ARM. + * There is explanation for that, "ms" is backward compatible with earlier + * compiler versions, while multi-processor ARM can be viewed as brand new + * platform to MSC and its users, and with non-relaxed semantic taking toll + * with additional instructions and penalties, it kind of makes sense to + * default to "iso"... + */ +# define TSAN_QUALIFIER volatile +# if defined(_M_ARM) || defined(_M_ARM64) +# define _InterlockedExchangeAdd _InterlockedExchangeAdd_nf +# pragma intrinsic(_InterlockedExchangeAdd_nf) +# pragma intrinsic(__iso_volatile_load32, __iso_volatile_store32) +# ifdef _WIN64 +# define _InterlockedExchangeAdd64 _InterlockedExchangeAdd64_nf +# pragma intrinsic(_InterlockedExchangeAdd64_nf) +# pragma intrinsic(__iso_volatile_load64, __iso_volatile_store64) +# define tsan_load(ptr) (sizeof(*(ptr)) == 8 ? __iso_volatile_load64(ptr) \ + : __iso_volatile_load32(ptr)) +# define tsan_store(ptr, val) (sizeof(*(ptr)) == 8 ? __iso_volatile_store64((ptr), (val)) \ + : __iso_volatile_store32((ptr), (val))) +# else +# define tsan_load(ptr) __iso_volatile_load32(ptr) +# define tsan_store(ptr, val) __iso_volatile_store32((ptr), (val)) +# endif +# else +# define tsan_load(ptr) (*(ptr)) +# define tsan_store(ptr, val) (*(ptr) = (val)) +# endif +# pragma intrinsic(_InterlockedExchangeAdd) +# ifdef _WIN64 +# pragma intrinsic(_InterlockedExchangeAdd64) +# define tsan_counter(ptr) (sizeof(*(ptr)) == 8 ? _InterlockedExchangeAdd64((ptr), 1) \ + : _InterlockedExchangeAdd((ptr), 1)) +# define tsan_decr(ptr) (sizeof(*(ptr)) == 8 ? _InterlockedExchangeAdd64((ptr), -1) \ + : _InterlockedExchangeAdd((ptr), -1)) +# else +# define tsan_counter(ptr) _InterlockedExchangeAdd((ptr), 1) +# define tsan_decr(ptr) _InterlockedExchangeAdd((ptr), -1) +# endif +# if !defined(_ISO_VOLATILE) +# define tsan_ld_acq(ptr) (*(ptr)) +# define tsan_st_rel(ptr, val) (*(ptr) = (val)) +# endif + +#endif + +#ifndef TSAN_QUALIFIER + +# define TSAN_QUALIFIER volatile +# define tsan_load(ptr) (*(ptr)) +# define tsan_store(ptr, val) (*(ptr) = (val)) +# define tsan_counter(ptr) ((*(ptr))++) +# define tsan_decr(ptr) ((*(ptr))--) +/* + * Lack of tsan_ld_acq and tsan_ld_rel means that compiler support is not + * sophisticated enough to support them. Code that relies on them should be + * protected with #ifdef tsan_ld_acq with locked fallback. + */ + +#endif diff --git a/openssl-wasm/include/openssl/__DECC_INCLUDE_EPILOGUE.H b/openssl-wasm/include/openssl/__DECC_INCLUDE_EPILOGUE.H new file mode 100644 index 0000000..ad0a5f5 --- /dev/null +++ b/openssl-wasm/include/openssl/__DECC_INCLUDE_EPILOGUE.H @@ -0,0 +1,22 @@ +/* + * Copyright 2016-2020 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* + * This file is only used by HP C/C++ on VMS, and is included automatically + * after each header file from this directory + */ + +/* + * The C++ compiler doesn't understand these pragmas, even though it + * understands the corresponding command line qualifier. + */ +#ifndef __cplusplus +/* restore state. Must correspond to the save in __decc_include_prologue.h */ +# pragma names restore +#endif diff --git a/openssl-wasm/include/openssl/__DECC_INCLUDE_PROLOGUE.H b/openssl-wasm/include/openssl/__DECC_INCLUDE_PROLOGUE.H new file mode 100644 index 0000000..5f5513e --- /dev/null +++ b/openssl-wasm/include/openssl/__DECC_INCLUDE_PROLOGUE.H @@ -0,0 +1,26 @@ +/* + * Copyright 2016-2020 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* + * This file is only used by HP C/C++ on VMS, and is included automatically + * after each header file from this directory + */ + +/* + * The C++ compiler doesn't understand these pragmas, even though it + * understands the corresponding command line qualifier. + */ +#ifndef __cplusplus +/* save state */ +# pragma names save +/* have the compiler shorten symbols larger than 31 chars to 23 chars + * followed by a 8 hex char CRC + */ +# pragma names as_is,shortened +#endif diff --git a/openssl-wasm/include/openssl/aes.h b/openssl-wasm/include/openssl/aes.h new file mode 100644 index 0000000..245c552 --- /dev/null +++ b/openssl-wasm/include/openssl/aes.h @@ -0,0 +1,92 @@ +/* + * Copyright 2002-2016 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_AES_H +# define HEADER_AES_H + +# include + +# include +# ifdef __cplusplus +extern "C" { +# endif + +# 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 + +/* 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); + +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); +/* 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 diff --git a/openssl-wasm/include/openssl/asn1.h b/openssl-wasm/include/openssl/asn1.h new file mode 100644 index 0000000..9522eec --- /dev/null +++ b/openssl-wasm/include/openssl/asn1.h @@ -0,0 +1,886 @@ +/* + * Copyright 1995-2017 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_ASN1_H +# define HEADER_ASN1_H + +# include +# include +# include +# include +# include +# include +# include + +# include +# if OPENSSL_API_COMPAT < 0x10100000L +# 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 /*compat*/ V_ASN1_PRIMITIVE_TAG + +# 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_UNDEF -1 +/* ASN.1 tag values */ +# define V_ASN1_EOC 0 +# define V_ASN1_BOOLEAN 1 /**/ +# define V_ASN1_INTEGER 2 +# 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_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 + +/* + * NB the constants below are used internally by ASN1_INTEGER + * and ASN1_ENUMERATED to indicate the sign. They are *not* on + * the wire tag values. + */ + +# define V_ASN1_NEG 0x100 +# define V_ASN1_NEG_INTEGER (2 | V_ASN1_NEG) +# define V_ASN1_NEG_ENUMERATED (10 | V_ASN1_NEG) + +/* 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; +DEFINE_STACK_OF(X509_ALGOR) + +# 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 +/* String is embedded and only content should be freed */ +# define ASN1_STRING_FLAG_EMBED 0x080 +/* String should be parsed in RFC 5280's time format */ +# define ASN1_STRING_FLAG_X509_TIME 0x100 +/* 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 +/* + * A zero passed to ASN1_STRING_TABLE_new_add for the flags is interpreted + * as "don't change" and STABLE_FLAGS_MALLOC is always set. By setting + * STABLE_FLAGS_MALLOC only we can clear the existing value. Use the alias + * STABLE_FLAGS_CLEAR to reflect this. + */ +# define STABLE_FLAGS_CLEAR STABLE_FLAGS_MALLOC +# 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; + +DEFINE_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 + +/* + * This flag specifies that RC2254 escaping shall be performed. + */ +#define ASN1_STRFLGS_ESC_2254 0x400 + +/* + * 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) + +DEFINE_STACK_OF(ASN1_INTEGER) + +DEFINE_STACK_OF(ASN1_GENERALSTRING) + +DEFINE_STACK_OF(ASN1_UTF8STRING) + +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; + +DEFINE_STACK_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) + +/* 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 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 + +DECLARE_ASN1_FUNCTIONS_fname(ASN1_TYPE, ASN1_ANY, ASN1_TYPE) + +int ASN1_TYPE_get(const ASN1_TYPE *a); +void ASN1_TYPE_set(ASN1_TYPE *a, int type, void *value); +int ASN1_TYPE_set1(ASN1_TYPE *a, int type, const void *value); +int ASN1_TYPE_cmp(const ASN1_TYPE *a, const ASN1_TYPE *b); + +ASN1_TYPE *ASN1_TYPE_pack_sequence(const ASN1_ITEM *it, void *s, ASN1_TYPE **t); +void *ASN1_TYPE_unpack_sequence(const ASN1_ITEM *it, const ASN1_TYPE *t); + +ASN1_OBJECT *ASN1_OBJECT_new(void); +void ASN1_OBJECT_free(ASN1_OBJECT *a); +int i2d_ASN1_OBJECT(const ASN1_OBJECT *a, unsigned char **pp); +ASN1_OBJECT *d2i_ASN1_OBJECT(ASN1_OBJECT **a, const unsigned char **pp, + long length); + +DECLARE_ASN1_ITEM(ASN1_OBJECT) + +DEFINE_STACK_OF(ASN1_OBJECT) + +ASN1_STRING *ASN1_STRING_new(void); +void ASN1_STRING_free(ASN1_STRING *a); +void ASN1_STRING_clear_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(const ASN1_STRING *x); +DEPRECATEDIN_1_1_0(unsigned char *ASN1_STRING_data(ASN1_STRING *x)) +const unsigned char *ASN1_STRING_get0_data(const ASN1_STRING *x); + +DECLARE_ASN1_FUNCTIONS(ASN1_BIT_STRING) +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(const ASN1_BIT_STRING *a, int n); +int ASN1_BIT_STRING_check(const ASN1_BIT_STRING *a, + const unsigned char *flags, int flags_len); + +int ASN1_BIT_STRING_name_print(BIO *out, ASN1_BIT_STRING *bs, + BIT_STRING_BITNAME *tbl, int indent); +int ASN1_BIT_STRING_num_asc(const char *name, BIT_STRING_BITNAME *tbl); +int ASN1_BIT_STRING_set_asc(ASN1_BIT_STRING *bs, const char *name, int value, + BIT_STRING_BITNAME *tbl); + +DECLARE_ASN1_FUNCTIONS(ASN1_INTEGER) +ASN1_INTEGER *d2i_ASN1_UINTEGER(ASN1_INTEGER **a, const unsigned char **pp, + long length); +ASN1_INTEGER *ASN1_INTEGER_dup(const ASN1_INTEGER *x); +int ASN1_INTEGER_cmp(const ASN1_INTEGER *x, const ASN1_INTEGER *y); + +DECLARE_ASN1_FUNCTIONS(ASN1_ENUMERATED) + +int ASN1_UTCTIME_check(const ASN1_UTCTIME *a); +ASN1_UTCTIME *ASN1_UTCTIME_set(ASN1_UTCTIME *s, time_t t); +ASN1_UTCTIME *ASN1_UTCTIME_adj(ASN1_UTCTIME *s, time_t t, + int offset_day, long offset_sec); +int ASN1_UTCTIME_set_string(ASN1_UTCTIME *s, const char *str); +int ASN1_UTCTIME_cmp_time_t(const ASN1_UTCTIME *s, time_t t); + +int ASN1_GENERALIZEDTIME_check(const ASN1_GENERALIZEDTIME *a); +ASN1_GENERALIZEDTIME *ASN1_GENERALIZEDTIME_set(ASN1_GENERALIZEDTIME *s, + time_t t); +ASN1_GENERALIZEDTIME *ASN1_GENERALIZEDTIME_adj(ASN1_GENERALIZEDTIME *s, + time_t t, int offset_day, + long offset_sec); +int ASN1_GENERALIZEDTIME_set_string(ASN1_GENERALIZEDTIME *s, const char *str); + +int ASN1_TIME_diff(int *pday, int *psec, + const ASN1_TIME *from, const ASN1_TIME *to); + +DECLARE_ASN1_FUNCTIONS(ASN1_OCTET_STRING) +ASN1_OCTET_STRING *ASN1_OCTET_STRING_dup(const ASN1_OCTET_STRING *a); +int ASN1_OCTET_STRING_cmp(const ASN1_OCTET_STRING *a, + const ASN1_OCTET_STRING *b); +int ASN1_OCTET_STRING_set(ASN1_OCTET_STRING *str, const unsigned char *data, + int len); + +DECLARE_ASN1_FUNCTIONS(ASN1_VISIBLESTRING) +DECLARE_ASN1_FUNCTIONS(ASN1_UNIVERSALSTRING) +DECLARE_ASN1_FUNCTIONS(ASN1_UTF8STRING) +DECLARE_ASN1_FUNCTIONS(ASN1_NULL) +DECLARE_ASN1_FUNCTIONS(ASN1_BMPSTRING) + +int UTF8_getc(const unsigned char *str, int len, unsigned long *val); +int UTF8_putc(unsigned char *str, int len, unsigned long value); + +DECLARE_ASN1_FUNCTIONS_name(ASN1_STRING, ASN1_PRINTABLE) + +DECLARE_ASN1_FUNCTIONS_name(ASN1_STRING, DIRECTORYSTRING) +DECLARE_ASN1_FUNCTIONS_name(ASN1_STRING, DISPLAYTEXT) +DECLARE_ASN1_FUNCTIONS(ASN1_PRINTABLESTRING) +DECLARE_ASN1_FUNCTIONS(ASN1_T61STRING) +DECLARE_ASN1_FUNCTIONS(ASN1_IA5STRING) +DECLARE_ASN1_FUNCTIONS(ASN1_GENERALSTRING) +DECLARE_ASN1_FUNCTIONS(ASN1_UTCTIME) +DECLARE_ASN1_FUNCTIONS(ASN1_GENERALIZEDTIME) +DECLARE_ASN1_FUNCTIONS(ASN1_TIME) + +DECLARE_ASN1_ITEM(ASN1_OCTET_STRING_NDEF) + +ASN1_TIME *ASN1_TIME_set(ASN1_TIME *s, time_t t); +ASN1_TIME *ASN1_TIME_adj(ASN1_TIME *s, time_t t, + int offset_day, long offset_sec); +int ASN1_TIME_check(const ASN1_TIME *t); +ASN1_GENERALIZEDTIME *ASN1_TIME_to_generalizedtime(const ASN1_TIME *t, + ASN1_GENERALIZEDTIME **out); +int ASN1_TIME_set_string(ASN1_TIME *s, const char *str); +int ASN1_TIME_set_string_X509(ASN1_TIME *s, const char *str); +int ASN1_TIME_to_tm(const ASN1_TIME *s, struct tm *tm); +int ASN1_TIME_normalize(ASN1_TIME *s); +int ASN1_TIME_cmp_time_t(const ASN1_TIME *s, time_t t); +int ASN1_TIME_compare(const ASN1_TIME *a, const ASN1_TIME *b); + +int i2a_ASN1_INTEGER(BIO *bp, const ASN1_INTEGER *a); +int a2i_ASN1_INTEGER(BIO *bp, ASN1_INTEGER *bs, char *buf, int size); +int i2a_ASN1_ENUMERATED(BIO *bp, const ASN1_ENUMERATED *a); +int a2i_ASN1_ENUMERATED(BIO *bp, ASN1_ENUMERATED *bs, char *buf, int size); +int i2a_ASN1_OBJECT(BIO *bp, const ASN1_OBJECT *a); +int a2i_ASN1_STRING(BIO *bp, ASN1_STRING *bs, char *buf, int size); +int i2a_ASN1_STRING(BIO *bp, const ASN1_STRING *a, int type); +int i2t_ASN1_OBJECT(char *buf, int buf_len, const 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_get_int64(int64_t *pr, const ASN1_INTEGER *a); +int ASN1_INTEGER_set_int64(ASN1_INTEGER *a, int64_t r); +int ASN1_INTEGER_get_uint64(uint64_t *pr, const ASN1_INTEGER *a); +int ASN1_INTEGER_set_uint64(ASN1_INTEGER *a, uint64_t r); + +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_get_int64(int64_t *pr, const ASN1_ENUMERATED *a); +int ASN1_ENUMERATED_set_int64(ASN1_ENUMERATED *a, int64_t r); + + +int ASN1_ENUMERATED_set(ASN1_ENUMERATED *a, long v); +long ASN1_ENUMERATED_get(const ASN1_ENUMERATED *a); +ASN1_ENUMERATED *BN_to_ASN1_ENUMERATED(const BIGNUM *bn, ASN1_ENUMERATED *ai); +BIGNUM *ASN1_ENUMERATED_to_BN(const 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); + +unsigned long ASN1_tag2bit(int tag); + +/* 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_STDIO +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, const ASN1_STRING *str, unsigned long flags); +# endif + +int ASN1_STRING_to_UTF8(unsigned char **out, const ASN1_STRING *in); + +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, const ASN1_STRING *str, unsigned long flags); +int ASN1_buf_print(BIO *bp, const unsigned char *buf, size_t buflen, int off); +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); +const char *ASN1_tag2str(int tag); + +/* Used to load and write Netscape format cert */ + +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(const 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(const ASN1_TYPE *a, long *num, + unsigned char *data, int max_len); + +void *ASN1_item_unpack(const ASN1_STRING *oct, const ASN1_ITEM *it); + +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); +void ASN1_add_stable_module(void); + +ASN1_TYPE *ASN1_generate_nconf(const char *str, CONF *nconf); +ASN1_TYPE *ASN1_generate_v3(const char *str, X509V3_CTX *cnf); +int ASN1_str2mask(const char *str, unsigned long *pmask); + +/* 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(const ASN1_PCTX *p); +void ASN1_PCTX_set_flags(ASN1_PCTX *p, unsigned long flags); +unsigned long ASN1_PCTX_get_nm_flags(const ASN1_PCTX *p); +void ASN1_PCTX_set_nm_flags(ASN1_PCTX *p, unsigned long flags); +unsigned long ASN1_PCTX_get_cert_flags(const ASN1_PCTX *p); +void ASN1_PCTX_set_cert_flags(ASN1_PCTX *p, unsigned long flags); +unsigned long ASN1_PCTX_get_oid_flags(const ASN1_PCTX *p); +void ASN1_PCTX_set_oid_flags(ASN1_PCTX *p, unsigned long flags); +unsigned long ASN1_PCTX_get_str_flags(const ASN1_PCTX *p); +void ASN1_PCTX_set_str_flags(ASN1_PCTX *p, unsigned long flags); + +ASN1_SCTX *ASN1_SCTX_new(int (*scan_cb) (ASN1_SCTX *ctx)); +void ASN1_SCTX_free(ASN1_SCTX *p); +const ASN1_ITEM *ASN1_SCTX_get_item(ASN1_SCTX *p); +const ASN1_TEMPLATE *ASN1_SCTX_get_template(ASN1_SCTX *p); +unsigned long ASN1_SCTX_get_flags(ASN1_SCTX *p); +void ASN1_SCTX_set_app_data(ASN1_SCTX *p, void *data); +void *ASN1_SCTX_get_app_data(ASN1_SCTX *p); + +const 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); + +const ASN1_ITEM *ASN1_ITEM_lookup(const char *name); +const ASN1_ITEM *ASN1_ITEM_get(size_t i); + +# ifdef __cplusplus +} +# endif +#endif diff --git a/openssl-wasm/include/openssl/asn1_mac.h b/openssl-wasm/include/openssl/asn1_mac.h new file mode 100644 index 0000000..7ac1782 --- /dev/null +++ b/openssl-wasm/include/openssl/asn1_mac.h @@ -0,0 +1,10 @@ +/* + * Copyright 2015-2016 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#error "This file is obsolete; please update your software." diff --git a/openssl-wasm/include/openssl/asn1err.h b/openssl-wasm/include/openssl/asn1err.h new file mode 100644 index 0000000..e1ad1fe --- /dev/null +++ b/openssl-wasm/include/openssl/asn1err.h @@ -0,0 +1,256 @@ +/* + * Generated by util/mkerr.pl DO NOT EDIT + * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_ASN1ERR_H +# define HEADER_ASN1ERR_H + +# include + +# ifdef __cplusplus +extern "C" +# endif +int ERR_load_ASN1_strings(void); + +/* + * ASN1 function codes. + */ +# define ASN1_F_A2D_ASN1_OBJECT 100 +# define ASN1_F_A2I_ASN1_INTEGER 102 +# define ASN1_F_A2I_ASN1_STRING 103 +# define ASN1_F_APPEND_EXP 176 +# define ASN1_F_ASN1_BIO_INIT 113 +# 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_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_DO_LOCK 233 +# define ASN1_F_ASN1_DUP 111 +# define ASN1_F_ASN1_ENC_SAVE 115 +# 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_GENERATE_V3 178 +# define ASN1_F_ASN1_GET_INT64 224 +# define ASN1_F_ASN1_GET_OBJECT 114 +# define ASN1_F_ASN1_GET_UINT64 225 +# define ASN1_F_ASN1_I2D_BIO 116 +# define ASN1_F_ASN1_I2D_FP 117 +# define ASN1_F_ASN1_ITEM_D2I_FP 206 +# define ASN1_F_ASN1_ITEM_DUP 191 +# define ASN1_F_ASN1_ITEM_EMBED_D2I 120 +# define ASN1_F_ASN1_ITEM_EMBED_NEW 121 +# define ASN1_F_ASN1_ITEM_EX_I2D 144 +# define ASN1_F_ASN1_ITEM_FLAGS_I2D 118 +# 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_PCTX_NEW 205 +# define ASN1_F_ASN1_PRIMITIVE_NEW 119 +# define ASN1_F_ASN1_SCTX_NEW 221 +# define ASN1_F_ASN1_SIGN 128 +# define ASN1_F_ASN1_STR2TYPE 179 +# define ASN1_F_ASN1_STRING_GET_INT64 227 +# define ASN1_F_ASN1_STRING_GET_UINT64 230 +# define ASN1_F_ASN1_STRING_SET 186 +# define ASN1_F_ASN1_STRING_TABLE_ADD 129 +# define ASN1_F_ASN1_STRING_TO_BN 228 +# 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_TYPE_GET_INT_OCTETSTRING 134 +# define ASN1_F_ASN1_TYPE_GET_OCTETSTRING 135 +# define ASN1_F_ASN1_UTCTIME_ADJ 218 +# 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_STRING 229 +# 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_C2I_IBUF 226 +# define ASN1_F_C2I_UINT64_INT 101 +# define ASN1_F_COLLECT_DATA 140 +# define ASN1_F_D2I_ASN1_OBJECT 147 +# define ASN1_F_D2I_ASN1_UINTEGER 150 +# define ASN1_F_D2I_AUTOPRIVATEKEY 207 +# define ASN1_F_D2I_PRIVATEKEY 154 +# define ASN1_F_D2I_PUBLICKEY 155 +# define ASN1_F_DO_BUF 142 +# define ASN1_F_DO_CREATE 124 +# define ASN1_F_DO_DUMP 125 +# define ASN1_F_DO_TCREATE 222 +# define ASN1_F_I2A_ASN1_OBJECT 126 +# define ASN1_F_I2D_ASN1_BIO_STREAM 211 +# define ASN1_F_I2D_ASN1_OBJECT 143 +# 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_PUBKEY 165 +# define ASN1_F_LONG_C2I 166 +# define ASN1_F_NDEF_PREFIX 127 +# define ASN1_F_NDEF_SUFFIX 136 +# 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_PBE2_SET_SCRYPT 231 +# 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_PKCS5_SCRYPT_SET 232 +# define ASN1_F_SMIME_READ_ASN1 212 +# define ASN1_F_SMIME_TEXT 213 +# define ASN1_F_STABLE_GET 138 +# define ASN1_F_STBL_MODULE_INIT 223 +# define ASN1_F_UINT32_C2I 105 +# define ASN1_F_UINT32_NEW 139 +# define ASN1_F_UINT64_C2I 112 +# define ASN1_F_UINT64_NEW 141 +# 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_PKEY_NEW 173 + +/* + * ASN1 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_OBJECT_HEADER 102 +# define ASN1_R_BAD_TEMPLATE 230 +# 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_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_SETTING_CIPHER_PARAMS 114 +# define ASN1_R_EXPECTING_AN_INTEGER 115 +# define ASN1_R_EXPECTING_AN_OBJECT 116 +# 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_NEGATIVE_VALUE 226 +# 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_PADDING 221 +# define ASN1_R_ILLEGAL_TAGGED_ANY 127 +# define ASN1_R_ILLEGAL_TIME_VALUE 184 +# define ASN1_R_ILLEGAL_ZERO_CONTENT 222 +# define ASN1_R_INTEGER_NOT_ASCII_FORMAT 185 +# define ASN1_R_INTEGER_TOO_LARGE_FOR_LONG 128 +# define ASN1_R_INVALID_BIT_STRING_BITS_LEFT 220 +# define ASN1_R_INVALID_BMPSTRING_LENGTH 129 +# define ASN1_R_INVALID_DIGIT 130 +# define ASN1_R_INVALID_MIME_TYPE 205 +# define ASN1_R_INVALID_MODIFIER 186 +# define ASN1_R_INVALID_NUMBER 187 +# define ASN1_R_INVALID_OBJECT_ENCODING 216 +# define ASN1_R_INVALID_SCRYPT_PARAMETERS 227 +# define ASN1_R_INVALID_SEPARATOR 131 +# define ASN1_R_INVALID_STRING_TABLE_VALUE 218 +# define ASN1_R_INVALID_UNIVERSALSTRING_LENGTH 133 +# define ASN1_R_INVALID_UTF8STRING 134 +# define ASN1_R_INVALID_VALUE 219 +# 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_NESTED_TOO_DEEP 201 +# 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_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_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_THE_ASN1_OBJECT_IDENTIFIER_IS_NOT_KNOWN_FOR_THIS_MD 154 +# define ASN1_R_TIME_NOT_ASCII_FORMAT 193 +# define ASN1_R_TOO_LARGE 223 +# define ASN1_R_TOO_LONG 155 +# define ASN1_R_TOO_SMALL 224 +# define ASN1_R_TYPE_NOT_CONSTRUCTED 156 +# define ASN1_R_TYPE_NOT_PRIMITIVE 195 +# 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_UNSUPPORTED_ANY_DEFINED_BY_TYPE 164 +# define ASN1_R_UNSUPPORTED_CIPHER 228 +# define ASN1_R_UNSUPPORTED_PUBLIC_KEY_TYPE 167 +# define ASN1_R_UNSUPPORTED_TYPE 196 +# define ASN1_R_WRONG_INTEGER_TYPE 225 +# define ASN1_R_WRONG_PUBLIC_KEY_TYPE 200 +# define ASN1_R_WRONG_TAG 168 + +#endif diff --git a/openssl-wasm/include/openssl/asn1t.h b/openssl-wasm/include/openssl/asn1t.h new file mode 100644 index 0000000..a450ba0 --- /dev/null +++ b/openssl-wasm/include/openssl/asn1t.h @@ -0,0 +1,945 @@ +/* + * Copyright 2000-2016 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#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) \ + const ASN1_ITEM itname##_it = { + +# define static_ASN1_ITEM_start(itname) \ + static 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 static_ASN1_ITEM_start(itname) \ + static ASN1_ITEM_start(itname) + +# 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) +# define static_ASN1_ITEM_TEMPLATE_END(tname) \ + ;\ + static_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 static_ASN1_SEQUENCE_END(stname) static_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),\ + #tname \ + ASN1_ITEM_end(tname) + +# define static_ASN1_SEQUENCE_END_name(stname, tname) \ + ;\ + static_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) \ + static const ASN1_AUX tname##_aux = {NULL, ASN1_AFLG_REFCOUNT, offsetof(tname, references), offsetof(tname, lock), 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 static_ASN1_NDEF_SEQUENCE_END(tname) \ + ;\ + static_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 static_ASN1_BROKEN_SEQUENCE_END(stname) \ + static_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 static_ASN1_SEQUENCE_END_cb(stname, tname) static_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),\ + #tname \ + ASN1_ITEM_end(tname) +# define static_ASN1_SEQUENCE_END_ref(stname, tname) \ + ;\ + static_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 static_ASN1_CHOICE_END(stname) static_ASN1_CHOICE_END_name(stname, stname) + +# define ASN1_CHOICE_END_name(stname, tname) ASN1_CHOICE_END_selector(stname, tname, type) + +# define static_ASN1_CHOICE_END_name(stname, tname) static_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 static_ASN1_CHOICE_END_selector(stname, tname, selname) \ + ;\ + static_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) } + +/* 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) +/* Embedded simple type */ +# define ASN1_EMBED(stname, field, type) ASN1_EX_TYPE(ASN1_TFLG_EMBED,0, stname, field, type) + +/* OPTIONAL simple type */ +# define ASN1_OPT(stname, field, type) ASN1_EX_TYPE(ASN1_TFLG_OPTIONAL, 0, stname, field, type) +# define ASN1_OPT_EMBED(stname, field, type) ASN1_EX_TYPE(ASN1_TFLG_OPTIONAL|ASN1_TFLG_EMBED, 0, stname, field, type) + +/* IMPLICIT tagged simple type */ +# define ASN1_IMP(stname, field, type, tag) ASN1_IMP_EX(stname, field, type, tag, 0) +# define ASN1_IMP_EMBED(stname, field, type, tag) ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_EMBED) + +/* IMPLICIT tagged OPTIONAL simple type */ +# define ASN1_IMP_OPT(stname, field, type, tag) ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL) +# define ASN1_IMP_OPT_EMBED(stname, field, type, tag) ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL|ASN1_TFLG_EMBED) + +/* Same as above but EXPLICIT */ + +# define ASN1_EXP(stname, field, type, tag) ASN1_EXP_EX(stname, field, type, tag, 0) +# define ASN1_EXP_EMBED(stname, field, type, tag) ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_EMBED) +# define ASN1_EXP_OPT(stname, field, type, tag) ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL) +# define ASN1_EXP_OPT_EMBED(stname, field, type, tag) ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL|ASN1_TFLG_EMBED) + +/* 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, adb_cb, def, none) \ + ;\ + static const ASN1_ADB name##_adb = {\ + flags,\ + offsetof(name, field),\ + adb_cb,\ + name##_adbtbl,\ + sizeof(name##_adbtbl) / sizeof(ASN1_ADB_TABLE),\ + def,\ + none\ + } + +# else + +# define ASN1_ADB_END(name, flags, field, adb_cb, def, none) \ + ;\ + static const ASN1_ITEM *name##_adb(void) \ + { \ + static const ASN1_ADB internal_adb = \ + {\ + flags,\ + offsetof(name, field),\ + adb_cb,\ + 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 */ + const char *field_name; /* Field name */ + 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 */ + int (*adb_cb)(long *psel); /* Application callback */ + 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 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) + +/* Field is embedded and not a pointer */ +# define ASN1_TFLG_EMBED (0x1 << 12) + +/* 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) */ + const char *sname; /* Structure name */ +}; + +/*- + * 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. + * + * 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_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 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_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) + +# 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));\ + } + +# define IMPLEMENT_STATIC_ASN1_ENCODE_FUNCTIONS(stname) \ + static stname *d2i_##stname(stname **a, \ + const unsigned char **in, long len) \ + { \ + return (stname *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, \ + ASN1_ITEM_rptr(stname)); \ + } \ + static int i2d_##stname(stname *a, unsigned char **out) \ + { \ + return ASN1_item_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(INT32) +DECLARE_ASN1_ITEM(ZINT32) +DECLARE_ASN1_ITEM(UINT32) +DECLARE_ASN1_ITEM(ZUINT32) +DECLARE_ASN1_ITEM(INT64) +DECLARE_ASN1_ITEM(ZINT64) +DECLARE_ASN1_ITEM(UINT64) +DECLARE_ASN1_ITEM(ZUINT64) + +# if OPENSSL_API_COMPAT < 0x10200000L +/* + * LONG and ZLONG are strongly discouraged for use as stored data, as the + * underlying C type (long) differs in size depending on the architecture. + * They are designed with 32-bit longs in mind. + */ +DECLARE_ASN1_ITEM(LONG) +DECLARE_ASN1_ITEM(ZLONG) +# endif + +DEFINE_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_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); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/openssl-wasm/include/openssl/async.h b/openssl-wasm/include/openssl/async.h new file mode 100644 index 0000000..7052b89 --- /dev/null +++ b/openssl-wasm/include/openssl/async.h @@ -0,0 +1,76 @@ +/* + * Copyright 2015-2018 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include + +#ifndef HEADER_ASYNC_H +# define HEADER_ASYNC_H + +#if defined(_WIN32) +# if defined(BASETYPES) || defined(_WINDEF_H) +/* application has to include to use this */ +#define OSSL_ASYNC_FD HANDLE +#define OSSL_BAD_ASYNC_FD INVALID_HANDLE_VALUE +# endif +#else +#define OSSL_ASYNC_FD int +#define OSSL_BAD_ASYNC_FD -1 +#endif +# include + + +# ifdef __cplusplus +extern "C" { +# endif + +typedef struct async_job_st ASYNC_JOB; +typedef struct async_wait_ctx_st ASYNC_WAIT_CTX; + +#define ASYNC_ERR 0 +#define ASYNC_NO_JOBS 1 +#define ASYNC_PAUSE 2 +#define ASYNC_FINISH 3 + +int ASYNC_init_thread(size_t max_size, size_t init_size); +void ASYNC_cleanup_thread(void); + +#ifdef OSSL_ASYNC_FD +ASYNC_WAIT_CTX *ASYNC_WAIT_CTX_new(void); +void ASYNC_WAIT_CTX_free(ASYNC_WAIT_CTX *ctx); +int ASYNC_WAIT_CTX_set_wait_fd(ASYNC_WAIT_CTX *ctx, const void *key, + OSSL_ASYNC_FD fd, + void *custom_data, + void (*cleanup)(ASYNC_WAIT_CTX *, const void *, + OSSL_ASYNC_FD, void *)); +int ASYNC_WAIT_CTX_get_fd(ASYNC_WAIT_CTX *ctx, const void *key, + OSSL_ASYNC_FD *fd, void **custom_data); +int ASYNC_WAIT_CTX_get_all_fds(ASYNC_WAIT_CTX *ctx, OSSL_ASYNC_FD *fd, + size_t *numfds); +int ASYNC_WAIT_CTX_get_changed_fds(ASYNC_WAIT_CTX *ctx, OSSL_ASYNC_FD *addfd, + size_t *numaddfds, OSSL_ASYNC_FD *delfd, + size_t *numdelfds); +int ASYNC_WAIT_CTX_clear_fd(ASYNC_WAIT_CTX *ctx, const void *key); +#endif + +int ASYNC_is_capable(void); + +int ASYNC_start_job(ASYNC_JOB **job, ASYNC_WAIT_CTX *ctx, int *ret, + int (*func)(void *), void *args, size_t size); +int ASYNC_pause_job(void); + +ASYNC_JOB *ASYNC_get_current_job(void); +ASYNC_WAIT_CTX *ASYNC_get_wait_ctx(ASYNC_JOB *job); +void ASYNC_block_pause(void); +void ASYNC_unblock_pause(void); + + +# ifdef __cplusplus +} +# endif +#endif diff --git a/openssl-wasm/include/openssl/asyncerr.h b/openssl-wasm/include/openssl/asyncerr.h new file mode 100644 index 0000000..91afbbb --- /dev/null +++ b/openssl-wasm/include/openssl/asyncerr.h @@ -0,0 +1,42 @@ +/* + * Generated by util/mkerr.pl DO NOT EDIT + * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_ASYNCERR_H +# define HEADER_ASYNCERR_H + +# ifndef HEADER_SYMHACKS_H +# include +# endif + +# ifdef __cplusplus +extern "C" +# endif +int ERR_load_ASYNC_strings(void); + +/* + * ASYNC function codes. + */ +# define ASYNC_F_ASYNC_CTX_NEW 100 +# define ASYNC_F_ASYNC_INIT_THREAD 101 +# define ASYNC_F_ASYNC_JOB_NEW 102 +# define ASYNC_F_ASYNC_PAUSE_JOB 103 +# define ASYNC_F_ASYNC_START_FUNC 104 +# define ASYNC_F_ASYNC_START_JOB 105 +# define ASYNC_F_ASYNC_WAIT_CTX_SET_WAIT_FD 106 + +/* + * ASYNC reason codes. + */ +# define ASYNC_R_FAILED_TO_SET_POOL 101 +# define ASYNC_R_FAILED_TO_SWAP_CONTEXT 102 +# define ASYNC_R_INIT_FAILED 105 +# define ASYNC_R_INVALID_POOL_SIZE 103 + +#endif diff --git a/openssl-wasm/include/openssl/bio.h b/openssl-wasm/include/openssl/bio.h new file mode 100644 index 0000000..ae559a5 --- /dev/null +++ b/openssl-wasm/include/openssl/bio.h @@ -0,0 +1,801 @@ +/* + * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_BIO_H +# define HEADER_BIO_H + +# include + +# ifndef OPENSSL_NO_STDIO +# include +# endif +# include + +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +/* There are the classes of BIOs */ +# define BIO_TYPE_DESCRIPTOR 0x0100 /* socket, fd, connect or accept */ +# define BIO_TYPE_FILTER 0x0200 +# define BIO_TYPE_SOURCE_SINK 0x0400 + +/* These are the 'types' of BIOs */ +# define BIO_TYPE_NONE 0 +# define BIO_TYPE_MEM ( 1|BIO_TYPE_SOURCE_SINK) +# define BIO_TYPE_FILE ( 2|BIO_TYPE_SOURCE_SINK) + +# define BIO_TYPE_FD ( 4|BIO_TYPE_SOURCE_SINK|BIO_TYPE_DESCRIPTOR) +# define BIO_TYPE_SOCKET ( 5|BIO_TYPE_SOURCE_SINK|BIO_TYPE_DESCRIPTOR) +# define BIO_TYPE_NULL ( 6|BIO_TYPE_SOURCE_SINK) +# define BIO_TYPE_SSL ( 7|BIO_TYPE_FILTER) +# define BIO_TYPE_MD ( 8|BIO_TYPE_FILTER) +# define BIO_TYPE_BUFFER ( 9|BIO_TYPE_FILTER) +# define BIO_TYPE_CIPHER (10|BIO_TYPE_FILTER) +# define BIO_TYPE_BASE64 (11|BIO_TYPE_FILTER) +# define BIO_TYPE_CONNECT (12|BIO_TYPE_SOURCE_SINK|BIO_TYPE_DESCRIPTOR) +# define BIO_TYPE_ACCEPT (13|BIO_TYPE_SOURCE_SINK|BIO_TYPE_DESCRIPTOR) + +# define BIO_TYPE_NBIO_TEST (16|BIO_TYPE_FILTER)/* server proxy BIO */ +# define BIO_TYPE_NULL_FILTER (17|BIO_TYPE_FILTER) +# define BIO_TYPE_BIO (19|BIO_TYPE_SOURCE_SINK)/* half a BIO pair */ +# define BIO_TYPE_LINEBUFFER (20|BIO_TYPE_FILTER) +# define BIO_TYPE_DGRAM (21|BIO_TYPE_SOURCE_SINK|BIO_TYPE_DESCRIPTOR) +# define BIO_TYPE_ASN1 (22|BIO_TYPE_FILTER) +# define BIO_TYPE_COMP (23|BIO_TYPE_FILTER) +# ifndef OPENSSL_NO_SCTP +# define BIO_TYPE_DGRAM_SCTP (24|BIO_TYPE_SOURCE_SINK|BIO_TYPE_DESCRIPTOR) +# endif + +#define BIO_TYPE_START 128 + +/* + * 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 */ +# define BIO_CTRL_SET_CALLBACK 14/* opt - set callback function */ +# define BIO_CTRL_GET_CALLBACK 15/* opt - set callback function */ + +# define BIO_CTRL_PEEK 29/* BIO_f_buffer special */ +# define BIO_CTRL_SET_FILENAME 30/* BIO_s_file special */ + +/* dgram BIO stuff */ +# define BIO_CTRL_DGRAM_CONNECT 31/* BIO dgram special */ +# define BIO_CTRL_DGRAM_SET_CONNECTED 32/* allow for an externally connected + * socket to be passed in */ +# define BIO_CTRL_DGRAM_SET_RECV_TIMEOUT 33/* setsockopt, essentially */ +# define BIO_CTRL_DGRAM_GET_RECV_TIMEOUT 34/* getsockopt, essentially */ +# define BIO_CTRL_DGRAM_SET_SEND_TIMEOUT 35/* setsockopt, essentially */ +# define BIO_CTRL_DGRAM_GET_SEND_TIMEOUT 36/* getsockopt, essentially */ + +# define BIO_CTRL_DGRAM_GET_RECV_TIMER_EXP 37/* flag whether the last */ +# define BIO_CTRL_DGRAM_GET_SEND_TIMER_EXP 38/* I/O operation tiemd out */ + +/* #ifdef IP_MTU_DISCOVER */ +# define BIO_CTRL_DGRAM_MTU_DISCOVER 39/* set DF bit on egress packets */ +/* #endif */ + +# define BIO_CTRL_DGRAM_QUERY_MTU 40/* as kernel for current MTU */ +# define BIO_CTRL_DGRAM_GET_FALLBACK_MTU 47 +# define BIO_CTRL_DGRAM_GET_MTU 41/* get cached value for MTU */ +# define BIO_CTRL_DGRAM_SET_MTU 42/* set cached value for MTU. + * want to use this if asking + * the kernel fails */ + +# define BIO_CTRL_DGRAM_MTU_EXCEEDED 43/* check whether the MTU was + * exceed in the previous write + * operation */ + +# define BIO_CTRL_DGRAM_GET_PEER 46 +# define BIO_CTRL_DGRAM_SET_PEER 44/* Destination for the data */ + +# define BIO_CTRL_DGRAM_SET_NEXT_TIMEOUT 45/* Next DTLS handshake timeout + * to adjust socket timeouts */ +# define BIO_CTRL_DGRAM_SET_DONT_FRAG 48 + +# define BIO_CTRL_DGRAM_GET_MTU_OVERHEAD 49 + +/* Deliberately outside of OPENSSL_NO_SCTP - used in bss_dgram.c */ +# define BIO_CTRL_DGRAM_SCTP_SET_IN_HANDSHAKE 50 +# ifndef OPENSSL_NO_SCTP +/* SCTP stuff */ +# 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 + +# define BIO_CTRL_DGRAM_SET_PEEK_MODE 71 + +/* 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 + +# define BIO_FLAGS_BASE64_NO_NL 0x100 + +/* + * This is used with memory BIOs: + * BIO_FLAGS_MEM_RDONLY means we shouldn't free up or change the data in any way; + * BIO_FLAGS_NONCLEAR_RST means we shouldn't clear data on reset. + */ +# define BIO_FLAGS_MEM_RDONLY 0x200 +# define BIO_FLAGS_NONCLEAR_RST 0x400 +# define BIO_FLAGS_IN_EOF 0x800 + +typedef union bio_addr_st BIO_ADDR; +typedef struct bio_addrinfo_st BIO_ADDRINFO; + +int BIO_get_new_index(void); +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) + +typedef long (*BIO_callback_fn)(BIO *b, int oper, const char *argp, int argi, + long argl, long ret); +typedef long (*BIO_callback_fn_ex)(BIO *b, int oper, const char *argp, + size_t len, int argi, + long argl, int ret, size_t *processed); +BIO_callback_fn BIO_get_callback(const BIO *b); +void BIO_set_callback(BIO *b, BIO_callback_fn callback); + +BIO_callback_fn_ex BIO_get_callback_ex(const BIO *b); +void BIO_set_callback_ex(BIO *b, BIO_callback_fn_ex callback); + +char *BIO_get_callback_arg(const BIO *b); +void BIO_set_callback_arg(BIO *b, char *arg); + +typedef struct bio_method_st BIO_METHOD; + +const char *BIO_method_name(const BIO *b); +int BIO_method_type(const BIO *b); + +typedef int BIO_info_cb(BIO *, int, int); +typedef BIO_info_cb bio_info_cb; /* backward compatibility */ + +DEFINE_STACK_OF(BIO) + +/* 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 + +/* + * #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_C_SET_CONNECT_MODE 155 + +# 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) + +# define BIO_set_nbio(b,n) BIO_ctrl(b,BIO_C_SET_NBIO,(n),NULL) + +# ifndef OPENSSL_NO_SOCK +/* IP families we support, for BIO_s_connect() and BIO_s_accept() */ +/* Note: the underlying operating system may not support some of them */ +# define BIO_FAMILY_IPV4 4 +# define BIO_FAMILY_IPV6 6 +# define BIO_FAMILY_IPANY 256 + +/* BIO_s_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_address(b,addr) BIO_ctrl(b,BIO_C_SET_CONNECT,2, \ + (char *)(addr)) +# define BIO_set_conn_ip_family(b,f) BIO_int_ctrl(b,BIO_C_SET_CONNECT,3,f) +# define BIO_get_conn_hostname(b) ((const char *)BIO_ptr_ctrl(b,BIO_C_GET_CONNECT,0)) +# define BIO_get_conn_port(b) ((const char *)BIO_ptr_ctrl(b,BIO_C_GET_CONNECT,1)) +# define BIO_get_conn_address(b) ((const BIO_ADDR *)BIO_ptr_ctrl(b,BIO_C_GET_CONNECT,2)) +# define BIO_get_conn_ip_family(b) BIO_ctrl(b,BIO_C_GET_CONNECT,3,NULL) +# define BIO_set_conn_mode(b,n) BIO_ctrl(b,BIO_C_SET_CONNECT_MODE,(n),NULL) + +/* BIO_s_accept() */ +# define BIO_set_accept_name(b,name) BIO_ctrl(b,BIO_C_SET_ACCEPT,0, \ + (char *)(name)) +# define BIO_set_accept_port(b,port) BIO_ctrl(b,BIO_C_SET_ACCEPT,1, \ + (char *)(port)) +# define BIO_get_accept_name(b) ((const char *)BIO_ptr_ctrl(b,BIO_C_GET_ACCEPT,0)) +# define BIO_get_accept_port(b) ((const char *)BIO_ptr_ctrl(b,BIO_C_GET_ACCEPT,1)) +# define BIO_get_peer_name(b) ((const char *)BIO_ptr_ctrl(b,BIO_C_GET_ACCEPT,2)) +# define BIO_get_peer_port(b) ((const char *)BIO_ptr_ctrl(b,BIO_C_GET_ACCEPT,3)) +/* #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,2,(n)?(void *)"a":NULL) +# define BIO_set_accept_bios(b,bio) BIO_ctrl(b,BIO_C_SET_ACCEPT,3, \ + (char *)(bio)) +# define BIO_set_accept_ip_family(b,f) BIO_int_ctrl(b,BIO_C_SET_ACCEPT,4,f) +# define BIO_get_accept_ip_family(b) BIO_ctrl(b,BIO_C_GET_ACCEPT,4,NULL) + +/* Aliases kept for backward compatibility */ +# define BIO_BIND_NORMAL 0 +# define BIO_BIND_REUSEADDR BIO_SOCK_REUSEADDR +# define BIO_BIND_REUSEADDR_IF_UNUSED BIO_SOCK_REUSEADDR +# define BIO_set_bind_mode(b,mode) BIO_ctrl(b,BIO_C_SET_BIND_MODE,mode,NULL) +# define BIO_get_bind_mode(b) BIO_ctrl(b,BIO_C_GET_BIND_MODE,0,NULL) + +/* BIO_s_accept() and BIO_s_connect() */ +# define BIO_do_connect(b) BIO_do_handshake(b) +# define BIO_do_accept(b) BIO_do_handshake(b) +# endif /* OPENSSL_NO_SOCK */ + +# define BIO_do_handshake(b) BIO_ctrl(b,BIO_C_DO_STATE_MACHINE,0,NULL) + +/* BIO_s_datagram(), BIO_s_fd(), BIO_s_socket(), BIO_s_accept() and BIO_s_connect() */ +# 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)) + +/* BIO_s_file() */ +# 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)) + +/* BIO_s_fd() and BIO_s_file() */ +# 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) (int)BIO_ctrl(b,BIO_C_SET_FILENAME, \ + BIO_CLOSE|BIO_FP_READ,(char *)(name)) +# endif +# define BIO_write_filename(b,name) (int)BIO_ctrl(b,BIO_C_SET_FILENAME, \ + BIO_CLOSE|BIO_FP_WRITE,name) +# define BIO_append_filename(b,name) (int)BIO_ctrl(b,BIO_C_SET_FILENAME, \ + BIO_CLOSE|BIO_FP_APPEND,name) +# define BIO_rw_filename(b,name) (int)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) +# define BIO_buffer_peek(b,s,l) BIO_ctrl(b,BIO_CTRL_PEEK,(l),(s)) + +/* 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,peer) \ + (int)BIO_ctrl(b, BIO_CTRL_DGRAM_SET_CONNECTED, 0, (char *)(peer)) +# define BIO_dgram_recv_timedout(b) \ + (int)BIO_ctrl(b, BIO_CTRL_DGRAM_GET_RECV_TIMER_EXP, 0, NULL) +# define BIO_dgram_send_timedout(b) \ + (int)BIO_ctrl(b, BIO_CTRL_DGRAM_GET_SEND_TIMER_EXP, 0, NULL) +# define BIO_dgram_get_peer(b,peer) \ + (int)BIO_ctrl(b, BIO_CTRL_DGRAM_GET_PEER, 0, (char *)(peer)) +# define BIO_dgram_set_peer(b,peer) \ + (int)BIO_ctrl(b, BIO_CTRL_DGRAM_SET_PEER, 0, (char *)(peer)) +# define BIO_dgram_get_mtu_overhead(b) \ + (unsigned int)BIO_ctrl((b), BIO_CTRL_DGRAM_GET_MTU_OVERHEAD, 0, NULL) + +#define BIO_get_ex_new_index(l, p, newf, dupf, freef) \ + CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_BIO, l, p, newf, dupf, freef) +int BIO_set_ex_data(BIO *bio, int idx, void *data); +void *BIO_get_ex_data(BIO *bio, int idx); +uint64_t BIO_number_read(BIO *bio); +uint64_t 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); + +const BIO_METHOD *BIO_s_file(void); +BIO *BIO_new_file(const char *filename, const char *mode); +# ifndef OPENSSL_NO_STDIO +BIO *BIO_new_fp(FILE *stream, int close_flag); +# endif +BIO *BIO_new(const BIO_METHOD *type); +int BIO_free(BIO *a); +void BIO_set_data(BIO *a, void *ptr); +void *BIO_get_data(BIO *a); +void BIO_set_init(BIO *a, int init); +int BIO_get_init(BIO *a); +void BIO_set_shutdown(BIO *a, int shut); +int BIO_get_shutdown(BIO *a); +void BIO_vfree(BIO *a); +int BIO_up_ref(BIO *a); +int BIO_read(BIO *b, void *data, int dlen); +int BIO_read_ex(BIO *b, void *data, size_t dlen, size_t *readbytes); +int BIO_gets(BIO *bp, char *buf, int size); +int BIO_write(BIO *b, const void *data, int dlen); +int BIO_write_ex(BIO *b, const void *data, size_t dlen, size_t *written); +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, BIO_info_cb *fp); +void *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); +void BIO_set_next(BIO *b, BIO *next); +BIO *BIO_get_retry_BIO(BIO *bio, int *reason); +int BIO_get_retry_reason(BIO *bio); +void BIO_set_retry_reason(BIO *bio, int reason); +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); + +const BIO_METHOD *BIO_s_mem(void); +const BIO_METHOD *BIO_s_secmem(void); +BIO *BIO_new_mem_buf(const void *buf, int len); +# ifndef OPENSSL_NO_SOCK +const BIO_METHOD *BIO_s_socket(void); +const BIO_METHOD *BIO_s_connect(void); +const BIO_METHOD *BIO_s_accept(void); +# endif +const BIO_METHOD *BIO_s_fd(void); +const BIO_METHOD *BIO_s_log(void); +const BIO_METHOD *BIO_s_bio(void); +const BIO_METHOD *BIO_s_null(void); +const BIO_METHOD *BIO_f_null(void); +const BIO_METHOD *BIO_f_buffer(void); +const BIO_METHOD *BIO_f_linebuffer(void); +const BIO_METHOD *BIO_f_nbio_test(void); +# ifndef OPENSSL_NO_DGRAM +const BIO_METHOD *BIO_s_datagram(void); +int BIO_dgram_non_fatal_error(int error); +BIO *BIO_new_dgram(int fd, int close_flag); +# ifndef OPENSSL_NO_SCTP +const BIO_METHOD *BIO_s_datagram_sctp(void); +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 +# endif + +# ifndef OPENSSL_NO_SOCK +int BIO_sock_should_retry(int i); +int BIO_sock_non_fatal_error(int error); +# endif + +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_STDIO +int BIO_dump_fp(FILE *fp, const char *s, int len); +int BIO_dump_indent_fp(FILE *fp, const char *s, int len, int indent); +# endif +int BIO_hex_string(BIO *out, int indent, int width, unsigned char *data, + int datalen); + +# ifndef OPENSSL_NO_SOCK +BIO_ADDR *BIO_ADDR_new(void); +int BIO_ADDR_rawmake(BIO_ADDR *ap, int family, + const void *where, size_t wherelen, unsigned short port); +void BIO_ADDR_free(BIO_ADDR *); +void BIO_ADDR_clear(BIO_ADDR *ap); +int BIO_ADDR_family(const BIO_ADDR *ap); +int BIO_ADDR_rawaddress(const BIO_ADDR *ap, void *p, size_t *l); +unsigned short BIO_ADDR_rawport(const BIO_ADDR *ap); +char *BIO_ADDR_hostname_string(const BIO_ADDR *ap, int numeric); +char *BIO_ADDR_service_string(const BIO_ADDR *ap, int numeric); +char *BIO_ADDR_path_string(const BIO_ADDR *ap); + +const BIO_ADDRINFO *BIO_ADDRINFO_next(const BIO_ADDRINFO *bai); +int BIO_ADDRINFO_family(const BIO_ADDRINFO *bai); +int BIO_ADDRINFO_socktype(const BIO_ADDRINFO *bai); +int BIO_ADDRINFO_protocol(const BIO_ADDRINFO *bai); +const BIO_ADDR *BIO_ADDRINFO_address(const BIO_ADDRINFO *bai); +void BIO_ADDRINFO_free(BIO_ADDRINFO *bai); + +enum BIO_hostserv_priorities { + BIO_PARSE_PRIO_HOST, BIO_PARSE_PRIO_SERV +}; +int BIO_parse_hostserv(const char *hostserv, char **host, char **service, + enum BIO_hostserv_priorities hostserv_prio); +enum BIO_lookup_type { + BIO_LOOKUP_CLIENT, BIO_LOOKUP_SERVER +}; +int BIO_lookup(const char *host, const char *service, + enum BIO_lookup_type lookup_type, + int family, int socktype, BIO_ADDRINFO **res); +int BIO_lookup_ex(const char *host, const char *service, + int lookup_type, int family, int socktype, int protocol, + BIO_ADDRINFO **res); +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_sock_init(void); +# if OPENSSL_API_COMPAT < 0x10100000L +# define BIO_sock_cleanup() while(0) continue +# endif +int BIO_set_tcp_ndelay(int sock, int turn_on); + +DEPRECATEDIN_1_1_0(struct hostent *BIO_gethostbyname(const char *name)) +DEPRECATEDIN_1_1_0(int BIO_get_port(const char *str, unsigned short *port_ptr)) +DEPRECATEDIN_1_1_0(int BIO_get_host_ip(const char *str, unsigned char *ip)) +DEPRECATEDIN_1_1_0(int BIO_get_accept_socket(char *host_port, int mode)) +DEPRECATEDIN_1_1_0(int BIO_accept(int sock, char **ip_port)) + +union BIO_sock_info_u { + BIO_ADDR *addr; +}; +enum BIO_sock_info_type { + BIO_SOCK_INFO_ADDRESS +}; +int BIO_sock_info(int sock, + enum BIO_sock_info_type type, union BIO_sock_info_u *info); + +# define BIO_SOCK_REUSEADDR 0x01 +# define BIO_SOCK_V6_ONLY 0x02 +# define BIO_SOCK_KEEPALIVE 0x04 +# define BIO_SOCK_NONBLOCK 0x08 +# define BIO_SOCK_NODELAY 0x10 + +int BIO_socket(int domain, int socktype, int protocol, int options); +int BIO_connect(int sock, const BIO_ADDR *addr, int options); +int BIO_bind(int sock, const BIO_ADDR *addr, int options); +int BIO_listen(int sock, const BIO_ADDR *addr, int options); +int BIO_accept_ex(int accept_sock, BIO_ADDR *addr, int options); +int BIO_closesocket(int sock); + +BIO *BIO_new_socket(int sock, int close_flag); +BIO *BIO_new_connect(const char *host_port); +BIO *BIO_new_accept(const char *host_port); +# endif /* OPENSSL_NO_SOCK*/ + +BIO *BIO_new_fd(int fd, int close_flag); + +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); + */ + +# define ossl_bio__attr__(x) +# if defined(__GNUC__) && defined(__STDC_VERSION__) \ + && !defined(__APPLE__) + /* + * Because we support the 'z' modifier, which made its appearance in C99, + * we can't use __attribute__ with pre C99 dialects. + */ +# if __STDC_VERSION__ >= 199901L +# undef ossl_bio__attr__ +# define ossl_bio__attr__ __attribute__ +# if __GNUC__*10 + __GNUC_MINOR__ >= 44 +# define ossl_bio__printf__ __gnu_printf__ +# else +# define ossl_bio__printf__ __printf__ +# endif +# endif +# endif +int BIO_printf(BIO *bio, const char *format, ...) +ossl_bio__attr__((__format__(ossl_bio__printf__, 2, 3))); +int BIO_vprintf(BIO *bio, const char *format, va_list args) +ossl_bio__attr__((__format__(ossl_bio__printf__, 2, 0))); +int BIO_snprintf(char *buf, size_t n, const char *format, ...) +ossl_bio__attr__((__format__(ossl_bio__printf__, 3, 4))); +int BIO_vsnprintf(char *buf, size_t n, const char *format, va_list args) +ossl_bio__attr__((__format__(ossl_bio__printf__, 3, 0))); +# undef ossl_bio__attr__ +# undef ossl_bio__printf__ + + +BIO_METHOD *BIO_meth_new(int type, const char *name); +void BIO_meth_free(BIO_METHOD *biom); +int (*BIO_meth_get_write(const BIO_METHOD *biom)) (BIO *, const char *, int); +int (*BIO_meth_get_write_ex(const BIO_METHOD *biom)) (BIO *, const char *, size_t, + size_t *); +int BIO_meth_set_write(BIO_METHOD *biom, + int (*write) (BIO *, const char *, int)); +int BIO_meth_set_write_ex(BIO_METHOD *biom, + int (*bwrite) (BIO *, const char *, size_t, size_t *)); +int (*BIO_meth_get_read(const BIO_METHOD *biom)) (BIO *, char *, int); +int (*BIO_meth_get_read_ex(const BIO_METHOD *biom)) (BIO *, char *, size_t, size_t *); +int BIO_meth_set_read(BIO_METHOD *biom, + int (*read) (BIO *, char *, int)); +int BIO_meth_set_read_ex(BIO_METHOD *biom, + int (*bread) (BIO *, char *, size_t, size_t *)); +int (*BIO_meth_get_puts(const BIO_METHOD *biom)) (BIO *, const char *); +int BIO_meth_set_puts(BIO_METHOD *biom, + int (*puts) (BIO *, const char *)); +int (*BIO_meth_get_gets(const BIO_METHOD *biom)) (BIO *, char *, int); +int BIO_meth_set_gets(BIO_METHOD *biom, + int (*gets) (BIO *, char *, int)); +long (*BIO_meth_get_ctrl(const BIO_METHOD *biom)) (BIO *, int, long, void *); +int BIO_meth_set_ctrl(BIO_METHOD *biom, + long (*ctrl) (BIO *, int, long, void *)); +int (*BIO_meth_get_create(const BIO_METHOD *bion)) (BIO *); +int BIO_meth_set_create(BIO_METHOD *biom, int (*create) (BIO *)); +int (*BIO_meth_get_destroy(const BIO_METHOD *biom)) (BIO *); +int BIO_meth_set_destroy(BIO_METHOD *biom, int (*destroy) (BIO *)); +long (*BIO_meth_get_callback_ctrl(const BIO_METHOD *biom)) + (BIO *, int, BIO_info_cb *); +int BIO_meth_set_callback_ctrl(BIO_METHOD *biom, + long (*callback_ctrl) (BIO *, int, + BIO_info_cb *)); + +# ifdef __cplusplus +} +# endif +#endif diff --git a/openssl-wasm/include/openssl/bioerr.h b/openssl-wasm/include/openssl/bioerr.h new file mode 100644 index 0000000..46e2c96 --- /dev/null +++ b/openssl-wasm/include/openssl/bioerr.h @@ -0,0 +1,124 @@ +/* + * Generated by util/mkerr.pl DO NOT EDIT + * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_BIOERR_H +# define HEADER_BIOERR_H + +# ifndef HEADER_SYMHACKS_H +# include +# endif + +# ifdef __cplusplus +extern "C" +# endif +int ERR_load_BIO_strings(void); + +/* + * BIO function codes. + */ +# define BIO_F_ACPT_STATE 100 +# define BIO_F_ADDRINFO_WRAP 148 +# define BIO_F_ADDR_STRINGS 134 +# define BIO_F_BIO_ACCEPT 101 +# define BIO_F_BIO_ACCEPT_EX 137 +# define BIO_F_BIO_ACCEPT_NEW 152 +# define BIO_F_BIO_ADDR_NEW 144 +# define BIO_F_BIO_BIND 147 +# define BIO_F_BIO_CALLBACK_CTRL 131 +# define BIO_F_BIO_CONNECT 138 +# define BIO_F_BIO_CONNECT_NEW 153 +# define BIO_F_BIO_CTRL 103 +# define BIO_F_BIO_GETS 104 +# define BIO_F_BIO_GET_HOST_IP 106 +# define BIO_F_BIO_GET_NEW_INDEX 102 +# define BIO_F_BIO_GET_PORT 107 +# define BIO_F_BIO_LISTEN 139 +# define BIO_F_BIO_LOOKUP 135 +# define BIO_F_BIO_LOOKUP_EX 143 +# define BIO_F_BIO_MAKE_PAIR 121 +# define BIO_F_BIO_METH_NEW 146 +# define BIO_F_BIO_NEW 108 +# define BIO_F_BIO_NEW_DGRAM_SCTP 145 +# 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_PARSE_HOSTSERV 136 +# define BIO_F_BIO_PUTS 110 +# define BIO_F_BIO_READ 111 +# define BIO_F_BIO_READ_EX 105 +# define BIO_F_BIO_READ_INTERN 120 +# define BIO_F_BIO_SOCKET 140 +# define BIO_F_BIO_SOCKET_NBIO 142 +# define BIO_F_BIO_SOCK_INFO 141 +# define BIO_F_BIO_SOCK_INIT 112 +# define BIO_F_BIO_WRITE 113 +# define BIO_F_BIO_WRITE_EX 119 +# define BIO_F_BIO_WRITE_INTERN 128 +# define BIO_F_BUFFER_CTRL 114 +# define BIO_F_CONN_CTRL 127 +# define BIO_F_CONN_STATE 115 +# define BIO_F_DGRAM_SCTP_NEW 149 +# define BIO_F_DGRAM_SCTP_READ 132 +# define BIO_F_DGRAM_SCTP_WRITE 133 +# define BIO_F_DOAPR_OUTCH 150 +# define BIO_F_FILE_CTRL 116 +# define BIO_F_FILE_READ 130 +# define BIO_F_LINEBUFFER_CTRL 129 +# define BIO_F_LINEBUFFER_NEW 151 +# define BIO_F_MEM_WRITE 117 +# define BIO_F_NBIOF_NEW 154 +# define BIO_F_SLG_WRITE 155 +# define BIO_F_SSL_NEW 118 + +/* + * BIO reason codes. + */ +# define BIO_R_ACCEPT_ERROR 100 +# define BIO_R_ADDRINFO_ADDR_IS_NOT_AF_INET 141 +# define BIO_R_AMBIGUOUS_HOST_OR_SERVICE 129 +# define BIO_R_BAD_FOPEN_MODE 101 +# define BIO_R_BROKEN_PIPE 124 +# define BIO_R_CONNECT_ERROR 103 +# define BIO_R_GETHOSTBYNAME_ADDR_IS_NOT_AF_INET 107 +# define BIO_R_GETSOCKNAME_ERROR 132 +# define BIO_R_GETSOCKNAME_TRUNCATED_ADDRESS 133 +# define BIO_R_GETTING_SOCKTYPE 134 +# define BIO_R_INVALID_ARGUMENT 125 +# define BIO_R_INVALID_SOCKET 135 +# define BIO_R_IN_USE 123 +# define BIO_R_LENGTH_TOO_LONG 102 +# define BIO_R_LISTEN_V6_ONLY 136 +# define BIO_R_LOOKUP_RETURNED_NOTHING 142 +# define BIO_R_MALFORMED_HOST_OR_SERVICE 130 +# define BIO_R_NBIO_CONNECT_ERROR 110 +# define BIO_R_NO_ACCEPT_ADDR_OR_SERVICE_SPECIFIED 143 +# define BIO_R_NO_HOSTNAME_OR_SERVICE_SPECIFIED 144 +# define BIO_R_NO_PORT_DEFINED 113 +# define BIO_R_NO_SUCH_FILE 128 +# define BIO_R_NULL_PARAMETER 115 +# define BIO_R_UNABLE_TO_BIND_SOCKET 117 +# define BIO_R_UNABLE_TO_CREATE_SOCKET 118 +# define BIO_R_UNABLE_TO_KEEPALIVE 137 +# define BIO_R_UNABLE_TO_LISTEN_SOCKET 119 +# define BIO_R_UNABLE_TO_NODELAY 138 +# define BIO_R_UNABLE_TO_REUSEADDR 139 +# define BIO_R_UNAVAILABLE_IP_FAMILY 145 +# define BIO_R_UNINITIALIZED 120 +# define BIO_R_UNKNOWN_INFO_TYPE 140 +# define BIO_R_UNSUPPORTED_IP_FAMILY 146 +# define BIO_R_UNSUPPORTED_METHOD 121 +# define BIO_R_UNSUPPORTED_PROTOCOL_FAMILY 131 +# define BIO_R_WRITE_TO_READ_ONLY_BIO 126 +# define BIO_R_WSASTARTUP 122 + +#endif diff --git a/openssl-wasm/include/openssl/blowfish.h b/openssl-wasm/include/openssl/blowfish.h new file mode 100644 index 0000000..cd3e460 --- /dev/null +++ b/openssl-wasm/include/openssl/blowfish.h @@ -0,0 +1,61 @@ +/* + * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_BLOWFISH_H +# define HEADER_BLOWFISH_H + +# include + +# ifndef OPENSSL_NO_BF +# include +# ifdef __cplusplus +extern "C" { +# endif + +# define BF_ENCRYPT 1 +# define BF_DECRYPT 0 + +/*- + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + * ! BF_LONG has to be at least 32 bits wide. ! + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + */ +# define BF_LONG unsigned int + +# 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; + +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 + +#endif diff --git a/openssl-wasm/include/openssl/bn.h b/openssl-wasm/include/openssl/bn.h new file mode 100644 index 0000000..d877660 --- /dev/null +++ b/openssl-wasm/include/openssl/bn.h @@ -0,0 +1,539 @@ +/* + * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved. + * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_BN_H +# define HEADER_BN_H + +# include +# ifndef OPENSSL_NO_STDIO +# include +# endif +# include +# include +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * 64-bit processor with LP64 ABI + */ +# ifdef SIXTY_FOUR_BIT_LONG +# define BN_ULONG unsigned long +# define BN_BYTES 8 +# endif + +/* + * 64-bit processor other than LP64 ABI + */ +# ifdef SIXTY_FOUR_BIT +# define BN_ULONG unsigned long long +# define BN_BYTES 8 +# endif + +# ifdef THIRTY_TWO_BIT +# define BN_ULONG unsigned int +# define BN_BYTES 4 +# endif + +# define BN_BITS2 (BN_BYTES * 8) +# define BN_BITS (BN_BITS2 * 2) +# define BN_TBIT ((BN_ULONG)1 << (BN_BITS2 - 1)) + +# define BN_FLG_MALLOCED 0x01 +# define BN_FLG_STATIC_DATA 0x02 + +/* + * avoid leaking exponent information through timing, + * BN_mod_exp_mont() will call BN_mod_exp_mont_consttime, + * BN_div() will call BN_div_no_branch, + * BN_mod_inverse() will call bn_mod_inverse_no_branch. + */ +# define BN_FLG_CONSTTIME 0x04 +# define BN_FLG_SECURE 0x08 + +# if OPENSSL_API_COMPAT < 0x00908000L +/* deprecated name for the flag */ +# define BN_FLG_EXP_CONSTTIME BN_FLG_CONSTTIME +# define BN_FLG_FREE 0x8000 /* used for debugging */ +# endif + +void BN_set_flags(BIGNUM *b, int n); +int BN_get_flags(const BIGNUM *b, int n); + +/* Values for |top| in BN_rand() */ +#define BN_RAND_TOP_ANY -1 +#define BN_RAND_TOP_ONE 0 +#define BN_RAND_TOP_TWO 1 + +/* Values for |bottom| in BN_rand() */ +#define BN_RAND_BOTTOM_ANY 0 +#define BN_RAND_BOTTOM_ODD 1 + +/* + * get a clone of a BIGNUM with changed flags, for *temporary* use only (the + * two BIGNUMs cannot be used in parallel!). Also only for *read only* use. The + * value |dest| should be a newly allocated BIGNUM obtained via BN_new() that + * has not been otherwise initialised or used. + */ +void BN_with_flags(BIGNUM *dest, const BIGNUM *b, int flags); + +/* Wrapper function to make using BN_GENCB easier */ +int BN_GENCB_call(BN_GENCB *cb, int a, int b); + +BN_GENCB *BN_GENCB_new(void); +void BN_GENCB_free(BN_GENCB *cb); + +/* Populate a BN_GENCB structure with an "old"-style callback */ +void BN_GENCB_set_old(BN_GENCB *gencb, void (*callback) (int, int, void *), + void *cb_arg); + +/* Populate a BN_GENCB structure with a "new"-style callback */ +void BN_GENCB_set(BN_GENCB *gencb, int (*callback) (int, int, BN_GENCB *), + void *cb_arg); + +void *BN_GENCB_get_arg(BN_GENCB *cb); + +# define BN_prime_checks 0 /* default: select number of iterations based + * on the size of the number */ + +/* + * BN_prime_checks_for_size() returns the number of Miller-Rabin iterations + * that will be done for checking that a random number is probably prime. The + * error rate for accepting a composite number as prime depends on the size of + * the prime |b|. The error rates used are for calculating an RSA key with 2 primes, + * and so the level is what you would expect for a key of double the size of the + * prime. + * + * This table is generated using the algorithm of FIPS PUB 186-4 + * Digital Signature Standard (DSS), section F.1, page 117. + * (https://dx.doi.org/10.6028/NIST.FIPS.186-4) + * + * The following magma script was used to generate the output: + * securitybits:=125; + * k:=1024; + * for t:=1 to 65 do + * for M:=3 to Floor(2*Sqrt(k-1)-1) do + * S:=0; + * // Sum over m + * for m:=3 to M do + * s:=0; + * // Sum over j + * for j:=2 to m do + * s+:=(RealField(32)!2)^-(j+(k-1)/j); + * end for; + * S+:=2^(m-(m-1)*t)*s; + * end for; + * A:=2^(k-2-M*t); + * B:=8*(Pi(RealField(32))^2-6)/3*2^(k-2)*S; + * pkt:=2.00743*Log(2)*k*2^-k*(A+B); + * seclevel:=Floor(-Log(2,pkt)); + * if seclevel ge securitybits then + * printf "k: %5o, security: %o bits (t: %o, M: %o)\n",k,seclevel,t,M; + * break; + * end if; + * end for; + * if seclevel ge securitybits then break; end if; + * end for; + * + * It can be run online at: + * http://magma.maths.usyd.edu.au/calc + * + * And will output: + * k: 1024, security: 129 bits (t: 6, M: 23) + * + * k is the number of bits of the prime, securitybits is the level we want to + * reach. + * + * prime length | RSA key size | # MR tests | security level + * -------------+--------------|------------+--------------- + * (b) >= 6394 | >= 12788 | 3 | 256 bit + * (b) >= 3747 | >= 7494 | 3 | 192 bit + * (b) >= 1345 | >= 2690 | 4 | 128 bit + * (b) >= 1080 | >= 2160 | 5 | 128 bit + * (b) >= 852 | >= 1704 | 5 | 112 bit + * (b) >= 476 | >= 952 | 5 | 80 bit + * (b) >= 400 | >= 800 | 6 | 80 bit + * (b) >= 347 | >= 694 | 7 | 80 bit + * (b) >= 308 | >= 616 | 8 | 80 bit + * (b) >= 55 | >= 110 | 27 | 64 bit + * (b) >= 6 | >= 12 | 34 | 64 bit + */ + +# define BN_prime_checks_for_size(b) ((b) >= 3747 ? 3 : \ + (b) >= 1345 ? 4 : \ + (b) >= 476 ? 5 : \ + (b) >= 400 ? 6 : \ + (b) >= 347 ? 7 : \ + (b) >= 308 ? 8 : \ + (b) >= 55 ? 27 : \ + /* b >= 6 */ 34) + +# define BN_num_bytes(a) ((BN_num_bits(a)+7)/8) + +int BN_abs_is_word(const BIGNUM *a, const BN_ULONG w); +int BN_is_zero(const BIGNUM *a); +int BN_is_one(const BIGNUM *a); +int BN_is_word(const BIGNUM *a, const BN_ULONG w); +int BN_is_odd(const BIGNUM *a); + +# define BN_one(a) (BN_set_word((a),1)) + +void BN_zero_ex(BIGNUM *a); + +# if OPENSSL_API_COMPAT >= 0x00908000L +# 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); +BN_CTX *BN_CTX_secure_new(void); +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_priv_rand(BIGNUM *rnd, int bits, int top, int bottom); +int BN_rand_range(BIGNUM *rnd, const BIGNUM *range); +int BN_priv_rand_range(BIGNUM *rnd, const BIGNUM *range); +int BN_pseudo_rand(BIGNUM *rnd, int bits, int top, int bottom); +int BN_pseudo_rand_range(BIGNUM *rnd, const BIGNUM *range); +int BN_num_bits(const BIGNUM *a); +int BN_num_bits_word(BN_ULONG l); +int BN_security_bits(int L, int N); +BIGNUM *BN_new(void); +BIGNUM *BN_secure_new(void); +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); +int BN_bn2binpad(const BIGNUM *a, unsigned char *to, int tolen); +BIGNUM *BN_lebin2bn(const unsigned char *s, int len, BIGNUM *ret); +int BN_bn2lebinpad(const BIGNUM *a, unsigned char *to, int tolen); +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 b pointer to the BIGNUM object + * \return 1 if a < 0 and 0 otherwise + */ +int BN_is_negative(const BIGNUM *b); + +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_STDIO +int BN_print_fp(FILE *fp, const BIGNUM *a); +# endif +int BN_print(BIO *bio, const BIGNUM *a); +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 */ +DEPRECATEDIN_0_9_8(BIGNUM *BN_generate_prime(BIGNUM *ret, int bits, int safe, + const BIGNUM *add, + const BIGNUM *rem, + void (*callback) (int, int, + void *), + void *cb_arg)) +DEPRECATEDIN_0_9_8(int + BN_is_prime(const BIGNUM *p, int nchecks, + void (*callback) (int, int, void *), + BN_CTX *ctx, void *cb_arg)) +DEPRECATEDIN_0_9_8(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)) + +/* 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); +int BN_mod_mul_montgomery(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + BN_MONT_CTX *mont, BN_CTX *ctx); +int BN_to_montgomery(BIGNUM *r, const BIGNUM *a, BN_MONT_CTX *mont, + BN_CTX *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, CRYPTO_RWLOCK *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 *); + +int BN_BLINDING_is_current_thread(BN_BLINDING *b); +void BN_BLINDING_set_current_thread(BN_BLINDING *b); +int BN_BLINDING_lock(BN_BLINDING *b); +int BN_BLINDING_unlock(BN_BLINDING *b); + +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); + +DEPRECATEDIN_0_9_8(void BN_set_params(int mul, int high, int low, int mont)) +DEPRECATEDIN_0_9_8(int BN_get_params(int which)) /* 0, mul, 1 high, 2 low, 3 + * mont */ + +BN_RECP_CTX *BN_RECP_CTX_new(void); +void BN_RECP_CTX_free(BN_RECP_CTX *recp); +int BN_RECP_CTX_set(BN_RECP_CTX *recp, const BIGNUM *rdiv, BN_CTX *ctx); +int BN_mod_mul_reciprocal(BIGNUM *r, const BIGNUM *x, const BIGNUM *y, + BN_RECP_CTX *recp, BN_CTX *ctx); +int BN_mod_exp_recp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, + const BIGNUM *m, BN_CTX *ctx); +int BN_div_recp(BIGNUM *dv, BIGNUM *rem, const BIGNUM *m, + BN_RECP_CTX *recp, BN_CTX *ctx); + +# ifndef OPENSSL_NO_EC2M + +/* + * Functions for arithmetic over binary polynomials represented by BIGNUMs. + * The BIGNUM::neg property of BIGNUMs representing binary polynomials is + * ignored. Note that input arguments are not const so that their bit arrays + * can be expanded to the appropriate size if needed. + */ + +/* + * r = a + b + */ +int BN_GF2m_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b); +# define BN_GF2m_sub(r, a, b) BN_GF2m_add(r, a, b) +/* + * r=a mod p + */ +int BN_GF2m_mod(BIGNUM *r, const BIGNUM *a, const BIGNUM *p); +/* r = (a * b) mod p */ +int BN_GF2m_mod_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + const BIGNUM *p, BN_CTX *ctx); +/* r = (a * a) mod p */ +int BN_GF2m_mod_sqr(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx); +/* r = (1 / b) mod p */ +int BN_GF2m_mod_inv(BIGNUM *r, const BIGNUM *b, const BIGNUM *p, BN_CTX *ctx); +/* r = (a / b) mod p */ +int BN_GF2m_mod_div(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + const BIGNUM *p, BN_CTX *ctx); +/* r = (a ^ b) mod p */ +int BN_GF2m_mod_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + const BIGNUM *p, BN_CTX *ctx); +/* r = sqrt(a) mod p */ +int BN_GF2m_mod_sqrt(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, + BN_CTX *ctx); +/* r^2 + r = a mod p */ +int BN_GF2m_mod_solve_quad(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, + BN_CTX *ctx); +# define BN_GF2m_cmp(a, b) BN_ucmp((a), (b)) +/*- + * Some functions allow for representation of the irreducible polynomials + * as an unsigned int[], say p. The irreducible f(t) is then of the form: + * t^p[0] + t^p[1] + ... + t^p[k] + * where m = p[0] > p[1] > ... > p[k] = 0. + */ +/* r = a mod p */ +int BN_GF2m_mod_arr(BIGNUM *r, const BIGNUM *a, const int p[]); +/* r = (a * b) mod p */ +int BN_GF2m_mod_mul_arr(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + const int p[], BN_CTX *ctx); +/* r = (a * a) mod p */ +int BN_GF2m_mod_sqr_arr(BIGNUM *r, const BIGNUM *a, const int p[], + BN_CTX *ctx); +/* r = (1 / b) mod p */ +int BN_GF2m_mod_inv_arr(BIGNUM *r, const BIGNUM *b, const int p[], + BN_CTX *ctx); +/* r = (a / b) mod p */ +int BN_GF2m_mod_div_arr(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + const int p[], BN_CTX *ctx); +/* r = (a ^ b) mod p */ +int BN_GF2m_mod_exp_arr(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + const int p[], BN_CTX *ctx); +/* r = sqrt(a) mod p */ +int BN_GF2m_mod_sqrt_arr(BIGNUM *r, const BIGNUM *a, + const int p[], BN_CTX *ctx); +/* r^2 + r = a mod p */ +int BN_GF2m_mod_solve_quad_arr(BIGNUM *r, const BIGNUM *a, + const int p[], BN_CTX *ctx); +int BN_GF2m_poly2arr(const BIGNUM *a, int p[], int max); +int BN_GF2m_arr2poly(const int p[], BIGNUM *a); + +# endif + +/* + * faster mod functions for the 'NIST primes' 0 <= a < p^2 + */ +int BN_nist_mod_192(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx); +int BN_nist_mod_224(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx); +int BN_nist_mod_256(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx); +int BN_nist_mod_384(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx); +int BN_nist_mod_521(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx); + +const BIGNUM *BN_get0_nist_prime_192(void); +const BIGNUM *BN_get0_nist_prime_224(void); +const BIGNUM *BN_get0_nist_prime_256(void); +const BIGNUM *BN_get0_nist_prime_384(void); +const BIGNUM *BN_get0_nist_prime_521(void); + +int (*BN_nist_mod_func(const BIGNUM *p)) (BIGNUM *r, const BIGNUM *a, + const BIGNUM *field, BN_CTX *ctx); + +int BN_generate_dsa_nonce(BIGNUM *out, const BIGNUM *range, + const BIGNUM *priv, const unsigned char *message, + size_t message_len, BN_CTX *ctx); + +/* Primes from RFC 2409 */ +BIGNUM *BN_get_rfc2409_prime_768(BIGNUM *bn); +BIGNUM *BN_get_rfc2409_prime_1024(BIGNUM *bn); + +/* Primes from RFC 3526 */ +BIGNUM *BN_get_rfc3526_prime_1536(BIGNUM *bn); +BIGNUM *BN_get_rfc3526_prime_2048(BIGNUM *bn); +BIGNUM *BN_get_rfc3526_prime_3072(BIGNUM *bn); +BIGNUM *BN_get_rfc3526_prime_4096(BIGNUM *bn); +BIGNUM *BN_get_rfc3526_prime_6144(BIGNUM *bn); +BIGNUM *BN_get_rfc3526_prime_8192(BIGNUM *bn); + +# if OPENSSL_API_COMPAT < 0x10100000L +# define get_rfc2409_prime_768 BN_get_rfc2409_prime_768 +# define get_rfc2409_prime_1024 BN_get_rfc2409_prime_1024 +# define get_rfc3526_prime_1536 BN_get_rfc3526_prime_1536 +# define get_rfc3526_prime_2048 BN_get_rfc3526_prime_2048 +# define get_rfc3526_prime_3072 BN_get_rfc3526_prime_3072 +# define get_rfc3526_prime_4096 BN_get_rfc3526_prime_4096 +# define get_rfc3526_prime_6144 BN_get_rfc3526_prime_6144 +# define get_rfc3526_prime_8192 BN_get_rfc3526_prime_8192 +# endif + +int BN_bntest_rand(BIGNUM *rnd, int bits, int top, int bottom); + + +# ifdef __cplusplus +} +# endif +#endif diff --git a/openssl-wasm/include/openssl/bnerr.h b/openssl-wasm/include/openssl/bnerr.h new file mode 100644 index 0000000..9f3c7cf --- /dev/null +++ b/openssl-wasm/include/openssl/bnerr.h @@ -0,0 +1,100 @@ +/* + * Generated by util/mkerr.pl DO NOT EDIT + * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_BNERR_H +# define HEADER_BNERR_H + +# ifndef HEADER_SYMHACKS_H +# include +# endif + +# ifdef __cplusplus +extern "C" +# endif +int ERR_load_BN_strings(void); + +/* + * BN function codes. + */ +# define BN_F_BNRAND 127 +# define BN_F_BNRAND_RANGE 138 +# 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_COMPUTE_WNAF 142 +# 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_RECP 130 +# define BN_F_BN_EXP 123 +# define BN_F_BN_EXPAND_INTERNAL 120 +# define BN_F_BN_GENCB_NEW 143 +# define BN_F_BN_GENERATE_DSA_NONCE 140 +# define BN_F_BN_GENERATE_PRIME_EX 141 +# 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_LSHIFT 145 +# 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_SQRT 121 +# define BN_F_BN_MONT_CTX_NEW 149 +# define BN_F_BN_MPI2BN 112 +# define BN_F_BN_NEW 113 +# define BN_F_BN_POOL_GET 147 +# define BN_F_BN_RAND 114 +# define BN_F_BN_RAND_RANGE 122 +# define BN_F_BN_RECP_CTX_NEW 150 +# define BN_F_BN_RSHIFT 146 +# define BN_F_BN_SET_WORDS 144 +# define BN_F_BN_STACK_PUSH 148 +# define BN_F_BN_USUB 115 + +/* + * BN 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_BITS_TOO_SMALL 118 +# 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_INVALID_SHIFT 119 +# 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_PRIVATE_KEY_TOO_LARGE 117 +# define BN_R_P_IS_NOT_PRIME 112 +# define BN_R_TOO_MANY_ITERATIONS 113 +# define BN_R_TOO_MANY_TEMPORARY_VARIABLES 109 + +#endif diff --git a/openssl-wasm/include/openssl/buffer.h b/openssl-wasm/include/openssl/buffer.h new file mode 100644 index 0000000..d276576 --- /dev/null +++ b/openssl-wasm/include/openssl/buffer.h @@ -0,0 +1,58 @@ +/* + * Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_BUFFER_H +# define HEADER_BUFFER_H + +# include +# ifndef HEADER_CRYPTO_H +# include +# endif +# include + + +#ifdef __cplusplus +extern "C" { +#endif + +# include +# include + +/* + * These names are outdated as of OpenSSL 1.1; a future release + * will move them to be deprecated. + */ +# define BUF_strdup(s) OPENSSL_strdup(s) +# define BUF_strndup(s, size) OPENSSL_strndup(s, size) +# define BUF_memdup(data, size) OPENSSL_memdup(data, size) +# define BUF_strlcpy(dst, src, size) OPENSSL_strlcpy(dst, src, size) +# define BUF_strlcat(dst, src, size) OPENSSL_strlcat(dst, src, size) +# define BUF_strnlen(str, maxlen) OPENSSL_strnlen(str, maxlen) + +struct buf_mem_st { + size_t length; /* current number of bytes */ + char *data; + size_t max; /* size of buffer */ + unsigned long flags; +}; + +# define BUF_MEM_FLAG_SECURE 0x01 + +BUF_MEM *BUF_MEM_new(void); +BUF_MEM *BUF_MEM_new_ex(unsigned long flags); +void BUF_MEM_free(BUF_MEM *a); +size_t BUF_MEM_grow(BUF_MEM *str, size_t len); +size_t BUF_MEM_grow_clean(BUF_MEM *str, size_t len); +void BUF_reverse(unsigned char *out, const unsigned char *in, size_t siz); + + +# ifdef __cplusplus +} +# endif +#endif diff --git a/openssl-wasm/include/openssl/buffererr.h b/openssl-wasm/include/openssl/buffererr.h new file mode 100644 index 0000000..04f6ff7 --- /dev/null +++ b/openssl-wasm/include/openssl/buffererr.h @@ -0,0 +1,34 @@ +/* + * Generated by util/mkerr.pl DO NOT EDIT + * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_BUFERR_H +# define HEADER_BUFERR_H + +# ifndef HEADER_SYMHACKS_H +# include +# endif + +# ifdef __cplusplus +extern "C" +# endif +int ERR_load_BUF_strings(void); + +/* + * BUF function codes. + */ +# define BUF_F_BUF_MEM_GROW 100 +# define BUF_F_BUF_MEM_GROW_CLEAN 105 +# define BUF_F_BUF_MEM_NEW 101 + +/* + * BUF reason codes. + */ + +#endif diff --git a/openssl-wasm/include/openssl/camellia.h b/openssl-wasm/include/openssl/camellia.h new file mode 100644 index 0000000..151f3c1 --- /dev/null +++ b/openssl-wasm/include/openssl/camellia.h @@ -0,0 +1,83 @@ +/* + * Copyright 2006-2016 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_CAMELLIA_H +# define HEADER_CAMELLIA_H + +# include + +# ifndef OPENSSL_NO_CAMELLIA +# include +#ifdef __cplusplus +extern "C" { +#endif + +# 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. + */ + +/* 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; + +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 + +#endif diff --git a/openssl-wasm/include/openssl/cast.h b/openssl-wasm/include/openssl/cast.h new file mode 100644 index 0000000..2cc89ae --- /dev/null +++ b/openssl-wasm/include/openssl/cast.h @@ -0,0 +1,53 @@ +/* + * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_CAST_H +# define HEADER_CAST_H + +# include + +# ifndef OPENSSL_NO_CAST +# ifdef __cplusplus +extern "C" { +# 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; + +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 + +#endif diff --git a/openssl-wasm/include/openssl/cmac.h b/openssl-wasm/include/openssl/cmac.h new file mode 100644 index 0000000..3535a9a --- /dev/null +++ b/openssl-wasm/include/openssl/cmac.h @@ -0,0 +1,41 @@ +/* + * Copyright 2010-2016 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_CMAC_H +# define HEADER_CMAC_H + +# ifndef OPENSSL_NO_CMAC + +#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 +#endif diff --git a/openssl-wasm/include/openssl/cms.h b/openssl-wasm/include/openssl/cms.h new file mode 100644 index 0000000..c762796 --- /dev/null +++ b/openssl-wasm/include/openssl/cms.h @@ -0,0 +1,339 @@ +/* + * Copyright 2008-2019 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_CMS_H +# define HEADER_CMS_H + +# include + +# ifndef OPENSSL_NO_CMS +# include +# include +# include +# ifdef __cplusplus +extern "C" { +# endif + +typedef struct CMS_ContentInfo_st CMS_ContentInfo; +typedef struct CMS_SignerInfo_st CMS_SignerInfo; +typedef struct CMS_CertificateChoices CMS_CertificateChoices; +typedef struct CMS_RevocationInfoChoice_st CMS_RevocationInfoChoice; +typedef struct CMS_RecipientInfo_st CMS_RecipientInfo; +typedef struct CMS_ReceiptRequest_st CMS_ReceiptRequest; +typedef struct CMS_Receipt_st CMS_Receipt; +typedef struct CMS_RecipientEncryptedKey_st CMS_RecipientEncryptedKey; +typedef struct CMS_OtherKeyAttribute_st CMS_OtherKeyAttribute; + +DEFINE_STACK_OF(CMS_SignerInfo) +DEFINE_STACK_OF(CMS_RecipientEncryptedKey) +DEFINE_STACK_OF(CMS_RecipientInfo) +DEFINE_STACK_OF(CMS_RevocationInfoChoice) +DECLARE_ASN1_FUNCTIONS(CMS_ContentInfo) +DECLARE_ASN1_FUNCTIONS(CMS_ReceiptRequest) +DECLARE_ASN1_PRINT_FUNCTION(CMS_ContentInfo) + +# define CMS_SIGNERINFO_ISSUER_SERIAL 0 +# define CMS_SIGNERINFO_KEYIDENTIFIER 1 + +# define CMS_RECIPINFO_NONE -1 +# define CMS_RECIPINFO_TRANS 0 +# define CMS_RECIPINFO_AGREE 1 +# define CMS_RECIPINFO_KEK 2 +# define CMS_RECIPINFO_PASS 3 +# define CMS_RECIPINFO_OTHER 4 + +/* S/MIME related flags */ + +# define CMS_TEXT 0x1 +# define CMS_NOCERTS 0x2 +# define CMS_NO_CONTENT_VERIFY 0x4 +# define CMS_NO_ATTR_VERIFY 0x8 +# define CMS_NOSIGS \ + (CMS_NO_CONTENT_VERIFY|CMS_NO_ATTR_VERIFY) +# define CMS_NOINTERN 0x10 +# define CMS_NO_SIGNER_CERT_VERIFY 0x20 +# define CMS_NOVERIFY 0x20 +# define CMS_DETACHED 0x40 +# define CMS_BINARY 0x80 +# define CMS_NOATTR 0x100 +# define CMS_NOSMIMECAP 0x200 +# define CMS_NOOLDMIMETYPE 0x400 +# define CMS_CRLFEOL 0x800 +# define CMS_STREAM 0x1000 +# define CMS_NOCRL 0x2000 +# define CMS_PARTIAL 0x4000 +# define CMS_REUSE_DIGEST 0x8000 +# define CMS_USE_KEYID 0x10000 +# define CMS_DEBUG_DECRYPT 0x20000 +# define CMS_KEY_PARAM 0x40000 +# define CMS_ASCIICRLF 0x80000 + +const ASN1_OBJECT *CMS_get0_type(const 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, + const unsigned char *id, size_t idlen); +int CMS_decrypt_set1_password(CMS_ContentInfo *cms, + unsigned char *pass, ossl_ssize_t passlen); + +STACK_OF(CMS_RecipientInfo) *CMS_get0_RecipientInfos(CMS_ContentInfo *cms); +int CMS_RecipientInfo_type(CMS_RecipientInfo *ri); +EVP_PKEY_CTX *CMS_RecipientInfo_get0_pkey_ctx(CMS_RecipientInfo *ri); +CMS_ContentInfo *CMS_EnvelopedData_create(const EVP_CIPHER *cipher); +CMS_RecipientInfo *CMS_add1_recipient_cert(CMS_ContentInfo *cms, + X509 *recip, unsigned int flags); +int CMS_RecipientInfo_set0_pkey(CMS_RecipientInfo *ri, EVP_PKEY *pkey); +int CMS_RecipientInfo_ktri_cert_cmp(CMS_RecipientInfo *ri, X509 *cert); +int CMS_RecipientInfo_ktri_get0_algs(CMS_RecipientInfo *ri, + EVP_PKEY **pk, X509 **recip, + X509_ALGOR **palg); +int CMS_RecipientInfo_ktri_get0_signer_id(CMS_RecipientInfo *ri, + ASN1_OCTET_STRING **keyid, + X509_NAME **issuer, + ASN1_INTEGER **sno); + +CMS_RecipientInfo *CMS_add0_recipient_key(CMS_ContentInfo *cms, int nid, + unsigned char *key, size_t keylen, + unsigned char *id, size_t idlen, + ASN1_GENERALIZEDTIME *date, + ASN1_OBJECT *otherTypeId, + ASN1_TYPE *otherType); + +int CMS_RecipientInfo_kekri_get0_id(CMS_RecipientInfo *ri, + X509_ALGOR **palg, + ASN1_OCTET_STRING **pid, + ASN1_GENERALIZEDTIME **pdate, + ASN1_OBJECT **potherid, + ASN1_TYPE **pothertype); + +int CMS_RecipientInfo_set0_key(CMS_RecipientInfo *ri, + unsigned char *key, size_t keylen); + +int CMS_RecipientInfo_kekri_id_cmp(CMS_RecipientInfo *ri, + const unsigned char *id, size_t idlen); + +int CMS_RecipientInfo_set0_password(CMS_RecipientInfo *ri, + unsigned char *pass, + ossl_ssize_t passlen); + +CMS_RecipientInfo *CMS_add0_recipient_password(CMS_ContentInfo *cms, + int iter, int wrap_nid, + int pbe_nid, + unsigned char *pass, + ossl_ssize_t passlen, + const EVP_CIPHER *kekciph); + +int CMS_RecipientInfo_decrypt(CMS_ContentInfo *cms, CMS_RecipientInfo *ri); +int CMS_RecipientInfo_encrypt(CMS_ContentInfo *cms, CMS_RecipientInfo *ri); + +int CMS_uncompress(CMS_ContentInfo *cms, BIO *dcont, BIO *out, + unsigned int flags); +CMS_ContentInfo *CMS_compress(BIO *in, int comp_nid, unsigned int flags); + +int CMS_set1_eContentType(CMS_ContentInfo *cms, const ASN1_OBJECT *oid); +const ASN1_OBJECT *CMS_get0_eContentType(CMS_ContentInfo *cms); + +CMS_CertificateChoices *CMS_add0_CertificateChoices(CMS_ContentInfo *cms); +int CMS_add0_cert(CMS_ContentInfo *cms, X509 *cert); +int CMS_add1_cert(CMS_ContentInfo *cms, X509 *cert); +STACK_OF(X509) *CMS_get1_certs(CMS_ContentInfo *cms); + +CMS_RevocationInfoChoice *CMS_add0_RevocationInfoChoice(CMS_ContentInfo *cms); +int CMS_add0_crl(CMS_ContentInfo *cms, X509_CRL *crl); +int CMS_add1_crl(CMS_ContentInfo *cms, X509_CRL *crl); +STACK_OF(X509_CRL) *CMS_get1_crls(CMS_ContentInfo *cms); + +int CMS_SignedData_init(CMS_ContentInfo *cms); +CMS_SignerInfo *CMS_add1_signer(CMS_ContentInfo *cms, + X509 *signer, EVP_PKEY *pk, const EVP_MD *md, + unsigned int flags); +EVP_PKEY_CTX *CMS_SignerInfo_get0_pkey_ctx(CMS_SignerInfo *si); +EVP_MD_CTX *CMS_SignerInfo_get0_md_ctx(CMS_SignerInfo *si); +STACK_OF(CMS_SignerInfo) *CMS_get0_SignerInfos(CMS_ContentInfo *cms); + +void CMS_SignerInfo_set1_signer_cert(CMS_SignerInfo *si, X509 *signer); +int CMS_SignerInfo_get0_signer_id(CMS_SignerInfo *si, + ASN1_OCTET_STRING **keyid, + X509_NAME **issuer, ASN1_INTEGER **sno); +int CMS_SignerInfo_cert_cmp(CMS_SignerInfo *si, X509 *cert); +int CMS_set1_signers_certs(CMS_ContentInfo *cms, STACK_OF(X509) *certs, + unsigned int flags); +void CMS_SignerInfo_get0_algs(CMS_SignerInfo *si, EVP_PKEY **pk, + X509 **signer, X509_ALGOR **pdig, + X509_ALGOR **psig); +ASN1_OCTET_STRING *CMS_SignerInfo_get0_signature(CMS_SignerInfo *si); +int CMS_SignerInfo_sign(CMS_SignerInfo *si); +int CMS_SignerInfo_verify(CMS_SignerInfo *si); +int CMS_SignerInfo_verify_content(CMS_SignerInfo *si, BIO *chain); + +int CMS_add_smimecap(CMS_SignerInfo *si, STACK_OF(X509_ALGOR) *algs); +int CMS_add_simple_smimecap(STACK_OF(X509_ALGOR) **algs, + int algnid, int keysize); +int CMS_add_standard_smimecap(STACK_OF(X509_ALGOR) **smcap); + +int CMS_signed_get_attr_count(const CMS_SignerInfo *si); +int CMS_signed_get_attr_by_NID(const CMS_SignerInfo *si, int nid, + int lastpos); +int CMS_signed_get_attr_by_OBJ(const CMS_SignerInfo *si, const 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, const 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, + const 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); + +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); +int CMS_RecipientInfo_kari_get0_alg(CMS_RecipientInfo *ri, + X509_ALGOR **palg, + ASN1_OCTET_STRING **pukm); +STACK_OF(CMS_RecipientEncryptedKey) +*CMS_RecipientInfo_kari_get0_reks(CMS_RecipientInfo *ri); + +int CMS_RecipientInfo_kari_get0_orig_id(CMS_RecipientInfo *ri, + X509_ALGOR **pubalg, + ASN1_BIT_STRING **pubkey, + ASN1_OCTET_STRING **keyid, + X509_NAME **issuer, + ASN1_INTEGER **sno); + +int CMS_RecipientInfo_kari_orig_id_cmp(CMS_RecipientInfo *ri, X509 *cert); + +int CMS_RecipientEncryptedKey_get0_id(CMS_RecipientEncryptedKey *rek, + ASN1_OCTET_STRING **keyid, + ASN1_GENERALIZEDTIME **tm, + CMS_OtherKeyAttribute **other, + X509_NAME **issuer, ASN1_INTEGER **sno); +int CMS_RecipientEncryptedKey_cert_cmp(CMS_RecipientEncryptedKey *rek, + X509 *cert); +int CMS_RecipientInfo_kari_set0_pkey(CMS_RecipientInfo *ri, EVP_PKEY *pk); +EVP_CIPHER_CTX *CMS_RecipientInfo_kari_get0_ctx(CMS_RecipientInfo *ri); +int CMS_RecipientInfo_kari_decrypt(CMS_ContentInfo *cms, + CMS_RecipientInfo *ri, + CMS_RecipientEncryptedKey *rek); + +int CMS_SharedInfo_encode(unsigned char **pder, X509_ALGOR *kekalg, + ASN1_OCTET_STRING *ukm, int keylen); + +/* Backward compatibility for spelling errors. */ +# define CMS_R_UNKNOWN_DIGEST_ALGORITM CMS_R_UNKNOWN_DIGEST_ALGORITHM +# define CMS_R_UNSUPPORTED_RECPIENTINFO_TYPE \ + CMS_R_UNSUPPORTED_RECIPIENTINFO_TYPE + +# ifdef __cplusplus +} +# endif +# endif +#endif diff --git a/openssl-wasm/include/openssl/cmserr.h b/openssl-wasm/include/openssl/cmserr.h new file mode 100644 index 0000000..7dbc13d --- /dev/null +++ b/openssl-wasm/include/openssl/cmserr.h @@ -0,0 +1,202 @@ +/* + * Generated by util/mkerr.pl DO NOT EDIT + * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_CMSERR_H +# define HEADER_CMSERR_H + +# ifndef HEADER_SYMHACKS_H +# include +# endif + +# include + +# ifndef OPENSSL_NO_CMS + +# ifdef __cplusplus +extern "C" +# endif +int ERR_load_CMS_strings(void); + +/* + * CMS 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 179 +# define CMS_F_CMS_ENCRYPTEDCONTENT_INIT_BIO 120 +# define CMS_F_CMS_ENCRYPTEDDATA_DECRYPT 121 +# define CMS_F_CMS_ENCRYPTEDDATA_ENCRYPT 122 +# define CMS_F_CMS_ENCRYPTEDDATA_SET1_KEY 123 +# define CMS_F_CMS_ENVELOPEDDATA_CREATE 124 +# define CMS_F_CMS_ENVELOPEDDATA_INIT_BIO 125 +# define CMS_F_CMS_ENVELOPED_DATA_INIT 126 +# define CMS_F_CMS_ENV_ASN1_CTRL 171 +# define CMS_F_CMS_FINAL 127 +# define CMS_F_CMS_GET0_CERTIFICATE_CHOICES 128 +# define CMS_F_CMS_GET0_CONTENT 129 +# define CMS_F_CMS_GET0_ECONTENT_TYPE 130 +# define CMS_F_CMS_GET0_ENVELOPED 131 +# define CMS_F_CMS_GET0_REVOCATION_CHOICES 132 +# define CMS_F_CMS_GET0_SIGNED 133 +# define CMS_F_CMS_MSGSIGDIGEST_ADD1 162 +# define CMS_F_CMS_RECEIPTREQUEST_CREATE0 159 +# define CMS_F_CMS_RECEIPT_VERIFY 160 +# define CMS_F_CMS_RECIPIENTINFO_DECRYPT 134 +# define CMS_F_CMS_RECIPIENTINFO_ENCRYPT 169 +# define CMS_F_CMS_RECIPIENTINFO_KARI_ENCRYPT 178 +# define CMS_F_CMS_RECIPIENTINFO_KARI_GET0_ALG 175 +# define CMS_F_CMS_RECIPIENTINFO_KARI_GET0_ORIG_ID 173 +# define CMS_F_CMS_RECIPIENTINFO_KARI_GET0_REKS 172 +# define CMS_F_CMS_RECIPIENTINFO_KARI_ORIG_ID_CMP 174 +# define CMS_F_CMS_RECIPIENTINFO_KEKRI_DECRYPT 135 +# define CMS_F_CMS_RECIPIENTINFO_KEKRI_ENCRYPT 136 +# define CMS_F_CMS_RECIPIENTINFO_KEKRI_GET0_ID 137 +# define CMS_F_CMS_RECIPIENTINFO_KEKRI_ID_CMP 138 +# define CMS_F_CMS_RECIPIENTINFO_KTRI_CERT_CMP 139 +# define CMS_F_CMS_RECIPIENTINFO_KTRI_DECRYPT 140 +# define CMS_F_CMS_RECIPIENTINFO_KTRI_ENCRYPT 141 +# define CMS_F_CMS_RECIPIENTINFO_KTRI_GET0_ALGS 142 +# define CMS_F_CMS_RECIPIENTINFO_KTRI_GET0_SIGNER_ID 143 +# define CMS_F_CMS_RECIPIENTINFO_PWRI_CRYPT 167 +# define CMS_F_CMS_RECIPIENTINFO_SET0_KEY 144 +# define CMS_F_CMS_RECIPIENTINFO_SET0_PASSWORD 168 +# define CMS_F_CMS_RECIPIENTINFO_SET0_PKEY 145 +# define CMS_F_CMS_SD_ASN1_CTRL 170 +# define CMS_F_CMS_SET1_IAS 176 +# define CMS_F_CMS_SET1_KEYID 177 +# define CMS_F_CMS_SET1_SIGNERIDENTIFIER 146 +# define CMS_F_CMS_SET_DETACHED 147 +# define CMS_F_CMS_SIGN 148 +# define CMS_F_CMS_SIGNED_DATA_INIT 149 +# define CMS_F_CMS_SIGNERINFO_CONTENT_SIGN 150 +# define CMS_F_CMS_SIGNERINFO_SIGN 151 +# define CMS_F_CMS_SIGNERINFO_VERIFY 152 +# define CMS_F_CMS_SIGNERINFO_VERIFY_CERT 153 +# define CMS_F_CMS_SIGNERINFO_VERIFY_CONTENT 154 +# define CMS_F_CMS_SIGN_RECEIPT 163 +# define CMS_F_CMS_SI_CHECK_ATTRIBUTES 183 +# define CMS_F_CMS_STREAM 155 +# define CMS_F_CMS_UNCOMPRESS 156 +# define CMS_F_CMS_VERIFY 157 +# define CMS_F_KEK_UNWRAP_KEY 180 + +/* + * CMS reason codes. + */ +# define CMS_R_ADD_SIGNER_ERROR 99 +# define CMS_R_ATTRIBUTE_ERROR 161 +# 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_ERROR_GETTING_PUBLIC_KEY 113 +# define CMS_R_ERROR_READING_MESSAGEDIGEST_ATTRIBUTE 114 +# define CMS_R_ERROR_SETTING_KEY 115 +# define CMS_R_ERROR_SETTING_RECIPIENTINFO 116 +# define CMS_R_INVALID_ENCRYPTED_KEY_LENGTH 117 +# define CMS_R_INVALID_KEY_ENCRYPTION_PARAMETER 176 +# define CMS_R_INVALID_KEY_LENGTH 118 +# define CMS_R_MD_BIO_INIT_ERROR 119 +# define CMS_R_MESSAGEDIGEST_ATTRIBUTE_WRONG_LENGTH 120 +# define CMS_R_MESSAGEDIGEST_WRONG_LENGTH 121 +# define CMS_R_MSGSIGDIGEST_ERROR 172 +# define CMS_R_MSGSIGDIGEST_VERIFICATION_FAILURE 162 +# define CMS_R_MSGSIGDIGEST_WRONG_LENGTH 163 +# define CMS_R_NEED_ONE_SIGNER 164 +# define CMS_R_NOT_A_SIGNED_RECEIPT 165 +# define CMS_R_NOT_ENCRYPTED_DATA 122 +# define CMS_R_NOT_KEK 123 +# define CMS_R_NOT_KEY_AGREEMENT 181 +# define CMS_R_NOT_KEY_TRANSPORT 124 +# define CMS_R_NOT_PWRI 177 +# define CMS_R_NOT_SUPPORTED_FOR_THIS_KEY_TYPE 125 +# define CMS_R_NO_CIPHER 126 +# define CMS_R_NO_CONTENT 127 +# define CMS_R_NO_CONTENT_TYPE 173 +# define CMS_R_NO_DEFAULT_DIGEST 128 +# define CMS_R_NO_DIGEST_SET 129 +# define CMS_R_NO_KEY 130 +# define CMS_R_NO_KEY_OR_CERT 174 +# define CMS_R_NO_MATCHING_DIGEST 131 +# define CMS_R_NO_MATCHING_RECIPIENT 132 +# define CMS_R_NO_MATCHING_SIGNATURE 166 +# define CMS_R_NO_MSGSIGDIGEST 167 +# define CMS_R_NO_PASSWORD 178 +# define CMS_R_NO_PRIVATE_KEY 133 +# define CMS_R_NO_PUBLIC_KEY 134 +# define CMS_R_NO_RECEIPT_REQUEST 168 +# define CMS_R_NO_SIGNERS 135 +# define CMS_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE 136 +# define CMS_R_RECEIPT_DECODE_ERROR 169 +# define CMS_R_RECIPIENT_ERROR 137 +# define CMS_R_SIGNER_CERTIFICATE_NOT_FOUND 138 +# define CMS_R_SIGNFINAL_ERROR 139 +# define CMS_R_SMIME_TEXT_ERROR 140 +# define CMS_R_STORE_INIT_ERROR 141 +# define CMS_R_TYPE_NOT_COMPRESSED_DATA 142 +# define CMS_R_TYPE_NOT_DATA 143 +# define CMS_R_TYPE_NOT_DIGESTED_DATA 144 +# define CMS_R_TYPE_NOT_ENCRYPTED_DATA 145 +# define CMS_R_TYPE_NOT_ENVELOPED_DATA 146 +# define CMS_R_UNABLE_TO_FINALIZE_CONTEXT 147 +# define CMS_R_UNKNOWN_CIPHER 148 +# define CMS_R_UNKNOWN_DIGEST_ALGORITHM 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_RECIPIENTINFO_TYPE 155 +# define CMS_R_UNSUPPORTED_RECIPIENT_TYPE 154 +# 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 + +# endif +#endif diff --git a/openssl-wasm/include/openssl/comp.h b/openssl-wasm/include/openssl/comp.h new file mode 100644 index 0000000..d814d3c --- /dev/null +++ b/openssl-wasm/include/openssl/comp.h @@ -0,0 +1,53 @@ +/* + * Copyright 2015-2018 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_COMP_H +# define HEADER_COMP_H + +# include + +# ifndef OPENSSL_NO_COMP +# include +# include +# ifdef __cplusplus +extern "C" { +# endif + + + +COMP_CTX *COMP_CTX_new(COMP_METHOD *meth); +const COMP_METHOD *COMP_CTX_get_method(const COMP_CTX *ctx); +int COMP_CTX_get_type(const COMP_CTX* comp); +int COMP_get_type(const COMP_METHOD *meth); +const char *COMP_get_name(const 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_zlib(void); + +#if OPENSSL_API_COMPAT < 0x10100000L +#define COMP_zlib_cleanup() while(0) continue +#endif + +# ifdef HEADER_BIO_H +# ifdef ZLIB +const BIO_METHOD *BIO_f_zlib(void); +# endif +# endif + + +# ifdef __cplusplus +} +# endif +# endif +#endif diff --git a/openssl-wasm/include/openssl/comperr.h b/openssl-wasm/include/openssl/comperr.h new file mode 100644 index 0000000..90231e9 --- /dev/null +++ b/openssl-wasm/include/openssl/comperr.h @@ -0,0 +1,44 @@ +/* + * Generated by util/mkerr.pl DO NOT EDIT + * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_COMPERR_H +# define HEADER_COMPERR_H + +# ifndef HEADER_SYMHACKS_H +# include +# endif + +# include + +# ifndef OPENSSL_NO_COMP + +# ifdef __cplusplus +extern "C" +# endif +int ERR_load_COMP_strings(void); + +/* + * COMP 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 +# define COMP_F_COMP_CTX_NEW 103 + +/* + * COMP reason codes. + */ +# define COMP_R_ZLIB_DEFLATE_ERROR 99 +# define COMP_R_ZLIB_INFLATE_ERROR 100 +# define COMP_R_ZLIB_NOT_SUPPORTED 101 + +# endif +#endif diff --git a/openssl-wasm/include/openssl/conf.h b/openssl-wasm/include/openssl/conf.h new file mode 100644 index 0000000..7336cd2 --- /dev/null +++ b/openssl-wasm/include/openssl/conf.h @@ -0,0 +1,168 @@ +/* + * Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#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; + +DEFINE_STACK_OF(CONF_VALUE) +DEFINE_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; + +DEFINE_STACK_OF(CONF_MODULE) +DEFINE_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_STDIO +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); +#ifndef OPENSSL_NO_STDIO +int CONF_dump_fp(LHASH_OF(CONF_VALUE) *conf, FILE *out); +#endif +int CONF_dump_bio(LHASH_OF(CONF_VALUE) *conf, BIO *out); + +DEPRECATEDIN_1_1_0(void OPENSSL_config(const char *config_name)) + +#if OPENSSL_API_COMPAT < 0x10100000L +# define OPENSSL_no_config() \ + OPENSSL_init_crypto(OPENSSL_INIT_NO_LOAD_CONFIG, NULL) +#endif + +/* + * 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); +void NCONF_free(CONF *conf); +void NCONF_free_data(CONF *conf); + +int NCONF_load(CONF *conf, const char *file, long *eline); +# ifndef OPENSSL_NO_STDIO +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); +#ifndef OPENSSL_NO_STDIO +int NCONF_dump_fp(const CONF *conf, FILE *out); +#endif +int NCONF_dump_bio(const CONF *conf, BIO *out); + +#define NCONF_get_number(c,g,n,r) NCONF_get_number_e(c,g,n,r) + +/* 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); +#if OPENSSL_API_COMPAT < 0x10100000L +# define CONF_modules_free() while(0) continue +#endif +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); + + +# ifdef __cplusplus +} +# endif +#endif diff --git a/openssl-wasm/include/openssl/conf_api.h b/openssl-wasm/include/openssl/conf_api.h new file mode 100644 index 0000000..a0275ad --- /dev/null +++ b/openssl-wasm/include/openssl/conf_api.h @@ -0,0 +1,40 @@ +/* + * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#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/openssl-wasm/include/openssl/conferr.h b/openssl-wasm/include/openssl/conferr.h new file mode 100644 index 0000000..32b9229 --- /dev/null +++ b/openssl-wasm/include/openssl/conferr.h @@ -0,0 +1,76 @@ +/* + * Generated by util/mkerr.pl DO NOT EDIT + * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_CONFERR_H +# define HEADER_CONFERR_H + +# ifndef HEADER_SYMHACKS_H +# include +# endif + +# ifdef __cplusplus +extern "C" +# endif +int ERR_load_CONF_strings(void); + +/* + * CONF function codes. + */ +# define CONF_F_CONF_DUMP_FP 104 +# define CONF_F_CONF_LOAD 100 +# define CONF_F_CONF_LOAD_FP 103 +# define CONF_F_CONF_PARSE_LIST 119 +# define CONF_F_DEF_LOAD 120 +# define CONF_F_DEF_LOAD_BIO 121 +# define CONF_F_GET_NEXT_FILE 107 +# define CONF_F_MODULE_ADD 122 +# 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_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_PROCESS_INCLUDE 116 +# define CONF_F_SSL_MODULE_INIT 123 +# define CONF_F_STR_COPY 101 + +/* + * CONF 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_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_NUMBER_TOO_LARGE 121 +# define CONF_R_RECURSIVE_DIRECTORY_INCLUDE 111 +# define CONF_R_SSL_COMMAND_SECTION_EMPTY 117 +# define CONF_R_SSL_COMMAND_SECTION_NOT_FOUND 118 +# define CONF_R_SSL_SECTION_EMPTY 119 +# define CONF_R_SSL_SECTION_NOT_FOUND 120 +# define CONF_R_UNABLE_TO_CREATE_NEW_SECTION 103 +# define CONF_R_UNKNOWN_MODULE_NAME 113 +# define CONF_R_VARIABLE_EXPANSION_TOO_LONG 116 +# define CONF_R_VARIABLE_HAS_NO_VALUE 104 + +#endif diff --git a/openssl-wasm/include/openssl/crypto.h b/openssl-wasm/include/openssl/crypto.h new file mode 100644 index 0000000..7d0b526 --- /dev/null +++ b/openssl-wasm/include/openssl/crypto.h @@ -0,0 +1,445 @@ +/* + * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved. + * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_CRYPTO_H +# define HEADER_CRYPTO_H + +# include +# include + +# include + +# ifndef OPENSSL_NO_STDIO +# include +# endif + +# include +# 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 + +# if OPENSSL_API_COMPAT < 0x10100000L +# include +# endif + +#ifdef __cplusplus +extern "C" { +#endif + +# if OPENSSL_API_COMPAT < 0x10100000L +# define SSLeay OpenSSL_version_num +# define SSLeay_version OpenSSL_version +# define SSLEAY_VERSION_NUMBER OPENSSL_VERSION_NUMBER +# define SSLEAY_VERSION OPENSSL_VERSION +# define SSLEAY_CFLAGS OPENSSL_CFLAGS +# define SSLEAY_BUILT_ON OPENSSL_BUILT_ON +# define SSLEAY_PLATFORM OPENSSL_PLATFORM +# define SSLEAY_DIR OPENSSL_DIR + +/* + * Old type for allocating dynamic locks. No longer used. Use the new thread + * API instead. + */ +typedef struct { + int dummy; +} CRYPTO_dynlock; + +# endif /* OPENSSL_API_COMPAT */ + +typedef void CRYPTO_RWLOCK; + +CRYPTO_RWLOCK *CRYPTO_THREAD_lock_new(void); +int CRYPTO_THREAD_read_lock(CRYPTO_RWLOCK *lock); +int CRYPTO_THREAD_write_lock(CRYPTO_RWLOCK *lock); +int CRYPTO_THREAD_unlock(CRYPTO_RWLOCK *lock); +void CRYPTO_THREAD_lock_free(CRYPTO_RWLOCK *lock); + +int CRYPTO_atomic_add(int *val, int amount, int *ret, CRYPTO_RWLOCK *lock); + +/* + * The following can be used to detect memory leaks in the library. If + * used, it turns on malloc checking + */ +# define CRYPTO_MEM_CHECK_OFF 0x0 /* Control only */ +# define CRYPTO_MEM_CHECK_ON 0x1 /* Control and mode bit */ +# define CRYPTO_MEM_CHECK_ENABLE 0x2 /* Control and mode bit */ +# define CRYPTO_MEM_CHECK_DISABLE 0x3 /* Control only */ + +struct crypto_ex_data_st { + STACK_OF(void) *sk; +}; +DEFINE_STACK_OF(void) + +/* + * Per class, we have a STACK of function pointers. + */ +# define CRYPTO_EX_INDEX_SSL 0 +# define CRYPTO_EX_INDEX_SSL_CTX 1 +# define CRYPTO_EX_INDEX_SSL_SESSION 2 +# define CRYPTO_EX_INDEX_X509 3 +# define CRYPTO_EX_INDEX_X509_STORE 4 +# define CRYPTO_EX_INDEX_X509_STORE_CTX 5 +# define CRYPTO_EX_INDEX_DH 6 +# define CRYPTO_EX_INDEX_DSA 7 +# define CRYPTO_EX_INDEX_EC_KEY 8 +# define CRYPTO_EX_INDEX_RSA 9 +# define CRYPTO_EX_INDEX_ENGINE 10 +# define CRYPTO_EX_INDEX_UI 11 +# define CRYPTO_EX_INDEX_BIO 12 +# define CRYPTO_EX_INDEX_APP 13 +# define CRYPTO_EX_INDEX_UI_METHOD 14 +# define CRYPTO_EX_INDEX_DRBG 15 +# define CRYPTO_EX_INDEX__COUNT 16 + +/* No longer needed, so this is a no-op */ +#define OPENSSL_malloc_init() while(0) continue + +int CRYPTO_mem_ctrl(int mode); + +# define OPENSSL_malloc(num) \ + CRYPTO_malloc(num, OPENSSL_FILE, OPENSSL_LINE) +# define OPENSSL_zalloc(num) \ + CRYPTO_zalloc(num, OPENSSL_FILE, OPENSSL_LINE) +# define OPENSSL_realloc(addr, num) \ + CRYPTO_realloc(addr, num, OPENSSL_FILE, OPENSSL_LINE) +# define OPENSSL_clear_realloc(addr, old_num, num) \ + CRYPTO_clear_realloc(addr, old_num, num, OPENSSL_FILE, OPENSSL_LINE) +# define OPENSSL_clear_free(addr, num) \ + CRYPTO_clear_free(addr, num, OPENSSL_FILE, OPENSSL_LINE) +# define OPENSSL_free(addr) \ + CRYPTO_free(addr, OPENSSL_FILE, OPENSSL_LINE) +# define OPENSSL_memdup(str, s) \ + CRYPTO_memdup((str), s, OPENSSL_FILE, OPENSSL_LINE) +# define OPENSSL_strdup(str) \ + CRYPTO_strdup(str, OPENSSL_FILE, OPENSSL_LINE) +# define OPENSSL_strndup(str, n) \ + CRYPTO_strndup(str, n, OPENSSL_FILE, OPENSSL_LINE) +# define OPENSSL_secure_malloc(num) \ + CRYPTO_secure_malloc(num, OPENSSL_FILE, OPENSSL_LINE) +# define OPENSSL_secure_zalloc(num) \ + CRYPTO_secure_zalloc(num, OPENSSL_FILE, OPENSSL_LINE) +# define OPENSSL_secure_free(addr) \ + CRYPTO_secure_free(addr, OPENSSL_FILE, OPENSSL_LINE) +# define OPENSSL_secure_clear_free(addr, num) \ + CRYPTO_secure_clear_free(addr, num, OPENSSL_FILE, OPENSSL_LINE) +# define OPENSSL_secure_actual_size(ptr) \ + CRYPTO_secure_actual_size(ptr) + +size_t OPENSSL_strlcpy(char *dst, const char *src, size_t siz); +size_t OPENSSL_strlcat(char *dst, const char *src, size_t siz); +size_t OPENSSL_strnlen(const char *str, size_t maxlen); +char *OPENSSL_buf2hexstr(const unsigned char *buffer, long len); +unsigned char *OPENSSL_hexstr2buf(const char *str, long *len); +int OPENSSL_hexchar2int(unsigned char c); + +# define OPENSSL_MALLOC_MAX_NELEMS(type) (((1U<<(sizeof(int)*8-1))-1)/sizeof(type)) + +unsigned long OpenSSL_version_num(void); +const char *OpenSSL_version(int type); +# define OPENSSL_VERSION 0 +# define OPENSSL_CFLAGS 1 +# define OPENSSL_BUILT_ON 2 +# define OPENSSL_PLATFORM 3 +# define OPENSSL_DIR 4 +# define OPENSSL_ENGINES_DIR 5 + +int OPENSSL_issetugid(void); + +typedef void 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, const CRYPTO_EX_DATA *from, + void *from_d, int idx, long argl, void *argp); +__owur 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); +/* No longer use an index. */ +int CRYPTO_free_ex_index(int class_index, int idx); + +/* + * 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, + const 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); + +# if OPENSSL_API_COMPAT < 0x10100000L +/* + * This function cleans up all "ex_data" state. It mustn't be called under + * potential race-conditions. + */ +# define CRYPTO_cleanup_all_ex_data() while(0) continue + +/* + * The old locking functions have been removed completely without compatibility + * macros. This is because the old functions either could not properly report + * errors, or the returned error values were not clearly documented. + * Replacing the locking functions with no-ops would cause race condition + * issues in the affected applications. It is far better for them to fail at + * compile time. + * On the other hand, the locking callbacks are no longer used. Consequently, + * the callback management functions can be safely replaced with no-op macros. + */ +# define CRYPTO_num_locks() (1) +# define CRYPTO_set_locking_callback(func) +# define CRYPTO_get_locking_callback() (NULL) +# define CRYPTO_set_add_lock_callback(func) +# define CRYPTO_get_add_lock_callback() (NULL) + +/* + * These defines where used in combination with the old locking callbacks, + * they are not called anymore, but old code that's not called might still + * use them. + */ +# define CRYPTO_LOCK 1 +# define CRYPTO_UNLOCK 2 +# define CRYPTO_READ 4 +# define CRYPTO_WRITE 8 + +/* This structure is no longer used */ +typedef struct crypto_threadid_st { + int dummy; +} CRYPTO_THREADID; +/* Only use CRYPTO_THREADID_set_[numeric|pointer]() within callbacks */ +# define CRYPTO_THREADID_set_numeric(id, val) +# define CRYPTO_THREADID_set_pointer(id, ptr) +# define CRYPTO_THREADID_set_callback(threadid_func) (0) +# define CRYPTO_THREADID_get_callback() (NULL) +# define CRYPTO_THREADID_current(id) +# define CRYPTO_THREADID_cmp(a, b) (-1) +# define CRYPTO_THREADID_cpy(dest, src) +# define CRYPTO_THREADID_hash(id) (0UL) + +# if OPENSSL_API_COMPAT < 0x10000000L +# define CRYPTO_set_id_callback(func) +# define CRYPTO_get_id_callback() (NULL) +# define CRYPTO_thread_id() (0UL) +# endif /* OPENSSL_API_COMPAT < 0x10000000L */ + +# define CRYPTO_set_dynlock_create_callback(dyn_create_function) +# define CRYPTO_set_dynlock_lock_callback(dyn_lock_function) +# define CRYPTO_set_dynlock_destroy_callback(dyn_destroy_function) +# define CRYPTO_get_dynlock_create_callback() (NULL) +# define CRYPTO_get_dynlock_lock_callback() (NULL) +# define CRYPTO_get_dynlock_destroy_callback() (NULL) +# endif /* OPENSSL_API_COMPAT < 0x10100000L */ + +int CRYPTO_set_mem_functions( + void *(*m) (size_t, const char *, int), + void *(*r) (void *, size_t, const char *, int), + void (*f) (void *, const char *, int)); +int CRYPTO_set_mem_debug(int flag); +void CRYPTO_get_mem_functions( + void *(**m) (size_t, const char *, int), + void *(**r) (void *, size_t, const char *, int), + void (**f) (void *, const char *, int)); + +void *CRYPTO_malloc(size_t num, const char *file, int line); +void *CRYPTO_zalloc(size_t num, const char *file, int line); +void *CRYPTO_memdup(const void *str, size_t siz, const char *file, int line); +char *CRYPTO_strdup(const char *str, const char *file, int line); +char *CRYPTO_strndup(const char *str, size_t s, const char *file, int line); +void CRYPTO_free(void *ptr, const char *file, int line); +void CRYPTO_clear_free(void *ptr, size_t num, const char *file, int line); +void *CRYPTO_realloc(void *addr, size_t num, const char *file, int line); +void *CRYPTO_clear_realloc(void *addr, size_t old_num, size_t num, + const char *file, int line); + +int CRYPTO_secure_malloc_init(size_t sz, int minsize); +int CRYPTO_secure_malloc_done(void); +void *CRYPTO_secure_malloc(size_t num, const char *file, int line); +void *CRYPTO_secure_zalloc(size_t num, const char *file, int line); +void CRYPTO_secure_free(void *ptr, const char *file, int line); +void CRYPTO_secure_clear_free(void *ptr, size_t num, + const char *file, int line); +int CRYPTO_secure_allocated(const void *ptr); +int CRYPTO_secure_malloc_initialized(void); +size_t CRYPTO_secure_actual_size(void *ptr); +size_t CRYPTO_secure_used(void); + +void OPENSSL_cleanse(void *ptr, size_t len); + +# ifndef OPENSSL_NO_CRYPTO_MDEBUG +# define OPENSSL_mem_debug_push(info) \ + CRYPTO_mem_debug_push(info, OPENSSL_FILE, OPENSSL_LINE) +# define OPENSSL_mem_debug_pop() \ + CRYPTO_mem_debug_pop() +int CRYPTO_mem_debug_push(const char *info, const char *file, int line); +int CRYPTO_mem_debug_pop(void); +void CRYPTO_get_alloc_counts(int *mcount, int *rcount, int *fcount); + +/*- + * Debugging functions (enabled by CRYPTO_set_mem_debug(1)) + * The flag 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_mem_debug_malloc(void *addr, size_t num, int flag, + const char *file, int line); +void CRYPTO_mem_debug_realloc(void *addr1, void *addr2, size_t num, int flag, + const char *file, int line); +void CRYPTO_mem_debug_free(void *addr, int flag, + const char *file, int line); + +int CRYPTO_mem_leaks_cb(int (*cb) (const char *str, size_t len, void *u), + void *u); +# ifndef OPENSSL_NO_STDIO +int CRYPTO_mem_leaks_fp(FILE *); +# endif +int CRYPTO_mem_leaks(BIO *bio); +# endif + +/* die if we have to */ +ossl_noreturn void OPENSSL_die(const char *assertion, const char *file, int line); +# if OPENSSL_API_COMPAT < 0x10100000L +# define OpenSSLDie(f,l,a) OPENSSL_die((a),(f),(l)) +# endif +# define OPENSSL_assert(e) \ + (void)((e) ? 0 : (OPENSSL_die("assertion failed: " #e, OPENSSL_FILE, OPENSSL_LINE), 1)) + +int OPENSSL_isservice(void); + +int FIPS_mode(void); +int FIPS_mode_set(int r); + +void OPENSSL_init(void); +# ifdef OPENSSL_SYS_UNIX +void OPENSSL_fork_prepare(void); +void OPENSSL_fork_parent(void); +void OPENSSL_fork_child(void); +# endif + +struct tm *OPENSSL_gmtime(const time_t *timer, struct tm *result); +int OPENSSL_gmtime_adj(struct tm *tm, int offset_day, long offset_sec); +int OPENSSL_gmtime_diff(int *pday, int *psec, + const struct tm *from, const struct tm *to); + +/* + * 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 * in_a, const void * in_b, size_t len); + +/* Standard initialisation options */ +# define OPENSSL_INIT_NO_LOAD_CRYPTO_STRINGS 0x00000001L +# define OPENSSL_INIT_LOAD_CRYPTO_STRINGS 0x00000002L +# define OPENSSL_INIT_ADD_ALL_CIPHERS 0x00000004L +# define OPENSSL_INIT_ADD_ALL_DIGESTS 0x00000008L +# define OPENSSL_INIT_NO_ADD_ALL_CIPHERS 0x00000010L +# define OPENSSL_INIT_NO_ADD_ALL_DIGESTS 0x00000020L +# define OPENSSL_INIT_LOAD_CONFIG 0x00000040L +# define OPENSSL_INIT_NO_LOAD_CONFIG 0x00000080L +# define OPENSSL_INIT_ASYNC 0x00000100L +# define OPENSSL_INIT_ENGINE_RDRAND 0x00000200L +# define OPENSSL_INIT_ENGINE_DYNAMIC 0x00000400L +# define OPENSSL_INIT_ENGINE_OPENSSL 0x00000800L +# define OPENSSL_INIT_ENGINE_CRYPTODEV 0x00001000L +# define OPENSSL_INIT_ENGINE_CAPI 0x00002000L +# define OPENSSL_INIT_ENGINE_PADLOCK 0x00004000L +# define OPENSSL_INIT_ENGINE_AFALG 0x00008000L +/* OPENSSL_INIT_ZLIB 0x00010000L */ +# define OPENSSL_INIT_ATFORK 0x00020000L +/* OPENSSL_INIT_BASE_ONLY 0x00040000L */ +# define OPENSSL_INIT_NO_ATEXIT 0x00080000L +/* OPENSSL_INIT flag range 0xfff00000 reserved for OPENSSL_init_ssl() */ +/* Max OPENSSL_INIT flag value is 0x80000000 */ + +/* openssl and dasync not counted as builtin */ +# define OPENSSL_INIT_ENGINE_ALL_BUILTIN \ + (OPENSSL_INIT_ENGINE_RDRAND | OPENSSL_INIT_ENGINE_DYNAMIC \ + | OPENSSL_INIT_ENGINE_CRYPTODEV | OPENSSL_INIT_ENGINE_CAPI | \ + OPENSSL_INIT_ENGINE_PADLOCK) + + +/* Library initialisation functions */ +void OPENSSL_cleanup(void); +int OPENSSL_init_crypto(uint64_t opts, const OPENSSL_INIT_SETTINGS *settings); +int OPENSSL_atexit(void (*handler)(void)); +void OPENSSL_thread_stop(void); + +/* Low-level control of initialization */ +OPENSSL_INIT_SETTINGS *OPENSSL_INIT_new(void); +# ifndef OPENSSL_NO_STDIO +int OPENSSL_INIT_set_config_filename(OPENSSL_INIT_SETTINGS *settings, + const char *config_filename); +void OPENSSL_INIT_set_config_file_flags(OPENSSL_INIT_SETTINGS *settings, + unsigned long flags); +int OPENSSL_INIT_set_config_appname(OPENSSL_INIT_SETTINGS *settings, + const char *config_appname); +# endif +void OPENSSL_INIT_free(OPENSSL_INIT_SETTINGS *settings); + +# if defined(OPENSSL_THREADS) && !defined(CRYPTO_TDEBUG) +# if defined(_WIN32) +# if defined(BASETYPES) || defined(_WINDEF_H) +/* application has to include in order to use this */ +typedef DWORD CRYPTO_THREAD_LOCAL; +typedef DWORD CRYPTO_THREAD_ID; + +typedef LONG CRYPTO_ONCE; +# define CRYPTO_ONCE_STATIC_INIT 0 +# endif +# else +# include +typedef pthread_once_t CRYPTO_ONCE; +typedef pthread_key_t CRYPTO_THREAD_LOCAL; +typedef pthread_t CRYPTO_THREAD_ID; + +# define CRYPTO_ONCE_STATIC_INIT PTHREAD_ONCE_INIT +# endif +# endif + +# if !defined(CRYPTO_ONCE_STATIC_INIT) +typedef unsigned int CRYPTO_ONCE; +typedef unsigned int CRYPTO_THREAD_LOCAL; +typedef unsigned int CRYPTO_THREAD_ID; +# define CRYPTO_ONCE_STATIC_INIT 0 +# endif + +int CRYPTO_THREAD_run_once(CRYPTO_ONCE *once, void (*init)(void)); + +int CRYPTO_THREAD_init_local(CRYPTO_THREAD_LOCAL *key, void (*cleanup)(void *)); +void *CRYPTO_THREAD_get_local(CRYPTO_THREAD_LOCAL *key); +int CRYPTO_THREAD_set_local(CRYPTO_THREAD_LOCAL *key, void *val); +int CRYPTO_THREAD_cleanup_local(CRYPTO_THREAD_LOCAL *key); + +CRYPTO_THREAD_ID CRYPTO_THREAD_get_current_id(void); +int CRYPTO_THREAD_compare_id(CRYPTO_THREAD_ID a, CRYPTO_THREAD_ID b); + + +# ifdef __cplusplus +} +# endif +#endif diff --git a/openssl-wasm/include/openssl/cryptoerr.h b/openssl-wasm/include/openssl/cryptoerr.h new file mode 100644 index 0000000..3db5a4e --- /dev/null +++ b/openssl-wasm/include/openssl/cryptoerr.h @@ -0,0 +1,57 @@ +/* + * Generated by util/mkerr.pl DO NOT EDIT + * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_CRYPTOERR_H +# define HEADER_CRYPTOERR_H + +# ifndef HEADER_SYMHACKS_H +# include +# endif + +# ifdef __cplusplus +extern "C" +# endif +int ERR_load_CRYPTO_strings(void); + +/* + * CRYPTO function codes. + */ +# define CRYPTO_F_CMAC_CTX_NEW 120 +# define CRYPTO_F_CRYPTO_DUP_EX_DATA 110 +# define CRYPTO_F_CRYPTO_FREE_EX_DATA 111 +# define CRYPTO_F_CRYPTO_GET_EX_NEW_INDEX 100 +# define CRYPTO_F_CRYPTO_MEMDUP 115 +# define CRYPTO_F_CRYPTO_NEW_EX_DATA 112 +# define CRYPTO_F_CRYPTO_OCB128_COPY_CTX 121 +# define CRYPTO_F_CRYPTO_OCB128_INIT 122 +# define CRYPTO_F_CRYPTO_SET_EX_DATA 102 +# define CRYPTO_F_FIPS_MODE_SET 109 +# define CRYPTO_F_GET_AND_LOCK 113 +# define CRYPTO_F_OPENSSL_ATEXIT 114 +# define CRYPTO_F_OPENSSL_BUF2HEXSTR 117 +# define CRYPTO_F_OPENSSL_FOPEN 119 +# define CRYPTO_F_OPENSSL_HEXSTR2BUF 118 +# define CRYPTO_F_OPENSSL_INIT_CRYPTO 116 +# define CRYPTO_F_OPENSSL_LH_NEW 126 +# define CRYPTO_F_OPENSSL_SK_DEEP_COPY 127 +# define CRYPTO_F_OPENSSL_SK_DUP 128 +# define CRYPTO_F_PKEY_HMAC_INIT 123 +# define CRYPTO_F_PKEY_POLY1305_INIT 124 +# define CRYPTO_F_PKEY_SIPHASH_INIT 125 +# define CRYPTO_F_SK_RESERVE 129 + +/* + * CRYPTO reason codes. + */ +# define CRYPTO_R_FIPS_MODE_NOT_SUPPORTED 101 +# define CRYPTO_R_ILLEGAL_HEX_DIGIT 102 +# define CRYPTO_R_ODD_NUMBER_OF_DIGITS 103 + +#endif diff --git a/openssl-wasm/include/openssl/ct.h b/openssl-wasm/include/openssl/ct.h new file mode 100644 index 0000000..ebdba34 --- /dev/null +++ b/openssl-wasm/include/openssl/ct.h @@ -0,0 +1,474 @@ +/* + * Copyright 2016-2018 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_CT_H +# define HEADER_CT_H + +# include + +# ifndef OPENSSL_NO_CT +# include +# include +# include +# include +# ifdef __cplusplus +extern "C" { +# endif + + +/* Minimum RSA key size, from RFC6962 */ +# define SCT_MIN_RSA_BITS 2048 + +/* All hashes are SHA256 in v1 of Certificate Transparency */ +# define CT_V1_HASHLEN SHA256_DIGEST_LENGTH + +typedef enum { + CT_LOG_ENTRY_TYPE_NOT_SET = -1, + CT_LOG_ENTRY_TYPE_X509 = 0, + CT_LOG_ENTRY_TYPE_PRECERT = 1 +} ct_log_entry_type_t; + +typedef enum { + SCT_VERSION_NOT_SET = -1, + SCT_VERSION_V1 = 0 +} sct_version_t; + +typedef enum { + SCT_SOURCE_UNKNOWN, + SCT_SOURCE_TLS_EXTENSION, + SCT_SOURCE_X509V3_EXTENSION, + SCT_SOURCE_OCSP_STAPLED_RESPONSE +} sct_source_t; + +typedef enum { + SCT_VALIDATION_STATUS_NOT_SET, + SCT_VALIDATION_STATUS_UNKNOWN_LOG, + SCT_VALIDATION_STATUS_VALID, + SCT_VALIDATION_STATUS_INVALID, + SCT_VALIDATION_STATUS_UNVERIFIED, + SCT_VALIDATION_STATUS_UNKNOWN_VERSION +} sct_validation_status_t; + +DEFINE_STACK_OF(SCT) +DEFINE_STACK_OF(CTLOG) + +/****************************************** + * CT policy evaluation context functions * + ******************************************/ + +/* + * Creates a new, empty policy evaluation context. + * The caller is responsible for calling CT_POLICY_EVAL_CTX_free when finished + * with the CT_POLICY_EVAL_CTX. + */ +CT_POLICY_EVAL_CTX *CT_POLICY_EVAL_CTX_new(void); + +/* Deletes a policy evaluation context and anything it owns. */ +void CT_POLICY_EVAL_CTX_free(CT_POLICY_EVAL_CTX *ctx); + +/* Gets the peer certificate that the SCTs are for */ +X509* CT_POLICY_EVAL_CTX_get0_cert(const CT_POLICY_EVAL_CTX *ctx); + +/* + * Sets the certificate associated with the received SCTs. + * Increments the reference count of cert. + * Returns 1 on success, 0 otherwise. + */ +int CT_POLICY_EVAL_CTX_set1_cert(CT_POLICY_EVAL_CTX *ctx, X509 *cert); + +/* Gets the issuer of the aforementioned certificate */ +X509* CT_POLICY_EVAL_CTX_get0_issuer(const CT_POLICY_EVAL_CTX *ctx); + +/* + * Sets the issuer of the certificate associated with the received SCTs. + * Increments the reference count of issuer. + * Returns 1 on success, 0 otherwise. + */ +int CT_POLICY_EVAL_CTX_set1_issuer(CT_POLICY_EVAL_CTX *ctx, X509 *issuer); + +/* Gets the CT logs that are trusted sources of SCTs */ +const CTLOG_STORE *CT_POLICY_EVAL_CTX_get0_log_store(const CT_POLICY_EVAL_CTX *ctx); + +/* Sets the log store that is in use. It must outlive the CT_POLICY_EVAL_CTX. */ +void CT_POLICY_EVAL_CTX_set_shared_CTLOG_STORE(CT_POLICY_EVAL_CTX *ctx, + CTLOG_STORE *log_store); + +/* + * Gets the time, in milliseconds since the Unix epoch, that will be used as the + * current time when checking whether an SCT was issued in the future. + * Such SCTs will fail validation, as required by RFC6962. + */ +uint64_t CT_POLICY_EVAL_CTX_get_time(const CT_POLICY_EVAL_CTX *ctx); + +/* + * Sets the time to evaluate SCTs against, in milliseconds since the Unix epoch. + * If an SCT's timestamp is after this time, it will be interpreted as having + * been issued in the future. RFC6962 states that "TLS clients MUST reject SCTs + * whose timestamp is in the future", so an SCT will not validate in this case. + */ +void CT_POLICY_EVAL_CTX_set_time(CT_POLICY_EVAL_CTX *ctx, uint64_t time_in_ms); + +/***************** + * SCT functions * + *****************/ + +/* + * Creates a new, blank SCT. + * The caller is responsible for calling SCT_free when finished with the SCT. + */ +SCT *SCT_new(void); + +/* + * Creates a new SCT from some base64-encoded strings. + * The caller is responsible for calling SCT_free when finished with the SCT. + */ +SCT *SCT_new_from_base64(unsigned char version, + const char *logid_base64, + ct_log_entry_type_t entry_type, + uint64_t timestamp, + const char *extensions_base64, + const char *signature_base64); + +/* + * Frees the SCT and the underlying data structures. + */ +void SCT_free(SCT *sct); + +/* + * Free a stack of SCTs, and the underlying SCTs themselves. + * Intended to be compatible with X509V3_EXT_FREE. + */ +void SCT_LIST_free(STACK_OF(SCT) *a); + +/* + * Returns the version of the SCT. + */ +sct_version_t SCT_get_version(const SCT *sct); + +/* + * Set the version of an SCT. + * Returns 1 on success, 0 if the version is unrecognized. + */ +__owur int SCT_set_version(SCT *sct, sct_version_t version); + +/* + * Returns the log entry type of the SCT. + */ +ct_log_entry_type_t SCT_get_log_entry_type(const SCT *sct); + +/* + * Set the log entry type of an SCT. + * Returns 1 on success, 0 otherwise. + */ +__owur int SCT_set_log_entry_type(SCT *sct, ct_log_entry_type_t entry_type); + +/* + * Gets the ID of the log that an SCT came from. + * Ownership of the log ID remains with the SCT. + * Returns the length of the log ID. + */ +size_t SCT_get0_log_id(const SCT *sct, unsigned char **log_id); + +/* + * Set the log ID of an SCT to point directly to the *log_id specified. + * The SCT takes ownership of the specified pointer. + * Returns 1 on success, 0 otherwise. + */ +__owur int SCT_set0_log_id(SCT *sct, unsigned char *log_id, size_t log_id_len); + +/* + * Set the log ID of an SCT. + * This makes a copy of the log_id. + * Returns 1 on success, 0 otherwise. + */ +__owur int SCT_set1_log_id(SCT *sct, const unsigned char *log_id, + size_t log_id_len); + +/* + * Returns the timestamp for the SCT (epoch time in milliseconds). + */ +uint64_t SCT_get_timestamp(const SCT *sct); + +/* + * Set the timestamp of an SCT (epoch time in milliseconds). + */ +void SCT_set_timestamp(SCT *sct, uint64_t timestamp); + +/* + * Return the NID for the signature used by the SCT. + * For CT v1, this will be either NID_sha256WithRSAEncryption or + * NID_ecdsa_with_SHA256 (or NID_undef if incorrect/unset). + */ +int SCT_get_signature_nid(const SCT *sct); + +/* + * Set the signature type of an SCT + * For CT v1, this should be either NID_sha256WithRSAEncryption or + * NID_ecdsa_with_SHA256. + * Returns 1 on success, 0 otherwise. + */ +__owur int SCT_set_signature_nid(SCT *sct, int nid); + +/* + * Set *ext to point to the extension data for the SCT. ext must not be NULL. + * The SCT retains ownership of this pointer. + * Returns length of the data pointed to. + */ +size_t SCT_get0_extensions(const SCT *sct, unsigned char **ext); + +/* + * Set the extensions of an SCT to point directly to the *ext specified. + * The SCT takes ownership of the specified pointer. + */ +void SCT_set0_extensions(SCT *sct, unsigned char *ext, size_t ext_len); + +/* + * Set the extensions of an SCT. + * This takes a copy of the ext. + * Returns 1 on success, 0 otherwise. + */ +__owur int SCT_set1_extensions(SCT *sct, const unsigned char *ext, + size_t ext_len); + +/* + * Set *sig to point to the signature for the SCT. sig must not be NULL. + * The SCT retains ownership of this pointer. + * Returns length of the data pointed to. + */ +size_t SCT_get0_signature(const SCT *sct, unsigned char **sig); + +/* + * Set the signature of an SCT to point directly to the *sig specified. + * The SCT takes ownership of the specified pointer. + */ +void SCT_set0_signature(SCT *sct, unsigned char *sig, size_t sig_len); + +/* + * Set the signature of an SCT to be a copy of the *sig specified. + * Returns 1 on success, 0 otherwise. + */ +__owur int SCT_set1_signature(SCT *sct, const unsigned char *sig, + size_t sig_len); + +/* + * The origin of this SCT, e.g. TLS extension, OCSP response, etc. + */ +sct_source_t SCT_get_source(const SCT *sct); + +/* + * Set the origin of this SCT, e.g. TLS extension, OCSP response, etc. + * Returns 1 on success, 0 otherwise. + */ +__owur int SCT_set_source(SCT *sct, sct_source_t source); + +/* + * Returns a text string describing the validation status of |sct|. + */ +const char *SCT_validation_status_string(const SCT *sct); + +/* + * Pretty-prints an |sct| to |out|. + * It will be indented by the number of spaces specified by |indent|. + * If |logs| is not NULL, it will be used to lookup the CT log that the SCT came + * from, so that the log name can be printed. + */ +void SCT_print(const SCT *sct, BIO *out, int indent, const CTLOG_STORE *logs); + +/* + * Pretty-prints an |sct_list| to |out|. + * It will be indented by the number of spaces specified by |indent|. + * SCTs will be delimited by |separator|. + * If |logs| is not NULL, it will be used to lookup the CT log that each SCT + * came from, so that the log names can be printed. + */ +void SCT_LIST_print(const STACK_OF(SCT) *sct_list, BIO *out, int indent, + const char *separator, const CTLOG_STORE *logs); + +/* + * Gets the last result of validating this SCT. + * If it has not been validated yet, returns SCT_VALIDATION_STATUS_NOT_SET. + */ +sct_validation_status_t SCT_get_validation_status(const SCT *sct); + +/* + * Validates the given SCT with the provided context. + * Sets the "validation_status" field of the SCT. + * Returns 1 if the SCT is valid and the signature verifies. + * Returns 0 if the SCT is invalid or could not be verified. + * Returns -1 if an error occurs. + */ +__owur int SCT_validate(SCT *sct, const CT_POLICY_EVAL_CTX *ctx); + +/* + * Validates the given list of SCTs with the provided context. + * Sets the "validation_status" field of each SCT. + * Returns 1 if there are no invalid SCTs and all signatures verify. + * Returns 0 if at least one SCT is invalid or could not be verified. + * Returns a negative integer if an error occurs. + */ +__owur int SCT_LIST_validate(const STACK_OF(SCT) *scts, + CT_POLICY_EVAL_CTX *ctx); + + +/********************************* + * SCT parsing and serialisation * + *********************************/ + +/* + * Serialize (to TLS format) a stack of SCTs and return the length. + * "a" must not be NULL. + * If "pp" is NULL, just return the length of what would have been serialized. + * If "pp" is not NULL and "*pp" is null, function will allocate a new pointer + * for data that caller is responsible for freeing (only if function returns + * successfully). + * If "pp" is NULL and "*pp" is not NULL, caller is responsible for ensuring + * that "*pp" is large enough to accept all of the serialized data. + * Returns < 0 on error, >= 0 indicating bytes written (or would have been) + * on success. + */ +__owur int i2o_SCT_LIST(const STACK_OF(SCT) *a, unsigned char **pp); + +/* + * Convert TLS format SCT list to a stack of SCTs. + * If "a" or "*a" is NULL, a new stack will be created that the caller is + * responsible for freeing (by calling SCT_LIST_free). + * "**pp" and "*pp" must not be NULL. + * Upon success, "*pp" will point to after the last bytes read, and a stack + * will be returned. + * Upon failure, a NULL pointer will be returned, and the position of "*pp" is + * not defined. + */ +STACK_OF(SCT) *o2i_SCT_LIST(STACK_OF(SCT) **a, const unsigned char **pp, + size_t len); + +/* + * Serialize (to DER format) a stack of SCTs and return the length. + * "a" must not be NULL. + * If "pp" is NULL, just returns the length of what would have been serialized. + * If "pp" is not NULL and "*pp" is null, function will allocate a new pointer + * for data that caller is responsible for freeing (only if function returns + * successfully). + * If "pp" is NULL and "*pp" is not NULL, caller is responsible for ensuring + * that "*pp" is large enough to accept all of the serialized data. + * Returns < 0 on error, >= 0 indicating bytes written (or would have been) + * on success. + */ +__owur int i2d_SCT_LIST(const STACK_OF(SCT) *a, unsigned char **pp); + +/* + * Parses an SCT list in DER format and returns it. + * If "a" or "*a" is NULL, a new stack will be created that the caller is + * responsible for freeing (by calling SCT_LIST_free). + * "**pp" and "*pp" must not be NULL. + * Upon success, "*pp" will point to after the last bytes read, and a stack + * will be returned. + * Upon failure, a NULL pointer will be returned, and the position of "*pp" is + * not defined. + */ +STACK_OF(SCT) *d2i_SCT_LIST(STACK_OF(SCT) **a, const unsigned char **pp, + long len); + +/* + * Serialize (to TLS format) an |sct| and write it to |out|. + * If |out| is null, no SCT will be output but the length will still be returned. + * If |out| points to a null pointer, a string will be allocated to hold the + * TLS-format SCT. It is the responsibility of the caller to free it. + * If |out| points to an allocated string, the TLS-format SCT will be written + * to it. + * The length of the SCT in TLS format will be returned. + */ +__owur int i2o_SCT(const SCT *sct, unsigned char **out); + +/* + * Parses an SCT in TLS format and returns it. + * If |psct| is not null, it will end up pointing to the parsed SCT. If it + * already points to a non-null pointer, the pointer will be free'd. + * |in| should be a pointer to a string containing the TLS-format SCT. + * |in| will be advanced to the end of the SCT if parsing succeeds. + * |len| should be the length of the SCT in |in|. + * Returns NULL if an error occurs. + * If the SCT is an unsupported version, only the SCT's 'sct' and 'sct_len' + * fields will be populated (with |in| and |len| respectively). + */ +SCT *o2i_SCT(SCT **psct, const unsigned char **in, size_t len); + +/******************** + * CT log functions * + ********************/ + +/* + * Creates a new CT log instance with the given |public_key| and |name|. + * Takes ownership of |public_key| but copies |name|. + * Returns NULL if malloc fails or if |public_key| cannot be converted to DER. + * Should be deleted by the caller using CTLOG_free when no longer needed. + */ +CTLOG *CTLOG_new(EVP_PKEY *public_key, const char *name); + +/* + * Creates a new CTLOG instance with the base64-encoded SubjectPublicKeyInfo DER + * in |pkey_base64|. The |name| is a string to help users identify this log. + * Returns 1 on success, 0 on failure. + * Should be deleted by the caller using CTLOG_free when no longer needed. + */ +int CTLOG_new_from_base64(CTLOG ** ct_log, + const char *pkey_base64, const char *name); + +/* + * Deletes a CT log instance and its fields. + */ +void CTLOG_free(CTLOG *log); + +/* Gets the name of the CT log */ +const char *CTLOG_get0_name(const CTLOG *log); +/* Gets the ID of the CT log */ +void CTLOG_get0_log_id(const CTLOG *log, const uint8_t **log_id, + size_t *log_id_len); +/* Gets the public key of the CT log */ +EVP_PKEY *CTLOG_get0_public_key(const CTLOG *log); + +/************************** + * CT log store functions * + **************************/ + +/* + * Creates a new CT log store. + * Should be deleted by the caller using CTLOG_STORE_free when no longer needed. + */ +CTLOG_STORE *CTLOG_STORE_new(void); + +/* + * Deletes a CT log store and all of the CT log instances held within. + */ +void CTLOG_STORE_free(CTLOG_STORE *store); + +/* + * Finds a CT log in the store based on its log ID. + * Returns the CT log, or NULL if no match is found. + */ +const CTLOG *CTLOG_STORE_get0_log_by_id(const CTLOG_STORE *store, + const uint8_t *log_id, + size_t log_id_len); + +/* + * Loads a CT log list into a |store| from a |file|. + * Returns 1 if loading is successful, or 0 otherwise. + */ +__owur int CTLOG_STORE_load_file(CTLOG_STORE *store, const char *file); + +/* + * Loads the default CT log list into a |store|. + * Returns 1 if loading is successful, or 0 otherwise. + */ +__owur int CTLOG_STORE_load_default_file(CTLOG_STORE *store); + +# ifdef __cplusplus +} +# endif +# endif +#endif diff --git a/openssl-wasm/include/openssl/cterr.h b/openssl-wasm/include/openssl/cterr.h new file mode 100644 index 0000000..feb7bc5 --- /dev/null +++ b/openssl-wasm/include/openssl/cterr.h @@ -0,0 +1,80 @@ +/* + * Generated by util/mkerr.pl DO NOT EDIT + * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_CTERR_H +# define HEADER_CTERR_H + +# ifndef HEADER_SYMHACKS_H +# include +# endif + +# include + +# ifndef OPENSSL_NO_CT + +# ifdef __cplusplus +extern "C" +# endif +int ERR_load_CT_strings(void); + +/* + * CT function codes. + */ +# define CT_F_CTLOG_NEW 117 +# define CT_F_CTLOG_NEW_FROM_BASE64 118 +# define CT_F_CTLOG_NEW_FROM_CONF 119 +# define CT_F_CTLOG_STORE_LOAD_CTX_NEW 122 +# define CT_F_CTLOG_STORE_LOAD_FILE 123 +# define CT_F_CTLOG_STORE_LOAD_LOG 130 +# define CT_F_CTLOG_STORE_NEW 131 +# define CT_F_CT_BASE64_DECODE 124 +# define CT_F_CT_POLICY_EVAL_CTX_NEW 133 +# define CT_F_CT_V1_LOG_ID_FROM_PKEY 125 +# define CT_F_I2O_SCT 107 +# define CT_F_I2O_SCT_LIST 108 +# define CT_F_I2O_SCT_SIGNATURE 109 +# define CT_F_O2I_SCT 110 +# define CT_F_O2I_SCT_LIST 111 +# define CT_F_O2I_SCT_SIGNATURE 112 +# define CT_F_SCT_CTX_NEW 126 +# define CT_F_SCT_CTX_VERIFY 128 +# define CT_F_SCT_NEW 100 +# define CT_F_SCT_NEW_FROM_BASE64 127 +# define CT_F_SCT_SET0_LOG_ID 101 +# define CT_F_SCT_SET1_EXTENSIONS 114 +# define CT_F_SCT_SET1_LOG_ID 115 +# define CT_F_SCT_SET1_SIGNATURE 116 +# define CT_F_SCT_SET_LOG_ENTRY_TYPE 102 +# define CT_F_SCT_SET_SIGNATURE_NID 103 +# define CT_F_SCT_SET_VERSION 104 + +/* + * CT reason codes. + */ +# define CT_R_BASE64_DECODE_ERROR 108 +# define CT_R_INVALID_LOG_ID_LENGTH 100 +# define CT_R_LOG_CONF_INVALID 109 +# define CT_R_LOG_CONF_INVALID_KEY 110 +# define CT_R_LOG_CONF_MISSING_DESCRIPTION 111 +# define CT_R_LOG_CONF_MISSING_KEY 112 +# define CT_R_LOG_KEY_INVALID 113 +# define CT_R_SCT_FUTURE_TIMESTAMP 116 +# define CT_R_SCT_INVALID 104 +# define CT_R_SCT_INVALID_SIGNATURE 107 +# define CT_R_SCT_LIST_INVALID 105 +# define CT_R_SCT_LOG_ID_MISMATCH 114 +# define CT_R_SCT_NOT_SET 106 +# define CT_R_SCT_UNSUPPORTED_VERSION 115 +# define CT_R_UNRECOGNIZED_SIGNATURE_NID 101 +# define CT_R_UNSUPPORTED_ENTRY_TYPE 102 +# define CT_R_UNSUPPORTED_VERSION 103 + +# endif +#endif diff --git a/openssl-wasm/include/openssl/des.h b/openssl-wasm/include/openssl/des.h new file mode 100644 index 0000000..be4abbd --- /dev/null +++ b/openssl-wasm/include/openssl/des.h @@ -0,0 +1,174 @@ +/* + * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_DES_H +# define HEADER_DES_H + +# include + +# ifndef OPENSSL_NO_DES +# ifdef __cplusplus +extern "C" { +# endif +# include + +typedef unsigned int DES_LONG; + +# ifdef OPENSSL_BUILD_SHLIBCRYPTO +# undef OPENSSL_EXTERN +# define OPENSSL_EXTERN OPENSSL_EXPORT +# 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; + +# 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) + +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_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); +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); +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); + +# define DES_fixup_key_parity DES_set_odd_parity + +# ifdef __cplusplus +} +# endif +# endif + +#endif diff --git a/openssl-wasm/include/openssl/dh.h b/openssl-wasm/include/openssl/dh.h new file mode 100644 index 0000000..3527540 --- /dev/null +++ b/openssl-wasm/include/openssl/dh.h @@ -0,0 +1,340 @@ +/* + * Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_DH_H +# define HEADER_DH_H + +# include + +# ifndef OPENSSL_NO_DH +# include +# include +# include +# include +# if OPENSSL_API_COMPAT < 0x10100000L +# include +# endif +# include + +# ifdef __cplusplus +extern "C" { +# endif + +# ifndef OPENSSL_DH_MAX_MODULUS_BITS +# define OPENSSL_DH_MAX_MODULUS_BITS 10000 +# endif + +# define OPENSSL_DH_FIPS_MIN_MODULUS_BITS 1024 + +# define DH_FLAG_CACHE_MONT_P 0x01 + +# if OPENSSL_API_COMPAT < 0x10100000L +/* + * Does nothing. Previously this switched off constant time behaviour. + */ +# define DH_FLAG_NO_EXP_CONSTTIME 0x00 +# endif + +/* + * 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 responsibility 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 + +/* Already defined in ossl_typ.h */ +/* typedef struct dh_st DH; */ +/* typedef struct dh_method DH_METHOD; */ + +DECLARE_ASN1_ITEM(DHparams) + +# define DH_GENERATOR_2 2 +/* #define DH_GENERATOR_3 3 */ +# define DH_GENERATOR_5 5 + +/* DH_check error codes */ +# define DH_CHECK_P_NOT_PRIME 0x01 +# define DH_CHECK_P_NOT_SAFE_PRIME 0x02 +# define DH_UNABLE_TO_CHECK_GENERATOR 0x04 +# define DH_NOT_SUITABLE_GENERATOR 0x08 +# define DH_CHECK_Q_NOT_PRIME 0x10 +# define DH_CHECK_INVALID_Q_VALUE 0x20 +# define DH_CHECK_INVALID_J_VALUE 0x40 + +/* DH_check_pub_key error codes */ +# define DH_CHECK_PUBKEY_TOO_SMALL 0x01 +# define DH_CHECK_PUBKEY_TOO_LARGE 0x02 +# define DH_CHECK_PUBKEY_INVALID 0x04 + +/* + * 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) + +# define d2i_DHxparams_fp(fp,x) \ + (DH *)ASN1_d2i_fp((char *(*)())DH_new, \ + (char *(*)())d2i_DHxparams, \ + (fp), \ + (unsigned char **)(x)) +# define i2d_DHxparams_fp(fp,x) \ + ASN1_i2d_fp(i2d_DHxparams,(fp), (unsigned char *)(x)) +# define d2i_DHxparams_bio(bp,x) \ + ASN1_d2i_bio_of(DH, DH_new, d2i_DHxparams, bp, x) +# define i2d_DHxparams_bio(bp,x) \ + ASN1_i2d_bio_of_const(DH, i2d_DHxparams, 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_bits(const DH *dh); +int DH_size(const DH *dh); +int DH_security_bits(const DH *dh); +#define DH_get_ex_new_index(l, p, newf, dupf, freef) \ + CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_DH, l, p, newf, dupf, freef) +int DH_set_ex_data(DH *d, int idx, void *arg); +void *DH_get_ex_data(DH *d, int idx); + +/* Deprecated version */ +DEPRECATEDIN_0_9_8(DH *DH_generate_parameters(int prime_len, int generator, + void (*callback) (int, int, + void *), + void *cb_arg)) + +/* New version */ +int DH_generate_parameters_ex(DH *dh, int prime_len, int generator, + BN_GENCB *cb); + +int DH_check_params_ex(const DH *dh); +int DH_check_ex(const DH *dh); +int DH_check_pub_key_ex(const DH *dh, const BIGNUM *pub_key); +int DH_check_params(const DH *dh, int *ret); +int DH_check(const DH *dh, int *codes); +int DH_check_pub_key(const DH *dh, const BIGNUM *pub_key, int *codes); +int DH_generate_key(DH *dh); +int DH_compute_key(unsigned char *key, const BIGNUM *pub_key, DH *dh); +int DH_compute_key_padded(unsigned char *key, const BIGNUM *pub_key, DH *dh); +DH *d2i_DHparams(DH **a, const unsigned char **pp, long length); +int i2d_DHparams(const DH *a, unsigned char **pp); +DH *d2i_DHxparams(DH **a, const unsigned char **pp, long length); +int i2d_DHxparams(const DH *a, unsigned char **pp); +# ifndef OPENSSL_NO_STDIO +int DHparams_print_fp(FILE *fp, const DH *x); +# endif +int DHparams_print(BIO *bp, const DH *x); + +/* RFC 5114 parameters */ +DH *DH_get_1024_160(void); +DH *DH_get_2048_224(void); +DH *DH_get_2048_256(void); + +/* Named parameters, currently RFC7919 */ +DH *DH_new_by_nid(int nid); +int DH_get_nid(const DH *dh); + +# ifndef OPENSSL_NO_CMS +/* RFC2631 KDF */ +int DH_KDF_X9_42(unsigned char *out, size_t outlen, + const unsigned char *Z, size_t Zlen, + ASN1_OBJECT *key_oid, + const unsigned char *ukm, size_t ukmlen, const EVP_MD *md); +# endif + +void DH_get0_pqg(const DH *dh, + const BIGNUM **p, const BIGNUM **q, const BIGNUM **g); +int DH_set0_pqg(DH *dh, BIGNUM *p, BIGNUM *q, BIGNUM *g); +void DH_get0_key(const DH *dh, + const BIGNUM **pub_key, const BIGNUM **priv_key); +int DH_set0_key(DH *dh, BIGNUM *pub_key, BIGNUM *priv_key); +const BIGNUM *DH_get0_p(const DH *dh); +const BIGNUM *DH_get0_q(const DH *dh); +const BIGNUM *DH_get0_g(const DH *dh); +const BIGNUM *DH_get0_priv_key(const DH *dh); +const BIGNUM *DH_get0_pub_key(const DH *dh); +void DH_clear_flags(DH *dh, int flags); +int DH_test_flags(const DH *dh, int flags); +void DH_set_flags(DH *dh, int flags); +ENGINE *DH_get0_engine(DH *d); +long DH_get_length(const DH *dh); +int DH_set_length(DH *dh, long length); + +DH_METHOD *DH_meth_new(const char *name, int flags); +void DH_meth_free(DH_METHOD *dhm); +DH_METHOD *DH_meth_dup(const DH_METHOD *dhm); +const char *DH_meth_get0_name(const DH_METHOD *dhm); +int DH_meth_set1_name(DH_METHOD *dhm, const char *name); +int DH_meth_get_flags(const DH_METHOD *dhm); +int DH_meth_set_flags(DH_METHOD *dhm, int flags); +void *DH_meth_get0_app_data(const DH_METHOD *dhm); +int DH_meth_set0_app_data(DH_METHOD *dhm, void *app_data); +int (*DH_meth_get_generate_key(const DH_METHOD *dhm)) (DH *); +int DH_meth_set_generate_key(DH_METHOD *dhm, int (*generate_key) (DH *)); +int (*DH_meth_get_compute_key(const DH_METHOD *dhm)) + (unsigned char *key, const BIGNUM *pub_key, DH *dh); +int DH_meth_set_compute_key(DH_METHOD *dhm, + int (*compute_key) (unsigned char *key, const BIGNUM *pub_key, DH *dh)); +int (*DH_meth_get_bn_mod_exp(const DH_METHOD *dhm)) + (const DH *, BIGNUM *, const BIGNUM *, const BIGNUM *, const BIGNUM *, + BN_CTX *, BN_MONT_CTX *); +int DH_meth_set_bn_mod_exp(DH_METHOD *dhm, + int (*bn_mod_exp) (const DH *, BIGNUM *, const BIGNUM *, const BIGNUM *, + const BIGNUM *, BN_CTX *, BN_MONT_CTX *)); +int (*DH_meth_get_init(const DH_METHOD *dhm))(DH *); +int DH_meth_set_init(DH_METHOD *dhm, int (*init)(DH *)); +int (*DH_meth_get_finish(const DH_METHOD *dhm)) (DH *); +int DH_meth_set_finish(DH_METHOD *dhm, int (*finish) (DH *)); +int (*DH_meth_get_generate_params(const DH_METHOD *dhm)) + (DH *, int, int, BN_GENCB *); +int DH_meth_set_generate_params(DH_METHOD *dhm, + int (*generate_params) (DH *, int, int, BN_GENCB *)); + + +# define EVP_PKEY_CTX_set_dh_paramgen_prime_len(ctx, len) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DH, EVP_PKEY_OP_PARAMGEN, \ + EVP_PKEY_CTRL_DH_PARAMGEN_PRIME_LEN, len, NULL) + +# define EVP_PKEY_CTX_set_dh_paramgen_subprime_len(ctx, len) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DH, EVP_PKEY_OP_PARAMGEN, \ + EVP_PKEY_CTRL_DH_PARAMGEN_SUBPRIME_LEN, len, NULL) + +# define EVP_PKEY_CTX_set_dh_paramgen_type(ctx, typ) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DH, EVP_PKEY_OP_PARAMGEN, \ + EVP_PKEY_CTRL_DH_PARAMGEN_TYPE, typ, NULL) + +# define EVP_PKEY_CTX_set_dh_paramgen_generator(ctx, gen) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DH, EVP_PKEY_OP_PARAMGEN, \ + EVP_PKEY_CTRL_DH_PARAMGEN_GENERATOR, gen, NULL) + +# define EVP_PKEY_CTX_set_dh_rfc5114(ctx, gen) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, EVP_PKEY_OP_PARAMGEN, \ + EVP_PKEY_CTRL_DH_RFC5114, gen, NULL) + +# define EVP_PKEY_CTX_set_dhx_rfc5114(ctx, gen) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, EVP_PKEY_OP_PARAMGEN, \ + EVP_PKEY_CTRL_DH_RFC5114, gen, NULL) + +# define EVP_PKEY_CTX_set_dh_nid(ctx, nid) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DH, \ + EVP_PKEY_OP_PARAMGEN | EVP_PKEY_OP_KEYGEN, \ + EVP_PKEY_CTRL_DH_NID, nid, NULL) + +# define EVP_PKEY_CTX_set_dh_pad(ctx, pad) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DH, EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_DH_PAD, pad, NULL) + +# define EVP_PKEY_CTX_set_dh_kdf_type(ctx, kdf) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_DH_KDF_TYPE, kdf, NULL) + +# define EVP_PKEY_CTX_get_dh_kdf_type(ctx) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_DH_KDF_TYPE, -2, NULL) + +# define EVP_PKEY_CTX_set0_dh_kdf_oid(ctx, oid) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_DH_KDF_OID, 0, (void *)(oid)) + +# define EVP_PKEY_CTX_get0_dh_kdf_oid(ctx, poid) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_GET_DH_KDF_OID, 0, (void *)(poid)) + +# define EVP_PKEY_CTX_set_dh_kdf_md(ctx, md) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_DH_KDF_MD, 0, (void *)(md)) + +# define EVP_PKEY_CTX_get_dh_kdf_md(ctx, pmd) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_GET_DH_KDF_MD, 0, (void *)(pmd)) + +# define EVP_PKEY_CTX_set_dh_kdf_outlen(ctx, len) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_DH_KDF_OUTLEN, len, NULL) + +# define EVP_PKEY_CTX_get_dh_kdf_outlen(ctx, plen) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_GET_DH_KDF_OUTLEN, 0, (void *)(plen)) + +# define EVP_PKEY_CTX_set0_dh_kdf_ukm(ctx, p, plen) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_DH_KDF_UKM, plen, (void *)(p)) + +# define EVP_PKEY_CTX_get0_dh_kdf_ukm(ctx, p) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_GET_DH_KDF_UKM, 0, (void *)(p)) + +# define EVP_PKEY_CTRL_DH_PARAMGEN_PRIME_LEN (EVP_PKEY_ALG_CTRL + 1) +# define EVP_PKEY_CTRL_DH_PARAMGEN_GENERATOR (EVP_PKEY_ALG_CTRL + 2) +# define EVP_PKEY_CTRL_DH_RFC5114 (EVP_PKEY_ALG_CTRL + 3) +# define EVP_PKEY_CTRL_DH_PARAMGEN_SUBPRIME_LEN (EVP_PKEY_ALG_CTRL + 4) +# define EVP_PKEY_CTRL_DH_PARAMGEN_TYPE (EVP_PKEY_ALG_CTRL + 5) +# define EVP_PKEY_CTRL_DH_KDF_TYPE (EVP_PKEY_ALG_CTRL + 6) +# define EVP_PKEY_CTRL_DH_KDF_MD (EVP_PKEY_ALG_CTRL + 7) +# define EVP_PKEY_CTRL_GET_DH_KDF_MD (EVP_PKEY_ALG_CTRL + 8) +# define EVP_PKEY_CTRL_DH_KDF_OUTLEN (EVP_PKEY_ALG_CTRL + 9) +# define EVP_PKEY_CTRL_GET_DH_KDF_OUTLEN (EVP_PKEY_ALG_CTRL + 10) +# define EVP_PKEY_CTRL_DH_KDF_UKM (EVP_PKEY_ALG_CTRL + 11) +# define EVP_PKEY_CTRL_GET_DH_KDF_UKM (EVP_PKEY_ALG_CTRL + 12) +# define EVP_PKEY_CTRL_DH_KDF_OID (EVP_PKEY_ALG_CTRL + 13) +# define EVP_PKEY_CTRL_GET_DH_KDF_OID (EVP_PKEY_ALG_CTRL + 14) +# define EVP_PKEY_CTRL_DH_NID (EVP_PKEY_ALG_CTRL + 15) +# define EVP_PKEY_CTRL_DH_PAD (EVP_PKEY_ALG_CTRL + 16) + +/* KDF types */ +# define EVP_PKEY_DH_KDF_NONE 1 +# ifndef OPENSSL_NO_CMS +# define EVP_PKEY_DH_KDF_X9_42 2 +# endif + + +# ifdef __cplusplus +} +# endif +# endif +#endif diff --git a/openssl-wasm/include/openssl/dherr.h b/openssl-wasm/include/openssl/dherr.h new file mode 100644 index 0000000..916b3be --- /dev/null +++ b/openssl-wasm/include/openssl/dherr.h @@ -0,0 +1,88 @@ +/* + * Generated by util/mkerr.pl DO NOT EDIT + * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_DHERR_H +# define HEADER_DHERR_H + +# ifndef HEADER_SYMHACKS_H +# include +# endif + +# include + +# ifndef OPENSSL_NO_DH + +# ifdef __cplusplus +extern "C" +# endif +int ERR_load_DH_strings(void); + +/* + * DH 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_CHECK_EX 121 +# define DH_F_DH_CHECK_PARAMS_EX 122 +# define DH_F_DH_CHECK_PUB_KEY_EX 123 +# define DH_F_DH_CMS_DECRYPT 114 +# define DH_F_DH_CMS_SET_PEERKEY 115 +# define DH_F_DH_CMS_SET_SHARED_INFO 116 +# define DH_F_DH_METH_DUP 117 +# define DH_F_DH_METH_NEW 118 +# define DH_F_DH_METH_SET1_NAME 119 +# define DH_F_DH_NEW_BY_NID 104 +# define DH_F_DH_NEW_METHOD 105 +# define DH_F_DH_PARAM_DECODE 107 +# define DH_F_DH_PKEY_PUBLIC_CHECK 124 +# 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_PKEY_DH_CTRL_STR 120 +# define DH_F_PKEY_DH_DERIVE 112 +# define DH_F_PKEY_DH_INIT 125 +# define DH_F_PKEY_DH_KEYGEN 113 + +/* + * DH reason codes. + */ +# define DH_R_BAD_GENERATOR 101 +# define DH_R_BN_DECODE_ERROR 109 +# define DH_R_BN_ERROR 106 +# define DH_R_CHECK_INVALID_J_VALUE 115 +# define DH_R_CHECK_INVALID_Q_VALUE 116 +# define DH_R_CHECK_PUBKEY_INVALID 122 +# define DH_R_CHECK_PUBKEY_TOO_LARGE 123 +# define DH_R_CHECK_PUBKEY_TOO_SMALL 124 +# define DH_R_CHECK_P_NOT_PRIME 117 +# define DH_R_CHECK_P_NOT_SAFE_PRIME 118 +# define DH_R_CHECK_Q_NOT_PRIME 119 +# define DH_R_DECODE_ERROR 104 +# define DH_R_INVALID_PARAMETER_NAME 110 +# define DH_R_INVALID_PARAMETER_NID 114 +# define DH_R_INVALID_PUBKEY 102 +# define DH_R_KDF_PARAMETER_ERROR 112 +# define DH_R_KEYS_NOT_SET 108 +# define DH_R_MISSING_PUBKEY 125 +# define DH_R_MODULUS_TOO_LARGE 103 +# define DH_R_NOT_SUITABLE_GENERATOR 120 +# define DH_R_NO_PARAMETERS_SET 107 +# define DH_R_NO_PRIVATE_VALUE 100 +# define DH_R_PARAMETER_ENCODING_ERROR 105 +# define DH_R_PEER_KEY_ERROR 111 +# define DH_R_SHARED_INFO_ERROR 113 +# define DH_R_UNABLE_TO_CHECK_GENERATOR 121 + +# endif +#endif diff --git a/openssl-wasm/include/openssl/dsa.h b/openssl-wasm/include/openssl/dsa.h new file mode 100644 index 0000000..6d8a18a --- /dev/null +++ b/openssl-wasm/include/openssl/dsa.h @@ -0,0 +1,244 @@ +/* + * Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_DSA_H +# define HEADER_DSA_H + +# include + +# ifndef OPENSSL_NO_DSA +# ifdef __cplusplus +extern "C" { +# endif +# include +# include +# include +# include +# include +# if OPENSSL_API_COMPAT < 0x10100000L +# include +# endif +# include + +# ifndef OPENSSL_DSA_MAX_MODULUS_BITS +# define OPENSSL_DSA_MAX_MODULUS_BITS 10000 +# endif + +# define OPENSSL_DSA_FIPS_MIN_MODULUS_BITS 1024 + +# define DSA_FLAG_CACHE_MONT_P 0x01 +# if OPENSSL_API_COMPAT < 0x10100000L +/* + * Does nothing. Previously this switched off constant time behaviour. + */ +# define DSA_FLAG_NO_EXP_CONSTTIME 0x00 +# endif + +/* + * 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 responsibility 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 +# define DSA_FLAG_FIPS_CHECKED 0x0800 + +/* Already defined in ossl_typ.h */ +/* typedef struct dsa_st DSA; */ +/* typedef struct dsa_method DSA_METHOD; */ + +typedef struct DSA_SIG_st DSA_SIG; + +# 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); +void DSA_SIG_get0(const DSA_SIG *sig, const BIGNUM **pr, const BIGNUM **ps); +int DSA_SIG_set0(DSA_SIG *sig, BIGNUM *r, BIGNUM *s); + +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 *); +const DSA_METHOD *DSA_get_method(DSA *d); + +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 *); +int DSA_bits(const DSA *d); +int DSA_security_bits(const DSA *d); + /* next 4 return -1 on error */ +DEPRECATEDIN_1_2_0(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); +#define DSA_get_ex_new_index(l, p, newf, dupf, freef) \ + CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_DSA, l, p, newf, dupf, freef) +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 */ +DEPRECATEDIN_0_9_8(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)) + +/* 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); + +int DSAparams_print(BIO *bp, const DSA *x); +int DSA_print(BIO *bp, const DSA *x, int off); +# ifndef OPENSSL_NO_STDIO +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 64 +/* + * Primality test according to FIPS PUB 186-4, Appendix C.3. Since we only + * have one value here we set the number of checks to 64 which is the 128 bit + * security level that is the highest level and valid for creating a 3072 bit + * DSA key. + */ +# 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_CTX_set_dsa_paramgen_q_bits(ctx, qbits) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DSA, EVP_PKEY_OP_PARAMGEN, \ + EVP_PKEY_CTRL_DSA_PARAMGEN_Q_BITS, qbits, NULL) +# define EVP_PKEY_CTX_set_dsa_paramgen_md(ctx, md) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DSA, EVP_PKEY_OP_PARAMGEN, \ + EVP_PKEY_CTRL_DSA_PARAMGEN_MD, 0, (void *)(md)) + +# 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) + +void DSA_get0_pqg(const DSA *d, + const BIGNUM **p, const BIGNUM **q, const BIGNUM **g); +int DSA_set0_pqg(DSA *d, BIGNUM *p, BIGNUM *q, BIGNUM *g); +void DSA_get0_key(const DSA *d, + const BIGNUM **pub_key, const BIGNUM **priv_key); +int DSA_set0_key(DSA *d, BIGNUM *pub_key, BIGNUM *priv_key); +const BIGNUM *DSA_get0_p(const DSA *d); +const BIGNUM *DSA_get0_q(const DSA *d); +const BIGNUM *DSA_get0_g(const DSA *d); +const BIGNUM *DSA_get0_pub_key(const DSA *d); +const BIGNUM *DSA_get0_priv_key(const DSA *d); +void DSA_clear_flags(DSA *d, int flags); +int DSA_test_flags(const DSA *d, int flags); +void DSA_set_flags(DSA *d, int flags); +ENGINE *DSA_get0_engine(DSA *d); + +DSA_METHOD *DSA_meth_new(const char *name, int flags); +void DSA_meth_free(DSA_METHOD *dsam); +DSA_METHOD *DSA_meth_dup(const DSA_METHOD *dsam); +const char *DSA_meth_get0_name(const DSA_METHOD *dsam); +int DSA_meth_set1_name(DSA_METHOD *dsam, const char *name); +int DSA_meth_get_flags(const DSA_METHOD *dsam); +int DSA_meth_set_flags(DSA_METHOD *dsam, int flags); +void *DSA_meth_get0_app_data(const DSA_METHOD *dsam); +int DSA_meth_set0_app_data(DSA_METHOD *dsam, void *app_data); +DSA_SIG *(*DSA_meth_get_sign(const DSA_METHOD *dsam)) + (const unsigned char *, int, DSA *); +int DSA_meth_set_sign(DSA_METHOD *dsam, + DSA_SIG *(*sign) (const unsigned char *, int, DSA *)); +int (*DSA_meth_get_sign_setup(const DSA_METHOD *dsam)) + (DSA *, BN_CTX *, BIGNUM **, BIGNUM **); +int DSA_meth_set_sign_setup(DSA_METHOD *dsam, + int (*sign_setup) (DSA *, BN_CTX *, BIGNUM **, BIGNUM **)); +int (*DSA_meth_get_verify(const DSA_METHOD *dsam)) + (const unsigned char *, int, DSA_SIG *, DSA *); +int DSA_meth_set_verify(DSA_METHOD *dsam, + int (*verify) (const unsigned char *, int, DSA_SIG *, DSA *)); +int (*DSA_meth_get_mod_exp(const DSA_METHOD *dsam)) + (DSA *, BIGNUM *, const BIGNUM *, const BIGNUM *, const BIGNUM *, + const BIGNUM *, const BIGNUM *, BN_CTX *, BN_MONT_CTX *); +int DSA_meth_set_mod_exp(DSA_METHOD *dsam, + int (*mod_exp) (DSA *, BIGNUM *, const BIGNUM *, const BIGNUM *, + const BIGNUM *, const BIGNUM *, const BIGNUM *, BN_CTX *, + BN_MONT_CTX *)); +int (*DSA_meth_get_bn_mod_exp(const DSA_METHOD *dsam)) + (DSA *, BIGNUM *, const BIGNUM *, const BIGNUM *, const BIGNUM *, + BN_CTX *, BN_MONT_CTX *); +int DSA_meth_set_bn_mod_exp(DSA_METHOD *dsam, + int (*bn_mod_exp) (DSA *, BIGNUM *, const BIGNUM *, const BIGNUM *, + const BIGNUM *, BN_CTX *, BN_MONT_CTX *)); +int (*DSA_meth_get_init(const DSA_METHOD *dsam))(DSA *); +int DSA_meth_set_init(DSA_METHOD *dsam, int (*init)(DSA *)); +int (*DSA_meth_get_finish(const DSA_METHOD *dsam)) (DSA *); +int DSA_meth_set_finish(DSA_METHOD *dsam, int (*finish) (DSA *)); +int (*DSA_meth_get_paramgen(const DSA_METHOD *dsam)) + (DSA *, int, const unsigned char *, int, int *, unsigned long *, + BN_GENCB *); +int DSA_meth_set_paramgen(DSA_METHOD *dsam, + int (*paramgen) (DSA *, int, const unsigned char *, int, int *, + unsigned long *, BN_GENCB *)); +int (*DSA_meth_get_keygen(const DSA_METHOD *dsam)) (DSA *); +int DSA_meth_set_keygen(DSA_METHOD *dsam, int (*keygen) (DSA *)); + + +# ifdef __cplusplus +} +# endif +# endif +#endif diff --git a/openssl-wasm/include/openssl/dsaerr.h b/openssl-wasm/include/openssl/dsaerr.h new file mode 100644 index 0000000..495a1ac --- /dev/null +++ b/openssl-wasm/include/openssl/dsaerr.h @@ -0,0 +1,72 @@ +/* + * Generated by util/mkerr.pl DO NOT EDIT + * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_DSAERR_H +# define HEADER_DSAERR_H + +# ifndef HEADER_SYMHACKS_H +# include +# endif + +# include + +# ifndef OPENSSL_NO_DSA + +# ifdef __cplusplus +extern "C" +# endif +int ERR_load_DSA_strings(void); + +/* + * DSA function codes. + */ +# define DSA_F_DSAPARAMS_PRINT 100 +# define DSA_F_DSAPARAMS_PRINT_FP 101 +# define DSA_F_DSA_BUILTIN_PARAMGEN 125 +# define DSA_F_DSA_BUILTIN_PARAMGEN2 126 +# define DSA_F_DSA_DO_SIGN 112 +# define DSA_F_DSA_DO_VERIFY 113 +# define DSA_F_DSA_METH_DUP 127 +# define DSA_F_DSA_METH_NEW 128 +# define DSA_F_DSA_METH_SET1_NAME 129 +# 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 102 +# define DSA_F_OLD_DSA_PRIV_DECODE 122 +# define DSA_F_PKEY_DSA_CTRL 120 +# define DSA_F_PKEY_DSA_CTRL_STR 104 +# define DSA_F_PKEY_DSA_KEYGEN 121 + +/* + * DSA 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_DECODE_ERROR 104 +# define DSA_R_INVALID_DIGEST_TYPE 106 +# define DSA_R_INVALID_PARAMETERS 112 +# define DSA_R_MISSING_PARAMETERS 101 +# define DSA_R_MISSING_PRIVATE_KEY 111 +# define DSA_R_MODULUS_TOO_LARGE 103 +# define DSA_R_NO_PARAMETERS_SET 107 +# define DSA_R_PARAMETER_ENCODING_ERROR 105 +# define DSA_R_Q_NOT_PRIME 113 +# define DSA_R_SEED_LEN_SMALL 110 + +# endif +#endif diff --git a/openssl-wasm/include/openssl/dtls1.h b/openssl-wasm/include/openssl/dtls1.h new file mode 100644 index 0000000..d55ca9c --- /dev/null +++ b/openssl-wasm/include/openssl/dtls1.h @@ -0,0 +1,55 @@ +/* + * Copyright 2005-2018 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_DTLS1_H +# define HEADER_DTLS1_H + +#ifdef __cplusplus +extern "C" { +#endif + +# define DTLS1_VERSION 0xFEFF +# define DTLS1_2_VERSION 0xFEFD +# define DTLS_MIN_VERSION DTLS1_VERSION +# define DTLS_MAX_VERSION DTLS1_2_VERSION +# define DTLS1_VERSION_MAJOR 0xFE + +# define DTLS1_BAD_VER 0x0100 + +/* Special value for method supporting multiple versions */ +# define DTLS_ANY_VERSION 0x1FFFF + +/* lengths of messages */ +/* + * Actually the max cookie length in DTLS is 255. But we can't change this now + * due to compatibility concerns. + */ +# 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 + +# define DTLS1_AL_HEADER_LENGTH 2 + +/* Timeout multipliers */ +# 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/openssl-wasm/include/openssl/e_os2.h b/openssl-wasm/include/openssl/e_os2.h new file mode 100644 index 0000000..cf308ee --- /dev/null +++ b/openssl-wasm/include/openssl/e_os2.h @@ -0,0 +1,300 @@ +/* + * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_E_OS2_H +# define HEADER_E_OS2_H + +# include + +#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 + +/* --------------------- Microsoft operating systems ---------------------- */ + +/* + * Note that MSDOS actually denotes 32-bit environments running on top of + * MS-DOS, such as DJGPP one. + */ +# if defined(OPENSSL_SYS_MSDOS) +# undef OPENSSL_SYS_UNIX +# 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... + */ +/* + * UEFI lives here because it might be built with a Microsoft toolchain and + * we need to avoid the false positive match on Windows. + */ +# if defined(OPENSSL_SYS_UEFI) +# undef OPENSSL_SYS_UNIX +# elif defined(OPENSSL_SYS_UWIN) +# undef OPENSSL_SYS_UNIX +# define OPENSSL_SYS_WIN32_UWIN +# else +# if defined(__CYGWIN__) || defined(OPENSSL_SYS_CYGWIN) +# define OPENSSL_SYS_WIN32_CYGWIN +# else +# if defined(_WIN32) || defined(OPENSSL_SYS_WIN32) +# undef OPENSSL_SYS_UNIX +# if !defined(OPENSSL_SYS_WIN32) +# define OPENSSL_SYS_WIN32 +# endif +# endif +# if defined(_WIN64) || defined(OPENSSL_SYS_WIN64) +# undef OPENSSL_SYS_UNIX +# if !defined(OPENSSL_SYS_WIN64) +# define OPENSSL_SYS_WIN64 +# endif +# endif +# if defined(OPENSSL_SYS_WINNT) +# undef OPENSSL_SYS_UNIX +# endif +# if defined(OPENSSL_SYS_WINCE) +# undef OPENSSL_SYS_UNIX +# endif +# endif +# endif + +/* Anything that tries to look like Microsoft is "Windows" */ +# if defined(OPENSSL_SYS_WIN32) || defined(OPENSSL_SYS_WIN64) || 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_SYS_VMS) +# if !defined(OPENSSL_SYS_VMS) +# undef OPENSSL_SYS_UNIX +# endif +# 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 + +/* -------------------------------- Unix ---------------------------------- */ +# ifdef OPENSSL_SYS_UNIX +# if defined(linux) || defined(__linux__) && !defined(OPENSSL_SYS_LINUX) +# define OPENSSL_SYS_LINUX +# endif +# if defined(_AIX) && !defined(OPENSSL_SYS_AIX) +# define OPENSSL_SYS_AIX +# endif +# endif + +/* -------------------------------- VOS ----------------------------------- */ +# if defined(__VOS__) && !defined(OPENSSL_SYS_VOS) +# define OPENSSL_SYS_VOS +# ifdef __HPPA__ +# define OPENSSL_SYS_VOS_HPPA +# endif +# ifdef __IA32__ +# define OPENSSL_SYS_VOS_IA32 +# 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 + +/*- + * OPENSSL_EXTERN is normally used to declare a symbol with possible extra + * attributes to handle its presence in a shared library. + * OPENSSL_EXPORT is used to define a symbol with extra possible attributes + * to make it visible in a shared library. + * Care needs to be taken when a header file is used both to declare and + * define symbols. 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 and OPENSSL_EXTERN + * have some generally sensible values. + */ + +# if defined(OPENSSL_SYS_WINDOWS) && defined(OPENSSL_OPT_WINDLL) +# define OPENSSL_EXPORT extern __declspec(dllexport) +# define OPENSSL_EXTERN extern __declspec(dllimport) +# else +# define OPENSSL_EXPORT extern +# define OPENSSL_EXTERN extern +# endif + +/*- + * 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) type _shadow_##name=value; +# define OPENSSL_DECLARE_GLOBAL(type,name) OPENSSL_EXPORT type _shadow_##name +# define OPENSSL_GLOBAL_REF(name) _shadow_##name +# endif + +# ifdef _WIN32 +# ifdef _WIN64 +# define ossl_ssize_t __int64 +# define OSSL_SSIZE_MAX _I64_MAX +# else +# define ossl_ssize_t int +# define OSSL_SSIZE_MAX INT_MAX +# endif +# endif + +# if defined(OPENSSL_SYS_UEFI) && !defined(ossl_ssize_t) +# define ossl_ssize_t INTN +# define OSSL_SSIZE_MAX MAX_INTN +# endif + +# ifndef ossl_ssize_t +# define ossl_ssize_t ssize_t +# if defined(SSIZE_MAX) +# define OSSL_SSIZE_MAX SSIZE_MAX +# elif defined(_POSIX_SSIZE_MAX) +# define OSSL_SSIZE_MAX _POSIX_SSIZE_MAX +# else +# define OSSL_SSIZE_MAX ((ssize_t)(SIZE_MAX>>1)) +# endif +# endif + +# ifdef DEBUG_UNUSED +# define __owur __attribute__((__warn_unused_result__)) +# else +# define __owur +# endif + +/* Standard integer types */ +# if defined(OPENSSL_SYS_UEFI) +typedef INT8 int8_t; +typedef UINT8 uint8_t; +typedef INT16 int16_t; +typedef UINT16 uint16_t; +typedef INT32 int32_t; +typedef UINT32 uint32_t; +typedef INT64 int64_t; +typedef UINT64 uint64_t; +# elif (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || \ + defined(__osf__) || defined(__sgi) || defined(__hpux) || \ + defined(OPENSSL_SYS_VMS) || defined (__OpenBSD__) +# include +# elif defined(_MSC_VER) && _MSC_VER<1600 +/* + * minimally required typdefs for systems not supporting inttypes.h or + * stdint.h: currently just older VC++ + */ +typedef signed char int8_t; +typedef unsigned char uint8_t; +typedef short int16_t; +typedef unsigned short uint16_t; +typedef int int32_t; +typedef unsigned int uint32_t; +typedef __int64 int64_t; +typedef unsigned __int64 uint64_t; +# else +# include +# endif + +/* ossl_inline: portable inline definition usable in public headers */ +# if !defined(inline) && !defined(__cplusplus) +# if defined(__STDC_VERSION__) && __STDC_VERSION__>=199901L + /* just use inline */ +# define ossl_inline inline +# elif defined(__GNUC__) && __GNUC__>=2 +# define ossl_inline __inline__ +# elif defined(_MSC_VER) + /* + * Visual Studio: inline is available in C++ only, however + * __inline is available for C, see + * http://msdn.microsoft.com/en-us/library/z8y1yy88.aspx + */ +# define ossl_inline __inline +# else +# define ossl_inline +# endif +# else +# define ossl_inline inline +# endif + +# if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L +# define ossl_noreturn _Noreturn +# elif defined(__GNUC__) && __GNUC__ >= 2 +# define ossl_noreturn __attribute__((noreturn)) +# else +# define ossl_noreturn +# endif + +/* ossl_unused: portable unused attribute for use in public headers */ +# if defined(__GNUC__) +# define ossl_unused __attribute__((unused)) +# else +# define ossl_unused +# endif + +#ifdef __cplusplus +} +#endif +#endif diff --git a/openssl-wasm/include/openssl/ebcdic.h b/openssl-wasm/include/openssl/ebcdic.h new file mode 100644 index 0000000..aa01285 --- /dev/null +++ b/openssl-wasm/include/openssl/ebcdic.h @@ -0,0 +1,33 @@ +/* + * Copyright 1999-2016 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_EBCDIC_H +# define HEADER_EBCDIC_H + +# include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Avoid name clashes with other applications */ +# define os_toascii _openssl_os_toascii +# define os_toebcdic _openssl_os_toebcdic +# define ebcdic2ascii _openssl_ebcdic2ascii +# define ascii2ebcdic _openssl_ascii2ebcdic + +extern const unsigned char os_toascii[256]; +extern const unsigned char os_toebcdic[256]; +void *ebcdic2ascii(void *dest, const void *srce, size_t count); +void *ascii2ebcdic(void *dest, const void *srce, size_t count); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/openssl-wasm/include/openssl/ec.h b/openssl-wasm/include/openssl/ec.h new file mode 100644 index 0000000..44cc139 --- /dev/null +++ b/openssl-wasm/include/openssl/ec.h @@ -0,0 +1,1481 @@ +/* + * Copyright 2002-2020 The OpenSSL Project Authors. All Rights Reserved. + * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_EC_H +# define HEADER_EC_H + +# include + +# ifndef OPENSSL_NO_EC +# include +# include +# if OPENSSL_API_COMPAT < 0x10100000L +# include +# endif +# include +# ifdef __cplusplus +extern "C" { +# 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 0x04 */ + 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_GROUP; +typedef struct ec_point_st EC_POINT; +typedef struct ecpk_parameters_st ECPKPARAMETERS; +typedef struct ec_parameters_st ECPARAMETERS; + +/********************************************************************/ +/* 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 its 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 occurred + */ +int EC_GROUP_set_generator(EC_GROUP *group, const EC_POINT *generator, + const BIGNUM *order, const BIGNUM *cofactor); + +/** Returns the generator of a EC_GROUP object. + * \param group EC_GROUP object + * \return the currently used generator (possibly NULL). + */ +const EC_POINT *EC_GROUP_get0_generator(const EC_GROUP *group); + +/** Returns the montgomery data for order(Generator) + * \param group EC_GROUP object + * \return the currently used montgomery data (possibly NULL). +*/ +BN_MONT_CTX *EC_GROUP_get_mont_data(const EC_GROUP *group); + +/** Gets the order of a EC_GROUP + * \param group EC_GROUP object + * \param order BIGNUM to which the order is copied + * \param ctx unused + * \return 1 on success and 0 if an error occurred + */ +int EC_GROUP_get_order(const EC_GROUP *group, BIGNUM *order, BN_CTX *ctx); + +/** Gets the order of an EC_GROUP + * \param group EC_GROUP object + * \return the group order + */ +const BIGNUM *EC_GROUP_get0_order(const EC_GROUP *group); + +/** Gets the number of bits of the order of an EC_GROUP + * \param group EC_GROUP object + * \return number of bits of group order. + */ +int EC_GROUP_order_bits(const EC_GROUP *group); + +/** Gets the cofactor of a EC_GROUP + * \param group EC_GROUP object + * \param cofactor BIGNUM to which the cofactor is copied + * \param ctx unused + * \return 1 on success and 0 if an error occurred + */ +int EC_GROUP_get_cofactor(const EC_GROUP *group, BIGNUM *cofactor, + BN_CTX *ctx); + +/** Gets the cofactor of an EC_GROUP + * \param group EC_GROUP object + * \return the group cofactor + */ +const BIGNUM *EC_GROUP_get0_cofactor(const EC_GROUP *group); + +/** 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 parameters of a ec curve defined by y^2 = x^3 + a*x + b (for GFp) + * or y^2 + x*y = x^3 + a*x^2 + b (for GF2m) + * \param group EC_GROUP object + * \param p BIGNUM with the prime number (GFp) or the polynomial + * defining the underlying field (GF2m) + * \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 occurred + */ +int EC_GROUP_set_curve(EC_GROUP *group, const BIGNUM *p, const BIGNUM *a, + const BIGNUM *b, BN_CTX *ctx); + +/** Gets the parameters of the ec curve defined by y^2 = x^3 + a*x + b (for GFp) + * or y^2 + x*y = x^3 + a*x^2 + b (for GF2m) + * \param group EC_GROUP object + * \param p BIGNUM with the prime number (GFp) or the polynomial + * defining the underlying field (GF2m) + * \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 occurred + */ +int EC_GROUP_get_curve(const EC_GROUP *group, BIGNUM *p, BIGNUM *a, BIGNUM *b, + BN_CTX *ctx); + +/** Sets the parameters of an ec curve. Synonym for EC_GROUP_set_curve + * \param group EC_GROUP object + * \param p BIGNUM with the prime number (GFp) or the polynomial + * defining the underlying field (GF2m) + * \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 occurred + */ +DEPRECATEDIN_1_2_0(int EC_GROUP_set_curve_GFp(EC_GROUP *group, const BIGNUM *p, + const BIGNUM *a, const BIGNUM *b, + BN_CTX *ctx)) + +/** Gets the parameters of an ec curve. Synonym for EC_GROUP_get_curve + * \param group EC_GROUP object + * \param p BIGNUM with the prime number (GFp) or the polynomial + * defining the underlying field (GF2m) + * \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 occurred + */ +DEPRECATEDIN_1_2_0(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 an ec curve. Synonym for EC_GROUP_set_curve + * \param group EC_GROUP object + * \param p BIGNUM with the prime number (GFp) or the polynomial + * defining the underlying field (GF2m) + * \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 occurred + */ +DEPRECATEDIN_1_2_0(int EC_GROUP_set_curve_GF2m(EC_GROUP *group, const BIGNUM *p, + const BIGNUM *a, const BIGNUM *b, + BN_CTX *ctx)) + +/** Gets the parameters of an ec curve. Synonym for EC_GROUP_get_curve + * \param group EC_GROUP object + * \param p BIGNUM with the prime number (GFp) or the polynomial + * defining the underlying field (GF2m) + * \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 occurred + */ +DEPRECATEDIN_1_2_0(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 the groups are equal, 1 if not, or -1 on error + */ +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); + +/** Creates a new EC_GROUP object from an ECPARAMETERS object + * \param params pointer to the ECPARAMETERS object + * \return newly created EC_GROUP object with specified curve or NULL + * if an error occurred + */ +EC_GROUP *EC_GROUP_new_from_ecparameters(const ECPARAMETERS *params); + +/** Creates an ECPARAMETERS object for the given EC_GROUP object. + * \param group pointer to the EC_GROUP object + * \param params pointer to an existing ECPARAMETERS object or NULL + * \return pointer to the new ECPARAMETERS object or NULL + * if an error occurred. + */ +ECPARAMETERS *EC_GROUP_get_ecparameters(const EC_GROUP *group, + ECPARAMETERS *params); + +/** Creates a new EC_GROUP object from an ECPKPARAMETERS object + * \param params pointer to an existing ECPKPARAMETERS object, or NULL + * \return newly created EC_GROUP object with specified curve, or NULL + * if an error occurred + */ +EC_GROUP *EC_GROUP_new_from_ecpkparameters(const ECPKPARAMETERS *params); + +/** Creates an ECPKPARAMETERS object for the given EC_GROUP object. + * \param group pointer to the EC_GROUP object + * \param params pointer to an existing ECPKPARAMETERS object or NULL + * \return pointer to the new ECPKPARAMETERS object or NULL + * if an error occurred. + */ +ECPKPARAMETERS *EC_GROUP_get_ecpkparameters(const EC_GROUP *group, + ECPKPARAMETERS *params); + +/********************************************************************/ +/* 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 is not zero, + * nitems EC_builtin_curve structures are filled with the data of the first + * nitems internal groups + */ +size_t EC_get_builtin_curves(EC_builtin_curve *r, size_t nitems); + +const char *EC_curve_nid2nist(int nid); +int EC_curve_nist2nid(const char *name); + +/********************************************************************/ +/* EC_POINT functions */ +/********************************************************************/ + +/** Creates a new EC_POINT object for the specified EC_GROUP + * \param group EC_GROUP the underlying EC_GROUP object + * \return newly created EC_POINT object or NULL if an error occurred + */ +EC_POINT *EC_POINT_new(const EC_GROUP *group); + +/** Frees a EC_POINT object + * \param point EC_POINT object to be freed + */ +void EC_POINT_free(EC_POINT *point); + +/** Clears and frees a EC_POINT object + * \param point EC_POINT object to be cleared and freed + */ +void EC_POINT_clear_free(EC_POINT *point); + +/** Copies EC_POINT object + * \param dst destination EC_POINT object + * \param src source EC_POINT object + * \return 1 on success and 0 if an error occurred + */ +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 occurred + */ +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 occurred + */ +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 occurred + */ +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 an EC_POINT + * \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 occurred + */ +int EC_POINT_set_affine_coordinates(const EC_GROUP *group, EC_POINT *p, + const BIGNUM *x, const BIGNUM *y, + BN_CTX *ctx); + +/** Gets the affine coordinates of an EC_POINT. + * \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 occurred + */ +int EC_POINT_get_affine_coordinates(const EC_GROUP *group, const EC_POINT *p, + BIGNUM *x, BIGNUM *y, BN_CTX *ctx); + +/** Sets the affine coordinates of an EC_POINT. A synonym of + * EC_POINT_set_affine_coordinates + * \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 occurred + */ +DEPRECATEDIN_1_2_0(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 an EC_POINT. A synonym of + * EC_POINT_get_affine_coordinates + * \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 occurred + */ +DEPRECATEDIN_1_2_0(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 + * \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 occurred + */ +int EC_POINT_set_compressed_coordinates(const EC_GROUP *group, EC_POINT *p, + const BIGNUM *x, int y_bit, + BN_CTX *ctx); + +/** Sets the x9.62 compressed coordinates of a EC_POINT. A synonym of + * EC_POINT_set_compressed_coordinates + * \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 occurred + */ +DEPRECATEDIN_1_2_0(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 an EC_POINT. A synonym of + * EC_POINT_set_affine_coordinates + * \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 occurred + */ +DEPRECATEDIN_1_2_0(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 an EC_POINT. A synonym of + * EC_POINT_get_affine_coordinates + * \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 occurred + */ +DEPRECATEDIN_1_2_0(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. A synonym of + * EC_POINT_set_compressed_coordinates + * \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 occurred + */ +DEPRECATEDIN_1_2_0(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 occurred + */ +int EC_POINT_oct2point(const EC_GROUP *group, EC_POINT *p, + const unsigned char *buf, size_t len, BN_CTX *ctx); + +/** Encodes an EC_POINT object to an allocated octet string + * \param group underlying EC_GROUP object + * \param point EC_POINT object + * \param form point conversion form + * \param pbuf returns pointer to allocated 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_point2buf(const EC_GROUP *group, const EC_POINT *point, + point_conversion_form_t form, + unsigned char **pbuf, 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 occurred + */ +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 occurred + */ +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 occurred + */ +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 the point is on the curve, 0 if not, or -1 on error + */ +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 1 if the points are not equal, 0 if they are, or -1 on error + */ +int EC_POINT_cmp(const EC_GROUP *group, const EC_POINT *a, const EC_POINT *b, + BN_CTX *ctx); + +int EC_POINT_make_affine(const EC_GROUP *group, EC_POINT *point, BN_CTX *ctx); +int EC_POINTs_make_affine(const EC_GROUP *group, size_t num, + EC_POINT *points[], BN_CTX *ctx); + +/** Computes r = generator * n + sum_{i=0}^{num-1} p[i] * m[i] + * \param group underlying EC_GROUP object + * \param r EC_POINT object for the result + * \param n BIGNUM with the multiplier for the group generator (optional) + * \param num number further 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 occurred + */ +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 occurred + */ +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 occurred + */ +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 */ +/********************************************************************/ + +DECLARE_ASN1_ITEM(ECPKPARAMETERS) +DECLARE_ASN1_ALLOC_FUNCTIONS(ECPKPARAMETERS) +DECLARE_ASN1_ITEM(ECPARAMETERS) +DECLARE_ASN1_ALLOC_FUNCTIONS(ECPARAMETERS) + +/* + * 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_EXPLICIT_CURVE 0x000 +# define OPENSSL_EC_NAMED_CURVE 0x001 + +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)) + +int ECPKParameters_print(BIO *bp, const EC_GROUP *x, int off); +# ifndef OPENSSL_NO_STDIO +int ECPKParameters_print_fp(FILE *fp, const EC_GROUP *x, int off); +# endif + +/********************************************************************/ +/* EC_KEY functions */ +/********************************************************************/ + +/* 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 +# define EC_FLAG_COFACTOR_ECDH 0x1000 + +/** 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); + +int EC_KEY_decoded_from_explicit_params(const EC_KEY *key); + +/** 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 ENGINE object of a EC_KEY object + * \param eckey EC_KEY object + * \return the ENGINE object (possibly NULL). + */ +ENGINE *EC_KEY_get0_engine(const EC_KEY *eckey); + +/** 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); + +#define EC_KEY_get_ex_new_index(l, p, newf, dupf, freef) \ + CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_EC_KEY, l, p, newf, dupf, freef) +int EC_KEY_set_ex_data(EC_KEY *key, int idx, void *arg); +void *EC_KEY_get_ex_data(const EC_KEY *key, int idx); + +/* 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); + +/** Indicates if an EC_KEY can be used for signing. + * \param eckey the EC_KEY object + * \return 1 if can can sign and 0 otherwise. + */ +int EC_KEY_can_sign(const EC_KEY *eckey); + +/** Sets a public key from affine coordinates performing + * necessary 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); + +/** Encodes an EC_KEY public key to an allocated octet string + * \param key key to encode + * \param form point conversion form + * \param pbuf returns pointer to allocated buffer + * \param ctx BN_CTX object (optional) + * \return the length of the encoded octet string or 0 if an error occurred + */ +size_t EC_KEY_key2buf(const EC_KEY *key, point_conversion_form_t form, + unsigned char **pbuf, BN_CTX *ctx); + +/** Decodes a EC_KEY public key from a octet string + * \param key key to decode + * \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 occurred + */ + +int EC_KEY_oct2key(EC_KEY *key, const unsigned char *buf, size_t len, + BN_CTX *ctx); + +/** Decodes an EC_KEY private key from an octet string + * \param key key to decode + * \param buf memory buffer with the encoded private key + * \param len length of the encoded key + * \return 1 on success and 0 if an error occurred + */ + +int EC_KEY_oct2priv(EC_KEY *key, const unsigned char *buf, size_t len); + +/** Encodes a EC_KEY private key to an octet string + * \param key key to encode + * \param buf memory buffer for the result. If NULL the function returns + * required buffer size. + * \param len length of the memory buffer + * \return the length of the encoded octet string or 0 if an error occurred + */ + +size_t EC_KEY_priv2oct(const EC_KEY *key, unsigned char *buf, size_t len); + +/** Encodes an EC_KEY private key to an allocated octet string + * \param eckey key to encode + * \param pbuf returns pointer to allocated buffer + * \return the length of the encoded octet string or 0 if an error occurred + */ +size_t EC_KEY_priv2buf(const EC_KEY *eckey, unsigned char **pbuf); + +/********************************************************************/ +/* 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 parameters 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(const EC_KEY *key, unsigned char **out); + +/** 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); + +# ifndef OPENSSL_NO_STDIO +/** 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 + +const EC_KEY_METHOD *EC_KEY_OpenSSL(void); +const EC_KEY_METHOD *EC_KEY_get_default_method(void); +void EC_KEY_set_default_method(const EC_KEY_METHOD *meth); +const EC_KEY_METHOD *EC_KEY_get_method(const EC_KEY *key); +int EC_KEY_set_method(EC_KEY *key, const EC_KEY_METHOD *meth); +EC_KEY *EC_KEY_new_method(ENGINE *engine); + +/** The old name for ecdh_KDF_X9_63 + * The ECDH KDF specification has been mistakingly attributed to ANSI X9.62, + * it is actually specified in ANSI X9.63. + * This identifier is retained for backwards compatibility + */ +int ECDH_KDF_X9_62(unsigned char *out, size_t outlen, + const unsigned char *Z, size_t Zlen, + const unsigned char *sinfo, size_t sinfolen, + const EVP_MD *md); + +int ECDH_compute_key(void *out, size_t outlen, const EC_POINT *pub_key, + const EC_KEY *ecdh, + void *(*KDF) (const void *in, size_t inlen, + void *out, size_t *outlen)); + +typedef struct ECDSA_SIG_st 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 a negative value + * on error + */ +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); + +/** Accessor for r and s fields of ECDSA_SIG + * \param sig pointer to ECDSA_SIG structure + * \param pr pointer to BIGNUM pointer for r (may be NULL) + * \param ps pointer to BIGNUM pointer for s (may be NULL) + */ +void ECDSA_SIG_get0(const ECDSA_SIG *sig, const BIGNUM **pr, const BIGNUM **ps); + +/** Accessor for r field of ECDSA_SIG + * \param sig pointer to ECDSA_SIG structure + */ +const BIGNUM *ECDSA_SIG_get0_r(const ECDSA_SIG *sig); + +/** Accessor for s field of ECDSA_SIG + * \param sig pointer to ECDSA_SIG structure + */ +const BIGNUM *ECDSA_SIG_get0_s(const ECDSA_SIG *sig); + +/** Setter for r and s fields of ECDSA_SIG + * \param sig pointer to ECDSA_SIG structure + * \param r pointer to BIGNUM for r (may be NULL) + * \param s pointer to BIGNUM for s (may be NULL) + */ +int ECDSA_SIG_set0(ECDSA_SIG *sig, BIGNUM *r, BIGNUM *s); + +/** 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 (optional), + * 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); + +/** 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 (optional), + * 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); + +/** 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); + +/********************************************************************/ +/* EC_KEY_METHOD constructors, destructors, writers and accessors */ +/********************************************************************/ + +EC_KEY_METHOD *EC_KEY_METHOD_new(const EC_KEY_METHOD *meth); +void EC_KEY_METHOD_free(EC_KEY_METHOD *meth); +void EC_KEY_METHOD_set_init(EC_KEY_METHOD *meth, + int (*init)(EC_KEY *key), + void (*finish)(EC_KEY *key), + int (*copy)(EC_KEY *dest, const EC_KEY *src), + int (*set_group)(EC_KEY *key, const EC_GROUP *grp), + int (*set_private)(EC_KEY *key, + const BIGNUM *priv_key), + int (*set_public)(EC_KEY *key, + const EC_POINT *pub_key)); + +void EC_KEY_METHOD_set_keygen(EC_KEY_METHOD *meth, + int (*keygen)(EC_KEY *key)); + +void EC_KEY_METHOD_set_compute_key(EC_KEY_METHOD *meth, + int (*ckey)(unsigned char **psec, + size_t *pseclen, + const EC_POINT *pub_key, + const EC_KEY *ecdh)); + +void EC_KEY_METHOD_set_sign(EC_KEY_METHOD *meth, + int (*sign)(int type, const unsigned char *dgst, + int dlen, unsigned char *sig, + unsigned int *siglen, + const BIGNUM *kinv, const BIGNUM *r, + EC_KEY *eckey), + int (*sign_setup)(EC_KEY *eckey, BN_CTX *ctx_in, + BIGNUM **kinvp, BIGNUM **rp), + ECDSA_SIG *(*sign_sig)(const unsigned char *dgst, + int dgst_len, + const BIGNUM *in_kinv, + const BIGNUM *in_r, + EC_KEY *eckey)); + +void EC_KEY_METHOD_set_verify(EC_KEY_METHOD *meth, + int (*verify)(int type, const unsigned + char *dgst, int dgst_len, + const unsigned char *sigbuf, + int sig_len, EC_KEY *eckey), + int (*verify_sig)(const unsigned char *dgst, + int dgst_len, + const ECDSA_SIG *sig, + EC_KEY *eckey)); + +void EC_KEY_METHOD_get_init(const EC_KEY_METHOD *meth, + int (**pinit)(EC_KEY *key), + void (**pfinish)(EC_KEY *key), + int (**pcopy)(EC_KEY *dest, const EC_KEY *src), + int (**pset_group)(EC_KEY *key, + const EC_GROUP *grp), + int (**pset_private)(EC_KEY *key, + const BIGNUM *priv_key), + int (**pset_public)(EC_KEY *key, + const EC_POINT *pub_key)); + +void EC_KEY_METHOD_get_keygen(const EC_KEY_METHOD *meth, + int (**pkeygen)(EC_KEY *key)); + +void EC_KEY_METHOD_get_compute_key(const EC_KEY_METHOD *meth, + int (**pck)(unsigned char **psec, + size_t *pseclen, + const EC_POINT *pub_key, + const EC_KEY *ecdh)); + +void EC_KEY_METHOD_get_sign(const EC_KEY_METHOD *meth, + int (**psign)(int type, const unsigned char *dgst, + int dlen, unsigned char *sig, + unsigned int *siglen, + const BIGNUM *kinv, const BIGNUM *r, + EC_KEY *eckey), + int (**psign_setup)(EC_KEY *eckey, BN_CTX *ctx_in, + BIGNUM **kinvp, BIGNUM **rp), + ECDSA_SIG *(**psign_sig)(const unsigned char *dgst, + int dgst_len, + const BIGNUM *in_kinv, + const BIGNUM *in_r, + EC_KEY *eckey)); + +void EC_KEY_METHOD_get_verify(const EC_KEY_METHOD *meth, + int (**pverify)(int type, const unsigned + char *dgst, int dgst_len, + const unsigned char *sigbuf, + int sig_len, EC_KEY *eckey), + int (**pverify_sig)(const unsigned char *dgst, + int dgst_len, + const ECDSA_SIG *sig, + EC_KEY *eckey)); + +# define ECParameters_dup(x) ASN1_dup_of(EC_KEY,i2d_ECParameters,d2i_ECParameters,x) + +# ifndef __cplusplus +# if defined(__SUNPRO_C) +# if __SUNPRO_C >= 0x520 +# pragma error_messages (default,E_ARRAY_OF_INCOMPLETE_NONAME,E_ARRAY_OF_INCOMPLETE) +# endif +# endif +# endif + +# define EVP_PKEY_CTX_set_ec_paramgen_curve_nid(ctx, nid) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ + EVP_PKEY_OP_PARAMGEN|EVP_PKEY_OP_KEYGEN, \ + EVP_PKEY_CTRL_EC_PARAMGEN_CURVE_NID, nid, NULL) + +# define EVP_PKEY_CTX_set_ec_param_enc(ctx, flag) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ + EVP_PKEY_OP_PARAMGEN|EVP_PKEY_OP_KEYGEN, \ + EVP_PKEY_CTRL_EC_PARAM_ENC, flag, NULL) + +# define EVP_PKEY_CTX_set_ecdh_cofactor_mode(ctx, flag) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_EC_ECDH_COFACTOR, flag, NULL) + +# define EVP_PKEY_CTX_get_ecdh_cofactor_mode(ctx) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_EC_ECDH_COFACTOR, -2, NULL) + +# define EVP_PKEY_CTX_set_ecdh_kdf_type(ctx, kdf) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_EC_KDF_TYPE, kdf, NULL) + +# define EVP_PKEY_CTX_get_ecdh_kdf_type(ctx) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_EC_KDF_TYPE, -2, NULL) + +# define EVP_PKEY_CTX_set_ecdh_kdf_md(ctx, md) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_EC_KDF_MD, 0, (void *)(md)) + +# define EVP_PKEY_CTX_get_ecdh_kdf_md(ctx, pmd) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_GET_EC_KDF_MD, 0, (void *)(pmd)) + +# define EVP_PKEY_CTX_set_ecdh_kdf_outlen(ctx, len) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_EC_KDF_OUTLEN, len, NULL) + +# define EVP_PKEY_CTX_get_ecdh_kdf_outlen(ctx, plen) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_GET_EC_KDF_OUTLEN, 0, \ + (void *)(plen)) + +# define EVP_PKEY_CTX_set0_ecdh_kdf_ukm(ctx, p, plen) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_EC_KDF_UKM, plen, (void *)(p)) + +# define EVP_PKEY_CTX_get0_ecdh_kdf_ukm(ctx, p) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ + EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_GET_EC_KDF_UKM, 0, (void *)(p)) + +/* SM2 will skip the operation check so no need to pass operation here */ +# define EVP_PKEY_CTX_set1_id(ctx, id, id_len) \ + EVP_PKEY_CTX_ctrl(ctx, -1, -1, \ + EVP_PKEY_CTRL_SET1_ID, (int)id_len, (void*)(id)) + +# define EVP_PKEY_CTX_get1_id(ctx, id) \ + EVP_PKEY_CTX_ctrl(ctx, -1, -1, \ + EVP_PKEY_CTRL_GET1_ID, 0, (void*)(id)) + +# define EVP_PKEY_CTX_get1_id_len(ctx, id_len) \ + EVP_PKEY_CTX_ctrl(ctx, -1, -1, \ + EVP_PKEY_CTRL_GET1_ID_LEN, 0, (void*)(id_len)) + +# define EVP_PKEY_CTRL_EC_PARAMGEN_CURVE_NID (EVP_PKEY_ALG_CTRL + 1) +# define EVP_PKEY_CTRL_EC_PARAM_ENC (EVP_PKEY_ALG_CTRL + 2) +# define EVP_PKEY_CTRL_EC_ECDH_COFACTOR (EVP_PKEY_ALG_CTRL + 3) +# define EVP_PKEY_CTRL_EC_KDF_TYPE (EVP_PKEY_ALG_CTRL + 4) +# define EVP_PKEY_CTRL_EC_KDF_MD (EVP_PKEY_ALG_CTRL + 5) +# define EVP_PKEY_CTRL_GET_EC_KDF_MD (EVP_PKEY_ALG_CTRL + 6) +# define EVP_PKEY_CTRL_EC_KDF_OUTLEN (EVP_PKEY_ALG_CTRL + 7) +# define EVP_PKEY_CTRL_GET_EC_KDF_OUTLEN (EVP_PKEY_ALG_CTRL + 8) +# define EVP_PKEY_CTRL_EC_KDF_UKM (EVP_PKEY_ALG_CTRL + 9) +# define EVP_PKEY_CTRL_GET_EC_KDF_UKM (EVP_PKEY_ALG_CTRL + 10) +# define EVP_PKEY_CTRL_SET1_ID (EVP_PKEY_ALG_CTRL + 11) +# define EVP_PKEY_CTRL_GET1_ID (EVP_PKEY_ALG_CTRL + 12) +# define EVP_PKEY_CTRL_GET1_ID_LEN (EVP_PKEY_ALG_CTRL + 13) +/* KDF types */ +# define EVP_PKEY_ECDH_KDF_NONE 1 +# define EVP_PKEY_ECDH_KDF_X9_63 2 +/** The old name for EVP_PKEY_ECDH_KDF_X9_63 + * The ECDH KDF specification has been mistakingly attributed to ANSI X9.62, + * it is actually specified in ANSI X9.63. + * This identifier is retained for backwards compatibility + */ +# define EVP_PKEY_ECDH_KDF_X9_62 EVP_PKEY_ECDH_KDF_X9_63 + + +# ifdef __cplusplus +} +# endif +# endif +#endif diff --git a/openssl-wasm/include/openssl/ecdh.h b/openssl-wasm/include/openssl/ecdh.h new file mode 100644 index 0000000..681f3d5 --- /dev/null +++ b/openssl-wasm/include/openssl/ecdh.h @@ -0,0 +1,10 @@ +/* + * Copyright 2002-2016 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include diff --git a/openssl-wasm/include/openssl/ecdsa.h b/openssl-wasm/include/openssl/ecdsa.h new file mode 100644 index 0000000..681f3d5 --- /dev/null +++ b/openssl-wasm/include/openssl/ecdsa.h @@ -0,0 +1,10 @@ +/* + * Copyright 2002-2016 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include diff --git a/openssl-wasm/include/openssl/ecerr.h b/openssl-wasm/include/openssl/ecerr.h new file mode 100644 index 0000000..5173811 --- /dev/null +++ b/openssl-wasm/include/openssl/ecerr.h @@ -0,0 +1,276 @@ +/* + * Generated by util/mkerr.pl DO NOT EDIT + * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_ECERR_H +# define HEADER_ECERR_H + +# ifndef HEADER_SYMHACKS_H +# include +# endif + +# include + +# ifndef OPENSSL_NO_EC + +# ifdef __cplusplus +extern "C" +# endif +int ERR_load_EC_strings(void); + +/* + * EC function codes. + */ +# define EC_F_BN_TO_FELEM 224 +# define EC_F_D2I_ECPARAMETERS 144 +# define EC_F_D2I_ECPKPARAMETERS 145 +# define EC_F_D2I_ECPRIVATEKEY 146 +# define EC_F_DO_EC_KEY_PRINT 221 +# define EC_F_ECDH_CMS_DECRYPT 238 +# define EC_F_ECDH_CMS_SET_SHARED_INFO 239 +# define EC_F_ECDH_COMPUTE_KEY 246 +# define EC_F_ECDH_SIMPLE_COMPUTE_KEY 257 +# define EC_F_ECDSA_DO_SIGN_EX 251 +# define EC_F_ECDSA_DO_VERIFY 252 +# define EC_F_ECDSA_SIGN_EX 254 +# define EC_F_ECDSA_SIGN_SETUP 248 +# define EC_F_ECDSA_SIG_NEW 265 +# define EC_F_ECDSA_VERIFY 253 +# define EC_F_ECD_ITEM_VERIFY 270 +# 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_NISTZ256_GET_AFFINE 240 +# define EC_F_ECP_NISTZ256_INV_MOD_ORD 275 +# define EC_F_ECP_NISTZ256_MULT_PRECOMPUTE 243 +# define EC_F_ECP_NISTZ256_POINTS_MUL 241 +# define EC_F_ECP_NISTZ256_PRE_COMP_NEW 244 +# define EC_F_ECP_NISTZ256_WINDOWED_MUL 242 +# define EC_F_ECX_KEY_OP 266 +# define EC_F_ECX_PRIV_ENCODE 267 +# define EC_F_ECX_PUB_ENCODE 268 +# define EC_F_EC_ASN1_GROUP2CURVE 153 +# define EC_F_EC_ASN1_GROUP2FIELDID 154 +# define EC_F_EC_GF2M_MONTGOMERY_POINT_MULTIPLY 208 +# define EC_F_EC_GF2M_SIMPLE_FIELD_INV 296 +# 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_LADDER_POST 285 +# define EC_F_EC_GF2M_SIMPLE_LADDER_PRE 288 +# define EC_F_EC_GF2M_SIMPLE_OCT2POINT 160 +# define EC_F_EC_GF2M_SIMPLE_POINT2OCT 161 +# define EC_F_EC_GF2M_SIMPLE_POINTS_MUL 289 +# 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_INV 297 +# 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_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_BLIND_COORDINATES 287 +# define EC_F_EC_GFP_SIMPLE_FIELD_INV 298 +# 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_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_SET_AFFINE_COORDINATES 168 +# define EC_F_EC_GFP_SIMPLE_SET_COMPRESSED_COORDINATES 169 +# 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_GET_CURVE 291 +# 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_ECPARAMETERS 261 +# define EC_F_EC_GROUP_GET_ECPKPARAMETERS 262 +# 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_NEW_FROM_ECPARAMETERS 263 +# define EC_F_EC_GROUP_NEW_FROM_ECPKPARAMETERS 264 +# define EC_F_EC_GROUP_SET_CURVE 292 +# define EC_F_EC_GROUP_SET_CURVE_GF2M 176 +# define EC_F_EC_GROUP_SET_CURVE_GFP 109 +# define EC_F_EC_GROUP_SET_GENERATOR 111 +# define EC_F_EC_GROUP_SET_SEED 286 +# 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_NEW_METHOD 245 +# define EC_F_EC_KEY_OCT2PRIV 255 +# define EC_F_EC_KEY_PRINT 180 +# define EC_F_EC_KEY_PRINT_FP 181 +# define EC_F_EC_KEY_PRIV2BUF 279 +# define EC_F_EC_KEY_PRIV2OCT 256 +# define EC_F_EC_KEY_SET_PUBLIC_KEY_AFFINE_COORDINATES 229 +# define EC_F_EC_KEY_SIMPLE_CHECK_KEY 258 +# define EC_F_EC_KEY_SIMPLE_OCT2PRIV 259 +# define EC_F_EC_KEY_SIMPLE_PRIV2OCT 260 +# define EC_F_EC_PKEY_CHECK 273 +# define EC_F_EC_PKEY_PARAM_CHECK 274 +# define EC_F_EC_POINTS_MAKE_AFFINE 136 +# define EC_F_EC_POINTS_MUL 290 +# define EC_F_EC_POINT_ADD 112 +# define EC_F_EC_POINT_BN2POINT 280 +# 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 293 +# 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_NEW 121 +# define EC_F_EC_POINT_OCT2POINT 122 +# define EC_F_EC_POINT_POINT2BUF 281 +# define EC_F_EC_POINT_POINT2OCT 123 +# define EC_F_EC_POINT_SET_AFFINE_COORDINATES 294 +# 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 295 +# 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_NEW 196 +# define EC_F_EC_SCALAR_MUL_LADDER 284 +# 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_OSSL_ECDH_COMPUTE_KEY 247 +# define EC_F_OSSL_ECDSA_SIGN_SIG 249 +# define EC_F_OSSL_ECDSA_VERIFY_SIG 250 +# define EC_F_PKEY_ECD_CTRL 271 +# define EC_F_PKEY_ECD_DIGESTSIGN 272 +# define EC_F_PKEY_ECD_DIGESTSIGN25519 276 +# define EC_F_PKEY_ECD_DIGESTSIGN448 277 +# define EC_F_PKEY_ECX_DERIVE 269 +# 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_INIT 282 +# define EC_F_PKEY_EC_KDF_DERIVE 283 +# define EC_F_PKEY_EC_KEYGEN 199 +# define EC_F_PKEY_EC_PARAMGEN 219 +# define EC_F_PKEY_EC_SIGN 218 +# define EC_F_VALIDATE_ECX_DERIVE 278 + +/* + * EC reason codes. + */ +# define EC_R_ASN1_ERROR 115 +# define EC_R_BAD_SIGNATURE 156 +# define EC_R_BIGNUM_OUT_OF_RANGE 144 +# define EC_R_BUFFER_TOO_SMALL 100 +# define EC_R_CANNOT_INVERT 165 +# define EC_R_COORDINATES_OUT_OF_RANGE 146 +# define EC_R_CURVE_DOES_NOT_SUPPORT_ECDH 160 +# define EC_R_CURVE_DOES_NOT_SUPPORT_SIGNING 159 +# define EC_R_D2I_ECPKPARAMETERS_FAILURE 117 +# define EC_R_DECODE_ERROR 142 +# define EC_R_DISCRIMINANT_IS_ZERO 118 +# define EC_R_EC_GROUP_NEW_BY_NAME_FAILURE 119 +# define EC_R_FIELD_TOO_LARGE 143 +# define EC_R_GF2M_NOT_SUPPORTED 147 +# define EC_R_GROUP2PKPARAMETERS_FAILURE 120 +# define EC_R_I2D_ECPKPARAMETERS_FAILURE 121 +# define EC_R_INCOMPATIBLE_OBJECTS 101 +# define EC_R_INVALID_ARGUMENT 112 +# define EC_R_INVALID_COMPRESSED_POINT 110 +# define EC_R_INVALID_COMPRESSION_BIT 109 +# define EC_R_INVALID_CURVE 141 +# define EC_R_INVALID_DIGEST 151 +# define EC_R_INVALID_DIGEST_TYPE 138 +# define EC_R_INVALID_ENCODING 102 +# define EC_R_INVALID_FIELD 103 +# define EC_R_INVALID_FORM 104 +# define EC_R_INVALID_GROUP_ORDER 122 +# define EC_R_INVALID_KEY 116 +# define EC_R_INVALID_OUTPUT_LENGTH 161 +# define EC_R_INVALID_PEER_KEY 133 +# define EC_R_INVALID_PENTANOMIAL_BASIS 132 +# define EC_R_INVALID_PRIVATE_KEY 123 +# define EC_R_INVALID_TRINOMIAL_BASIS 137 +# define EC_R_KDF_PARAMETER_ERROR 148 +# define EC_R_KEYS_NOT_SET 140 +# define EC_R_LADDER_POST_FAILURE 136 +# define EC_R_LADDER_PRE_FAILURE 153 +# define EC_R_LADDER_STEP_FAILURE 162 +# define EC_R_MISSING_OID 167 +# define EC_R_MISSING_PARAMETERS 124 +# define EC_R_MISSING_PRIVATE_KEY 125 +# define EC_R_NEED_NEW_SETUP_VALUES 157 +# define EC_R_NOT_A_NIST_PRIME 135 +# define EC_R_NOT_IMPLEMENTED 126 +# define EC_R_NOT_INITIALIZED 111 +# define EC_R_NO_PARAMETERS_SET 139 +# define EC_R_NO_PRIVATE_VALUE 154 +# define EC_R_OPERATION_NOT_SUPPORTED 152 +# define EC_R_PASSED_NULL_PARAMETER 134 +# define EC_R_PEER_KEY_ERROR 149 +# define EC_R_PKPARAMETERS2GROUP_FAILURE 127 +# define EC_R_POINT_ARITHMETIC_FAILURE 155 +# define EC_R_POINT_AT_INFINITY 106 +# define EC_R_POINT_COORDINATES_BLIND_FAILURE 163 +# define EC_R_POINT_IS_NOT_ON_CURVE 107 +# define EC_R_RANDOM_NUMBER_GENERATION_FAILED 158 +# define EC_R_SHARED_INFO_ERROR 150 +# define EC_R_SLOT_FULL 108 +# define EC_R_UNDEFINED_GENERATOR 113 +# define EC_R_UNDEFINED_ORDER 128 +# define EC_R_UNKNOWN_COFACTOR 164 +# 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 + +# endif +#endif diff --git a/openssl-wasm/include/openssl/engine.h b/openssl-wasm/include/openssl/engine.h new file mode 100644 index 0000000..0780f0f --- /dev/null +++ b/openssl-wasm/include/openssl/engine.h @@ -0,0 +1,751 @@ +/* + * Copyright 2000-2018 The OpenSSL Project Authors. All Rights Reserved. + * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_ENGINE_H +# define HEADER_ENGINE_H + +# include + +# ifndef OPENSSL_NO_ENGINE +# if OPENSSL_API_COMPAT < 0x10100000L +# include +# include +# include +# include +# include +# include +# include +# include +# endif +# include +# 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_CIPHERS (unsigned int)0x0040 +# define ENGINE_METHOD_DIGESTS (unsigned int)0x0080 +# define ENGINE_METHOD_PKEY_METHS (unsigned int)0x0200 +# define ENGINE_METHOD_PKEY_ASN1_METHS (unsigned int)0x0400 +# define ENGINE_METHOD_EC (unsigned int)0x0800 +/* Obvious all-or-nothing cases. */ +# define ENGINE_METHOD_ALL (unsigned int)0xFFFF +# define ENGINE_METHOD_NONE (unsigned int)0x0000 + +/* + * This(ese) flag(s) controls behaviour of the ENGINE_TABLE mechanism used + * internally to control registration of ENGINE implementations, and can be + * set by ENGINE_set_table_flags(). The "NOINIT" flag prevents attempts to + * initialise registered ENGINEs if they are not already initialised. + */ +# define ENGINE_TABLE_FLAG_NOINIT (unsigned int)0x0001 + +/* ENGINE flags that can be set by ENGINE_set_flags(). */ +/* Not used */ +/* #define ENGINE_FLAGS_MALLOCED 0x0001 */ + +/* + * This flag is for ENGINEs that wish to handle the various 'CMD'-related + * control commands on their own. Without this flag, ENGINE_ctrl() handles + * these control commands on behalf of the ENGINE using their "cmd_defns" + * data. + */ +# define ENGINE_FLAGS_MANUAL_CMD_CTRL (int)0x0002 + +/* + * This flag is for ENGINEs who return new duplicate structures when found + * via "ENGINE_by_id()". When an ENGINE must store state (eg. if + * ENGINE_ctrl() commands are called in sequence as part of some stateful + * process like key-generation setup and execution), it can set this flag - + * then each attempt to obtain the ENGINE will result in it being copied into + * a new structure. Normally, ENGINEs don't declare this flag so + * ENGINE_by_id() just increments the existing ENGINE's structural reference + * count. + */ +# define ENGINE_FLAGS_BY_ID_COPY (int)0x0004 + +/* + * This flag if for an ENGINE that does not want its methods registered as + * part of ENGINE_register_all_complete() for example if the methods are not + * usable as default methods. + */ + +# define ENGINE_FLAGS_NO_REGISTER_ALL (int)0x0008 + +/* + * ENGINEs can support their own command types, and these flags are used in + * ENGINE_CTRL_GET_CMD_FLAGS to indicate to the caller what kind of input + * each command expects. Currently only numeric and string input is + * supported. If a control command supports none of the _NUMERIC, _STRING, or + * _NO_INPUT options, then it is regarded as an "internal" control command - + * and not for use in config setting situations. As such, they're not + * available to the ENGINE_ctrl_cmd_string() function, only raw ENGINE_ctrl() + * access. Changes to this list of 'command types' should be reflected + * carefully in ENGINE_cmd_is_executable() and ENGINE_ctrl_cmd_string(). + */ + +/* accepts a 'long' input value (3rd parameter to ENGINE_ctrl) */ +# define ENGINE_CMD_FLAG_NUMERIC (unsigned int)0x0001 +/* + * accepts string input (cast from 'void*' to 'const char *', 4th parameter + * to ENGINE_ctrl) + */ +# define ENGINE_CMD_FLAG_STRING (unsigned int)0x0002 +/* + * Indicates that the control command takes *no* input. Ie. the control + * command is unparameterised. + */ +# define ENGINE_CMD_FLAG_NO_INPUT (unsigned int)0x0004 +/* + * Indicates that the control command is internal. This control command won't + * be shown in any output, and is only usable through the ENGINE_ctrl_cmd() + * function. + */ +# define ENGINE_CMD_FLAG_INTERNAL (unsigned int)0x0008 + +/* + * NB: These 3 control commands are deprecated and should not be used. + * ENGINEs relying on these commands should compile conditional support for + * compatibility (eg. if these symbols are defined) but should also migrate + * the same functionality to their own ENGINE-specific control functions that + * can be "discovered" by calling applications. The fact these control + * commands wouldn't be "executable" (ie. usable by text-based config) + * doesn't change the fact that application code can find and use them + * without requiring per-ENGINE hacking. + */ + +/* + * These flags are used to tell the ctrl function what should be done. All + * command numbers are shared between all engines, even if some don't make + * sense to some engines. In such a case, they do nothing but return the + * error ENGINE_R_CTRL_COMMAND_NOT_IMPLEMENTED. + */ +# define ENGINE_CTRL_SET_LOGSTREAM 1 +# define ENGINE_CTRL_SET_PASSWORD_CALLBACK 2 +# define ENGINE_CTRL_HUP 3/* Close and reinitialise + * any handles/connections + * etc. */ +# define ENGINE_CTRL_SET_USER_INTERFACE 4/* Alternative to callback */ +# define ENGINE_CTRL_SET_CALLBACK_DATA 5/* User-specific data, used + * when calling the password + * callback and the user + * interface */ +# define ENGINE_CTRL_LOAD_CONFIGURATION 6/* Load a configuration, + * given a string that + * represents a file name + * or so */ +# define ENGINE_CTRL_LOAD_SECTION 7/* Load data from a given + * section in the already + * loaded configuration */ + +/* + * These control commands allow an application to deal with an arbitrary + * engine in a dynamic way. Warn: Negative return values indicate errors FOR + * THESE COMMANDS because zero is used to indicate 'end-of-list'. Other + * commands, including ENGINE-specific command types, return zero for an + * error. An ENGINE can choose to implement these ctrl functions, and can + * internally manage things however it chooses - it does so by setting the + * ENGINE_FLAGS_MANUAL_CMD_CTRL flag (using ENGINE_set_flags()). Otherwise + * the ENGINE_ctrl() code handles this on the ENGINE's behalf using the + * cmd_defns data (set using ENGINE_set_cmd_defns()). This means an ENGINE's + * ctrl() handler need only implement its own commands - the above "meta" + * commands will be taken care of. + */ + +/* + * Returns non-zero if the supplied ENGINE has a ctrl() handler. If "not", + * then all the remaining control commands will return failure, so it is + * worth checking this first if the caller is trying to "discover" the + * engine's capabilities and doesn't want errors generated unnecessarily. + */ +# define ENGINE_CTRL_HAS_CTRL_FUNCTION 10 +/* + * Returns a positive command number for the first command supported by the + * engine. Returns zero if no ctrl commands are supported. + */ +# define ENGINE_CTRL_GET_FIRST_CMD_TYPE 11 +/* + * The 'long' argument specifies a command implemented by the engine, and the + * return value is the next command supported, or zero if there are no more. + */ +# define ENGINE_CTRL_GET_NEXT_CMD_TYPE 12 +/* + * The 'void*' argument is a command name (cast from 'const char *'), and the + * return value is the command that corresponds to it. + */ +# define ENGINE_CTRL_GET_CMD_FROM_NAME 13 +/* + * The next two allow a command to be converted into its corresponding string + * form. In each case, the 'long' argument supplies the command. In the + * NAME_LEN case, the return value is the length of the command name (not + * counting a trailing EOL). In the NAME case, the 'void*' argument must be a + * string buffer large enough, and it will be populated with the name of the + * command (WITH a trailing EOL). + */ +# define ENGINE_CTRL_GET_NAME_LEN_FROM_CMD 14 +# define ENGINE_CTRL_GET_NAME_FROM_CMD 15 +/* The next two are similar but give a "short description" of a command. */ +# define ENGINE_CTRL_GET_DESC_LEN_FROM_CMD 16 +# define ENGINE_CTRL_GET_DESC_FROM_CMD 17 +/* + * With this command, the return value is the OR'd combination of + * ENGINE_CMD_FLAG_*** values that indicate what kind of input a given + * engine-specific ctrl command expects. + */ +# define ENGINE_CTRL_GET_CMD_FLAGS 18 + +/* + * ENGINE implementations should start the numbering of their own control + * commands from this value. (ie. ENGINE_CMD_BASE, ENGINE_CMD_BASE + 1, etc). + */ +# define ENGINE_CMD_BASE 200 + +/* + * NB: These 2 nCipher "chil" control commands are deprecated, and their + * functionality is now available through ENGINE-specific control commands + * (exposed through the above-mentioned 'CMD'-handling). Code using these 2 + * commands should be migrated to the more general command handling before + * these are removed. + */ + +/* Flags specific to the nCipher "chil" engine */ +# define ENGINE_CTRL_CHIL_SET_FORKCHECK 100 + /* + * Depending on the value of the (long)i argument, this sets or + * unsets the SimpleForkCheck flag in the CHIL API to enable or + * disable checking and workarounds for applications that fork(). + */ +# define ENGINE_CTRL_CHIL_NO_LOCKING 101 + /* + * This prevents the initialisation function from providing mutex + * callbacks to the nCipher library. + */ + +/* + * If an ENGINE supports its own specific control commands and wishes the + * framework to handle the above 'ENGINE_CMD_***'-manipulation commands on + * its behalf, it should supply a null-terminated array of ENGINE_CMD_DEFN + * entries to ENGINE_set_cmd_defns(). It should also implement a ctrl() + * handler that supports the stated commands (ie. the "cmd_num" entries as + * described by the array). NB: The array must be ordered in increasing order + * of cmd_num. "null-terminated" means that the last ENGINE_CMD_DEFN element + * has cmd_num set to zero and/or cmd_name set to NULL. + */ +typedef struct ENGINE_CMD_DEFN_st { + unsigned int cmd_num; /* The command number */ + const char *cmd_name; /* The command name itself */ + const char *cmd_desc; /* A short description of the command */ + unsigned int cmd_flags; /* The input the command expects */ +} ENGINE_CMD_DEFN; + +/* Generic function pointer */ +typedef int (*ENGINE_GEN_FUNC_PTR) (void); +/* Generic function pointer taking no arguments */ +typedef int (*ENGINE_GEN_INT_FUNC_PTR) (ENGINE *); +/* Specific control function pointer */ +typedef int (*ENGINE_CTRL_FUNC_PTR) (ENGINE *, int, long, void *, + void (*f) (void)); +/* Generic load_key function pointer */ +typedef EVP_PKEY *(*ENGINE_LOAD_KEY_PTR)(ENGINE *, const char *, + UI_METHOD *ui_method, + void *callback_data); +typedef int (*ENGINE_SSL_CLIENT_CERT_PTR) (ENGINE *, SSL *ssl, + STACK_OF(X509_NAME) *ca_dn, + X509 **pcert, EVP_PKEY **pkey, + STACK_OF(X509) **pother, + UI_METHOD *ui_method, + void *callback_data); +/*- + * These callback types are for an ENGINE's handler for cipher and digest logic. + * These handlers have these prototypes; + * int foo(ENGINE *e, const EVP_CIPHER **cipher, const int **nids, int nid); + * int foo(ENGINE *e, const EVP_MD **digest, const int **nids, int nid); + * Looking at how to implement these handlers in the case of cipher support, if + * the framework wants the EVP_CIPHER for 'nid', it will call; + * foo(e, &p_evp_cipher, NULL, nid); (return zero for failure) + * If the framework wants a list of supported 'nid's, it will call; + * foo(e, NULL, &p_nids, 0); (returns number of 'nids' or -1 for error) + */ +/* + * Returns to a pointer to the array of supported cipher 'nid's. If the + * second parameter is non-NULL it is set to the size of the returned array. + */ +typedef int (*ENGINE_CIPHERS_PTR) (ENGINE *, const EVP_CIPHER **, + const int **, int); +typedef int (*ENGINE_DIGESTS_PTR) (ENGINE *, const EVP_MD **, const int **, + int); +typedef int (*ENGINE_PKEY_METHS_PTR) (ENGINE *, EVP_PKEY_METHOD **, + const int **, int); +typedef int (*ENGINE_PKEY_ASN1_METHS_PTR) (ENGINE *, EVP_PKEY_ASN1_METHOD **, + const int **, int); +/* + * STRUCTURE functions ... all of these functions deal with pointers to + * ENGINE structures where the pointers have a "structural reference". This + * means that their reference is to allowed access to the structure but it + * does not imply that the structure is functional. To simply increment or + * decrement the structural reference count, use ENGINE_by_id and + * ENGINE_free. NB: This is not required when iterating using ENGINE_get_next + * as it will automatically decrement the structural reference count of the + * "current" ENGINE and increment the structural reference count of the + * ENGINE it returns (unless it is NULL). + */ + +/* Get the first/last "ENGINE" type available. */ +ENGINE *ENGINE_get_first(void); +ENGINE *ENGINE_get_last(void); +/* Iterate to the next/previous "ENGINE" type (NULL = end of the list). */ +ENGINE *ENGINE_get_next(ENGINE *e); +ENGINE *ENGINE_get_prev(ENGINE *e); +/* Add another "ENGINE" type into the array. */ +int ENGINE_add(ENGINE *e); +/* Remove an existing "ENGINE" type from the array. */ +int ENGINE_remove(ENGINE *e); +/* Retrieve an engine from the list by its unique "id" value. */ +ENGINE *ENGINE_by_id(const char *id); + +#if OPENSSL_API_COMPAT < 0x10100000L +# define ENGINE_load_openssl() \ + OPENSSL_init_crypto(OPENSSL_INIT_ENGINE_OPENSSL, NULL) +# define ENGINE_load_dynamic() \ + OPENSSL_init_crypto(OPENSSL_INIT_ENGINE_DYNAMIC, NULL) +# ifndef OPENSSL_NO_STATIC_ENGINE +# define ENGINE_load_padlock() \ + OPENSSL_init_crypto(OPENSSL_INIT_ENGINE_PADLOCK, NULL) +# define ENGINE_load_capi() \ + OPENSSL_init_crypto(OPENSSL_INIT_ENGINE_CAPI, NULL) +# define ENGINE_load_afalg() \ + OPENSSL_init_crypto(OPENSSL_INIT_ENGINE_AFALG, NULL) +# endif +# define ENGINE_load_cryptodev() \ + OPENSSL_init_crypto(OPENSSL_INIT_ENGINE_CRYPTODEV, NULL) +# define ENGINE_load_rdrand() \ + OPENSSL_init_crypto(OPENSSL_INIT_ENGINE_RDRAND, NULL) +#endif +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. + */ + +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_EC(ENGINE *e); +void ENGINE_unregister_EC(ENGINE *e); +void ENGINE_register_all_EC(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_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 parameterised 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_EC(ENGINE *e, const EC_KEY_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_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. */ +#define ENGINE_get_ex_new_index(l, p, newf, dupf, freef) \ + CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_ENGINE, l, p, newf, dupf, freef) +int ENGINE_set_ex_data(ENGINE *e, int idx, void *arg); +void *ENGINE_get_ex_data(const ENGINE *e, int idx); + +#if OPENSSL_API_COMPAT < 0x10100000L +/* + * This function previously cleaned up anything that needs it. Auto-deinit will + * now take care of it so it is no longer required to call this function. + */ +# define ENGINE_cleanup() while(0) continue +#endif + +/* + * 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 EC_KEY_METHOD *ENGINE_get_EC(const ENGINE *e); +const DH_METHOD *ENGINE_get_DH(const ENGINE *e); +const RAND_METHOD *ENGINE_get_RAND(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_EC(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_EC(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)0x00030000 +/* + * Binary versions older than this are too old for us (whether we're a loader + * or a loadee) + */ +# define OSSL_DYNAMIC_OLDEST (unsigned long)0x00030000 + +/* + * 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_fn) (size_t, const char *, int); +typedef void *(*dyn_MEM_realloc_fn) (void *, size_t, const char *, int); +typedef void (*dyn_MEM_free_fn) (void *, const char *, int); +typedef struct st_dynamic_MEM_fns { + dyn_MEM_malloc_fn malloc_fn; + dyn_MEM_realloc_fn realloc_fn; + dyn_MEM_free_fn free_fn; +} dynamic_MEM_fns; +/* + * FIXME: Perhaps the memory and locking code (crypto.h) should declare and + * use these types so we (and any other dependent code) can simplify a bit?? + */ +/* The top-level structure */ +typedef struct st_dynamic_fns { + void *static_state; + dynamic_MEM_fns mem_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; \ + CRYPTO_set_mem_functions(fns->mem_fns.malloc_fn, \ + fns->mem_fns.realloc_fn, \ + fns->mem_fns.free_fn); \ + 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(__DragonFly__) +DEPRECATEDIN_1_1_0(void ENGINE_setup_bsd_cryptodev(void)) +# endif + + +# ifdef __cplusplus +} +# endif +# endif +#endif diff --git a/openssl-wasm/include/openssl/engineerr.h b/openssl-wasm/include/openssl/engineerr.h new file mode 100644 index 0000000..05e84bd --- /dev/null +++ b/openssl-wasm/include/openssl/engineerr.h @@ -0,0 +1,111 @@ +/* + * Generated by util/mkerr.pl DO NOT EDIT + * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_ENGINEERR_H +# define HEADER_ENGINEERR_H + +# ifndef HEADER_SYMHACKS_H +# include +# endif + +# include + +# ifndef OPENSSL_NO_ENGINE + +# ifdef __cplusplus +extern "C" +# endif +int ERR_load_ENGINE_strings(void); + +/* + * ENGINE function codes. + */ +# define ENGINE_F_DIGEST_UPDATE 198 +# 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_GET_CIPHER 185 +# define ENGINE_F_ENGINE_GET_DIGEST 186 +# define ENGINE_F_ENGINE_GET_FIRST 195 +# define ENGINE_F_ENGINE_GET_LAST 196 +# 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_PKEY_ASN1_FIND_STR 197 +# define ENGINE_F_ENGINE_REMOVE 123 +# define ENGINE_F_ENGINE_SET_DEFAULT_STRING 189 +# 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_UNLOCKED_FINISH 191 +# define ENGINE_F_ENGINE_UP_REF 190 +# define ENGINE_F_INT_CLEANUP_ITEM 199 +# 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_OSSL_HMAC_INIT 200 + +/* + * ENGINE 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_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_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_UNIMPLEMENTED_CIPHER 146 +# define ENGINE_R_UNIMPLEMENTED_DIGEST 147 +# define ENGINE_R_UNIMPLEMENTED_PUBLIC_KEY_METHOD 101 +# define ENGINE_R_VERSION_INCOMPATIBILITY 145 + +# endif +#endif diff --git a/openssl-wasm/include/openssl/err.h b/openssl-wasm/include/openssl/err.h new file mode 100644 index 0000000..b49f881 --- /dev/null +++ b/openssl-wasm/include/openssl/err.h @@ -0,0 +1,274 @@ +/* + * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_ERR_H +# define HEADER_ERR_H + +# include + +# ifndef OPENSSL_NO_STDIO +# include +# include +# endif + +# include +# include +# include + +#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_FLAG_CLEAR 0x02 + +# define ERR_NUM_ERRORS 16 +typedef struct err_state_st { + 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_OSSL_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_CT 50 +# define ERR_LIB_ASYNC 51 +# define ERR_LIB_KDF 52 +# define ERR_LIB_SM2 53 + +# define ERR_LIB_USER 128 + +# define SYSerr(f,r) ERR_PUT_error(ERR_LIB_SYS,(f),(r),OPENSSL_FILE,OPENSSL_LINE) +# define BNerr(f,r) ERR_PUT_error(ERR_LIB_BN,(f),(r),OPENSSL_FILE,OPENSSL_LINE) +# define RSAerr(f,r) ERR_PUT_error(ERR_LIB_RSA,(f),(r),OPENSSL_FILE,OPENSSL_LINE) +# define DHerr(f,r) ERR_PUT_error(ERR_LIB_DH,(f),(r),OPENSSL_FILE,OPENSSL_LINE) +# define EVPerr(f,r) ERR_PUT_error(ERR_LIB_EVP,(f),(r),OPENSSL_FILE,OPENSSL_LINE) +# define BUFerr(f,r) ERR_PUT_error(ERR_LIB_BUF,(f),(r),OPENSSL_FILE,OPENSSL_LINE) +# define OBJerr(f,r) ERR_PUT_error(ERR_LIB_OBJ,(f),(r),OPENSSL_FILE,OPENSSL_LINE) +# define PEMerr(f,r) ERR_PUT_error(ERR_LIB_PEM,(f),(r),OPENSSL_FILE,OPENSSL_LINE) +# define DSAerr(f,r) ERR_PUT_error(ERR_LIB_DSA,(f),(r),OPENSSL_FILE,OPENSSL_LINE) +# define X509err(f,r) ERR_PUT_error(ERR_LIB_X509,(f),(r),OPENSSL_FILE,OPENSSL_LINE) +# define ASN1err(f,r) ERR_PUT_error(ERR_LIB_ASN1,(f),(r),OPENSSL_FILE,OPENSSL_LINE) +# define CONFerr(f,r) ERR_PUT_error(ERR_LIB_CONF,(f),(r),OPENSSL_FILE,OPENSSL_LINE) +# define CRYPTOerr(f,r) ERR_PUT_error(ERR_LIB_CRYPTO,(f),(r),OPENSSL_FILE,OPENSSL_LINE) +# define ECerr(f,r) ERR_PUT_error(ERR_LIB_EC,(f),(r),OPENSSL_FILE,OPENSSL_LINE) +# define SSLerr(f,r) ERR_PUT_error(ERR_LIB_SSL,(f),(r),OPENSSL_FILE,OPENSSL_LINE) +# define BIOerr(f,r) ERR_PUT_error(ERR_LIB_BIO,(f),(r),OPENSSL_FILE,OPENSSL_LINE) +# define PKCS7err(f,r) ERR_PUT_error(ERR_LIB_PKCS7,(f),(r),OPENSSL_FILE,OPENSSL_LINE) +# define X509V3err(f,r) ERR_PUT_error(ERR_LIB_X509V3,(f),(r),OPENSSL_FILE,OPENSSL_LINE) +# define PKCS12err(f,r) ERR_PUT_error(ERR_LIB_PKCS12,(f),(r),OPENSSL_FILE,OPENSSL_LINE) +# define RANDerr(f,r) ERR_PUT_error(ERR_LIB_RAND,(f),(r),OPENSSL_FILE,OPENSSL_LINE) +# define DSOerr(f,r) ERR_PUT_error(ERR_LIB_DSO,(f),(r),OPENSSL_FILE,OPENSSL_LINE) +# define ENGINEerr(f,r) ERR_PUT_error(ERR_LIB_ENGINE,(f),(r),OPENSSL_FILE,OPENSSL_LINE) +# define OCSPerr(f,r) ERR_PUT_error(ERR_LIB_OCSP,(f),(r),OPENSSL_FILE,OPENSSL_LINE) +# define UIerr(f,r) ERR_PUT_error(ERR_LIB_UI,(f),(r),OPENSSL_FILE,OPENSSL_LINE) +# define COMPerr(f,r) ERR_PUT_error(ERR_LIB_COMP,(f),(r),OPENSSL_FILE,OPENSSL_LINE) +# define ECDSAerr(f,r) ERR_PUT_error(ERR_LIB_ECDSA,(f),(r),OPENSSL_FILE,OPENSSL_LINE) +# define ECDHerr(f,r) ERR_PUT_error(ERR_LIB_ECDH,(f),(r),OPENSSL_FILE,OPENSSL_LINE) +# define OSSL_STOREerr(f,r) ERR_PUT_error(ERR_LIB_OSSL_STORE,(f),(r),OPENSSL_FILE,OPENSSL_LINE) +# define FIPSerr(f,r) ERR_PUT_error(ERR_LIB_FIPS,(f),(r),OPENSSL_FILE,OPENSSL_LINE) +# define CMSerr(f,r) ERR_PUT_error(ERR_LIB_CMS,(f),(r),OPENSSL_FILE,OPENSSL_LINE) +# define TSerr(f,r) ERR_PUT_error(ERR_LIB_TS,(f),(r),OPENSSL_FILE,OPENSSL_LINE) +# define HMACerr(f,r) ERR_PUT_error(ERR_LIB_HMAC,(f),(r),OPENSSL_FILE,OPENSSL_LINE) +# define CTerr(f,r) ERR_PUT_error(ERR_LIB_CT,(f),(r),OPENSSL_FILE,OPENSSL_LINE) +# define ASYNCerr(f,r) ERR_PUT_error(ERR_LIB_ASYNC,(f),(r),OPENSSL_FILE,OPENSSL_LINE) +# define KDFerr(f,r) ERR_PUT_error(ERR_LIB_KDF,(f),(r),OPENSSL_FILE,OPENSSL_LINE) +# define SM2err(f,r) ERR_PUT_error(ERR_LIB_SM2,(f),(r),OPENSSL_FILE,OPENSSL_LINE) + +# define ERR_PACK(l,f,r) ( \ + (((unsigned int)(l) & 0x0FF) << 24L) | \ + (((unsigned int)(f) & 0xFFF) << 12L) | \ + (((unsigned int)(r) & 0xFFF) ) ) +# define ERR_GET_LIB(l) (int)(((l) >> 24L) & 0x0FFL) +# define ERR_GET_FUNC(l) (int)(((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 +# define SYS_F_GETADDRINFO 12 +# define SYS_F_GETNAMEINFO 13 +# define SYS_F_SETSOCKOPT 14 +# define SYS_F_GETSOCKOPT 15 +# define SYS_F_GETSOCKNAME 16 +# define SYS_F_GETHOSTBYNAME 17 +# define SYS_F_FFLUSH 18 +# define SYS_F_OPEN 19 +# define SYS_F_CLOSE 20 +# define SYS_F_IOCTL 21 +# define SYS_F_STAT 22 +# define SYS_F_FCNTL 23 +# define SYS_F_FSTAT 24 + +/* 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_EC_LIB ERR_LIB_EC/* 16 */ +# 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_ENGINE_LIB ERR_LIB_ENGINE/* 38 */ +# define ERR_R_UI_LIB ERR_LIB_UI/* 40 */ +# define ERR_R_ECDSA_LIB ERR_LIB_ECDSA/* 42 */ +# define ERR_R_OSSL_STORE_LIB ERR_LIB_OSSL_STORE/* 44 */ + +# define ERR_R_NESTED_ASN1_ERROR 58 +# 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) +# define ERR_R_INIT_FAIL (6|ERR_R_FATAL) +# define ERR_R_PASSED_INVALID_ARGUMENT (7) +# define ERR_R_OPERATION_FAIL (8|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; + +DEFINE_LHASH_OF(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_STDIO +void ERR_print_errors_fp(FILE *fp); +# endif +void ERR_print_errors(BIO *bp); +void ERR_add_error_data(int num, ...); +void ERR_add_error_vdata(int num, va_list args); +int ERR_load_strings(int lib, ERR_STRING_DATA *str); +int ERR_load_strings_const(const ERR_STRING_DATA *str); +int ERR_unload_strings(int lib, ERR_STRING_DATA *str); +int ERR_load_ERR_strings(void); + +#if OPENSSL_API_COMPAT < 0x10100000L +# define ERR_load_crypto_strings() \ + OPENSSL_init_crypto(OPENSSL_INIT_LOAD_CRYPTO_STRINGS, NULL) +# define ERR_free_strings() while(0) continue +#endif + +DEPRECATEDIN_1_1_0(void ERR_remove_thread_state(void *)) +DEPRECATEDIN_1_0_0(void ERR_remove_state(unsigned long pid)) +ERR_STATE *ERR_get_state(void); + +int ERR_get_next_error_library(void); + +int ERR_set_mark(void); +int ERR_pop_to_mark(void); +int ERR_clear_last_mark(void); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/openssl-wasm/include/openssl/evp.h b/openssl-wasm/include/openssl/evp.h new file mode 100644 index 0000000..a411f3f --- /dev/null +++ b/openssl-wasm/include/openssl/evp.h @@ -0,0 +1,1666 @@ +/* + * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_ENVELOPE_H +# define HEADER_ENVELOPE_H + +# include +# include +# include +# include +# include + +# 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_PKEY_NONE NID_undef +# define EVP_PKEY_RSA NID_rsaEncryption +# define EVP_PKEY_RSA2 NID_rsa +# define EVP_PKEY_RSA_PSS NID_rsassaPss +# define EVP_PKEY_DSA NID_dsa +# define EVP_PKEY_DSA1 NID_dsa_2 +# define EVP_PKEY_DSA2 NID_dsaWithSHA +# define EVP_PKEY_DSA3 NID_dsaWithSHA1 +# define EVP_PKEY_DSA4 NID_dsaWithSHA1_2 +# define EVP_PKEY_DH NID_dhKeyAgreement +# define EVP_PKEY_DHX NID_dhpublicnumber +# define EVP_PKEY_EC NID_X9_62_id_ecPublicKey +# define EVP_PKEY_SM2 NID_sm2 +# define EVP_PKEY_HMAC NID_hmac +# define EVP_PKEY_CMAC NID_cmac +# define EVP_PKEY_SCRYPT NID_id_scrypt +# define EVP_PKEY_TLS1_PRF NID_tls1_prf +# define EVP_PKEY_HKDF NID_hkdf +# define EVP_PKEY_POLY1305 NID_poly1305 +# define EVP_PKEY_SIPHASH NID_siphash +# define EVP_PKEY_X25519 NID_X25519 +# define EVP_PKEY_ED25519 NID_ED25519 +# define EVP_PKEY_X448 NID_X448 +# define EVP_PKEY_ED448 NID_ED448 + +#ifdef __cplusplus +extern "C" { +#endif + +# 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 +EVP_MD *EVP_MD_meth_new(int md_type, int pkey_type); +EVP_MD *EVP_MD_meth_dup(const EVP_MD *md); +void EVP_MD_meth_free(EVP_MD *md); + +int EVP_MD_meth_set_input_blocksize(EVP_MD *md, int blocksize); +int EVP_MD_meth_set_result_size(EVP_MD *md, int resultsize); +int EVP_MD_meth_set_app_datasize(EVP_MD *md, int datasize); +int EVP_MD_meth_set_flags(EVP_MD *md, unsigned long flags); +int EVP_MD_meth_set_init(EVP_MD *md, int (*init)(EVP_MD_CTX *ctx)); +int EVP_MD_meth_set_update(EVP_MD *md, int (*update)(EVP_MD_CTX *ctx, + const void *data, + size_t count)); +int EVP_MD_meth_set_final(EVP_MD *md, int (*final)(EVP_MD_CTX *ctx, + unsigned char *md)); +int EVP_MD_meth_set_copy(EVP_MD *md, int (*copy)(EVP_MD_CTX *to, + const EVP_MD_CTX *from)); +int EVP_MD_meth_set_cleanup(EVP_MD *md, int (*cleanup)(EVP_MD_CTX *ctx)); +int EVP_MD_meth_set_ctrl(EVP_MD *md, int (*ctrl)(EVP_MD_CTX *ctx, int cmd, + int p1, void *p2)); + +int EVP_MD_meth_get_input_blocksize(const EVP_MD *md); +int EVP_MD_meth_get_result_size(const EVP_MD *md); +int EVP_MD_meth_get_app_datasize(const EVP_MD *md); +unsigned long EVP_MD_meth_get_flags(const EVP_MD *md); +int (*EVP_MD_meth_get_init(const EVP_MD *md))(EVP_MD_CTX *ctx); +int (*EVP_MD_meth_get_update(const EVP_MD *md))(EVP_MD_CTX *ctx, + const void *data, + size_t count); +int (*EVP_MD_meth_get_final(const EVP_MD *md))(EVP_MD_CTX *ctx, + unsigned char *md); +int (*EVP_MD_meth_get_copy(const EVP_MD *md))(EVP_MD_CTX *to, + const EVP_MD_CTX *from); +int (*EVP_MD_meth_get_cleanup(const EVP_MD *md))(EVP_MD_CTX *ctx); +int (*EVP_MD_meth_get_ctrl(const EVP_MD *md))(EVP_MD_CTX *ctx, int cmd, + int p1, void *p2); + +/* digest can only handle a single block */ +# define EVP_MD_FLAG_ONESHOT 0x0001 + +/* digest is extensible-output function, XOF */ +# define EVP_MD_FLAG_XOF 0x0002 + +/* DigestAlgorithmIdentifier flags... */ + +# define EVP_MD_FLAG_DIGALGID_MASK 0x0018 + +/* NULL or absent parameter accepted. Use NULL */ + +# define EVP_MD_FLAG_DIGALGID_NULL 0x0000 + +/* NULL or absent parameter accepted. Use NULL for PKCS#1 otherwise absent */ + +# define EVP_MD_FLAG_DIGALGID_ABSENT 0x0008 + +/* Custom handling via ctrl */ + +# define EVP_MD_FLAG_DIGALGID_CUSTOM 0x0018 + +/* Note if suitable for use in FIPS mode */ +# define EVP_MD_FLAG_FIPS 0x0400 + +/* Digest ctrls */ + +# define EVP_MD_CTRL_DIGALGID 0x1 +# define EVP_MD_CTRL_MICALG 0x2 +# define EVP_MD_CTRL_XOF_LEN 0x3 + +/* Minimum Algorithm specific ctrl value */ + +# define EVP_MD_CTRL_ALG_CTRL 0x1000 + +# endif /* !EVP_MD */ + +/* 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_reset */ +/* + * 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 */ +/* + * Some functions such as EVP_DigestSign only finalise copies of internal + * contexts so additional data can be included after the finalisation call. + * This is inefficient if this functionality is not required: it is disabled + * if the following flag is set. + */ +# define EVP_MD_CTX_FLAG_FINALISE 0x0200 +/* NOTE: 0x0400 is reserved for internal usage */ + +EVP_CIPHER *EVP_CIPHER_meth_new(int cipher_type, int block_size, int key_len); +EVP_CIPHER *EVP_CIPHER_meth_dup(const EVP_CIPHER *cipher); +void EVP_CIPHER_meth_free(EVP_CIPHER *cipher); + +int EVP_CIPHER_meth_set_iv_length(EVP_CIPHER *cipher, int iv_len); +int EVP_CIPHER_meth_set_flags(EVP_CIPHER *cipher, unsigned long flags); +int EVP_CIPHER_meth_set_impl_ctx_size(EVP_CIPHER *cipher, int ctx_size); +int EVP_CIPHER_meth_set_init(EVP_CIPHER *cipher, + int (*init) (EVP_CIPHER_CTX *ctx, + const unsigned char *key, + const unsigned char *iv, + int enc)); +int EVP_CIPHER_meth_set_do_cipher(EVP_CIPHER *cipher, + int (*do_cipher) (EVP_CIPHER_CTX *ctx, + unsigned char *out, + const unsigned char *in, + size_t inl)); +int EVP_CIPHER_meth_set_cleanup(EVP_CIPHER *cipher, + int (*cleanup) (EVP_CIPHER_CTX *)); +int EVP_CIPHER_meth_set_set_asn1_params(EVP_CIPHER *cipher, + int (*set_asn1_parameters) (EVP_CIPHER_CTX *, + ASN1_TYPE *)); +int EVP_CIPHER_meth_set_get_asn1_params(EVP_CIPHER *cipher, + int (*get_asn1_parameters) (EVP_CIPHER_CTX *, + ASN1_TYPE *)); +int EVP_CIPHER_meth_set_ctrl(EVP_CIPHER *cipher, + int (*ctrl) (EVP_CIPHER_CTX *, int type, + int arg, void *ptr)); + +int (*EVP_CIPHER_meth_get_init(const EVP_CIPHER *cipher))(EVP_CIPHER_CTX *ctx, + const unsigned char *key, + const unsigned char *iv, + int enc); +int (*EVP_CIPHER_meth_get_do_cipher(const EVP_CIPHER *cipher))(EVP_CIPHER_CTX *ctx, + unsigned char *out, + const unsigned char *in, + size_t inl); +int (*EVP_CIPHER_meth_get_cleanup(const EVP_CIPHER *cipher))(EVP_CIPHER_CTX *); +int (*EVP_CIPHER_meth_get_set_asn1_params(const EVP_CIPHER *cipher))(EVP_CIPHER_CTX *, + ASN1_TYPE *); +int (*EVP_CIPHER_meth_get_get_asn1_params(const EVP_CIPHER *cipher))(EVP_CIPHER_CTX *, + ASN1_TYPE *); +int (*EVP_CIPHER_meth_get_ctrl(const EVP_CIPHER *cipher))(EVP_CIPHER_CTX *, + int type, int arg, + void *ptr); + +/* Values for cipher flags */ + +/* Modes for ciphers */ + +# define EVP_CIPH_STREAM_CIPHER 0x0 +# define EVP_CIPH_ECB_MODE 0x1 +# define EVP_CIPH_CBC_MODE 0x2 +# define EVP_CIPH_CFB_MODE 0x3 +# define EVP_CIPH_OFB_MODE 0x4 +# define EVP_CIPH_CTR_MODE 0x5 +# define EVP_CIPH_GCM_MODE 0x6 +# define EVP_CIPH_CCM_MODE 0x7 +# define EVP_CIPH_XTS_MODE 0x10001 +# define EVP_CIPH_WRAP_MODE 0x10002 +# define EVP_CIPH_OCB_MODE 0x10003 +# 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 +/* Don't use standard iv length function */ +# define EVP_CIPH_CUSTOM_IV_LENGTH 0x800 +/* Allow use default ASN1 get/set iv */ +# define EVP_CIPH_FLAG_DEFAULT_ASN1 0x1000 +/* Buffer length in bits not bytes: CFB1 mode only */ +# define EVP_CIPH_FLAG_LENGTH_BITS 0x2000 +/* Note if suitable for use in FIPS mode */ +# define EVP_CIPH_FLAG_FIPS 0x4000 +/* Allow non FIPS cipher in FIPS mode */ +# define EVP_CIPH_FLAG_NON_FIPS_ALLOW 0x8000 +/* + * Cipher handles any and all padding logic as well as finalisation. + */ +# define EVP_CIPH_FLAG_CUSTOM_CIPHER 0x100000 +# define EVP_CIPH_FLAG_AEAD_CIPHER 0x200000 +# define EVP_CIPH_FLAG_TLS1_1_MULTIBLOCK 0x400000 +/* Cipher can handle pipeline operations */ +# define EVP_CIPH_FLAG_PIPELINE 0X800000 + +/* + * Cipher context flag to indicate we can handle wrap mode: if allowed in + * older applications it could overflow buffers. + */ + +# define EVP_CIPHER_CTX_FLAG_WRAP_ALLOW 0x1 + +/* ctrl() values */ + +# define EVP_CTRL_INIT 0x0 +# define EVP_CTRL_SET_KEY_LENGTH 0x1 +# define EVP_CTRL_GET_RC2_KEY_BITS 0x2 +# define EVP_CTRL_SET_RC2_KEY_BITS 0x3 +# define EVP_CTRL_GET_RC5_ROUNDS 0x4 +# define EVP_CTRL_SET_RC5_ROUNDS 0x5 +# define EVP_CTRL_RAND_KEY 0x6 +# define EVP_CTRL_PBE_PRF_NID 0x7 +# define EVP_CTRL_COPY 0x8 +# define EVP_CTRL_AEAD_SET_IVLEN 0x9 +# define EVP_CTRL_AEAD_GET_TAG 0x10 +# define EVP_CTRL_AEAD_SET_TAG 0x11 +# define EVP_CTRL_AEAD_SET_IV_FIXED 0x12 +# define EVP_CTRL_GCM_SET_IVLEN EVP_CTRL_AEAD_SET_IVLEN +# define EVP_CTRL_GCM_GET_TAG EVP_CTRL_AEAD_GET_TAG +# define EVP_CTRL_GCM_SET_TAG EVP_CTRL_AEAD_SET_TAG +# define EVP_CTRL_GCM_SET_IV_FIXED EVP_CTRL_AEAD_SET_IV_FIXED +# define EVP_CTRL_GCM_IV_GEN 0x13 +# define EVP_CTRL_CCM_SET_IVLEN EVP_CTRL_AEAD_SET_IVLEN +# define EVP_CTRL_CCM_GET_TAG EVP_CTRL_AEAD_GET_TAG +# define EVP_CTRL_CCM_SET_TAG EVP_CTRL_AEAD_SET_TAG +# define EVP_CTRL_CCM_SET_IV_FIXED EVP_CTRL_AEAD_SET_IV_FIXED +# define EVP_CTRL_CCM_SET_L 0x14 +# define EVP_CTRL_CCM_SET_MSGLEN 0x15 +/* + * AEAD cipher deduces payload length and returns number of bytes required to + * store MAC and eventual padding. Subsequent call to EVP_Cipher even + * appends/verifies MAC. + */ +# define EVP_CTRL_AEAD_TLS1_AAD 0x16 +/* Used by composite AEAD ciphers, no-op in GCM, CCM... */ +# define EVP_CTRL_AEAD_SET_MAC_KEY 0x17 +/* Set the GCM invocation field, decrypt only */ +# define EVP_CTRL_GCM_SET_IV_INV 0x18 + +# define EVP_CTRL_TLS1_1_MULTIBLOCK_AAD 0x19 +# define EVP_CTRL_TLS1_1_MULTIBLOCK_ENCRYPT 0x1a +# define EVP_CTRL_TLS1_1_MULTIBLOCK_DECRYPT 0x1b +# define EVP_CTRL_TLS1_1_MULTIBLOCK_MAX_BUFSIZE 0x1c + +# define EVP_CTRL_SSL3_MASTER_SECRET 0x1d + +/* EVP_CTRL_SET_SBOX takes the char * specifying S-boxes */ +# define EVP_CTRL_SET_SBOX 0x1e +/* + * EVP_CTRL_SBOX_USED takes a 'size_t' and 'char *', pointing at a + * pre-allocated buffer with specified size + */ +# define EVP_CTRL_SBOX_USED 0x1f +/* EVP_CTRL_KEY_MESH takes 'size_t' number of bytes to mesh the key after, + * 0 switches meshing off + */ +# define EVP_CTRL_KEY_MESH 0x20 +/* EVP_CTRL_BLOCK_PADDING_MODE takes the padding mode */ +# define EVP_CTRL_BLOCK_PADDING_MODE 0x21 + +/* Set the output buffers to use for a pipelined operation */ +# define EVP_CTRL_SET_PIPELINE_OUTPUT_BUFS 0x22 +/* Set the input buffers to use for a pipelined operation */ +# define EVP_CTRL_SET_PIPELINE_INPUT_BUFS 0x23 +/* Set the input buffer lengths to use for a pipelined operation */ +# define EVP_CTRL_SET_PIPELINE_INPUT_LENS 0x24 + +# define EVP_CTRL_GET_IVLEN 0x25 + +/* Padding modes */ +#define EVP_PADDING_PKCS7 1 +#define EVP_PADDING_ISO7816_4 2 +#define EVP_PADDING_ANSI923 3 +#define EVP_PADDING_ISO10126 4 +#define EVP_PADDING_ZERO 5 + +/* RFC 5246 defines additional data to be 13 bytes in length */ +# define EVP_AEAD_TLS1_AAD_LEN 13 + +typedef struct { + unsigned char *out; + const unsigned char *inp; + size_t len; + unsigned int interleave; +} EVP_CTRL_TLS1_1_MULTIBLOCK_PARAM; + +/* GCM TLS constants */ +/* Length of fixed part of IV derived from PRF */ +# define EVP_GCM_TLS_FIXED_IV_LEN 4 +/* Length of explicit part of IV part of TLS records */ +# define EVP_GCM_TLS_EXPLICIT_IV_LEN 8 +/* Length of tag for TLS */ +# define EVP_GCM_TLS_TAG_LEN 16 + +/* CCM TLS constants */ +/* Length of fixed part of IV derived from PRF */ +# define EVP_CCM_TLS_FIXED_IV_LEN 4 +/* Length of explicit part of IV part of TLS records */ +# define EVP_CCM_TLS_EXPLICIT_IV_LEN 8 +/* Total length of CCM IV length for TLS */ +# define EVP_CCM_TLS_IV_LEN 12 +/* Length of tag for TLS */ +# define EVP_CCM_TLS_TAG_LEN 16 +/* Length of CCM8 tag for TLS */ +# define EVP_CCM8_TLS_TAG_LEN 8 + +/* Length of tag for TLS */ +# define EVP_CHACHAPOLY_TLS_TAG_LEN 16 + +typedef struct evp_cipher_info_st { + const EVP_CIPHER *cipher; + unsigned char iv[EVP_MAX_IV_LENGTH]; +} EVP_CIPHER_INFO; + + +/* 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 +# ifndef OPENSSL_NO_SIPHASH +# define EVP_PKEY_assign_SIPHASH(pkey,shkey) EVP_PKEY_assign((pkey),EVP_PKEY_SIPHASH,\ + (char *)(shkey)) +# endif + +# ifndef OPENSSL_NO_POLY1305 +# define EVP_PKEY_assign_POLY1305(pkey,polykey) EVP_PKEY_assign((pkey),EVP_PKEY_POLY1305,\ + (char *)(polykey)) +# 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); +int (*EVP_MD_CTX_update_fn(EVP_MD_CTX *ctx))(EVP_MD_CTX *ctx, + const void *data, size_t count); +void EVP_MD_CTX_set_update_fn(EVP_MD_CTX *ctx, + int (*update) (EVP_MD_CTX *ctx, + const void *data, size_t count)); +# 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)) +EVP_PKEY_CTX *EVP_MD_CTX_pkey_ctx(const EVP_MD_CTX *ctx); +void EVP_MD_CTX_set_pkey_ctx(EVP_MD_CTX *ctx, EVP_PKEY_CTX *pctx); +void *EVP_MD_CTX_md_data(const EVP_MD_CTX *ctx); + +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_impl_ctx_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_encrypting(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); +const unsigned char *EVP_CIPHER_CTX_iv(const EVP_CIPHER_CTX *ctx); +const unsigned char *EVP_CIPHER_CTX_original_iv(const EVP_CIPHER_CTX *ctx); +unsigned char *EVP_CIPHER_CTX_iv_noconst(EVP_CIPHER_CTX *ctx); +unsigned char *EVP_CIPHER_CTX_buf_noconst(EVP_CIPHER_CTX *ctx); +int EVP_CIPHER_CTX_num(const EVP_CIPHER_CTX *ctx); +void EVP_CIPHER_CTX_set_num(EVP_CIPHER_CTX *ctx, int num); +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); +void *EVP_CIPHER_CTX_get_cipher_data(const EVP_CIPHER_CTX *ctx); +void *EVP_CIPHER_CTX_set_cipher_data(EVP_CIPHER_CTX *ctx, void *cipher_data); +# define EVP_CIPHER_CTX_type(c) EVP_CIPHER_type(EVP_CIPHER_CTX_cipher(c)) +# if OPENSSL_API_COMPAT < 0x10100000L +# define EVP_CIPHER_CTX_flags(c) EVP_CIPHER_flags(EVP_CIPHER_CTX_cipher(c)) +# endif +# define EVP_CIPHER_CTX_mode(c) EVP_CIPHER_mode(EVP_CIPHER_CTX_cipher(c)) + +# 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)) + +/*__owur*/ 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); + +int EVP_MD_CTX_ctrl(EVP_MD_CTX *ctx, int cmd, int p1, void *p2); +EVP_MD_CTX *EVP_MD_CTX_new(void); +int EVP_MD_CTX_reset(EVP_MD_CTX *ctx); +void EVP_MD_CTX_free(EVP_MD_CTX *ctx); +# define EVP_MD_CTX_create() EVP_MD_CTX_new() +# define EVP_MD_CTX_init(ctx) EVP_MD_CTX_reset((ctx)) +# define EVP_MD_CTX_destroy(ctx) EVP_MD_CTX_free((ctx)) +__owur 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); +__owur int EVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *type, + ENGINE *impl); +__owur int EVP_DigestUpdate(EVP_MD_CTX *ctx, const void *d, + size_t cnt); +__owur int EVP_DigestFinal_ex(EVP_MD_CTX *ctx, unsigned char *md, + unsigned int *s); +__owur int EVP_Digest(const void *data, size_t count, + unsigned char *md, unsigned int *size, + const EVP_MD *type, ENGINE *impl); + +__owur int EVP_MD_CTX_copy(EVP_MD_CTX *out, const EVP_MD_CTX *in); +__owur int EVP_DigestInit(EVP_MD_CTX *ctx, const EVP_MD *type); +__owur int EVP_DigestFinal(EVP_MD_CTX *ctx, unsigned char *md, + unsigned int *s); +__owur int EVP_DigestFinalXOF(EVP_MD_CTX *ctx, unsigned char *md, + size_t len); + +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); + +__owur 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); + +__owur int EVP_EncryptInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, + const unsigned char *key, const unsigned char *iv); +/*__owur*/ int EVP_EncryptInit_ex(EVP_CIPHER_CTX *ctx, + const EVP_CIPHER *cipher, ENGINE *impl, + const unsigned char *key, + const unsigned char *iv); +/*__owur*/ int EVP_EncryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, + int *outl, const unsigned char *in, int inl); +/*__owur*/ int EVP_EncryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, + int *outl); +/*__owur*/ int EVP_EncryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, + int *outl); + +__owur int EVP_DecryptInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, + const unsigned char *key, const unsigned char *iv); +/*__owur*/ int EVP_DecryptInit_ex(EVP_CIPHER_CTX *ctx, + const EVP_CIPHER *cipher, ENGINE *impl, + const unsigned char *key, + const unsigned char *iv); +/*__owur*/ int EVP_DecryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, + int *outl, const unsigned char *in, int inl); +__owur int EVP_DecryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *outm, + int *outl); +/*__owur*/ int EVP_DecryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *outm, + int *outl); + +__owur int EVP_CipherInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, + const unsigned char *key, const unsigned char *iv, + int enc); +/*__owur*/ int EVP_CipherInit_ex(EVP_CIPHER_CTX *ctx, + const EVP_CIPHER *cipher, ENGINE *impl, + const unsigned char *key, + const unsigned char *iv, int enc); +__owur int EVP_CipherUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, + int *outl, const unsigned char *in, int inl); +__owur int EVP_CipherFinal(EVP_CIPHER_CTX *ctx, unsigned char *outm, + int *outl); +__owur int EVP_CipherFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *outm, + int *outl); + +__owur int EVP_SignFinal(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *s, + EVP_PKEY *pkey); + +__owur int EVP_DigestSign(EVP_MD_CTX *ctx, unsigned char *sigret, + size_t *siglen, const unsigned char *tbs, + size_t tbslen); + +__owur int EVP_VerifyFinal(EVP_MD_CTX *ctx, const unsigned char *sigbuf, + unsigned int siglen, EVP_PKEY *pkey); + +__owur int EVP_DigestVerify(EVP_MD_CTX *ctx, const unsigned char *sigret, + size_t siglen, const unsigned char *tbs, + size_t tbslen); + +/*__owur*/ int EVP_DigestSignInit(EVP_MD_CTX *ctx, EVP_PKEY_CTX **pctx, + const EVP_MD *type, ENGINE *e, + EVP_PKEY *pkey); +__owur int EVP_DigestSignFinal(EVP_MD_CTX *ctx, unsigned char *sigret, + size_t *siglen); + +__owur int EVP_DigestVerifyInit(EVP_MD_CTX *ctx, EVP_PKEY_CTX **pctx, + const EVP_MD *type, ENGINE *e, + EVP_PKEY *pkey); +__owur int EVP_DigestVerifyFinal(EVP_MD_CTX *ctx, const unsigned char *sig, + size_t siglen); + +# ifndef OPENSSL_NO_RSA +__owur int EVP_OpenInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *type, + const unsigned char *ek, int ekl, + const unsigned char *iv, EVP_PKEY *priv); +__owur int EVP_OpenFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl); + +__owur int EVP_SealInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *type, + unsigned char **ek, int *ekl, unsigned char *iv, + EVP_PKEY **pubk, int npubk); +__owur int EVP_SealFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl); +# endif + +EVP_ENCODE_CTX *EVP_ENCODE_CTX_new(void); +void EVP_ENCODE_CTX_free(EVP_ENCODE_CTX *ctx); +int EVP_ENCODE_CTX_copy(EVP_ENCODE_CTX *dctx, EVP_ENCODE_CTX *sctx); +int EVP_ENCODE_CTX_num(EVP_ENCODE_CTX *ctx); +void EVP_EncodeInit(EVP_ENCODE_CTX *ctx); +int 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); + +# if OPENSSL_API_COMPAT < 0x10100000L +# define EVP_CIPHER_CTX_init(c) EVP_CIPHER_CTX_reset(c) +# define EVP_CIPHER_CTX_cleanup(c) EVP_CIPHER_CTX_reset(c) +# endif +EVP_CIPHER_CTX *EVP_CIPHER_CTX_new(void); +int EVP_CIPHER_CTX_reset(EVP_CIPHER_CTX *c); +void EVP_CIPHER_CTX_free(EVP_CIPHER_CTX *c); +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); + +const BIO_METHOD *BIO_f_md(void); +const BIO_METHOD *BIO_f_base64(void); +const BIO_METHOD *BIO_f_cipher(void); +const BIO_METHOD *BIO_f_reliable(void); +__owur int BIO_set_cipher(BIO *b, const EVP_CIPHER *c, const unsigned char *k, + const unsigned char *i, int enc); + +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); +const EVP_MD *EVP_md5_sha1(void); +# endif +# ifndef OPENSSL_NO_BLAKE2 +const EVP_MD *EVP_blake2b512(void); +const EVP_MD *EVP_blake2s256(void); +# endif +const EVP_MD *EVP_sha1(void); +const EVP_MD *EVP_sha224(void); +const EVP_MD *EVP_sha256(void); +const EVP_MD *EVP_sha384(void); +const EVP_MD *EVP_sha512(void); +const EVP_MD *EVP_sha512_224(void); +const EVP_MD *EVP_sha512_256(void); +const EVP_MD *EVP_sha3_224(void); +const EVP_MD *EVP_sha3_256(void); +const EVP_MD *EVP_sha3_384(void); +const EVP_MD *EVP_sha3_512(void); +const EVP_MD *EVP_shake128(void); +const EVP_MD *EVP_shake256(void); +# ifndef OPENSSL_NO_MDC2 +const EVP_MD *EVP_mdc2(void); +# endif +# ifndef OPENSSL_NO_RMD160 +const EVP_MD *EVP_ripemd160(void); +# endif +# ifndef OPENSSL_NO_WHIRLPOOL +const EVP_MD *EVP_whirlpool(void); +# endif +# ifndef OPENSSL_NO_SM3 +const EVP_MD *EVP_sm3(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 +const EVP_CIPHER *EVP_des_ede3_cfb64(void); +# define EVP_des_ede3_cfb EVP_des_ede3_cfb64 +const EVP_CIPHER *EVP_des_ede3_cfb1(void); +const EVP_CIPHER *EVP_des_ede3_cfb8(void); +const EVP_CIPHER *EVP_des_ofb(void); +const EVP_CIPHER *EVP_des_ede_ofb(void); +const EVP_CIPHER *EVP_des_ede3_ofb(void); +const EVP_CIPHER *EVP_des_cbc(void); +const EVP_CIPHER *EVP_des_ede_cbc(void); +const EVP_CIPHER *EVP_des_ede3_cbc(void); +const EVP_CIPHER *EVP_desx_cbc(void); +const EVP_CIPHER *EVP_des_ede3_wrap(void); +/* + * This should now be supported through the dev_crypto ENGINE. But also, why + * are rc4 and md5 declarations made here inside a "NO_DES" precompiler + * branch? + */ +# 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 +const EVP_CIPHER *EVP_aes_128_ecb(void); +const EVP_CIPHER *EVP_aes_128_cbc(void); +const EVP_CIPHER *EVP_aes_128_cfb1(void); +const EVP_CIPHER *EVP_aes_128_cfb8(void); +const EVP_CIPHER *EVP_aes_128_cfb128(void); +# define EVP_aes_128_cfb EVP_aes_128_cfb128 +const EVP_CIPHER *EVP_aes_128_ofb(void); +const EVP_CIPHER *EVP_aes_128_ctr(void); +const EVP_CIPHER *EVP_aes_128_ccm(void); +const EVP_CIPHER *EVP_aes_128_gcm(void); +const EVP_CIPHER *EVP_aes_128_xts(void); +const EVP_CIPHER *EVP_aes_128_wrap(void); +const EVP_CIPHER *EVP_aes_128_wrap_pad(void); +# ifndef OPENSSL_NO_OCB +const EVP_CIPHER *EVP_aes_128_ocb(void); +# endif +const EVP_CIPHER *EVP_aes_192_ecb(void); +const EVP_CIPHER *EVP_aes_192_cbc(void); +const EVP_CIPHER *EVP_aes_192_cfb1(void); +const EVP_CIPHER *EVP_aes_192_cfb8(void); +const EVP_CIPHER *EVP_aes_192_cfb128(void); +# define EVP_aes_192_cfb EVP_aes_192_cfb128 +const EVP_CIPHER *EVP_aes_192_ofb(void); +const EVP_CIPHER *EVP_aes_192_ctr(void); +const EVP_CIPHER *EVP_aes_192_ccm(void); +const EVP_CIPHER *EVP_aes_192_gcm(void); +const EVP_CIPHER *EVP_aes_192_wrap(void); +const EVP_CIPHER *EVP_aes_192_wrap_pad(void); +# ifndef OPENSSL_NO_OCB +const EVP_CIPHER *EVP_aes_192_ocb(void); +# endif +const EVP_CIPHER *EVP_aes_256_ecb(void); +const EVP_CIPHER *EVP_aes_256_cbc(void); +const EVP_CIPHER *EVP_aes_256_cfb1(void); +const EVP_CIPHER *EVP_aes_256_cfb8(void); +const EVP_CIPHER *EVP_aes_256_cfb128(void); +# define EVP_aes_256_cfb EVP_aes_256_cfb128 +const EVP_CIPHER *EVP_aes_256_ofb(void); +const EVP_CIPHER *EVP_aes_256_ctr(void); +const EVP_CIPHER *EVP_aes_256_ccm(void); +const EVP_CIPHER *EVP_aes_256_gcm(void); +const EVP_CIPHER *EVP_aes_256_xts(void); +const EVP_CIPHER *EVP_aes_256_wrap(void); +const EVP_CIPHER *EVP_aes_256_wrap_pad(void); +# ifndef OPENSSL_NO_OCB +const EVP_CIPHER *EVP_aes_256_ocb(void); +# endif +const EVP_CIPHER *EVP_aes_128_cbc_hmac_sha1(void); +const EVP_CIPHER *EVP_aes_256_cbc_hmac_sha1(void); +const EVP_CIPHER *EVP_aes_128_cbc_hmac_sha256(void); +const EVP_CIPHER *EVP_aes_256_cbc_hmac_sha256(void); +# ifndef OPENSSL_NO_ARIA +const EVP_CIPHER *EVP_aria_128_ecb(void); +const EVP_CIPHER *EVP_aria_128_cbc(void); +const EVP_CIPHER *EVP_aria_128_cfb1(void); +const EVP_CIPHER *EVP_aria_128_cfb8(void); +const EVP_CIPHER *EVP_aria_128_cfb128(void); +# define EVP_aria_128_cfb EVP_aria_128_cfb128 +const EVP_CIPHER *EVP_aria_128_ctr(void); +const EVP_CIPHER *EVP_aria_128_ofb(void); +const EVP_CIPHER *EVP_aria_128_gcm(void); +const EVP_CIPHER *EVP_aria_128_ccm(void); +const EVP_CIPHER *EVP_aria_192_ecb(void); +const EVP_CIPHER *EVP_aria_192_cbc(void); +const EVP_CIPHER *EVP_aria_192_cfb1(void); +const EVP_CIPHER *EVP_aria_192_cfb8(void); +const EVP_CIPHER *EVP_aria_192_cfb128(void); +# define EVP_aria_192_cfb EVP_aria_192_cfb128 +const EVP_CIPHER *EVP_aria_192_ctr(void); +const EVP_CIPHER *EVP_aria_192_ofb(void); +const EVP_CIPHER *EVP_aria_192_gcm(void); +const EVP_CIPHER *EVP_aria_192_ccm(void); +const EVP_CIPHER *EVP_aria_256_ecb(void); +const EVP_CIPHER *EVP_aria_256_cbc(void); +const EVP_CIPHER *EVP_aria_256_cfb1(void); +const EVP_CIPHER *EVP_aria_256_cfb8(void); +const EVP_CIPHER *EVP_aria_256_cfb128(void); +# define EVP_aria_256_cfb EVP_aria_256_cfb128 +const EVP_CIPHER *EVP_aria_256_ctr(void); +const EVP_CIPHER *EVP_aria_256_ofb(void); +const EVP_CIPHER *EVP_aria_256_gcm(void); +const EVP_CIPHER *EVP_aria_256_ccm(void); +# 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_128_ctr(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_192_ctr(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); +const EVP_CIPHER *EVP_camellia_256_ctr(void); +# endif +# ifndef OPENSSL_NO_CHACHA +const EVP_CIPHER *EVP_chacha20(void); +# ifndef OPENSSL_NO_POLY1305 +const EVP_CIPHER *EVP_chacha20_poly1305(void); +# endif +# 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 + +# ifndef OPENSSL_NO_SM4 +const EVP_CIPHER *EVP_sm4_ecb(void); +const EVP_CIPHER *EVP_sm4_cbc(void); +const EVP_CIPHER *EVP_sm4_cfb128(void); +# define EVP_sm4_cfb EVP_sm4_cfb128 +const EVP_CIPHER *EVP_sm4_ofb(void); +const EVP_CIPHER *EVP_sm4_ctr(void); +# endif + +# if OPENSSL_API_COMPAT < 0x10100000L +# define OPENSSL_add_all_algorithms_conf() \ + OPENSSL_init_crypto(OPENSSL_INIT_ADD_ALL_CIPHERS \ + | OPENSSL_INIT_ADD_ALL_DIGESTS \ + | OPENSSL_INIT_LOAD_CONFIG, NULL) +# define OPENSSL_add_all_algorithms_noconf() \ + OPENSSL_init_crypto(OPENSSL_INIT_ADD_ALL_CIPHERS \ + | OPENSSL_INIT_ADD_ALL_DIGESTS, NULL) + +# 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 + +# define OpenSSL_add_all_ciphers() \ + OPENSSL_init_crypto(OPENSSL_INIT_ADD_ALL_CIPHERS, NULL) +# define OpenSSL_add_all_digests() \ + OPENSSL_init_crypto(OPENSSL_INIT_ADD_ALL_DIGESTS, NULL) + +# define EVP_cleanup() while(0) continue +# endif + +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_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(const EVP_PKEY *pkey); +int EVP_PKEY_security_bits(const EVP_PKEY *pkey); +int EVP_PKEY_size(const 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_set_alias_type(EVP_PKEY *pkey, int type); +# ifndef OPENSSL_NO_ENGINE +int EVP_PKEY_set1_engine(EVP_PKEY *pkey, ENGINE *e); +ENGINE *EVP_PKEY_get0_engine(const EVP_PKEY *pkey); +# endif +int EVP_PKEY_assign(EVP_PKEY *pkey, int type, void *key); +void *EVP_PKEY_get0(const EVP_PKEY *pkey); +const unsigned char *EVP_PKEY_get0_hmac(const EVP_PKEY *pkey, size_t *len); +# ifndef OPENSSL_NO_POLY1305 +const unsigned char *EVP_PKEY_get0_poly1305(const EVP_PKEY *pkey, size_t *len); +# endif +# ifndef OPENSSL_NO_SIPHASH +const unsigned char *EVP_PKEY_get0_siphash(const EVP_PKEY *pkey, size_t *len); +# endif + +# ifndef OPENSSL_NO_RSA +struct rsa_st; +int EVP_PKEY_set1_RSA(EVP_PKEY *pkey, struct rsa_st *key); +struct rsa_st *EVP_PKEY_get0_RSA(EVP_PKEY *pkey); +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_get0_DSA(EVP_PKEY *pkey); +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_get0_DH(EVP_PKEY *pkey); +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_get0_EC_KEY(EVP_PKEY *pkey); +struct ec_key_st *EVP_PKEY_get1_EC_KEY(EVP_PKEY *pkey); +# endif + +EVP_PKEY *EVP_PKEY_new(void); +int EVP_PKEY_up_ref(EVP_PKEY *pkey); +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_PKEY_set1_tls_encodedpoint(EVP_PKEY *pkey, + const unsigned char *pt, size_t ptlen); +size_t EVP_PKEY_get1_tls_encodedpoint(EVP_PKEY *pkey, unsigned char **ppt); + +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); + +#ifndef OPENSSL_NO_SCRYPT +int EVP_PBE_scrypt(const char *pass, size_t passlen, + const unsigned char *salt, size_t saltlen, + uint64_t N, uint64_t r, uint64_t p, uint64_t maxmem, + unsigned char *key, size_t keylen); + +int PKCS5_v2_scrypt_keyivgen(EVP_CIPHER_CTX *ctx, const char *pass, + int passlen, ASN1_TYPE *param, + const EVP_CIPHER *c, const EVP_MD *md, int en_de); +#endif + +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 +/* Is a PKCS#5 v2.0 KDF */ +# define EVP_PBE_TYPE_KDF 0x2 + +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); +int EVP_PBE_get(int *ptype, int *ppbe_nid, size_t num); + +# define ASN1_PKEY_ALIAS 0x1 +# define ASN1_PKEY_DYNAMIC 0x2 +# define ASN1_PKEY_SIGPARAM_NULL 0x4 + +# define ASN1_PKEY_CTRL_PKCS7_SIGN 0x1 +# define ASN1_PKEY_CTRL_PKCS7_ENCRYPT 0x2 +# define ASN1_PKEY_CTRL_DEFAULT_MD_NID 0x3 +# define ASN1_PKEY_CTRL_CMS_SIGN 0x5 +# define ASN1_PKEY_CTRL_CMS_ENVELOPE 0x7 +# define ASN1_PKEY_CTRL_CMS_RI_TYPE 0x8 + +# define ASN1_PKEY_CTRL_SET1_TLS_ENCPT 0x9 +# define ASN1_PKEY_CTRL_GET1_TLS_ENCPT 0xa + +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(const 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, + const 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)); +void EVP_PKEY_asn1_set_item(EVP_PKEY_ASN1_METHOD *ameth, + int (*item_verify) (EVP_MD_CTX *ctx, + const ASN1_ITEM *it, + void *asn, + X509_ALGOR *a, + ASN1_BIT_STRING *sig, + EVP_PKEY *pkey), + int (*item_sign) (EVP_MD_CTX *ctx, + const ASN1_ITEM *it, + void *asn, + X509_ALGOR *alg1, + X509_ALGOR *alg2, + ASN1_BIT_STRING *sig)); + +void EVP_PKEY_asn1_set_siginf(EVP_PKEY_ASN1_METHOD *ameth, + int (*siginf_set) (X509_SIG_INFO *siginf, + const X509_ALGOR *alg, + const ASN1_STRING *sig)); + +void EVP_PKEY_asn1_set_check(EVP_PKEY_ASN1_METHOD *ameth, + int (*pkey_check) (const EVP_PKEY *pk)); + +void EVP_PKEY_asn1_set_public_check(EVP_PKEY_ASN1_METHOD *ameth, + int (*pkey_pub_check) (const EVP_PKEY *pk)); + +void EVP_PKEY_asn1_set_param_check(EVP_PKEY_ASN1_METHOD *ameth, + int (*pkey_param_check) (const EVP_PKEY *pk)); + +void EVP_PKEY_asn1_set_set_priv_key(EVP_PKEY_ASN1_METHOD *ameth, + int (*set_priv_key) (EVP_PKEY *pk, + const unsigned char + *priv, + size_t len)); +void EVP_PKEY_asn1_set_set_pub_key(EVP_PKEY_ASN1_METHOD *ameth, + int (*set_pub_key) (EVP_PKEY *pk, + const unsigned char *pub, + size_t len)); +void EVP_PKEY_asn1_set_get_priv_key(EVP_PKEY_ASN1_METHOD *ameth, + int (*get_priv_key) (const EVP_PKEY *pk, + unsigned char *priv, + size_t *len)); +void EVP_PKEY_asn1_set_get_pub_key(EVP_PKEY_ASN1_METHOD *ameth, + int (*get_pub_key) (const EVP_PKEY *pk, + unsigned char *pub, + size_t *len)); + +void EVP_PKEY_asn1_set_security_bits(EVP_PKEY_ASN1_METHOD *ameth, + int (*pkey_security_bits) (const EVP_PKEY + *pk)); + +# 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_TYPE_SIG | EVP_PKEY_OP_TYPE_CRYPT | EVP_PKEY_OP_DERIVE) + +# define EVP_PKEY_OP_TYPE_GEN \ + (EVP_PKEY_OP_PARAMGEN | EVP_PKEY_OP_KEYGEN) + +# define EVP_PKEY_CTX_set_signature_md(ctx, md) \ + EVP_PKEY_CTX_ctrl(ctx, -1, EVP_PKEY_OP_TYPE_SIG, \ + EVP_PKEY_CTRL_MD, 0, (void *)(md)) + +# define EVP_PKEY_CTX_get_signature_md(ctx, pmd) \ + EVP_PKEY_CTX_ctrl(ctx, -1, EVP_PKEY_OP_TYPE_SIG, \ + EVP_PKEY_CTRL_GET_MD, 0, (void *)(pmd)) + +# define EVP_PKEY_CTX_set_mac_key(ctx, key, len) \ + EVP_PKEY_CTX_ctrl(ctx, -1, EVP_PKEY_OP_KEYGEN, \ + EVP_PKEY_CTRL_SET_MAC_KEY, len, (void *)(key)) + +# define EVP_PKEY_CTRL_MD 1 +# define EVP_PKEY_CTRL_PEER_KEY 2 + +# define EVP_PKEY_CTRL_PKCS7_ENCRYPT 3 +# define EVP_PKEY_CTRL_PKCS7_DECRYPT 4 + +# define EVP_PKEY_CTRL_PKCS7_SIGN 5 + +# define EVP_PKEY_CTRL_SET_MAC_KEY 6 + +# define EVP_PKEY_CTRL_DIGESTINIT 7 + +/* Used by GOST key encryption in TLS */ +# define EVP_PKEY_CTRL_SET_IV 8 + +# define EVP_PKEY_CTRL_CMS_ENCRYPT 9 +# define EVP_PKEY_CTRL_CMS_DECRYPT 10 +# define EVP_PKEY_CTRL_CMS_SIGN 11 + +# define EVP_PKEY_CTRL_CIPHER 12 + +# define EVP_PKEY_CTRL_GET_MD 13 + +# define EVP_PKEY_CTRL_SET_DIGEST_SIZE 14 + +# 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); +int EVP_PKEY_meth_remove(const EVP_PKEY_METHOD *pmeth); +size_t EVP_PKEY_meth_get_count(void); +const EVP_PKEY_METHOD *EVP_PKEY_meth_get0(size_t idx); + +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_ctrl_uint64(EVP_PKEY_CTX *ctx, int keytype, int optype, + int cmd, uint64_t value); + +int EVP_PKEY_CTX_str2ctrl(EVP_PKEY_CTX *ctx, int cmd, const char *str); +int EVP_PKEY_CTX_hex2ctrl(EVP_PKEY_CTX *ctx, int cmd, const char *hex); + +int EVP_PKEY_CTX_md(EVP_PKEY_CTX *ctx, int optype, int cmd, const char *md); + +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); +EVP_PKEY *EVP_PKEY_new_raw_private_key(int type, ENGINE *e, + const unsigned char *priv, + size_t len); +EVP_PKEY *EVP_PKEY_new_raw_public_key(int type, ENGINE *e, + const unsigned char *pub, + size_t len); +int EVP_PKEY_get_raw_private_key(const EVP_PKEY *pkey, unsigned char *priv, + size_t *len); +int EVP_PKEY_get_raw_public_key(const EVP_PKEY *pkey, unsigned char *pub, + size_t *len); + +EVP_PKEY *EVP_PKEY_new_CMAC_key(ENGINE *e, const unsigned char *priv, + size_t len, const EVP_CIPHER *cipher); + +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); +int EVP_PKEY_check(EVP_PKEY_CTX *ctx); +int EVP_PKEY_public_check(EVP_PKEY_CTX *ctx); +int EVP_PKEY_param_check(EVP_PKEY_CTX *ctx); + +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_PKEY_meth_set_digestsign(EVP_PKEY_METHOD *pmeth, + int (*digestsign) (EVP_MD_CTX *ctx, + unsigned char *sig, + size_t *siglen, + const unsigned char *tbs, + size_t tbslen)); + +void EVP_PKEY_meth_set_digestverify(EVP_PKEY_METHOD *pmeth, + int (*digestverify) (EVP_MD_CTX *ctx, + const unsigned char *sig, + size_t siglen, + const unsigned char *tbs, + size_t tbslen)); + +void EVP_PKEY_meth_set_check(EVP_PKEY_METHOD *pmeth, + int (*check) (EVP_PKEY *pkey)); + +void EVP_PKEY_meth_set_public_check(EVP_PKEY_METHOD *pmeth, + int (*check) (EVP_PKEY *pkey)); + +void EVP_PKEY_meth_set_param_check(EVP_PKEY_METHOD *pmeth, + int (*check) (EVP_PKEY *pkey)); + +void EVP_PKEY_meth_set_digest_custom(EVP_PKEY_METHOD *pmeth, + int (*digest_custom) (EVP_PKEY_CTX *ctx, + EVP_MD_CTX *mctx)); + +void EVP_PKEY_meth_get_init(const EVP_PKEY_METHOD *pmeth, + int (**pinit) (EVP_PKEY_CTX *ctx)); + +void EVP_PKEY_meth_get_copy(const EVP_PKEY_METHOD *pmeth, + int (**pcopy) (EVP_PKEY_CTX *dst, + EVP_PKEY_CTX *src)); + +void EVP_PKEY_meth_get_cleanup(const EVP_PKEY_METHOD *pmeth, + void (**pcleanup) (EVP_PKEY_CTX *ctx)); + +void EVP_PKEY_meth_get_paramgen(const EVP_PKEY_METHOD *pmeth, + int (**pparamgen_init) (EVP_PKEY_CTX *ctx), + int (**pparamgen) (EVP_PKEY_CTX *ctx, + EVP_PKEY *pkey)); + +void EVP_PKEY_meth_get_keygen(const EVP_PKEY_METHOD *pmeth, + int (**pkeygen_init) (EVP_PKEY_CTX *ctx), + int (**pkeygen) (EVP_PKEY_CTX *ctx, + EVP_PKEY *pkey)); + +void EVP_PKEY_meth_get_sign(const EVP_PKEY_METHOD *pmeth, + int (**psign_init) (EVP_PKEY_CTX *ctx), + int (**psign) (EVP_PKEY_CTX *ctx, + unsigned char *sig, size_t *siglen, + const unsigned char *tbs, + size_t tbslen)); + +void EVP_PKEY_meth_get_verify(const EVP_PKEY_METHOD *pmeth, + int (**pverify_init) (EVP_PKEY_CTX *ctx), + int (**pverify) (EVP_PKEY_CTX *ctx, + const unsigned char *sig, + size_t siglen, + const unsigned char *tbs, + size_t tbslen)); + +void EVP_PKEY_meth_get_verify_recover(const EVP_PKEY_METHOD *pmeth, + int (**pverify_recover_init) (EVP_PKEY_CTX + *ctx), + int (**pverify_recover) (EVP_PKEY_CTX + *ctx, + unsigned char + *sig, + size_t *siglen, + const unsigned + char *tbs, + size_t tbslen)); + +void EVP_PKEY_meth_get_signctx(const EVP_PKEY_METHOD *pmeth, + int (**psignctx_init) (EVP_PKEY_CTX *ctx, + EVP_MD_CTX *mctx), + int (**psignctx) (EVP_PKEY_CTX *ctx, + unsigned char *sig, + size_t *siglen, + EVP_MD_CTX *mctx)); + +void EVP_PKEY_meth_get_verifyctx(const EVP_PKEY_METHOD *pmeth, + int (**pverifyctx_init) (EVP_PKEY_CTX *ctx, + EVP_MD_CTX *mctx), + int (**pverifyctx) (EVP_PKEY_CTX *ctx, + const unsigned char *sig, + int siglen, + EVP_MD_CTX *mctx)); + +void EVP_PKEY_meth_get_encrypt(const EVP_PKEY_METHOD *pmeth, + int (**pencrypt_init) (EVP_PKEY_CTX *ctx), + int (**pencryptfn) (EVP_PKEY_CTX *ctx, + unsigned char *out, + size_t *outlen, + const unsigned char *in, + size_t inlen)); + +void EVP_PKEY_meth_get_decrypt(const EVP_PKEY_METHOD *pmeth, + int (**pdecrypt_init) (EVP_PKEY_CTX *ctx), + int (**pdecrypt) (EVP_PKEY_CTX *ctx, + unsigned char *out, + size_t *outlen, + const unsigned char *in, + size_t inlen)); + +void EVP_PKEY_meth_get_derive(const EVP_PKEY_METHOD *pmeth, + int (**pderive_init) (EVP_PKEY_CTX *ctx), + int (**pderive) (EVP_PKEY_CTX *ctx, + unsigned char *key, + size_t *keylen)); + +void EVP_PKEY_meth_get_ctrl(const EVP_PKEY_METHOD *pmeth, + int (**pctrl) (EVP_PKEY_CTX *ctx, int type, int p1, + void *p2), + int (**pctrl_str) (EVP_PKEY_CTX *ctx, + const char *type, + const char *value)); + +void EVP_PKEY_meth_get_digestsign(EVP_PKEY_METHOD *pmeth, + int (**digestsign) (EVP_MD_CTX *ctx, + unsigned char *sig, + size_t *siglen, + const unsigned char *tbs, + size_t tbslen)); + +void EVP_PKEY_meth_get_digestverify(EVP_PKEY_METHOD *pmeth, + int (**digestverify) (EVP_MD_CTX *ctx, + const unsigned char *sig, + size_t siglen, + const unsigned char *tbs, + size_t tbslen)); + +void EVP_PKEY_meth_get_check(const EVP_PKEY_METHOD *pmeth, + int (**pcheck) (EVP_PKEY *pkey)); + +void EVP_PKEY_meth_get_public_check(const EVP_PKEY_METHOD *pmeth, + int (**pcheck) (EVP_PKEY *pkey)); + +void EVP_PKEY_meth_get_param_check(const EVP_PKEY_METHOD *pmeth, + int (**pcheck) (EVP_PKEY *pkey)); + +void EVP_PKEY_meth_get_digest_custom(EVP_PKEY_METHOD *pmeth, + int (**pdigest_custom) (EVP_PKEY_CTX *ctx, + EVP_MD_CTX *mctx)); +void EVP_add_alg_module(void); + + +# ifdef __cplusplus +} +# endif +#endif diff --git a/openssl-wasm/include/openssl/evperr.h b/openssl-wasm/include/openssl/evperr.h new file mode 100644 index 0000000..b4ea90a --- /dev/null +++ b/openssl-wasm/include/openssl/evperr.h @@ -0,0 +1,204 @@ +/* + * Generated by util/mkerr.pl DO NOT EDIT + * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_EVPERR_H +# define HEADER_EVPERR_H + +# include + +# ifdef __cplusplus +extern "C" +# endif +int ERR_load_EVP_strings(void); + +/* + * EVP function codes. + */ +# define EVP_F_AESNI_INIT_KEY 165 +# define EVP_F_AESNI_XTS_INIT_KEY 207 +# define EVP_F_AES_GCM_CTRL 196 +# define EVP_F_AES_INIT_KEY 133 +# define EVP_F_AES_OCB_CIPHER 169 +# define EVP_F_AES_T4_INIT_KEY 178 +# define EVP_F_AES_T4_XTS_INIT_KEY 208 +# define EVP_F_AES_WRAP_CIPHER 170 +# define EVP_F_AES_XTS_INIT_KEY 209 +# define EVP_F_ALG_MODULE_INIT 177 +# define EVP_F_ARIA_CCM_INIT_KEY 175 +# define EVP_F_ARIA_GCM_CTRL 197 +# define EVP_F_ARIA_GCM_INIT_KEY 176 +# define EVP_F_ARIA_INIT_KEY 185 +# define EVP_F_B64_NEW 198 +# define EVP_F_CAMELLIA_INIT_KEY 159 +# define EVP_F_CHACHA20_POLY1305_CTRL 182 +# define EVP_F_CMLL_T4_INIT_KEY 179 +# define EVP_F_DES_EDE3_WRAP_CIPHER 171 +# define EVP_F_DO_SIGVER_INIT 161 +# define EVP_F_ENC_NEW 199 +# define EVP_F_EVP_CIPHERINIT_EX 123 +# define EVP_F_EVP_CIPHER_ASN1_TO_PARAM 204 +# 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_CIPHER_PARAM_TO_ASN1 205 +# define EVP_F_EVP_DECRYPTFINAL_EX 101 +# define EVP_F_EVP_DECRYPTUPDATE 166 +# define EVP_F_EVP_DIGESTFINALXOF 174 +# define EVP_F_EVP_DIGESTINIT_EX 128 +# define EVP_F_EVP_ENCRYPTDECRYPTUPDATE 219 +# define EVP_F_EVP_ENCRYPTFINAL_EX 127 +# define EVP_F_EVP_ENCRYPTUPDATE 167 +# 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_PBE_SCRYPT 181 +# define EVP_F_EVP_PKCS82PKEY 111 +# define EVP_F_EVP_PKEY2PKCS8 113 +# define EVP_F_EVP_PKEY_ASN1_ADD0 188 +# define EVP_F_EVP_PKEY_CHECK 186 +# 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_CTX_MD 168 +# 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_GET0_DH 119 +# define EVP_F_EVP_PKEY_GET0_DSA 120 +# define EVP_F_EVP_PKEY_GET0_EC_KEY 131 +# define EVP_F_EVP_PKEY_GET0_HMAC 183 +# define EVP_F_EVP_PKEY_GET0_POLY1305 184 +# define EVP_F_EVP_PKEY_GET0_RSA 121 +# define EVP_F_EVP_PKEY_GET0_SIPHASH 172 +# define EVP_F_EVP_PKEY_GET_RAW_PRIVATE_KEY 202 +# define EVP_F_EVP_PKEY_GET_RAW_PUBLIC_KEY 203 +# define EVP_F_EVP_PKEY_KEYGEN 146 +# define EVP_F_EVP_PKEY_KEYGEN_INIT 147 +# define EVP_F_EVP_PKEY_METH_ADD0 194 +# define EVP_F_EVP_PKEY_METH_NEW 195 +# define EVP_F_EVP_PKEY_NEW 106 +# define EVP_F_EVP_PKEY_NEW_CMAC_KEY 193 +# define EVP_F_EVP_PKEY_NEW_RAW_PRIVATE_KEY 191 +# define EVP_F_EVP_PKEY_NEW_RAW_PUBLIC_KEY 192 +# define EVP_F_EVP_PKEY_PARAMGEN 148 +# define EVP_F_EVP_PKEY_PARAMGEN_INIT 149 +# define EVP_F_EVP_PKEY_PARAM_CHECK 189 +# define EVP_F_EVP_PKEY_PUBLIC_CHECK 190 +# define EVP_F_EVP_PKEY_SET1_ENGINE 187 +# define EVP_F_EVP_PKEY_SET_ALIAS_TYPE 206 +# 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_SIGNFINAL 107 +# define EVP_F_EVP_VERIFYFINAL 108 +# define EVP_F_INT_CTX_NEW 157 +# define EVP_F_OK_NEW 200 +# 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_PKCS5_V2_SCRYPT_KEYIVGEN 180 +# define EVP_F_PKEY_SET_TYPE 158 +# define EVP_F_RC2_MAGIC_TO_METH 109 +# define EVP_F_RC5_CTRL 125 +# define EVP_F_R_32_12_16_INIT_KEY 242 +# define EVP_F_S390X_AES_GCM_CTRL 201 +# define EVP_F_UPDATE 173 + +/* + * EVP reason codes. + */ +# define EVP_R_AES_KEY_SETUP_FAILED 143 +# define EVP_R_ARIA_KEY_SETUP_FAILED 176 +# define EVP_R_BAD_DECRYPT 100 +# define EVP_R_BAD_KEY_LENGTH 195 +# 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_COPY_ERROR 173 +# 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_ERROR_LOADING_SECTION 165 +# define EVP_R_ERROR_SETTING_FIPS_MODE 166 +# define EVP_R_EXPECTING_AN_HMAC_KEY 174 +# 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_EC_KEY 142 +# define EVP_R_EXPECTING_A_POLY1305_KEY 164 +# define EVP_R_EXPECTING_A_SIPHASH_KEY 175 +# define EVP_R_FIPS_MODE_NOT_SUPPORTED 167 +# define EVP_R_GET_RAW_KEY_FAILED 182 +# define EVP_R_ILLEGAL_SCRYPT_PARAMETERS 171 +# 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_IV_LENGTH 194 +# define EVP_R_INVALID_KEY 163 +# define EVP_R_INVALID_KEY_LENGTH 130 +# define EVP_R_INVALID_OPERATION 148 +# define EVP_R_KEYGEN_FAILURE 120 +# define EVP_R_KEY_SETUP_FAILED 180 +# define EVP_R_MEMORY_LIMIT_EXCEEDED 172 +# define EVP_R_MESSAGE_DIGEST_IS_NULL 159 +# define EVP_R_METHOD_NOT_SUPPORTED 144 +# define EVP_R_MISSING_PARAMETERS 103 +# define EVP_R_NOT_XOF_OR_INVALID_LENGTH 178 +# 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_KEY_SET 154 +# define EVP_R_NO_OPERATION_SET 149 +# define EVP_R_ONLY_ONESHOT_SUPPORTED 177 +# define EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE 150 +# define EVP_R_OPERATON_NOT_INITIALIZED 151 +# define EVP_R_OUTPUT_WOULD_OVERFLOW 184 +# define EVP_R_PARTIALLY_OVERLAPPING 162 +# define EVP_R_PBKDF2_ERROR 181 +# define EVP_R_PKEY_APPLICATION_ASN1_METHOD_ALREADY_REGISTERED 179 +# 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_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_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_NUMBER_OF_ROUNDS 135 +# define EVP_R_UNSUPPORTED_PRF 125 +# define EVP_R_UNSUPPORTED_PRIVATE_KEY_ALGORITHM 118 +# define EVP_R_UNSUPPORTED_SALT_TYPE 126 +# define EVP_R_WRAP_MODE_NOT_ALLOWED 170 +# define EVP_R_WRONG_FINAL_BLOCK_LENGTH 109 +# define EVP_R_XTS_DUPLICATED_KEYS 183 + +#endif diff --git a/openssl-wasm/include/openssl/hmac.h b/openssl-wasm/include/openssl/hmac.h new file mode 100644 index 0000000..458efc1 --- /dev/null +++ b/openssl-wasm/include/openssl/hmac.h @@ -0,0 +1,51 @@ +/* + * Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_HMAC_H +# define HEADER_HMAC_H + +# include + +# include + +# if OPENSSL_API_COMPAT < 0x10200000L +# define HMAC_MAX_MD_CBLOCK 128 /* Deprecated */ +# endif + +#ifdef __cplusplus +extern "C" { +#endif + +size_t HMAC_size(const HMAC_CTX *e); +HMAC_CTX *HMAC_CTX_new(void); +int HMAC_CTX_reset(HMAC_CTX *ctx); +void HMAC_CTX_free(HMAC_CTX *ctx); + +DEPRECATEDIN_1_1_0(__owur int HMAC_Init(HMAC_CTX *ctx, const void *key, int len, + const EVP_MD *md)) + +/*__owur*/ int HMAC_Init_ex(HMAC_CTX *ctx, const void *key, int len, + const EVP_MD *md, ENGINE *impl); +/*__owur*/ int HMAC_Update(HMAC_CTX *ctx, const unsigned char *data, + size_t len); +/*__owur*/ 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); +__owur int HMAC_CTX_copy(HMAC_CTX *dctx, HMAC_CTX *sctx); + +void HMAC_CTX_set_flags(HMAC_CTX *ctx, unsigned long flags); +const EVP_MD *HMAC_CTX_get_md(const HMAC_CTX *ctx); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/openssl-wasm/include/openssl/idea.h b/openssl-wasm/include/openssl/idea.h new file mode 100644 index 0000000..4334f3e --- /dev/null +++ b/openssl-wasm/include/openssl/idea.h @@ -0,0 +1,64 @@ +/* + * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_IDEA_H +# define HEADER_IDEA_H + +# include + +# ifndef OPENSSL_NO_IDEA +# ifdef __cplusplus +extern "C" { +# endif + +typedef unsigned int IDEA_INT; + +# define IDEA_ENCRYPT 1 +# define IDEA_DECRYPT 0 + +# define IDEA_BLOCK 8 +# define IDEA_KEY_LENGTH 16 + +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); +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); + +# if OPENSSL_API_COMPAT < 0x10100000L +# define idea_options IDEA_options +# define idea_ecb_encrypt IDEA_ecb_encrypt +# define idea_set_encrypt_key IDEA_set_encrypt_key +# define idea_set_decrypt_key IDEA_set_decrypt_key +# define idea_cbc_encrypt IDEA_cbc_encrypt +# define idea_cfb64_encrypt IDEA_cfb64_encrypt +# define idea_ofb64_encrypt IDEA_ofb64_encrypt +# define idea_encrypt IDEA_encrypt +# endif + +# ifdef __cplusplus +} +# endif +# endif + +#endif diff --git a/openssl-wasm/include/openssl/kdf.h b/openssl-wasm/include/openssl/kdf.h new file mode 100644 index 0000000..5abd4c3 --- /dev/null +++ b/openssl-wasm/include/openssl/kdf.h @@ -0,0 +1,97 @@ +/* + * Copyright 2016-2018 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_KDF_H +# define HEADER_KDF_H + +# include +#ifdef __cplusplus +extern "C" { +#endif + +# define EVP_PKEY_CTRL_TLS_MD (EVP_PKEY_ALG_CTRL) +# define EVP_PKEY_CTRL_TLS_SECRET (EVP_PKEY_ALG_CTRL + 1) +# define EVP_PKEY_CTRL_TLS_SEED (EVP_PKEY_ALG_CTRL + 2) +# define EVP_PKEY_CTRL_HKDF_MD (EVP_PKEY_ALG_CTRL + 3) +# define EVP_PKEY_CTRL_HKDF_SALT (EVP_PKEY_ALG_CTRL + 4) +# define EVP_PKEY_CTRL_HKDF_KEY (EVP_PKEY_ALG_CTRL + 5) +# define EVP_PKEY_CTRL_HKDF_INFO (EVP_PKEY_ALG_CTRL + 6) +# define EVP_PKEY_CTRL_HKDF_MODE (EVP_PKEY_ALG_CTRL + 7) +# define EVP_PKEY_CTRL_PASS (EVP_PKEY_ALG_CTRL + 8) +# define EVP_PKEY_CTRL_SCRYPT_SALT (EVP_PKEY_ALG_CTRL + 9) +# define EVP_PKEY_CTRL_SCRYPT_N (EVP_PKEY_ALG_CTRL + 10) +# define EVP_PKEY_CTRL_SCRYPT_R (EVP_PKEY_ALG_CTRL + 11) +# define EVP_PKEY_CTRL_SCRYPT_P (EVP_PKEY_ALG_CTRL + 12) +# define EVP_PKEY_CTRL_SCRYPT_MAXMEM_BYTES (EVP_PKEY_ALG_CTRL + 13) + +# define EVP_PKEY_HKDEF_MODE_EXTRACT_AND_EXPAND 0 +# define EVP_PKEY_HKDEF_MODE_EXTRACT_ONLY 1 +# define EVP_PKEY_HKDEF_MODE_EXPAND_ONLY 2 + +# define EVP_PKEY_CTX_set_tls1_prf_md(pctx, md) \ + EVP_PKEY_CTX_ctrl(pctx, -1, EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_TLS_MD, 0, (void *)(md)) + +# define EVP_PKEY_CTX_set1_tls1_prf_secret(pctx, sec, seclen) \ + EVP_PKEY_CTX_ctrl(pctx, -1, EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_TLS_SECRET, seclen, (void *)(sec)) + +# define EVP_PKEY_CTX_add1_tls1_prf_seed(pctx, seed, seedlen) \ + EVP_PKEY_CTX_ctrl(pctx, -1, EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_TLS_SEED, seedlen, (void *)(seed)) + +# define EVP_PKEY_CTX_set_hkdf_md(pctx, md) \ + EVP_PKEY_CTX_ctrl(pctx, -1, EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_HKDF_MD, 0, (void *)(md)) + +# define EVP_PKEY_CTX_set1_hkdf_salt(pctx, salt, saltlen) \ + EVP_PKEY_CTX_ctrl(pctx, -1, EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_HKDF_SALT, saltlen, (void *)(salt)) + +# define EVP_PKEY_CTX_set1_hkdf_key(pctx, key, keylen) \ + EVP_PKEY_CTX_ctrl(pctx, -1, EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_HKDF_KEY, keylen, (void *)(key)) + +# define EVP_PKEY_CTX_add1_hkdf_info(pctx, info, infolen) \ + EVP_PKEY_CTX_ctrl(pctx, -1, EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_HKDF_INFO, infolen, (void *)(info)) + +# define EVP_PKEY_CTX_hkdf_mode(pctx, mode) \ + EVP_PKEY_CTX_ctrl(pctx, -1, EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_HKDF_MODE, mode, NULL) + +# define EVP_PKEY_CTX_set1_pbe_pass(pctx, pass, passlen) \ + EVP_PKEY_CTX_ctrl(pctx, -1, EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_PASS, passlen, (void *)(pass)) + +# define EVP_PKEY_CTX_set1_scrypt_salt(pctx, salt, saltlen) \ + EVP_PKEY_CTX_ctrl(pctx, -1, EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_SCRYPT_SALT, saltlen, (void *)(salt)) + +# define EVP_PKEY_CTX_set_scrypt_N(pctx, n) \ + EVP_PKEY_CTX_ctrl_uint64(pctx, -1, EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_SCRYPT_N, n) + +# define EVP_PKEY_CTX_set_scrypt_r(pctx, r) \ + EVP_PKEY_CTX_ctrl_uint64(pctx, -1, EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_SCRYPT_R, r) + +# define EVP_PKEY_CTX_set_scrypt_p(pctx, p) \ + EVP_PKEY_CTX_ctrl_uint64(pctx, -1, EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_SCRYPT_P, p) + +# define EVP_PKEY_CTX_set_scrypt_maxmem_bytes(pctx, maxmem_bytes) \ + EVP_PKEY_CTX_ctrl_uint64(pctx, -1, EVP_PKEY_OP_DERIVE, \ + EVP_PKEY_CTRL_SCRYPT_MAXMEM_BYTES, maxmem_bytes) + + +# ifdef __cplusplus +} +# endif +#endif diff --git a/openssl-wasm/include/openssl/kdferr.h b/openssl-wasm/include/openssl/kdferr.h new file mode 100644 index 0000000..3f51bd0 --- /dev/null +++ b/openssl-wasm/include/openssl/kdferr.h @@ -0,0 +1,55 @@ +/* + * Generated by util/mkerr.pl DO NOT EDIT + * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_KDFERR_H +# define HEADER_KDFERR_H + +# ifndef HEADER_SYMHACKS_H +# include +# endif + +# ifdef __cplusplus +extern "C" +# endif +int ERR_load_KDF_strings(void); + +/* + * KDF function codes. + */ +# define KDF_F_PKEY_HKDF_CTRL_STR 103 +# define KDF_F_PKEY_HKDF_DERIVE 102 +# define KDF_F_PKEY_HKDF_INIT 108 +# define KDF_F_PKEY_SCRYPT_CTRL_STR 104 +# define KDF_F_PKEY_SCRYPT_CTRL_UINT64 105 +# define KDF_F_PKEY_SCRYPT_DERIVE 109 +# define KDF_F_PKEY_SCRYPT_INIT 106 +# define KDF_F_PKEY_SCRYPT_SET_MEMBUF 107 +# define KDF_F_PKEY_TLS1_PRF_CTRL_STR 100 +# define KDF_F_PKEY_TLS1_PRF_DERIVE 101 +# define KDF_F_PKEY_TLS1_PRF_INIT 110 +# define KDF_F_TLS1_PRF_ALG 111 + +/* + * KDF reason codes. + */ +# define KDF_R_INVALID_DIGEST 100 +# define KDF_R_MISSING_ITERATION_COUNT 109 +# define KDF_R_MISSING_KEY 104 +# define KDF_R_MISSING_MESSAGE_DIGEST 105 +# define KDF_R_MISSING_PARAMETER 101 +# define KDF_R_MISSING_PASS 110 +# define KDF_R_MISSING_SALT 111 +# define KDF_R_MISSING_SECRET 107 +# define KDF_R_MISSING_SEED 106 +# define KDF_R_UNKNOWN_PARAMETER_TYPE 103 +# define KDF_R_VALUE_ERROR 108 +# define KDF_R_VALUE_MISSING 102 + +#endif diff --git a/openssl-wasm/include/openssl/lhash.h b/openssl-wasm/include/openssl/lhash.h new file mode 100644 index 0000000..2e42d72 --- /dev/null +++ b/openssl-wasm/include/openssl/lhash.h @@ -0,0 +1,241 @@ +/* + * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* + * Header for dynamic hash table routines Author - Eric Young + */ + +#ifndef HEADER_LHASH_H +# define HEADER_LHASH_H + +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct lhash_node_st OPENSSL_LH_NODE; +typedef int (*OPENSSL_LH_COMPFUNC) (const void *, const void *); +typedef unsigned long (*OPENSSL_LH_HASHFUNC) (const void *); +typedef void (*OPENSSL_LH_DOALL_FUNC) (void *); +typedef void (*OPENSSL_LH_DOALL_FUNCARG) (void *, void *); +typedef struct lhash_st OPENSSL_LHASH; + +/* + * 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 + +/* 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 + + +# define LH_LOAD_MULT 256 + +int OPENSSL_LH_error(OPENSSL_LHASH *lh); +OPENSSL_LHASH *OPENSSL_LH_new(OPENSSL_LH_HASHFUNC h, OPENSSL_LH_COMPFUNC c); +void OPENSSL_LH_free(OPENSSL_LHASH *lh); +void *OPENSSL_LH_insert(OPENSSL_LHASH *lh, void *data); +void *OPENSSL_LH_delete(OPENSSL_LHASH *lh, const void *data); +void *OPENSSL_LH_retrieve(OPENSSL_LHASH *lh, const void *data); +void OPENSSL_LH_doall(OPENSSL_LHASH *lh, OPENSSL_LH_DOALL_FUNC func); +void OPENSSL_LH_doall_arg(OPENSSL_LHASH *lh, OPENSSL_LH_DOALL_FUNCARG func, void *arg); +unsigned long OPENSSL_LH_strhash(const char *c); +unsigned long OPENSSL_LH_num_items(const OPENSSL_LHASH *lh); +unsigned long OPENSSL_LH_get_down_load(const OPENSSL_LHASH *lh); +void OPENSSL_LH_set_down_load(OPENSSL_LHASH *lh, unsigned long down_load); + +# ifndef OPENSSL_NO_STDIO +void OPENSSL_LH_stats(const OPENSSL_LHASH *lh, FILE *fp); +void OPENSSL_LH_node_stats(const OPENSSL_LHASH *lh, FILE *fp); +void OPENSSL_LH_node_usage_stats(const OPENSSL_LHASH *lh, FILE *fp); +# endif +void OPENSSL_LH_stats_bio(const OPENSSL_LHASH *lh, BIO *out); +void OPENSSL_LH_node_stats_bio(const OPENSSL_LHASH *lh, BIO *out); +void OPENSSL_LH_node_usage_stats_bio(const OPENSSL_LHASH *lh, BIO *out); + +# if OPENSSL_API_COMPAT < 0x10100000L +# define _LHASH OPENSSL_LHASH +# define LHASH_NODE OPENSSL_LH_NODE +# define lh_error OPENSSL_LH_error +# define lh_new OPENSSL_LH_new +# define lh_free OPENSSL_LH_free +# define lh_insert OPENSSL_LH_insert +# define lh_delete OPENSSL_LH_delete +# define lh_retrieve OPENSSL_LH_retrieve +# define lh_doall OPENSSL_LH_doall +# define lh_doall_arg OPENSSL_LH_doall_arg +# define lh_strhash OPENSSL_LH_strhash +# define lh_num_items OPENSSL_LH_num_items +# ifndef OPENSSL_NO_STDIO +# define lh_stats OPENSSL_LH_stats +# define lh_node_stats OPENSSL_LH_node_stats +# define lh_node_usage_stats OPENSSL_LH_node_usage_stats +# endif +# define lh_stats_bio OPENSSL_LH_stats_bio +# define lh_node_stats_bio OPENSSL_LH_node_stats_bio +# define lh_node_usage_stats_bio OPENSSL_LH_node_usage_stats_bio +# endif + +/* Type checking... */ + +# define LHASH_OF(type) struct lhash_st_##type + +# define DEFINE_LHASH_OF(type) \ + LHASH_OF(type) { union lh_##type##_dummy { void* d1; unsigned long d2; int d3; } dummy; }; \ + static ossl_unused ossl_inline LHASH_OF(type) *lh_##type##_new(unsigned long (*hfn)(const type *), \ + int (*cfn)(const type *, const type *)) \ + { \ + return (LHASH_OF(type) *) \ + OPENSSL_LH_new((OPENSSL_LH_HASHFUNC)hfn, (OPENSSL_LH_COMPFUNC)cfn); \ + } \ + static ossl_unused ossl_inline void lh_##type##_free(LHASH_OF(type) *lh) \ + { \ + OPENSSL_LH_free((OPENSSL_LHASH *)lh); \ + } \ + static ossl_unused ossl_inline type *lh_##type##_insert(LHASH_OF(type) *lh, type *d) \ + { \ + return (type *)OPENSSL_LH_insert((OPENSSL_LHASH *)lh, d); \ + } \ + static ossl_unused ossl_inline type *lh_##type##_delete(LHASH_OF(type) *lh, const type *d) \ + { \ + return (type *)OPENSSL_LH_delete((OPENSSL_LHASH *)lh, d); \ + } \ + static ossl_unused ossl_inline type *lh_##type##_retrieve(LHASH_OF(type) *lh, const type *d) \ + { \ + return (type *)OPENSSL_LH_retrieve((OPENSSL_LHASH *)lh, d); \ + } \ + static ossl_unused ossl_inline int lh_##type##_error(LHASH_OF(type) *lh) \ + { \ + return OPENSSL_LH_error((OPENSSL_LHASH *)lh); \ + } \ + static ossl_unused ossl_inline unsigned long lh_##type##_num_items(LHASH_OF(type) *lh) \ + { \ + return OPENSSL_LH_num_items((OPENSSL_LHASH *)lh); \ + } \ + static ossl_unused ossl_inline void lh_##type##_node_stats_bio(const LHASH_OF(type) *lh, BIO *out) \ + { \ + OPENSSL_LH_node_stats_bio((const OPENSSL_LHASH *)lh, out); \ + } \ + static ossl_unused ossl_inline void lh_##type##_node_usage_stats_bio(const LHASH_OF(type) *lh, BIO *out) \ + { \ + OPENSSL_LH_node_usage_stats_bio((const OPENSSL_LHASH *)lh, out); \ + } \ + static ossl_unused ossl_inline void lh_##type##_stats_bio(const LHASH_OF(type) *lh, BIO *out) \ + { \ + OPENSSL_LH_stats_bio((const OPENSSL_LHASH *)lh, out); \ + } \ + static ossl_unused ossl_inline unsigned long lh_##type##_get_down_load(LHASH_OF(type) *lh) \ + { \ + return OPENSSL_LH_get_down_load((OPENSSL_LHASH *)lh); \ + } \ + static ossl_unused ossl_inline void lh_##type##_set_down_load(LHASH_OF(type) *lh, unsigned long dl) \ + { \ + OPENSSL_LH_set_down_load((OPENSSL_LHASH *)lh, dl); \ + } \ + static ossl_unused ossl_inline void lh_##type##_doall(LHASH_OF(type) *lh, \ + void (*doall)(type *)) \ + { \ + OPENSSL_LH_doall((OPENSSL_LHASH *)lh, (OPENSSL_LH_DOALL_FUNC)doall); \ + } \ + LHASH_OF(type) + +#define IMPLEMENT_LHASH_DOALL_ARG_CONST(type, argtype) \ + int_implement_lhash_doall(type, argtype, const type) + +#define IMPLEMENT_LHASH_DOALL_ARG(type, argtype) \ + int_implement_lhash_doall(type, argtype, type) + +#define int_implement_lhash_doall(type, argtype, cbargtype) \ + static ossl_unused ossl_inline void \ + lh_##type##_doall_##argtype(LHASH_OF(type) *lh, \ + void (*fn)(cbargtype *, argtype *), \ + argtype *arg) \ + { \ + OPENSSL_LH_doall_arg((OPENSSL_LHASH *)lh, (OPENSSL_LH_DOALL_FUNCARG)fn, (void *)arg); \ + } \ + LHASH_OF(type) + +DEFINE_LHASH_OF(OPENSSL_STRING); +# ifdef _MSC_VER +/* + * push and pop this warning: + * warning C4090: 'function': different 'const' qualifiers + */ +# pragma warning (push) +# pragma warning (disable: 4090) +# endif + +DEFINE_LHASH_OF(OPENSSL_CSTRING); + +# ifdef _MSC_VER +# pragma warning (pop) +# endif + +/* + * If called without higher optimization (min. -xO3) the Oracle Developer + * Studio compiler generates code for the defined (static inline) functions + * above. + * This would later lead to the linker complaining about missing symbols when + * this header file is included but the resulting object is not linked against + * the Crypto library (openssl#6912). + */ +# ifdef __SUNPRO_C +# pragma weak OPENSSL_LH_new +# pragma weak OPENSSL_LH_free +# pragma weak OPENSSL_LH_insert +# pragma weak OPENSSL_LH_delete +# pragma weak OPENSSL_LH_retrieve +# pragma weak OPENSSL_LH_error +# pragma weak OPENSSL_LH_num_items +# pragma weak OPENSSL_LH_node_stats_bio +# pragma weak OPENSSL_LH_node_usage_stats_bio +# pragma weak OPENSSL_LH_stats_bio +# pragma weak OPENSSL_LH_get_down_load +# pragma weak OPENSSL_LH_set_down_load +# pragma weak OPENSSL_LH_doall +# pragma weak OPENSSL_LH_doall_arg +# endif /* __SUNPRO_C */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/openssl-wasm/include/openssl/md2.h b/openssl-wasm/include/openssl/md2.h new file mode 100644 index 0000000..7faf8e3 --- /dev/null +++ b/openssl-wasm/include/openssl/md2.h @@ -0,0 +1,44 @@ +/* + * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_MD2_H +# define HEADER_MD2_H + +# include + +# ifndef OPENSSL_NO_MD2 +# include +# ifdef __cplusplus +extern "C" { +# endif + +typedef unsigned char MD2_INT; + +# define MD2_DIGEST_LENGTH 16 +# define MD2_BLOCK 16 + +typedef struct MD2state_st { + unsigned int num; + unsigned char data[MD2_BLOCK]; + MD2_INT cksm[MD2_BLOCK]; + MD2_INT state[MD2_BLOCK]; +} MD2_CTX; + +const char *MD2_options(void); +int MD2_Init(MD2_CTX *c); +int MD2_Update(MD2_CTX *c, const unsigned char *data, size_t len); +int MD2_Final(unsigned char *md, MD2_CTX *c); +unsigned char *MD2(const unsigned char *d, size_t n, unsigned char *md); + +# ifdef __cplusplus +} +# endif +# endif + +#endif diff --git a/openssl-wasm/include/openssl/md4.h b/openssl-wasm/include/openssl/md4.h new file mode 100644 index 0000000..940e29d --- /dev/null +++ b/openssl-wasm/include/openssl/md4.h @@ -0,0 +1,51 @@ +/* + * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_MD4_H +# define HEADER_MD4_H + +# include + +# ifndef OPENSSL_NO_MD4 +# include +# include +# ifdef __cplusplus +extern "C" { +# endif + +/*- + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + * ! MD4_LONG has to be at least 32 bits wide. ! + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + */ +# define MD4_LONG unsigned int + +# 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; + +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 + +#endif diff --git a/openssl-wasm/include/openssl/md5.h b/openssl-wasm/include/openssl/md5.h new file mode 100644 index 0000000..2deb772 --- /dev/null +++ b/openssl-wasm/include/openssl/md5.h @@ -0,0 +1,50 @@ +/* + * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_MD5_H +# define HEADER_MD5_H + +# include + +# ifndef OPENSSL_NO_MD5 +# include +# include +# ifdef __cplusplus +extern "C" { +# endif + +/* + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + * ! MD5_LONG has to be at least 32 bits wide. ! + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + */ +# define MD5_LONG unsigned int + +# 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; + +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 + +#endif diff --git a/openssl-wasm/include/openssl/mdc2.h b/openssl-wasm/include/openssl/mdc2.h new file mode 100644 index 0000000..aabd2bf --- /dev/null +++ b/openssl-wasm/include/openssl/mdc2.h @@ -0,0 +1,42 @@ +/* + * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_MDC2_H +# define HEADER_MDC2_H + +# include + +#ifndef OPENSSL_NO_MDC2 +# include +# include +# ifdef __cplusplus +extern "C" { +# 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; + +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 + +#endif diff --git a/openssl-wasm/include/openssl/modes.h b/openssl-wasm/include/openssl/modes.h new file mode 100644 index 0000000..d544f98 --- /dev/null +++ b/openssl-wasm/include/openssl/modes.h @@ -0,0 +1,208 @@ +/* + * Copyright 2008-2016 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_MODES_H +# define HEADER_MODES_H + +# include + +# ifdef __cplusplus +extern "C" { +# endif +typedef void (*block128_f) (const unsigned char in[16], + unsigned char out[16], const void *key); + +typedef void (*cbc128_f) (const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], int enc); + +typedef void (*ctr128_f) (const unsigned char *in, unsigned char *out, + size_t blocks, const void *key, + const unsigned char ivec[16]); + +typedef void (*ccm128_f) (const unsigned char *in, unsigned char *out, + size_t blocks, const void *key, + const unsigned char ivec[16], + unsigned char cmac[16]); + +void CRYPTO_cbc128_encrypt(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], block128_f block); +void CRYPTO_cbc128_decrypt(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], block128_f block); + +void CRYPTO_ctr128_encrypt(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], + unsigned char ecount_buf[16], unsigned int *num, + block128_f block); + +void CRYPTO_ctr128_encrypt_ctr32(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], + unsigned char ecount_buf[16], + unsigned int *num, ctr128_f ctr); + +void CRYPTO_ofb128_encrypt(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], int *num, + block128_f block); + +void CRYPTO_cfb128_encrypt(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], int *num, + int enc, block128_f block); +void CRYPTO_cfb128_8_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const void *key, + unsigned char ivec[16], int *num, + int enc, block128_f block); +void CRYPTO_cfb128_1_encrypt(const unsigned char *in, unsigned char *out, + size_t bits, const void *key, + unsigned char ivec[16], int *num, + int enc, block128_f block); + +size_t CRYPTO_cts128_encrypt_block(const unsigned char *in, + unsigned char *out, size_t len, + const void *key, unsigned char ivec[16], + block128_f block); +size_t CRYPTO_cts128_encrypt(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], cbc128_f cbc); +size_t CRYPTO_cts128_decrypt_block(const unsigned char *in, + unsigned char *out, size_t len, + const void *key, unsigned char ivec[16], + block128_f block); +size_t CRYPTO_cts128_decrypt(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], cbc128_f cbc); + +size_t CRYPTO_nistcts128_encrypt_block(const unsigned char *in, + unsigned char *out, size_t len, + const void *key, + unsigned char ivec[16], + block128_f block); +size_t CRYPTO_nistcts128_encrypt(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], cbc128_f cbc); +size_t CRYPTO_nistcts128_decrypt_block(const unsigned char *in, + unsigned char *out, size_t len, + const void *key, + unsigned char ivec[16], + block128_f block); +size_t CRYPTO_nistcts128_decrypt(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], cbc128_f cbc); + +typedef struct gcm128_context GCM128_CONTEXT; + +GCM128_CONTEXT *CRYPTO_gcm128_new(void *key, block128_f block); +void CRYPTO_gcm128_init(GCM128_CONTEXT *ctx, void *key, block128_f block); +void CRYPTO_gcm128_setiv(GCM128_CONTEXT *ctx, const unsigned char *iv, + size_t len); +int CRYPTO_gcm128_aad(GCM128_CONTEXT *ctx, const unsigned char *aad, + size_t len); +int CRYPTO_gcm128_encrypt(GCM128_CONTEXT *ctx, + const unsigned char *in, unsigned char *out, + size_t len); +int CRYPTO_gcm128_decrypt(GCM128_CONTEXT *ctx, + const unsigned char *in, unsigned char *out, + size_t len); +int CRYPTO_gcm128_encrypt_ctr32(GCM128_CONTEXT *ctx, + const unsigned char *in, unsigned char *out, + size_t len, ctr128_f stream); +int CRYPTO_gcm128_decrypt_ctr32(GCM128_CONTEXT *ctx, + const unsigned char *in, unsigned char *out, + size_t len, ctr128_f stream); +int CRYPTO_gcm128_finish(GCM128_CONTEXT *ctx, const unsigned char *tag, + size_t len); +void CRYPTO_gcm128_tag(GCM128_CONTEXT *ctx, unsigned char *tag, size_t len); +void CRYPTO_gcm128_release(GCM128_CONTEXT *ctx); + +typedef struct ccm128_context CCM128_CONTEXT; + +void CRYPTO_ccm128_init(CCM128_CONTEXT *ctx, + unsigned int M, unsigned int L, void *key, + block128_f block); +int CRYPTO_ccm128_setiv(CCM128_CONTEXT *ctx, const unsigned char *nonce, + size_t nlen, size_t mlen); +void CRYPTO_ccm128_aad(CCM128_CONTEXT *ctx, const unsigned char *aad, + size_t alen); +int CRYPTO_ccm128_encrypt(CCM128_CONTEXT *ctx, const unsigned char *inp, + unsigned char *out, size_t len); +int CRYPTO_ccm128_decrypt(CCM128_CONTEXT *ctx, const unsigned char *inp, + unsigned char *out, size_t len); +int CRYPTO_ccm128_encrypt_ccm64(CCM128_CONTEXT *ctx, const unsigned char *inp, + unsigned char *out, size_t len, + ccm128_f stream); +int CRYPTO_ccm128_decrypt_ccm64(CCM128_CONTEXT *ctx, const unsigned char *inp, + unsigned char *out, size_t len, + ccm128_f stream); +size_t CRYPTO_ccm128_tag(CCM128_CONTEXT *ctx, unsigned char *tag, size_t len); + +typedef struct xts128_context XTS128_CONTEXT; + +int CRYPTO_xts128_encrypt(const XTS128_CONTEXT *ctx, + const unsigned char iv[16], + const unsigned char *inp, unsigned char *out, + size_t len, int enc); + +size_t CRYPTO_128_wrap(void *key, const unsigned char *iv, + unsigned char *out, + const unsigned char *in, size_t inlen, + block128_f block); + +size_t CRYPTO_128_unwrap(void *key, const unsigned char *iv, + unsigned char *out, + const unsigned char *in, size_t inlen, + block128_f block); +size_t CRYPTO_128_wrap_pad(void *key, const unsigned char *icv, + unsigned char *out, const unsigned char *in, + size_t inlen, block128_f block); +size_t CRYPTO_128_unwrap_pad(void *key, const unsigned char *icv, + unsigned char *out, const unsigned char *in, + size_t inlen, block128_f block); + +# ifndef OPENSSL_NO_OCB +typedef struct ocb128_context OCB128_CONTEXT; + +typedef void (*ocb128_f) (const unsigned char *in, unsigned char *out, + size_t blocks, const void *key, + size_t start_block_num, + unsigned char offset_i[16], + const unsigned char L_[][16], + unsigned char checksum[16]); + +OCB128_CONTEXT *CRYPTO_ocb128_new(void *keyenc, void *keydec, + block128_f encrypt, block128_f decrypt, + ocb128_f stream); +int CRYPTO_ocb128_init(OCB128_CONTEXT *ctx, void *keyenc, void *keydec, + block128_f encrypt, block128_f decrypt, + ocb128_f stream); +int CRYPTO_ocb128_copy_ctx(OCB128_CONTEXT *dest, OCB128_CONTEXT *src, + void *keyenc, void *keydec); +int CRYPTO_ocb128_setiv(OCB128_CONTEXT *ctx, const unsigned char *iv, + size_t len, size_t taglen); +int CRYPTO_ocb128_aad(OCB128_CONTEXT *ctx, const unsigned char *aad, + size_t len); +int CRYPTO_ocb128_encrypt(OCB128_CONTEXT *ctx, const unsigned char *in, + unsigned char *out, size_t len); +int CRYPTO_ocb128_decrypt(OCB128_CONTEXT *ctx, const unsigned char *in, + unsigned char *out, size_t len); +int CRYPTO_ocb128_finish(OCB128_CONTEXT *ctx, const unsigned char *tag, + size_t len); +int CRYPTO_ocb128_tag(OCB128_CONTEXT *ctx, unsigned char *tag, size_t len); +void CRYPTO_ocb128_cleanup(OCB128_CONTEXT *ctx); +# endif /* OPENSSL_NO_OCB */ + +# ifdef __cplusplus +} +# endif + +#endif diff --git a/openssl-wasm/include/openssl/obj_mac.h b/openssl-wasm/include/openssl/obj_mac.h new file mode 100644 index 0000000..eb812ed --- /dev/null +++ b/openssl-wasm/include/openssl/obj_mac.h @@ -0,0 +1,5198 @@ +/* + * WARNING: do not edit! + * Generated by crypto/objects/objects.pl + * + * Copyright 2000-2021 The OpenSSL Project Authors. All Rights Reserved. + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#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_x509ExtAdmission "x509ExtAdmission" +#define LN_x509ExtAdmission "Professional Information or basis for Admission" +#define NID_x509ExtAdmission 1093 +#define OBJ_x509ExtAdmission OBJ_identified_organization,36L,8L,3L,3L + +#define SN_certicom_arc "certicom-arc" +#define NID_certicom_arc 677 +#define OBJ_certicom_arc OBJ_identified_organization,132L + +#define SN_ieee "ieee" +#define NID_ieee 1170 +#define OBJ_ieee OBJ_identified_organization,111L + +#define SN_ieee_siswg "ieee-siswg" +#define LN_ieee_siswg "IEEE Security in Storage Working Group" +#define NID_ieee_siswg 1171 +#define OBJ_ieee_siswg OBJ_ieee,2L,1619L + +#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_ISO_CN "ISO-CN" +#define LN_ISO_CN "ISO CN Member Body" +#define NID_ISO_CN 1140 +#define OBJ_ISO_CN OBJ_member_body,156L + +#define SN_oscca "oscca" +#define NID_oscca 1141 +#define OBJ_oscca OBJ_ISO_CN,10197L + +#define SN_sm_scheme "sm-scheme" +#define NID_sm_scheme 1142 +#define OBJ_sm_scheme OBJ_oscca,1L + +#define SN_dsa "DSA" +#define LN_dsa "dsaEncryption" +#define NID_dsa 116 +#define OBJ_dsa OBJ_X9cm,1L + +#define SN_dsaWithSHA1 "DSA-SHA1" +#define LN_dsaWithSHA1 "dsaWithSHA1" +#define NID_dsaWithSHA1 113 +#define OBJ_dsaWithSHA1 OBJ_X9cm,3L + +#define SN_ansi_X9_62 "ansi-X9-62" +#define LN_ansi_X9_62 "ANSI X9.62" +#define NID_ansi_X9_62 405 +#define OBJ_ansi_X9_62 OBJ_ISO_US,10045L + +#define OBJ_X9_62_id_fieldType OBJ_ansi_X9_62,1L + +#define SN_X9_62_prime_field "prime-field" +#define NID_X9_62_prime_field 406 +#define OBJ_X9_62_prime_field OBJ_X9_62_id_fieldType,1L + +#define SN_X9_62_characteristic_two_field "characteristic-two-field" +#define NID_X9_62_characteristic_two_field 407 +#define OBJ_X9_62_characteristic_two_field OBJ_X9_62_id_fieldType,2L + +#define SN_X9_62_id_characteristic_two_basis "id-characteristic-two-basis" +#define NID_X9_62_id_characteristic_two_basis 680 +#define OBJ_X9_62_id_characteristic_two_basis OBJ_X9_62_characteristic_two_field,3L + +#define SN_X9_62_onBasis "onBasis" +#define NID_X9_62_onBasis 681 +#define OBJ_X9_62_onBasis OBJ_X9_62_id_characteristic_two_basis,1L + +#define SN_X9_62_tpBasis "tpBasis" +#define NID_X9_62_tpBasis 682 +#define OBJ_X9_62_tpBasis OBJ_X9_62_id_characteristic_two_basis,2L + +#define SN_X9_62_ppBasis "ppBasis" +#define NID_X9_62_ppBasis 683 +#define OBJ_X9_62_ppBasis OBJ_X9_62_id_characteristic_two_basis,3L + +#define OBJ_X9_62_id_publicKeyType OBJ_ansi_X9_62,2L + +#define SN_X9_62_id_ecPublicKey "id-ecPublicKey" +#define NID_X9_62_id_ecPublicKey 408 +#define OBJ_X9_62_id_ecPublicKey OBJ_X9_62_id_publicKeyType,1L + +#define OBJ_X9_62_ellipticCurve OBJ_ansi_X9_62,3L + +#define OBJ_X9_62_c_TwoCurve OBJ_X9_62_ellipticCurve,0L + +#define SN_X9_62_c2pnb163v1 "c2pnb163v1" +#define NID_X9_62_c2pnb163v1 684 +#define OBJ_X9_62_c2pnb163v1 OBJ_X9_62_c_TwoCurve,1L + +#define SN_X9_62_c2pnb163v2 "c2pnb163v2" +#define NID_X9_62_c2pnb163v2 685 +#define OBJ_X9_62_c2pnb163v2 OBJ_X9_62_c_TwoCurve,2L + +#define SN_X9_62_c2pnb163v3 "c2pnb163v3" +#define NID_X9_62_c2pnb163v3 686 +#define OBJ_X9_62_c2pnb163v3 OBJ_X9_62_c_TwoCurve,3L + +#define SN_X9_62_c2pnb176v1 "c2pnb176v1" +#define NID_X9_62_c2pnb176v1 687 +#define OBJ_X9_62_c2pnb176v1 OBJ_X9_62_c_TwoCurve,4L + +#define SN_X9_62_c2tnb191v1 "c2tnb191v1" +#define NID_X9_62_c2tnb191v1 688 +#define OBJ_X9_62_c2tnb191v1 OBJ_X9_62_c_TwoCurve,5L + +#define SN_X9_62_c2tnb191v2 "c2tnb191v2" +#define NID_X9_62_c2tnb191v2 689 +#define OBJ_X9_62_c2tnb191v2 OBJ_X9_62_c_TwoCurve,6L + +#define SN_X9_62_c2tnb191v3 "c2tnb191v3" +#define NID_X9_62_c2tnb191v3 690 +#define OBJ_X9_62_c2tnb191v3 OBJ_X9_62_c_TwoCurve,7L + +#define SN_X9_62_c2onb191v4 "c2onb191v4" +#define NID_X9_62_c2onb191v4 691 +#define OBJ_X9_62_c2onb191v4 OBJ_X9_62_c_TwoCurve,8L + +#define SN_X9_62_c2onb191v5 "c2onb191v5" +#define NID_X9_62_c2onb191v5 692 +#define OBJ_X9_62_c2onb191v5 OBJ_X9_62_c_TwoCurve,9L + +#define SN_X9_62_c2pnb208w1 "c2pnb208w1" +#define NID_X9_62_c2pnb208w1 693 +#define OBJ_X9_62_c2pnb208w1 OBJ_X9_62_c_TwoCurve,10L + +#define SN_X9_62_c2tnb239v1 "c2tnb239v1" +#define NID_X9_62_c2tnb239v1 694 +#define OBJ_X9_62_c2tnb239v1 OBJ_X9_62_c_TwoCurve,11L + +#define SN_X9_62_c2tnb239v2 "c2tnb239v2" +#define NID_X9_62_c2tnb239v2 695 +#define OBJ_X9_62_c2tnb239v2 OBJ_X9_62_c_TwoCurve,12L + +#define SN_X9_62_c2tnb239v3 "c2tnb239v3" +#define NID_X9_62_c2tnb239v3 696 +#define OBJ_X9_62_c2tnb239v3 OBJ_X9_62_c_TwoCurve,13L + +#define SN_X9_62_c2onb239v4 "c2onb239v4" +#define NID_X9_62_c2onb239v4 697 +#define OBJ_X9_62_c2onb239v4 OBJ_X9_62_c_TwoCurve,14L + +#define SN_X9_62_c2onb239v5 "c2onb239v5" +#define NID_X9_62_c2onb239v5 698 +#define OBJ_X9_62_c2onb239v5 OBJ_X9_62_c_TwoCurve,15L + +#define SN_X9_62_c2pnb272w1 "c2pnb272w1" +#define NID_X9_62_c2pnb272w1 699 +#define OBJ_X9_62_c2pnb272w1 OBJ_X9_62_c_TwoCurve,16L + +#define SN_X9_62_c2pnb304w1 "c2pnb304w1" +#define NID_X9_62_c2pnb304w1 700 +#define OBJ_X9_62_c2pnb304w1 OBJ_X9_62_c_TwoCurve,17L + +#define SN_X9_62_c2tnb359v1 "c2tnb359v1" +#define NID_X9_62_c2tnb359v1 701 +#define OBJ_X9_62_c2tnb359v1 OBJ_X9_62_c_TwoCurve,18L + +#define SN_X9_62_c2pnb368w1 "c2pnb368w1" +#define NID_X9_62_c2pnb368w1 702 +#define OBJ_X9_62_c2pnb368w1 OBJ_X9_62_c_TwoCurve,19L + +#define SN_X9_62_c2tnb431r1 "c2tnb431r1" +#define NID_X9_62_c2tnb431r1 703 +#define OBJ_X9_62_c2tnb431r1 OBJ_X9_62_c_TwoCurve,20L + +#define OBJ_X9_62_primeCurve OBJ_X9_62_ellipticCurve,1L + +#define SN_X9_62_prime192v1 "prime192v1" +#define NID_X9_62_prime192v1 409 +#define OBJ_X9_62_prime192v1 OBJ_X9_62_primeCurve,1L + +#define SN_X9_62_prime192v2 "prime192v2" +#define NID_X9_62_prime192v2 410 +#define OBJ_X9_62_prime192v2 OBJ_X9_62_primeCurve,2L + +#define SN_X9_62_prime192v3 "prime192v3" +#define NID_X9_62_prime192v3 411 +#define OBJ_X9_62_prime192v3 OBJ_X9_62_primeCurve,3L + +#define SN_X9_62_prime239v1 "prime239v1" +#define NID_X9_62_prime239v1 412 +#define OBJ_X9_62_prime239v1 OBJ_X9_62_primeCurve,4L + +#define SN_X9_62_prime239v2 "prime239v2" +#define NID_X9_62_prime239v2 413 +#define OBJ_X9_62_prime239v2 OBJ_X9_62_primeCurve,5L + +#define SN_X9_62_prime239v3 "prime239v3" +#define NID_X9_62_prime239v3 414 +#define OBJ_X9_62_prime239v3 OBJ_X9_62_primeCurve,6L + +#define SN_X9_62_prime256v1 "prime256v1" +#define NID_X9_62_prime256v1 415 +#define OBJ_X9_62_prime256v1 OBJ_X9_62_primeCurve,7L + +#define OBJ_X9_62_id_ecSigType OBJ_ansi_X9_62,4L + +#define SN_ecdsa_with_SHA1 "ecdsa-with-SHA1" +#define NID_ecdsa_with_SHA1 416 +#define OBJ_ecdsa_with_SHA1 OBJ_X9_62_id_ecSigType,1L + +#define SN_ecdsa_with_Recommended "ecdsa-with-Recommended" +#define NID_ecdsa_with_Recommended 791 +#define OBJ_ecdsa_with_Recommended OBJ_X9_62_id_ecSigType,2L + +#define SN_ecdsa_with_Specified "ecdsa-with-Specified" +#define NID_ecdsa_with_Specified 792 +#define OBJ_ecdsa_with_Specified OBJ_X9_62_id_ecSigType,3L + +#define SN_ecdsa_with_SHA224 "ecdsa-with-SHA224" +#define NID_ecdsa_with_SHA224 793 +#define OBJ_ecdsa_with_SHA224 OBJ_ecdsa_with_Specified,1L + +#define SN_ecdsa_with_SHA256 "ecdsa-with-SHA256" +#define NID_ecdsa_with_SHA256 794 +#define OBJ_ecdsa_with_SHA256 OBJ_ecdsa_with_Specified,2L + +#define SN_ecdsa_with_SHA384 "ecdsa-with-SHA384" +#define NID_ecdsa_with_SHA384 795 +#define OBJ_ecdsa_with_SHA384 OBJ_ecdsa_with_Specified,3L + +#define SN_ecdsa_with_SHA512 "ecdsa-with-SHA512" +#define NID_ecdsa_with_SHA512 796 +#define OBJ_ecdsa_with_SHA512 OBJ_ecdsa_with_Specified,4L + +#define OBJ_secg_ellipticCurve OBJ_certicom_arc,0L + +#define SN_secp112r1 "secp112r1" +#define NID_secp112r1 704 +#define OBJ_secp112r1 OBJ_secg_ellipticCurve,6L + +#define SN_secp112r2 "secp112r2" +#define NID_secp112r2 705 +#define OBJ_secp112r2 OBJ_secg_ellipticCurve,7L + +#define SN_secp128r1 "secp128r1" +#define NID_secp128r1 706 +#define OBJ_secp128r1 OBJ_secg_ellipticCurve,28L + +#define SN_secp128r2 "secp128r2" +#define NID_secp128r2 707 +#define OBJ_secp128r2 OBJ_secg_ellipticCurve,29L + +#define SN_secp160k1 "secp160k1" +#define NID_secp160k1 708 +#define OBJ_secp160k1 OBJ_secg_ellipticCurve,9L + +#define SN_secp160r1 "secp160r1" +#define NID_secp160r1 709 +#define OBJ_secp160r1 OBJ_secg_ellipticCurve,8L + +#define SN_secp160r2 "secp160r2" +#define NID_secp160r2 710 +#define OBJ_secp160r2 OBJ_secg_ellipticCurve,30L + +#define SN_secp192k1 "secp192k1" +#define NID_secp192k1 711 +#define OBJ_secp192k1 OBJ_secg_ellipticCurve,31L + +#define SN_secp224k1 "secp224k1" +#define NID_secp224k1 712 +#define OBJ_secp224k1 OBJ_secg_ellipticCurve,32L + +#define SN_secp224r1 "secp224r1" +#define NID_secp224r1 713 +#define OBJ_secp224r1 OBJ_secg_ellipticCurve,33L + +#define SN_secp256k1 "secp256k1" +#define NID_secp256k1 714 +#define OBJ_secp256k1 OBJ_secg_ellipticCurve,10L + +#define SN_secp384r1 "secp384r1" +#define NID_secp384r1 715 +#define OBJ_secp384r1 OBJ_secg_ellipticCurve,34L + +#define SN_secp521r1 "secp521r1" +#define NID_secp521r1 716 +#define OBJ_secp521r1 OBJ_secg_ellipticCurve,35L + +#define SN_sect113r1 "sect113r1" +#define NID_sect113r1 717 +#define OBJ_sect113r1 OBJ_secg_ellipticCurve,4L + +#define SN_sect113r2 "sect113r2" +#define NID_sect113r2 718 +#define OBJ_sect113r2 OBJ_secg_ellipticCurve,5L + +#define SN_sect131r1 "sect131r1" +#define NID_sect131r1 719 +#define OBJ_sect131r1 OBJ_secg_ellipticCurve,22L + +#define SN_sect131r2 "sect131r2" +#define NID_sect131r2 720 +#define OBJ_sect131r2 OBJ_secg_ellipticCurve,23L + +#define SN_sect163k1 "sect163k1" +#define NID_sect163k1 721 +#define OBJ_sect163k1 OBJ_secg_ellipticCurve,1L + +#define SN_sect163r1 "sect163r1" +#define NID_sect163r1 722 +#define OBJ_sect163r1 OBJ_secg_ellipticCurve,2L + +#define SN_sect163r2 "sect163r2" +#define NID_sect163r2 723 +#define OBJ_sect163r2 OBJ_secg_ellipticCurve,15L + +#define SN_sect193r1 "sect193r1" +#define NID_sect193r1 724 +#define OBJ_sect193r1 OBJ_secg_ellipticCurve,24L + +#define SN_sect193r2 "sect193r2" +#define NID_sect193r2 725 +#define OBJ_sect193r2 OBJ_secg_ellipticCurve,25L + +#define SN_sect233k1 "sect233k1" +#define NID_sect233k1 726 +#define OBJ_sect233k1 OBJ_secg_ellipticCurve,26L + +#define SN_sect233r1 "sect233r1" +#define NID_sect233r1 727 +#define OBJ_sect233r1 OBJ_secg_ellipticCurve,27L + +#define SN_sect239k1 "sect239k1" +#define NID_sect239k1 728 +#define OBJ_sect239k1 OBJ_secg_ellipticCurve,3L + +#define SN_sect283k1 "sect283k1" +#define NID_sect283k1 729 +#define OBJ_sect283k1 OBJ_secg_ellipticCurve,16L + +#define SN_sect283r1 "sect283r1" +#define NID_sect283r1 730 +#define OBJ_sect283r1 OBJ_secg_ellipticCurve,17L + +#define SN_sect409k1 "sect409k1" +#define NID_sect409k1 731 +#define OBJ_sect409k1 OBJ_secg_ellipticCurve,36L + +#define SN_sect409r1 "sect409r1" +#define NID_sect409r1 732 +#define OBJ_sect409r1 OBJ_secg_ellipticCurve,37L + +#define SN_sect571k1 "sect571k1" +#define NID_sect571k1 733 +#define OBJ_sect571k1 OBJ_secg_ellipticCurve,38L + +#define SN_sect571r1 "sect571r1" +#define NID_sect571r1 734 +#define OBJ_sect571r1 OBJ_secg_ellipticCurve,39L + +#define OBJ_wap_wsg_idm_ecid OBJ_wap_wsg,4L + +#define SN_wap_wsg_idm_ecid_wtls1 "wap-wsg-idm-ecid-wtls1" +#define NID_wap_wsg_idm_ecid_wtls1 735 +#define OBJ_wap_wsg_idm_ecid_wtls1 OBJ_wap_wsg_idm_ecid,1L + +#define SN_wap_wsg_idm_ecid_wtls3 "wap-wsg-idm-ecid-wtls3" +#define NID_wap_wsg_idm_ecid_wtls3 736 +#define OBJ_wap_wsg_idm_ecid_wtls3 OBJ_wap_wsg_idm_ecid,3L + +#define SN_wap_wsg_idm_ecid_wtls4 "wap-wsg-idm-ecid-wtls4" +#define NID_wap_wsg_idm_ecid_wtls4 737 +#define OBJ_wap_wsg_idm_ecid_wtls4 OBJ_wap_wsg_idm_ecid,4L + +#define SN_wap_wsg_idm_ecid_wtls5 "wap-wsg-idm-ecid-wtls5" +#define NID_wap_wsg_idm_ecid_wtls5 738 +#define OBJ_wap_wsg_idm_ecid_wtls5 OBJ_wap_wsg_idm_ecid,5L + +#define SN_wap_wsg_idm_ecid_wtls6 "wap-wsg-idm-ecid-wtls6" +#define NID_wap_wsg_idm_ecid_wtls6 739 +#define OBJ_wap_wsg_idm_ecid_wtls6 OBJ_wap_wsg_idm_ecid,6L + +#define SN_wap_wsg_idm_ecid_wtls7 "wap-wsg-idm-ecid-wtls7" +#define NID_wap_wsg_idm_ecid_wtls7 740 +#define OBJ_wap_wsg_idm_ecid_wtls7 OBJ_wap_wsg_idm_ecid,7L + +#define SN_wap_wsg_idm_ecid_wtls8 "wap-wsg-idm-ecid-wtls8" +#define NID_wap_wsg_idm_ecid_wtls8 741 +#define OBJ_wap_wsg_idm_ecid_wtls8 OBJ_wap_wsg_idm_ecid,8L + +#define SN_wap_wsg_idm_ecid_wtls9 "wap-wsg-idm-ecid-wtls9" +#define NID_wap_wsg_idm_ecid_wtls9 742 +#define OBJ_wap_wsg_idm_ecid_wtls9 OBJ_wap_wsg_idm_ecid,9L + +#define SN_wap_wsg_idm_ecid_wtls10 "wap-wsg-idm-ecid-wtls10" +#define NID_wap_wsg_idm_ecid_wtls10 743 +#define OBJ_wap_wsg_idm_ecid_wtls10 OBJ_wap_wsg_idm_ecid,10L + +#define SN_wap_wsg_idm_ecid_wtls11 "wap-wsg-idm-ecid-wtls11" +#define NID_wap_wsg_idm_ecid_wtls11 744 +#define OBJ_wap_wsg_idm_ecid_wtls11 OBJ_wap_wsg_idm_ecid,11L + +#define SN_wap_wsg_idm_ecid_wtls12 "wap-wsg-idm-ecid-wtls12" +#define NID_wap_wsg_idm_ecid_wtls12 745 +#define OBJ_wap_wsg_idm_ecid_wtls12 OBJ_wap_wsg_idm_ecid,12L + +#define SN_cast5_cbc "CAST5-CBC" +#define LN_cast5_cbc "cast5-cbc" +#define NID_cast5_cbc 108 +#define OBJ_cast5_cbc OBJ_ISO_US,113533L,7L,66L,10L + +#define SN_cast5_ecb "CAST5-ECB" +#define LN_cast5_ecb "cast5-ecb" +#define NID_cast5_ecb 109 + +#define SN_cast5_cfb64 "CAST5-CFB" +#define LN_cast5_cfb64 "cast5-cfb" +#define NID_cast5_cfb64 110 + +#define SN_cast5_ofb64 "CAST5-OFB" +#define LN_cast5_ofb64 "cast5-ofb" +#define NID_cast5_ofb64 111 + +#define LN_pbeWithMD5AndCast5_CBC "pbeWithMD5AndCast5CBC" +#define NID_pbeWithMD5AndCast5_CBC 112 +#define OBJ_pbeWithMD5AndCast5_CBC OBJ_ISO_US,113533L,7L,66L,12L + +#define SN_id_PasswordBasedMAC "id-PasswordBasedMAC" +#define LN_id_PasswordBasedMAC "password based MAC" +#define NID_id_PasswordBasedMAC 782 +#define OBJ_id_PasswordBasedMAC OBJ_ISO_US,113533L,7L,66L,13L + +#define SN_id_DHBasedMac "id-DHBasedMac" +#define LN_id_DHBasedMac "Diffie-Hellman based MAC" +#define NID_id_DHBasedMac 783 +#define OBJ_id_DHBasedMac OBJ_ISO_US,113533L,7L,66L,30L + +#define SN_rsadsi "rsadsi" +#define LN_rsadsi "RSA Data Security, Inc." +#define NID_rsadsi 1 +#define OBJ_rsadsi OBJ_ISO_US,113549L + +#define SN_pkcs "pkcs" +#define LN_pkcs "RSA Data Security, Inc. PKCS" +#define NID_pkcs 2 +#define OBJ_pkcs OBJ_rsadsi,1L + +#define SN_pkcs1 "pkcs1" +#define NID_pkcs1 186 +#define OBJ_pkcs1 OBJ_pkcs,1L + +#define LN_rsaEncryption "rsaEncryption" +#define NID_rsaEncryption 6 +#define OBJ_rsaEncryption OBJ_pkcs1,1L + +#define SN_md2WithRSAEncryption "RSA-MD2" +#define LN_md2WithRSAEncryption "md2WithRSAEncryption" +#define NID_md2WithRSAEncryption 7 +#define OBJ_md2WithRSAEncryption OBJ_pkcs1,2L + +#define SN_md4WithRSAEncryption "RSA-MD4" +#define LN_md4WithRSAEncryption "md4WithRSAEncryption" +#define NID_md4WithRSAEncryption 396 +#define OBJ_md4WithRSAEncryption OBJ_pkcs1,3L + +#define SN_md5WithRSAEncryption "RSA-MD5" +#define LN_md5WithRSAEncryption "md5WithRSAEncryption" +#define NID_md5WithRSAEncryption 8 +#define OBJ_md5WithRSAEncryption OBJ_pkcs1,4L + +#define SN_sha1WithRSAEncryption "RSA-SHA1" +#define LN_sha1WithRSAEncryption "sha1WithRSAEncryption" +#define NID_sha1WithRSAEncryption 65 +#define OBJ_sha1WithRSAEncryption OBJ_pkcs1,5L + +#define SN_rsaesOaep "RSAES-OAEP" +#define LN_rsaesOaep "rsaesOaep" +#define NID_rsaesOaep 919 +#define OBJ_rsaesOaep OBJ_pkcs1,7L + +#define SN_mgf1 "MGF1" +#define LN_mgf1 "mgf1" +#define NID_mgf1 911 +#define OBJ_mgf1 OBJ_pkcs1,8L + +#define SN_pSpecified "PSPECIFIED" +#define LN_pSpecified "pSpecified" +#define NID_pSpecified 935 +#define OBJ_pSpecified OBJ_pkcs1,9L + +#define SN_rsassaPss "RSASSA-PSS" +#define LN_rsassaPss "rsassaPss" +#define NID_rsassaPss 912 +#define OBJ_rsassaPss OBJ_pkcs1,10L + +#define SN_sha256WithRSAEncryption "RSA-SHA256" +#define LN_sha256WithRSAEncryption "sha256WithRSAEncryption" +#define NID_sha256WithRSAEncryption 668 +#define OBJ_sha256WithRSAEncryption OBJ_pkcs1,11L + +#define SN_sha384WithRSAEncryption "RSA-SHA384" +#define LN_sha384WithRSAEncryption "sha384WithRSAEncryption" +#define NID_sha384WithRSAEncryption 669 +#define OBJ_sha384WithRSAEncryption OBJ_pkcs1,12L + +#define SN_sha512WithRSAEncryption "RSA-SHA512" +#define LN_sha512WithRSAEncryption "sha512WithRSAEncryption" +#define NID_sha512WithRSAEncryption 670 +#define OBJ_sha512WithRSAEncryption OBJ_pkcs1,13L + +#define SN_sha224WithRSAEncryption "RSA-SHA224" +#define LN_sha224WithRSAEncryption "sha224WithRSAEncryption" +#define NID_sha224WithRSAEncryption 671 +#define OBJ_sha224WithRSAEncryption OBJ_pkcs1,14L + +#define SN_sha512_224WithRSAEncryption "RSA-SHA512/224" +#define LN_sha512_224WithRSAEncryption "sha512-224WithRSAEncryption" +#define NID_sha512_224WithRSAEncryption 1145 +#define OBJ_sha512_224WithRSAEncryption OBJ_pkcs1,15L + +#define SN_sha512_256WithRSAEncryption "RSA-SHA512/256" +#define LN_sha512_256WithRSAEncryption "sha512-256WithRSAEncryption" +#define NID_sha512_256WithRSAEncryption 1146 +#define OBJ_sha512_256WithRSAEncryption OBJ_pkcs1,16L + +#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_smime_ct_contentCollection "id-smime-ct-contentCollection" +#define NID_id_smime_ct_contentCollection 1058 +#define OBJ_id_smime_ct_contentCollection OBJ_id_smime_ct,19L + +#define SN_id_smime_ct_authEnvelopedData "id-smime-ct-authEnvelopedData" +#define NID_id_smime_ct_authEnvelopedData 1059 +#define OBJ_id_smime_ct_authEnvelopedData OBJ_id_smime_ct,23L + +#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_ct_xml "id-ct-xml" +#define NID_id_ct_xml 1060 +#define OBJ_id_ct_xml OBJ_id_smime_ct,28L + +#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_aa_signingCertificateV2 "id-smime-aa-signingCertificateV2" +#define NID_id_smime_aa_signingCertificateV2 1086 +#define OBJ_id_smime_aa_signingCertificateV2 OBJ_id_smime_aa,47L + +#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 SN_sm2 "SM2" +#define LN_sm2 "sm2" +#define NID_sm2 1172 +#define OBJ_sm2 OBJ_sm_scheme,301L + +#define SN_sm3 "SM3" +#define LN_sm3 "sm3" +#define NID_sm3 1143 +#define OBJ_sm3 OBJ_sm_scheme,401L + +#define SN_sm3WithRSAEncryption "RSA-SM3" +#define LN_sm3WithRSAEncryption "sm3WithRSAEncryption" +#define NID_sm3WithRSAEncryption 1144 +#define OBJ_sm3WithRSAEncryption OBJ_sm_scheme,504L + +#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 LN_hmacWithSHA512_224 "hmacWithSHA512-224" +#define NID_hmacWithSHA512_224 1193 +#define OBJ_hmacWithSHA512_224 OBJ_rsadsi,2L,12L + +#define LN_hmacWithSHA512_256 "hmacWithSHA512-256" +#define NID_hmacWithSHA512_256 1194 +#define OBJ_hmacWithSHA512_256 OBJ_rsadsi,2L,13L + +#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 Smartcard Login" +#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 User 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_tlsfeature "tlsfeature" +#define LN_tlsfeature "TLS Feature" +#define NID_tlsfeature 1020 +#define OBJ_tlsfeature OBJ_id_pe,24L + +#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_ipsec_IKE "ipsecIKE" +#define LN_ipsec_IKE "ipsec Internet Key Exchange" +#define NID_ipsec_IKE 1022 +#define OBJ_ipsec_IKE OBJ_id_kp,17L + +#define SN_capwapAC "capwapAC" +#define LN_capwapAC "Ctrl/provision WAP Access" +#define NID_capwapAC 1023 +#define OBJ_capwapAC OBJ_id_kp,18L + +#define SN_capwapWTP "capwapWTP" +#define LN_capwapWTP "Ctrl/Provision WAP Termination" +#define NID_capwapWTP 1024 +#define OBJ_capwapWTP OBJ_id_kp,19L + +#define SN_sshClient "secureShellClient" +#define LN_sshClient "SSH Client" +#define NID_sshClient 1025 +#define OBJ_sshClient OBJ_id_kp,21L + +#define SN_sshServer "secureShellServer" +#define LN_sshServer "SSH Server" +#define NID_sshServer 1026 +#define OBJ_sshServer OBJ_id_kp,22L + +#define SN_sendRouter "sendRouter" +#define LN_sendRouter "Send Router" +#define NID_sendRouter 1027 +#define OBJ_sendRouter OBJ_id_kp,23L + +#define SN_sendProxiedRouter "sendProxiedRouter" +#define LN_sendProxiedRouter "Send Proxied Router" +#define NID_sendProxiedRouter 1028 +#define OBJ_sendProxiedRouter OBJ_id_kp,24L + +#define SN_sendOwner "sendOwner" +#define LN_sendOwner "Send Owner" +#define NID_sendOwner 1029 +#define OBJ_sendOwner OBJ_id_kp,25L + +#define SN_sendProxiedOwner "sendProxiedOwner" +#define LN_sendProxiedOwner "Send Proxied Owner" +#define NID_sendProxiedOwner 1030 +#define OBJ_sendProxiedOwner OBJ_id_kp,26L + +#define SN_cmcCA "cmcCA" +#define LN_cmcCA "CMC Certificate Authority" +#define NID_cmcCA 1131 +#define OBJ_cmcCA OBJ_id_kp,27L + +#define SN_cmcRA "cmcRA" +#define LN_cmcRA "CMC Registration Authority" +#define NID_cmcRA 1132 +#define OBJ_cmcRA OBJ_id_kp,28L + +#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_blake2b512 "BLAKE2b512" +#define LN_blake2b512 "blake2b512" +#define NID_blake2b512 1056 +#define OBJ_blake2b512 1L,3L,6L,1L,4L,1L,1722L,12L,2L,1L,16L + +#define SN_blake2s256 "BLAKE2s256" +#define LN_blake2s256 "blake2s256" +#define NID_blake2s256 1057 +#define OBJ_blake2s256 1L,3L,6L,1L,4L,1L,1722L,12L,2L,2L,8L + +#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 LN_organizationIdentifier "organizationIdentifier" +#define NID_organizationIdentifier 1089 +#define OBJ_organizationIdentifier OBJ_X509,97L + +#define SN_countryCode3c "c3" +#define LN_countryCode3c "countryCode3c" +#define NID_countryCode3c 1090 +#define OBJ_countryCode3c OBJ_X509,98L + +#define SN_countryCode3n "n3" +#define LN_countryCode3n "countryCode3n" +#define NID_countryCode3n 1091 +#define OBJ_countryCode3n OBJ_X509,99L + +#define LN_dnsName "dnsName" +#define NID_dnsName 1092 +#define OBJ_dnsName OBJ_X509,100L + +#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 Distribution 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_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_xts "AES-128-XTS" +#define LN_aes_128_xts "aes-128-xts" +#define NID_aes_128_xts 913 +#define OBJ_aes_128_xts OBJ_ieee_siswg,0L,1L,1L + +#define SN_aes_256_xts "AES-256-XTS" +#define LN_aes_256_xts "aes-256-xts" +#define NID_aes_256_xts 914 +#define OBJ_aes_256_xts OBJ_ieee_siswg,0L,1L,2L + +#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_ocb "AES-128-OCB" +#define LN_aes_128_ocb "aes-128-ocb" +#define NID_aes_128_ocb 958 + +#define SN_aes_192_ocb "AES-192-OCB" +#define LN_aes_192_ocb "aes-192-ocb" +#define NID_aes_192_ocb 959 + +#define SN_aes_256_ocb "AES-256-OCB" +#define LN_aes_256_ocb "aes-256-ocb" +#define NID_aes_256_ocb 960 + +#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 SN_sha512_224 "SHA512-224" +#define LN_sha512_224 "sha512-224" +#define NID_sha512_224 1094 +#define OBJ_sha512_224 OBJ_nist_hashalgs,5L + +#define SN_sha512_256 "SHA512-256" +#define LN_sha512_256 "sha512-256" +#define NID_sha512_256 1095 +#define OBJ_sha512_256 OBJ_nist_hashalgs,6L + +#define SN_sha3_224 "SHA3-224" +#define LN_sha3_224 "sha3-224" +#define NID_sha3_224 1096 +#define OBJ_sha3_224 OBJ_nist_hashalgs,7L + +#define SN_sha3_256 "SHA3-256" +#define LN_sha3_256 "sha3-256" +#define NID_sha3_256 1097 +#define OBJ_sha3_256 OBJ_nist_hashalgs,8L + +#define SN_sha3_384 "SHA3-384" +#define LN_sha3_384 "sha3-384" +#define NID_sha3_384 1098 +#define OBJ_sha3_384 OBJ_nist_hashalgs,9L + +#define SN_sha3_512 "SHA3-512" +#define LN_sha3_512 "sha3-512" +#define NID_sha3_512 1099 +#define OBJ_sha3_512 OBJ_nist_hashalgs,10L + +#define SN_shake128 "SHAKE128" +#define LN_shake128 "shake128" +#define NID_shake128 1100 +#define OBJ_shake128 OBJ_nist_hashalgs,11L + +#define SN_shake256 "SHAKE256" +#define LN_shake256 "shake256" +#define NID_shake256 1101 +#define OBJ_shake256 OBJ_nist_hashalgs,12L + +#define SN_hmac_sha3_224 "id-hmacWithSHA3-224" +#define LN_hmac_sha3_224 "hmac-sha3-224" +#define NID_hmac_sha3_224 1102 +#define OBJ_hmac_sha3_224 OBJ_nist_hashalgs,13L + +#define SN_hmac_sha3_256 "id-hmacWithSHA3-256" +#define LN_hmac_sha3_256 "hmac-sha3-256" +#define NID_hmac_sha3_256 1103 +#define OBJ_hmac_sha3_256 OBJ_nist_hashalgs,14L + +#define SN_hmac_sha3_384 "id-hmacWithSHA3-384" +#define LN_hmac_sha3_384 "hmac-sha3-384" +#define NID_hmac_sha3_384 1104 +#define OBJ_hmac_sha3_384 OBJ_nist_hashalgs,15L + +#define SN_hmac_sha3_512 "id-hmacWithSHA3-512" +#define LN_hmac_sha3_512 "hmac-sha3-512" +#define NID_hmac_sha3_512 1105 +#define OBJ_hmac_sha3_512 OBJ_nist_hashalgs,16L + +#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 OBJ_sigAlgs OBJ_nistAlgorithms,3L + +#define SN_dsa_with_SHA384 "id-dsa-with-sha384" +#define LN_dsa_with_SHA384 "dsa_with_SHA384" +#define NID_dsa_with_SHA384 1106 +#define OBJ_dsa_with_SHA384 OBJ_sigAlgs,3L + +#define SN_dsa_with_SHA512 "id-dsa-with-sha512" +#define LN_dsa_with_SHA512 "dsa_with_SHA512" +#define NID_dsa_with_SHA512 1107 +#define OBJ_dsa_with_SHA512 OBJ_sigAlgs,4L + +#define SN_dsa_with_SHA3_224 "id-dsa-with-sha3-224" +#define LN_dsa_with_SHA3_224 "dsa_with_SHA3-224" +#define NID_dsa_with_SHA3_224 1108 +#define OBJ_dsa_with_SHA3_224 OBJ_sigAlgs,5L + +#define SN_dsa_with_SHA3_256 "id-dsa-with-sha3-256" +#define LN_dsa_with_SHA3_256 "dsa_with_SHA3-256" +#define NID_dsa_with_SHA3_256 1109 +#define OBJ_dsa_with_SHA3_256 OBJ_sigAlgs,6L + +#define SN_dsa_with_SHA3_384 "id-dsa-with-sha3-384" +#define LN_dsa_with_SHA3_384 "dsa_with_SHA3-384" +#define NID_dsa_with_SHA3_384 1110 +#define OBJ_dsa_with_SHA3_384 OBJ_sigAlgs,7L + +#define SN_dsa_with_SHA3_512 "id-dsa-with-sha3-512" +#define LN_dsa_with_SHA3_512 "dsa_with_SHA3-512" +#define NID_dsa_with_SHA3_512 1111 +#define OBJ_dsa_with_SHA3_512 OBJ_sigAlgs,8L + +#define SN_ecdsa_with_SHA3_224 "id-ecdsa-with-sha3-224" +#define LN_ecdsa_with_SHA3_224 "ecdsa_with_SHA3-224" +#define NID_ecdsa_with_SHA3_224 1112 +#define OBJ_ecdsa_with_SHA3_224 OBJ_sigAlgs,9L + +#define SN_ecdsa_with_SHA3_256 "id-ecdsa-with-sha3-256" +#define LN_ecdsa_with_SHA3_256 "ecdsa_with_SHA3-256" +#define NID_ecdsa_with_SHA3_256 1113 +#define OBJ_ecdsa_with_SHA3_256 OBJ_sigAlgs,10L + +#define SN_ecdsa_with_SHA3_384 "id-ecdsa-with-sha3-384" +#define LN_ecdsa_with_SHA3_384 "ecdsa_with_SHA3-384" +#define NID_ecdsa_with_SHA3_384 1114 +#define OBJ_ecdsa_with_SHA3_384 OBJ_sigAlgs,11L + +#define SN_ecdsa_with_SHA3_512 "id-ecdsa-with-sha3-512" +#define LN_ecdsa_with_SHA3_512 "ecdsa_with_SHA3-512" +#define NID_ecdsa_with_SHA3_512 1115 +#define OBJ_ecdsa_with_SHA3_512 OBJ_sigAlgs,12L + +#define SN_RSA_SHA3_224 "id-rsassa-pkcs1-v1_5-with-sha3-224" +#define LN_RSA_SHA3_224 "RSA-SHA3-224" +#define NID_RSA_SHA3_224 1116 +#define OBJ_RSA_SHA3_224 OBJ_sigAlgs,13L + +#define SN_RSA_SHA3_256 "id-rsassa-pkcs1-v1_5-with-sha3-256" +#define LN_RSA_SHA3_256 "RSA-SHA3-256" +#define NID_RSA_SHA3_256 1117 +#define OBJ_RSA_SHA3_256 OBJ_sigAlgs,14L + +#define SN_RSA_SHA3_384 "id-rsassa-pkcs1-v1_5-with-sha3-384" +#define LN_RSA_SHA3_384 "RSA-SHA3-384" +#define NID_RSA_SHA3_384 1118 +#define OBJ_RSA_SHA3_384 OBJ_sigAlgs,15L + +#define SN_RSA_SHA3_512 "id-rsassa-pkcs1-v1_5-with-sha3-512" +#define LN_RSA_SHA3_512 "RSA-SHA3-512" +#define NID_RSA_SHA3_512 1119 +#define OBJ_RSA_SHA3_512 OBJ_sigAlgs,16L + +#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 SN_uniqueIdentifier "uid" +#define LN_uniqueIdentifier "uniqueIdentifier" +#define NID_uniqueIdentifier 102 +#define OBJ_uniqueIdentifier OBJ_pilotAttributeType,44L + +#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_tc26 "id-tc26" +#define NID_id_tc26 974 +#define OBJ_id_tc26 OBJ_member_body,643L,7L,1L + +#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_gost89_cnt_12 "gost89-cnt-12" +#define NID_gost89_cnt_12 975 + +#define SN_gost89_cbc "gost89-cbc" +#define NID_gost89_cbc 1009 + +#define SN_gost89_ecb "gost89-ecb" +#define NID_gost89_ecb 1010 + +#define SN_gost89_ctr "gost89-ctr" +#define NID_gost89_ctr 1011 + +#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_gost_mac_12 "gost-mac-12" +#define NID_gost_mac_12 976 + +#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_id_tc26_algorithms "id-tc26-algorithms" +#define NID_id_tc26_algorithms 977 +#define OBJ_id_tc26_algorithms OBJ_id_tc26,1L + +#define SN_id_tc26_sign "id-tc26-sign" +#define NID_id_tc26_sign 978 +#define OBJ_id_tc26_sign OBJ_id_tc26_algorithms,1L + +#define SN_id_GostR3410_2012_256 "gost2012_256" +#define LN_id_GostR3410_2012_256 "GOST R 34.10-2012 with 256 bit modulus" +#define NID_id_GostR3410_2012_256 979 +#define OBJ_id_GostR3410_2012_256 OBJ_id_tc26_sign,1L + +#define SN_id_GostR3410_2012_512 "gost2012_512" +#define LN_id_GostR3410_2012_512 "GOST R 34.10-2012 with 512 bit modulus" +#define NID_id_GostR3410_2012_512 980 +#define OBJ_id_GostR3410_2012_512 OBJ_id_tc26_sign,2L + +#define SN_id_tc26_digest "id-tc26-digest" +#define NID_id_tc26_digest 981 +#define OBJ_id_tc26_digest OBJ_id_tc26_algorithms,2L + +#define SN_id_GostR3411_2012_256 "md_gost12_256" +#define LN_id_GostR3411_2012_256 "GOST R 34.11-2012 with 256 bit hash" +#define NID_id_GostR3411_2012_256 982 +#define OBJ_id_GostR3411_2012_256 OBJ_id_tc26_digest,2L + +#define SN_id_GostR3411_2012_512 "md_gost12_512" +#define LN_id_GostR3411_2012_512 "GOST R 34.11-2012 with 512 bit hash" +#define NID_id_GostR3411_2012_512 983 +#define OBJ_id_GostR3411_2012_512 OBJ_id_tc26_digest,3L + +#define SN_id_tc26_signwithdigest "id-tc26-signwithdigest" +#define NID_id_tc26_signwithdigest 984 +#define OBJ_id_tc26_signwithdigest OBJ_id_tc26_algorithms,3L + +#define SN_id_tc26_signwithdigest_gost3410_2012_256 "id-tc26-signwithdigest-gost3410-2012-256" +#define LN_id_tc26_signwithdigest_gost3410_2012_256 "GOST R 34.10-2012 with GOST R 34.11-2012 (256 bit)" +#define NID_id_tc26_signwithdigest_gost3410_2012_256 985 +#define OBJ_id_tc26_signwithdigest_gost3410_2012_256 OBJ_id_tc26_signwithdigest,2L + +#define SN_id_tc26_signwithdigest_gost3410_2012_512 "id-tc26-signwithdigest-gost3410-2012-512" +#define LN_id_tc26_signwithdigest_gost3410_2012_512 "GOST R 34.10-2012 with GOST R 34.11-2012 (512 bit)" +#define NID_id_tc26_signwithdigest_gost3410_2012_512 986 +#define OBJ_id_tc26_signwithdigest_gost3410_2012_512 OBJ_id_tc26_signwithdigest,3L + +#define SN_id_tc26_mac "id-tc26-mac" +#define NID_id_tc26_mac 987 +#define OBJ_id_tc26_mac OBJ_id_tc26_algorithms,4L + +#define SN_id_tc26_hmac_gost_3411_2012_256 "id-tc26-hmac-gost-3411-2012-256" +#define LN_id_tc26_hmac_gost_3411_2012_256 "HMAC GOST 34.11-2012 256 bit" +#define NID_id_tc26_hmac_gost_3411_2012_256 988 +#define OBJ_id_tc26_hmac_gost_3411_2012_256 OBJ_id_tc26_mac,1L + +#define SN_id_tc26_hmac_gost_3411_2012_512 "id-tc26-hmac-gost-3411-2012-512" +#define LN_id_tc26_hmac_gost_3411_2012_512 "HMAC GOST 34.11-2012 512 bit" +#define NID_id_tc26_hmac_gost_3411_2012_512 989 +#define OBJ_id_tc26_hmac_gost_3411_2012_512 OBJ_id_tc26_mac,2L + +#define SN_id_tc26_cipher "id-tc26-cipher" +#define NID_id_tc26_cipher 990 +#define OBJ_id_tc26_cipher OBJ_id_tc26_algorithms,5L + +#define SN_id_tc26_cipher_gostr3412_2015_magma "id-tc26-cipher-gostr3412-2015-magma" +#define NID_id_tc26_cipher_gostr3412_2015_magma 1173 +#define OBJ_id_tc26_cipher_gostr3412_2015_magma OBJ_id_tc26_cipher,1L + +#define SN_id_tc26_cipher_gostr3412_2015_magma_ctracpkm "id-tc26-cipher-gostr3412-2015-magma-ctracpkm" +#define NID_id_tc26_cipher_gostr3412_2015_magma_ctracpkm 1174 +#define OBJ_id_tc26_cipher_gostr3412_2015_magma_ctracpkm OBJ_id_tc26_cipher_gostr3412_2015_magma,1L + +#define SN_id_tc26_cipher_gostr3412_2015_magma_ctracpkm_omac "id-tc26-cipher-gostr3412-2015-magma-ctracpkm-omac" +#define NID_id_tc26_cipher_gostr3412_2015_magma_ctracpkm_omac 1175 +#define OBJ_id_tc26_cipher_gostr3412_2015_magma_ctracpkm_omac OBJ_id_tc26_cipher_gostr3412_2015_magma,2L + +#define SN_id_tc26_cipher_gostr3412_2015_kuznyechik "id-tc26-cipher-gostr3412-2015-kuznyechik" +#define NID_id_tc26_cipher_gostr3412_2015_kuznyechik 1176 +#define OBJ_id_tc26_cipher_gostr3412_2015_kuznyechik OBJ_id_tc26_cipher,2L + +#define SN_id_tc26_cipher_gostr3412_2015_kuznyechik_ctracpkm "id-tc26-cipher-gostr3412-2015-kuznyechik-ctracpkm" +#define NID_id_tc26_cipher_gostr3412_2015_kuznyechik_ctracpkm 1177 +#define OBJ_id_tc26_cipher_gostr3412_2015_kuznyechik_ctracpkm OBJ_id_tc26_cipher_gostr3412_2015_kuznyechik,1L + +#define SN_id_tc26_cipher_gostr3412_2015_kuznyechik_ctracpkm_omac "id-tc26-cipher-gostr3412-2015-kuznyechik-ctracpkm-omac" +#define NID_id_tc26_cipher_gostr3412_2015_kuznyechik_ctracpkm_omac 1178 +#define OBJ_id_tc26_cipher_gostr3412_2015_kuznyechik_ctracpkm_omac OBJ_id_tc26_cipher_gostr3412_2015_kuznyechik,2L + +#define SN_id_tc26_agreement "id-tc26-agreement" +#define NID_id_tc26_agreement 991 +#define OBJ_id_tc26_agreement OBJ_id_tc26_algorithms,6L + +#define SN_id_tc26_agreement_gost_3410_2012_256 "id-tc26-agreement-gost-3410-2012-256" +#define NID_id_tc26_agreement_gost_3410_2012_256 992 +#define OBJ_id_tc26_agreement_gost_3410_2012_256 OBJ_id_tc26_agreement,1L + +#define SN_id_tc26_agreement_gost_3410_2012_512 "id-tc26-agreement-gost-3410-2012-512" +#define NID_id_tc26_agreement_gost_3410_2012_512 993 +#define OBJ_id_tc26_agreement_gost_3410_2012_512 OBJ_id_tc26_agreement,2L + +#define SN_id_tc26_wrap "id-tc26-wrap" +#define NID_id_tc26_wrap 1179 +#define OBJ_id_tc26_wrap OBJ_id_tc26_algorithms,7L + +#define SN_id_tc26_wrap_gostr3412_2015_magma "id-tc26-wrap-gostr3412-2015-magma" +#define NID_id_tc26_wrap_gostr3412_2015_magma 1180 +#define OBJ_id_tc26_wrap_gostr3412_2015_magma OBJ_id_tc26_wrap,1L + +#define SN_id_tc26_wrap_gostr3412_2015_magma_kexp15 "id-tc26-wrap-gostr3412-2015-magma-kexp15" +#define NID_id_tc26_wrap_gostr3412_2015_magma_kexp15 1181 +#define OBJ_id_tc26_wrap_gostr3412_2015_magma_kexp15 OBJ_id_tc26_wrap_gostr3412_2015_magma,1L + +#define SN_id_tc26_wrap_gostr3412_2015_kuznyechik "id-tc26-wrap-gostr3412-2015-kuznyechik" +#define NID_id_tc26_wrap_gostr3412_2015_kuznyechik 1182 +#define OBJ_id_tc26_wrap_gostr3412_2015_kuznyechik OBJ_id_tc26_wrap,2L + +#define SN_id_tc26_wrap_gostr3412_2015_kuznyechik_kexp15 "id-tc26-wrap-gostr3412-2015-kuznyechik-kexp15" +#define NID_id_tc26_wrap_gostr3412_2015_kuznyechik_kexp15 1183 +#define OBJ_id_tc26_wrap_gostr3412_2015_kuznyechik_kexp15 OBJ_id_tc26_wrap_gostr3412_2015_kuznyechik,1L + +#define SN_id_tc26_constants "id-tc26-constants" +#define NID_id_tc26_constants 994 +#define OBJ_id_tc26_constants OBJ_id_tc26,2L + +#define SN_id_tc26_sign_constants "id-tc26-sign-constants" +#define NID_id_tc26_sign_constants 995 +#define OBJ_id_tc26_sign_constants OBJ_id_tc26_constants,1L + +#define SN_id_tc26_gost_3410_2012_256_constants "id-tc26-gost-3410-2012-256-constants" +#define NID_id_tc26_gost_3410_2012_256_constants 1147 +#define OBJ_id_tc26_gost_3410_2012_256_constants OBJ_id_tc26_sign_constants,1L + +#define SN_id_tc26_gost_3410_2012_256_paramSetA "id-tc26-gost-3410-2012-256-paramSetA" +#define LN_id_tc26_gost_3410_2012_256_paramSetA "GOST R 34.10-2012 (256 bit) ParamSet A" +#define NID_id_tc26_gost_3410_2012_256_paramSetA 1148 +#define OBJ_id_tc26_gost_3410_2012_256_paramSetA OBJ_id_tc26_gost_3410_2012_256_constants,1L + +#define SN_id_tc26_gost_3410_2012_256_paramSetB "id-tc26-gost-3410-2012-256-paramSetB" +#define LN_id_tc26_gost_3410_2012_256_paramSetB "GOST R 34.10-2012 (256 bit) ParamSet B" +#define NID_id_tc26_gost_3410_2012_256_paramSetB 1184 +#define OBJ_id_tc26_gost_3410_2012_256_paramSetB OBJ_id_tc26_gost_3410_2012_256_constants,2L + +#define SN_id_tc26_gost_3410_2012_256_paramSetC "id-tc26-gost-3410-2012-256-paramSetC" +#define LN_id_tc26_gost_3410_2012_256_paramSetC "GOST R 34.10-2012 (256 bit) ParamSet C" +#define NID_id_tc26_gost_3410_2012_256_paramSetC 1185 +#define OBJ_id_tc26_gost_3410_2012_256_paramSetC OBJ_id_tc26_gost_3410_2012_256_constants,3L + +#define SN_id_tc26_gost_3410_2012_256_paramSetD "id-tc26-gost-3410-2012-256-paramSetD" +#define LN_id_tc26_gost_3410_2012_256_paramSetD "GOST R 34.10-2012 (256 bit) ParamSet D" +#define NID_id_tc26_gost_3410_2012_256_paramSetD 1186 +#define OBJ_id_tc26_gost_3410_2012_256_paramSetD OBJ_id_tc26_gost_3410_2012_256_constants,4L + +#define SN_id_tc26_gost_3410_2012_512_constants "id-tc26-gost-3410-2012-512-constants" +#define NID_id_tc26_gost_3410_2012_512_constants 996 +#define OBJ_id_tc26_gost_3410_2012_512_constants OBJ_id_tc26_sign_constants,2L + +#define SN_id_tc26_gost_3410_2012_512_paramSetTest "id-tc26-gost-3410-2012-512-paramSetTest" +#define LN_id_tc26_gost_3410_2012_512_paramSetTest "GOST R 34.10-2012 (512 bit) testing parameter set" +#define NID_id_tc26_gost_3410_2012_512_paramSetTest 997 +#define OBJ_id_tc26_gost_3410_2012_512_paramSetTest OBJ_id_tc26_gost_3410_2012_512_constants,0L + +#define SN_id_tc26_gost_3410_2012_512_paramSetA "id-tc26-gost-3410-2012-512-paramSetA" +#define LN_id_tc26_gost_3410_2012_512_paramSetA "GOST R 34.10-2012 (512 bit) ParamSet A" +#define NID_id_tc26_gost_3410_2012_512_paramSetA 998 +#define OBJ_id_tc26_gost_3410_2012_512_paramSetA OBJ_id_tc26_gost_3410_2012_512_constants,1L + +#define SN_id_tc26_gost_3410_2012_512_paramSetB "id-tc26-gost-3410-2012-512-paramSetB" +#define LN_id_tc26_gost_3410_2012_512_paramSetB "GOST R 34.10-2012 (512 bit) ParamSet B" +#define NID_id_tc26_gost_3410_2012_512_paramSetB 999 +#define OBJ_id_tc26_gost_3410_2012_512_paramSetB OBJ_id_tc26_gost_3410_2012_512_constants,2L + +#define SN_id_tc26_gost_3410_2012_512_paramSetC "id-tc26-gost-3410-2012-512-paramSetC" +#define LN_id_tc26_gost_3410_2012_512_paramSetC "GOST R 34.10-2012 (512 bit) ParamSet C" +#define NID_id_tc26_gost_3410_2012_512_paramSetC 1149 +#define OBJ_id_tc26_gost_3410_2012_512_paramSetC OBJ_id_tc26_gost_3410_2012_512_constants,3L + +#define SN_id_tc26_digest_constants "id-tc26-digest-constants" +#define NID_id_tc26_digest_constants 1000 +#define OBJ_id_tc26_digest_constants OBJ_id_tc26_constants,2L + +#define SN_id_tc26_cipher_constants "id-tc26-cipher-constants" +#define NID_id_tc26_cipher_constants 1001 +#define OBJ_id_tc26_cipher_constants OBJ_id_tc26_constants,5L + +#define SN_id_tc26_gost_28147_constants "id-tc26-gost-28147-constants" +#define NID_id_tc26_gost_28147_constants 1002 +#define OBJ_id_tc26_gost_28147_constants OBJ_id_tc26_cipher_constants,1L + +#define SN_id_tc26_gost_28147_param_Z "id-tc26-gost-28147-param-Z" +#define LN_id_tc26_gost_28147_param_Z "GOST 28147-89 TC26 parameter set" +#define NID_id_tc26_gost_28147_param_Z 1003 +#define OBJ_id_tc26_gost_28147_param_Z OBJ_id_tc26_gost_28147_constants,1L + +#define SN_INN "INN" +#define LN_INN "INN" +#define NID_INN 1004 +#define OBJ_INN OBJ_member_body,643L,3L,131L,1L,1L + +#define SN_OGRN "OGRN" +#define LN_OGRN "OGRN" +#define NID_OGRN 1005 +#define OBJ_OGRN OBJ_member_body,643L,100L,1L + +#define SN_SNILS "SNILS" +#define LN_SNILS "SNILS" +#define NID_SNILS 1006 +#define OBJ_SNILS OBJ_member_body,643L,100L,3L + +#define SN_subjectSignTool "subjectSignTool" +#define LN_subjectSignTool "Signing Tool of Subject" +#define NID_subjectSignTool 1007 +#define OBJ_subjectSignTool OBJ_member_body,643L,100L,111L + +#define SN_issuerSignTool "issuerSignTool" +#define LN_issuerSignTool "Signing Tool of Issuer" +#define NID_issuerSignTool 1008 +#define OBJ_issuerSignTool OBJ_member_body,643L,100L,112L + +#define SN_grasshopper_ecb "grasshopper-ecb" +#define NID_grasshopper_ecb 1012 + +#define SN_grasshopper_ctr "grasshopper-ctr" +#define NID_grasshopper_ctr 1013 + +#define SN_grasshopper_ofb "grasshopper-ofb" +#define NID_grasshopper_ofb 1014 + +#define SN_grasshopper_cbc "grasshopper-cbc" +#define NID_grasshopper_cbc 1015 + +#define SN_grasshopper_cfb "grasshopper-cfb" +#define NID_grasshopper_cfb 1016 + +#define SN_grasshopper_mac "grasshopper-mac" +#define NID_grasshopper_mac 1017 + +#define SN_magma_ecb "magma-ecb" +#define NID_magma_ecb 1187 + +#define SN_magma_ctr "magma-ctr" +#define NID_magma_ctr 1188 + +#define SN_magma_ofb "magma-ofb" +#define NID_magma_ofb 1189 + +#define SN_magma_cbc "magma-cbc" +#define NID_magma_cbc 1190 + +#define SN_magma_cfb "magma-cfb" +#define NID_magma_cfb 1191 + +#define SN_magma_mac "magma-mac" +#define NID_magma_mac 1192 + +#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_128_gcm "CAMELLIA-128-GCM" +#define LN_camellia_128_gcm "camellia-128-gcm" +#define NID_camellia_128_gcm 961 +#define OBJ_camellia_128_gcm OBJ_camellia,6L + +#define SN_camellia_128_ccm "CAMELLIA-128-CCM" +#define LN_camellia_128_ccm "camellia-128-ccm" +#define NID_camellia_128_ccm 962 +#define OBJ_camellia_128_ccm OBJ_camellia,7L + +#define SN_camellia_128_ctr "CAMELLIA-128-CTR" +#define LN_camellia_128_ctr "camellia-128-ctr" +#define NID_camellia_128_ctr 963 +#define OBJ_camellia_128_ctr OBJ_camellia,9L + +#define SN_camellia_128_cmac "CAMELLIA-128-CMAC" +#define LN_camellia_128_cmac "camellia-128-cmac" +#define NID_camellia_128_cmac 964 +#define OBJ_camellia_128_cmac OBJ_camellia,10L + +#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_192_gcm "CAMELLIA-192-GCM" +#define LN_camellia_192_gcm "camellia-192-gcm" +#define NID_camellia_192_gcm 965 +#define OBJ_camellia_192_gcm OBJ_camellia,26L + +#define SN_camellia_192_ccm "CAMELLIA-192-CCM" +#define LN_camellia_192_ccm "camellia-192-ccm" +#define NID_camellia_192_ccm 966 +#define OBJ_camellia_192_ccm OBJ_camellia,27L + +#define SN_camellia_192_ctr "CAMELLIA-192-CTR" +#define LN_camellia_192_ctr "camellia-192-ctr" +#define NID_camellia_192_ctr 967 +#define OBJ_camellia_192_ctr OBJ_camellia,29L + +#define SN_camellia_192_cmac "CAMELLIA-192-CMAC" +#define LN_camellia_192_cmac "camellia-192-cmac" +#define NID_camellia_192_cmac 968 +#define OBJ_camellia_192_cmac OBJ_camellia,30L + +#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_256_gcm "CAMELLIA-256-GCM" +#define LN_camellia_256_gcm "camellia-256-gcm" +#define NID_camellia_256_gcm 969 +#define OBJ_camellia_256_gcm OBJ_camellia,46L + +#define SN_camellia_256_ccm "CAMELLIA-256-CCM" +#define LN_camellia_256_ccm "camellia-256-ccm" +#define NID_camellia_256_ccm 970 +#define OBJ_camellia_256_ccm OBJ_camellia,47L + +#define SN_camellia_256_ctr "CAMELLIA-256-CTR" +#define LN_camellia_256_ctr "camellia-256-ctr" +#define NID_camellia_256_ctr 971 +#define OBJ_camellia_256_ctr OBJ_camellia,49L + +#define SN_camellia_256_cmac "CAMELLIA-256-CMAC" +#define LN_camellia_256_cmac "camellia-256-cmac" +#define NID_camellia_256_cmac 972 +#define OBJ_camellia_256_cmac OBJ_camellia,50L + +#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 OBJ_aria 1L,2L,410L,200046L,1L,1L + +#define SN_aria_128_ecb "ARIA-128-ECB" +#define LN_aria_128_ecb "aria-128-ecb" +#define NID_aria_128_ecb 1065 +#define OBJ_aria_128_ecb OBJ_aria,1L + +#define SN_aria_128_cbc "ARIA-128-CBC" +#define LN_aria_128_cbc "aria-128-cbc" +#define NID_aria_128_cbc 1066 +#define OBJ_aria_128_cbc OBJ_aria,2L + +#define SN_aria_128_cfb128 "ARIA-128-CFB" +#define LN_aria_128_cfb128 "aria-128-cfb" +#define NID_aria_128_cfb128 1067 +#define OBJ_aria_128_cfb128 OBJ_aria,3L + +#define SN_aria_128_ofb128 "ARIA-128-OFB" +#define LN_aria_128_ofb128 "aria-128-ofb" +#define NID_aria_128_ofb128 1068 +#define OBJ_aria_128_ofb128 OBJ_aria,4L + +#define SN_aria_128_ctr "ARIA-128-CTR" +#define LN_aria_128_ctr "aria-128-ctr" +#define NID_aria_128_ctr 1069 +#define OBJ_aria_128_ctr OBJ_aria,5L + +#define SN_aria_192_ecb "ARIA-192-ECB" +#define LN_aria_192_ecb "aria-192-ecb" +#define NID_aria_192_ecb 1070 +#define OBJ_aria_192_ecb OBJ_aria,6L + +#define SN_aria_192_cbc "ARIA-192-CBC" +#define LN_aria_192_cbc "aria-192-cbc" +#define NID_aria_192_cbc 1071 +#define OBJ_aria_192_cbc OBJ_aria,7L + +#define SN_aria_192_cfb128 "ARIA-192-CFB" +#define LN_aria_192_cfb128 "aria-192-cfb" +#define NID_aria_192_cfb128 1072 +#define OBJ_aria_192_cfb128 OBJ_aria,8L + +#define SN_aria_192_ofb128 "ARIA-192-OFB" +#define LN_aria_192_ofb128 "aria-192-ofb" +#define NID_aria_192_ofb128 1073 +#define OBJ_aria_192_ofb128 OBJ_aria,9L + +#define SN_aria_192_ctr "ARIA-192-CTR" +#define LN_aria_192_ctr "aria-192-ctr" +#define NID_aria_192_ctr 1074 +#define OBJ_aria_192_ctr OBJ_aria,10L + +#define SN_aria_256_ecb "ARIA-256-ECB" +#define LN_aria_256_ecb "aria-256-ecb" +#define NID_aria_256_ecb 1075 +#define OBJ_aria_256_ecb OBJ_aria,11L + +#define SN_aria_256_cbc "ARIA-256-CBC" +#define LN_aria_256_cbc "aria-256-cbc" +#define NID_aria_256_cbc 1076 +#define OBJ_aria_256_cbc OBJ_aria,12L + +#define SN_aria_256_cfb128 "ARIA-256-CFB" +#define LN_aria_256_cfb128 "aria-256-cfb" +#define NID_aria_256_cfb128 1077 +#define OBJ_aria_256_cfb128 OBJ_aria,13L + +#define SN_aria_256_ofb128 "ARIA-256-OFB" +#define LN_aria_256_ofb128 "aria-256-ofb" +#define NID_aria_256_ofb128 1078 +#define OBJ_aria_256_ofb128 OBJ_aria,14L + +#define SN_aria_256_ctr "ARIA-256-CTR" +#define LN_aria_256_ctr "aria-256-ctr" +#define NID_aria_256_ctr 1079 +#define OBJ_aria_256_ctr OBJ_aria,15L + +#define SN_aria_128_cfb1 "ARIA-128-CFB1" +#define LN_aria_128_cfb1 "aria-128-cfb1" +#define NID_aria_128_cfb1 1080 + +#define SN_aria_192_cfb1 "ARIA-192-CFB1" +#define LN_aria_192_cfb1 "aria-192-cfb1" +#define NID_aria_192_cfb1 1081 + +#define SN_aria_256_cfb1 "ARIA-256-CFB1" +#define LN_aria_256_cfb1 "aria-256-cfb1" +#define NID_aria_256_cfb1 1082 + +#define SN_aria_128_cfb8 "ARIA-128-CFB8" +#define LN_aria_128_cfb8 "aria-128-cfb8" +#define NID_aria_128_cfb8 1083 + +#define SN_aria_192_cfb8 "ARIA-192-CFB8" +#define LN_aria_192_cfb8 "aria-192-cfb8" +#define NID_aria_192_cfb8 1084 + +#define SN_aria_256_cfb8 "ARIA-256-CFB8" +#define LN_aria_256_cfb8 "aria-256-cfb8" +#define NID_aria_256_cfb8 1085 + +#define SN_aria_128_ccm "ARIA-128-CCM" +#define LN_aria_128_ccm "aria-128-ccm" +#define NID_aria_128_ccm 1120 +#define OBJ_aria_128_ccm OBJ_aria,37L + +#define SN_aria_192_ccm "ARIA-192-CCM" +#define LN_aria_192_ccm "aria-192-ccm" +#define NID_aria_192_ccm 1121 +#define OBJ_aria_192_ccm OBJ_aria,38L + +#define SN_aria_256_ccm "ARIA-256-CCM" +#define LN_aria_256_ccm "aria-256-ccm" +#define NID_aria_256_ccm 1122 +#define OBJ_aria_256_ccm OBJ_aria,39L + +#define SN_aria_128_gcm "ARIA-128-GCM" +#define LN_aria_128_gcm "aria-128-gcm" +#define NID_aria_128_gcm 1123 +#define OBJ_aria_128_gcm OBJ_aria,34L + +#define SN_aria_192_gcm "ARIA-192-GCM" +#define LN_aria_192_gcm "aria-192-gcm" +#define NID_aria_192_gcm 1124 +#define OBJ_aria_192_gcm OBJ_aria,35L + +#define SN_aria_256_gcm "ARIA-256-GCM" +#define LN_aria_256_gcm "aria-256-gcm" +#define NID_aria_256_gcm 1125 +#define OBJ_aria_256_gcm OBJ_aria,36L + +#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_sm4_ecb "SM4-ECB" +#define LN_sm4_ecb "sm4-ecb" +#define NID_sm4_ecb 1133 +#define OBJ_sm4_ecb OBJ_sm_scheme,104L,1L + +#define SN_sm4_cbc "SM4-CBC" +#define LN_sm4_cbc "sm4-cbc" +#define NID_sm4_cbc 1134 +#define OBJ_sm4_cbc OBJ_sm_scheme,104L,2L + +#define SN_sm4_ofb128 "SM4-OFB" +#define LN_sm4_ofb128 "sm4-ofb" +#define NID_sm4_ofb128 1135 +#define OBJ_sm4_ofb128 OBJ_sm_scheme,104L,3L + +#define SN_sm4_cfb128 "SM4-CFB" +#define LN_sm4_cfb128 "sm4-cfb" +#define NID_sm4_cfb128 1137 +#define OBJ_sm4_cfb128 OBJ_sm_scheme,104L,4L + +#define SN_sm4_cfb1 "SM4-CFB1" +#define LN_sm4_cfb1 "sm4-cfb1" +#define NID_sm4_cfb1 1136 +#define OBJ_sm4_cfb1 OBJ_sm_scheme,104L,5L + +#define SN_sm4_cfb8 "SM4-CFB8" +#define LN_sm4_cfb8 "sm4-cfb8" +#define NID_sm4_cfb8 1138 +#define OBJ_sm4_cfb8 OBJ_sm_scheme,104L,6L + +#define SN_sm4_ctr "SM4-CTR" +#define LN_sm4_ctr "sm4-ctr" +#define NID_sm4_ctr 1139 +#define OBJ_sm4_ctr OBJ_sm_scheme,104L,7L + +#define SN_hmac "HMAC" +#define LN_hmac "hmac" +#define NID_hmac 855 + +#define SN_cmac "CMAC" +#define LN_cmac "cmac" +#define NID_cmac 894 + +#define SN_rc4_hmac_md5 "RC4-HMAC-MD5" +#define LN_rc4_hmac_md5 "rc4-hmac-md5" +#define NID_rc4_hmac_md5 915 + +#define SN_aes_128_cbc_hmac_sha1 "AES-128-CBC-HMAC-SHA1" +#define LN_aes_128_cbc_hmac_sha1 "aes-128-cbc-hmac-sha1" +#define NID_aes_128_cbc_hmac_sha1 916 + +#define SN_aes_192_cbc_hmac_sha1 "AES-192-CBC-HMAC-SHA1" +#define LN_aes_192_cbc_hmac_sha1 "aes-192-cbc-hmac-sha1" +#define NID_aes_192_cbc_hmac_sha1 917 + +#define SN_aes_256_cbc_hmac_sha1 "AES-256-CBC-HMAC-SHA1" +#define LN_aes_256_cbc_hmac_sha1 "aes-256-cbc-hmac-sha1" +#define NID_aes_256_cbc_hmac_sha1 918 + +#define SN_aes_128_cbc_hmac_sha256 "AES-128-CBC-HMAC-SHA256" +#define LN_aes_128_cbc_hmac_sha256 "aes-128-cbc-hmac-sha256" +#define NID_aes_128_cbc_hmac_sha256 948 + +#define SN_aes_192_cbc_hmac_sha256 "AES-192-CBC-HMAC-SHA256" +#define LN_aes_192_cbc_hmac_sha256 "aes-192-cbc-hmac-sha256" +#define NID_aes_192_cbc_hmac_sha256 949 + +#define SN_aes_256_cbc_hmac_sha256 "AES-256-CBC-HMAC-SHA256" +#define LN_aes_256_cbc_hmac_sha256 "aes-256-cbc-hmac-sha256" +#define NID_aes_256_cbc_hmac_sha256 950 + +#define SN_chacha20_poly1305 "ChaCha20-Poly1305" +#define LN_chacha20_poly1305 "chacha20-poly1305" +#define NID_chacha20_poly1305 1018 + +#define SN_chacha20 "ChaCha20" +#define LN_chacha20 "chacha20" +#define NID_chacha20 1019 + +#define SN_dhpublicnumber "dhpublicnumber" +#define LN_dhpublicnumber "X9.42 DH" +#define NID_dhpublicnumber 920 +#define OBJ_dhpublicnumber OBJ_ISO_US,10046L,2L,1L + +#define SN_brainpoolP160r1 "brainpoolP160r1" +#define NID_brainpoolP160r1 921 +#define OBJ_brainpoolP160r1 1L,3L,36L,3L,3L,2L,8L,1L,1L,1L + +#define SN_brainpoolP160t1 "brainpoolP160t1" +#define NID_brainpoolP160t1 922 +#define OBJ_brainpoolP160t1 1L,3L,36L,3L,3L,2L,8L,1L,1L,2L + +#define SN_brainpoolP192r1 "brainpoolP192r1" +#define NID_brainpoolP192r1 923 +#define OBJ_brainpoolP192r1 1L,3L,36L,3L,3L,2L,8L,1L,1L,3L + +#define SN_brainpoolP192t1 "brainpoolP192t1" +#define NID_brainpoolP192t1 924 +#define OBJ_brainpoolP192t1 1L,3L,36L,3L,3L,2L,8L,1L,1L,4L + +#define SN_brainpoolP224r1 "brainpoolP224r1" +#define NID_brainpoolP224r1 925 +#define OBJ_brainpoolP224r1 1L,3L,36L,3L,3L,2L,8L,1L,1L,5L + +#define SN_brainpoolP224t1 "brainpoolP224t1" +#define NID_brainpoolP224t1 926 +#define OBJ_brainpoolP224t1 1L,3L,36L,3L,3L,2L,8L,1L,1L,6L + +#define SN_brainpoolP256r1 "brainpoolP256r1" +#define NID_brainpoolP256r1 927 +#define OBJ_brainpoolP256r1 1L,3L,36L,3L,3L,2L,8L,1L,1L,7L + +#define SN_brainpoolP256t1 "brainpoolP256t1" +#define NID_brainpoolP256t1 928 +#define OBJ_brainpoolP256t1 1L,3L,36L,3L,3L,2L,8L,1L,1L,8L + +#define SN_brainpoolP320r1 "brainpoolP320r1" +#define NID_brainpoolP320r1 929 +#define OBJ_brainpoolP320r1 1L,3L,36L,3L,3L,2L,8L,1L,1L,9L + +#define SN_brainpoolP320t1 "brainpoolP320t1" +#define NID_brainpoolP320t1 930 +#define OBJ_brainpoolP320t1 1L,3L,36L,3L,3L,2L,8L,1L,1L,10L + +#define SN_brainpoolP384r1 "brainpoolP384r1" +#define NID_brainpoolP384r1 931 +#define OBJ_brainpoolP384r1 1L,3L,36L,3L,3L,2L,8L,1L,1L,11L + +#define SN_brainpoolP384t1 "brainpoolP384t1" +#define NID_brainpoolP384t1 932 +#define OBJ_brainpoolP384t1 1L,3L,36L,3L,3L,2L,8L,1L,1L,12L + +#define SN_brainpoolP512r1 "brainpoolP512r1" +#define NID_brainpoolP512r1 933 +#define OBJ_brainpoolP512r1 1L,3L,36L,3L,3L,2L,8L,1L,1L,13L + +#define SN_brainpoolP512t1 "brainpoolP512t1" +#define NID_brainpoolP512t1 934 +#define OBJ_brainpoolP512t1 1L,3L,36L,3L,3L,2L,8L,1L,1L,14L + +#define OBJ_x9_63_scheme 1L,3L,133L,16L,840L,63L,0L + +#define OBJ_secg_scheme OBJ_certicom_arc,1L + +#define SN_dhSinglePass_stdDH_sha1kdf_scheme "dhSinglePass-stdDH-sha1kdf-scheme" +#define NID_dhSinglePass_stdDH_sha1kdf_scheme 936 +#define OBJ_dhSinglePass_stdDH_sha1kdf_scheme OBJ_x9_63_scheme,2L + +#define SN_dhSinglePass_stdDH_sha224kdf_scheme "dhSinglePass-stdDH-sha224kdf-scheme" +#define NID_dhSinglePass_stdDH_sha224kdf_scheme 937 +#define OBJ_dhSinglePass_stdDH_sha224kdf_scheme OBJ_secg_scheme,11L,0L + +#define SN_dhSinglePass_stdDH_sha256kdf_scheme "dhSinglePass-stdDH-sha256kdf-scheme" +#define NID_dhSinglePass_stdDH_sha256kdf_scheme 938 +#define OBJ_dhSinglePass_stdDH_sha256kdf_scheme OBJ_secg_scheme,11L,1L + +#define SN_dhSinglePass_stdDH_sha384kdf_scheme "dhSinglePass-stdDH-sha384kdf-scheme" +#define NID_dhSinglePass_stdDH_sha384kdf_scheme 939 +#define OBJ_dhSinglePass_stdDH_sha384kdf_scheme OBJ_secg_scheme,11L,2L + +#define SN_dhSinglePass_stdDH_sha512kdf_scheme "dhSinglePass-stdDH-sha512kdf-scheme" +#define NID_dhSinglePass_stdDH_sha512kdf_scheme 940 +#define OBJ_dhSinglePass_stdDH_sha512kdf_scheme OBJ_secg_scheme,11L,3L + +#define SN_dhSinglePass_cofactorDH_sha1kdf_scheme "dhSinglePass-cofactorDH-sha1kdf-scheme" +#define NID_dhSinglePass_cofactorDH_sha1kdf_scheme 941 +#define OBJ_dhSinglePass_cofactorDH_sha1kdf_scheme OBJ_x9_63_scheme,3L + +#define SN_dhSinglePass_cofactorDH_sha224kdf_scheme "dhSinglePass-cofactorDH-sha224kdf-scheme" +#define NID_dhSinglePass_cofactorDH_sha224kdf_scheme 942 +#define OBJ_dhSinglePass_cofactorDH_sha224kdf_scheme OBJ_secg_scheme,14L,0L + +#define SN_dhSinglePass_cofactorDH_sha256kdf_scheme "dhSinglePass-cofactorDH-sha256kdf-scheme" +#define NID_dhSinglePass_cofactorDH_sha256kdf_scheme 943 +#define OBJ_dhSinglePass_cofactorDH_sha256kdf_scheme OBJ_secg_scheme,14L,1L + +#define SN_dhSinglePass_cofactorDH_sha384kdf_scheme "dhSinglePass-cofactorDH-sha384kdf-scheme" +#define NID_dhSinglePass_cofactorDH_sha384kdf_scheme 944 +#define OBJ_dhSinglePass_cofactorDH_sha384kdf_scheme OBJ_secg_scheme,14L,2L + +#define SN_dhSinglePass_cofactorDH_sha512kdf_scheme "dhSinglePass-cofactorDH-sha512kdf-scheme" +#define NID_dhSinglePass_cofactorDH_sha512kdf_scheme 945 +#define OBJ_dhSinglePass_cofactorDH_sha512kdf_scheme OBJ_secg_scheme,14L,3L + +#define SN_dh_std_kdf "dh-std-kdf" +#define NID_dh_std_kdf 946 + +#define SN_dh_cofactor_kdf "dh-cofactor-kdf" +#define NID_dh_cofactor_kdf 947 + +#define SN_ct_precert_scts "ct_precert_scts" +#define LN_ct_precert_scts "CT Precertificate SCTs" +#define NID_ct_precert_scts 951 +#define OBJ_ct_precert_scts 1L,3L,6L,1L,4L,1L,11129L,2L,4L,2L + +#define SN_ct_precert_poison "ct_precert_poison" +#define LN_ct_precert_poison "CT Precertificate Poison" +#define NID_ct_precert_poison 952 +#define OBJ_ct_precert_poison 1L,3L,6L,1L,4L,1L,11129L,2L,4L,3L + +#define SN_ct_precert_signer "ct_precert_signer" +#define LN_ct_precert_signer "CT Precertificate Signer" +#define NID_ct_precert_signer 953 +#define OBJ_ct_precert_signer 1L,3L,6L,1L,4L,1L,11129L,2L,4L,4L + +#define SN_ct_cert_scts "ct_cert_scts" +#define LN_ct_cert_scts "CT Certificate SCTs" +#define NID_ct_cert_scts 954 +#define OBJ_ct_cert_scts 1L,3L,6L,1L,4L,1L,11129L,2L,4L,5L + +#define SN_jurisdictionLocalityName "jurisdictionL" +#define LN_jurisdictionLocalityName "jurisdictionLocalityName" +#define NID_jurisdictionLocalityName 955 +#define OBJ_jurisdictionLocalityName 1L,3L,6L,1L,4L,1L,311L,60L,2L,1L,1L + +#define SN_jurisdictionStateOrProvinceName "jurisdictionST" +#define LN_jurisdictionStateOrProvinceName "jurisdictionStateOrProvinceName" +#define NID_jurisdictionStateOrProvinceName 956 +#define OBJ_jurisdictionStateOrProvinceName 1L,3L,6L,1L,4L,1L,311L,60L,2L,1L,2L + +#define SN_jurisdictionCountryName "jurisdictionC" +#define LN_jurisdictionCountryName "jurisdictionCountryName" +#define NID_jurisdictionCountryName 957 +#define OBJ_jurisdictionCountryName 1L,3L,6L,1L,4L,1L,311L,60L,2L,1L,3L + +#define SN_id_scrypt "id-scrypt" +#define LN_id_scrypt "scrypt" +#define NID_id_scrypt 973 +#define OBJ_id_scrypt 1L,3L,6L,1L,4L,1L,11591L,4L,11L + +#define SN_tls1_prf "TLS1-PRF" +#define LN_tls1_prf "tls1-prf" +#define NID_tls1_prf 1021 + +#define SN_hkdf "HKDF" +#define LN_hkdf "hkdf" +#define NID_hkdf 1036 + +#define SN_id_pkinit "id-pkinit" +#define NID_id_pkinit 1031 +#define OBJ_id_pkinit 1L,3L,6L,1L,5L,2L,3L + +#define SN_pkInitClientAuth "pkInitClientAuth" +#define LN_pkInitClientAuth "PKINIT Client Auth" +#define NID_pkInitClientAuth 1032 +#define OBJ_pkInitClientAuth OBJ_id_pkinit,4L + +#define SN_pkInitKDC "pkInitKDC" +#define LN_pkInitKDC "Signing KDC Response" +#define NID_pkInitKDC 1033 +#define OBJ_pkInitKDC OBJ_id_pkinit,5L + +#define SN_X25519 "X25519" +#define NID_X25519 1034 +#define OBJ_X25519 1L,3L,101L,110L + +#define SN_X448 "X448" +#define NID_X448 1035 +#define OBJ_X448 1L,3L,101L,111L + +#define SN_ED25519 "ED25519" +#define NID_ED25519 1087 +#define OBJ_ED25519 1L,3L,101L,112L + +#define SN_ED448 "ED448" +#define NID_ED448 1088 +#define OBJ_ED448 1L,3L,101L,113L + +#define SN_kx_rsa "KxRSA" +#define LN_kx_rsa "kx-rsa" +#define NID_kx_rsa 1037 + +#define SN_kx_ecdhe "KxECDHE" +#define LN_kx_ecdhe "kx-ecdhe" +#define NID_kx_ecdhe 1038 + +#define SN_kx_dhe "KxDHE" +#define LN_kx_dhe "kx-dhe" +#define NID_kx_dhe 1039 + +#define SN_kx_ecdhe_psk "KxECDHE-PSK" +#define LN_kx_ecdhe_psk "kx-ecdhe-psk" +#define NID_kx_ecdhe_psk 1040 + +#define SN_kx_dhe_psk "KxDHE-PSK" +#define LN_kx_dhe_psk "kx-dhe-psk" +#define NID_kx_dhe_psk 1041 + +#define SN_kx_rsa_psk "KxRSA_PSK" +#define LN_kx_rsa_psk "kx-rsa-psk" +#define NID_kx_rsa_psk 1042 + +#define SN_kx_psk "KxPSK" +#define LN_kx_psk "kx-psk" +#define NID_kx_psk 1043 + +#define SN_kx_srp "KxSRP" +#define LN_kx_srp "kx-srp" +#define NID_kx_srp 1044 + +#define SN_kx_gost "KxGOST" +#define LN_kx_gost "kx-gost" +#define NID_kx_gost 1045 + +#define SN_kx_any "KxANY" +#define LN_kx_any "kx-any" +#define NID_kx_any 1063 + +#define SN_auth_rsa "AuthRSA" +#define LN_auth_rsa "auth-rsa" +#define NID_auth_rsa 1046 + +#define SN_auth_ecdsa "AuthECDSA" +#define LN_auth_ecdsa "auth-ecdsa" +#define NID_auth_ecdsa 1047 + +#define SN_auth_psk "AuthPSK" +#define LN_auth_psk "auth-psk" +#define NID_auth_psk 1048 + +#define SN_auth_dss "AuthDSS" +#define LN_auth_dss "auth-dss" +#define NID_auth_dss 1049 + +#define SN_auth_gost01 "AuthGOST01" +#define LN_auth_gost01 "auth-gost01" +#define NID_auth_gost01 1050 + +#define SN_auth_gost12 "AuthGOST12" +#define LN_auth_gost12 "auth-gost12" +#define NID_auth_gost12 1051 + +#define SN_auth_srp "AuthSRP" +#define LN_auth_srp "auth-srp" +#define NID_auth_srp 1052 + +#define SN_auth_null "AuthNULL" +#define LN_auth_null "auth-null" +#define NID_auth_null 1053 + +#define SN_auth_any "AuthANY" +#define LN_auth_any "auth-any" +#define NID_auth_any 1064 + +#define SN_poly1305 "Poly1305" +#define LN_poly1305 "poly1305" +#define NID_poly1305 1061 + +#define SN_siphash "SipHash" +#define LN_siphash "siphash" +#define NID_siphash 1062 + +#define SN_ffdhe2048 "ffdhe2048" +#define NID_ffdhe2048 1126 + +#define SN_ffdhe3072 "ffdhe3072" +#define NID_ffdhe3072 1127 + +#define SN_ffdhe4096 "ffdhe4096" +#define NID_ffdhe4096 1128 + +#define SN_ffdhe6144 "ffdhe6144" +#define NID_ffdhe6144 1129 + +#define SN_ffdhe8192 "ffdhe8192" +#define NID_ffdhe8192 1130 + +#define SN_ISO_UA "ISO-UA" +#define NID_ISO_UA 1150 +#define OBJ_ISO_UA OBJ_member_body,804L + +#define SN_ua_pki "ua-pki" +#define NID_ua_pki 1151 +#define OBJ_ua_pki OBJ_ISO_UA,2L,1L,1L,1L + +#define SN_dstu28147 "dstu28147" +#define LN_dstu28147 "DSTU Gost 28147-2009" +#define NID_dstu28147 1152 +#define OBJ_dstu28147 OBJ_ua_pki,1L,1L,1L + +#define SN_dstu28147_ofb "dstu28147-ofb" +#define LN_dstu28147_ofb "DSTU Gost 28147-2009 OFB mode" +#define NID_dstu28147_ofb 1153 +#define OBJ_dstu28147_ofb OBJ_dstu28147,2L + +#define SN_dstu28147_cfb "dstu28147-cfb" +#define LN_dstu28147_cfb "DSTU Gost 28147-2009 CFB mode" +#define NID_dstu28147_cfb 1154 +#define OBJ_dstu28147_cfb OBJ_dstu28147,3L + +#define SN_dstu28147_wrap "dstu28147-wrap" +#define LN_dstu28147_wrap "DSTU Gost 28147-2009 key wrap" +#define NID_dstu28147_wrap 1155 +#define OBJ_dstu28147_wrap OBJ_dstu28147,5L + +#define SN_hmacWithDstu34311 "hmacWithDstu34311" +#define LN_hmacWithDstu34311 "HMAC DSTU Gost 34311-95" +#define NID_hmacWithDstu34311 1156 +#define OBJ_hmacWithDstu34311 OBJ_ua_pki,1L,1L,2L + +#define SN_dstu34311 "dstu34311" +#define LN_dstu34311 "DSTU Gost 34311-95" +#define NID_dstu34311 1157 +#define OBJ_dstu34311 OBJ_ua_pki,1L,2L,1L + +#define SN_dstu4145le "dstu4145le" +#define LN_dstu4145le "DSTU 4145-2002 little endian" +#define NID_dstu4145le 1158 +#define OBJ_dstu4145le OBJ_ua_pki,1L,3L,1L,1L + +#define SN_dstu4145be "dstu4145be" +#define LN_dstu4145be "DSTU 4145-2002 big endian" +#define NID_dstu4145be 1159 +#define OBJ_dstu4145be OBJ_dstu4145le,1L,1L + +#define SN_uacurve0 "uacurve0" +#define LN_uacurve0 "DSTU curve 0" +#define NID_uacurve0 1160 +#define OBJ_uacurve0 OBJ_dstu4145le,2L,0L + +#define SN_uacurve1 "uacurve1" +#define LN_uacurve1 "DSTU curve 1" +#define NID_uacurve1 1161 +#define OBJ_uacurve1 OBJ_dstu4145le,2L,1L + +#define SN_uacurve2 "uacurve2" +#define LN_uacurve2 "DSTU curve 2" +#define NID_uacurve2 1162 +#define OBJ_uacurve2 OBJ_dstu4145le,2L,2L + +#define SN_uacurve3 "uacurve3" +#define LN_uacurve3 "DSTU curve 3" +#define NID_uacurve3 1163 +#define OBJ_uacurve3 OBJ_dstu4145le,2L,3L + +#define SN_uacurve4 "uacurve4" +#define LN_uacurve4 "DSTU curve 4" +#define NID_uacurve4 1164 +#define OBJ_uacurve4 OBJ_dstu4145le,2L,4L + +#define SN_uacurve5 "uacurve5" +#define LN_uacurve5 "DSTU curve 5" +#define NID_uacurve5 1165 +#define OBJ_uacurve5 OBJ_dstu4145le,2L,5L + +#define SN_uacurve6 "uacurve6" +#define LN_uacurve6 "DSTU curve 6" +#define NID_uacurve6 1166 +#define OBJ_uacurve6 OBJ_dstu4145le,2L,6L + +#define SN_uacurve7 "uacurve7" +#define LN_uacurve7 "DSTU curve 7" +#define NID_uacurve7 1167 +#define OBJ_uacurve7 OBJ_dstu4145le,2L,7L + +#define SN_uacurve8 "uacurve8" +#define LN_uacurve8 "DSTU curve 8" +#define NID_uacurve8 1168 +#define OBJ_uacurve8 OBJ_dstu4145le,2L,8L + +#define SN_uacurve9 "uacurve9" +#define LN_uacurve9 "DSTU curve 9" +#define NID_uacurve9 1169 +#define OBJ_uacurve9 OBJ_dstu4145le,2L,9L diff --git a/openssl-wasm/include/openssl/objects.h b/openssl-wasm/include/openssl/objects.h new file mode 100644 index 0000000..5e8b576 --- /dev/null +++ b/openssl-wasm/include/openssl/objects.h @@ -0,0 +1,175 @@ +/* + * Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_OBJECTS_H +# define HEADER_OBJECTS_H + +# include +# include +# 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 assignment 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, declare 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); +#if OPENSSL_API_COMPAT < 0x10100000L +# define OBJ_cleanup() while(0) continue +#endif +int OBJ_create_objects(BIO *in); + +size_t OBJ_length(const ASN1_OBJECT *obj); +const unsigned char *OBJ_get0_data(const ASN1_OBJECT *obj); + +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); + + +# ifdef __cplusplus +} +# endif +#endif diff --git a/openssl-wasm/include/openssl/objectserr.h b/openssl-wasm/include/openssl/objectserr.h new file mode 100644 index 0000000..02e166f --- /dev/null +++ b/openssl-wasm/include/openssl/objectserr.h @@ -0,0 +1,42 @@ +/* + * Generated by util/mkerr.pl DO NOT EDIT + * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_OBJERR_H +# define HEADER_OBJERR_H + +# ifndef HEADER_SYMHACKS_H +# include +# endif + +# ifdef __cplusplus +extern "C" +# endif +int ERR_load_OBJ_strings(void); + +/* + * OBJ function codes. + */ +# define OBJ_F_OBJ_ADD_OBJECT 105 +# define OBJ_F_OBJ_ADD_SIGID 107 +# 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 +# define OBJ_F_OBJ_TXT2OBJ 108 + +/* + * OBJ reason codes. + */ +# define OBJ_R_OID_EXISTS 102 +# define OBJ_R_UNKNOWN_NID 101 + +#endif diff --git a/openssl-wasm/include/openssl/ocsp.h b/openssl-wasm/include/openssl/ocsp.h new file mode 100644 index 0000000..4d759a4 --- /dev/null +++ b/openssl-wasm/include/openssl/ocsp.h @@ -0,0 +1,352 @@ +/* + * Copyright 2000-2019 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_OCSP_H +# define HEADER_OCSP_H + +#include + +/* + * These definitions are outside the OPENSSL_NO_OCSP guard because although for + * historical reasons they have OCSP_* names, they can actually be used + * independently of OCSP. E.g. see RFC5280 + */ +/*- + * 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 + + +# ifndef OPENSSL_NO_OCSP + +# include +# 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 + +typedef struct ocsp_cert_id_st OCSP_CERTID; + +DEFINE_STACK_OF(OCSP_CERTID) + +typedef struct ocsp_one_request_st OCSP_ONEREQ; + +DEFINE_STACK_OF(OCSP_ONEREQ) + +typedef struct ocsp_req_info_st OCSP_REQINFO; +typedef struct ocsp_signature_st OCSP_SIGNATURE; +typedef struct ocsp_request_st OCSP_REQUEST; + +# 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 + +typedef struct ocsp_resp_bytes_st OCSP_RESPBYTES; + +# define V_OCSP_RESPID_NAME 0 +# define V_OCSP_RESPID_KEY 1 + +DEFINE_STACK_OF(OCSP_RESPID) + +typedef struct ocsp_revoked_info_st OCSP_REVOKEDINFO; + +# define V_OCSP_CERTSTATUS_GOOD 0 +# define V_OCSP_CERTSTATUS_REVOKED 1 +# define V_OCSP_CERTSTATUS_UNKNOWN 2 + +typedef struct ocsp_cert_status_st OCSP_CERTSTATUS; +typedef struct ocsp_single_response_st OCSP_SINGLERESP; + +DEFINE_STACK_OF(OCSP_SINGLERESP) + +typedef struct ocsp_response_data_st OCSP_RESPDATA; + +typedef struct ocsp_basic_response_st OCSP_BASICRESP; + +typedef struct ocsp_crl_id_st OCSP_CRLID; +typedef struct ocsp_service_locator_st 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 ASN1_BIT_STRING_digest(data,type,md,len) \ + ASN1_item_digest(ASN1_ITEM_rptr(ASN1_BIT_STRING),type,data,md,len) + +# define OCSP_CERTSTATUS_dup(cs)\ + (OCSP_CERTSTATUS*)ASN1_dup((int(*)())i2d_OCSP_CERTSTATUS,\ + (char *(*)())d2i_OCSP_CERTSTATUS,(char *)(cs)) + +OCSP_CERTID *OCSP_CERTID_dup(OCSP_CERTID *id); + +OCSP_RESPONSE *OCSP_sendreq_bio(BIO *b, const char *path, OCSP_REQUEST *req); +OCSP_REQ_CTX *OCSP_sendreq_new(BIO *io, const char *path, OCSP_REQUEST *req, + int maxline); +int OCSP_REQ_CTX_nbio(OCSP_REQ_CTX *rctx); +int OCSP_sendreq_nbio(OCSP_RESPONSE **presp, OCSP_REQ_CTX *rctx); +OCSP_REQ_CTX *OCSP_REQ_CTX_new(BIO *io, int maxline); +void OCSP_REQ_CTX_free(OCSP_REQ_CTX *rctx); +void OCSP_set_max_response_length(OCSP_REQ_CTX *rctx, unsigned long len); +int OCSP_REQ_CTX_i2d(OCSP_REQ_CTX *rctx, const ASN1_ITEM *it, + ASN1_VALUE *val); +int OCSP_REQ_CTX_nbio_d2i(OCSP_REQ_CTX *rctx, ASN1_VALUE **pval, + const ASN1_ITEM *it); +BIO *OCSP_REQ_CTX_get0_mem_bio(OCSP_REQ_CTX *rctx); +int OCSP_REQ_CTX_http(OCSP_REQ_CTX *rctx, const char *op, const char *path); +int OCSP_REQ_CTX_set1_req(OCSP_REQ_CTX *rctx, OCSP_REQUEST *req); +int OCSP_REQ_CTX_add1_header(OCSP_REQ_CTX *rctx, + const char *name, const char *value); + +OCSP_CERTID *OCSP_cert_to_id(const EVP_MD *dgst, const X509 *subject, + const X509 *issuer); + +OCSP_CERTID *OCSP_cert_id_new(const EVP_MD *dgst, + const X509_NAME *issuerName, + const ASN1_BIT_STRING *issuerKey, + const 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); + +const ASN1_OCTET_STRING *OCSP_resp_get0_signature(const OCSP_BASICRESP *bs); +const X509_ALGOR *OCSP_resp_get0_tbs_sigalg(const OCSP_BASICRESP *bs); +const OCSP_RESPDATA *OCSP_resp_get0_respdata(const OCSP_BASICRESP *bs); +int OCSP_resp_get0_signer(OCSP_BASICRESP *bs, X509 **signer, + STACK_OF(X509) *extra_certs); + +int OCSP_resp_count(OCSP_BASICRESP *bs); +OCSP_SINGLERESP *OCSP_resp_get0(OCSP_BASICRESP *bs, int idx); +const ASN1_GENERALIZEDTIME *OCSP_resp_get0_produced_at(const OCSP_BASICRESP* bs); +const STACK_OF(X509) *OCSP_resp_get0_certs(const OCSP_BASICRESP *bs); +int OCSP_resp_get0_id(const OCSP_BASICRESP *bs, + const ASN1_OCTET_STRING **pid, + const X509_NAME **pname); +int OCSP_resp_get1_id(const OCSP_BASICRESP *bs, + ASN1_OCTET_STRING **pid, + X509_NAME **pname); + +int OCSP_resp_find(OCSP_BASICRESP *bs, OCSP_CERTID *id, int last); +int OCSP_single_get0_status(OCSP_SINGLERESP *single, int *reason, + ASN1_GENERALIZEDTIME **revtime, + ASN1_GENERALIZEDTIME **thisupd, + ASN1_GENERALIZEDTIME **nextupd); +int OCSP_resp_find_status(OCSP_BASICRESP *bs, OCSP_CERTID *id, int *status, + int *reason, + ASN1_GENERALIZEDTIME **revtime, + ASN1_GENERALIZEDTIME **thisupd, + ASN1_GENERALIZEDTIME **nextupd); +int OCSP_check_validity(ASN1_GENERALIZEDTIME *thisupd, + ASN1_GENERALIZEDTIME *nextupd, long sec, long maxsec); + +int OCSP_request_verify(OCSP_REQUEST *req, STACK_OF(X509) *certs, + X509_STORE *store, unsigned long flags); + +int OCSP_parse_url(const char *url, char **phost, char **pport, char **ppath, + int *pssl); + +int OCSP_id_issuer_cmp(const OCSP_CERTID *a, const OCSP_CERTID *b); +int OCSP_id_cmp(const OCSP_CERTID *a, const 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); +int OCSP_basic_sign_ctx(OCSP_BASICRESP *brsp, + X509 *signer, EVP_MD_CTX *ctx, + STACK_OF(X509) *certs, unsigned long flags); +int OCSP_RESPID_set_by_name(OCSP_RESPID *respid, X509 *cert); +int OCSP_RESPID_set_by_key(OCSP_RESPID *respid, X509 *cert); +int OCSP_RESPID_match(OCSP_RESPID *respid, X509 *cert); + +X509_EXTENSION *OCSP_crlID_new(const 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, const 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, const 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, const 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, const 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, const 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); +const OCSP_CERTID *OCSP_SINGLERESP_get0_id(const OCSP_SINGLERESP *x); + +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); + + +# ifdef __cplusplus +} +# endif +# endif +#endif diff --git a/openssl-wasm/include/openssl/ocsperr.h b/openssl-wasm/include/openssl/ocsperr.h new file mode 100644 index 0000000..8dd9e01 --- /dev/null +++ b/openssl-wasm/include/openssl/ocsperr.h @@ -0,0 +1,78 @@ +/* + * Generated by util/mkerr.pl DO NOT EDIT + * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_OCSPERR_H +# define HEADER_OCSPERR_H + +# ifndef HEADER_SYMHACKS_H +# include +# endif + +# include + +# ifndef OPENSSL_NO_OCSP + +# ifdef __cplusplus +extern "C" +# endif +int ERR_load_OCSP_strings(void); + +/* + * OCSP function codes. + */ +# 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_SIGN_CTX 119 +# 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_PARSE_HTTP_LINE1 118 + +/* + * OCSP reason codes. + */ +# 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_RESPONSE_DATA 108 +# define OCSP_R_NO_REVOKED_TIME 109 +# define OCSP_R_NO_SIGNER_KEY 130 +# 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_RESPONSE_ERROR 114 +# define OCSP_R_SERVER_RESPONSE_PARSE_ERROR 115 +# 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 + +# endif +#endif diff --git a/openssl-wasm/include/openssl/opensslconf.h b/openssl-wasm/include/openssl/opensslconf.h new file mode 100644 index 0000000..fda78f3 --- /dev/null +++ b/openssl-wasm/include/openssl/opensslconf.h @@ -0,0 +1,200 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from include/openssl/opensslconf.h.in + * + * Copyright 2016-2020 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef OPENSSL_ALGORITHM_DEFINES +# error OPENSSL_ALGORITHM_DEFINES no longer supported +#endif + +/* + * OpenSSL was configured with the following options: + */ + +#ifndef OPENSSL_NO_MD2 +# define OPENSSL_NO_MD2 +#endif +#ifndef OPENSSL_NO_RC5 +# define OPENSSL_NO_RC5 +#endif +#ifndef OPENSSL_THREADS +# define OPENSSL_THREADS +#endif +#ifndef OPENSSL_RAND_SEED_OS +# define OPENSSL_RAND_SEED_OS +#endif +#ifndef OPENSSL_NO_AFALGENG +# define OPENSSL_NO_AFALGENG +#endif +#ifndef OPENSSL_NO_ASAN +# define OPENSSL_NO_ASAN +#endif +#ifndef OPENSSL_NO_CRYPTO_MDEBUG +# define OPENSSL_NO_CRYPTO_MDEBUG +#endif +#ifndef OPENSSL_NO_CRYPTO_MDEBUG_BACKTRACE +# define OPENSSL_NO_CRYPTO_MDEBUG_BACKTRACE +#endif +#ifndef OPENSSL_NO_DEVCRYPTOENG +# define OPENSSL_NO_DEVCRYPTOENG +#endif +#ifndef OPENSSL_NO_EC_NISTP_64_GCC_128 +# define OPENSSL_NO_EC_NISTP_64_GCC_128 +#endif +#ifndef OPENSSL_NO_EGD +# define OPENSSL_NO_EGD +#endif +#ifndef OPENSSL_NO_EXTERNAL_TESTS +# define OPENSSL_NO_EXTERNAL_TESTS +#endif +#ifndef OPENSSL_NO_FUZZ_AFL +# define OPENSSL_NO_FUZZ_AFL +#endif +#ifndef OPENSSL_NO_FUZZ_LIBFUZZER +# define OPENSSL_NO_FUZZ_LIBFUZZER +#endif +#ifndef OPENSSL_NO_HEARTBEATS +# define OPENSSL_NO_HEARTBEATS +#endif +#ifndef OPENSSL_NO_MSAN +# define OPENSSL_NO_MSAN +#endif +#ifndef OPENSSL_NO_SCTP +# define OPENSSL_NO_SCTP +#endif +#ifndef OPENSSL_NO_SSL_TRACE +# define OPENSSL_NO_SSL_TRACE +#endif +#ifndef OPENSSL_NO_SSL3 +# define OPENSSL_NO_SSL3 +#endif +#ifndef OPENSSL_NO_SSL3_METHOD +# define OPENSSL_NO_SSL3_METHOD +#endif +#ifndef OPENSSL_NO_UBSAN +# define OPENSSL_NO_UBSAN +#endif +#ifndef OPENSSL_NO_UNIT_TEST +# define OPENSSL_NO_UNIT_TEST +#endif +#ifndef OPENSSL_NO_WEAK_SSL_CIPHERS +# define OPENSSL_NO_WEAK_SSL_CIPHERS +#endif +#ifndef OPENSSL_NO_STATIC_ENGINE +# define OPENSSL_NO_STATIC_ENGINE +#endif + + +/* + * Sometimes OPENSSSL_NO_xxx ends up with an empty file and some compilers + * don't like that. This will hopefully silence them. + */ +#define NON_EMPTY_TRANSLATION_UNIT static void *dummy = &dummy; + +/* + * Applications should use -DOPENSSL_API_COMPAT= to suppress the + * declarations of functions deprecated in or before . Otherwise, they + * still won't see them if the library has been built to disable deprecated + * functions. + */ +#ifndef DECLARE_DEPRECATED +# define DECLARE_DEPRECATED(f) f; +# ifdef __GNUC__ +# if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 0) +# undef DECLARE_DEPRECATED +# define DECLARE_DEPRECATED(f) f __attribute__ ((deprecated)); +# endif +# elif defined(__SUNPRO_C) +# if (__SUNPRO_C >= 0x5130) +# undef DECLARE_DEPRECATED +# define DECLARE_DEPRECATED(f) f __attribute__ ((deprecated)); +# endif +# endif +#endif + +#ifndef OPENSSL_FILE +# ifdef OPENSSL_NO_FILENAMES +# define OPENSSL_FILE "" +# define OPENSSL_LINE 0 +# else +# define OPENSSL_FILE __FILE__ +# define OPENSSL_LINE __LINE__ +# endif +#endif + +#ifndef OPENSSL_MIN_API +# define OPENSSL_MIN_API 0 +#endif + +#if !defined(OPENSSL_API_COMPAT) || OPENSSL_API_COMPAT < OPENSSL_MIN_API +# undef OPENSSL_API_COMPAT +# define OPENSSL_API_COMPAT OPENSSL_MIN_API +#endif + +/* + * Do not deprecate things to be deprecated in version 1.2.0 before the + * OpenSSL version number matches. + */ +#if OPENSSL_VERSION_NUMBER < 0x10200000L +# define DEPRECATEDIN_1_2_0(f) f; +#elif OPENSSL_API_COMPAT < 0x10200000L +# define DEPRECATEDIN_1_2_0(f) DECLARE_DEPRECATED(f) +#else +# define DEPRECATEDIN_1_2_0(f) +#endif + +#if OPENSSL_API_COMPAT < 0x10100000L +# define DEPRECATEDIN_1_1_0(f) DECLARE_DEPRECATED(f) +#else +# define DEPRECATEDIN_1_1_0(f) +#endif + +#if OPENSSL_API_COMPAT < 0x10000000L +# define DEPRECATEDIN_1_0_0(f) DECLARE_DEPRECATED(f) +#else +# define DEPRECATEDIN_1_0_0(f) +#endif + +#if OPENSSL_API_COMPAT < 0x00908000L +# define DEPRECATEDIN_0_9_8(f) DECLARE_DEPRECATED(f) +#else +# define DEPRECATEDIN_0_9_8(f) +#endif + +/* Generate 80386 code? */ +#undef I386_ONLY + +#undef OPENSSL_UNISTD +#define OPENSSL_UNISTD + +#undef OPENSSL_EXPORT_VAR_AS_FUNCTION + +/* + * The following are cipher-specific, but are part of the public API. + */ +#if !defined(OPENSSL_SYS_UEFI) +# undef BN_LLONG +/* Only one for the following should be defined */ +# define SIXTY_FOUR_BIT_LONG +# undef SIXTY_FOUR_BIT +# undef THIRTY_TWO_BIT +#endif + +#define RC4_INT unsigned char + +#ifdef __cplusplus +} +#endif diff --git a/openssl-wasm/include/openssl/opensslconf.h.in b/openssl-wasm/include/openssl/opensslconf.h.in new file mode 100644 index 0000000..0627092 --- /dev/null +++ b/openssl-wasm/include/openssl/opensslconf.h.in @@ -0,0 +1,160 @@ +/* + * {- join("\n * ", @autowarntext) -} + * + * Copyright 2016-2020 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef OPENSSL_ALGORITHM_DEFINES +# error OPENSSL_ALGORITHM_DEFINES no longer supported +#endif + +/* + * OpenSSL was configured with the following options: + */ + +{- if (@{$config{openssl_sys_defines}}) { + foreach (@{$config{openssl_sys_defines}}) { + $OUT .= "#ifndef $_\n"; + $OUT .= "# define $_ 1\n"; + $OUT .= "#endif\n"; + } + } + foreach (@{$config{openssl_api_defines}}) { + (my $macro, my $value) = $_ =~ /^(.*?)=(.*?)$/; + $OUT .= "#define $macro $value\n"; + } + if (@{$config{openssl_algorithm_defines}}) { + foreach (@{$config{openssl_algorithm_defines}}) { + $OUT .= "#ifndef $_\n"; + $OUT .= "# define $_\n"; + $OUT .= "#endif\n"; + } + } + if (@{$config{openssl_thread_defines}}) { + foreach (@{$config{openssl_thread_defines}}) { + $OUT .= "#ifndef $_\n"; + $OUT .= "# define $_\n"; + $OUT .= "#endif\n"; + } + } + if (@{$config{openssl_other_defines}}) { + foreach (@{$config{openssl_other_defines}}) { + $OUT .= "#ifndef $_\n"; + $OUT .= "# define $_\n"; + $OUT .= "#endif\n"; + } + } + ""; +-} + +/* + * Sometimes OPENSSSL_NO_xxx ends up with an empty file and some compilers + * don't like that. This will hopefully silence them. + */ +#define NON_EMPTY_TRANSLATION_UNIT static void *dummy = &dummy; + +/* + * Applications should use -DOPENSSL_API_COMPAT= to suppress the + * declarations of functions deprecated in or before . Otherwise, they + * still won't see them if the library has been built to disable deprecated + * functions. + */ +#ifndef DECLARE_DEPRECATED +# define DECLARE_DEPRECATED(f) f; +# ifdef __GNUC__ +# if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 0) +# undef DECLARE_DEPRECATED +# define DECLARE_DEPRECATED(f) f __attribute__ ((deprecated)); +# endif +# elif defined(__SUNPRO_C) +# if (__SUNPRO_C >= 0x5130) +# undef DECLARE_DEPRECATED +# define DECLARE_DEPRECATED(f) f __attribute__ ((deprecated)); +# endif +# endif +#endif + +#ifndef OPENSSL_FILE +# ifdef OPENSSL_NO_FILENAMES +# define OPENSSL_FILE "" +# define OPENSSL_LINE 0 +# else +# define OPENSSL_FILE __FILE__ +# define OPENSSL_LINE __LINE__ +# endif +#endif + +#ifndef OPENSSL_MIN_API +# define OPENSSL_MIN_API 0 +#endif + +#if !defined(OPENSSL_API_COMPAT) || OPENSSL_API_COMPAT < OPENSSL_MIN_API +# undef OPENSSL_API_COMPAT +# define OPENSSL_API_COMPAT OPENSSL_MIN_API +#endif + +/* + * Do not deprecate things to be deprecated in version 1.2.0 before the + * OpenSSL version number matches. + */ +#if OPENSSL_VERSION_NUMBER < 0x10200000L +# define DEPRECATEDIN_1_2_0(f) f; +#elif OPENSSL_API_COMPAT < 0x10200000L +# define DEPRECATEDIN_1_2_0(f) DECLARE_DEPRECATED(f) +#else +# define DEPRECATEDIN_1_2_0(f) +#endif + +#if OPENSSL_API_COMPAT < 0x10100000L +# define DEPRECATEDIN_1_1_0(f) DECLARE_DEPRECATED(f) +#else +# define DEPRECATEDIN_1_1_0(f) +#endif + +#if OPENSSL_API_COMPAT < 0x10000000L +# define DEPRECATEDIN_1_0_0(f) DECLARE_DEPRECATED(f) +#else +# define DEPRECATEDIN_1_0_0(f) +#endif + +#if OPENSSL_API_COMPAT < 0x00908000L +# define DEPRECATEDIN_0_9_8(f) DECLARE_DEPRECATED(f) +#else +# define DEPRECATEDIN_0_9_8(f) +#endif + +/* Generate 80386 code? */ +{- $config{processor} eq "386" ? "#define" : "#undef" -} I386_ONLY + +#undef OPENSSL_UNISTD +#define OPENSSL_UNISTD {- $target{unistd} -} + +{- $config{export_var_as_fn} ? "#define" : "#undef" -} OPENSSL_EXPORT_VAR_AS_FUNCTION + +/* + * The following are cipher-specific, but are part of the public API. + */ +#if !defined(OPENSSL_SYS_UEFI) +{- $config{bn_ll} ? "# define" : "# undef" -} BN_LLONG +/* Only one for the following should be defined */ +{- $config{b64l} ? "# define" : "# undef" -} SIXTY_FOUR_BIT_LONG +{- $config{b64} ? "# define" : "# undef" -} SIXTY_FOUR_BIT +{- $config{b32} ? "# define" : "# undef" -} THIRTY_TWO_BIT +#endif + +#define RC4_INT {- $config{rc4_int} -} + +#ifdef __cplusplus +} +#endif diff --git a/openssl-wasm/include/openssl/opensslv.h b/openssl-wasm/include/openssl/opensslv.h new file mode 100644 index 0000000..0cd6b2f --- /dev/null +++ b/openssl-wasm/include/openssl/opensslv.h @@ -0,0 +1,101 @@ +/* + * Copyright 1999-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_OPENSSLV_H +# define HEADER_OPENSSLV_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*- + * Numeric release version identifier: + * MNNFFPPS: major minor fix patch status + * The status nibble has one of the values 0 for development, 1 to e for betas + * 1 to 14, and f for release. The patch level is exactly that. + * For example: + * 0.9.3-dev 0x00903000 + * 0.9.3-beta1 0x00903001 + * 0.9.3-beta2-dev 0x00903002 + * 0.9.3-beta2 0x00903002 (same as ...beta2-dev) + * 0.9.3 0x0090300f + * 0.9.3a 0x0090301f + * 0.9.4 0x0090400f + * 1.2.3z 0x102031af + * + * For continuity reasons (because 0.9.5 is already out, and is coded + * 0x00905100), between 0.9.5 and 0.9.6 the coding of the patch level + * part is slightly different, by setting the highest bit. This means + * that 0.9.5a looks like this: 0x0090581f. At 0.9.6, we can start + * with 0x0090600S... + * + * (Prior to 0.9.3-dev a different scheme was used: 0.9.2b is 0x0922.) + * (Prior to 0.9.5a beta1, a different scheme was used: MMNNFFRBB for + * major minor fix final patch/beta) + */ +# define OPENSSL_VERSION_NUMBER 0x101010bfL +# define OPENSSL_VERSION_TEXT "OpenSSL 1.1.1k 25 Mar 2021" + +/*- + * 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 version 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.1" + + +#ifdef __cplusplus +} +#endif +#endif /* HEADER_OPENSSLV_H */ diff --git a/openssl-wasm/include/openssl/ossl_typ.h b/openssl-wasm/include/openssl/ossl_typ.h new file mode 100644 index 0000000..e0edfaa --- /dev/null +++ b/openssl-wasm/include/openssl/ossl_typ.h @@ -0,0 +1,197 @@ +/* + * Copyright 2001-2018 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_OPENSSL_TYPES_H +# define HEADER_OPENSSL_TYPES_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +# include + +# ifdef NO_ASN1_TYPEDEFS +# define ASN1_INTEGER ASN1_STRING +# define ASN1_ENUMERATED ASN1_STRING +# define ASN1_BIT_STRING ASN1_STRING +# define ASN1_OCTET_STRING ASN1_STRING +# define ASN1_PRINTABLESTRING ASN1_STRING +# define ASN1_T61STRING ASN1_STRING +# define ASN1_IA5STRING ASN1_STRING +# define ASN1_UTCTIME ASN1_STRING +# define ASN1_GENERALIZEDTIME ASN1_STRING +# define ASN1_TIME ASN1_STRING +# define ASN1_GENERALSTRING ASN1_STRING +# define ASN1_UNIVERSALSTRING ASN1_STRING +# define ASN1_BMPSTRING ASN1_STRING +# define ASN1_VISIBLESTRING ASN1_STRING +# define ASN1_UTF8STRING ASN1_STRING +# define ASN1_BOOLEAN int +# define ASN1_NULL int +# else +typedef struct asn1_string_st ASN1_INTEGER; +typedef struct asn1_string_st ASN1_ENUMERATED; +typedef struct asn1_string_st ASN1_BIT_STRING; +typedef struct asn1_string_st ASN1_OCTET_STRING; +typedef struct asn1_string_st ASN1_PRINTABLESTRING; +typedef struct asn1_string_st ASN1_T61STRING; +typedef struct asn1_string_st ASN1_IA5STRING; +typedef struct asn1_string_st ASN1_GENERALSTRING; +typedef struct asn1_string_st ASN1_UNIVERSALSTRING; +typedef struct asn1_string_st ASN1_BMPSTRING; +typedef struct asn1_string_st ASN1_UTCTIME; +typedef struct asn1_string_st ASN1_TIME; +typedef struct asn1_string_st ASN1_GENERALIZEDTIME; +typedef struct asn1_string_st ASN1_VISIBLESTRING; +typedef struct asn1_string_st ASN1_UTF8STRING; +typedef struct asn1_string_st ASN1_STRING; +typedef int ASN1_BOOLEAN; +typedef int ASN1_NULL; +# endif + +typedef struct asn1_object_st ASN1_OBJECT; + +typedef struct ASN1_ITEM_st ASN1_ITEM; +typedef struct asn1_pctx_st ASN1_PCTX; +typedef struct asn1_sctx_st ASN1_SCTX; + +# ifdef _WIN32 +# undef X509_NAME +# undef X509_EXTENSIONS +# undef PKCS7_ISSUER_AND_SERIAL +# undef PKCS7_SIGNER_INFO +# undef OCSP_REQUEST +# undef OCSP_RESPONSE +# endif + +# ifdef BIGNUM +# undef BIGNUM +# endif +struct dane_st; +typedef struct bio_st BIO; +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 evp_md_st EVP_MD; +typedef struct evp_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 evp_Encode_Ctx_st EVP_ENCODE_CTX; + +typedef struct hmac_ctx_st HMAC_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 rsa_pss_params_st RSA_PSS_PARAMS; + +typedef struct ec_key_st EC_KEY; +typedef struct ec_key_method_st EC_KEY_METHOD; + +typedef struct rand_meth_st RAND_METHOD; +typedef struct rand_drbg_st RAND_DRBG; + +typedef struct ssl_dane_st SSL_DANE; +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 x509_object_st X509_OBJECT; +typedef struct x509_lookup_st X509_LOOKUP; +typedef struct x509_lookup_method_st X509_LOOKUP_METHOD; +typedef struct X509_VERIFY_PARAM_st X509_VERIFY_PARAM; + +typedef struct x509_sig_info_st X509_SIG_INFO; + +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 ossl_init_settings_st OPENSSL_INIT_SETTINGS; + +typedef struct ui_st UI; +typedef struct ui_method_st UI_METHOD; + +typedef struct engine_st ENGINE; +typedef struct ssl_st SSL; +typedef struct ssl_ctx_st SSL_CTX; + +typedef struct comp_ctx_st COMP_CTX; +typedef struct comp_method_st COMP_METHOD; + +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; + +typedef struct crypto_ex_data_st CRYPTO_EX_DATA; + +typedef struct ocsp_req_ctx_st OCSP_REQ_CTX; +typedef struct ocsp_response_st OCSP_RESPONSE; +typedef struct ocsp_responder_id_st OCSP_RESPID; + +typedef struct sct_st SCT; +typedef struct sct_ctx_st SCT_CTX; +typedef struct ctlog_st CTLOG; +typedef struct ctlog_store_st CTLOG_STORE; +typedef struct ct_policy_eval_ctx_st CT_POLICY_EVAL_CTX; + +typedef struct ossl_store_info_st OSSL_STORE_INFO; +typedef struct ossl_store_search_st OSSL_STORE_SEARCH; + +#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L && \ + defined(INTMAX_MAX) && defined(UINTMAX_MAX) +typedef intmax_t ossl_intmax_t; +typedef uintmax_t ossl_uintmax_t; +#else +/* + * Not long long, because the C-library can only be expected to provide + * strtoll(), strtoull() at the same time as intmax_t and strtoimax(), + * strtoumax(). Since we use these for parsing arguments, we need the + * conversion functions, not just the sizes. + */ +typedef long ossl_intmax_t; +typedef unsigned long ossl_uintmax_t; +#endif + +#ifdef __cplusplus +} +#endif +#endif /* def HEADER_OPENSSL_TYPES_H */ diff --git a/openssl-wasm/include/openssl/pem.h b/openssl-wasm/include/openssl/pem.h new file mode 100644 index 0000000..2ef5b5d --- /dev/null +++ b/openssl-wasm/include/openssl/pem.h @@ -0,0 +1,378 @@ +/* + * Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_PEM_H +# define HEADER_PEM_H + +# include +# include +# include +# include +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# define PEM_BUFSIZE 1024 + +# define PEM_STRING_X509_OLD "X509 CERTIFICATE" +# define PEM_STRING_X509 "CERTIFICATE" +# define PEM_STRING_X509_TRUSTED "TRUSTED CERTIFICATE" +# define PEM_STRING_X509_REQ_OLD "NEW CERTIFICATE REQUEST" +# define PEM_STRING_X509_REQ "CERTIFICATE REQUEST" +# define PEM_STRING_X509_CRL "X509 CRL" +# define PEM_STRING_EVP_PKEY "ANY PRIVATE KEY" +# define PEM_STRING_PUBLIC "PUBLIC KEY" +# define PEM_STRING_RSA "RSA PRIVATE KEY" +# define PEM_STRING_RSA_PUBLIC "RSA PUBLIC KEY" +# define PEM_STRING_DSA "DSA PRIVATE KEY" +# define PEM_STRING_DSA_PUBLIC "DSA PUBLIC KEY" +# define PEM_STRING_PKCS7 "PKCS7" +# define PEM_STRING_PKCS7_SIGNED "PKCS #7 SIGNED DATA" +# define PEM_STRING_PKCS8 "ENCRYPTED PRIVATE KEY" +# define PEM_STRING_PKCS8INF "PRIVATE KEY" +# define PEM_STRING_DHPARAMS "DH PARAMETERS" +# define PEM_STRING_DHXPARAMS "X9.42 DH PARAMETERS" +# define PEM_STRING_SSL_SESSION "SSL SESSION PARAMETERS" +# define PEM_STRING_DSAPARAMS "DSA PARAMETERS" +# define PEM_STRING_ECDSA_PUBLIC "ECDSA PUBLIC KEY" +# define PEM_STRING_ECPARAMETERS "EC PARAMETERS" +# define PEM_STRING_ECPRIVATEKEY "EC PRIVATE KEY" +# define PEM_STRING_PARAMETERS "PARAMETERS" +# define PEM_STRING_CMS "CMS" + +# define PEM_TYPE_ENCRYPTED 10 +# define PEM_TYPE_MIC_ONLY 20 +# define PEM_TYPE_MIC_CLEAR 30 +# define PEM_TYPE_CLEAR 40 + +/* + * 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_STDIO + +# 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_STDIO) + +# define DECLARE_PEM_read_fp(name, type) /**/ +# define DECLARE_PEM_write_fp(name, type) /**/ +# define DECLARE_PEM_write_fp_const(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 + +# 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); + +# 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) +typedef int pem_password_cb (char *buf, int size, int rwflag, void *userdata); + +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); + +int PEM_read_bio(BIO *bp, char **name, char **header, + unsigned char **data, long *len); +# define PEM_FLAG_SECURE 0x1 +# define PEM_FLAG_EAY_COMPATIBLE 0x2 +# define PEM_FLAG_ONLY_B64 0x4 +int PEM_read_bio_ex(BIO *bp, char **name, char **header, + unsigned char **data, long *len, unsigned int flags); +int PEM_bytes_read_bio_secmem(unsigned char **pdata, long *plen, char **pnm, + const char *name, BIO *bp, pem_password_cb *cb, + void *u); +int PEM_write_bio(BIO *bp, const char *name, const char *hdr, + const unsigned char *data, long len); +int PEM_bytes_read_bio(unsigned char **pdata, long *plen, char **pnm, + const char *name, BIO *bp, pem_password_cb *cb, + void *u); +void *PEM_ASN1_read_bio(d2i_of_void *d2i, const char *name, BIO *bp, void **x, + pem_password_cb *cb, void *u); +int PEM_ASN1_write_bio(i2d_of_void *i2d, const char *name, BIO *bp, void *x, + const EVP_CIPHER *enc, unsigned char *kstr, int klen, + pem_password_cb *cb, void *u); + +STACK_OF(X509_INFO) *PEM_X509_INFO_read_bio(BIO *bp, STACK_OF(X509_INFO) *sk, + pem_password_cb *cb, void *u); +int PEM_X509_INFO_write_bio(BIO *bp, X509_INFO *xi, EVP_CIPHER *enc, + unsigned char *kstr, int klen, + pem_password_cb *cd, void *u); + +#ifndef OPENSSL_NO_STDIO +int PEM_read(FILE *fp, char **name, char **header, + unsigned char **data, long *len); +int PEM_write(FILE *fp, const char *name, const char *hdr, + const unsigned char *data, long len); +void *PEM_ASN1_read(d2i_of_void *d2i, const char *name, FILE *fp, void **x, + pem_password_cb *cb, void *u); +int PEM_ASN1_write(i2d_of_void *i2d, const char *name, FILE *fp, + void *x, const EVP_CIPHER *enc, unsigned char *kstr, + int klen, pem_password_cb *callback, void *u); +STACK_OF(X509_INFO) *PEM_X509_INFO_read(FILE *fp, STACK_OF(X509_INFO) *sk, + pem_password_cb *cb, void *u); +#endif + +int PEM_SignInit(EVP_MD_CTX *ctx, EVP_MD *type); +int 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); + +/* The default pem_password_cb that's used internally */ +int PEM_def_callback(char *buf, int num, int rwflag, void *userdata); +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_REQ, X509_REQ) +DECLARE_PEM_write(X509_REQ_NEW, X509_REQ) +DECLARE_PEM_rw(X509_CRL, X509_CRL) +DECLARE_PEM_rw(PKCS7, PKCS7) +DECLARE_PEM_rw(NETSCAPE_CERT_SEQUENCE, NETSCAPE_CERT_SEQUENCE) +DECLARE_PEM_rw(PKCS8, X509_SIG) +DECLARE_PEM_rw(PKCS8_PRIV_KEY_INFO, PKCS8_PRIV_KEY_INFO) +# ifndef OPENSSL_NO_RSA +DECLARE_PEM_rw_cb(RSAPrivateKey, RSA) +DECLARE_PEM_rw_const(RSAPublicKey, RSA) +DECLARE_PEM_rw(RSA_PUBKEY, RSA) +# endif +# ifndef OPENSSL_NO_DSA +DECLARE_PEM_rw_cb(DSAPrivateKey, DSA) +DECLARE_PEM_rw(DSA_PUBKEY, DSA) +DECLARE_PEM_rw_const(DSAparams, DSA) +# endif +# ifndef OPENSSL_NO_EC +DECLARE_PEM_rw_const(ECPKParameters, EC_GROUP) +DECLARE_PEM_rw_cb(ECPrivateKey, EC_KEY) +DECLARE_PEM_rw(EC_PUBKEY, EC_KEY) +# endif +# ifndef OPENSSL_NO_DH +DECLARE_PEM_rw_const(DHparams, DH) +DECLARE_PEM_write_const(DHxparams, DH) +# endif +DECLARE_PEM_rw_cb(PrivateKey, EVP_PKEY) +DECLARE_PEM_rw(PUBKEY, EVP_PKEY) + +int PEM_write_bio_PrivateKey_traditional(BIO *bp, EVP_PKEY *x, + const EVP_CIPHER *enc, + unsigned char *kstr, int klen, + pem_password_cb *cb, void *u); + +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); + +# ifndef OPENSSL_NO_STDIO +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); +# endif +EVP_PKEY *PEM_read_bio_Parameters(BIO *bp, EVP_PKEY **x); +int PEM_write_bio_Parameters(BIO *bp, EVP_PKEY *x); + +# ifndef OPENSSL_NO_DSA +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 +# endif + +# ifdef __cplusplus +} +# endif +#endif diff --git a/openssl-wasm/include/openssl/pem2.h b/openssl-wasm/include/openssl/pem2.h new file mode 100644 index 0000000..038fe79 --- /dev/null +++ b/openssl-wasm/include/openssl/pem2.h @@ -0,0 +1,13 @@ +/* + * Copyright 1999-2018 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_PEM2_H +# define HEADER_PEM2_H +# include +#endif diff --git a/openssl-wasm/include/openssl/pemerr.h b/openssl-wasm/include/openssl/pemerr.h new file mode 100644 index 0000000..4f7e357 --- /dev/null +++ b/openssl-wasm/include/openssl/pemerr.h @@ -0,0 +1,105 @@ +/* + * Generated by util/mkerr.pl DO NOT EDIT + * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_PEMERR_H +# define HEADER_PEMERR_H + +# ifndef HEADER_SYMHACKS_H +# include +# endif + +# ifdef __cplusplus +extern "C" +# endif +int ERR_load_PEM_strings(void); + +/* + * PEM 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_I2B 146 +# 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_GET_HEADER_AND_DATA 143 +# define PEM_F_GET_NAME 144 +# 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_GET_EVP_CIPHER_INFO 107 +# define PEM_F_PEM_READ 108 +# define PEM_F_PEM_READ_BIO 109 +# define PEM_F_PEM_READ_BIO_DHPARAMS 141 +# define PEM_F_PEM_READ_BIO_EX 145 +# define PEM_F_PEM_READ_BIO_PARAMETERS 140 +# define PEM_F_PEM_READ_BIO_PRIVATEKEY 123 +# define PEM_F_PEM_READ_DHPARAMS 142 +# define PEM_F_PEM_READ_PRIVATEKEY 124 +# define PEM_F_PEM_SIGNFINAL 112 +# define PEM_F_PEM_WRITE 113 +# define PEM_F_PEM_WRITE_BIO 114 +# define PEM_F_PEM_WRITE_BIO_PRIVATEKEY_TRADITIONAL 147 +# 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 + +/* + * PEM 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_HEADER_TOO_LONG 128 +# define PEM_R_INCONSISTENT_HEADER 121 +# define PEM_R_KEYBLOB_HEADER_PARSE_ERROR 122 +# define PEM_R_KEYBLOB_TOO_SHORT 123 +# define PEM_R_MISSING_DEK_IV 129 +# 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_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_UNEXPECTED_DEK_IV 130 +# define PEM_R_UNSUPPORTED_CIPHER 113 +# define PEM_R_UNSUPPORTED_ENCRYPTION 114 +# define PEM_R_UNSUPPORTED_KEY_COMPONENTS 126 +# define PEM_R_UNSUPPORTED_PUBLIC_KEY_TYPE 110 + +#endif diff --git a/openssl-wasm/include/openssl/pkcs12.h b/openssl-wasm/include/openssl/pkcs12.h new file mode 100644 index 0000000..3f43dad --- /dev/null +++ b/openssl-wasm/include/openssl/pkcs12.h @@ -0,0 +1,223 @@ +/* + * Copyright 1999-2016 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_PKCS12_H +# define HEADER_PKCS12_H + +# include +# 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 + +/* It's not clear if these are actually needed... */ +# define PKCS12_key_gen PKCS12_key_gen_utf8 +# define PKCS12_add_friendlyname PKCS12_add_friendlyname_utf8 + +/* MS key usage constants */ + +# define KEY_EX 0x10 +# define KEY_SIG 0x80 + +typedef struct PKCS12_MAC_DATA_st PKCS12_MAC_DATA; + +typedef struct PKCS12_st PKCS12; + +typedef struct PKCS12_SAFEBAG_st PKCS12_SAFEBAG; + +DEFINE_STACK_OF(PKCS12_SAFEBAG) + +typedef struct pkcs12_bag_st PKCS12_BAGS; + +# define PKCS12_ERROR 0 +# define PKCS12_OK 1 + +/* Compatibility macros */ + +#if OPENSSL_API_COMPAT < 0x10100000L + +# define M_PKCS12_bag_type PKCS12_bag_type +# define M_PKCS12_cert_bag_type PKCS12_cert_bag_type +# define M_PKCS12_crl_bag_type PKCS12_cert_bag_type + +# define PKCS12_certbag2x509 PKCS12_SAFEBAG_get1_cert +# define PKCS12_certbag2scrl PKCS12_SAFEBAG_get1_crl +# define PKCS12_bag_type PKCS12_SAFEBAG_get_nid +# define PKCS12_cert_bag_type PKCS12_SAFEBAG_get_bag_nid +# define PKCS12_x5092certbag PKCS12_SAFEBAG_create_cert +# define PKCS12_x509crl2certbag PKCS12_SAFEBAG_create_crl +# define PKCS12_MAKE_KEYBAG PKCS12_SAFEBAG_create0_p8inf +# define PKCS12_MAKE_SHKEYBAG PKCS12_SAFEBAG_create_pkcs8_encrypt + +#endif + +DEPRECATEDIN_1_1_0(ASN1_TYPE *PKCS12_get_attr(const PKCS12_SAFEBAG *bag, int attr_nid)) + +ASN1_TYPE *PKCS8_get_attr(PKCS8_PRIV_KEY_INFO *p8, int attr_nid); +int PKCS12_mac_present(const PKCS12 *p12); +void PKCS12_get0_mac(const ASN1_OCTET_STRING **pmac, + const X509_ALGOR **pmacalg, + const ASN1_OCTET_STRING **psalt, + const ASN1_INTEGER **piter, + const PKCS12 *p12); + +const ASN1_TYPE *PKCS12_SAFEBAG_get0_attr(const PKCS12_SAFEBAG *bag, + int attr_nid); +const ASN1_OBJECT *PKCS12_SAFEBAG_get0_type(const PKCS12_SAFEBAG *bag); +int PKCS12_SAFEBAG_get_nid(const PKCS12_SAFEBAG *bag); +int PKCS12_SAFEBAG_get_bag_nid(const PKCS12_SAFEBAG *bag); + +X509 *PKCS12_SAFEBAG_get1_cert(const PKCS12_SAFEBAG *bag); +X509_CRL *PKCS12_SAFEBAG_get1_crl(const PKCS12_SAFEBAG *bag); +const STACK_OF(PKCS12_SAFEBAG) * +PKCS12_SAFEBAG_get0_safes(const PKCS12_SAFEBAG *bag); +const PKCS8_PRIV_KEY_INFO *PKCS12_SAFEBAG_get0_p8inf(const PKCS12_SAFEBAG *bag); +const X509_SIG *PKCS12_SAFEBAG_get0_pkcs8(const PKCS12_SAFEBAG *bag); + +PKCS12_SAFEBAG *PKCS12_SAFEBAG_create_cert(X509 *x509); +PKCS12_SAFEBAG *PKCS12_SAFEBAG_create_crl(X509_CRL *crl); +PKCS12_SAFEBAG *PKCS12_SAFEBAG_create0_p8inf(PKCS8_PRIV_KEY_INFO *p8); +PKCS12_SAFEBAG *PKCS12_SAFEBAG_create0_pkcs8(X509_SIG *p8); +PKCS12_SAFEBAG *PKCS12_SAFEBAG_create_pkcs8_encrypt(int pbe_nid, + const char *pass, + int passlen, + unsigned char *salt, + int saltlen, int iter, + PKCS8_PRIV_KEY_INFO *p8inf); + +PKCS12_SAFEBAG *PKCS12_item_pack_safebag(void *obj, const ASN1_ITEM *it, + int nid1, int nid2); +PKCS8_PRIV_KEY_INFO *PKCS8_decrypt(const X509_SIG *p8, const char *pass, + int passlen); +PKCS8_PRIV_KEY_INFO *PKCS12_decrypt_skey(const 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); +X509_SIG *PKCS8_set0_pbe(const char *pass, int passlen, + PKCS8_PRIV_KEY_INFO *p8inf, X509_ALGOR *pbe); +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(const 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_friendlyname_utf8(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(const STACK_OF(X509_ATTRIBUTE) *attrs, + int attr_nid); +char *PKCS12_get_friendlyname(PKCS12_SAFEBAG *bag); +const STACK_OF(X509_ATTRIBUTE) * +PKCS12_SAFEBAG_get0_attrs(const PKCS12_SAFEBAG *bag); +unsigned char *PKCS12_pbe_crypt(const X509_ALGOR *algor, + const char *pass, int passlen, + const unsigned char *in, int inlen, + unsigned char **data, int *datalen, + int en_de); +void *PKCS12_item_decrypt_d2i(const X509_ALGOR *algor, const ASN1_ITEM *it, + const char *pass, int passlen, + const 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_key_gen_utf8(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_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(const unsigned char *uni, int unilen); +unsigned char *OPENSSL_utf82uni(const char *asc, int asclen, + unsigned char **uni, int *unilen); +char *OPENSSL_uni2utf8(const 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(const char *pass, const 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, const char *pass); +int PKCS12_add_safe(STACK_OF(PKCS7) **psafes, STACK_OF(PKCS12_SAFEBAG) *bags, + int safe_nid, int iter, const char *pass); +PKCS12 *PKCS12_add_safes(STACK_OF(PKCS7) *safes, int p7_nid); + +int i2d_PKCS12_bio(BIO *bp, PKCS12 *p12); +# ifndef OPENSSL_NO_STDIO +int i2d_PKCS12_fp(FILE *fp, PKCS12 *p12); +# endif +PKCS12 *d2i_PKCS12_bio(BIO *bp, PKCS12 **p12); +# ifndef OPENSSL_NO_STDIO +PKCS12 *d2i_PKCS12_fp(FILE *fp, PKCS12 **p12); +# endif +int PKCS12_newpass(PKCS12 *p12, const char *oldpass, const char *newpass); + +# ifdef __cplusplus +} +# endif +#endif diff --git a/openssl-wasm/include/openssl/pkcs12err.h b/openssl-wasm/include/openssl/pkcs12err.h new file mode 100644 index 0000000..eff5eb2 --- /dev/null +++ b/openssl-wasm/include/openssl/pkcs12err.h @@ -0,0 +1,81 @@ +/* + * Generated by util/mkerr.pl DO NOT EDIT + * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_PKCS12ERR_H +# define HEADER_PKCS12ERR_H + +# ifndef HEADER_SYMHACKS_H +# include +# endif + +# ifdef __cplusplus +extern "C" +# endif +int ERR_load_PKCS12_strings(void); + +/* + * PKCS12 function codes. + */ +# define PKCS12_F_OPENSSL_ASC2UNI 121 +# define PKCS12_F_OPENSSL_UNI2ASC 124 +# define PKCS12_F_OPENSSL_UNI2UTF8 127 +# define PKCS12_F_OPENSSL_UTF82UNI 129 +# 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_KEY_GEN_UTF8 116 +# 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_SAFEBAG_CREATE0_P8INF 112 +# define PKCS12_F_PKCS12_SAFEBAG_CREATE0_PKCS8 113 +# define PKCS12_F_PKCS12_SAFEBAG_CREATE_PKCS8_ENCRYPT 133 +# 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_ENCRYPT 125 +# define PKCS12_F_PKCS8_SET0_PBE 132 + +/* + * PKCS12 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_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 + +#endif diff --git a/openssl-wasm/include/openssl/pkcs7.h b/openssl-wasm/include/openssl/pkcs7.h new file mode 100644 index 0000000..9b66e00 --- /dev/null +++ b/openssl-wasm/include/openssl/pkcs7.h @@ -0,0 +1,319 @@ +/* + * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_PKCS7_H +# define HEADER_PKCS7_H + +# include +# include +# include + +# include +# include +# include + +#ifdef __cplusplus +extern "C" { +#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; + +DEFINE_STACK_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; + +DEFINE_STACK_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; + +DEFINE_STACK_OF(PKCS7) + +# define PKCS7_OP_SET_DETACHED_SIGNATURE 1 +# define PKCS7_OP_GET_DETACHED_SIGNATURE 2 + +# define PKCS7_get_signed_attributes(si) ((si)->auth_attr) +# define PKCS7_get_attributes(si) ((si)->unauth_attr) + +# define PKCS7_type_is_signed(a) (OBJ_obj2nid((a)->type) == NID_pkcs7_signed) +# define PKCS7_type_is_encrypted(a) (OBJ_obj2nid((a)->type) == NID_pkcs7_encrypted) +# define PKCS7_type_is_enveloped(a) (OBJ_obj2nid((a)->type) == NID_pkcs7_enveloped) +# define PKCS7_type_is_signedAndEnveloped(a) \ + (OBJ_obj2nid((a)->type) == NID_pkcs7_signedAndEnveloped) +# define PKCS7_type_is_data(a) (OBJ_obj2nid((a)->type) == NID_pkcs7_data) +# define PKCS7_type_is_digest(a) (OBJ_obj2nid((a)->type) == NID_pkcs7_digest) + +# define PKCS7_set_detached(p,v) \ + PKCS7_ctrl(p,PKCS7_OP_SET_DETACHED_SIGNATURE,v,NULL) +# define PKCS7_get_detached(p) \ + PKCS7_ctrl(p,PKCS7_OP_GET_DETACHED_SIGNATURE,0,NULL) + +# define PKCS7_is_detached(p7) (PKCS7_type_is_signed(p7) && PKCS7_get_detached(p7)) + +/* S/MIME related flags */ + +# define PKCS7_TEXT 0x1 +# define PKCS7_NOCERTS 0x2 +# define PKCS7_NOSIGS 0x4 +# define PKCS7_NOCHAIN 0x8 +# define PKCS7_NOINTERN 0x10 +# define PKCS7_NOVERIFY 0x20 +# define PKCS7_DETACHED 0x40 +# define PKCS7_BINARY 0x80 +# define PKCS7_NOATTR 0x100 +# define PKCS7_NOSMIMECAP 0x200 +# define PKCS7_NOOLDMIMETYPE 0x400 +# define PKCS7_CRLFEOL 0x800 +# define PKCS7_STREAM 0x1000 +# define PKCS7_NOCRL 0x2000 +# define PKCS7_PARTIAL 0x4000 +# define PKCS7_REUSE_DIGEST 0x8000 +# define PKCS7_NO_DUAL_CONTENT 0x10000 + +/* 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 + +/* CRLF ASCII canonicalisation */ +# define SMIME_ASCIICRLF 0x80000 + +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_STDIO +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); + +# ifdef __cplusplus +} +# endif +#endif diff --git a/openssl-wasm/include/openssl/pkcs7err.h b/openssl-wasm/include/openssl/pkcs7err.h new file mode 100644 index 0000000..02e0299 --- /dev/null +++ b/openssl-wasm/include/openssl/pkcs7err.h @@ -0,0 +1,103 @@ +/* + * Generated by util/mkerr.pl DO NOT EDIT + * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_PKCS7ERR_H +# define HEADER_PKCS7ERR_H + +# ifndef HEADER_SYMHACKS_H +# include +# endif + +# ifdef __cplusplus +extern "C" +# endif +int ERR_load_PKCS7_strings(void); + +/* + * PKCS7 function codes. + */ +# define PKCS7_F_DO_PKCS7_SIGNED_ATTRIB 136 +# 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_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 + +/* + * PKCS7 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_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_NULL_POINTER 143 +# define PKCS7_R_INVALID_SIGNED_DATA_TYPE 155 +# define PKCS7_R_NO_CONTENT 122 +# define PKCS7_R_NO_DEFAULT_DIGEST 151 +# define PKCS7_R_NO_MATCHING_DIGEST_TYPE_FOUND 154 +# define PKCS7_R_NO_RECIPIENT_MATCHES_CERTIFICATE 115 +# define PKCS7_R_NO_SIGNATURES_ON_DATA 123 +# define PKCS7_R_NO_SIGNERS 142 +# 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_DATASIGN 145 +# 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_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 + +#endif diff --git a/openssl-wasm/include/openssl/rand.h b/openssl-wasm/include/openssl/rand.h new file mode 100644 index 0000000..38a2a27 --- /dev/null +++ b/openssl-wasm/include/openssl/rand.h @@ -0,0 +1,77 @@ +/* + * Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_RAND_H +# define HEADER_RAND_H + +# include +# include +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +struct rand_meth_st { + int (*seed) (const void *buf, int num); + int (*bytes) (unsigned char *buf, int num); + void (*cleanup) (void); + int (*add) (const void *buf, int num, double randomness); + int (*pseudorand) (unsigned char *buf, int num); + int (*status) (void); +}; + +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_OpenSSL(void); + +# if OPENSSL_API_COMPAT < 0x10100000L +# define RAND_cleanup() while(0) continue +# endif +int RAND_bytes(unsigned char *buf, int num); +int RAND_priv_bytes(unsigned char *buf, int num); +DEPRECATEDIN_1_1_0(int RAND_pseudo_bytes(unsigned char *buf, int num)) + +void RAND_seed(const void *buf, int num); +void RAND_keep_random_devices_open(int keep); + +# if defined(__ANDROID__) && defined(__NDK_FPABI__) +__NDK_FPABI__ /* __attribute__((pcs("aapcs"))) on ARM */ +# endif +void RAND_add(const void *buf, int num, double randomness); +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); + +# ifndef OPENSSL_NO_EGD +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); +# endif + +int RAND_poll(void); + +# if defined(_WIN32) && (defined(BASETYPES) || defined(_WINDEF_H)) +/* application has to include in order to use these */ +DEPRECATEDIN_1_1_0(void RAND_screen(void)) +DEPRECATEDIN_1_1_0(int RAND_event(UINT, WPARAM, LPARAM)) +# endif + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/openssl-wasm/include/openssl/rand_drbg.h b/openssl-wasm/include/openssl/rand_drbg.h new file mode 100644 index 0000000..45b731b --- /dev/null +++ b/openssl-wasm/include/openssl/rand_drbg.h @@ -0,0 +1,130 @@ +/* + * Copyright 2017-2018 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_DRBG_RAND_H +# define HEADER_DRBG_RAND_H + +# include +# include +# include + +/* + * RAND_DRBG flags + * + * Note: if new flags are added, the constant `rand_drbg_used_flags` + * in drbg_lib.c needs to be updated accordingly. + */ + +/* In CTR mode, disable derivation function ctr_df */ +# define RAND_DRBG_FLAG_CTR_NO_DF 0x1 + + +# if OPENSSL_API_COMPAT < 0x10200000L +/* This #define was replaced by an internal constant and should not be used. */ +# define RAND_DRBG_USED_FLAGS (RAND_DRBG_FLAG_CTR_NO_DF) +# endif + +/* + * Default security strength (in the sense of [NIST SP 800-90Ar1]) + * + * NIST SP 800-90Ar1 supports the strength of the DRBG being smaller than that + * of the cipher by collecting less entropy. The current DRBG implementation + * does not take RAND_DRBG_STRENGTH into account and sets the strength of the + * DRBG to that of the cipher. + * + * RAND_DRBG_STRENGTH is currently only used for the legacy RAND + * implementation. + * + * Currently supported ciphers are: NID_aes_128_ctr, NID_aes_192_ctr and + * NID_aes_256_ctr + */ +# define RAND_DRBG_STRENGTH 256 +/* Default drbg type */ +# define RAND_DRBG_TYPE NID_aes_256_ctr +/* Default drbg flags */ +# define RAND_DRBG_FLAGS 0 + + +# ifdef __cplusplus +extern "C" { +# endif + +/* + * Object lifetime functions. + */ +RAND_DRBG *RAND_DRBG_new(int type, unsigned int flags, RAND_DRBG *parent); +RAND_DRBG *RAND_DRBG_secure_new(int type, unsigned int flags, RAND_DRBG *parent); +int RAND_DRBG_set(RAND_DRBG *drbg, int type, unsigned int flags); +int RAND_DRBG_set_defaults(int type, unsigned int flags); +int RAND_DRBG_instantiate(RAND_DRBG *drbg, + const unsigned char *pers, size_t perslen); +int RAND_DRBG_uninstantiate(RAND_DRBG *drbg); +void RAND_DRBG_free(RAND_DRBG *drbg); + +/* + * Object "use" functions. + */ +int RAND_DRBG_reseed(RAND_DRBG *drbg, + const unsigned char *adin, size_t adinlen, + int prediction_resistance); +int RAND_DRBG_generate(RAND_DRBG *drbg, unsigned char *out, size_t outlen, + int prediction_resistance, + const unsigned char *adin, size_t adinlen); +int RAND_DRBG_bytes(RAND_DRBG *drbg, unsigned char *out, size_t outlen); + +int RAND_DRBG_set_reseed_interval(RAND_DRBG *drbg, unsigned int interval); +int RAND_DRBG_set_reseed_time_interval(RAND_DRBG *drbg, time_t interval); + +int RAND_DRBG_set_reseed_defaults( + unsigned int master_reseed_interval, + unsigned int slave_reseed_interval, + time_t master_reseed_time_interval, + time_t slave_reseed_time_interval + ); + +RAND_DRBG *RAND_DRBG_get0_master(void); +RAND_DRBG *RAND_DRBG_get0_public(void); +RAND_DRBG *RAND_DRBG_get0_private(void); + +/* + * EXDATA + */ +# define RAND_DRBG_get_ex_new_index(l, p, newf, dupf, freef) \ + CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_DRBG, l, p, newf, dupf, freef) +int RAND_DRBG_set_ex_data(RAND_DRBG *drbg, int idx, void *arg); +void *RAND_DRBG_get_ex_data(const RAND_DRBG *drbg, int idx); + +/* + * Callback function typedefs + */ +typedef size_t (*RAND_DRBG_get_entropy_fn)(RAND_DRBG *drbg, + unsigned char **pout, + int entropy, size_t min_len, + size_t max_len, + int prediction_resistance); +typedef void (*RAND_DRBG_cleanup_entropy_fn)(RAND_DRBG *ctx, + unsigned char *out, size_t outlen); +typedef size_t (*RAND_DRBG_get_nonce_fn)(RAND_DRBG *drbg, unsigned char **pout, + int entropy, size_t min_len, + size_t max_len); +typedef void (*RAND_DRBG_cleanup_nonce_fn)(RAND_DRBG *drbg, + unsigned char *out, size_t outlen); + +int RAND_DRBG_set_callbacks(RAND_DRBG *drbg, + RAND_DRBG_get_entropy_fn get_entropy, + RAND_DRBG_cleanup_entropy_fn cleanup_entropy, + RAND_DRBG_get_nonce_fn get_nonce, + RAND_DRBG_cleanup_nonce_fn cleanup_nonce); + + +# ifdef __cplusplus +} +# endif + +#endif diff --git a/openssl-wasm/include/openssl/randerr.h b/openssl-wasm/include/openssl/randerr.h new file mode 100644 index 0000000..79d5790 --- /dev/null +++ b/openssl-wasm/include/openssl/randerr.h @@ -0,0 +1,94 @@ +/* + * Generated by util/mkerr.pl DO NOT EDIT + * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_RANDERR_H +# define HEADER_RANDERR_H + +# include + +# ifdef __cplusplus +extern "C" +# endif +int ERR_load_RAND_strings(void); + +/* + * RAND function codes. + */ +# define RAND_F_DATA_COLLECT_METHOD 127 +# define RAND_F_DRBG_BYTES 101 +# define RAND_F_DRBG_GET_ENTROPY 105 +# define RAND_F_DRBG_SETUP 117 +# define RAND_F_GET_ENTROPY 106 +# define RAND_F_RAND_BYTES 100 +# define RAND_F_RAND_DRBG_ENABLE_LOCKING 119 +# define RAND_F_RAND_DRBG_GENERATE 107 +# define RAND_F_RAND_DRBG_GET_ENTROPY 120 +# define RAND_F_RAND_DRBG_GET_NONCE 123 +# define RAND_F_RAND_DRBG_INSTANTIATE 108 +# define RAND_F_RAND_DRBG_NEW 109 +# define RAND_F_RAND_DRBG_RESEED 110 +# define RAND_F_RAND_DRBG_RESTART 102 +# define RAND_F_RAND_DRBG_SET 104 +# define RAND_F_RAND_DRBG_SET_DEFAULTS 121 +# define RAND_F_RAND_DRBG_UNINSTANTIATE 118 +# define RAND_F_RAND_LOAD_FILE 111 +# define RAND_F_RAND_POOL_ACQUIRE_ENTROPY 122 +# define RAND_F_RAND_POOL_ADD 103 +# define RAND_F_RAND_POOL_ADD_BEGIN 113 +# define RAND_F_RAND_POOL_ADD_END 114 +# define RAND_F_RAND_POOL_ATTACH 124 +# define RAND_F_RAND_POOL_BYTES_NEEDED 115 +# define RAND_F_RAND_POOL_GROW 125 +# define RAND_F_RAND_POOL_NEW 116 +# define RAND_F_RAND_PSEUDO_BYTES 126 +# define RAND_F_RAND_WRITE_FILE 112 + +/* + * RAND reason codes. + */ +# define RAND_R_ADDITIONAL_INPUT_TOO_LONG 102 +# define RAND_R_ALREADY_INSTANTIATED 103 +# define RAND_R_ARGUMENT_OUT_OF_RANGE 105 +# define RAND_R_CANNOT_OPEN_FILE 121 +# define RAND_R_DRBG_ALREADY_INITIALIZED 129 +# define RAND_R_DRBG_NOT_INITIALISED 104 +# define RAND_R_ENTROPY_INPUT_TOO_LONG 106 +# define RAND_R_ENTROPY_OUT_OF_RANGE 124 +# define RAND_R_ERROR_ENTROPY_POOL_WAS_IGNORED 127 +# define RAND_R_ERROR_INITIALISING_DRBG 107 +# define RAND_R_ERROR_INSTANTIATING_DRBG 108 +# define RAND_R_ERROR_RETRIEVING_ADDITIONAL_INPUT 109 +# define RAND_R_ERROR_RETRIEVING_ENTROPY 110 +# define RAND_R_ERROR_RETRIEVING_NONCE 111 +# define RAND_R_FAILED_TO_CREATE_LOCK 126 +# define RAND_R_FUNC_NOT_IMPLEMENTED 101 +# define RAND_R_FWRITE_ERROR 123 +# define RAND_R_GENERATE_ERROR 112 +# define RAND_R_INTERNAL_ERROR 113 +# define RAND_R_IN_ERROR_STATE 114 +# define RAND_R_NOT_A_REGULAR_FILE 122 +# define RAND_R_NOT_INSTANTIATED 115 +# define RAND_R_NO_DRBG_IMPLEMENTATION_SELECTED 128 +# define RAND_R_PARENT_LOCKING_NOT_ENABLED 130 +# define RAND_R_PARENT_STRENGTH_TOO_WEAK 131 +# define RAND_R_PERSONALISATION_STRING_TOO_LONG 116 +# define RAND_R_PREDICTION_RESISTANCE_NOT_SUPPORTED 133 +# define RAND_R_PRNG_NOT_SEEDED 100 +# define RAND_R_RANDOM_POOL_OVERFLOW 125 +# define RAND_R_RANDOM_POOL_UNDERFLOW 134 +# define RAND_R_REQUEST_TOO_LARGE_FOR_DRBG 117 +# define RAND_R_RESEED_ERROR 118 +# define RAND_R_SELFTEST_FAILURE 119 +# define RAND_R_TOO_LITTLE_NONCE_REQUESTED 135 +# define RAND_R_TOO_MUCH_NONCE_REQUESTED 136 +# define RAND_R_UNSUPPORTED_DRBG_FLAGS 132 +# define RAND_R_UNSUPPORTED_DRBG_TYPE 120 + +#endif diff --git a/openssl-wasm/include/openssl/rc2.h b/openssl-wasm/include/openssl/rc2.h new file mode 100644 index 0000000..585f9e4 --- /dev/null +++ b/openssl-wasm/include/openssl/rc2.h @@ -0,0 +1,51 @@ +/* + * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_RC2_H +# define HEADER_RC2_H + +# include + +# ifndef OPENSSL_NO_RC2 +# ifdef __cplusplus +extern "C" { +# endif + +typedef unsigned int RC2_INT; + +# define RC2_ENCRYPT 1 +# define RC2_DECRYPT 0 + +# define RC2_BLOCK 8 +# define RC2_KEY_LENGTH 16 + +typedef struct rc2_key_st { + RC2_INT data[64]; +} RC2_KEY; + +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 + +#endif diff --git a/openssl-wasm/include/openssl/rc4.h b/openssl-wasm/include/openssl/rc4.h new file mode 100644 index 0000000..86803b3 --- /dev/null +++ b/openssl-wasm/include/openssl/rc4.h @@ -0,0 +1,36 @@ +/* + * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_RC4_H +# define HEADER_RC4_H + +# include + +# ifndef OPENSSL_NO_RC4 +# 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 RC4(RC4_KEY *key, size_t len, const unsigned char *indata, + unsigned char *outdata); + +# ifdef __cplusplus +} +# endif +# endif + +#endif diff --git a/openssl-wasm/include/openssl/rc5.h b/openssl-wasm/include/openssl/rc5.h new file mode 100644 index 0000000..793f88e --- /dev/null +++ b/openssl-wasm/include/openssl/rc5.h @@ -0,0 +1,63 @@ +/* + * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_RC5_H +# define HEADER_RC5_H + +# include + +# ifndef OPENSSL_NO_RC5 +# ifdef __cplusplus +extern "C" { +# endif + +# define RC5_ENCRYPT 1 +# define RC5_DECRYPT 0 + +# define RC5_32_INT unsigned int + +# define RC5_32_BLOCK 8 +# define RC5_32_KEY_LENGTH 16/* This is a default, max is 255 */ + +/* + * This are the only values supported. Tweak the code if you want more The + * most supported modes will be RC5-32/12/16 RC5-32/16/8 + */ +# define RC5_8_ROUNDS 8 +# define RC5_12_ROUNDS 12 +# define RC5_16_ROUNDS 16 + +typedef struct rc5_key_st { + /* Number of rounds */ + int rounds; + RC5_32_INT data[2 * (RC5_16_ROUNDS + 1)]; +} RC5_32_KEY; + +void RC5_32_set_key(RC5_32_KEY *key, int len, const unsigned char *data, + int rounds); +void RC5_32_ecb_encrypt(const unsigned char *in, unsigned char *out, + RC5_32_KEY *key, int enc); +void RC5_32_encrypt(unsigned long *data, RC5_32_KEY *key); +void RC5_32_decrypt(unsigned long *data, RC5_32_KEY *key); +void RC5_32_cbc_encrypt(const unsigned char *in, unsigned char *out, + long length, RC5_32_KEY *ks, unsigned char *iv, + int enc); +void RC5_32_cfb64_encrypt(const unsigned char *in, unsigned char *out, + long length, RC5_32_KEY *schedule, + unsigned char *ivec, int *num, int enc); +void RC5_32_ofb64_encrypt(const unsigned char *in, unsigned char *out, + long length, RC5_32_KEY *schedule, + unsigned char *ivec, int *num); + +# ifdef __cplusplus +} +# endif +# endif + +#endif diff --git a/openssl-wasm/include/openssl/ripemd.h b/openssl-wasm/include/openssl/ripemd.h new file mode 100644 index 0000000..c42026a --- /dev/null +++ b/openssl-wasm/include/openssl/ripemd.h @@ -0,0 +1,47 @@ +/* + * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_RIPEMD_H +# define HEADER_RIPEMD_H + +# include + +#ifndef OPENSSL_NO_RMD160 +# include +# include +# ifdef __cplusplus +extern "C" { +# endif + +# define RIPEMD160_LONG unsigned int + +# 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; + +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 + + +#endif diff --git a/openssl-wasm/include/openssl/rsa.h b/openssl-wasm/include/openssl/rsa.h new file mode 100644 index 0000000..5e76365 --- /dev/null +++ b/openssl-wasm/include/openssl/rsa.h @@ -0,0 +1,513 @@ +/* + * Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_RSA_H +# define HEADER_RSA_H + +# include + +# ifndef OPENSSL_NO_RSA +# include +# include +# include +# include +# if OPENSSL_API_COMPAT < 0x10100000L +# include +# endif +# include +# ifdef __cplusplus +extern "C" { +# endif + +/* The types RSA and RSA_METHOD are defined in ossl_typ.h */ + +# ifndef OPENSSL_RSA_MAX_MODULUS_BITS +# define OPENSSL_RSA_MAX_MODULUS_BITS 16384 +# endif + +# define OPENSSL_RSA_FIPS_MIN_MODULUS_BITS 1024 + +# ifndef OPENSSL_RSA_SMALL_MODULUS_BITS +# define OPENSSL_RSA_SMALL_MODULUS_BITS 3072 +# endif +# ifndef OPENSSL_RSA_MAX_PUBEXP_BITS + +/* exponent limit enforced for "large" modulus only */ +# define OPENSSL_RSA_MAX_PUBEXP_BITS 64 +# endif + +# define RSA_3 0x3L +# define RSA_F4 0x10001L + +/* based on RFC 8017 appendix A.1.2 */ +# define RSA_ASN1_VERSION_DEFAULT 0 +# define RSA_ASN1_VERSION_MULTI 1 + +# define RSA_DEFAULT_PRIME_NUM 2 + +# 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 + +/* + * new with 0.9.6j and 0.9.7b; the built-in + * RSA implementation now uses blinding by + * default (ignoring RSA_FLAG_BLINDING), + * but other engines might not need it + */ +# define RSA_FLAG_NO_BLINDING 0x0080 +# if OPENSSL_API_COMPAT < 0x10100000L +/* + * Does nothing. Previously this switched off constant time behaviour. + */ +# define RSA_FLAG_NO_CONSTTIME 0x0000 +# endif +# if OPENSSL_API_COMPAT < 0x00908000L +/* deprecated name for the flag*/ +/* + * new with 0.9.7h; the built-in RSA + * implementation now uses constant time + * modular exponentiation for secret exponents + * by default. This flag causes the + * faster variable sliding window method to + * be used for all exponents. + */ +# define RSA_FLAG_NO_EXP_CONSTTIME RSA_FLAG_NO_CONSTTIME +# endif + +# define EVP_PKEY_CTX_set_rsa_padding(ctx, pad) \ + RSA_pkey_ctx_ctrl(ctx, -1, EVP_PKEY_CTRL_RSA_PADDING, pad, NULL) + +# define EVP_PKEY_CTX_get_rsa_padding(ctx, ppad) \ + RSA_pkey_ctx_ctrl(ctx, -1, EVP_PKEY_CTRL_GET_RSA_PADDING, 0, ppad) + +# define EVP_PKEY_CTX_set_rsa_pss_saltlen(ctx, len) \ + RSA_pkey_ctx_ctrl(ctx, (EVP_PKEY_OP_SIGN|EVP_PKEY_OP_VERIFY), \ + EVP_PKEY_CTRL_RSA_PSS_SALTLEN, len, NULL) +/* Salt length matches digest */ +# define RSA_PSS_SALTLEN_DIGEST -1 +/* Verify only: auto detect salt length */ +# define RSA_PSS_SALTLEN_AUTO -2 +/* Set salt length to maximum possible */ +# define RSA_PSS_SALTLEN_MAX -3 +/* Old compatible max salt length for sign only */ +# define RSA_PSS_SALTLEN_MAX_SIGN -2 + +# define EVP_PKEY_CTX_set_rsa_pss_keygen_saltlen(ctx, len) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA_PSS, EVP_PKEY_OP_KEYGEN, \ + EVP_PKEY_CTRL_RSA_PSS_SALTLEN, len, NULL) + +# define EVP_PKEY_CTX_get_rsa_pss_saltlen(ctx, plen) \ + RSA_pkey_ctx_ctrl(ctx, (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) \ + RSA_pkey_ctx_ctrl(ctx, EVP_PKEY_OP_KEYGEN, \ + EVP_PKEY_CTRL_RSA_KEYGEN_BITS, bits, NULL) + +# define EVP_PKEY_CTX_set_rsa_keygen_pubexp(ctx, pubexp) \ + RSA_pkey_ctx_ctrl(ctx, EVP_PKEY_OP_KEYGEN, \ + EVP_PKEY_CTRL_RSA_KEYGEN_PUBEXP, 0, pubexp) + +# define EVP_PKEY_CTX_set_rsa_keygen_primes(ctx, primes) \ + RSA_pkey_ctx_ctrl(ctx, EVP_PKEY_OP_KEYGEN, \ + EVP_PKEY_CTRL_RSA_KEYGEN_PRIMES, primes, NULL) + +# define EVP_PKEY_CTX_set_rsa_mgf1_md(ctx, md) \ + RSA_pkey_ctx_ctrl(ctx, EVP_PKEY_OP_TYPE_SIG | EVP_PKEY_OP_TYPE_CRYPT, \ + EVP_PKEY_CTRL_RSA_MGF1_MD, 0, (void *)(md)) + +# define EVP_PKEY_CTX_set_rsa_pss_keygen_mgf1_md(ctx, md) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA_PSS, EVP_PKEY_OP_KEYGEN, \ + EVP_PKEY_CTRL_RSA_MGF1_MD, 0, (void *)(md)) + +# define EVP_PKEY_CTX_set_rsa_oaep_md(ctx, md) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, EVP_PKEY_OP_TYPE_CRYPT, \ + EVP_PKEY_CTRL_RSA_OAEP_MD, 0, (void *)(md)) + +# define EVP_PKEY_CTX_get_rsa_mgf1_md(ctx, pmd) \ + RSA_pkey_ctx_ctrl(ctx, EVP_PKEY_OP_TYPE_SIG | EVP_PKEY_OP_TYPE_CRYPT, \ + EVP_PKEY_CTRL_GET_RSA_MGF1_MD, 0, (void *)(pmd)) + +# define EVP_PKEY_CTX_get_rsa_oaep_md(ctx, pmd) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, EVP_PKEY_OP_TYPE_CRYPT, \ + EVP_PKEY_CTRL_GET_RSA_OAEP_MD, 0, (void *)(pmd)) + +# define EVP_PKEY_CTX_set0_rsa_oaep_label(ctx, l, llen) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, EVP_PKEY_OP_TYPE_CRYPT, \ + EVP_PKEY_CTRL_RSA_OAEP_LABEL, llen, (void *)(l)) + +# define EVP_PKEY_CTX_get0_rsa_oaep_label(ctx, l) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, EVP_PKEY_OP_TYPE_CRYPT, \ + EVP_PKEY_CTRL_GET_RSA_OAEP_LABEL, 0, (void *)(l)) + +# define EVP_PKEY_CTX_set_rsa_pss_keygen_md(ctx, md) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA_PSS, \ + EVP_PKEY_OP_KEYGEN, EVP_PKEY_CTRL_MD, \ + 0, (void *)(md)) + +# define EVP_PKEY_CTRL_RSA_PADDING (EVP_PKEY_ALG_CTRL + 1) +# define EVP_PKEY_CTRL_RSA_PSS_SALTLEN (EVP_PKEY_ALG_CTRL + 2) + +# define EVP_PKEY_CTRL_RSA_KEYGEN_BITS (EVP_PKEY_ALG_CTRL + 3) +# define EVP_PKEY_CTRL_RSA_KEYGEN_PUBEXP (EVP_PKEY_ALG_CTRL + 4) +# define EVP_PKEY_CTRL_RSA_MGF1_MD (EVP_PKEY_ALG_CTRL + 5) + +# define EVP_PKEY_CTRL_GET_RSA_PADDING (EVP_PKEY_ALG_CTRL + 6) +# define EVP_PKEY_CTRL_GET_RSA_PSS_SALTLEN (EVP_PKEY_ALG_CTRL + 7) +# define EVP_PKEY_CTRL_GET_RSA_MGF1_MD (EVP_PKEY_ALG_CTRL + 8) + +# define EVP_PKEY_CTRL_RSA_OAEP_MD (EVP_PKEY_ALG_CTRL + 9) +# define EVP_PKEY_CTRL_RSA_OAEP_LABEL (EVP_PKEY_ALG_CTRL + 10) + +# define EVP_PKEY_CTRL_GET_RSA_OAEP_MD (EVP_PKEY_ALG_CTRL + 11) +# define EVP_PKEY_CTRL_GET_RSA_OAEP_LABEL (EVP_PKEY_ALG_CTRL + 12) + +# define EVP_PKEY_CTRL_RSA_KEYGEN_PRIMES (EVP_PKEY_ALG_CTRL + 13) + +# 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_bits(const RSA *rsa); +int RSA_size(const RSA *rsa); +int RSA_security_bits(const RSA *rsa); + +int RSA_set0_key(RSA *r, BIGNUM *n, BIGNUM *e, BIGNUM *d); +int RSA_set0_factors(RSA *r, BIGNUM *p, BIGNUM *q); +int RSA_set0_crt_params(RSA *r,BIGNUM *dmp1, BIGNUM *dmq1, BIGNUM *iqmp); +int RSA_set0_multi_prime_params(RSA *r, BIGNUM *primes[], BIGNUM *exps[], + BIGNUM *coeffs[], int pnum); +void RSA_get0_key(const RSA *r, + const BIGNUM **n, const BIGNUM **e, const BIGNUM **d); +void RSA_get0_factors(const RSA *r, const BIGNUM **p, const BIGNUM **q); +int RSA_get_multi_prime_extra_count(const RSA *r); +int RSA_get0_multi_prime_factors(const RSA *r, const BIGNUM *primes[]); +void RSA_get0_crt_params(const RSA *r, + const BIGNUM **dmp1, const BIGNUM **dmq1, + const BIGNUM **iqmp); +int RSA_get0_multi_prime_crt_params(const RSA *r, const BIGNUM *exps[], + const BIGNUM *coeffs[]); +const BIGNUM *RSA_get0_n(const RSA *d); +const BIGNUM *RSA_get0_e(const RSA *d); +const BIGNUM *RSA_get0_d(const RSA *d); +const BIGNUM *RSA_get0_p(const RSA *d); +const BIGNUM *RSA_get0_q(const RSA *d); +const BIGNUM *RSA_get0_dmp1(const RSA *r); +const BIGNUM *RSA_get0_dmq1(const RSA *r); +const BIGNUM *RSA_get0_iqmp(const RSA *r); +const RSA_PSS_PARAMS *RSA_get0_pss_params(const RSA *r); +void RSA_clear_flags(RSA *r, int flags); +int RSA_test_flags(const RSA *r, int flags); +void RSA_set_flags(RSA *r, int flags); +int RSA_get_version(RSA *r); +ENGINE *RSA_get0_engine(const RSA *r); + +/* Deprecated version */ +DEPRECATEDIN_0_9_8(RSA *RSA_generate_key(int bits, unsigned long e, void + (*callback) (int, int, void *), + void *cb_arg)) + +/* New version */ +int RSA_generate_key_ex(RSA *rsa, int bits, BIGNUM *e, BN_GENCB *cb); +/* Multi-prime version */ +int RSA_generate_multi_prime_key(RSA *rsa, int bits, int primes, + BIGNUM *e, BN_GENCB *cb); + +int RSA_X931_derive_ex(RSA *rsa, BIGNUM *p1, BIGNUM *p2, BIGNUM *q1, + BIGNUM *q2, const BIGNUM *Xp1, const BIGNUM *Xp2, + const BIGNUM *Xp, const BIGNUM *Xq1, const BIGNUM *Xq2, + const BIGNUM *Xq, const BIGNUM *e, BN_GENCB *cb); +int RSA_X931_generate_key_ex(RSA *rsa, int bits, const BIGNUM *e, + BN_GENCB *cb); + +int RSA_check_key(const RSA *); +int RSA_check_key_ex(const RSA *, BN_GENCB *cb); + /* 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_null_method(void); +const RSA_METHOD *RSA_get_method(const RSA *rsa); +int RSA_set_method(RSA *rsa, const RSA_METHOD *meth); + +/* these are the actual RSA functions */ +const RSA_METHOD *RSA_PKCS1_OpenSSL(void); + +int RSA_pkey_ctx_ctrl(EVP_PKEY_CTX *ctx, int optype, int cmd, int p1, void *p2); + +DECLARE_ASN1_ENCODE_FUNCTIONS_const(RSA, RSAPublicKey) +DECLARE_ASN1_ENCODE_FUNCTIONS_const(RSA, RSAPrivateKey) + +struct rsa_pss_params_st { + X509_ALGOR *hashAlgorithm; + X509_ALGOR *maskGenAlgorithm; + ASN1_INTEGER *saltLength; + ASN1_INTEGER *trailerField; + /* Decoded hash algorithm from maskGenAlgorithm */ + X509_ALGOR *maskHash; +}; + +DECLARE_ASN1_FUNCTIONS(RSA_PSS_PARAMS) + +typedef struct rsa_oaep_params_st { + X509_ALGOR *hashFunc; + X509_ALGOR *maskGenFunc; + X509_ALGOR *pSourceFunc; + /* Decoded hash algorithm from maskGenFunc */ + X509_ALGOR *maskHash; +} RSA_OAEP_PARAMS; + +DECLARE_ASN1_FUNCTIONS(RSA_OAEP_PARAMS) + +# ifndef OPENSSL_NO_STDIO +int RSA_print_fp(FILE *fp, const RSA *r, int offset); +# endif + +int RSA_print(BIO *bp, const RSA *r, int offset); + +/* + * The following 2 functions sign and verify a X509_SIG ASN1 object inside + * PKCS#1 padded RSA encryption + */ +int RSA_sign(int type, const unsigned char *m, unsigned int m_length, + unsigned char *sigret, unsigned int *siglen, RSA *rsa); +int RSA_verify(int type, const unsigned char *m, unsigned int m_length, + const unsigned char *sigbuf, unsigned int siglen, RSA *rsa); + +/* + * The following 2 function sign and verify a ASN1_OCTET_STRING object inside + * PKCS#1 padded RSA encryption + */ +int RSA_sign_ASN1_OCTET_STRING(int type, + const unsigned char *m, unsigned int m_length, + unsigned char *sigret, unsigned int *siglen, + RSA *rsa); +int RSA_verify_ASN1_OCTET_STRING(int type, const unsigned char *m, + unsigned int m_length, unsigned char *sigbuf, + unsigned int siglen, RSA *rsa); + +int RSA_blinding_on(RSA *rsa, BN_CTX *ctx); +void RSA_blinding_off(RSA *rsa); +BN_BLINDING *RSA_setup_blinding(RSA *rsa, BN_CTX *ctx); + +int RSA_padding_add_PKCS1_type_1(unsigned char *to, int tlen, + const unsigned char *f, int fl); +int RSA_padding_check_PKCS1_type_1(unsigned char *to, int tlen, + const unsigned char *f, int fl, + int rsa_len); +int RSA_padding_add_PKCS1_type_2(unsigned char *to, int tlen, + const unsigned char *f, int fl); +int RSA_padding_check_PKCS1_type_2(unsigned char *to, int tlen, + const unsigned char *f, int fl, + int rsa_len); +int PKCS1_MGF1(unsigned char *mask, long len, const unsigned char *seed, + long seedlen, const EVP_MD *dgst); +int RSA_padding_add_PKCS1_OAEP(unsigned char *to, int tlen, + const unsigned char *f, int fl, + const unsigned char *p, int pl); +int RSA_padding_check_PKCS1_OAEP(unsigned char *to, int tlen, + const unsigned char *f, int fl, int rsa_len, + const unsigned char *p, int pl); +int RSA_padding_add_PKCS1_OAEP_mgf1(unsigned char *to, int tlen, + const unsigned char *from, int flen, + const unsigned char *param, int plen, + const EVP_MD *md, const EVP_MD *mgf1md); +int RSA_padding_check_PKCS1_OAEP_mgf1(unsigned char *to, int tlen, + const unsigned char *from, int flen, + int num, const unsigned char *param, + int plen, const EVP_MD *md, + const EVP_MD *mgf1md); +int RSA_padding_add_SSLv23(unsigned char *to, int tlen, + const unsigned char *f, int fl); +int RSA_padding_check_SSLv23(unsigned char *to, int tlen, + const unsigned char *f, int fl, int rsa_len); +int RSA_padding_add_none(unsigned char *to, int tlen, const unsigned char *f, + int fl); +int RSA_padding_check_none(unsigned char *to, int tlen, + const unsigned char *f, int fl, int rsa_len); +int RSA_padding_add_X931(unsigned char *to, int tlen, const unsigned char *f, + int fl); +int RSA_padding_check_X931(unsigned char *to, int tlen, + const unsigned char *f, int fl, int rsa_len); +int RSA_X931_hash_id(int nid); + +int RSA_verify_PKCS1_PSS(RSA *rsa, const unsigned char *mHash, + const EVP_MD *Hash, const unsigned char *EM, + int sLen); +int RSA_padding_add_PKCS1_PSS(RSA *rsa, unsigned char *EM, + const unsigned char *mHash, const EVP_MD *Hash, + int sLen); + +int RSA_verify_PKCS1_PSS_mgf1(RSA *rsa, const unsigned char *mHash, + const EVP_MD *Hash, const EVP_MD *mgf1Hash, + const unsigned char *EM, int sLen); + +int RSA_padding_add_PKCS1_PSS_mgf1(RSA *rsa, unsigned char *EM, + const unsigned char *mHash, + const EVP_MD *Hash, const EVP_MD *mgf1Hash, + int sLen); + +#define RSA_get_ex_new_index(l, p, newf, dupf, freef) \ + CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_RSA, l, p, newf, dupf, freef) +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 + +RSA_METHOD *RSA_meth_new(const char *name, int flags); +void RSA_meth_free(RSA_METHOD *meth); +RSA_METHOD *RSA_meth_dup(const RSA_METHOD *meth); +const char *RSA_meth_get0_name(const RSA_METHOD *meth); +int RSA_meth_set1_name(RSA_METHOD *meth, const char *name); +int RSA_meth_get_flags(const RSA_METHOD *meth); +int RSA_meth_set_flags(RSA_METHOD *meth, int flags); +void *RSA_meth_get0_app_data(const RSA_METHOD *meth); +int RSA_meth_set0_app_data(RSA_METHOD *meth, void *app_data); +int (*RSA_meth_get_pub_enc(const RSA_METHOD *meth)) + (int flen, const unsigned char *from, + unsigned char *to, RSA *rsa, int padding); +int RSA_meth_set_pub_enc(RSA_METHOD *rsa, + int (*pub_enc) (int flen, const unsigned char *from, + unsigned char *to, RSA *rsa, + int padding)); +int (*RSA_meth_get_pub_dec(const RSA_METHOD *meth)) + (int flen, const unsigned char *from, + unsigned char *to, RSA *rsa, int padding); +int RSA_meth_set_pub_dec(RSA_METHOD *rsa, + int (*pub_dec) (int flen, const unsigned char *from, + unsigned char *to, RSA *rsa, + int padding)); +int (*RSA_meth_get_priv_enc(const RSA_METHOD *meth)) + (int flen, const unsigned char *from, + unsigned char *to, RSA *rsa, int padding); +int RSA_meth_set_priv_enc(RSA_METHOD *rsa, + int (*priv_enc) (int flen, const unsigned char *from, + unsigned char *to, RSA *rsa, + int padding)); +int (*RSA_meth_get_priv_dec(const RSA_METHOD *meth)) + (int flen, const unsigned char *from, + unsigned char *to, RSA *rsa, int padding); +int RSA_meth_set_priv_dec(RSA_METHOD *rsa, + int (*priv_dec) (int flen, const unsigned char *from, + unsigned char *to, RSA *rsa, + int padding)); +int (*RSA_meth_get_mod_exp(const RSA_METHOD *meth)) + (BIGNUM *r0, const BIGNUM *i, RSA *rsa, BN_CTX *ctx); +int RSA_meth_set_mod_exp(RSA_METHOD *rsa, + int (*mod_exp) (BIGNUM *r0, const BIGNUM *i, RSA *rsa, + BN_CTX *ctx)); +int (*RSA_meth_get_bn_mod_exp(const RSA_METHOD *meth)) + (BIGNUM *r, const BIGNUM *a, const BIGNUM *p, + const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx); +int RSA_meth_set_bn_mod_exp(RSA_METHOD *rsa, + int (*bn_mod_exp) (BIGNUM *r, + const BIGNUM *a, + const BIGNUM *p, + const BIGNUM *m, + BN_CTX *ctx, + BN_MONT_CTX *m_ctx)); +int (*RSA_meth_get_init(const RSA_METHOD *meth)) (RSA *rsa); +int RSA_meth_set_init(RSA_METHOD *rsa, int (*init) (RSA *rsa)); +int (*RSA_meth_get_finish(const RSA_METHOD *meth)) (RSA *rsa); +int RSA_meth_set_finish(RSA_METHOD *rsa, int (*finish) (RSA *rsa)); +int (*RSA_meth_get_sign(const RSA_METHOD *meth)) + (int type, + const unsigned char *m, unsigned int m_length, + unsigned char *sigret, unsigned int *siglen, + const RSA *rsa); +int RSA_meth_set_sign(RSA_METHOD *rsa, + int (*sign) (int type, const unsigned char *m, + unsigned int m_length, + unsigned char *sigret, unsigned int *siglen, + const RSA *rsa)); +int (*RSA_meth_get_verify(const RSA_METHOD *meth)) + (int dtype, const unsigned char *m, + unsigned int m_length, const unsigned char *sigbuf, + unsigned int siglen, const RSA *rsa); +int RSA_meth_set_verify(RSA_METHOD *rsa, + int (*verify) (int dtype, const unsigned char *m, + unsigned int m_length, + const unsigned char *sigbuf, + unsigned int siglen, const RSA *rsa)); +int (*RSA_meth_get_keygen(const RSA_METHOD *meth)) + (RSA *rsa, int bits, BIGNUM *e, BN_GENCB *cb); +int RSA_meth_set_keygen(RSA_METHOD *rsa, + int (*keygen) (RSA *rsa, int bits, BIGNUM *e, + BN_GENCB *cb)); +int (*RSA_meth_get_multi_prime_keygen(const RSA_METHOD *meth)) + (RSA *rsa, int bits, int primes, BIGNUM *e, BN_GENCB *cb); +int RSA_meth_set_multi_prime_keygen(RSA_METHOD *meth, + int (*keygen) (RSA *rsa, int bits, + int primes, BIGNUM *e, + BN_GENCB *cb)); + +# ifdef __cplusplus +} +# endif +# endif +#endif diff --git a/openssl-wasm/include/openssl/rsaerr.h b/openssl-wasm/include/openssl/rsaerr.h new file mode 100644 index 0000000..59b15e1 --- /dev/null +++ b/openssl-wasm/include/openssl/rsaerr.h @@ -0,0 +1,167 @@ +/* + * Generated by util/mkerr.pl DO NOT EDIT + * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_RSAERR_H +# define HEADER_RSAERR_H + +# ifndef HEADER_SYMHACKS_H +# include +# endif + +# ifdef __cplusplus +extern "C" +# endif +int ERR_load_RSA_strings(void); + +/* + * RSA function codes. + */ +# define RSA_F_CHECK_PADDING_MD 140 +# define RSA_F_ENCODE_PKCS1 146 +# define RSA_F_INT_RSA_VERIFY 145 +# define RSA_F_OLD_RSA_PRIV_DECODE 147 +# define RSA_F_PKEY_PSS_INIT 165 +# 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 149 +# define RSA_F_PKEY_RSA_VERIFYRECOVER 141 +# define RSA_F_RSA_ALGOR_TO_MD 156 +# define RSA_F_RSA_BUILTIN_KEYGEN 129 +# define RSA_F_RSA_CHECK_KEY 123 +# define RSA_F_RSA_CHECK_KEY_EX 160 +# define RSA_F_RSA_CMS_DECRYPT 159 +# define RSA_F_RSA_CMS_VERIFY 158 +# define RSA_F_RSA_ITEM_VERIFY 148 +# define RSA_F_RSA_METH_DUP 161 +# define RSA_F_RSA_METH_NEW 162 +# define RSA_F_RSA_METH_SET1_NAME 163 +# define RSA_F_RSA_MGF1_TO_MD 157 +# define RSA_F_RSA_MULTIP_INFO_NEW 166 +# define RSA_F_RSA_NEW_METHOD 106 +# define RSA_F_RSA_NULL 124 +# 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_OSSL_PRIVATE_DECRYPT 101 +# define RSA_F_RSA_OSSL_PRIVATE_ENCRYPT 102 +# define RSA_F_RSA_OSSL_PUBLIC_DECRYPT 103 +# define RSA_F_RSA_OSSL_PUBLIC_ENCRYPT 104 +# define RSA_F_RSA_PADDING_ADD_NONE 107 +# define RSA_F_RSA_PADDING_ADD_PKCS1_OAEP 121 +# define RSA_F_RSA_PADDING_ADD_PKCS1_OAEP_MGF1 154 +# define RSA_F_RSA_PADDING_ADD_PKCS1_PSS 125 +# define RSA_F_RSA_PADDING_ADD_PKCS1_PSS_MGF1 152 +# define RSA_F_RSA_PADDING_ADD_PKCS1_TYPE_1 108 +# define RSA_F_RSA_PADDING_ADD_PKCS1_TYPE_2 109 +# define RSA_F_RSA_PADDING_ADD_SSLV23 110 +# define RSA_F_RSA_PADDING_ADD_X931 127 +# define RSA_F_RSA_PADDING_CHECK_NONE 111 +# define RSA_F_RSA_PADDING_CHECK_PKCS1_OAEP 122 +# define RSA_F_RSA_PADDING_CHECK_PKCS1_OAEP_MGF1 153 +# 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_PARAM_DECODE 164 +# define RSA_F_RSA_PRINT 115 +# define RSA_F_RSA_PRINT_FP 116 +# define RSA_F_RSA_PRIV_DECODE 150 +# define RSA_F_RSA_PRIV_ENCODE 138 +# define RSA_F_RSA_PSS_GET_PARAM 151 +# define RSA_F_RSA_PSS_TO_CTX 155 +# 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_MGF1 126 +# define RSA_F_SETUP_TBUF 167 + +/* + * RSA reason codes. + */ +# define RSA_R_ALGORITHM_MISMATCH 100 +# define RSA_R_BAD_E_VALUE 101 +# define RSA_R_BAD_FIXED_HEADER_DECRYPT 102 +# define RSA_R_BAD_PAD_BYTE_COUNT 103 +# define RSA_R_BAD_SIGNATURE 104 +# define RSA_R_BLOCK_TYPE_IS_NOT_01 106 +# define RSA_R_BLOCK_TYPE_IS_NOT_02 107 +# define RSA_R_DATA_GREATER_THAN_MOD_LEN 108 +# define RSA_R_DATA_TOO_LARGE 109 +# define RSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE 110 +# define RSA_R_DATA_TOO_LARGE_FOR_MODULUS 132 +# define RSA_R_DATA_TOO_SMALL 111 +# define RSA_R_DATA_TOO_SMALL_FOR_KEY_SIZE 122 +# define RSA_R_DIGEST_DOES_NOT_MATCH 158 +# define RSA_R_DIGEST_NOT_ALLOWED 145 +# 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 157 +# define RSA_R_INVALID_DIGEST_LENGTH 143 +# define RSA_R_INVALID_HEADER 137 +# define RSA_R_INVALID_LABEL 160 +# define RSA_R_INVALID_MESSAGE_LENGTH 131 +# define RSA_R_INVALID_MGF1_MD 156 +# define RSA_R_INVALID_MULTI_PRIME_KEY 167 +# define RSA_R_INVALID_OAEP_PARAMETERS 161 +# 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_PRIME_NUM_INVALID 165 +# define RSA_R_KEY_SIZE_TOO_SMALL 120 +# define RSA_R_LAST_OCTET_INVALID 134 +# define RSA_R_MISSING_PRIVATE_KEY 179 +# define RSA_R_MGF1_DIGEST_NOT_ALLOWED 152 +# define RSA_R_MODULUS_TOO_LARGE 105 +# define RSA_R_MP_COEFFICIENT_NOT_INVERSE_OF_R 168 +# define RSA_R_MP_EXPONENT_NOT_CONGRUENT_TO_D 169 +# define RSA_R_MP_R_NOT_PRIME 170 +# define RSA_R_NO_PUBLIC_EXPONENT 140 +# define RSA_R_NULL_BEFORE_BLOCK_MISSING 113 +# define RSA_R_N_DOES_NOT_EQUAL_PRODUCT_OF_PRIMES 172 +# define RSA_R_N_DOES_NOT_EQUAL_P_Q 127 +# define RSA_R_OAEP_DECODING_ERROR 121 +# define RSA_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE 148 +# define RSA_R_PADDING_CHECK_FAILED 114 +# define RSA_R_PKCS_DECODING_ERROR 159 +# define RSA_R_PSS_SALTLEN_TOO_SMALL 164 +# define RSA_R_P_NOT_PRIME 128 +# define RSA_R_Q_NOT_PRIME 129 +# define RSA_R_RSA_OPERATIONS_NOT_SUPPORTED 130 +# define RSA_R_SLEN_CHECK_FAILED 136 +# define RSA_R_SLEN_RECOVERY_FAILED 135 +# define RSA_R_SSLV3_ROLLBACK_ATTACK 115 +# define RSA_R_THE_ASN1_OBJECT_IDENTIFIER_IS_NOT_KNOWN_FOR_THIS_MD 116 +# define RSA_R_UNKNOWN_ALGORITHM_TYPE 117 +# define RSA_R_UNKNOWN_DIGEST 166 +# define RSA_R_UNKNOWN_MASK_DIGEST 151 +# define RSA_R_UNKNOWN_PADDING_TYPE 118 +# define RSA_R_UNSUPPORTED_ENCRYPTION_TYPE 162 +# define RSA_R_UNSUPPORTED_LABEL_SOURCE 163 +# 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 + +#endif diff --git a/openssl-wasm/include/openssl/safestack.h b/openssl-wasm/include/openssl/safestack.h new file mode 100644 index 0000000..38b5578 --- /dev/null +++ b/openssl-wasm/include/openssl/safestack.h @@ -0,0 +1,207 @@ +/* + * Copyright 1999-2019 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_SAFESTACK_H +# define HEADER_SAFESTACK_H + +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# define STACK_OF(type) struct stack_st_##type + +# define SKM_DEFINE_STACK_OF(t1, t2, t3) \ + STACK_OF(t1); \ + typedef int (*sk_##t1##_compfunc)(const t3 * const *a, const t3 *const *b); \ + typedef void (*sk_##t1##_freefunc)(t3 *a); \ + typedef t3 * (*sk_##t1##_copyfunc)(const t3 *a); \ + static ossl_unused ossl_inline int sk_##t1##_num(const STACK_OF(t1) *sk) \ + { \ + return OPENSSL_sk_num((const OPENSSL_STACK *)sk); \ + } \ + static ossl_unused ossl_inline t2 *sk_##t1##_value(const STACK_OF(t1) *sk, int idx) \ + { \ + return (t2 *)OPENSSL_sk_value((const OPENSSL_STACK *)sk, idx); \ + } \ + static ossl_unused ossl_inline STACK_OF(t1) *sk_##t1##_new(sk_##t1##_compfunc compare) \ + { \ + return (STACK_OF(t1) *)OPENSSL_sk_new((OPENSSL_sk_compfunc)compare); \ + } \ + static ossl_unused ossl_inline STACK_OF(t1) *sk_##t1##_new_null(void) \ + { \ + return (STACK_OF(t1) *)OPENSSL_sk_new_null(); \ + } \ + static ossl_unused ossl_inline STACK_OF(t1) *sk_##t1##_new_reserve(sk_##t1##_compfunc compare, int n) \ + { \ + return (STACK_OF(t1) *)OPENSSL_sk_new_reserve((OPENSSL_sk_compfunc)compare, n); \ + } \ + static ossl_unused ossl_inline int sk_##t1##_reserve(STACK_OF(t1) *sk, int n) \ + { \ + return OPENSSL_sk_reserve((OPENSSL_STACK *)sk, n); \ + } \ + static ossl_unused ossl_inline void sk_##t1##_free(STACK_OF(t1) *sk) \ + { \ + OPENSSL_sk_free((OPENSSL_STACK *)sk); \ + } \ + static ossl_unused ossl_inline void sk_##t1##_zero(STACK_OF(t1) *sk) \ + { \ + OPENSSL_sk_zero((OPENSSL_STACK *)sk); \ + } \ + static ossl_unused ossl_inline t2 *sk_##t1##_delete(STACK_OF(t1) *sk, int i) \ + { \ + return (t2 *)OPENSSL_sk_delete((OPENSSL_STACK *)sk, i); \ + } \ + static ossl_unused ossl_inline t2 *sk_##t1##_delete_ptr(STACK_OF(t1) *sk, t2 *ptr) \ + { \ + return (t2 *)OPENSSL_sk_delete_ptr((OPENSSL_STACK *)sk, \ + (const void *)ptr); \ + } \ + static ossl_unused ossl_inline int sk_##t1##_push(STACK_OF(t1) *sk, t2 *ptr) \ + { \ + return OPENSSL_sk_push((OPENSSL_STACK *)sk, (const void *)ptr); \ + } \ + static ossl_unused ossl_inline int sk_##t1##_unshift(STACK_OF(t1) *sk, t2 *ptr) \ + { \ + return OPENSSL_sk_unshift((OPENSSL_STACK *)sk, (const void *)ptr); \ + } \ + static ossl_unused ossl_inline t2 *sk_##t1##_pop(STACK_OF(t1) *sk) \ + { \ + return (t2 *)OPENSSL_sk_pop((OPENSSL_STACK *)sk); \ + } \ + static ossl_unused ossl_inline t2 *sk_##t1##_shift(STACK_OF(t1) *sk) \ + { \ + return (t2 *)OPENSSL_sk_shift((OPENSSL_STACK *)sk); \ + } \ + static ossl_unused ossl_inline void sk_##t1##_pop_free(STACK_OF(t1) *sk, sk_##t1##_freefunc freefunc) \ + { \ + OPENSSL_sk_pop_free((OPENSSL_STACK *)sk, (OPENSSL_sk_freefunc)freefunc); \ + } \ + static ossl_unused ossl_inline int sk_##t1##_insert(STACK_OF(t1) *sk, t2 *ptr, int idx) \ + { \ + return OPENSSL_sk_insert((OPENSSL_STACK *)sk, (const void *)ptr, idx); \ + } \ + static ossl_unused ossl_inline t2 *sk_##t1##_set(STACK_OF(t1) *sk, int idx, t2 *ptr) \ + { \ + return (t2 *)OPENSSL_sk_set((OPENSSL_STACK *)sk, idx, (const void *)ptr); \ + } \ + static ossl_unused ossl_inline int sk_##t1##_find(STACK_OF(t1) *sk, t2 *ptr) \ + { \ + return OPENSSL_sk_find((OPENSSL_STACK *)sk, (const void *)ptr); \ + } \ + static ossl_unused ossl_inline int sk_##t1##_find_ex(STACK_OF(t1) *sk, t2 *ptr) \ + { \ + return OPENSSL_sk_find_ex((OPENSSL_STACK *)sk, (const void *)ptr); \ + } \ + static ossl_unused ossl_inline void sk_##t1##_sort(STACK_OF(t1) *sk) \ + { \ + OPENSSL_sk_sort((OPENSSL_STACK *)sk); \ + } \ + static ossl_unused ossl_inline int sk_##t1##_is_sorted(const STACK_OF(t1) *sk) \ + { \ + return OPENSSL_sk_is_sorted((const OPENSSL_STACK *)sk); \ + } \ + static ossl_unused ossl_inline STACK_OF(t1) * sk_##t1##_dup(const STACK_OF(t1) *sk) \ + { \ + return (STACK_OF(t1) *)OPENSSL_sk_dup((const OPENSSL_STACK *)sk); \ + } \ + static ossl_unused ossl_inline STACK_OF(t1) *sk_##t1##_deep_copy(const STACK_OF(t1) *sk, \ + sk_##t1##_copyfunc copyfunc, \ + sk_##t1##_freefunc freefunc) \ + { \ + return (STACK_OF(t1) *)OPENSSL_sk_deep_copy((const OPENSSL_STACK *)sk, \ + (OPENSSL_sk_copyfunc)copyfunc, \ + (OPENSSL_sk_freefunc)freefunc); \ + } \ + static ossl_unused ossl_inline sk_##t1##_compfunc sk_##t1##_set_cmp_func(STACK_OF(t1) *sk, sk_##t1##_compfunc compare) \ + { \ + return (sk_##t1##_compfunc)OPENSSL_sk_set_cmp_func((OPENSSL_STACK *)sk, (OPENSSL_sk_compfunc)compare); \ + } + +# define DEFINE_SPECIAL_STACK_OF(t1, t2) SKM_DEFINE_STACK_OF(t1, t2, t2) +# define DEFINE_STACK_OF(t) SKM_DEFINE_STACK_OF(t, t, t) +# define DEFINE_SPECIAL_STACK_OF_CONST(t1, t2) \ + SKM_DEFINE_STACK_OF(t1, const t2, t2) +# define DEFINE_STACK_OF_CONST(t) SKM_DEFINE_STACK_OF(t, const t, t) + +/*- + * Strings are special: normally an lhash entry will point to a single + * (somewhat) mutable object. In the case of strings: + * + * a) Instead of a single char, there is an array of chars, NUL-terminated. + * b) The string may have be immutable. + * + * So, they need their own declarations. Especially important for + * type-checking tools, such as Deputy. + * + * In practice, however, it appears to be hard to have a const + * string. For now, I'm settling for dealing with the fact it is a + * string at all. + */ +typedef char *OPENSSL_STRING; +typedef const char *OPENSSL_CSTRING; + +/*- + * Confusingly, LHASH_OF(STRING) deals with char ** throughout, but + * STACK_OF(STRING) is really more like STACK_OF(char), only, as mentioned + * above, instead of a single char each entry is a NUL-terminated array of + * chars. So, we have to implement STRING specially for STACK_OF. This is + * dealt with in the autogenerated macros below. + */ +DEFINE_SPECIAL_STACK_OF(OPENSSL_STRING, char) +DEFINE_SPECIAL_STACK_OF_CONST(OPENSSL_CSTRING, char) + +/* + * Similarly, we sometimes use a block of characters, NOT nul-terminated. + * These should also be distinguished from "normal" stacks. + */ +typedef void *OPENSSL_BLOCK; +DEFINE_SPECIAL_STACK_OF(OPENSSL_BLOCK, void) + +/* + * If called without higher optimization (min. -xO3) the Oracle Developer + * Studio compiler generates code for the defined (static inline) functions + * above. + * This would later lead to the linker complaining about missing symbols when + * this header file is included but the resulting object is not linked against + * the Crypto library (openssl#6912). + */ +# ifdef __SUNPRO_C +# pragma weak OPENSSL_sk_num +# pragma weak OPENSSL_sk_value +# pragma weak OPENSSL_sk_new +# pragma weak OPENSSL_sk_new_null +# pragma weak OPENSSL_sk_new_reserve +# pragma weak OPENSSL_sk_reserve +# pragma weak OPENSSL_sk_free +# pragma weak OPENSSL_sk_zero +# pragma weak OPENSSL_sk_delete +# pragma weak OPENSSL_sk_delete_ptr +# pragma weak OPENSSL_sk_push +# pragma weak OPENSSL_sk_unshift +# pragma weak OPENSSL_sk_pop +# pragma weak OPENSSL_sk_shift +# pragma weak OPENSSL_sk_pop_free +# pragma weak OPENSSL_sk_insert +# pragma weak OPENSSL_sk_set +# pragma weak OPENSSL_sk_find +# pragma weak OPENSSL_sk_find_ex +# pragma weak OPENSSL_sk_sort +# pragma weak OPENSSL_sk_is_sorted +# pragma weak OPENSSL_sk_dup +# pragma weak OPENSSL_sk_deep_copy +# pragma weak OPENSSL_sk_set_cmp_func +# endif /* __SUNPRO_C */ + +# ifdef __cplusplus +} +# endif +#endif diff --git a/openssl-wasm/include/openssl/seed.h b/openssl-wasm/include/openssl/seed.h new file mode 100644 index 0000000..de10b08 --- /dev/null +++ b/openssl-wasm/include/openssl/seed.h @@ -0,0 +1,96 @@ +/* + * Copyright 2007-2016 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* + * 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. + */ + +#ifndef HEADER_SEED_H +# define HEADER_SEED_H + +# include + +# ifndef OPENSSL_NO_SEED +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +/* look whether we need 'long' to get 32 bits */ +# ifdef AES_LONG +# ifndef SEED_LONG +# define SEED_LONG 1 +# endif +# endif + +# include + +# define SEED_BLOCK_SIZE 16 +# define SEED_KEY_LENGTH 16 + +typedef struct seed_key_st { +# ifdef SEED_LONG + unsigned long data[32]; +# else + unsigned int data[32]; +# endif +} SEED_KEY_SCHEDULE; + +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 + +#endif diff --git a/openssl-wasm/include/openssl/sha.h b/openssl-wasm/include/openssl/sha.h new file mode 100644 index 0000000..6a1eb0d --- /dev/null +++ b/openssl-wasm/include/openssl/sha.h @@ -0,0 +1,119 @@ +/* + * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_SHA_H +# define HEADER_SHA_H + +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +/*- + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + * ! SHA_LONG has to be at least 32 bits wide. ! + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + */ +# define SHA_LONG unsigned int + +# 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; + +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); + +# define SHA256_CBLOCK (SHA_LBLOCK*4)/* SHA-256 treats input data as a + * contiguous array of 32 bit wide + * big-endian values. */ + +typedef struct SHA256state_st { + SHA_LONG h[8]; + SHA_LONG Nl, Nh; + SHA_LONG data[SHA_LBLOCK]; + unsigned int num, md_len; +} SHA256_CTX; + +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); + +# define SHA224_DIGEST_LENGTH 28 +# define SHA256_DIGEST_LENGTH 32 +# define SHA384_DIGEST_LENGTH 48 +# define SHA512_DIGEST_LENGTH 64 + +/* + * Unlike 32-bit digest algorithms, SHA-512 *relies* on SHA_LONG64 + * being exactly 64-bit wide. See Implementation Notes in sha512.c + * for further details. + */ +/* + * SHA-512 treats input data as a + * contiguous array of 64 bit + * wide big-endian values. + */ +# define SHA512_CBLOCK (SHA_LBLOCK*8) +# if (defined(_WIN32) || defined(_WIN64)) && !defined(__MINGW32__) +# define SHA_LONG64 unsigned __int64 +# define U64(C) C##UI64 +# elif defined(__arch64__) +# define SHA_LONG64 unsigned long +# define U64(C) C##UL +# else +# define SHA_LONG64 unsigned long long +# define U64(C) C##ULL +# endif + +typedef struct SHA512state_st { + SHA_LONG64 h[8]; + SHA_LONG64 Nl, Nh; + union { + SHA_LONG64 d[SHA_LBLOCK]; + unsigned char p[SHA512_CBLOCK]; + } u; + unsigned int num, md_len; +} SHA512_CTX; + +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); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/openssl-wasm/include/openssl/srp.h b/openssl-wasm/include/openssl/srp.h new file mode 100644 index 0000000..aaf1355 --- /dev/null +++ b/openssl-wasm/include/openssl/srp.h @@ -0,0 +1,135 @@ +/* + * Copyright 2004-2018 The OpenSSL Project Authors. All Rights Reserved. + * Copyright (c) 2004, EdelKey Project. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + * + * Originally written by Christophe Renou and Peter Sylvester, + * for the EdelKey project. + */ + +#ifndef HEADER_SRP_H +# define HEADER_SRP_H + +#include + +#ifndef OPENSSL_NO_SRP +# include +# include +# include +# include +# include + +# ifdef __cplusplus +extern "C" { +# endif + +typedef struct SRP_gN_cache_st { + char *b64_bn; + BIGNUM *bn; +} SRP_gN_cache; + + +DEFINE_STACK_OF(SRP_gN_cache) + +typedef struct SRP_user_pwd_st { + /* Owned by us. */ + char *id; + BIGNUM *s; + BIGNUM *v; + /* Not owned by us. */ + const BIGNUM *g; + const BIGNUM *N; + /* Owned by us. */ + char *info; +} SRP_user_pwd; + +void SRP_user_pwd_free(SRP_user_pwd *user_pwd); + +DEFINE_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; + const BIGNUM *default_g; + const BIGNUM *default_N; +} SRP_VBASE; + +/* + * Internal structure storing N and g pair + */ +typedef struct SRP_gN_st { + char *id; + const BIGNUM *g; + const BIGNUM *N; +} SRP_gN; + +DEFINE_STACK_OF(SRP_gN) + +SRP_VBASE *SRP_VBASE_new(char *seed_key); +void SRP_VBASE_free(SRP_VBASE *vb); +int SRP_VBASE_init(SRP_VBASE *vb, char *verifier_file); + +/* This method ignores the configured seed and fails for an unknown user. */ +DEPRECATEDIN_1_1_0(SRP_user_pwd *SRP_VBASE_get_by_user(SRP_VBASE *vb, char *username)) +/* NOTE: unlike in SRP_VBASE_get_by_user, caller owns the returned pointer.*/ +SRP_user_pwd *SRP_VBASE_get1_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, const BIGNUM *N, + const 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(const BIGNUM *g, const BIGNUM *N); +SRP_gN *SRP_get_default_gN(const char *id); + +/* server side .... */ +BIGNUM *SRP_Calc_server_key(const BIGNUM *A, const BIGNUM *v, const BIGNUM *u, + const BIGNUM *b, const BIGNUM *N); +BIGNUM *SRP_Calc_B(const BIGNUM *b, const BIGNUM *N, const BIGNUM *g, + const BIGNUM *v); +int SRP_Verify_A_mod_N(const BIGNUM *A, const BIGNUM *N); +BIGNUM *SRP_Calc_u(const BIGNUM *A, const BIGNUM *B, const BIGNUM *N); + +/* client side .... */ +BIGNUM *SRP_Calc_x(const BIGNUM *s, const char *user, const char *pass); +BIGNUM *SRP_Calc_A(const BIGNUM *a, const BIGNUM *N, const BIGNUM *g); +BIGNUM *SRP_Calc_client_key(const BIGNUM *N, const BIGNUM *B, const BIGNUM *g, + const BIGNUM *x, const BIGNUM *a, const BIGNUM *u); +int SRP_Verify_B_mod_N(const BIGNUM *B, const BIGNUM *N); + +# define SRP_MINIMAL_N 1024 + +# ifdef __cplusplus +} +# endif +# endif + +#endif diff --git a/openssl-wasm/include/openssl/srtp.h b/openssl-wasm/include/openssl/srtp.h new file mode 100644 index 0000000..0b57c23 --- /dev/null +++ b/openssl-wasm/include/openssl/srtp.h @@ -0,0 +1,50 @@ +/* + * Copyright 2011-2016 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* + * DTLS code by Eric Rescorla + * + * Copyright (C) 2006, Network Resonance, Inc. Copyright (C) 2011, RTFM, Inc. + */ + +#ifndef HEADER_D1_SRTP_H +# define HEADER_D1_SRTP_H + +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# define SRTP_AES128_CM_SHA1_80 0x0001 +# define SRTP_AES128_CM_SHA1_32 0x0002 +# define SRTP_AES128_F8_SHA1_80 0x0003 +# define SRTP_AES128_F8_SHA1_32 0x0004 +# define SRTP_NULL_SHA1_80 0x0005 +# define SRTP_NULL_SHA1_32 0x0006 + +/* AEAD SRTP protection profiles from RFC 7714 */ +# define SRTP_AEAD_AES_128_GCM 0x0007 +# define SRTP_AEAD_AES_256_GCM 0x0008 + +# ifndef OPENSSL_NO_SRTP + +__owur int SSL_CTX_set_tlsext_use_srtp(SSL_CTX *ctx, const char *profiles); +__owur int SSL_set_tlsext_use_srtp(SSL *ssl, const char *profiles); + +__owur STACK_OF(SRTP_PROTECTION_PROFILE) *SSL_get_srtp_profiles(SSL *ssl); +__owur SRTP_PROTECTION_PROFILE *SSL_get_selected_srtp_profile(SSL *s); + +# endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/openssl-wasm/include/openssl/ssl.h b/openssl-wasm/include/openssl/ssl.h new file mode 100644 index 0000000..fd0c5a9 --- /dev/null +++ b/openssl-wasm/include/openssl/ssl.h @@ -0,0 +1,2438 @@ +/* + * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved. + * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved + * Copyright 2005 Nokia. All rights reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_SSL_H +# define HEADER_SSL_H + +# include +# include +# include +# include +# if OPENSSL_API_COMPAT < 0x10100000L +# include +# include +# include +# endif +# include +# include +# include +# include + +# include +# include +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +/* OpenSSL 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 + +# 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 + +/* The maximum number of encrypt/decrypt pipelines we can support */ +# define SSL_MAX_PIPELINES 32 + +/* text strings for the ciphers */ + +/* These are used to specify which ciphers to use and not to use */ + +# define SSL_TXT_LOW "LOW" +# define SSL_TXT_MEDIUM "MEDIUM" +# define SSL_TXT_HIGH "HIGH" +# define SSL_TXT_FIPS "FIPS" + +# 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"/* this cipher class has been removed */ +# define SSL_TXT_kDHd "kDHd"/* this cipher class has been removed */ +# define SSL_TXT_kDH "kDH"/* this cipher class has been removed */ +# define SSL_TXT_kEDH "kEDH"/* alias for kDHE */ +# define SSL_TXT_kDHE "kDHE" +# define SSL_TXT_kECDHr "kECDHr"/* this cipher class has been removed */ +# define SSL_TXT_kECDHe "kECDHe"/* this cipher class has been removed */ +# define SSL_TXT_kECDH "kECDH"/* this cipher class has been removed */ +# define SSL_TXT_kEECDH "kEECDH"/* alias for kECDHE */ +# define SSL_TXT_kECDHE "kECDHE" +# define SSL_TXT_kPSK "kPSK" +# define SSL_TXT_kRSAPSK "kRSAPSK" +# define SSL_TXT_kECDHEPSK "kECDHEPSK" +# define SSL_TXT_kDHEPSK "kDHEPSK" +# 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"/* this cipher class has been removed */ +# define SSL_TXT_aECDH "aECDH"/* this cipher class has been removed */ +# define SSL_TXT_aECDSA "aECDSA" +# define SSL_TXT_aPSK "aPSK" +# define SSL_TXT_aGOST94 "aGOST94" +# define SSL_TXT_aGOST01 "aGOST01" +# define SSL_TXT_aGOST12 "aGOST12" +# define SSL_TXT_aGOST "aGOST" +# define SSL_TXT_aSRP "aSRP" + +# define SSL_TXT_DSS "DSS" +# define SSL_TXT_DH "DH" +# define SSL_TXT_DHE "DHE"/* same as "kDHE:-ADH" */ +# define SSL_TXT_EDH "EDH"/* alias for DHE */ +# define SSL_TXT_ADH "ADH" +# define SSL_TXT_RSA "RSA" +# define SSL_TXT_ECDH "ECDH" +# define SSL_TXT_EECDH "EECDH"/* alias for ECDHE" */ +# define SSL_TXT_ECDHE "ECDHE"/* same as "kECDHE:-AECDH" */ +# define SSL_TXT_AECDH "AECDH" +# define SSL_TXT_ECDSA "ECDSA" +# 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_AES_CCM "AESCCM" +# define SSL_TXT_AES_CCM_8 "AESCCM8" +# define SSL_TXT_CAMELLIA128 "CAMELLIA128" +# define SSL_TXT_CAMELLIA256 "CAMELLIA256" +# define SSL_TXT_CAMELLIA "CAMELLIA" +# define SSL_TXT_CHACHA20 "CHACHA20" +# define SSL_TXT_GOST "GOST89" +# define SSL_TXT_ARIA "ARIA" +# define SSL_TXT_ARIA_GCM "ARIAGCM" +# define SSL_TXT_ARIA128 "ARIA128" +# define SSL_TXT_ARIA256 "ARIA256" + +# 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_GOST12 "GOST12" +# define SSL_TXT_GOST89MAC12 "GOST89MAC12" +# define SSL_TXT_SHA256 "SHA256" +# define SSL_TXT_SHA384 "SHA384" + +# 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_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'. + * This applies to ciphersuites for TLSv1.2 and below. + */ +# define SSL_DEFAULT_CIPHER_LIST "ALL:!COMPLEMENTOFDEFAULT:!eNULL" +/* This is the default set of TLSv1.3 ciphersuites */ +# if !defined(OPENSSL_NO_CHACHA) && !defined(OPENSSL_NO_POLY1305) +# define TLS_DEFAULT_CIPHERSUITES "TLS_AES_256_GCM_SHA384:" \ + "TLS_CHACHA20_POLY1305_SHA256:" \ + "TLS_AES_128_GCM_SHA256" +# else +# define TLS_DEFAULT_CIPHERSUITES "TLS_AES_256_GCM_SHA384:" \ + "TLS_AES_128_GCM_SHA256" +#endif +/* + * 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 + +# define SSL_FILETYPE_ASN1 X509_FILETYPE_ASN1 +# define SSL_FILETYPE_PEM X509_FILETYPE_PEM + +/* + * This is needed to stop compilers complaining about the 'struct ssl_st *' + * function parameters used to prototype callbacks in SSL_CTX. + */ +typedef struct ssl_st *ssl_crock_st; +typedef struct tls_session_ticket_ext_st TLS_SESSION_TICKET_EXT; +typedef struct ssl_method_st SSL_METHOD; +typedef struct ssl_cipher_st SSL_CIPHER; +typedef struct ssl_session_st SSL_SESSION; +typedef struct tls_sigalgs_st TLS_SIGALGS; +typedef struct ssl_conf_ctx_st SSL_CONF_CTX; +typedef struct ssl_comp_st SSL_COMP; + +STACK_OF(SSL_CIPHER); +STACK_OF(SSL_COMP); + +/* 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; + +DEFINE_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, + const SSL_CIPHER **cipher, void *arg); + +/* Extension context codes */ +/* This extension is only allowed in TLS */ +#define SSL_EXT_TLS_ONLY 0x0001 +/* This extension is only allowed in DTLS */ +#define SSL_EXT_DTLS_ONLY 0x0002 +/* Some extensions may be allowed in DTLS but we don't implement them for it */ +#define SSL_EXT_TLS_IMPLEMENTATION_ONLY 0x0004 +/* Most extensions are not defined for SSLv3 but EXT_TYPE_renegotiate is */ +#define SSL_EXT_SSL3_ALLOWED 0x0008 +/* Extension is only defined for TLS1.2 and below */ +#define SSL_EXT_TLS1_2_AND_BELOW_ONLY 0x0010 +/* Extension is only defined for TLS1.3 and above */ +#define SSL_EXT_TLS1_3_ONLY 0x0020 +/* Ignore this extension during parsing if we are resuming */ +#define SSL_EXT_IGNORE_ON_RESUMPTION 0x0040 +#define SSL_EXT_CLIENT_HELLO 0x0080 +/* Really means TLS1.2 or below */ +#define SSL_EXT_TLS1_2_SERVER_HELLO 0x0100 +#define SSL_EXT_TLS1_3_SERVER_HELLO 0x0200 +#define SSL_EXT_TLS1_3_ENCRYPTED_EXTENSIONS 0x0400 +#define SSL_EXT_TLS1_3_HELLO_RETRY_REQUEST 0x0800 +#define SSL_EXT_TLS1_3_CERTIFICATE 0x1000 +#define SSL_EXT_TLS1_3_NEW_SESSION_TICKET 0x2000 +#define SSL_EXT_TLS1_3_CERTIFICATE_REQUEST 0x4000 + +/* Typedefs for handling custom extensions */ + +typedef int (*custom_ext_add_cb)(SSL *s, unsigned int ext_type, + const unsigned char **out, size_t *outlen, + int *al, void *add_arg); + +typedef void (*custom_ext_free_cb)(SSL *s, unsigned int ext_type, + const unsigned char *out, void *add_arg); + +typedef int (*custom_ext_parse_cb)(SSL *s, unsigned int ext_type, + const unsigned char *in, size_t inlen, + int *al, void *parse_arg); + + +typedef int (*SSL_custom_ext_add_cb_ex)(SSL *s, unsigned int ext_type, + unsigned int context, + const unsigned char **out, + size_t *outlen, X509 *x, + size_t chainidx, + int *al, void *add_arg); + +typedef void (*SSL_custom_ext_free_cb_ex)(SSL *s, unsigned int ext_type, + unsigned int context, + const unsigned char *out, + void *add_arg); + +typedef int (*SSL_custom_ext_parse_cb_ex)(SSL *s, unsigned int ext_type, + unsigned int context, + const unsigned char *in, + size_t inlen, X509 *x, + size_t chainidx, + int *al, void *parse_arg); + +/* Typedef for verification callback */ +typedef int (*SSL_verify_cb)(int preverify_ok, X509_STORE_CTX *x509_ctx); + +/* + * Some values are reserved until OpenSSL 1.2.0 because they were previously + * included in SSL_OP_ALL in a 1.1.x release. + * + * Reserved value (until OpenSSL 1.2.0) 0x00000001U + * Reserved value (until OpenSSL 1.2.0) 0x00000002U + */ +/* Allow initial connection to servers that don't support RI */ +# define SSL_OP_LEGACY_SERVER_CONNECT 0x00000004U + +/* Reserved value (until OpenSSL 1.2.0) 0x00000008U */ +# define SSL_OP_TLSEXT_PADDING 0x00000010U +/* Reserved value (until OpenSSL 1.2.0) 0x00000020U */ +# define SSL_OP_SAFARI_ECDHE_ECDSA_BUG 0x00000040U +/* + * Reserved value (until OpenSSL 1.2.0) 0x00000080U + * Reserved value (until OpenSSL 1.2.0) 0x00000100U + * Reserved value (until OpenSSL 1.2.0) 0x00000200U + */ + +/* In TLSv1.3 allow a non-(ec)dhe based kex_mode */ +# define SSL_OP_ALLOW_NO_DHE_KEX 0x00000400U + +/* + * Disable SSL 3.0/TLS 1.0 CBC vulnerability workaround that was added in + * OpenSSL 0.9.6d. Usually (depending on the application protocol) the + * workaround is not needed. Unfortunately some broken SSL/TLS + * implementations cannot handle it at all, which is why we include it in + * SSL_OP_ALL. Added in 0.9.6e + */ +# define SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS 0x00000800U + +/* DTLS options */ +# define SSL_OP_NO_QUERY_MTU 0x00001000U +/* Turn on Cookie Exchange (on relevant for servers) */ +# define SSL_OP_COOKIE_EXCHANGE 0x00002000U +/* Don't use RFC4507 ticket extension */ +# define SSL_OP_NO_TICKET 0x00004000U +# ifndef OPENSSL_NO_DTLS1_METHOD +/* Use Cisco's "speshul" version of DTLS_BAD_VER + * (only with deprecated DTLSv1_client_method()) */ +# define SSL_OP_CISCO_ANYCONNECT 0x00008000U +# endif + +/* As server, disallow session resumption on renegotiation */ +# define SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION 0x00010000U +/* Don't use compression even if supported */ +# define SSL_OP_NO_COMPRESSION 0x00020000U +/* Permit unsafe legacy renegotiation */ +# define SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION 0x00040000U +/* Disable encrypt-then-mac */ +# define SSL_OP_NO_ENCRYPT_THEN_MAC 0x00080000U + +/* + * Enable TLSv1.3 Compatibility mode. This is on by default. A future version + * of OpenSSL may have this disabled by default. + */ +# define SSL_OP_ENABLE_MIDDLEBOX_COMPAT 0x00100000U + +/* Prioritize Chacha20Poly1305 when client does. + * Modifies SSL_OP_CIPHER_SERVER_PREFERENCE */ +# define SSL_OP_PRIORITIZE_CHACHA 0x00200000U + +/* + * Set on servers to choose the cipher according to the server's preferences + */ +# define SSL_OP_CIPHER_SERVER_PREFERENCE 0x00400000U +/* + * 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 0x00800000U + +/* + * Switches off automatic TLSv1.3 anti-replay protection for early data. This + * is a server-side option only (no effect on the client). + */ +# define SSL_OP_NO_ANTI_REPLAY 0x01000000U + +# define SSL_OP_NO_SSLv3 0x02000000U +# define SSL_OP_NO_TLSv1 0x04000000U +# define SSL_OP_NO_TLSv1_2 0x08000000U +# define SSL_OP_NO_TLSv1_1 0x10000000U +# define SSL_OP_NO_TLSv1_3 0x20000000U + +# define SSL_OP_NO_DTLSv1 0x04000000U +# define SSL_OP_NO_DTLSv1_2 0x08000000U + +# define SSL_OP_NO_SSL_MASK (SSL_OP_NO_SSLv3|\ + SSL_OP_NO_TLSv1|SSL_OP_NO_TLSv1_1|SSL_OP_NO_TLSv1_2|SSL_OP_NO_TLSv1_3) +# define SSL_OP_NO_DTLS_MASK (SSL_OP_NO_DTLSv1|SSL_OP_NO_DTLSv1_2) + +/* Disallow all renegotiation */ +# define SSL_OP_NO_RENEGOTIATION 0x40000000U + +/* + * 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 0x80000000U + +/* + * SSL_OP_ALL: various bug workarounds that should be rather harmless. + * This used to be 0x000FFFFFL before 0.9.7. + * This used to be 0x80000BFFU before 1.1.1. + */ +# define SSL_OP_ALL (SSL_OP_CRYPTOPRO_TLSEXT_BUG|\ + SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS|\ + SSL_OP_LEGACY_SERVER_CONNECT|\ + SSL_OP_TLSEXT_PADDING|\ + SSL_OP_SAFARI_ECDHE_ECDSA_BUG) + +/* OBSOLETE OPTIONS: retained for compatibility */ + +/* Removed from OpenSSL 1.1.0. Was 0x00000001L */ +/* Related to removed SSLv2. */ +# define SSL_OP_MICROSOFT_SESS_ID_BUG 0x0 +/* Removed from OpenSSL 1.1.0. Was 0x00000002L */ +/* Related to removed SSLv2. */ +# define SSL_OP_NETSCAPE_CHALLENGE_BUG 0x0 +/* Removed from OpenSSL 0.9.8q and 1.0.0c. Was 0x00000008L */ +/* Dead forever, see CVE-2010-4180 */ +# define SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG 0x0 +/* Removed from OpenSSL 1.0.1h and 1.0.2. Was 0x00000010L */ +/* Refers to ancient SSLREF and SSLv2. */ +# define SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG 0x0 +/* Removed from OpenSSL 1.1.0. Was 0x00000020 */ +# define SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER 0x0 +/* Removed from OpenSSL 0.9.7h and 0.9.8b. Was 0x00000040L */ +# define SSL_OP_MSIE_SSLV2_RSA_PADDING 0x0 +/* Removed from OpenSSL 1.1.0. Was 0x00000080 */ +/* Ancient SSLeay version. */ +# define SSL_OP_SSLEAY_080_CLIENT_DH_BUG 0x0 +/* Removed from OpenSSL 1.1.0. Was 0x00000100L */ +# define SSL_OP_TLS_D5_BUG 0x0 +/* Removed from OpenSSL 1.1.0. Was 0x00000200L */ +# define SSL_OP_TLS_BLOCK_PADDING_BUG 0x0 +/* Removed from OpenSSL 1.1.0. Was 0x00080000L */ +# define SSL_OP_SINGLE_ECDH_USE 0x0 +/* Removed from OpenSSL 1.1.0. Was 0x00100000L */ +# define SSL_OP_SINGLE_DH_USE 0x0 +/* Removed from OpenSSL 1.0.1k and 1.0.2. Was 0x00200000L */ +# define SSL_OP_EPHEMERAL_RSA 0x0 +/* Removed from OpenSSL 1.1.0. Was 0x01000000L */ +# define SSL_OP_NO_SSLv2 0x0 +/* Removed from OpenSSL 1.0.1. Was 0x08000000L */ +# define SSL_OP_PKCS1_CHECK_1 0x0 +/* Removed from OpenSSL 1.0.1. Was 0x10000000L */ +# define SSL_OP_PKCS1_CHECK_2 0x0 +/* Removed from OpenSSL 1.1.0. Was 0x20000000L */ +# define SSL_OP_NETSCAPE_CA_DN_BUG 0x0 +/* Removed from OpenSSL 1.1.0. Was 0x40000000L */ +# define SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG 0x0 + +/* + * 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 0x00000001U +/* + * 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 0x00000002U +/* + * Never bother the application with retries if the transport is blocking: + */ +# define SSL_MODE_AUTO_RETRY 0x00000004U +/* Don't attempt to automatically build certificate chain */ +# define SSL_MODE_NO_AUTO_CHAIN 0x00000008U +/* + * Save RAM by releasing read and write buffers when they're empty. (SSL3 and + * TLS only.) Released buffers are freed. + */ +# define SSL_MODE_RELEASE_BUFFERS 0x00000010U +/* + * 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 0x00000020U +# define SSL_MODE_SEND_SERVERHELLO_TIME 0x00000040U +/* + * Send TLS_FALLBACK_SCSV in the ClientHello. To be set only by applications + * that reconnect with a downgraded protocol version; see + * draft-ietf-tls-downgrade-scsv-00 for details. DO NOT ENABLE THIS if your + * application attempts a normal handshake. Only use this in explicit + * fallback retries, following the guidance in + * draft-ietf-tls-downgrade-scsv-00. + */ +# define SSL_MODE_SEND_FALLBACK_SCSV 0x00000080U +/* + * Support Asynchronous operation + */ +# define SSL_MODE_ASYNC 0x00000100U + +/* + * When using DTLS/SCTP, include the terminating zero in the label + * used for computing the endpoint-pair shared secret. Required for + * interoperability with implementations having this bug like these + * older version of OpenSSL: + * - OpenSSL 1.0.0 series + * - OpenSSL 1.0.1 series + * - OpenSSL 1.0.2 series + * - OpenSSL 1.1.0 series + * - OpenSSL 1.1.1 and 1.1.1a + */ +# define SSL_MODE_DTLS_SCTP_LABEL_LENGTH_BUG 0x00000400U + +/* Cert related flags */ +/* + * Many implementations ignore some aspects of the TLS standards such as + * enforcing certificate chain algorithms. When this is set we enforce them. + */ +# define SSL_CERT_FLAG_TLS_STRICT 0x00000001U + +/* Suite B modes, takes same values as certificate verify flags */ +# define SSL_CERT_FLAG_SUITEB_128_LOS_ONLY 0x10000 +/* Suite B 192 bit only mode */ +# define SSL_CERT_FLAG_SUITEB_192_LOS 0x20000 +/* Suite B 128 bit mode allowing 192 bit algorithms */ +# define SSL_CERT_FLAG_SUITEB_128_LOS 0x30000 + +/* Perform all sorts of protocol violations for testing purposes */ +# define SSL_CERT_FLAG_BROKEN_PROTOCOL 0x10000000 + +/* Flags for building certificate chains */ +/* Treat any existing certificates as untrusted CAs */ +# define SSL_BUILD_CHAIN_FLAG_UNTRUSTED 0x1 +/* Don't include root CA in chain */ +# define SSL_BUILD_CHAIN_FLAG_NO_ROOT 0x2 +/* Just check certificates already there */ +# define SSL_BUILD_CHAIN_FLAG_CHECK 0x4 +/* Ignore verification errors */ +# define SSL_BUILD_CHAIN_FLAG_IGNORE_ERROR 0x8 +/* Clear verification errors from queue */ +# define SSL_BUILD_CHAIN_FLAG_CLEAR_ERROR 0x10 + +/* Flags returned by SSL_check_chain */ +/* Certificate can be used with this session */ +# define CERT_PKEY_VALID 0x1 +/* Certificate can also be used for signing */ +# define CERT_PKEY_SIGN 0x2 +/* EE certificate signing algorithm OK */ +# define CERT_PKEY_EE_SIGNATURE 0x10 +/* CA signature algorithms OK */ +# define CERT_PKEY_CA_SIGNATURE 0x20 +/* EE certificate parameters OK */ +# define CERT_PKEY_EE_PARAM 0x40 +/* CA certificate parameters OK */ +# define CERT_PKEY_CA_PARAM 0x80 +/* Signing explicitly allowed as opposed to SHA1 fallback */ +# define CERT_PKEY_EXPLICIT_SIGN 0x100 +/* Client CA issuer names match (always set for server cert) */ +# define CERT_PKEY_ISSUER_NAME 0x200 +/* Cert type matches client types (always set for server cert) */ +# define CERT_PKEY_CERT_TYPE 0x400 +/* Cert chain suitable to Suite B */ +# define CERT_PKEY_SUITEB 0x800 + +# define SSL_CONF_FLAG_CMDLINE 0x1 +# define SSL_CONF_FLAG_FILE 0x2 +# define SSL_CONF_FLAG_CLIENT 0x4 +# define SSL_CONF_FLAG_SERVER 0x8 +# define SSL_CONF_FLAG_SHOW_ERRORS 0x10 +# define SSL_CONF_FLAG_CERTIFICATE 0x20 +# define SSL_CONF_FLAG_REQUIRE_PRIVATE 0x40 +/* Configuration value types */ +# define SSL_CONF_TYPE_UNKNOWN 0x0 +# define SSL_CONF_TYPE_STRING 0x1 +# define SSL_CONF_TYPE_FILE 0x2 +# define SSL_CONF_TYPE_DIR 0x3 +# define SSL_CONF_TYPE_NONE 0x4 + +/* Maximum length of the application-controlled segment of a a TLSv1.3 cookie */ +# define SSL_COOKIE_LENGTH 4096 + +/* + * Note: SSL[_CTX]_set_{options,mode} use |= op on the previous value, they + * cannot be used to clear bits. + */ + +unsigned long SSL_CTX_get_options(const SSL_CTX *ctx); +unsigned long SSL_get_options(const SSL *s); +unsigned long SSL_CTX_clear_options(SSL_CTX *ctx, unsigned long op); +unsigned long SSL_clear_options(SSL *s, unsigned long op); +unsigned long SSL_CTX_set_options(SSL_CTX *ctx, unsigned long op); +unsigned long SSL_set_options(SSL *s, unsigned long op); + +# define SSL_CTX_set_mode(ctx,op) \ + SSL_CTX_ctrl((ctx),SSL_CTRL_MODE,(op),NULL) +# define SSL_CTX_clear_mode(ctx,op) \ + SSL_CTX_ctrl((ctx),SSL_CTRL_CLEAR_MODE,(op),NULL) +# define SSL_CTX_get_mode(ctx) \ + SSL_CTX_ctrl((ctx),SSL_CTRL_MODE,0,NULL) +# define SSL_clear_mode(ssl,op) \ + SSL_ctrl((ssl),SSL_CTRL_CLEAR_MODE,(op),NULL) +# define SSL_set_mode(ssl,op) \ + SSL_ctrl((ssl),SSL_CTRL_MODE,(op),NULL) +# define SSL_get_mode(ssl) \ + SSL_ctrl((ssl),SSL_CTRL_MODE,0,NULL) +# define SSL_set_mtu(ssl, mtu) \ + SSL_ctrl((ssl),SSL_CTRL_SET_MTU,(mtu),NULL) +# define DTLS_set_link_mtu(ssl, mtu) \ + SSL_ctrl((ssl),DTLS_CTRL_SET_LINK_MTU,(mtu),NULL) +# define DTLS_get_link_min_mtu(ssl) \ + SSL_ctrl((ssl),DTLS_CTRL_GET_LINK_MIN_MTU,0,NULL) + +# define SSL_get_secure_renegotiation_support(ssl) \ + SSL_ctrl((ssl), SSL_CTRL_GET_RI_SUPPORT, 0, NULL) + +# ifndef OPENSSL_NO_HEARTBEATS +# define SSL_heartbeat(ssl) \ + SSL_ctrl((ssl),SSL_CTRL_DTLS_EXT_SEND_HEARTBEAT,0,NULL) +# endif + +# define SSL_CTX_set_cert_flags(ctx,op) \ + SSL_CTX_ctrl((ctx),SSL_CTRL_CERT_FLAGS,(op),NULL) +# define SSL_set_cert_flags(s,op) \ + SSL_ctrl((s),SSL_CTRL_CERT_FLAGS,(op),NULL) +# define SSL_CTX_clear_cert_flags(ctx,op) \ + SSL_CTX_ctrl((ctx),SSL_CTRL_CLEAR_CERT_FLAGS,(op),NULL) +# define SSL_clear_cert_flags(s,op) \ + SSL_ctrl((s),SSL_CTRL_CLEAR_CERT_FLAGS,(op),NULL) + +void SSL_CTX_set_msg_callback(SSL_CTX *ctx, + void (*cb) (int write_p, int version, + int content_type, const void *buf, + size_t len, SSL *ssl, void *arg)); +void SSL_set_msg_callback(SSL *ssl, + void (*cb) (int write_p, int version, + int content_type, const void *buf, + size_t len, SSL *ssl, void *arg)); +# define SSL_CTX_set_msg_callback_arg(ctx, arg) SSL_CTX_ctrl((ctx), SSL_CTRL_SET_MSG_CALLBACK_ARG, 0, (arg)) +# define SSL_set_msg_callback_arg(ssl, arg) SSL_ctrl((ssl), SSL_CTRL_SET_MSG_CALLBACK_ARG, 0, (arg)) + +# define SSL_get_extms_support(s) \ + SSL_ctrl((s),SSL_CTRL_GET_EXTMS_SUPPORT,0,NULL) + +# ifndef OPENSSL_NO_SRP + +/* see tls_srp.c */ +__owur int SSL_SRP_CTX_init(SSL *s); +__owur 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); +__owur int SSL_srp_server_param_with_username(SSL *s, int *ad); +__owur int SRP_Calc_A_param(SSL *s); + +# endif + +/* 100k max cert list */ +# define SSL_MAX_CERT_LIST_DEFAULT 1024*100 + +# 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 SSLv3/TLSv1 it is 32 + * bytes. The callback can alter this length to be less if desired. It is + * also an error for the callback to set the size to zero. + */ +typedef int (*GEN_SESSION_CB) (SSL *ssl, unsigned char *id, + unsigned int *id_len); + +# 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, + const unsigned char + *data, int len, + int *copy)); +SSL_SESSION *(*SSL_CTX_sess_get_get_cb(SSL_CTX *ctx)) (struct ssl_st *ssl, + const 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 +__owur 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, + const unsigned + char *cookie, + unsigned int + cookie_len)); + +void SSL_CTX_set_stateless_cookie_generate_cb( + SSL_CTX *ctx, + int (*gen_stateless_cookie_cb) (SSL *ssl, + unsigned char *cookie, + size_t *cookie_len)); +void SSL_CTX_set_stateless_cookie_verify_cb( + SSL_CTX *ctx, + int (*verify_stateless_cookie_cb) (SSL *ssl, + const unsigned char *cookie, + size_t cookie_len)); +# ifndef OPENSSL_NO_NEXTPROTONEG + +typedef int (*SSL_CTX_npn_advertised_cb_func)(SSL *ssl, + const unsigned char **out, + unsigned int *outlen, + void *arg); +void SSL_CTX_set_next_protos_advertised_cb(SSL_CTX *s, + SSL_CTX_npn_advertised_cb_func cb, + void *arg); +# define SSL_CTX_set_npn_advertised_cb SSL_CTX_set_next_protos_advertised_cb + +typedef int (*SSL_CTX_npn_select_cb_func)(SSL *s, + unsigned char **out, + unsigned char *outlen, + const unsigned char *in, + unsigned int inlen, + void *arg); +void SSL_CTX_set_next_proto_select_cb(SSL_CTX *s, + SSL_CTX_npn_select_cb_func cb, + void *arg); +# define SSL_CTX_set_npn_select_cb SSL_CTX_set_next_proto_select_cb + +void SSL_get0_next_proto_negotiated(const SSL *s, const unsigned char **data, + unsigned *len); +# define SSL_get0_npn_negotiated SSL_get0_next_proto_negotiated +# endif + +__owur 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); + +# define OPENSSL_NPN_UNSUPPORTED 0 +# define OPENSSL_NPN_NEGOTIATED 1 +# define OPENSSL_NPN_NO_OVERLAP 2 + +__owur int SSL_CTX_set_alpn_protos(SSL_CTX *ctx, const unsigned char *protos, + unsigned int protos_len); +__owur int SSL_set_alpn_protos(SSL *ssl, const unsigned char *protos, + unsigned int protos_len); +typedef int (*SSL_CTX_alpn_select_cb_func)(SSL *ssl, + const unsigned char **out, + unsigned char *outlen, + const unsigned char *in, + unsigned int inlen, + void *arg); +void SSL_CTX_set_alpn_select_cb(SSL_CTX *ctx, + SSL_CTX_alpn_select_cb_func cb, + void *arg); +void SSL_get0_alpn_selected(const SSL *ssl, const unsigned char **data, + unsigned int *len); + +# ifndef OPENSSL_NO_PSK +/* + * the maximum length of the buffer given to callbacks containing the + * resulting identity/psk + */ +# define PSK_MAX_IDENTITY_LEN 128 +# define PSK_MAX_PSK_LEN 256 +typedef unsigned int (*SSL_psk_client_cb_func)(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_client_callback(SSL_CTX *ctx, SSL_psk_client_cb_func cb); +void SSL_set_psk_client_callback(SSL *ssl, SSL_psk_client_cb_func cb); + +typedef unsigned int (*SSL_psk_server_cb_func)(SSL *ssl, + const char *identity, + unsigned char *psk, + unsigned int max_psk_len); +void SSL_CTX_set_psk_server_callback(SSL_CTX *ctx, SSL_psk_server_cb_func cb); +void SSL_set_psk_server_callback(SSL *ssl, SSL_psk_server_cb_func cb); + +__owur int SSL_CTX_use_psk_identity_hint(SSL_CTX *ctx, const char *identity_hint); +__owur 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 + +typedef int (*SSL_psk_find_session_cb_func)(SSL *ssl, + const unsigned char *identity, + size_t identity_len, + SSL_SESSION **sess); +typedef int (*SSL_psk_use_session_cb_func)(SSL *ssl, const EVP_MD *md, + const unsigned char **id, + size_t *idlen, + SSL_SESSION **sess); + +void SSL_set_psk_find_session_callback(SSL *s, SSL_psk_find_session_cb_func cb); +void SSL_CTX_set_psk_find_session_callback(SSL_CTX *ctx, + SSL_psk_find_session_cb_func cb); +void SSL_set_psk_use_session_callback(SSL *s, SSL_psk_use_session_cb_func cb); +void SSL_CTX_set_psk_use_session_callback(SSL_CTX *ctx, + SSL_psk_use_session_cb_func cb); + +/* Register callbacks to handle custom TLS Extensions for client or server. */ + +__owur int SSL_CTX_has_client_custom_ext(const SSL_CTX *ctx, + unsigned int ext_type); + +__owur int SSL_CTX_add_client_custom_ext(SSL_CTX *ctx, + unsigned int ext_type, + custom_ext_add_cb add_cb, + custom_ext_free_cb free_cb, + void *add_arg, + custom_ext_parse_cb parse_cb, + void *parse_arg); + +__owur int SSL_CTX_add_server_custom_ext(SSL_CTX *ctx, + unsigned int ext_type, + custom_ext_add_cb add_cb, + custom_ext_free_cb free_cb, + void *add_arg, + custom_ext_parse_cb parse_cb, + void *parse_arg); + +__owur int SSL_CTX_add_custom_ext(SSL_CTX *ctx, unsigned int ext_type, + unsigned int context, + SSL_custom_ext_add_cb_ex add_cb, + SSL_custom_ext_free_cb_ex free_cb, + void *add_arg, + SSL_custom_ext_parse_cb_ex parse_cb, + void *parse_arg); + +__owur int SSL_extension_supported(unsigned int ext_type); + +# define SSL_NOTHING 1 +# define SSL_WRITING 2 +# define SSL_READING 3 +# define SSL_X509_LOOKUP 4 +# define SSL_ASYNC_PAUSED 5 +# define SSL_ASYNC_NO_JOBS 6 +# define SSL_CLIENT_HELLO_CB 7 + +/* 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_want_async(s) (SSL_want(s) == SSL_ASYNC_PAUSED) +# define SSL_want_async_job(s) (SSL_want(s) == SSL_ASYNC_NO_JOBS) +# define SSL_want_client_hello_cb(s) (SSL_want(s) == SSL_CLIENT_HELLO_CB) + +# define SSL_MAC_FLAG_READ_MAC_STREAM 1 +# define SSL_MAC_FLAG_WRITE_MAC_STREAM 2 + +/* + * A callback for logging out TLS key material. This callback should log out + * |line| followed by a newline. + */ +typedef void (*SSL_CTX_keylog_cb_func)(const SSL *ssl, const char *line); + +/* + * SSL_CTX_set_keylog_callback configures a callback to log key material. This + * is intended for debugging use with tools like Wireshark. The cb function + * should log line followed by a newline. + */ +void SSL_CTX_set_keylog_callback(SSL_CTX *ctx, SSL_CTX_keylog_cb_func cb); + +/* + * SSL_CTX_get_keylog_callback returns the callback configured by + * SSL_CTX_set_keylog_callback. + */ +SSL_CTX_keylog_cb_func SSL_CTX_get_keylog_callback(const SSL_CTX *ctx); + +int SSL_CTX_set_max_early_data(SSL_CTX *ctx, uint32_t max_early_data); +uint32_t SSL_CTX_get_max_early_data(const SSL_CTX *ctx); +int SSL_set_max_early_data(SSL *s, uint32_t max_early_data); +uint32_t SSL_get_max_early_data(const SSL *s); +int SSL_CTX_set_recv_max_early_data(SSL_CTX *ctx, uint32_t recv_max_early_data); +uint32_t SSL_CTX_get_recv_max_early_data(const SSL_CTX *ctx); +int SSL_set_recv_max_early_data(SSL *s, uint32_t recv_max_early_data); +uint32_t SSL_get_recv_max_early_data(const SSL *s); + +#ifdef __cplusplus +} +#endif + +# include +# include +# include /* This is mostly sslv3 with a few tweaks */ +# include /* Datagram TLS */ +# include /* Support for the use_srtp extension */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * These need to be after the above set of includes due to a compiler bug + * in VisualStudio 2015 + */ +DEFINE_STACK_OF_CONST(SSL_CIPHER) +DEFINE_STACK_OF(SSL_COMP) + +/* 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))) +DEPRECATEDIN_1_1_0(void SSL_set_debug(SSL *s, int debug)) + +/* TLSv1.3 KeyUpdate message types */ +/* -1 used so that this is an invalid value for the on-the-wire protocol */ +#define SSL_KEY_UPDATE_NONE -1 +/* Values as defined for the on-the-wire protocol */ +#define SSL_KEY_UPDATE_NOT_REQUESTED 0 +#define SSL_KEY_UPDATE_REQUESTED 1 + +/* + * The valid handshake states (one for each type message sent and one for each + * type of message received). There are also two "special" states: + * TLS = TLS or DTLS state + * DTLS = DTLS specific state + * CR/SR = Client Read/Server Read + * CW/SW = Client Write/Server Write + * + * The "special" states are: + * TLS_ST_BEFORE = No handshake has been initiated yet + * TLS_ST_OK = A handshake has been successfully completed + */ +typedef enum { + TLS_ST_BEFORE, + TLS_ST_OK, + DTLS_ST_CR_HELLO_VERIFY_REQUEST, + TLS_ST_CR_SRVR_HELLO, + TLS_ST_CR_CERT, + TLS_ST_CR_CERT_STATUS, + TLS_ST_CR_KEY_EXCH, + TLS_ST_CR_CERT_REQ, + TLS_ST_CR_SRVR_DONE, + TLS_ST_CR_SESSION_TICKET, + TLS_ST_CR_CHANGE, + TLS_ST_CR_FINISHED, + TLS_ST_CW_CLNT_HELLO, + TLS_ST_CW_CERT, + TLS_ST_CW_KEY_EXCH, + TLS_ST_CW_CERT_VRFY, + TLS_ST_CW_CHANGE, + TLS_ST_CW_NEXT_PROTO, + TLS_ST_CW_FINISHED, + TLS_ST_SW_HELLO_REQ, + TLS_ST_SR_CLNT_HELLO, + DTLS_ST_SW_HELLO_VERIFY_REQUEST, + TLS_ST_SW_SRVR_HELLO, + TLS_ST_SW_CERT, + TLS_ST_SW_KEY_EXCH, + TLS_ST_SW_CERT_REQ, + TLS_ST_SW_SRVR_DONE, + TLS_ST_SR_CERT, + TLS_ST_SR_KEY_EXCH, + TLS_ST_SR_CERT_VRFY, + TLS_ST_SR_NEXT_PROTO, + TLS_ST_SR_CHANGE, + TLS_ST_SR_FINISHED, + TLS_ST_SW_SESSION_TICKET, + TLS_ST_SW_CERT_STATUS, + TLS_ST_SW_CHANGE, + TLS_ST_SW_FINISHED, + TLS_ST_SW_ENCRYPTED_EXTENSIONS, + TLS_ST_CR_ENCRYPTED_EXTENSIONS, + TLS_ST_CR_CERT_VRFY, + TLS_ST_SW_CERT_VRFY, + TLS_ST_CR_HELLO_REQ, + TLS_ST_SW_KEY_UPDATE, + TLS_ST_CW_KEY_UPDATE, + TLS_ST_SR_KEY_UPDATE, + TLS_ST_CR_KEY_UPDATE, + TLS_ST_EARLY_DATA, + TLS_ST_PENDING_EARLY_DATA_END, + TLS_ST_CW_END_OF_EARLY_DATA, + TLS_ST_SR_END_OF_EARLY_DATA +} OSSL_HANDSHAKE_STATE; + +/* + * Most of the following state values are no longer used and are defined to be + * the closest equivalent value in the current state machine code. Not all + * defines have an equivalent and are set to a dummy value (-1). SSL_ST_CONNECT + * and SSL_ST_ACCEPT are still in use in the definition of SSL_CB_ACCEPT_LOOP, + * SSL_CB_ACCEPT_EXIT, SSL_CB_CONNECT_LOOP and SSL_CB_CONNECT_EXIT. + */ + +# define SSL_ST_CONNECT 0x1000 +# define SSL_ST_ACCEPT 0x2000 + +# define SSL_ST_MASK 0x0FFF + +# 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_in_connect_init(a) (SSL_in_init(a) && !SSL_is_server(a)) +# define SSL_in_accept_init(a) (SSL_in_init(a) && SSL_is_server(a)) +int SSL_in_init(const SSL *s); +int SSL_in_before(const SSL *s); +int SSL_is_init_finished(const SSL *s); + +/* + * The following 3 states are kept in ssl->rlayer.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 3 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 SSL_VERIFY_POST_HANDSHAKE 0x08 + +# if OPENSSL_API_COMPAT < 0x10100000L +# define OpenSSL_add_ssl_algorithms() SSL_library_init() +# define SSLeay_add_ssl_algorithms() SSL_library_init() +# endif + +/* More backward compatibility */ +# define SSL_get_cipher(s) \ + SSL_CIPHER_get_name(SSL_get_current_cipher(s)) +# define SSL_get_cipher_bits(s,np) \ + SSL_CIPHER_get_bits(SSL_get_current_cipher(s),np) +# define SSL_get_cipher_version(s) \ + SSL_CIPHER_get_version(SSL_get_current_cipher(s)) +# define SSL_get_cipher_name(s) \ + SSL_CIPHER_get_name(SSL_get_current_cipher(s)) +# define SSL_get_time(a) SSL_SESSION_get_time(a) +# define SSL_set_time(a,b) SSL_SESSION_set_time((a),(b)) +# define SSL_get_timeout(a) SSL_SESSION_get_timeout(a) +# define SSL_set_timeout(a,b) SSL_SESSION_set_timeout((a),(b)) + +# define d2i_SSL_SESSION_bio(bp,s_id) ASN1_d2i_bio_of(SSL_SESSION,SSL_SESSION_new,d2i_SSL_SESSION,bp,s_id) +# define i2d_SSL_SESSION_bio(bp,s_id) ASN1_i2d_bio_of(SSL_SESSION,i2d_SSL_SESSION,bp,s_id) + +DECLARE_PEM_rw(SSL_SESSION, SSL_SESSION) +# define SSL_AD_REASON_OFFSET 1000/* offset to get SSL_R_... value + * from SSL_AD_... */ +/* These alert types are for SSLv3 and TLSv1 */ +# define SSL_AD_CLOSE_NOTIFY SSL3_AD_CLOSE_NOTIFY +/* fatal */ +# define SSL_AD_UNEXPECTED_MESSAGE SSL3_AD_UNEXPECTED_MESSAGE +/* fatal */ +# define SSL_AD_BAD_RECORD_MAC SSL3_AD_BAD_RECORD_MAC +# define SSL_AD_DECRYPTION_FAILED TLS1_AD_DECRYPTION_FAILED +# define SSL_AD_RECORD_OVERFLOW TLS1_AD_RECORD_OVERFLOW +/* fatal */ +# define SSL_AD_DECOMPRESSION_FAILURE SSL3_AD_DECOMPRESSION_FAILURE +/* fatal */ +# define SSL_AD_HANDSHAKE_FAILURE SSL3_AD_HANDSHAKE_FAILURE +/* Not for TLS */ +# define SSL_AD_NO_CERTIFICATE SSL3_AD_NO_CERTIFICATE +# define SSL_AD_BAD_CERTIFICATE SSL3_AD_BAD_CERTIFICATE +# define SSL_AD_UNSUPPORTED_CERTIFICATE SSL3_AD_UNSUPPORTED_CERTIFICATE +# define SSL_AD_CERTIFICATE_REVOKED SSL3_AD_CERTIFICATE_REVOKED +# define SSL_AD_CERTIFICATE_EXPIRED SSL3_AD_CERTIFICATE_EXPIRED +# define SSL_AD_CERTIFICATE_UNKNOWN SSL3_AD_CERTIFICATE_UNKNOWN +/* fatal */ +# define SSL_AD_ILLEGAL_PARAMETER SSL3_AD_ILLEGAL_PARAMETER +/* fatal */ +# define SSL_AD_UNKNOWN_CA TLS1_AD_UNKNOWN_CA +/* fatal */ +# define SSL_AD_ACCESS_DENIED TLS1_AD_ACCESS_DENIED +/* fatal */ +# define SSL_AD_DECODE_ERROR TLS1_AD_DECODE_ERROR +# define SSL_AD_DECRYPT_ERROR TLS1_AD_DECRYPT_ERROR +/* fatal */ +# define SSL_AD_EXPORT_RESTRICTION TLS1_AD_EXPORT_RESTRICTION +/* fatal */ +# define SSL_AD_PROTOCOL_VERSION TLS1_AD_PROTOCOL_VERSION +/* fatal */ +# define SSL_AD_INSUFFICIENT_SECURITY TLS1_AD_INSUFFICIENT_SECURITY +/* fatal */ +# define SSL_AD_INTERNAL_ERROR TLS1_AD_INTERNAL_ERROR +# define SSL_AD_USER_CANCELLED TLS1_AD_USER_CANCELLED +# define SSL_AD_NO_RENEGOTIATION TLS1_AD_NO_RENEGOTIATION +# define SSL_AD_MISSING_EXTENSION TLS13_AD_MISSING_EXTENSION +# define SSL_AD_CERTIFICATE_REQUIRED TLS13_AD_CERTIFICATE_REQUIRED +# define SSL_AD_UNSUPPORTED_EXTENSION TLS1_AD_UNSUPPORTED_EXTENSION +# define SSL_AD_CERTIFICATE_UNOBTAINABLE TLS1_AD_CERTIFICATE_UNOBTAINABLE +# define SSL_AD_UNRECOGNIZED_NAME TLS1_AD_UNRECOGNIZED_NAME +# define SSL_AD_BAD_CERTIFICATE_STATUS_RESPONSE TLS1_AD_BAD_CERTIFICATE_STATUS_RESPONSE +# define SSL_AD_BAD_CERTIFICATE_HASH_VALUE TLS1_AD_BAD_CERTIFICATE_HASH_VALUE +/* fatal */ +# define SSL_AD_UNKNOWN_PSK_IDENTITY TLS1_AD_UNKNOWN_PSK_IDENTITY +/* fatal */ +# define SSL_AD_INAPPROPRIATE_FALLBACK TLS1_AD_INAPPROPRIATE_FALLBACK +# define SSL_AD_NO_APPLICATION_PROTOCOL TLS1_AD_NO_APPLICATION_PROTOCOL +# 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_ERROR_WANT_ASYNC 9 +# define SSL_ERROR_WANT_ASYNC_JOB 10 +# define SSL_ERROR_WANT_CLIENT_HELLO_CB 11 +# define SSL_CTRL_SET_TMP_DH 3 +# define SSL_CTRL_SET_TMP_ECDH 4 +# define SSL_CTRL_SET_TMP_DH_CB 6 +# 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_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 */ +# 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_DTLS_EXT_SEND_HEARTBEAT 85 +# define SSL_CTRL_GET_DTLS_EXT_HEARTBEAT_PENDING 86 +# define SSL_CTRL_SET_DTLS_EXT_HEARTBEAT_NO_REQUESTS 87 +# endif +# define DTLS_CTRL_GET_TIMEOUT 73 +# define DTLS_CTRL_HANDLE_TIMEOUT 74 +# define SSL_CTRL_GET_RI_SUPPORT 76 +# define SSL_CTRL_CLEAR_MODE 78 +# define SSL_CTRL_SET_NOT_RESUMABLE_SESS_CB 79 +# define SSL_CTRL_GET_EXTRA_CHAIN_CERTS 82 +# define SSL_CTRL_CLEAR_EXTRA_CHAIN_CERTS 83 +# define SSL_CTRL_CHAIN 88 +# define SSL_CTRL_CHAIN_CERT 89 +# define SSL_CTRL_GET_GROUPS 90 +# define SSL_CTRL_SET_GROUPS 91 +# define SSL_CTRL_SET_GROUPS_LIST 92 +# define SSL_CTRL_GET_SHARED_GROUP 93 +# define SSL_CTRL_SET_SIGALGS 97 +# define SSL_CTRL_SET_SIGALGS_LIST 98 +# define SSL_CTRL_CERT_FLAGS 99 +# define SSL_CTRL_CLEAR_CERT_FLAGS 100 +# define SSL_CTRL_SET_CLIENT_SIGALGS 101 +# define SSL_CTRL_SET_CLIENT_SIGALGS_LIST 102 +# define SSL_CTRL_GET_CLIENT_CERT_TYPES 103 +# define SSL_CTRL_SET_CLIENT_CERT_TYPES 104 +# define SSL_CTRL_BUILD_CERT_CHAIN 105 +# define SSL_CTRL_SET_VERIFY_CERT_STORE 106 +# define SSL_CTRL_SET_CHAIN_CERT_STORE 107 +# define SSL_CTRL_GET_PEER_SIGNATURE_NID 108 +# define SSL_CTRL_GET_PEER_TMP_KEY 109 +# define SSL_CTRL_GET_RAW_CIPHERLIST 110 +# define SSL_CTRL_GET_EC_POINT_FORMATS 111 +# define SSL_CTRL_GET_CHAIN_CERTS 115 +# define SSL_CTRL_SELECT_CURRENT_CERT 116 +# define SSL_CTRL_SET_CURRENT_CERT 117 +# define SSL_CTRL_SET_DH_AUTO 118 +# define DTLS_CTRL_SET_LINK_MTU 120 +# define DTLS_CTRL_GET_LINK_MIN_MTU 121 +# define SSL_CTRL_GET_EXTMS_SUPPORT 122 +# define SSL_CTRL_SET_MIN_PROTO_VERSION 123 +# define SSL_CTRL_SET_MAX_PROTO_VERSION 124 +# define SSL_CTRL_SET_SPLIT_SEND_FRAGMENT 125 +# define SSL_CTRL_SET_MAX_PIPELINES 126 +# define SSL_CTRL_GET_TLSEXT_STATUS_REQ_TYPE 127 +# define SSL_CTRL_GET_TLSEXT_STATUS_REQ_CB 128 +# define SSL_CTRL_GET_TLSEXT_STATUS_REQ_CB_ARG 129 +# define SSL_CTRL_GET_MIN_PROTO_VERSION 130 +# define SSL_CTRL_GET_MAX_PROTO_VERSION 131 +# define SSL_CTRL_GET_SIGNATURE_NID 132 +# define SSL_CTRL_GET_TMP_KEY 133 +# define SSL_CERT_SET_FIRST 1 +# define SSL_CERT_SET_NEXT 2 +# define SSL_CERT_SET_SERVER 3 +# define DTLSv1_get_timeout(ssl, arg) \ + SSL_ctrl(ssl,DTLS_CTRL_GET_TIMEOUT,0, (void *)(arg)) +# define DTLSv1_handle_timeout(ssl) \ + SSL_ctrl(ssl,DTLS_CTRL_HANDLE_TIMEOUT,0, NULL) +# define 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_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_CTX_set_dh_auto(ctx, onoff) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_DH_AUTO,onoff,NULL) +# define SSL_set_dh_auto(s, onoff) \ + SSL_ctrl(s,SSL_CTRL_SET_DH_AUTO,onoff,NULL) +# define SSL_set_tmp_dh(ssl,dh) \ + SSL_ctrl(ssl,SSL_CTRL_SET_TMP_DH,0,(char *)(dh)) +# define SSL_set_tmp_ecdh(ssl,ecdh) \ + SSL_ctrl(ssl,SSL_CTRL_SET_TMP_ECDH,0,(char *)(ecdh)) +# define SSL_CTX_add_extra_chain_cert(ctx,x509) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_EXTRA_CHAIN_CERT,0,(char *)(x509)) +# define SSL_CTX_get_extra_chain_certs(ctx,px509) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_GET_EXTRA_CHAIN_CERTS,0,px509) +# define SSL_CTX_get_extra_chain_certs_only(ctx,px509) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_GET_EXTRA_CHAIN_CERTS,1,px509) +# define SSL_CTX_clear_extra_chain_certs(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_CLEAR_EXTRA_CHAIN_CERTS,0,NULL) +# define SSL_CTX_set0_chain(ctx,sk) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_CHAIN,0,(char *)(sk)) +# define SSL_CTX_set1_chain(ctx,sk) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_CHAIN,1,(char *)(sk)) +# define SSL_CTX_add0_chain_cert(ctx,x509) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_CHAIN_CERT,0,(char *)(x509)) +# define SSL_CTX_add1_chain_cert(ctx,x509) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_CHAIN_CERT,1,(char *)(x509)) +# define SSL_CTX_get0_chain_certs(ctx,px509) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_GET_CHAIN_CERTS,0,px509) +# define SSL_CTX_clear_chain_certs(ctx) \ + SSL_CTX_set0_chain(ctx,NULL) +# define SSL_CTX_build_cert_chain(ctx, flags) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_BUILD_CERT_CHAIN, flags, NULL) +# define SSL_CTX_select_current_cert(ctx,x509) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SELECT_CURRENT_CERT,0,(char *)(x509)) +# define SSL_CTX_set_current_cert(ctx, op) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_CURRENT_CERT, op, NULL) +# define SSL_CTX_set0_verify_cert_store(ctx,st) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_VERIFY_CERT_STORE,0,(char *)(st)) +# define SSL_CTX_set1_verify_cert_store(ctx,st) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_VERIFY_CERT_STORE,1,(char *)(st)) +# define SSL_CTX_set0_chain_cert_store(ctx,st) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_CHAIN_CERT_STORE,0,(char *)(st)) +# define SSL_CTX_set1_chain_cert_store(ctx,st) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_CHAIN_CERT_STORE,1,(char *)(st)) +# define SSL_set0_chain(s,sk) \ + SSL_ctrl(s,SSL_CTRL_CHAIN,0,(char *)(sk)) +# define SSL_set1_chain(s,sk) \ + SSL_ctrl(s,SSL_CTRL_CHAIN,1,(char *)(sk)) +# define SSL_add0_chain_cert(s,x509) \ + SSL_ctrl(s,SSL_CTRL_CHAIN_CERT,0,(char *)(x509)) +# define SSL_add1_chain_cert(s,x509) \ + SSL_ctrl(s,SSL_CTRL_CHAIN_CERT,1,(char *)(x509)) +# define SSL_get0_chain_certs(s,px509) \ + SSL_ctrl(s,SSL_CTRL_GET_CHAIN_CERTS,0,px509) +# define SSL_clear_chain_certs(s) \ + SSL_set0_chain(s,NULL) +# define SSL_build_cert_chain(s, flags) \ + SSL_ctrl(s,SSL_CTRL_BUILD_CERT_CHAIN, flags, NULL) +# define SSL_select_current_cert(s,x509) \ + SSL_ctrl(s,SSL_CTRL_SELECT_CURRENT_CERT,0,(char *)(x509)) +# define SSL_set_current_cert(s,op) \ + SSL_ctrl(s,SSL_CTRL_SET_CURRENT_CERT, op, NULL) +# define SSL_set0_verify_cert_store(s,st) \ + SSL_ctrl(s,SSL_CTRL_SET_VERIFY_CERT_STORE,0,(char *)(st)) +# define SSL_set1_verify_cert_store(s,st) \ + SSL_ctrl(s,SSL_CTRL_SET_VERIFY_CERT_STORE,1,(char *)(st)) +# define SSL_set0_chain_cert_store(s,st) \ + SSL_ctrl(s,SSL_CTRL_SET_CHAIN_CERT_STORE,0,(char *)(st)) +# define SSL_set1_chain_cert_store(s,st) \ + SSL_ctrl(s,SSL_CTRL_SET_CHAIN_CERT_STORE,1,(char *)(st)) +# define SSL_get1_groups(s, glist) \ + SSL_ctrl(s,SSL_CTRL_GET_GROUPS,0,(int*)(glist)) +# define SSL_CTX_set1_groups(ctx, glist, glistlen) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_GROUPS,glistlen,(int *)(glist)) +# define SSL_CTX_set1_groups_list(ctx, s) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_GROUPS_LIST,0,(char *)(s)) +# define SSL_set1_groups(s, glist, glistlen) \ + SSL_ctrl(s,SSL_CTRL_SET_GROUPS,glistlen,(char *)(glist)) +# define SSL_set1_groups_list(s, str) \ + SSL_ctrl(s,SSL_CTRL_SET_GROUPS_LIST,0,(char *)(str)) +# define SSL_get_shared_group(s, n) \ + SSL_ctrl(s,SSL_CTRL_GET_SHARED_GROUP,n,NULL) +# define SSL_CTX_set1_sigalgs(ctx, slist, slistlen) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_SIGALGS,slistlen,(int *)(slist)) +# define SSL_CTX_set1_sigalgs_list(ctx, s) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_SIGALGS_LIST,0,(char *)(s)) +# define SSL_set1_sigalgs(s, slist, slistlen) \ + SSL_ctrl(s,SSL_CTRL_SET_SIGALGS,slistlen,(int *)(slist)) +# define SSL_set1_sigalgs_list(s, str) \ + SSL_ctrl(s,SSL_CTRL_SET_SIGALGS_LIST,0,(char *)(str)) +# define SSL_CTX_set1_client_sigalgs(ctx, slist, slistlen) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_CLIENT_SIGALGS,slistlen,(int *)(slist)) +# define SSL_CTX_set1_client_sigalgs_list(ctx, s) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_CLIENT_SIGALGS_LIST,0,(char *)(s)) +# define SSL_set1_client_sigalgs(s, slist, slistlen) \ + SSL_ctrl(s,SSL_CTRL_SET_CLIENT_SIGALGS,slistlen,(int *)(slist)) +# define SSL_set1_client_sigalgs_list(s, str) \ + SSL_ctrl(s,SSL_CTRL_SET_CLIENT_SIGALGS_LIST,0,(char *)(str)) +# define SSL_get0_certificate_types(s, clist) \ + SSL_ctrl(s, SSL_CTRL_GET_CLIENT_CERT_TYPES, 0, (char *)(clist)) +# define SSL_CTX_set1_client_certificate_types(ctx, clist, clistlen) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_CLIENT_CERT_TYPES,clistlen, \ + (char *)(clist)) +# define SSL_set1_client_certificate_types(s, clist, clistlen) \ + SSL_ctrl(s,SSL_CTRL_SET_CLIENT_CERT_TYPES,clistlen,(char *)(clist)) +# define SSL_get_signature_nid(s, pn) \ + SSL_ctrl(s,SSL_CTRL_GET_SIGNATURE_NID,0,pn) +# define SSL_get_peer_signature_nid(s, pn) \ + SSL_ctrl(s,SSL_CTRL_GET_PEER_SIGNATURE_NID,0,pn) +# define SSL_get_peer_tmp_key(s, pk) \ + SSL_ctrl(s,SSL_CTRL_GET_PEER_TMP_KEY,0,pk) +# define SSL_get_tmp_key(s, pk) \ + SSL_ctrl(s,SSL_CTRL_GET_TMP_KEY,0,pk) +# define SSL_get0_raw_cipherlist(s, plst) \ + SSL_ctrl(s,SSL_CTRL_GET_RAW_CIPHERLIST,0,plst) +# define SSL_get0_ec_point_formats(s, plst) \ + SSL_ctrl(s,SSL_CTRL_GET_EC_POINT_FORMATS,0,plst) +# define SSL_CTX_set_min_proto_version(ctx, version) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SET_MIN_PROTO_VERSION, version, NULL) +# define SSL_CTX_set_max_proto_version(ctx, version) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SET_MAX_PROTO_VERSION, version, NULL) +# define SSL_CTX_get_min_proto_version(ctx) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_GET_MIN_PROTO_VERSION, 0, NULL) +# define SSL_CTX_get_max_proto_version(ctx) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_GET_MAX_PROTO_VERSION, 0, NULL) +# define SSL_set_min_proto_version(s, version) \ + SSL_ctrl(s, SSL_CTRL_SET_MIN_PROTO_VERSION, version, NULL) +# define SSL_set_max_proto_version(s, version) \ + SSL_ctrl(s, SSL_CTRL_SET_MAX_PROTO_VERSION, version, NULL) +# define SSL_get_min_proto_version(s) \ + SSL_ctrl(s, SSL_CTRL_GET_MIN_PROTO_VERSION, 0, NULL) +# define SSL_get_max_proto_version(s) \ + SSL_ctrl(s, SSL_CTRL_GET_MAX_PROTO_VERSION, 0, NULL) + +/* Backwards compatibility, original 1.1.0 names */ +# define SSL_CTRL_GET_SERVER_TMP_KEY \ + SSL_CTRL_GET_PEER_TMP_KEY +# define SSL_get_server_tmp_key(s, pk) \ + SSL_get_peer_tmp_key(s, pk) + +/* + * The following symbol names are old and obsolete. They are kept + * for compatibility reasons only and should not be used anymore. + */ +# define SSL_CTRL_GET_CURVES SSL_CTRL_GET_GROUPS +# define SSL_CTRL_SET_CURVES SSL_CTRL_SET_GROUPS +# define SSL_CTRL_SET_CURVES_LIST SSL_CTRL_SET_GROUPS_LIST +# define SSL_CTRL_GET_SHARED_CURVE SSL_CTRL_GET_SHARED_GROUP + +# define SSL_get1_curves SSL_get1_groups +# define SSL_CTX_set1_curves SSL_CTX_set1_groups +# define SSL_CTX_set1_curves_list SSL_CTX_set1_groups_list +# define SSL_set1_curves SSL_set1_groups +# define SSL_set1_curves_list SSL_set1_groups_list +# define SSL_get_shared_curve SSL_get_shared_group + + +# if OPENSSL_API_COMPAT < 0x10100000L +/* Provide some compatibility macros for removed functionality. */ +# define SSL_CTX_need_tmp_RSA(ctx) 0 +# define SSL_CTX_set_tmp_rsa(ctx,rsa) 1 +# define SSL_need_tmp_RSA(ssl) 0 +# define SSL_set_tmp_rsa(ssl,rsa) 1 +# define SSL_CTX_set_ecdh_auto(dummy, onoff) ((onoff) != 0) +# define SSL_set_ecdh_auto(dummy, onoff) ((onoff) != 0) +/* + * We "pretend" to call the callback to avoid warnings about unused static + * functions. + */ +# define SSL_CTX_set_tmp_rsa_callback(ctx, cb) while(0) (cb)(NULL, 0, 0) +# define SSL_set_tmp_rsa_callback(ssl, cb) while(0) (cb)(NULL, 0, 0) +# endif +__owur const BIO_METHOD *BIO_f_ssl(void); +__owur BIO *BIO_new_ssl(SSL_CTX *ctx, int client); +__owur BIO *BIO_new_ssl_connect(SSL_CTX *ctx); +__owur BIO *BIO_new_buffer_ssl_connect(SSL_CTX *ctx); +__owur int BIO_ssl_copy_session_id(BIO *to, BIO *from); +void BIO_ssl_shutdown(BIO *ssl_bio); + +__owur int SSL_CTX_set_cipher_list(SSL_CTX *, const char *str); +__owur SSL_CTX *SSL_CTX_new(const SSL_METHOD *meth); +int SSL_CTX_up_ref(SSL_CTX *ctx); +void SSL_CTX_free(SSL_CTX *); +__owur long SSL_CTX_set_timeout(SSL_CTX *ctx, long t); +__owur long SSL_CTX_get_timeout(const SSL_CTX *ctx); +__owur X509_STORE *SSL_CTX_get_cert_store(const SSL_CTX *); +void SSL_CTX_set_cert_store(SSL_CTX *, X509_STORE *); +void SSL_CTX_set1_cert_store(SSL_CTX *, X509_STORE *); +__owur int SSL_want(const SSL *s); +__owur int SSL_clear(SSL *s); + +void SSL_CTX_flush_sessions(SSL_CTX *ctx, long tm); + +__owur const SSL_CIPHER *SSL_get_current_cipher(const SSL *s); +__owur const SSL_CIPHER *SSL_get_pending_cipher(const SSL *s); +__owur int SSL_CIPHER_get_bits(const SSL_CIPHER *c, int *alg_bits); +__owur const char *SSL_CIPHER_get_version(const SSL_CIPHER *c); +__owur const char *SSL_CIPHER_get_name(const SSL_CIPHER *c); +__owur const char *SSL_CIPHER_standard_name(const SSL_CIPHER *c); +__owur const char *OPENSSL_cipher_name(const char *rfc_name); +__owur uint32_t SSL_CIPHER_get_id(const SSL_CIPHER *c); +__owur uint16_t SSL_CIPHER_get_protocol_id(const SSL_CIPHER *c); +__owur int SSL_CIPHER_get_kx_nid(const SSL_CIPHER *c); +__owur int SSL_CIPHER_get_auth_nid(const SSL_CIPHER *c); +__owur const EVP_MD *SSL_CIPHER_get_handshake_digest(const SSL_CIPHER *c); +__owur int SSL_CIPHER_is_aead(const SSL_CIPHER *c); + +__owur int SSL_get_fd(const SSL *s); +__owur int SSL_get_rfd(const SSL *s); +__owur int SSL_get_wfd(const SSL *s); +__owur const char *SSL_get_cipher_list(const SSL *s, int n); +__owur char *SSL_get_shared_ciphers(const SSL *s, char *buf, int size); +__owur int SSL_get_read_ahead(const SSL *s); +__owur int SSL_pending(const SSL *s); +__owur int SSL_has_pending(const SSL *s); +# ifndef OPENSSL_NO_SOCK +__owur int SSL_set_fd(SSL *s, int fd); +__owur int SSL_set_rfd(SSL *s, int fd); +__owur int SSL_set_wfd(SSL *s, int fd); +# endif +void SSL_set0_rbio(SSL *s, BIO *rbio); +void SSL_set0_wbio(SSL *s, BIO *wbio); +void SSL_set_bio(SSL *s, BIO *rbio, BIO *wbio); +__owur BIO *SSL_get_rbio(const SSL *s); +__owur BIO *SSL_get_wbio(const SSL *s); +__owur int SSL_set_cipher_list(SSL *s, const char *str); +__owur int SSL_CTX_set_ciphersuites(SSL_CTX *ctx, const char *str); +__owur int SSL_set_ciphersuites(SSL *s, const char *str); +void SSL_set_read_ahead(SSL *s, int yes); +__owur int SSL_get_verify_mode(const SSL *s); +__owur int SSL_get_verify_depth(const SSL *s); +__owur SSL_verify_cb SSL_get_verify_callback(const SSL *s); +void SSL_set_verify(SSL *s, int mode, SSL_verify_cb callback); +void SSL_set_verify_depth(SSL *s, int depth); +void SSL_set_cert_cb(SSL *s, int (*cb) (SSL *ssl, void *arg), void *arg); +# ifndef OPENSSL_NO_RSA +__owur int SSL_use_RSAPrivateKey(SSL *ssl, RSA *rsa); +__owur int SSL_use_RSAPrivateKey_ASN1(SSL *ssl, const unsigned char *d, + long len); +# endif +__owur int SSL_use_PrivateKey(SSL *ssl, EVP_PKEY *pkey); +__owur int SSL_use_PrivateKey_ASN1(int pk, SSL *ssl, const unsigned char *d, + long len); +__owur int SSL_use_certificate(SSL *ssl, X509 *x); +__owur int SSL_use_certificate_ASN1(SSL *ssl, const unsigned char *d, int len); +__owur int SSL_use_cert_and_key(SSL *ssl, X509 *x509, EVP_PKEY *privatekey, + STACK_OF(X509) *chain, int override); + + +/* serverinfo file format versions */ +# define SSL_SERVERINFOV1 1 +# define SSL_SERVERINFOV2 2 + +/* Set serverinfo data for the current active cert. */ +__owur int SSL_CTX_use_serverinfo(SSL_CTX *ctx, const unsigned char *serverinfo, + size_t serverinfo_length); +__owur int SSL_CTX_use_serverinfo_ex(SSL_CTX *ctx, unsigned int version, + const unsigned char *serverinfo, + size_t serverinfo_length); +__owur int SSL_CTX_use_serverinfo_file(SSL_CTX *ctx, const char *file); + +#ifndef OPENSSL_NO_RSA +__owur int SSL_use_RSAPrivateKey_file(SSL *ssl, const char *file, int type); +#endif + +__owur int SSL_use_PrivateKey_file(SSL *ssl, const char *file, int type); +__owur int SSL_use_certificate_file(SSL *ssl, const char *file, int type); + +#ifndef OPENSSL_NO_RSA +__owur int SSL_CTX_use_RSAPrivateKey_file(SSL_CTX *ctx, const char *file, + int type); +#endif +__owur int SSL_CTX_use_PrivateKey_file(SSL_CTX *ctx, const char *file, + int type); +__owur int SSL_CTX_use_certificate_file(SSL_CTX *ctx, const char *file, + int type); +/* PEM type */ +__owur int SSL_CTX_use_certificate_chain_file(SSL_CTX *ctx, const char *file); +__owur int SSL_use_certificate_chain_file(SSL *ssl, const char *file); +__owur STACK_OF(X509_NAME) *SSL_load_client_CA_file(const char *file); +__owur int SSL_add_file_cert_subjects_to_stack(STACK_OF(X509_NAME) *stackCAs, + const char *file); +int SSL_add_dir_cert_subjects_to_stack(STACK_OF(X509_NAME) *stackCAs, + const char *dir); + +# if OPENSSL_API_COMPAT < 0x10100000L +# define SSL_load_error_strings() \ + OPENSSL_init_ssl(OPENSSL_INIT_LOAD_SSL_STRINGS \ + | OPENSSL_INIT_LOAD_CRYPTO_STRINGS, NULL) +# endif + +__owur const char *SSL_state_string(const SSL *s); +__owur const char *SSL_rstate_string(const SSL *s); +__owur const char *SSL_state_string_long(const SSL *s); +__owur const char *SSL_rstate_string_long(const SSL *s); +__owur long SSL_SESSION_get_time(const SSL_SESSION *s); +__owur long SSL_SESSION_set_time(SSL_SESSION *s, long t); +__owur long SSL_SESSION_get_timeout(const SSL_SESSION *s); +__owur long SSL_SESSION_set_timeout(SSL_SESSION *s, long t); +__owur int SSL_SESSION_get_protocol_version(const SSL_SESSION *s); +__owur int SSL_SESSION_set_protocol_version(SSL_SESSION *s, int version); + +__owur const char *SSL_SESSION_get0_hostname(const SSL_SESSION *s); +__owur int SSL_SESSION_set1_hostname(SSL_SESSION *s, const char *hostname); +void SSL_SESSION_get0_alpn_selected(const SSL_SESSION *s, + const unsigned char **alpn, + size_t *len); +__owur int SSL_SESSION_set1_alpn_selected(SSL_SESSION *s, + const unsigned char *alpn, + size_t len); +__owur const SSL_CIPHER *SSL_SESSION_get0_cipher(const SSL_SESSION *s); +__owur int SSL_SESSION_set_cipher(SSL_SESSION *s, const SSL_CIPHER *cipher); +__owur int SSL_SESSION_has_ticket(const SSL_SESSION *s); +__owur unsigned long SSL_SESSION_get_ticket_lifetime_hint(const SSL_SESSION *s); +void SSL_SESSION_get0_ticket(const SSL_SESSION *s, const unsigned char **tick, + size_t *len); +__owur uint32_t SSL_SESSION_get_max_early_data(const SSL_SESSION *s); +__owur int SSL_SESSION_set_max_early_data(SSL_SESSION *s, + uint32_t max_early_data); +__owur int SSL_copy_session_id(SSL *to, const SSL *from); +__owur X509 *SSL_SESSION_get0_peer(SSL_SESSION *s); +__owur int SSL_SESSION_set1_id_context(SSL_SESSION *s, + const unsigned char *sid_ctx, + unsigned int sid_ctx_len); +__owur int SSL_SESSION_set1_id(SSL_SESSION *s, const unsigned char *sid, + unsigned int sid_len); +__owur int SSL_SESSION_is_resumable(const SSL_SESSION *s); + +__owur SSL_SESSION *SSL_SESSION_new(void); +__owur SSL_SESSION *SSL_SESSION_dup(SSL_SESSION *src); +const unsigned char *SSL_SESSION_get_id(const SSL_SESSION *s, + unsigned int *len); +const unsigned char *SSL_SESSION_get0_id_context(const SSL_SESSION *s, + unsigned int *len); +__owur unsigned int SSL_SESSION_get_compress_id(const SSL_SESSION *s); +# ifndef OPENSSL_NO_STDIO +int SSL_SESSION_print_fp(FILE *fp, const SSL_SESSION *ses); +# endif +int SSL_SESSION_print(BIO *fp, const SSL_SESSION *ses); +int SSL_SESSION_print_keylog(BIO *bp, const SSL_SESSION *x); +int SSL_SESSION_up_ref(SSL_SESSION *ses); +void SSL_SESSION_free(SSL_SESSION *ses); +__owur int i2d_SSL_SESSION(SSL_SESSION *in, unsigned char **pp); +__owur int SSL_set_session(SSL *to, SSL_SESSION *session); +int SSL_CTX_add_session(SSL_CTX *ctx, SSL_SESSION *session); +int SSL_CTX_remove_session(SSL_CTX *ctx, SSL_SESSION *session); +__owur int SSL_CTX_set_generate_session_id(SSL_CTX *ctx, GEN_SESSION_CB cb); +__owur int SSL_set_generate_session_id(SSL *s, GEN_SESSION_CB cb); +__owur int SSL_has_matching_session_id(const SSL *s, + 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 +__owur X509 *SSL_get_peer_certificate(const SSL *s); +# endif + +__owur STACK_OF(X509) *SSL_get_peer_cert_chain(const SSL *s); + +__owur int SSL_CTX_get_verify_mode(const SSL_CTX *ctx); +__owur int SSL_CTX_get_verify_depth(const SSL_CTX *ctx); +__owur SSL_verify_cb SSL_CTX_get_verify_callback(const SSL_CTX *ctx); +void SSL_CTX_set_verify(SSL_CTX *ctx, int mode, SSL_verify_cb callback); +void SSL_CTX_set_verify_depth(SSL_CTX *ctx, int depth); +void SSL_CTX_set_cert_verify_callback(SSL_CTX *ctx, + int (*cb) (X509_STORE_CTX *, void *), + void *arg); +void SSL_CTX_set_cert_cb(SSL_CTX *c, int (*cb) (SSL *ssl, void *arg), + void *arg); +# ifndef OPENSSL_NO_RSA +__owur int SSL_CTX_use_RSAPrivateKey(SSL_CTX *ctx, RSA *rsa); +__owur int SSL_CTX_use_RSAPrivateKey_ASN1(SSL_CTX *ctx, const unsigned char *d, + long len); +# endif +__owur int SSL_CTX_use_PrivateKey(SSL_CTX *ctx, EVP_PKEY *pkey); +__owur int SSL_CTX_use_PrivateKey_ASN1(int pk, SSL_CTX *ctx, + const unsigned char *d, long len); +__owur int SSL_CTX_use_certificate(SSL_CTX *ctx, X509 *x); +__owur int SSL_CTX_use_certificate_ASN1(SSL_CTX *ctx, int len, + const unsigned char *d); +__owur int SSL_CTX_use_cert_and_key(SSL_CTX *ctx, X509 *x509, EVP_PKEY *privatekey, + STACK_OF(X509) *chain, int override); + +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); +pem_password_cb *SSL_CTX_get_default_passwd_cb(SSL_CTX *ctx); +void *SSL_CTX_get_default_passwd_cb_userdata(SSL_CTX *ctx); +void SSL_set_default_passwd_cb(SSL *s, pem_password_cb *cb); +void SSL_set_default_passwd_cb_userdata(SSL *s, void *u); +pem_password_cb *SSL_get_default_passwd_cb(SSL *s); +void *SSL_get_default_passwd_cb_userdata(SSL *s); + +__owur int SSL_CTX_check_private_key(const SSL_CTX *ctx); +__owur int SSL_check_private_key(const SSL *ctx); + +__owur 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_up_ref(SSL *s); +int SSL_is_dtls(const SSL *s); +__owur int SSL_set_session_id_context(SSL *ssl, const unsigned char *sid_ctx, + unsigned int sid_ctx_len); + +__owur int SSL_CTX_set_purpose(SSL_CTX *ctx, int purpose); +__owur int SSL_set_purpose(SSL *ssl, int purpose); +__owur int SSL_CTX_set_trust(SSL_CTX *ctx, int trust); +__owur int SSL_set_trust(SSL *ssl, int trust); + +__owur int SSL_set1_host(SSL *s, const char *hostname); +__owur int SSL_add1_host(SSL *s, const char *hostname); +__owur const char *SSL_get0_peername(SSL *s); +void SSL_set_hostflags(SSL *s, unsigned int flags); + +__owur int SSL_CTX_dane_enable(SSL_CTX *ctx); +__owur int SSL_CTX_dane_mtype_set(SSL_CTX *ctx, const EVP_MD *md, + uint8_t mtype, uint8_t ord); +__owur int SSL_dane_enable(SSL *s, const char *basedomain); +__owur int SSL_dane_tlsa_add(SSL *s, uint8_t usage, uint8_t selector, + uint8_t mtype, unsigned const char *data, size_t dlen); +__owur int SSL_get0_dane_authority(SSL *s, X509 **mcert, EVP_PKEY **mspki); +__owur int SSL_get0_dane_tlsa(SSL *s, uint8_t *usage, uint8_t *selector, + uint8_t *mtype, unsigned const char **data, + size_t *dlen); +/* + * Bridge opacity barrier between libcrypt and libssl, also needed to support + * offline testing in test/danetest.c + */ +SSL_DANE *SSL_get0_dane(SSL *ssl); +/* + * DANE flags + */ +unsigned long SSL_CTX_dane_set_flags(SSL_CTX *ctx, unsigned long flags); +unsigned long SSL_CTX_dane_clear_flags(SSL_CTX *ctx, unsigned long flags); +unsigned long SSL_dane_set_flags(SSL *ssl, unsigned long flags); +unsigned long SSL_dane_clear_flags(SSL *ssl, unsigned long flags); + +__owur int SSL_CTX_set1_param(SSL_CTX *ctx, X509_VERIFY_PARAM *vpm); +__owur int SSL_set1_param(SSL *ssl, X509_VERIFY_PARAM *vpm); + +__owur X509_VERIFY_PARAM *SSL_CTX_get0_param(SSL_CTX *ctx); +__owur X509_VERIFY_PARAM *SSL_get0_param(SSL *ssl); + +# ifndef OPENSSL_NO_SRP +int SSL_CTX_set_srp_username(SSL_CTX *ctx, char *name); +int SSL_CTX_set_srp_password(SSL_CTX *ctx, char *password); +int SSL_CTX_set_srp_strength(SSL_CTX *ctx, int strength); +int SSL_CTX_set_srp_client_pwd_callback(SSL_CTX *ctx, + char *(*cb) (SSL *, void *)); +int SSL_CTX_set_srp_verify_param_callback(SSL_CTX *ctx, + int (*cb) (SSL *, void *)); +int SSL_CTX_set_srp_username_callback(SSL_CTX *ctx, + int (*cb) (SSL *, int *, void *)); +int SSL_CTX_set_srp_cb_arg(SSL_CTX *ctx, void *arg); + +int SSL_set_srp_server_param(SSL *s, const BIGNUM *N, const BIGNUM *g, + BIGNUM *sa, BIGNUM *v, char *info); +int SSL_set_srp_server_param_pw(SSL *s, const char *user, const char *pass, + const char *grp); + +__owur BIGNUM *SSL_get_srp_g(SSL *s); +__owur BIGNUM *SSL_get_srp_N(SSL *s); + +__owur char *SSL_get_srp_username(SSL *s); +__owur char *SSL_get_srp_userinfo(SSL *s); +# endif + +/* + * ClientHello callback and helpers. + */ + +# define SSL_CLIENT_HELLO_SUCCESS 1 +# define SSL_CLIENT_HELLO_ERROR 0 +# define SSL_CLIENT_HELLO_RETRY (-1) + +typedef int (*SSL_client_hello_cb_fn) (SSL *s, int *al, void *arg); +void SSL_CTX_set_client_hello_cb(SSL_CTX *c, SSL_client_hello_cb_fn cb, + void *arg); +int SSL_client_hello_isv2(SSL *s); +unsigned int SSL_client_hello_get0_legacy_version(SSL *s); +size_t SSL_client_hello_get0_random(SSL *s, const unsigned char **out); +size_t SSL_client_hello_get0_session_id(SSL *s, const unsigned char **out); +size_t SSL_client_hello_get0_ciphers(SSL *s, const unsigned char **out); +size_t SSL_client_hello_get0_compression_methods(SSL *s, + const unsigned char **out); +int SSL_client_hello_get1_extensions_present(SSL *s, int **out, size_t *outlen); +int SSL_client_hello_get0_ext(SSL *s, unsigned int type, + const unsigned char **out, size_t *outlen); + +void SSL_certs_clear(SSL *s); +void SSL_free(SSL *ssl); +# ifdef OSSL_ASYNC_FD +/* + * Windows application developer has to include windows.h to use these. + */ +__owur int SSL_waiting_for_async(SSL *s); +__owur int SSL_get_all_async_fds(SSL *s, OSSL_ASYNC_FD *fds, size_t *numfds); +__owur int SSL_get_changed_async_fds(SSL *s, OSSL_ASYNC_FD *addfd, + size_t *numaddfds, OSSL_ASYNC_FD *delfd, + size_t *numdelfds); +# endif +__owur int SSL_accept(SSL *ssl); +__owur int SSL_stateless(SSL *s); +__owur int SSL_connect(SSL *ssl); +__owur int SSL_read(SSL *ssl, void *buf, int num); +__owur int SSL_read_ex(SSL *ssl, void *buf, size_t num, size_t *readbytes); + +# define SSL_READ_EARLY_DATA_ERROR 0 +# define SSL_READ_EARLY_DATA_SUCCESS 1 +# define SSL_READ_EARLY_DATA_FINISH 2 + +__owur int SSL_read_early_data(SSL *s, void *buf, size_t num, + size_t *readbytes); +__owur int SSL_peek(SSL *ssl, void *buf, int num); +__owur int SSL_peek_ex(SSL *ssl, void *buf, size_t num, size_t *readbytes); +__owur int SSL_write(SSL *ssl, const void *buf, int num); +__owur int SSL_write_ex(SSL *s, const void *buf, size_t num, size_t *written); +__owur int SSL_write_early_data(SSL *s, const void *buf, size_t num, + size_t *written); +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)); + +# define SSL_EARLY_DATA_NOT_SENT 0 +# define SSL_EARLY_DATA_REJECTED 1 +# define SSL_EARLY_DATA_ACCEPTED 2 + +__owur int SSL_get_early_data_status(const SSL *s); + +__owur int SSL_get_error(const SSL *s, int ret_code); +__owur const char *SSL_get_version(const SSL *s); + +/* This sets the 'default' SSL version that SSL_new() will create */ +__owur int SSL_CTX_set_ssl_version(SSL_CTX *ctx, const SSL_METHOD *meth); + +# ifndef OPENSSL_NO_SSL3_METHOD +DEPRECATEDIN_1_1_0(__owur const SSL_METHOD *SSLv3_method(void)) /* SSLv3 */ +DEPRECATEDIN_1_1_0(__owur const SSL_METHOD *SSLv3_server_method(void)) +DEPRECATEDIN_1_1_0(__owur const SSL_METHOD *SSLv3_client_method(void)) +# endif + +#define SSLv23_method TLS_method +#define SSLv23_server_method TLS_server_method +#define SSLv23_client_method TLS_client_method + +/* Negotiate highest available SSL/TLS version */ +__owur const SSL_METHOD *TLS_method(void); +__owur const SSL_METHOD *TLS_server_method(void); +__owur const SSL_METHOD *TLS_client_method(void); + +# ifndef OPENSSL_NO_TLS1_METHOD +DEPRECATEDIN_1_1_0(__owur const SSL_METHOD *TLSv1_method(void)) /* TLSv1.0 */ +DEPRECATEDIN_1_1_0(__owur const SSL_METHOD *TLSv1_server_method(void)) +DEPRECATEDIN_1_1_0(__owur const SSL_METHOD *TLSv1_client_method(void)) +# endif + +# ifndef OPENSSL_NO_TLS1_1_METHOD +DEPRECATEDIN_1_1_0(__owur const SSL_METHOD *TLSv1_1_method(void)) /* TLSv1.1 */ +DEPRECATEDIN_1_1_0(__owur const SSL_METHOD *TLSv1_1_server_method(void)) +DEPRECATEDIN_1_1_0(__owur const SSL_METHOD *TLSv1_1_client_method(void)) +# endif + +# ifndef OPENSSL_NO_TLS1_2_METHOD +DEPRECATEDIN_1_1_0(__owur const SSL_METHOD *TLSv1_2_method(void)) /* TLSv1.2 */ +DEPRECATEDIN_1_1_0(__owur const SSL_METHOD *TLSv1_2_server_method(void)) +DEPRECATEDIN_1_1_0(__owur const SSL_METHOD *TLSv1_2_client_method(void)) +# endif + +# ifndef OPENSSL_NO_DTLS1_METHOD +DEPRECATEDIN_1_1_0(__owur const SSL_METHOD *DTLSv1_method(void)) /* DTLSv1.0 */ +DEPRECATEDIN_1_1_0(__owur const SSL_METHOD *DTLSv1_server_method(void)) +DEPRECATEDIN_1_1_0(__owur const SSL_METHOD *DTLSv1_client_method(void)) +# endif + +# ifndef OPENSSL_NO_DTLS1_2_METHOD +/* DTLSv1.2 */ +DEPRECATEDIN_1_1_0(__owur const SSL_METHOD *DTLSv1_2_method(void)) +DEPRECATEDIN_1_1_0(__owur const SSL_METHOD *DTLSv1_2_server_method(void)) +DEPRECATEDIN_1_1_0(__owur const SSL_METHOD *DTLSv1_2_client_method(void)) +# endif + +__owur const SSL_METHOD *DTLS_method(void); /* DTLS 1.0 and 1.2 */ +__owur const SSL_METHOD *DTLS_server_method(void); /* DTLS 1.0 and 1.2 */ +__owur const SSL_METHOD *DTLS_client_method(void); /* DTLS 1.0 and 1.2 */ + +__owur size_t DTLS_get_data_mtu(const SSL *s); + +__owur STACK_OF(SSL_CIPHER) *SSL_get_ciphers(const SSL *s); +__owur STACK_OF(SSL_CIPHER) *SSL_CTX_get_ciphers(const SSL_CTX *ctx); +__owur STACK_OF(SSL_CIPHER) *SSL_get_client_ciphers(const SSL *s); +__owur STACK_OF(SSL_CIPHER) *SSL_get1_supported_ciphers(SSL *s); + +__owur int SSL_do_handshake(SSL *s); +int SSL_key_update(SSL *s, int updatetype); +int SSL_get_key_update_type(const SSL *s); +int SSL_renegotiate(SSL *s); +int SSL_renegotiate_abbreviated(SSL *s); +__owur int SSL_renegotiate_pending(const SSL *s); +int SSL_shutdown(SSL *s); +__owur int SSL_verify_client_post_handshake(SSL *s); +void SSL_CTX_set_post_handshake_auth(SSL_CTX *ctx, int val); +void SSL_set_post_handshake_auth(SSL *s, int val); + +__owur const SSL_METHOD *SSL_CTX_get_ssl_method(const SSL_CTX *ctx); +__owur const SSL_METHOD *SSL_get_ssl_method(const SSL *s); +__owur int SSL_set_ssl_method(SSL *s, const SSL_METHOD *method); +__owur const char *SSL_alert_type_string_long(int value); +__owur const char *SSL_alert_type_string(int value); +__owur const char *SSL_alert_desc_string_long(int value); +__owur const char *SSL_alert_desc_string(int value); + +void SSL_set0_CA_list(SSL *s, STACK_OF(X509_NAME) *name_list); +void SSL_CTX_set0_CA_list(SSL_CTX *ctx, STACK_OF(X509_NAME) *name_list); +__owur const STACK_OF(X509_NAME) *SSL_get0_CA_list(const SSL *s); +__owur const STACK_OF(X509_NAME) *SSL_CTX_get0_CA_list(const SSL_CTX *ctx); +__owur int SSL_add1_to_CA_list(SSL *ssl, const X509 *x); +__owur int SSL_CTX_add1_to_CA_list(SSL_CTX *ctx, const X509 *x); +__owur const STACK_OF(X509_NAME) *SSL_get0_peer_CA_list(const SSL *s); + +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); +__owur STACK_OF(X509_NAME) *SSL_get_client_CA_list(const SSL *s); +__owur STACK_OF(X509_NAME) *SSL_CTX_get_client_CA_list(const SSL_CTX *s); +__owur int SSL_add_client_CA(SSL *ssl, X509 *x); +__owur 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); + +__owur long SSL_get_default_timeout(const SSL *s); + +# if OPENSSL_API_COMPAT < 0x10100000L +# define SSL_library_init() OPENSSL_init_ssl(0, NULL) +# endif + +__owur char *SSL_CIPHER_description(const SSL_CIPHER *, char *buf, int size); +__owur STACK_OF(X509_NAME) *SSL_dup_CA_list(const STACK_OF(X509_NAME) *sk); + +__owur SSL *SSL_dup(SSL *ssl); + +__owur X509 *SSL_get_certificate(const SSL *ssl); +/* + * EVP_PKEY + */ +struct evp_pkey_st *SSL_get_privatekey(const SSL *ssl); + +__owur X509 *SSL_CTX_get0_certificate(const SSL_CTX *ctx); +__owur EVP_PKEY *SSL_CTX_get0_privatekey(const SSL_CTX *ctx); + +void SSL_CTX_set_quiet_shutdown(SSL_CTX *ctx, int mode); +__owur int SSL_CTX_get_quiet_shutdown(const SSL_CTX *ctx); +void SSL_set_quiet_shutdown(SSL *ssl, int mode); +__owur int SSL_get_quiet_shutdown(const SSL *ssl); +void SSL_set_shutdown(SSL *ssl, int mode); +__owur int SSL_get_shutdown(const SSL *ssl); +__owur int SSL_version(const SSL *ssl); +__owur int SSL_client_version(const SSL *s); +__owur int SSL_CTX_set_default_verify_paths(SSL_CTX *ctx); +__owur int SSL_CTX_set_default_verify_dir(SSL_CTX *ctx); +__owur int SSL_CTX_set_default_verify_file(SSL_CTX *ctx); +__owur 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 */ +__owur SSL_SESSION *SSL_get_session(const SSL *ssl); +__owur SSL_SESSION *SSL_get1_session(SSL *ssl); /* obtain a reference count */ +__owur 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); +__owur OSSL_HANDSHAKE_STATE SSL_get_state(const SSL *ssl); + +void SSL_set_verify_result(SSL *ssl, long v); +__owur long SSL_get_verify_result(const SSL *ssl); +__owur STACK_OF(X509) *SSL_get0_verified_chain(const SSL *s); + +__owur size_t SSL_get_client_random(const SSL *ssl, unsigned char *out, + size_t outlen); +__owur size_t SSL_get_server_random(const SSL *ssl, unsigned char *out, + size_t outlen); +__owur size_t SSL_SESSION_get_master_key(const SSL_SESSION *sess, + unsigned char *out, size_t outlen); +__owur int SSL_SESSION_set1_master_key(SSL_SESSION *sess, + const unsigned char *in, size_t len); +uint8_t SSL_SESSION_get_max_fragment_length(const SSL_SESSION *sess); + +#define SSL_get_ex_new_index(l, p, newf, dupf, freef) \ + CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_SSL, l, p, newf, dupf, freef) +__owur int SSL_set_ex_data(SSL *ssl, int idx, void *data); +void *SSL_get_ex_data(const SSL *ssl, int idx); +#define SSL_SESSION_get_ex_new_index(l, p, newf, dupf, freef) \ + CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_SSL_SESSION, l, p, newf, dupf, freef) +__owur 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); +#define SSL_CTX_get_ex_new_index(l, p, newf, dupf, freef) \ + CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_SSL_CTX, l, p, newf, dupf, freef) +__owur 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); + +__owur 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) +# define SSL_CTX_set_split_send_fragment(ctx,m) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_SPLIT_SEND_FRAGMENT,m,NULL) +# define SSL_set_split_send_fragment(ssl,m) \ + SSL_ctrl(ssl,SSL_CTRL_SET_SPLIT_SEND_FRAGMENT,m,NULL) +# define SSL_CTX_set_max_pipelines(ctx,m) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_MAX_PIPELINES,m,NULL) +# define SSL_set_max_pipelines(ssl,m) \ + SSL_ctrl(ssl,SSL_CTRL_SET_MAX_PIPELINES,m,NULL) + +void SSL_CTX_set_default_read_buffer_len(SSL_CTX *ctx, size_t len); +void SSL_set_default_read_buffer_len(SSL *s, size_t len); + +# ifndef OPENSSL_NO_DH +/* NB: the |keylength| is only applicable when is_export is true */ +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 + +__owur const COMP_METHOD *SSL_get_current_compression(const SSL *s); +__owur const COMP_METHOD *SSL_get_current_expansion(const SSL *s); +__owur const char *SSL_COMP_get_name(const COMP_METHOD *comp); +__owur const char *SSL_COMP_get0_name(const SSL_COMP *comp); +__owur int SSL_COMP_get_id(const SSL_COMP *comp); +STACK_OF(SSL_COMP) *SSL_COMP_get_compression_methods(void); +__owur STACK_OF(SSL_COMP) *SSL_COMP_set0_compression_methods(STACK_OF(SSL_COMP) + *meths); +# if OPENSSL_API_COMPAT < 0x10100000L +# define SSL_COMP_free_compression_methods() while(0) continue +# endif +__owur int SSL_COMP_add_compression_method(int id, COMP_METHOD *cm); + +const SSL_CIPHER *SSL_CIPHER_find(SSL *ssl, const unsigned char *ptr); +int SSL_CIPHER_get_cipher_nid(const SSL_CIPHER *c); +int SSL_CIPHER_get_digest_nid(const SSL_CIPHER *c); +int SSL_bytes_to_cipher_list(SSL *s, const unsigned char *bytes, size_t len, + int isv2format, STACK_OF(SSL_CIPHER) **sk, + STACK_OF(SSL_CIPHER) **scsvs); + +/* TLS extensions functions */ +__owur int SSL_set_session_ticket_ext(SSL *s, void *ext_data, int ext_len); + +__owur int SSL_set_session_ticket_ext_cb(SSL *s, + tls_session_ticket_ext_cb_fn cb, + void *arg); + +/* Pre-shared secret session resumption functions */ +__owur int SSL_set_session_secret_cb(SSL *s, + tls_session_secret_cb_fn session_secret_cb, + void *arg); + +void SSL_CTX_set_not_resumable_session_callback(SSL_CTX *ctx, + int (*cb) (SSL *ssl, + int + is_forward_secure)); + +void SSL_set_not_resumable_session_callback(SSL *ssl, + int (*cb) (SSL *ssl, + int is_forward_secure)); + +void SSL_CTX_set_record_padding_callback(SSL_CTX *ctx, + size_t (*cb) (SSL *ssl, int type, + size_t len, void *arg)); +void SSL_CTX_set_record_padding_callback_arg(SSL_CTX *ctx, void *arg); +void *SSL_CTX_get_record_padding_callback_arg(const SSL_CTX *ctx); +int SSL_CTX_set_block_padding(SSL_CTX *ctx, size_t block_size); + +void SSL_set_record_padding_callback(SSL *ssl, + size_t (*cb) (SSL *ssl, int type, + size_t len, void *arg)); +void SSL_set_record_padding_callback_arg(SSL *ssl, void *arg); +void *SSL_get_record_padding_callback_arg(const SSL *ssl); +int SSL_set_block_padding(SSL *ssl, size_t block_size); + +int SSL_set_num_tickets(SSL *s, size_t num_tickets); +size_t SSL_get_num_tickets(const SSL *s); +int SSL_CTX_set_num_tickets(SSL_CTX *ctx, size_t num_tickets); +size_t SSL_CTX_get_num_tickets(const SSL_CTX *ctx); + +# if OPENSSL_API_COMPAT < 0x10100000L +# define SSL_cache_hit(s) SSL_session_reused(s) +# endif + +__owur int SSL_session_reused(const SSL *s); +__owur int SSL_is_server(const SSL *s); + +__owur __owur SSL_CONF_CTX *SSL_CONF_CTX_new(void); +int SSL_CONF_CTX_finish(SSL_CONF_CTX *cctx); +void SSL_CONF_CTX_free(SSL_CONF_CTX *cctx); +unsigned int SSL_CONF_CTX_set_flags(SSL_CONF_CTX *cctx, unsigned int flags); +__owur unsigned int SSL_CONF_CTX_clear_flags(SSL_CONF_CTX *cctx, + unsigned int flags); +__owur int SSL_CONF_CTX_set1_prefix(SSL_CONF_CTX *cctx, const char *pre); + +void SSL_CONF_CTX_set_ssl(SSL_CONF_CTX *cctx, SSL *ssl); +void SSL_CONF_CTX_set_ssl_ctx(SSL_CONF_CTX *cctx, SSL_CTX *ctx); + +__owur int SSL_CONF_cmd(SSL_CONF_CTX *cctx, const char *cmd, const char *value); +__owur int SSL_CONF_cmd_argv(SSL_CONF_CTX *cctx, int *pargc, char ***pargv); +__owur int SSL_CONF_cmd_value_type(SSL_CONF_CTX *cctx, const char *cmd); + +void SSL_add_ssl_module(void); +int SSL_config(SSL *s, const char *name); +int SSL_CTX_config(SSL_CTX *ctx, const char *name); + +# ifndef OPENSSL_NO_SSL_TRACE +void SSL_trace(int write_p, int version, int content_type, + const void *buf, size_t len, SSL *ssl, void *arg); +# endif + +# ifndef OPENSSL_NO_SOCK +int DTLSv1_listen(SSL *s, BIO_ADDR *client); +# endif + +# ifndef OPENSSL_NO_CT + +/* + * A callback for verifying that the received SCTs are sufficient. + * Expected to return 1 if they are sufficient, otherwise 0. + * May return a negative integer if an error occurs. + * A connection should be aborted if the SCTs are deemed insufficient. + */ +typedef int (*ssl_ct_validation_cb)(const CT_POLICY_EVAL_CTX *ctx, + const STACK_OF(SCT) *scts, void *arg); + +/* + * Sets a |callback| that is invoked upon receipt of ServerHelloDone to validate + * the received SCTs. + * If the callback returns a non-positive result, the connection is terminated. + * Call this function before beginning a handshake. + * If a NULL |callback| is provided, SCT validation is disabled. + * |arg| is arbitrary userdata that will be passed to the callback whenever it + * is invoked. Ownership of |arg| remains with the caller. + * + * NOTE: A side-effect of setting a CT callback is that an OCSP stapled response + * will be requested. + */ +int SSL_set_ct_validation_callback(SSL *s, ssl_ct_validation_cb callback, + void *arg); +int SSL_CTX_set_ct_validation_callback(SSL_CTX *ctx, + ssl_ct_validation_cb callback, + void *arg); +#define SSL_disable_ct(s) \ + ((void) SSL_set_validation_callback((s), NULL, NULL)) +#define SSL_CTX_disable_ct(ctx) \ + ((void) SSL_CTX_set_validation_callback((ctx), NULL, NULL)) + +/* + * The validation type enumerates the available behaviours of the built-in SSL + * CT validation callback selected via SSL_enable_ct() and SSL_CTX_enable_ct(). + * The underlying callback is a static function in libssl. + */ +enum { + SSL_CT_VALIDATION_PERMISSIVE = 0, + SSL_CT_VALIDATION_STRICT +}; + +/* + * Enable CT by setting up a callback that implements one of the built-in + * validation variants. The SSL_CT_VALIDATION_PERMISSIVE variant always + * continues the handshake, the application can make appropriate decisions at + * handshake completion. The SSL_CT_VALIDATION_STRICT variant requires at + * least one valid SCT, or else handshake termination will be requested. The + * handshake may continue anyway if SSL_VERIFY_NONE is in effect. + */ +int SSL_enable_ct(SSL *s, int validation_mode); +int SSL_CTX_enable_ct(SSL_CTX *ctx, int validation_mode); + +/* + * Report whether a non-NULL callback is enabled. + */ +int SSL_ct_is_enabled(const SSL *s); +int SSL_CTX_ct_is_enabled(const SSL_CTX *ctx); + +/* Gets the SCTs received from a connection */ +const STACK_OF(SCT) *SSL_get0_peer_scts(SSL *s); + +/* + * Loads the CT log list from the default location. + * If a CTLOG_STORE has previously been set using SSL_CTX_set_ctlog_store, + * the log information loaded from this file will be appended to the + * CTLOG_STORE. + * Returns 1 on success, 0 otherwise. + */ +int SSL_CTX_set_default_ctlog_list_file(SSL_CTX *ctx); + +/* + * Loads the CT log list from the specified file path. + * If a CTLOG_STORE has previously been set using SSL_CTX_set_ctlog_store, + * the log information loaded from this file will be appended to the + * CTLOG_STORE. + * Returns 1 on success, 0 otherwise. + */ +int SSL_CTX_set_ctlog_list_file(SSL_CTX *ctx, const char *path); + +/* + * Sets the CT log list used by all SSL connections created from this SSL_CTX. + * Ownership of the CTLOG_STORE is transferred to the SSL_CTX. + */ +void SSL_CTX_set0_ctlog_store(SSL_CTX *ctx, CTLOG_STORE *logs); + +/* + * Gets the CT log list used by all SSL connections created from this SSL_CTX. + * This will be NULL unless one of the following functions has been called: + * - SSL_CTX_set_default_ctlog_list_file + * - SSL_CTX_set_ctlog_list_file + * - SSL_CTX_set_ctlog_store + */ +const CTLOG_STORE *SSL_CTX_get0_ctlog_store(const SSL_CTX *ctx); + +# endif /* OPENSSL_NO_CT */ + +/* What the "other" parameter contains in security callback */ +/* Mask for type */ +# define SSL_SECOP_OTHER_TYPE 0xffff0000 +# define SSL_SECOP_OTHER_NONE 0 +# define SSL_SECOP_OTHER_CIPHER (1 << 16) +# define SSL_SECOP_OTHER_CURVE (2 << 16) +# define SSL_SECOP_OTHER_DH (3 << 16) +# define SSL_SECOP_OTHER_PKEY (4 << 16) +# define SSL_SECOP_OTHER_SIGALG (5 << 16) +# define SSL_SECOP_OTHER_CERT (6 << 16) + +/* Indicated operation refers to peer key or certificate */ +# define SSL_SECOP_PEER 0x1000 + +/* Values for "op" parameter in security callback */ + +/* Called to filter ciphers */ +/* Ciphers client supports */ +# define SSL_SECOP_CIPHER_SUPPORTED (1 | SSL_SECOP_OTHER_CIPHER) +/* Cipher shared by client/server */ +# define SSL_SECOP_CIPHER_SHARED (2 | SSL_SECOP_OTHER_CIPHER) +/* Sanity check of cipher server selects */ +# define SSL_SECOP_CIPHER_CHECK (3 | SSL_SECOP_OTHER_CIPHER) +/* Curves supported by client */ +# define SSL_SECOP_CURVE_SUPPORTED (4 | SSL_SECOP_OTHER_CURVE) +/* Curves shared by client/server */ +# define SSL_SECOP_CURVE_SHARED (5 | SSL_SECOP_OTHER_CURVE) +/* Sanity check of curve server selects */ +# define SSL_SECOP_CURVE_CHECK (6 | SSL_SECOP_OTHER_CURVE) +/* Temporary DH key */ +# define SSL_SECOP_TMP_DH (7 | SSL_SECOP_OTHER_PKEY) +/* SSL/TLS version */ +# define SSL_SECOP_VERSION (9 | SSL_SECOP_OTHER_NONE) +/* Session tickets */ +# define SSL_SECOP_TICKET (10 | SSL_SECOP_OTHER_NONE) +/* Supported signature algorithms sent to peer */ +# define SSL_SECOP_SIGALG_SUPPORTED (11 | SSL_SECOP_OTHER_SIGALG) +/* Shared signature algorithm */ +# define SSL_SECOP_SIGALG_SHARED (12 | SSL_SECOP_OTHER_SIGALG) +/* Sanity check signature algorithm allowed */ +# define SSL_SECOP_SIGALG_CHECK (13 | SSL_SECOP_OTHER_SIGALG) +/* Used to get mask of supported public key signature algorithms */ +# define SSL_SECOP_SIGALG_MASK (14 | SSL_SECOP_OTHER_SIGALG) +/* Use to see if compression is allowed */ +# define SSL_SECOP_COMPRESSION (15 | SSL_SECOP_OTHER_NONE) +/* EE key in certificate */ +# define SSL_SECOP_EE_KEY (16 | SSL_SECOP_OTHER_CERT) +/* CA key in certificate */ +# define SSL_SECOP_CA_KEY (17 | SSL_SECOP_OTHER_CERT) +/* CA digest algorithm in certificate */ +# define SSL_SECOP_CA_MD (18 | SSL_SECOP_OTHER_CERT) +/* Peer EE key in certificate */ +# define SSL_SECOP_PEER_EE_KEY (SSL_SECOP_EE_KEY | SSL_SECOP_PEER) +/* Peer CA key in certificate */ +# define SSL_SECOP_PEER_CA_KEY (SSL_SECOP_CA_KEY | SSL_SECOP_PEER) +/* Peer CA digest algorithm in certificate */ +# define SSL_SECOP_PEER_CA_MD (SSL_SECOP_CA_MD | SSL_SECOP_PEER) + +void SSL_set_security_level(SSL *s, int level); +__owur int SSL_get_security_level(const SSL *s); +void SSL_set_security_callback(SSL *s, + int (*cb) (const SSL *s, const SSL_CTX *ctx, + int op, int bits, int nid, + void *other, void *ex)); +int (*SSL_get_security_callback(const SSL *s)) (const SSL *s, + const SSL_CTX *ctx, int op, + int bits, int nid, void *other, + void *ex); +void SSL_set0_security_ex_data(SSL *s, void *ex); +__owur void *SSL_get0_security_ex_data(const SSL *s); + +void SSL_CTX_set_security_level(SSL_CTX *ctx, int level); +__owur int SSL_CTX_get_security_level(const SSL_CTX *ctx); +void SSL_CTX_set_security_callback(SSL_CTX *ctx, + int (*cb) (const SSL *s, const SSL_CTX *ctx, + int op, int bits, int nid, + void *other, void *ex)); +int (*SSL_CTX_get_security_callback(const SSL_CTX *ctx)) (const SSL *s, + const SSL_CTX *ctx, + int op, int bits, + int nid, + void *other, + void *ex); +void SSL_CTX_set0_security_ex_data(SSL_CTX *ctx, void *ex); +__owur void *SSL_CTX_get0_security_ex_data(const SSL_CTX *ctx); + +/* OPENSSL_INIT flag 0x010000 reserved for internal use */ +# define OPENSSL_INIT_NO_LOAD_SSL_STRINGS 0x00100000L +# define OPENSSL_INIT_LOAD_SSL_STRINGS 0x00200000L + +# define OPENSSL_INIT_SSL_DEFAULT \ + (OPENSSL_INIT_LOAD_SSL_STRINGS | OPENSSL_INIT_LOAD_CRYPTO_STRINGS) + +int OPENSSL_init_ssl(uint64_t opts, const OPENSSL_INIT_SETTINGS *settings); + +# ifndef OPENSSL_NO_UNIT_TEST +__owur const struct openssl_ssl_test_functions *SSL_test_functions(void); +# endif + +__owur int SSL_free_buffers(SSL *ssl); +__owur int SSL_alloc_buffers(SSL *ssl); + +/* Status codes passed to the decrypt session ticket callback. Some of these + * are for internal use only and are never passed to the callback. */ +typedef int SSL_TICKET_STATUS; + +/* Support for ticket appdata */ +/* fatal error, malloc failure */ +# define SSL_TICKET_FATAL_ERR_MALLOC 0 +/* fatal error, either from parsing or decrypting the ticket */ +# define SSL_TICKET_FATAL_ERR_OTHER 1 +/* No ticket present */ +# define SSL_TICKET_NONE 2 +/* Empty ticket present */ +# define SSL_TICKET_EMPTY 3 +/* the ticket couldn't be decrypted */ +# define SSL_TICKET_NO_DECRYPT 4 +/* a ticket was successfully decrypted */ +# define SSL_TICKET_SUCCESS 5 +/* same as above but the ticket needs to be renewed */ +# define SSL_TICKET_SUCCESS_RENEW 6 + +/* Return codes for the decrypt session ticket callback */ +typedef int SSL_TICKET_RETURN; + +/* An error occurred */ +#define SSL_TICKET_RETURN_ABORT 0 +/* Do not use the ticket, do not send a renewed ticket to the client */ +#define SSL_TICKET_RETURN_IGNORE 1 +/* Do not use the ticket, send a renewed ticket to the client */ +#define SSL_TICKET_RETURN_IGNORE_RENEW 2 +/* Use the ticket, do not send a renewed ticket to the client */ +#define SSL_TICKET_RETURN_USE 3 +/* Use the ticket, send a renewed ticket to the client */ +#define SSL_TICKET_RETURN_USE_RENEW 4 + +typedef int (*SSL_CTX_generate_session_ticket_fn)(SSL *s, void *arg); +typedef SSL_TICKET_RETURN (*SSL_CTX_decrypt_session_ticket_fn)(SSL *s, SSL_SESSION *ss, + const unsigned char *keyname, + size_t keyname_length, + SSL_TICKET_STATUS status, + void *arg); +int SSL_CTX_set_session_ticket_cb(SSL_CTX *ctx, + SSL_CTX_generate_session_ticket_fn gen_cb, + SSL_CTX_decrypt_session_ticket_fn dec_cb, + void *arg); +int SSL_SESSION_set1_ticket_appdata(SSL_SESSION *ss, const void *data, size_t len); +int SSL_SESSION_get0_ticket_appdata(SSL_SESSION *ss, void **data, size_t *len); + +extern const char SSL_version_str[]; + +typedef unsigned int (*DTLS_timer_cb)(SSL *s, unsigned int timer_us); + +void DTLS_set_timer_cb(SSL *s, DTLS_timer_cb cb); + + +typedef int (*SSL_allow_early_data_cb_fn)(SSL *s, void *arg); +void SSL_CTX_set_allow_early_data_cb(SSL_CTX *ctx, + SSL_allow_early_data_cb_fn cb, + void *arg); +void SSL_set_allow_early_data_cb(SSL *s, + SSL_allow_early_data_cb_fn cb, + void *arg); + +# ifdef __cplusplus +} +# endif +#endif diff --git a/openssl-wasm/include/openssl/ssl2.h b/openssl-wasm/include/openssl/ssl2.h new file mode 100644 index 0000000..5321bd2 --- /dev/null +++ b/openssl-wasm/include/openssl/ssl2.h @@ -0,0 +1,24 @@ +/* + * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_SSL2_H +# define HEADER_SSL2_H + +#ifdef __cplusplus +extern "C" { +#endif + +# define SSL2_VERSION 0x0002 + +# define SSL2_MT_CLIENT_HELLO 1 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/openssl-wasm/include/openssl/ssl3.h b/openssl-wasm/include/openssl/ssl3.h new file mode 100644 index 0000000..07effba --- /dev/null +++ b/openssl-wasm/include/openssl/ssl3.h @@ -0,0 +1,342 @@ +/* + * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved. + * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_SSL3_H +# define HEADER_SSL3_H + +# include +# include +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Signalling cipher suite value from RFC 5746 + * (TLS_EMPTY_RENEGOTIATION_INFO_SCSV) + */ +# define SSL3_CK_SCSV 0x030000FF + +/* + * Signalling cipher suite value from draft-ietf-tls-downgrade-scsv-00 + * (TLS_FALLBACK_SCSV) + */ +# define SSL3_CK_FALLBACK_SCSV 0x03005600 + +# define SSL3_CK_RSA_NULL_MD5 0x03000001 +# define SSL3_CK_RSA_NULL_SHA 0x03000002 +# define SSL3_CK_RSA_RC4_40_MD5 0x03000003 +# define SSL3_CK_RSA_RC4_128_MD5 0x03000004 +# define SSL3_CK_RSA_RC4_128_SHA 0x03000005 +# define SSL3_CK_RSA_RC2_40_MD5 0x03000006 +# define SSL3_CK_RSA_IDEA_128_SHA 0x03000007 +# define SSL3_CK_RSA_DES_40_CBC_SHA 0x03000008 +# define SSL3_CK_RSA_DES_64_CBC_SHA 0x03000009 +# define SSL3_CK_RSA_DES_192_CBC3_SHA 0x0300000A + +# define SSL3_CK_DH_DSS_DES_40_CBC_SHA 0x0300000B +# define SSL3_CK_DH_DSS_DES_64_CBC_SHA 0x0300000C +# define SSL3_CK_DH_DSS_DES_192_CBC3_SHA 0x0300000D +# define SSL3_CK_DH_RSA_DES_40_CBC_SHA 0x0300000E +# define SSL3_CK_DH_RSA_DES_64_CBC_SHA 0x0300000F +# define SSL3_CK_DH_RSA_DES_192_CBC3_SHA 0x03000010 + +# define SSL3_CK_DHE_DSS_DES_40_CBC_SHA 0x03000011 +# define SSL3_CK_EDH_DSS_DES_40_CBC_SHA SSL3_CK_DHE_DSS_DES_40_CBC_SHA +# define SSL3_CK_DHE_DSS_DES_64_CBC_SHA 0x03000012 +# define SSL3_CK_EDH_DSS_DES_64_CBC_SHA SSL3_CK_DHE_DSS_DES_64_CBC_SHA +# define SSL3_CK_DHE_DSS_DES_192_CBC3_SHA 0x03000013 +# define SSL3_CK_EDH_DSS_DES_192_CBC3_SHA SSL3_CK_DHE_DSS_DES_192_CBC3_SHA +# define SSL3_CK_DHE_RSA_DES_40_CBC_SHA 0x03000014 +# define SSL3_CK_EDH_RSA_DES_40_CBC_SHA SSL3_CK_DHE_RSA_DES_40_CBC_SHA +# define SSL3_CK_DHE_RSA_DES_64_CBC_SHA 0x03000015 +# define SSL3_CK_EDH_RSA_DES_64_CBC_SHA SSL3_CK_DHE_RSA_DES_64_CBC_SHA +# define SSL3_CK_DHE_RSA_DES_192_CBC3_SHA 0x03000016 +# define SSL3_CK_EDH_RSA_DES_192_CBC3_SHA SSL3_CK_DHE_RSA_DES_192_CBC3_SHA + +# define SSL3_CK_ADH_RC4_40_MD5 0x03000017 +# define SSL3_CK_ADH_RC4_128_MD5 0x03000018 +# define SSL3_CK_ADH_DES_40_CBC_SHA 0x03000019 +# define SSL3_CK_ADH_DES_64_CBC_SHA 0x0300001A +# define SSL3_CK_ADH_DES_192_CBC_SHA 0x0300001B + +/* a bundle of RFC standard cipher names, generated from ssl3_ciphers[] */ +# define SSL3_RFC_RSA_NULL_MD5 "TLS_RSA_WITH_NULL_MD5" +# define SSL3_RFC_RSA_NULL_SHA "TLS_RSA_WITH_NULL_SHA" +# define SSL3_RFC_RSA_DES_192_CBC3_SHA "TLS_RSA_WITH_3DES_EDE_CBC_SHA" +# define SSL3_RFC_DHE_DSS_DES_192_CBC3_SHA "TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA" +# define SSL3_RFC_DHE_RSA_DES_192_CBC3_SHA "TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA" +# define SSL3_RFC_ADH_DES_192_CBC_SHA "TLS_DH_anon_WITH_3DES_EDE_CBC_SHA" +# define SSL3_RFC_RSA_IDEA_128_SHA "TLS_RSA_WITH_IDEA_CBC_SHA" +# define SSL3_RFC_RSA_RC4_128_MD5 "TLS_RSA_WITH_RC4_128_MD5" +# define SSL3_RFC_RSA_RC4_128_SHA "TLS_RSA_WITH_RC4_128_SHA" +# define SSL3_RFC_ADH_RC4_128_MD5 "TLS_DH_anon_WITH_RC4_128_MD5" + +# define SSL3_TXT_RSA_NULL_MD5 "NULL-MD5" +# define SSL3_TXT_RSA_NULL_SHA "NULL-SHA" +# define SSL3_TXT_RSA_RC4_40_MD5 "EXP-RC4-MD5" +# define SSL3_TXT_RSA_RC4_128_MD5 "RC4-MD5" +# define SSL3_TXT_RSA_RC4_128_SHA "RC4-SHA" +# define SSL3_TXT_RSA_RC2_40_MD5 "EXP-RC2-CBC-MD5" +# define SSL3_TXT_RSA_IDEA_128_SHA "IDEA-CBC-SHA" +# define SSL3_TXT_RSA_DES_40_CBC_SHA "EXP-DES-CBC-SHA" +# define SSL3_TXT_RSA_DES_64_CBC_SHA "DES-CBC-SHA" +# define SSL3_TXT_RSA_DES_192_CBC3_SHA "DES-CBC3-SHA" + +# define SSL3_TXT_DH_DSS_DES_40_CBC_SHA "EXP-DH-DSS-DES-CBC-SHA" +# define SSL3_TXT_DH_DSS_DES_64_CBC_SHA "DH-DSS-DES-CBC-SHA" +# define SSL3_TXT_DH_DSS_DES_192_CBC3_SHA "DH-DSS-DES-CBC3-SHA" +# define SSL3_TXT_DH_RSA_DES_40_CBC_SHA "EXP-DH-RSA-DES-CBC-SHA" +# define SSL3_TXT_DH_RSA_DES_64_CBC_SHA "DH-RSA-DES-CBC-SHA" +# define SSL3_TXT_DH_RSA_DES_192_CBC3_SHA "DH-RSA-DES-CBC3-SHA" + +# define SSL3_TXT_DHE_DSS_DES_40_CBC_SHA "EXP-DHE-DSS-DES-CBC-SHA" +# define SSL3_TXT_DHE_DSS_DES_64_CBC_SHA "DHE-DSS-DES-CBC-SHA" +# define SSL3_TXT_DHE_DSS_DES_192_CBC3_SHA "DHE-DSS-DES-CBC3-SHA" +# define SSL3_TXT_DHE_RSA_DES_40_CBC_SHA "EXP-DHE-RSA-DES-CBC-SHA" +# define SSL3_TXT_DHE_RSA_DES_64_CBC_SHA "DHE-RSA-DES-CBC-SHA" +# define SSL3_TXT_DHE_RSA_DES_192_CBC3_SHA "DHE-RSA-DES-CBC3-SHA" + +/* + * This next block of six "EDH" labels is for backward compatibility with + * older versions of OpenSSL. New code should use the six "DHE" labels above + * instead: + */ +# define SSL3_TXT_EDH_DSS_DES_40_CBC_SHA "EXP-EDH-DSS-DES-CBC-SHA" +# define SSL3_TXT_EDH_DSS_DES_64_CBC_SHA "EDH-DSS-DES-CBC-SHA" +# define SSL3_TXT_EDH_DSS_DES_192_CBC3_SHA "EDH-DSS-DES-CBC3-SHA" +# define SSL3_TXT_EDH_RSA_DES_40_CBC_SHA "EXP-EDH-RSA-DES-CBC-SHA" +# define SSL3_TXT_EDH_RSA_DES_64_CBC_SHA "EDH-RSA-DES-CBC-SHA" +# define SSL3_TXT_EDH_RSA_DES_192_CBC3_SHA "EDH-RSA-DES-CBC3-SHA" + +# define SSL3_TXT_ADH_RC4_40_MD5 "EXP-ADH-RC4-MD5" +# define SSL3_TXT_ADH_RC4_128_MD5 "ADH-RC4-MD5" +# define SSL3_TXT_ADH_DES_40_CBC_SHA "EXP-ADH-DES-CBC-SHA" +# define SSL3_TXT_ADH_DES_64_CBC_SHA "ADH-DES-CBC-SHA" +# define SSL3_TXT_ADH_DES_192_CBC_SHA "ADH-DES-CBC3-SHA" + +# define SSL3_SSL_SESSION_ID_LENGTH 32 +# define SSL3_MAX_SSL_SESSION_ID_LENGTH 32 + +# define SSL3_MASTER_SECRET_SIZE 48 +# define SSL3_RANDOM_SIZE 32 +# define SSL3_SESSION_ID_SIZE 32 +# define SSL3_RT_HEADER_LENGTH 5 + +# define SSL3_HM_HEADER_LENGTH 4 + +# ifndef SSL3_ALIGN_PAYLOAD + /* + * Some will argue that this increases memory footprint, but it's not + * actually true. Point is that malloc has to return at least 64-bit aligned + * pointers, meaning that allocating 5 bytes wastes 3 bytes in either case. + * Suggested pre-gaping simply moves these wasted bytes from the end of + * allocated region to its front, but makes data payload aligned, which + * improves performance:-) + */ +# define SSL3_ALIGN_PAYLOAD 8 +# else +# if (SSL3_ALIGN_PAYLOAD&(SSL3_ALIGN_PAYLOAD-1))!=0 +# error "insane SSL3_ALIGN_PAYLOAD" +# undef SSL3_ALIGN_PAYLOAD +# endif +# endif + +/* + * This is the maximum MAC (digest) size used by the SSL library. Currently + * maximum of 20 is used by SHA1, but we reserve for future extension for + * 512-bit hashes. + */ + +# define SSL3_RT_MAX_MD_SIZE 64 + +/* + * Maximum block size used in all ciphersuites. Currently 16 for AES. + */ + +# define SSL_RT_MAX_CIPHER_BLOCK_SIZE 16 + +# define SSL3_RT_MAX_EXTRA (16384) + +/* Maximum plaintext length: defined by SSL/TLS standards */ +# define SSL3_RT_MAX_PLAIN_LENGTH 16384 +/* Maximum compression overhead: defined by SSL/TLS standards */ +# define SSL3_RT_MAX_COMPRESSED_OVERHEAD 1024 + +/* + * The standards give a maximum encryption overhead of 1024 bytes. In + * practice the value is lower than this. The overhead is the maximum number + * of padding bytes (256) plus the mac size. + */ +# define SSL3_RT_MAX_ENCRYPTED_OVERHEAD (256 + SSL3_RT_MAX_MD_SIZE) +# define SSL3_RT_MAX_TLS13_ENCRYPTED_OVERHEAD 256 + +/* + * 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_TLS13_ENCRYPTED_LENGTH \ + (SSL3_RT_MAX_PLAIN_LENGTH + SSL3_RT_MAX_TLS13_ENCRYPTED_OVERHEAD) +# 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 DTLS1_RT_HEARTBEAT 24 + +/* Pseudo content types to indicate additional parameters */ +# define TLS1_RT_CRYPTO 0x1000 +# define TLS1_RT_CRYPTO_PREMASTER (TLS1_RT_CRYPTO | 0x1) +# define TLS1_RT_CRYPTO_CLIENT_RANDOM (TLS1_RT_CRYPTO | 0x2) +# define TLS1_RT_CRYPTO_SERVER_RANDOM (TLS1_RT_CRYPTO | 0x3) +# define TLS1_RT_CRYPTO_MASTER (TLS1_RT_CRYPTO | 0x4) + +# define TLS1_RT_CRYPTO_READ 0x0000 +# define TLS1_RT_CRYPTO_WRITE 0x0100 +# define TLS1_RT_CRYPTO_MAC (TLS1_RT_CRYPTO | 0x5) +# define TLS1_RT_CRYPTO_KEY (TLS1_RT_CRYPTO | 0x6) +# define TLS1_RT_CRYPTO_IV (TLS1_RT_CRYPTO | 0x7) +# define TLS1_RT_CRYPTO_FIXED_IV (TLS1_RT_CRYPTO | 0x8) + +/* Pseudo content types for SSL/TLS header info */ +# define SSL3_RT_HEADER 0x100 +# define SSL3_RT_INNER_CONTENT_TYPE 0x101 + +# 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 + + +# 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 for *either* SSLv3 and TLSv1. + */ +# define SSL3_CT_NUMBER 10 + +# if defined(TLS_CT_NUMBER) +# if TLS_CT_NUMBER != SSL3_CT_NUMBER +# error "SSL/TLS CT_NUMBER values do not match" +# endif +# endif + +/* No longer used as of OpenSSL 1.1.1 */ +# define SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS 0x0001 + +/* Removed from OpenSSL 1.1.0 */ +# define TLS1_FLAGS_TLS_PADDING_BUG 0x0 + +# define TLS1_FLAGS_SKIP_CERT_VERIFY 0x0010 + +/* Set if we encrypt then mac instead of usual mac then encrypt */ +# define TLS1_FLAGS_ENCRYPT_THEN_MAC_READ 0x0100 +# define TLS1_FLAGS_ENCRYPT_THEN_MAC TLS1_FLAGS_ENCRYPT_THEN_MAC_READ + +/* Set if extended master secret extension received from peer */ +# define TLS1_FLAGS_RECEIVED_EXTMS 0x0200 + +# define TLS1_FLAGS_ENCRYPT_THEN_MAC_WRITE 0x0400 + +# define TLS1_FLAGS_STATELESS 0x0800 + +/* Set if extended master secret extension required on renegotiation */ +# define TLS1_FLAGS_REQUIRED_EXTMS 0x1000 + +# 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_END_OF_EARLY_DATA 5 +# define SSL3_MT_ENCRYPTED_EXTENSIONS 8 +# 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_URL 21 +# define SSL3_MT_CERTIFICATE_STATUS 22 +# define SSL3_MT_SUPPLEMENTAL_DATA 23 +# define SSL3_MT_KEY_UPDATE 24 +# ifndef OPENSSL_NO_NEXTPROTONEG +# define SSL3_MT_NEXT_PROTO 67 +# endif +# define SSL3_MT_MESSAGE_HASH 254 +# define DTLS1_MT_HELLO_VERIFY_REQUEST 3 + +/* Dummy message type for handling CCS like a normal handshake message */ +# define SSL3_MT_CHANGE_CIPHER_SPEC 0x0101 + +# define SSL3_MT_CCS 1 + +/* These are used when changing over to a new cipher */ +# define SSL3_CC_READ 0x001 +# define SSL3_CC_WRITE 0x002 +# define SSL3_CC_CLIENT 0x010 +# define SSL3_CC_SERVER 0x020 +# define SSL3_CC_EARLY 0x040 +# define SSL3_CC_HANDSHAKE 0x080 +# define SSL3_CC_APPLICATION 0x100 +# 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/openssl-wasm/include/openssl/sslerr.h b/openssl-wasm/include/openssl/sslerr.h new file mode 100644 index 0000000..82983d3 --- /dev/null +++ b/openssl-wasm/include/openssl/sslerr.h @@ -0,0 +1,773 @@ +/* + * Generated by util/mkerr.pl DO NOT EDIT + * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_SSLERR_H +# define HEADER_SSLERR_H + +# ifndef HEADER_SYMHACKS_H +# include +# endif + +# ifdef __cplusplus +extern "C" +# endif +int ERR_load_SSL_strings(void); + +/* + * SSL function codes. + */ +# define SSL_F_ADD_CLIENT_KEY_SHARE_EXT 438 +# define SSL_F_ADD_KEY_SHARE 512 +# define SSL_F_BYTES_TO_CIPHER_LIST 519 +# define SSL_F_CHECK_SUITEB_CIPHER_LIST 331 +# define SSL_F_CIPHERSUITE_CB 622 +# define SSL_F_CONSTRUCT_CA_NAMES 552 +# define SSL_F_CONSTRUCT_KEY_EXCHANGE_TBS 553 +# define SSL_F_CONSTRUCT_STATEFUL_TICKET 636 +# define SSL_F_CONSTRUCT_STATELESS_TICKET 637 +# define SSL_F_CREATE_SYNTHETIC_MESSAGE_HASH 539 +# define SSL_F_CREATE_TICKET_PREQUEL 638 +# define SSL_F_CT_MOVE_SCTS 345 +# define SSL_F_CT_STRICT 349 +# define SSL_F_CUSTOM_EXT_ADD 554 +# define SSL_F_CUSTOM_EXT_PARSE 555 +# define SSL_F_D2I_SSL_SESSION 103 +# define SSL_F_DANE_CTX_ENABLE 347 +# define SSL_F_DANE_MTYPE_SET 393 +# define SSL_F_DANE_TLSA_ADD 394 +# define SSL_F_DERIVE_SECRET_KEY_AND_IV 514 +# define SSL_F_DO_DTLS1_WRITE 245 +# define SSL_F_DO_SSL3_WRITE 104 +# define SSL_F_DTLS1_BUFFER_RECORD 247 +# define SSL_F_DTLS1_CHECK_TIMEOUT_NUM 318 +# define SSL_F_DTLS1_HEARTBEAT 305 +# define SSL_F_DTLS1_HM_FRAGMENT_NEW 623 +# define SSL_F_DTLS1_PREPROCESS_FRAGMENT 288 +# define SSL_F_DTLS1_PROCESS_BUFFERED_RECORDS 424 +# define SSL_F_DTLS1_PROCESS_RECORD 257 +# define SSL_F_DTLS1_READ_BYTES 258 +# define SSL_F_DTLS1_READ_FAILED 339 +# define SSL_F_DTLS1_RETRANSMIT_MESSAGE 390 +# define SSL_F_DTLS1_WRITE_APP_DATA_BYTES 268 +# define SSL_F_DTLS1_WRITE_BYTES 545 +# define SSL_F_DTLSV1_LISTEN 350 +# define SSL_F_DTLS_CONSTRUCT_CHANGE_CIPHER_SPEC 371 +# define SSL_F_DTLS_CONSTRUCT_HELLO_VERIFY_REQUEST 385 +# define SSL_F_DTLS_GET_REASSEMBLED_MESSAGE 370 +# define SSL_F_DTLS_PROCESS_HELLO_VERIFY 386 +# define SSL_F_DTLS_RECORD_LAYER_NEW 635 +# define SSL_F_DTLS_WAIT_FOR_DRY 592 +# define SSL_F_EARLY_DATA_COUNT_OK 532 +# define SSL_F_FINAL_EARLY_DATA 556 +# define SSL_F_FINAL_EC_PT_FORMATS 485 +# define SSL_F_FINAL_EMS 486 +# define SSL_F_FINAL_KEY_SHARE 503 +# define SSL_F_FINAL_MAXFRAGMENTLEN 557 +# define SSL_F_FINAL_RENEGOTIATE 483 +# define SSL_F_FINAL_SERVER_NAME 558 +# define SSL_F_FINAL_SIG_ALGS 497 +# define SSL_F_GET_CERT_VERIFY_TBS_DATA 588 +# define SSL_F_NSS_KEYLOG_INT 500 +# define SSL_F_OPENSSL_INIT_SSL 342 +# define SSL_F_OSSL_STATEM_CLIENT13_READ_TRANSITION 436 +# define SSL_F_OSSL_STATEM_CLIENT13_WRITE_TRANSITION 598 +# define SSL_F_OSSL_STATEM_CLIENT_CONSTRUCT_MESSAGE 430 +# define SSL_F_OSSL_STATEM_CLIENT_POST_PROCESS_MESSAGE 593 +# define SSL_F_OSSL_STATEM_CLIENT_PROCESS_MESSAGE 594 +# define SSL_F_OSSL_STATEM_CLIENT_READ_TRANSITION 417 +# define SSL_F_OSSL_STATEM_CLIENT_WRITE_TRANSITION 599 +# define SSL_F_OSSL_STATEM_SERVER13_READ_TRANSITION 437 +# define SSL_F_OSSL_STATEM_SERVER13_WRITE_TRANSITION 600 +# define SSL_F_OSSL_STATEM_SERVER_CONSTRUCT_MESSAGE 431 +# define SSL_F_OSSL_STATEM_SERVER_POST_PROCESS_MESSAGE 601 +# define SSL_F_OSSL_STATEM_SERVER_POST_WORK 602 +# define SSL_F_OSSL_STATEM_SERVER_PRE_WORK 640 +# define SSL_F_OSSL_STATEM_SERVER_PROCESS_MESSAGE 603 +# define SSL_F_OSSL_STATEM_SERVER_READ_TRANSITION 418 +# define SSL_F_OSSL_STATEM_SERVER_WRITE_TRANSITION 604 +# define SSL_F_PARSE_CA_NAMES 541 +# define SSL_F_PITEM_NEW 624 +# define SSL_F_PQUEUE_NEW 625 +# define SSL_F_PROCESS_KEY_SHARE_EXT 439 +# define SSL_F_READ_STATE_MACHINE 352 +# define SSL_F_SET_CLIENT_CIPHERSUITE 540 +# define SSL_F_SRP_GENERATE_CLIENT_MASTER_SECRET 595 +# define SSL_F_SRP_GENERATE_SERVER_MASTER_SECRET 589 +# define SSL_F_SRP_VERIFY_SERVER_PARAM 596 +# define SSL_F_SSL3_CHANGE_CIPHER_STATE 129 +# define SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM 130 +# 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 608 +# define SSL_F_SSL3_FINAL_FINISH_MAC 285 +# define SSL_F_SSL3_FINISH_MAC 587 +# define SSL_F_SSL3_GENERATE_KEY_BLOCK 238 +# define SSL_F_SSL3_GENERATE_MASTER_SECRET 388 +# define SSL_F_SSL3_GET_RECORD 143 +# define SSL_F_SSL3_INIT_FINISHED_MAC 397 +# define SSL_F_SSL3_OUTPUT_CERT_CHAIN 147 +# define SSL_F_SSL3_READ_BYTES 148 +# define SSL_F_SSL3_READ_N 149 +# define SSL_F_SSL3_SETUP_KEY_BLOCK 157 +# define SSL_F_SSL3_SETUP_READ_BUFFER 156 +# define SSL_F_SSL3_SETUP_WRITE_BUFFER 291 +# define SSL_F_SSL3_WRITE_BYTES 158 +# define SSL_F_SSL3_WRITE_PENDING 159 +# define SSL_F_SSL_ADD_CERT_CHAIN 316 +# define SSL_F_SSL_ADD_CERT_TO_BUF 319 +# define SSL_F_SSL_ADD_CERT_TO_WPACKET 493 +# define SSL_F_SSL_ADD_CLIENTHELLO_RENEGOTIATE_EXT 298 +# define SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT 277 +# define SSL_F_SSL_ADD_CLIENTHELLO_USE_SRTP_EXT 307 +# define SSL_F_SSL_ADD_DIR_CERT_SUBJECTS_TO_STACK 215 +# define SSL_F_SSL_ADD_FILE_CERT_SUBJECTS_TO_STACK 216 +# define SSL_F_SSL_ADD_SERVERHELLO_RENEGOTIATE_EXT 299 +# define SSL_F_SSL_ADD_SERVERHELLO_TLSEXT 278 +# define SSL_F_SSL_ADD_SERVERHELLO_USE_SRTP_EXT 308 +# define SSL_F_SSL_BAD_METHOD 160 +# define SSL_F_SSL_BUILD_CERT_CHAIN 332 +# define SSL_F_SSL_BYTES_TO_CIPHER_LIST 161 +# define SSL_F_SSL_CACHE_CIPHERLIST 520 +# define SSL_F_SSL_CERT_ADD0_CHAIN_CERT 346 +# define SSL_F_SSL_CERT_DUP 221 +# define SSL_F_SSL_CERT_NEW 162 +# define SSL_F_SSL_CERT_SET0_CHAIN 340 +# define SSL_F_SSL_CHECK_PRIVATE_KEY 163 +# define SSL_F_SSL_CHECK_SERVERHELLO_TLSEXT 280 +# define SSL_F_SSL_CHECK_SRP_EXT_CLIENTHELLO 606 +# define SSL_F_SSL_CHECK_SRVR_ECC_CERT_AND_ALG 279 +# define SSL_F_SSL_CHOOSE_CLIENT_VERSION 607 +# define SSL_F_SSL_CIPHER_DESCRIPTION 626 +# define SSL_F_SSL_CIPHER_LIST_TO_BYTES 425 +# 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_CLIENT_HELLO_GET1_EXTENSIONS_PRESENT 627 +# define SSL_F_SSL_COMP_ADD_COMPRESSION_METHOD 165 +# define SSL_F_SSL_CONF_CMD 334 +# define SSL_F_SSL_CREATE_CIPHER_LIST 166 +# define SSL_F_SSL_CTRL 232 +# define SSL_F_SSL_CTX_CHECK_PRIVATE_KEY 168 +# define SSL_F_SSL_CTX_ENABLE_CT 398 +# define SSL_F_SSL_CTX_MAKE_PROFILES 309 +# define SSL_F_SSL_CTX_NEW 169 +# define SSL_F_SSL_CTX_SET_ALPN_PROTOS 343 +# 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_CT_VALIDATION_CALLBACK 396 +# 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_TLSEXT_MAX_FRAGMENT_LENGTH 551 +# define SSL_F_SSL_CTX_USE_CERTIFICATE 171 +# define SSL_F_SSL_CTX_USE_CERTIFICATE_ASN1 172 +# define SSL_F_SSL_CTX_USE_CERTIFICATE_FILE 173 +# define SSL_F_SSL_CTX_USE_PRIVATEKEY 174 +# define SSL_F_SSL_CTX_USE_PRIVATEKEY_ASN1 175 +# define SSL_F_SSL_CTX_USE_PRIVATEKEY_FILE 176 +# define SSL_F_SSL_CTX_USE_PSK_IDENTITY_HINT 272 +# define SSL_F_SSL_CTX_USE_RSAPRIVATEKEY 177 +# define SSL_F_SSL_CTX_USE_RSAPRIVATEKEY_ASN1 178 +# define SSL_F_SSL_CTX_USE_RSAPRIVATEKEY_FILE 179 +# define SSL_F_SSL_CTX_USE_SERVERINFO 336 +# define SSL_F_SSL_CTX_USE_SERVERINFO_EX 543 +# define SSL_F_SSL_CTX_USE_SERVERINFO_FILE 337 +# define SSL_F_SSL_DANE_DUP 403 +# define SSL_F_SSL_DANE_ENABLE 395 +# define SSL_F_SSL_DERIVE 590 +# define SSL_F_SSL_DO_CONFIG 391 +# define SSL_F_SSL_DO_HANDSHAKE 180 +# define SSL_F_SSL_DUP_CA_LIST 408 +# define SSL_F_SSL_ENABLE_CT 402 +# define SSL_F_SSL_GENERATE_PKEY_GROUP 559 +# define SSL_F_SSL_GENERATE_SESSION_ID 547 +# define SSL_F_SSL_GET_NEW_SESSION 181 +# define SSL_F_SSL_GET_PREV_SESSION 217 +# define SSL_F_SSL_GET_SERVER_CERT_INDEX 322 +# define SSL_F_SSL_GET_SIGN_PKEY 183 +# define SSL_F_SSL_HANDSHAKE_HASH 560 +# define SSL_F_SSL_INIT_WBIO_BUFFER 184 +# define SSL_F_SSL_KEY_UPDATE 515 +# define SSL_F_SSL_LOAD_CLIENT_CA_FILE 185 +# define SSL_F_SSL_LOG_MASTER_SECRET 498 +# define SSL_F_SSL_LOG_RSA_CLIENT_KEY_EXCHANGE 499 +# define SSL_F_SSL_MODULE_INIT 392 +# define SSL_F_SSL_NEW 186 +# define SSL_F_SSL_NEXT_PROTO_VALIDATE 565 +# 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_PEEK_EX 432 +# define SSL_F_SSL_PEEK_INTERNAL 522 +# define SSL_F_SSL_READ 223 +# define SSL_F_SSL_READ_EARLY_DATA 529 +# define SSL_F_SSL_READ_EX 434 +# define SSL_F_SSL_READ_INTERNAL 523 +# define SSL_F_SSL_RENEGOTIATE 516 +# define SSL_F_SSL_RENEGOTIATE_ABBREVIATED 546 +# define SSL_F_SSL_SCAN_CLIENTHELLO_TLSEXT 320 +# define SSL_F_SSL_SCAN_SERVERHELLO_TLSEXT 321 +# define SSL_F_SSL_SESSION_DUP 348 +# define SSL_F_SSL_SESSION_NEW 189 +# define SSL_F_SSL_SESSION_PRINT_FP 190 +# define SSL_F_SSL_SESSION_SET1_ID 423 +# define SSL_F_SSL_SESSION_SET1_ID_CONTEXT 312 +# define SSL_F_SSL_SET_ALPN_PROTOS 344 +# define SSL_F_SSL_SET_CERT 191 +# define SSL_F_SSL_SET_CERT_AND_KEY 621 +# define SSL_F_SSL_SET_CIPHER_LIST 271 +# define SSL_F_SSL_SET_CT_VALIDATION_CALLBACK 399 +# define SSL_F_SSL_SET_FD 192 +# define SSL_F_SSL_SET_PKEY 193 +# 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_TLSEXT_MAX_FRAGMENT_LENGTH 550 +# 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_START_ASYNC_JOB 389 +# 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_VALIDATE_CT 400 +# define SSL_F_SSL_VERIFY_CERT_CHAIN 207 +# define SSL_F_SSL_VERIFY_CLIENT_POST_HANDSHAKE 616 +# define SSL_F_SSL_WRITE 208 +# define SSL_F_SSL_WRITE_EARLY_DATA 526 +# define SSL_F_SSL_WRITE_EARLY_FINISH 527 +# define SSL_F_SSL_WRITE_EX 433 +# define SSL_F_SSL_WRITE_INTERNAL 524 +# define SSL_F_STATE_MACHINE 353 +# define SSL_F_TLS12_CHECK_PEER_SIGALG 333 +# define SSL_F_TLS12_COPY_SIGALGS 533 +# define SSL_F_TLS13_CHANGE_CIPHER_STATE 440 +# define SSL_F_TLS13_ENC 609 +# define SSL_F_TLS13_FINAL_FINISH_MAC 605 +# define SSL_F_TLS13_GENERATE_SECRET 591 +# define SSL_F_TLS13_HKDF_EXPAND 561 +# define SSL_F_TLS13_RESTORE_HANDSHAKE_DIGEST_FOR_PHA 617 +# define SSL_F_TLS13_SAVE_HANDSHAKE_DIGEST_FOR_PHA 618 +# define SSL_F_TLS13_SETUP_KEY_BLOCK 441 +# define SSL_F_TLS1_CHANGE_CIPHER_STATE 209 +# define SSL_F_TLS1_CHECK_DUPLICATE_EXTENSIONS 341 +# define SSL_F_TLS1_ENC 401 +# define SSL_F_TLS1_EXPORT_KEYING_MATERIAL 314 +# define SSL_F_TLS1_GET_CURVELIST 338 +# define SSL_F_TLS1_PRF 284 +# define SSL_F_TLS1_SAVE_U16 628 +# define SSL_F_TLS1_SETUP_KEY_BLOCK 211 +# define SSL_F_TLS1_SET_GROUPS 629 +# define SSL_F_TLS1_SET_RAW_SIGALGS 630 +# define SSL_F_TLS1_SET_SERVER_SIGALGS 335 +# define SSL_F_TLS1_SET_SHARED_SIGALGS 631 +# define SSL_F_TLS1_SET_SIGALGS 632 +# define SSL_F_TLS_CHOOSE_SIGALG 513 +# define SSL_F_TLS_CLIENT_KEY_EXCHANGE_POST_WORK 354 +# define SSL_F_TLS_COLLECT_EXTENSIONS 435 +# define SSL_F_TLS_CONSTRUCT_CERTIFICATE_AUTHORITIES 542 +# define SSL_F_TLS_CONSTRUCT_CERTIFICATE_REQUEST 372 +# define SSL_F_TLS_CONSTRUCT_CERT_STATUS 429 +# define SSL_F_TLS_CONSTRUCT_CERT_STATUS_BODY 494 +# define SSL_F_TLS_CONSTRUCT_CERT_VERIFY 496 +# define SSL_F_TLS_CONSTRUCT_CHANGE_CIPHER_SPEC 427 +# define SSL_F_TLS_CONSTRUCT_CKE_DHE 404 +# define SSL_F_TLS_CONSTRUCT_CKE_ECDHE 405 +# define SSL_F_TLS_CONSTRUCT_CKE_GOST 406 +# define SSL_F_TLS_CONSTRUCT_CKE_PSK_PREAMBLE 407 +# define SSL_F_TLS_CONSTRUCT_CKE_RSA 409 +# define SSL_F_TLS_CONSTRUCT_CKE_SRP 410 +# define SSL_F_TLS_CONSTRUCT_CLIENT_CERTIFICATE 484 +# define SSL_F_TLS_CONSTRUCT_CLIENT_HELLO 487 +# define SSL_F_TLS_CONSTRUCT_CLIENT_KEY_EXCHANGE 488 +# define SSL_F_TLS_CONSTRUCT_CLIENT_VERIFY 489 +# define SSL_F_TLS_CONSTRUCT_CTOS_ALPN 466 +# define SSL_F_TLS_CONSTRUCT_CTOS_CERTIFICATE 355 +# define SSL_F_TLS_CONSTRUCT_CTOS_COOKIE 535 +# define SSL_F_TLS_CONSTRUCT_CTOS_EARLY_DATA 530 +# define SSL_F_TLS_CONSTRUCT_CTOS_EC_PT_FORMATS 467 +# define SSL_F_TLS_CONSTRUCT_CTOS_EMS 468 +# define SSL_F_TLS_CONSTRUCT_CTOS_ETM 469 +# define SSL_F_TLS_CONSTRUCT_CTOS_HELLO 356 +# define SSL_F_TLS_CONSTRUCT_CTOS_KEY_EXCHANGE 357 +# define SSL_F_TLS_CONSTRUCT_CTOS_KEY_SHARE 470 +# define SSL_F_TLS_CONSTRUCT_CTOS_MAXFRAGMENTLEN 549 +# define SSL_F_TLS_CONSTRUCT_CTOS_NPN 471 +# define SSL_F_TLS_CONSTRUCT_CTOS_PADDING 472 +# define SSL_F_TLS_CONSTRUCT_CTOS_POST_HANDSHAKE_AUTH 619 +# define SSL_F_TLS_CONSTRUCT_CTOS_PSK 501 +# define SSL_F_TLS_CONSTRUCT_CTOS_PSK_KEX_MODES 509 +# define SSL_F_TLS_CONSTRUCT_CTOS_RENEGOTIATE 473 +# define SSL_F_TLS_CONSTRUCT_CTOS_SCT 474 +# define SSL_F_TLS_CONSTRUCT_CTOS_SERVER_NAME 475 +# define SSL_F_TLS_CONSTRUCT_CTOS_SESSION_TICKET 476 +# define SSL_F_TLS_CONSTRUCT_CTOS_SIG_ALGS 477 +# define SSL_F_TLS_CONSTRUCT_CTOS_SRP 478 +# define SSL_F_TLS_CONSTRUCT_CTOS_STATUS_REQUEST 479 +# define SSL_F_TLS_CONSTRUCT_CTOS_SUPPORTED_GROUPS 480 +# define SSL_F_TLS_CONSTRUCT_CTOS_SUPPORTED_VERSIONS 481 +# define SSL_F_TLS_CONSTRUCT_CTOS_USE_SRTP 482 +# define SSL_F_TLS_CONSTRUCT_CTOS_VERIFY 358 +# define SSL_F_TLS_CONSTRUCT_ENCRYPTED_EXTENSIONS 443 +# define SSL_F_TLS_CONSTRUCT_END_OF_EARLY_DATA 536 +# define SSL_F_TLS_CONSTRUCT_EXTENSIONS 447 +# define SSL_F_TLS_CONSTRUCT_FINISHED 359 +# define SSL_F_TLS_CONSTRUCT_HELLO_REQUEST 373 +# define SSL_F_TLS_CONSTRUCT_HELLO_RETRY_REQUEST 510 +# define SSL_F_TLS_CONSTRUCT_KEY_UPDATE 517 +# define SSL_F_TLS_CONSTRUCT_NEW_SESSION_TICKET 428 +# define SSL_F_TLS_CONSTRUCT_NEXT_PROTO 426 +# define SSL_F_TLS_CONSTRUCT_SERVER_CERTIFICATE 490 +# define SSL_F_TLS_CONSTRUCT_SERVER_HELLO 491 +# define SSL_F_TLS_CONSTRUCT_SERVER_KEY_EXCHANGE 492 +# define SSL_F_TLS_CONSTRUCT_STOC_ALPN 451 +# define SSL_F_TLS_CONSTRUCT_STOC_CERTIFICATE 374 +# define SSL_F_TLS_CONSTRUCT_STOC_COOKIE 613 +# define SSL_F_TLS_CONSTRUCT_STOC_CRYPTOPRO_BUG 452 +# define SSL_F_TLS_CONSTRUCT_STOC_DONE 375 +# define SSL_F_TLS_CONSTRUCT_STOC_EARLY_DATA 531 +# define SSL_F_TLS_CONSTRUCT_STOC_EARLY_DATA_INFO 525 +# define SSL_F_TLS_CONSTRUCT_STOC_EC_PT_FORMATS 453 +# define SSL_F_TLS_CONSTRUCT_STOC_EMS 454 +# define SSL_F_TLS_CONSTRUCT_STOC_ETM 455 +# define SSL_F_TLS_CONSTRUCT_STOC_HELLO 376 +# define SSL_F_TLS_CONSTRUCT_STOC_KEY_EXCHANGE 377 +# define SSL_F_TLS_CONSTRUCT_STOC_KEY_SHARE 456 +# define SSL_F_TLS_CONSTRUCT_STOC_MAXFRAGMENTLEN 548 +# define SSL_F_TLS_CONSTRUCT_STOC_NEXT_PROTO_NEG 457 +# define SSL_F_TLS_CONSTRUCT_STOC_PSK 504 +# define SSL_F_TLS_CONSTRUCT_STOC_RENEGOTIATE 458 +# define SSL_F_TLS_CONSTRUCT_STOC_SERVER_NAME 459 +# define SSL_F_TLS_CONSTRUCT_STOC_SESSION_TICKET 460 +# define SSL_F_TLS_CONSTRUCT_STOC_STATUS_REQUEST 461 +# define SSL_F_TLS_CONSTRUCT_STOC_SUPPORTED_GROUPS 544 +# define SSL_F_TLS_CONSTRUCT_STOC_SUPPORTED_VERSIONS 611 +# define SSL_F_TLS_CONSTRUCT_STOC_USE_SRTP 462 +# define SSL_F_TLS_EARLY_POST_PROCESS_CLIENT_HELLO 521 +# define SSL_F_TLS_FINISH_HANDSHAKE 597 +# define SSL_F_TLS_GET_MESSAGE_BODY 351 +# define SSL_F_TLS_GET_MESSAGE_HEADER 387 +# define SSL_F_TLS_HANDLE_ALPN 562 +# define SSL_F_TLS_HANDLE_STATUS_REQUEST 563 +# define SSL_F_TLS_PARSE_CERTIFICATE_AUTHORITIES 566 +# define SSL_F_TLS_PARSE_CLIENTHELLO_TLSEXT 449 +# define SSL_F_TLS_PARSE_CTOS_ALPN 567 +# define SSL_F_TLS_PARSE_CTOS_COOKIE 614 +# define SSL_F_TLS_PARSE_CTOS_EARLY_DATA 568 +# define SSL_F_TLS_PARSE_CTOS_EC_PT_FORMATS 569 +# define SSL_F_TLS_PARSE_CTOS_EMS 570 +# define SSL_F_TLS_PARSE_CTOS_KEY_SHARE 463 +# define SSL_F_TLS_PARSE_CTOS_MAXFRAGMENTLEN 571 +# define SSL_F_TLS_PARSE_CTOS_POST_HANDSHAKE_AUTH 620 +# define SSL_F_TLS_PARSE_CTOS_PSK 505 +# define SSL_F_TLS_PARSE_CTOS_PSK_KEX_MODES 572 +# define SSL_F_TLS_PARSE_CTOS_RENEGOTIATE 464 +# define SSL_F_TLS_PARSE_CTOS_SERVER_NAME 573 +# define SSL_F_TLS_PARSE_CTOS_SESSION_TICKET 574 +# define SSL_F_TLS_PARSE_CTOS_SIG_ALGS 575 +# define SSL_F_TLS_PARSE_CTOS_SIG_ALGS_CERT 615 +# define SSL_F_TLS_PARSE_CTOS_SRP 576 +# define SSL_F_TLS_PARSE_CTOS_STATUS_REQUEST 577 +# define SSL_F_TLS_PARSE_CTOS_SUPPORTED_GROUPS 578 +# define SSL_F_TLS_PARSE_CTOS_USE_SRTP 465 +# define SSL_F_TLS_PARSE_STOC_ALPN 579 +# define SSL_F_TLS_PARSE_STOC_COOKIE 534 +# define SSL_F_TLS_PARSE_STOC_EARLY_DATA 538 +# define SSL_F_TLS_PARSE_STOC_EARLY_DATA_INFO 528 +# define SSL_F_TLS_PARSE_STOC_EC_PT_FORMATS 580 +# define SSL_F_TLS_PARSE_STOC_KEY_SHARE 445 +# define SSL_F_TLS_PARSE_STOC_MAXFRAGMENTLEN 581 +# define SSL_F_TLS_PARSE_STOC_NPN 582 +# define SSL_F_TLS_PARSE_STOC_PSK 502 +# define SSL_F_TLS_PARSE_STOC_RENEGOTIATE 448 +# define SSL_F_TLS_PARSE_STOC_SCT 564 +# define SSL_F_TLS_PARSE_STOC_SERVER_NAME 583 +# define SSL_F_TLS_PARSE_STOC_SESSION_TICKET 584 +# define SSL_F_TLS_PARSE_STOC_STATUS_REQUEST 585 +# define SSL_F_TLS_PARSE_STOC_SUPPORTED_VERSIONS 612 +# define SSL_F_TLS_PARSE_STOC_USE_SRTP 446 +# define SSL_F_TLS_POST_PROCESS_CLIENT_HELLO 378 +# define SSL_F_TLS_POST_PROCESS_CLIENT_KEY_EXCHANGE 384 +# define SSL_F_TLS_PREPARE_CLIENT_CERTIFICATE 360 +# define SSL_F_TLS_PROCESS_AS_HELLO_RETRY_REQUEST 610 +# define SSL_F_TLS_PROCESS_CERTIFICATE_REQUEST 361 +# define SSL_F_TLS_PROCESS_CERT_STATUS 362 +# define SSL_F_TLS_PROCESS_CERT_STATUS_BODY 495 +# define SSL_F_TLS_PROCESS_CERT_VERIFY 379 +# define SSL_F_TLS_PROCESS_CHANGE_CIPHER_SPEC 363 +# define SSL_F_TLS_PROCESS_CKE_DHE 411 +# define SSL_F_TLS_PROCESS_CKE_ECDHE 412 +# define SSL_F_TLS_PROCESS_CKE_GOST 413 +# define SSL_F_TLS_PROCESS_CKE_PSK_PREAMBLE 414 +# define SSL_F_TLS_PROCESS_CKE_RSA 415 +# define SSL_F_TLS_PROCESS_CKE_SRP 416 +# define SSL_F_TLS_PROCESS_CLIENT_CERTIFICATE 380 +# define SSL_F_TLS_PROCESS_CLIENT_HELLO 381 +# define SSL_F_TLS_PROCESS_CLIENT_KEY_EXCHANGE 382 +# define SSL_F_TLS_PROCESS_ENCRYPTED_EXTENSIONS 444 +# define SSL_F_TLS_PROCESS_END_OF_EARLY_DATA 537 +# define SSL_F_TLS_PROCESS_FINISHED 364 +# define SSL_F_TLS_PROCESS_HELLO_REQ 507 +# define SSL_F_TLS_PROCESS_HELLO_RETRY_REQUEST 511 +# define SSL_F_TLS_PROCESS_INITIAL_SERVER_FLIGHT 442 +# define SSL_F_TLS_PROCESS_KEY_EXCHANGE 365 +# define SSL_F_TLS_PROCESS_KEY_UPDATE 518 +# define SSL_F_TLS_PROCESS_NEW_SESSION_TICKET 366 +# define SSL_F_TLS_PROCESS_NEXT_PROTO 383 +# define SSL_F_TLS_PROCESS_SERVER_CERTIFICATE 367 +# define SSL_F_TLS_PROCESS_SERVER_DONE 368 +# define SSL_F_TLS_PROCESS_SERVER_HELLO 369 +# define SSL_F_TLS_PROCESS_SKE_DHE 419 +# define SSL_F_TLS_PROCESS_SKE_ECDHE 420 +# define SSL_F_TLS_PROCESS_SKE_PSK_PREAMBLE 421 +# define SSL_F_TLS_PROCESS_SKE_SRP 422 +# define SSL_F_TLS_PSK_DO_BINDER 506 +# define SSL_F_TLS_SCAN_CLIENTHELLO_TLSEXT 450 +# define SSL_F_TLS_SETUP_HANDSHAKE 508 +# define SSL_F_USE_CERTIFICATE_CHAIN_FILE 220 +# define SSL_F_WPACKET_INTERN_INIT_LEN 633 +# define SSL_F_WPACKET_START_SUB_PACKET_LEN__ 634 +# define SSL_F_WRITE_STATE_MACHINE 586 + +/* + * SSL reason codes. + */ +# define SSL_R_APPLICATION_DATA_AFTER_CLOSE_NOTIFY 291 +# define SSL_R_APP_DATA_IN_HANDSHAKE 100 +# define SSL_R_ATTEMPT_TO_REUSE_SESSION_IN_DIFFERENT_CONTEXT 272 +# define SSL_R_AT_LEAST_TLS_1_0_NEEDED_IN_FIPS_MODE 143 +# define SSL_R_AT_LEAST_TLS_1_2_NEEDED_IN_SUITEB_MODE 158 +# define SSL_R_BAD_CHANGE_CIPHER_SPEC 103 +# define SSL_R_BAD_CIPHER 186 +# define SSL_R_BAD_DATA 390 +# define SSL_R_BAD_DATA_RETURNED_BY_CALLBACK 106 +# define SSL_R_BAD_DECOMPRESSION 107 +# define SSL_R_BAD_DH_VALUE 102 +# define SSL_R_BAD_DIGEST_LENGTH 111 +# define SSL_R_BAD_EARLY_DATA 233 +# define SSL_R_BAD_ECC_CERT 304 +# define SSL_R_BAD_ECPOINT 306 +# define SSL_R_BAD_EXTENSION 110 +# define SSL_R_BAD_HANDSHAKE_LENGTH 332 +# define SSL_R_BAD_HANDSHAKE_STATE 236 +# define SSL_R_BAD_HELLO_REQUEST 105 +# define SSL_R_BAD_HRR_VERSION 263 +# define SSL_R_BAD_KEY_SHARE 108 +# define SSL_R_BAD_KEY_UPDATE 122 +# define SSL_R_BAD_LEGACY_VERSION 292 +# define SSL_R_BAD_LENGTH 271 +# define SSL_R_BAD_PACKET 240 +# define SSL_R_BAD_PACKET_LENGTH 115 +# define SSL_R_BAD_PROTOCOL_VERSION_NUMBER 116 +# define SSL_R_BAD_PSK 219 +# define SSL_R_BAD_PSK_IDENTITY 114 +# define SSL_R_BAD_RECORD_TYPE 443 +# define SSL_R_BAD_RSA_ENCRYPT 119 +# define SSL_R_BAD_SIGNATURE 123 +# define SSL_R_BAD_SRP_A_LENGTH 347 +# define SSL_R_BAD_SRP_PARAMETERS 371 +# 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_VALUE 384 +# define SSL_R_BAD_WRITE_RETRY 127 +# define SSL_R_BINDER_DOES_NOT_VERIFY 253 +# 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_CALLBACK_FAILED 234 +# define SSL_R_CANNOT_CHANGE_CIPHER 109 +# define SSL_R_CA_DN_LENGTH_MISMATCH 131 +# define SSL_R_CA_KEY_TOO_SMALL 397 +# define SSL_R_CA_MD_TOO_WEAK 398 +# define SSL_R_CCS_RECEIVED_EARLY 133 +# define SSL_R_CERTIFICATE_VERIFY_FAILED 134 +# define SSL_R_CERT_CB_ERROR 377 +# define SSL_R_CERT_LENGTH_MISMATCH 135 +# define SSL_R_CIPHERSUITE_DIGEST_HAS_CHANGED 218 +# define SSL_R_CIPHER_CODE_WRONG_LENGTH 137 +# define SSL_R_CIPHER_OR_HASH_UNAVAILABLE 138 +# 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_TYPE_NOT_SET 144 +# define SSL_R_CONTEXT_NOT_DANE_ENABLED 167 +# define SSL_R_COOKIE_GEN_CALLBACK_FAILURE 400 +# define SSL_R_COOKIE_MISMATCH 308 +# define SSL_R_CUSTOM_EXT_HANDLER_ALREADY_INSTALLED 206 +# define SSL_R_DANE_ALREADY_ENABLED 172 +# define SSL_R_DANE_CANNOT_OVERRIDE_MTYPE_FULL 173 +# define SSL_R_DANE_NOT_ENABLED 175 +# define SSL_R_DANE_TLSA_BAD_CERTIFICATE 180 +# define SSL_R_DANE_TLSA_BAD_CERTIFICATE_USAGE 184 +# define SSL_R_DANE_TLSA_BAD_DATA_LENGTH 189 +# define SSL_R_DANE_TLSA_BAD_DIGEST_LENGTH 192 +# define SSL_R_DANE_TLSA_BAD_MATCHING_TYPE 200 +# define SSL_R_DANE_TLSA_BAD_PUBLIC_KEY 201 +# define SSL_R_DANE_TLSA_BAD_SELECTOR 202 +# define SSL_R_DANE_TLSA_NULL_DATA 203 +# 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_KEY_TOO_SMALL 394 +# 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_SIGNING 318 +# define SSL_R_ECDH_REQUIRED_FOR_SUITEB_MODE 374 +# define SSL_R_EE_KEY_TOO_SMALL 399 +# define SSL_R_EMPTY_SRTP_PROTECTION_PROFILE_LIST 354 +# define SSL_R_ENCRYPTED_LENGTH_TOO_LONG 150 +# define SSL_R_ERROR_IN_RECEIVED_CIPHER_LIST 151 +# define SSL_R_ERROR_SETTING_TLSA_BASE_DOMAIN 204 +# define SSL_R_EXCEEDS_MAX_FRAGMENT_SIZE 194 +# define SSL_R_EXCESSIVE_MESSAGE_SIZE 152 +# define SSL_R_EXTENSION_NOT_RECEIVED 279 +# define SSL_R_EXTRA_DATA_IN_MESSAGE 153 +# define SSL_R_EXT_LENGTH_MISMATCH 163 +# define SSL_R_FAILED_TO_INIT_ASYNC 405 +# define SSL_R_FRAGMENTED_CLIENT_HELLO 401 +# define SSL_R_GOT_A_FIN_BEFORE_A_CCS 154 +# define SSL_R_HTTPS_PROXY_REQUEST 155 +# define SSL_R_HTTP_REQUEST 156 +# define SSL_R_ILLEGAL_POINT_COMPRESSION 162 +# define SSL_R_ILLEGAL_SUITEB_DIGEST 380 +# define SSL_R_INAPPROPRIATE_FALLBACK 373 +# define SSL_R_INCONSISTENT_COMPRESSION 340 +# define SSL_R_INCONSISTENT_EARLY_DATA_ALPN 222 +# define SSL_R_INCONSISTENT_EARLY_DATA_SNI 231 +# define SSL_R_INCONSISTENT_EXTMS 104 +# define SSL_R_INSUFFICIENT_SECURITY 241 +# define SSL_R_INVALID_ALERT 205 +# define SSL_R_INVALID_CCS_MESSAGE 260 +# define SSL_R_INVALID_CERTIFICATE_OR_ALG 238 +# define SSL_R_INVALID_COMMAND 280 +# define SSL_R_INVALID_COMPRESSION_ALGORITHM 341 +# define SSL_R_INVALID_CONFIG 283 +# define SSL_R_INVALID_CONFIGURATION_NAME 113 +# define SSL_R_INVALID_CONTEXT 282 +# define SSL_R_INVALID_CT_VALIDATION_TYPE 212 +# define SSL_R_INVALID_KEY_UPDATE_TYPE 120 +# define SSL_R_INVALID_MAX_EARLY_DATA 174 +# define SSL_R_INVALID_NULL_CMD_NAME 385 +# define SSL_R_INVALID_SEQUENCE_NUMBER 402 +# define SSL_R_INVALID_SERVERINFO_DATA 388 +# define SSL_R_INVALID_SESSION_ID 999 +# 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_LENGTH_MISMATCH 159 +# define SSL_R_LENGTH_TOO_LONG 404 +# define SSL_R_LENGTH_TOO_SHORT 160 +# define SSL_R_LIBRARY_BUG 274 +# define SSL_R_LIBRARY_HAS_NO_CIPHERS 161 +# define SSL_R_MISSING_DSA_SIGNING_CERT 165 +# define SSL_R_MISSING_ECDSA_SIGNING_CERT 381 +# define SSL_R_MISSING_FATAL 256 +# define SSL_R_MISSING_PARAMETERS 290 +# 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_SIGALGS_EXTENSION 112 +# define SSL_R_MISSING_SIGNING_CERT 221 +# define SSL_R_MISSING_SRP_PARAM 358 +# define SSL_R_MISSING_SUPPORTED_GROUPS_EXTENSION 209 +# define SSL_R_MISSING_TMP_DH_KEY 171 +# define SSL_R_MISSING_TMP_ECDH_KEY 311 +# define SSL_R_MIXED_HANDSHAKE_AND_NON_HANDSHAKE_DATA 293 +# define SSL_R_NOT_ON_RECORD_BOUNDARY 182 +# define SSL_R_NOT_REPLACING_CERTIFICATE 289 +# define SSL_R_NOT_SERVER 284 +# define SSL_R_NO_APPLICATION_PROTOCOL 235 +# define SSL_R_NO_CERTIFICATES_RETURNED 176 +# define SSL_R_NO_CERTIFICATE_ASSIGNED 177 +# define SSL_R_NO_CERTIFICATE_SET 179 +# define SSL_R_NO_CHANGE_FOLLOWING_HRR 214 +# define SSL_R_NO_CIPHERS_AVAILABLE 181 +# define SSL_R_NO_CIPHERS_SPECIFIED 183 +# define SSL_R_NO_CIPHER_MATCH 185 +# define SSL_R_NO_CLIENT_CERT_METHOD 331 +# define SSL_R_NO_COMPRESSION_SPECIFIED 187 +# define SSL_R_NO_COOKIE_CALLBACK_SET 287 +# define SSL_R_NO_GOST_CERTIFICATE_SENT_BY_PEER 330 +# define SSL_R_NO_METHOD_SPECIFIED 188 +# define SSL_R_NO_PEM_EXTENSIONS 389 +# define SSL_R_NO_PRIVATE_KEY_ASSIGNED 190 +# define SSL_R_NO_PROTOCOLS_AVAILABLE 191 +# define SSL_R_NO_RENEGOTIATION 339 +# define SSL_R_NO_REQUIRED_DIGEST 324 +# define SSL_R_NO_SHARED_CIPHER 193 +# define SSL_R_NO_SHARED_GROUPS 410 +# define SSL_R_NO_SHARED_SIGNATURE_ALGORITHMS 376 +# define SSL_R_NO_SRTP_PROFILES 359 +# define SSL_R_NO_SUITABLE_KEY_SHARE 101 +# define SSL_R_NO_SUITABLE_SIGNATURE_ALGORITHM 118 +# define SSL_R_NO_VALID_SCTS 216 +# define SSL_R_NO_VERIFY_COOKIE_CALLBACK 403 +# 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_OVERFLOW_ERROR 237 +# 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_PEM_NAME_BAD_PREFIX 391 +# define SSL_R_PEM_NAME_TOO_SHORT 392 +# define SSL_R_PIPELINE_FAILURE 406 +# define SSL_R_POST_HANDSHAKE_AUTH_ENCODING_ERR 278 +# define SSL_R_PRIVATE_KEY_MISMATCH 288 +# 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_READ_BIO_NOT_SET 211 +# define SSL_R_READ_TIMEOUT_EXPIRED 312 +# define SSL_R_RECORD_LENGTH_MISMATCH 213 +# 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_REQUEST_PENDING 285 +# define SSL_R_REQUEST_SENT 286 +# define SSL_R_REQUIRED_CIPHER_MISSING 215 +# define SSL_R_REQUIRED_COMPRESSION_ALGORITHM_MISSING 342 +# define SSL_R_SCSV_RECEIVED_WHEN_RENEGOTIATING 345 +# define SSL_R_SCT_VERIFICATION_FAILED 208 +# define SSL_R_SERVERHELLO_TLSEXT 275 +# define SSL_R_SESSION_ID_CONTEXT_UNINITIALIZED 277 +# define SSL_R_SHUTDOWN_WHILE_IN_INIT 407 +# 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_SSL3_EXT_INVALID_MAX_FRAGMENT_LENGTH 232 +# 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_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_COMMAND_SECTION_EMPTY 117 +# define SSL_R_SSL_COMMAND_SECTION_NOT_FOUND 125 +# 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_NEGATIVE_LENGTH 372 +# define SSL_R_SSL_SECTION_EMPTY 126 +# define SSL_R_SSL_SECTION_NOT_FOUND 136 +# 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_TOO_LONG 408 +# define SSL_R_SSL_SESSION_VERSION_MISMATCH 210 +# define SSL_R_STILL_IN_INIT 121 +# define SSL_R_TLSV13_ALERT_CERTIFICATE_REQUIRED 1116 +# define SSL_R_TLSV13_ALERT_MISSING_EXTENSION 1109 +# define SSL_R_TLSV1_ALERT_ACCESS_DENIED 1049 +# define SSL_R_TLSV1_ALERT_DECODE_ERROR 1050 +# define SSL_R_TLSV1_ALERT_DECRYPTION_FAILED 1021 +# define SSL_R_TLSV1_ALERT_DECRYPT_ERROR 1051 +# define SSL_R_TLSV1_ALERT_EXPORT_RESTRICTION 1060 +# define SSL_R_TLSV1_ALERT_INAPPROPRIATE_FALLBACK 1086 +# define SSL_R_TLSV1_ALERT_INSUFFICIENT_SECURITY 1071 +# define SSL_R_TLSV1_ALERT_INTERNAL_ERROR 1080 +# define SSL_R_TLSV1_ALERT_NO_RENEGOTIATION 1100 +# define SSL_R_TLSV1_ALERT_PROTOCOL_VERSION 1070 +# define SSL_R_TLSV1_ALERT_RECORD_OVERFLOW 1022 +# define SSL_R_TLSV1_ALERT_UNKNOWN_CA 1048 +# define SSL_R_TLSV1_ALERT_USER_CANCELLED 1090 +# define SSL_R_TLSV1_BAD_CERTIFICATE_HASH_VALUE 1114 +# define SSL_R_TLSV1_BAD_CERTIFICATE_STATUS_RESPONSE 1113 +# define SSL_R_TLSV1_CERTIFICATE_UNOBTAINABLE 1111 +# define SSL_R_TLSV1_UNRECOGNIZED_NAME 1112 +# define SSL_R_TLSV1_UNSUPPORTED_EXTENSION 1110 +# define SSL_R_TLS_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_TOO_MANY_KEY_UPDATES 132 +# define SSL_R_TOO_MANY_WARN_ALERTS 409 +# define SSL_R_TOO_MUCH_EARLY_DATA 164 +# define SSL_R_UNABLE_TO_FIND_ECDH_PARAMETERS 314 +# define SSL_R_UNABLE_TO_FIND_PUBLIC_KEY_PARAMETERS 239 +# define SSL_R_UNABLE_TO_LOAD_SSL3_MD5_ROUTINES 242 +# define SSL_R_UNABLE_TO_LOAD_SSL3_SHA1_ROUTINES 243 +# define SSL_R_UNEXPECTED_CCS_MESSAGE 262 +# define SSL_R_UNEXPECTED_END_OF_EARLY_DATA 178 +# define SSL_R_UNEXPECTED_MESSAGE 244 +# define SSL_R_UNEXPECTED_RECORD 245 +# define SSL_R_UNINITIALIZED 276 +# define SSL_R_UNKNOWN_ALERT_TYPE 246 +# define SSL_R_UNKNOWN_CERTIFICATE_TYPE 247 +# define SSL_R_UNKNOWN_CIPHER_RETURNED 248 +# define SSL_R_UNKNOWN_CIPHER_TYPE 249 +# define SSL_R_UNKNOWN_CMD_NAME 386 +# define SSL_R_UNKNOWN_COMMAND 139 +# 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_SSL_VERSION 254 +# define SSL_R_UNKNOWN_STATE 255 +# define SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED 338 +# define SSL_R_UNSOLICITED_EXTENSION 217 +# define SSL_R_UNSUPPORTED_COMPRESSION_ALGORITHM 257 +# 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_VERSION_TOO_HIGH 166 +# define SSL_R_VERSION_TOO_LOW 396 +# define SSL_R_WRONG_CERTIFICATE_TYPE 383 +# define SSL_R_WRONG_CIPHER_RETURNED 261 +# define SSL_R_WRONG_CURVE 378 +# 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 + +#endif diff --git a/openssl-wasm/include/openssl/stack.h b/openssl-wasm/include/openssl/stack.h new file mode 100644 index 0000000..cfc0750 --- /dev/null +++ b/openssl-wasm/include/openssl/stack.h @@ -0,0 +1,83 @@ +/* + * Copyright 1995-2017 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_STACK_H +# define HEADER_STACK_H + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct stack_st OPENSSL_STACK; /* Use STACK_OF(...) instead */ + +typedef int (*OPENSSL_sk_compfunc)(const void *, const void *); +typedef void (*OPENSSL_sk_freefunc)(void *); +typedef void *(*OPENSSL_sk_copyfunc)(const void *); + +int OPENSSL_sk_num(const OPENSSL_STACK *); +void *OPENSSL_sk_value(const OPENSSL_STACK *, int); + +void *OPENSSL_sk_set(OPENSSL_STACK *st, int i, const void *data); + +OPENSSL_STACK *OPENSSL_sk_new(OPENSSL_sk_compfunc cmp); +OPENSSL_STACK *OPENSSL_sk_new_null(void); +OPENSSL_STACK *OPENSSL_sk_new_reserve(OPENSSL_sk_compfunc c, int n); +int OPENSSL_sk_reserve(OPENSSL_STACK *st, int n); +void OPENSSL_sk_free(OPENSSL_STACK *); +void OPENSSL_sk_pop_free(OPENSSL_STACK *st, void (*func) (void *)); +OPENSSL_STACK *OPENSSL_sk_deep_copy(const OPENSSL_STACK *, + OPENSSL_sk_copyfunc c, + OPENSSL_sk_freefunc f); +int OPENSSL_sk_insert(OPENSSL_STACK *sk, const void *data, int where); +void *OPENSSL_sk_delete(OPENSSL_STACK *st, int loc); +void *OPENSSL_sk_delete_ptr(OPENSSL_STACK *st, const void *p); +int OPENSSL_sk_find(OPENSSL_STACK *st, const void *data); +int OPENSSL_sk_find_ex(OPENSSL_STACK *st, const void *data); +int OPENSSL_sk_push(OPENSSL_STACK *st, const void *data); +int OPENSSL_sk_unshift(OPENSSL_STACK *st, const void *data); +void *OPENSSL_sk_shift(OPENSSL_STACK *st); +void *OPENSSL_sk_pop(OPENSSL_STACK *st); +void OPENSSL_sk_zero(OPENSSL_STACK *st); +OPENSSL_sk_compfunc OPENSSL_sk_set_cmp_func(OPENSSL_STACK *sk, + OPENSSL_sk_compfunc cmp); +OPENSSL_STACK *OPENSSL_sk_dup(const OPENSSL_STACK *st); +void OPENSSL_sk_sort(OPENSSL_STACK *st); +int OPENSSL_sk_is_sorted(const OPENSSL_STACK *st); + +# if OPENSSL_API_COMPAT < 0x10100000L +# define _STACK OPENSSL_STACK +# define sk_num OPENSSL_sk_num +# define sk_value OPENSSL_sk_value +# define sk_set OPENSSL_sk_set +# define sk_new OPENSSL_sk_new +# define sk_new_null OPENSSL_sk_new_null +# define sk_free OPENSSL_sk_free +# define sk_pop_free OPENSSL_sk_pop_free +# define sk_deep_copy OPENSSL_sk_deep_copy +# define sk_insert OPENSSL_sk_insert +# define sk_delete OPENSSL_sk_delete +# define sk_delete_ptr OPENSSL_sk_delete_ptr +# define sk_find OPENSSL_sk_find +# define sk_find_ex OPENSSL_sk_find_ex +# define sk_push OPENSSL_sk_push +# define sk_unshift OPENSSL_sk_unshift +# define sk_shift OPENSSL_sk_shift +# define sk_pop OPENSSL_sk_pop +# define sk_zero OPENSSL_sk_zero +# define sk_set_cmp_func OPENSSL_sk_set_cmp_func +# define sk_dup OPENSSL_sk_dup +# define sk_sort OPENSSL_sk_sort +# define sk_is_sorted OPENSSL_sk_is_sorted +# endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/openssl-wasm/include/openssl/store.h b/openssl-wasm/include/openssl/store.h new file mode 100644 index 0000000..a40a733 --- /dev/null +++ b/openssl-wasm/include/openssl/store.h @@ -0,0 +1,266 @@ +/* + * Copyright 2016-2019 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_OSSL_STORE_H +# define HEADER_OSSL_STORE_H + +# include +# include +# include +# include + +# ifdef __cplusplus +extern "C" { +# endif + +/*- + * The main OSSL_STORE functions. + * ------------------------------ + * + * These allow applications to open a channel to a resource with supported + * data (keys, certs, crls, ...), read the data a piece at a time and decide + * what to do with it, and finally close. + */ + +typedef struct ossl_store_ctx_st OSSL_STORE_CTX; + +/* + * Typedef for the OSSL_STORE_INFO post processing callback. This can be used + * to massage the given OSSL_STORE_INFO, or to drop it entirely (by returning + * NULL). + */ +typedef OSSL_STORE_INFO *(*OSSL_STORE_post_process_info_fn)(OSSL_STORE_INFO *, + void *); + +/* + * Open a channel given a URI. The given UI method will be used any time the + * loader needs extra input, for example when a password or pin is needed, and + * will be passed the same user data every time it's needed in this context. + * + * Returns a context reference which represents the channel to communicate + * through. + */ +OSSL_STORE_CTX *OSSL_STORE_open(const char *uri, const UI_METHOD *ui_method, + void *ui_data, + OSSL_STORE_post_process_info_fn post_process, + void *post_process_data); + +/* + * Control / fine tune the OSSL_STORE channel. |cmd| determines what is to be + * done, and depends on the underlying loader (use OSSL_STORE_get0_scheme to + * determine which loader is used), except for common commands (see below). + * Each command takes different arguments. + */ +int OSSL_STORE_ctrl(OSSL_STORE_CTX *ctx, int cmd, ... /* args */); +int OSSL_STORE_vctrl(OSSL_STORE_CTX *ctx, int cmd, va_list args); + +/* + * Common ctrl commands that different loaders may choose to support. + */ +/* int on = 0 or 1; STORE_ctrl(ctx, STORE_C_USE_SECMEM, &on); */ +# define OSSL_STORE_C_USE_SECMEM 1 +/* Where custom commands start */ +# define OSSL_STORE_C_CUSTOM_START 100 + +/* + * Read one data item (a key, a cert, a CRL) that is supported by the OSSL_STORE + * functionality, given a context. + * Returns a OSSL_STORE_INFO pointer, from which OpenSSL typed data can be + * extracted with OSSL_STORE_INFO_get0_PKEY(), OSSL_STORE_INFO_get0_CERT(), ... + * NULL is returned on error, which may include that the data found at the URI + * can't be figured out for certain or is ambiguous. + */ +OSSL_STORE_INFO *OSSL_STORE_load(OSSL_STORE_CTX *ctx); + +/* + * Check if end of data (end of file) is reached + * Returns 1 on end, 0 otherwise. + */ +int OSSL_STORE_eof(OSSL_STORE_CTX *ctx); + +/* + * Check if an error occurred + * Returns 1 if it did, 0 otherwise. + */ +int OSSL_STORE_error(OSSL_STORE_CTX *ctx); + +/* + * Close the channel + * Returns 1 on success, 0 on error. + */ +int OSSL_STORE_close(OSSL_STORE_CTX *ctx); + + +/*- + * Extracting OpenSSL types from and creating new OSSL_STORE_INFOs + * --------------------------------------------------------------- + */ + +/* + * Types of data that can be ossl_stored in a OSSL_STORE_INFO. + * OSSL_STORE_INFO_NAME is typically found when getting a listing of + * available "files" / "tokens" / what have you. + */ +# define OSSL_STORE_INFO_NAME 1 /* char * */ +# define OSSL_STORE_INFO_PARAMS 2 /* EVP_PKEY * */ +# define OSSL_STORE_INFO_PKEY 3 /* EVP_PKEY * */ +# define OSSL_STORE_INFO_CERT 4 /* X509 * */ +# define OSSL_STORE_INFO_CRL 5 /* X509_CRL * */ + +/* + * Functions to generate OSSL_STORE_INFOs, one function for each type we + * support having in them, as well as a generic constructor. + * + * In all cases, ownership of the object is transferred to the OSSL_STORE_INFO + * and will therefore be freed when the OSSL_STORE_INFO is freed. + */ +OSSL_STORE_INFO *OSSL_STORE_INFO_new_NAME(char *name); +int OSSL_STORE_INFO_set0_NAME_description(OSSL_STORE_INFO *info, char *desc); +OSSL_STORE_INFO *OSSL_STORE_INFO_new_PARAMS(EVP_PKEY *params); +OSSL_STORE_INFO *OSSL_STORE_INFO_new_PKEY(EVP_PKEY *pkey); +OSSL_STORE_INFO *OSSL_STORE_INFO_new_CERT(X509 *x509); +OSSL_STORE_INFO *OSSL_STORE_INFO_new_CRL(X509_CRL *crl); + +/* + * Functions to try to extract data from a OSSL_STORE_INFO. + */ +int OSSL_STORE_INFO_get_type(const OSSL_STORE_INFO *info); +const char *OSSL_STORE_INFO_get0_NAME(const OSSL_STORE_INFO *info); +char *OSSL_STORE_INFO_get1_NAME(const OSSL_STORE_INFO *info); +const char *OSSL_STORE_INFO_get0_NAME_description(const OSSL_STORE_INFO *info); +char *OSSL_STORE_INFO_get1_NAME_description(const OSSL_STORE_INFO *info); +EVP_PKEY *OSSL_STORE_INFO_get0_PARAMS(const OSSL_STORE_INFO *info); +EVP_PKEY *OSSL_STORE_INFO_get1_PARAMS(const OSSL_STORE_INFO *info); +EVP_PKEY *OSSL_STORE_INFO_get0_PKEY(const OSSL_STORE_INFO *info); +EVP_PKEY *OSSL_STORE_INFO_get1_PKEY(const OSSL_STORE_INFO *info); +X509 *OSSL_STORE_INFO_get0_CERT(const OSSL_STORE_INFO *info); +X509 *OSSL_STORE_INFO_get1_CERT(const OSSL_STORE_INFO *info); +X509_CRL *OSSL_STORE_INFO_get0_CRL(const OSSL_STORE_INFO *info); +X509_CRL *OSSL_STORE_INFO_get1_CRL(const OSSL_STORE_INFO *info); + +const char *OSSL_STORE_INFO_type_string(int type); + +/* + * Free the OSSL_STORE_INFO + */ +void OSSL_STORE_INFO_free(OSSL_STORE_INFO *info); + + +/*- + * Functions to construct a search URI from a base URI and search criteria + * ----------------------------------------------------------------------- + */ + +/* OSSL_STORE search types */ +# define OSSL_STORE_SEARCH_BY_NAME 1 /* subject in certs, issuer in CRLs */ +# define OSSL_STORE_SEARCH_BY_ISSUER_SERIAL 2 +# define OSSL_STORE_SEARCH_BY_KEY_FINGERPRINT 3 +# define OSSL_STORE_SEARCH_BY_ALIAS 4 + +/* To check what search types the scheme handler supports */ +int OSSL_STORE_supports_search(OSSL_STORE_CTX *ctx, int search_type); + +/* Search term constructors */ +/* + * The input is considered to be owned by the caller, and must therefore + * remain present throughout the lifetime of the returned OSSL_STORE_SEARCH + */ +OSSL_STORE_SEARCH *OSSL_STORE_SEARCH_by_name(X509_NAME *name); +OSSL_STORE_SEARCH *OSSL_STORE_SEARCH_by_issuer_serial(X509_NAME *name, + const ASN1_INTEGER + *serial); +OSSL_STORE_SEARCH *OSSL_STORE_SEARCH_by_key_fingerprint(const EVP_MD *digest, + const unsigned char + *bytes, size_t len); +OSSL_STORE_SEARCH *OSSL_STORE_SEARCH_by_alias(const char *alias); + +/* Search term destructor */ +void OSSL_STORE_SEARCH_free(OSSL_STORE_SEARCH *search); + +/* Search term accessors */ +int OSSL_STORE_SEARCH_get_type(const OSSL_STORE_SEARCH *criterion); +X509_NAME *OSSL_STORE_SEARCH_get0_name(OSSL_STORE_SEARCH *criterion); +const ASN1_INTEGER *OSSL_STORE_SEARCH_get0_serial(const OSSL_STORE_SEARCH + *criterion); +const unsigned char *OSSL_STORE_SEARCH_get0_bytes(const OSSL_STORE_SEARCH + *criterion, size_t *length); +const char *OSSL_STORE_SEARCH_get0_string(const OSSL_STORE_SEARCH *criterion); +const EVP_MD *OSSL_STORE_SEARCH_get0_digest(const OSSL_STORE_SEARCH *criterion); + +/* + * Add search criterion and expected return type (which can be unspecified) + * to the loading channel. This MUST happen before the first OSSL_STORE_load(). + */ +int OSSL_STORE_expect(OSSL_STORE_CTX *ctx, int expected_type); +int OSSL_STORE_find(OSSL_STORE_CTX *ctx, OSSL_STORE_SEARCH *search); + + +/*- + * Function to register a loader for the given URI scheme. + * ------------------------------------------------------- + * + * The loader receives all the main components of an URI except for the + * scheme. + */ + +typedef struct ossl_store_loader_st OSSL_STORE_LOADER; +OSSL_STORE_LOADER *OSSL_STORE_LOADER_new(ENGINE *e, const char *scheme); +const ENGINE *OSSL_STORE_LOADER_get0_engine(const OSSL_STORE_LOADER *loader); +const char *OSSL_STORE_LOADER_get0_scheme(const OSSL_STORE_LOADER *loader); +/* struct ossl_store_loader_ctx_st is defined differently by each loader */ +typedef struct ossl_store_loader_ctx_st OSSL_STORE_LOADER_CTX; +typedef OSSL_STORE_LOADER_CTX *(*OSSL_STORE_open_fn)(const OSSL_STORE_LOADER + *loader, + const char *uri, + const UI_METHOD *ui_method, + void *ui_data); +int OSSL_STORE_LOADER_set_open(OSSL_STORE_LOADER *loader, + OSSL_STORE_open_fn open_function); +typedef int (*OSSL_STORE_ctrl_fn)(OSSL_STORE_LOADER_CTX *ctx, int cmd, + va_list args); +int OSSL_STORE_LOADER_set_ctrl(OSSL_STORE_LOADER *loader, + OSSL_STORE_ctrl_fn ctrl_function); +typedef int (*OSSL_STORE_expect_fn)(OSSL_STORE_LOADER_CTX *ctx, int expected); +int OSSL_STORE_LOADER_set_expect(OSSL_STORE_LOADER *loader, + OSSL_STORE_expect_fn expect_function); +typedef int (*OSSL_STORE_find_fn)(OSSL_STORE_LOADER_CTX *ctx, + OSSL_STORE_SEARCH *criteria); +int OSSL_STORE_LOADER_set_find(OSSL_STORE_LOADER *loader, + OSSL_STORE_find_fn find_function); +typedef OSSL_STORE_INFO *(*OSSL_STORE_load_fn)(OSSL_STORE_LOADER_CTX *ctx, + const UI_METHOD *ui_method, + void *ui_data); +int OSSL_STORE_LOADER_set_load(OSSL_STORE_LOADER *loader, + OSSL_STORE_load_fn load_function); +typedef int (*OSSL_STORE_eof_fn)(OSSL_STORE_LOADER_CTX *ctx); +int OSSL_STORE_LOADER_set_eof(OSSL_STORE_LOADER *loader, + OSSL_STORE_eof_fn eof_function); +typedef int (*OSSL_STORE_error_fn)(OSSL_STORE_LOADER_CTX *ctx); +int OSSL_STORE_LOADER_set_error(OSSL_STORE_LOADER *loader, + OSSL_STORE_error_fn error_function); +typedef int (*OSSL_STORE_close_fn)(OSSL_STORE_LOADER_CTX *ctx); +int OSSL_STORE_LOADER_set_close(OSSL_STORE_LOADER *loader, + OSSL_STORE_close_fn close_function); +void OSSL_STORE_LOADER_free(OSSL_STORE_LOADER *loader); + +int OSSL_STORE_register_loader(OSSL_STORE_LOADER *loader); +OSSL_STORE_LOADER *OSSL_STORE_unregister_loader(const char *scheme); + +/*- + * Functions to list STORE loaders + * ------------------------------- + */ +int OSSL_STORE_do_all_loaders(void (*do_function) (const OSSL_STORE_LOADER + *loader, void *do_arg), + void *do_arg); + +# ifdef __cplusplus +} +# endif +#endif diff --git a/openssl-wasm/include/openssl/storeerr.h b/openssl-wasm/include/openssl/storeerr.h new file mode 100644 index 0000000..190eab0 --- /dev/null +++ b/openssl-wasm/include/openssl/storeerr.h @@ -0,0 +1,91 @@ +/* + * Generated by util/mkerr.pl DO NOT EDIT + * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_OSSL_STOREERR_H +# define HEADER_OSSL_STOREERR_H + +# ifndef HEADER_SYMHACKS_H +# include +# endif + +# ifdef __cplusplus +extern "C" +# endif +int ERR_load_OSSL_STORE_strings(void); + +/* + * OSSL_STORE function codes. + */ +# define OSSL_STORE_F_FILE_CTRL 129 +# define OSSL_STORE_F_FILE_FIND 138 +# define OSSL_STORE_F_FILE_GET_PASS 118 +# define OSSL_STORE_F_FILE_LOAD 119 +# define OSSL_STORE_F_FILE_LOAD_TRY_DECODE 124 +# define OSSL_STORE_F_FILE_NAME_TO_URI 126 +# define OSSL_STORE_F_FILE_OPEN 120 +# define OSSL_STORE_F_OSSL_STORE_ATTACH_PEM_BIO 127 +# define OSSL_STORE_F_OSSL_STORE_EXPECT 130 +# define OSSL_STORE_F_OSSL_STORE_FILE_ATTACH_PEM_BIO_INT 128 +# define OSSL_STORE_F_OSSL_STORE_FIND 131 +# define OSSL_STORE_F_OSSL_STORE_GET0_LOADER_INT 100 +# define OSSL_STORE_F_OSSL_STORE_INFO_GET1_CERT 101 +# define OSSL_STORE_F_OSSL_STORE_INFO_GET1_CRL 102 +# define OSSL_STORE_F_OSSL_STORE_INFO_GET1_NAME 103 +# define OSSL_STORE_F_OSSL_STORE_INFO_GET1_NAME_DESCRIPTION 135 +# define OSSL_STORE_F_OSSL_STORE_INFO_GET1_PARAMS 104 +# define OSSL_STORE_F_OSSL_STORE_INFO_GET1_PKEY 105 +# define OSSL_STORE_F_OSSL_STORE_INFO_NEW_CERT 106 +# define OSSL_STORE_F_OSSL_STORE_INFO_NEW_CRL 107 +# define OSSL_STORE_F_OSSL_STORE_INFO_NEW_EMBEDDED 123 +# define OSSL_STORE_F_OSSL_STORE_INFO_NEW_NAME 109 +# define OSSL_STORE_F_OSSL_STORE_INFO_NEW_PARAMS 110 +# define OSSL_STORE_F_OSSL_STORE_INFO_NEW_PKEY 111 +# define OSSL_STORE_F_OSSL_STORE_INFO_SET0_NAME_DESCRIPTION 134 +# define OSSL_STORE_F_OSSL_STORE_INIT_ONCE 112 +# define OSSL_STORE_F_OSSL_STORE_LOADER_NEW 113 +# define OSSL_STORE_F_OSSL_STORE_OPEN 114 +# define OSSL_STORE_F_OSSL_STORE_OPEN_INT 115 +# define OSSL_STORE_F_OSSL_STORE_REGISTER_LOADER_INT 117 +# define OSSL_STORE_F_OSSL_STORE_SEARCH_BY_ALIAS 132 +# define OSSL_STORE_F_OSSL_STORE_SEARCH_BY_ISSUER_SERIAL 133 +# define OSSL_STORE_F_OSSL_STORE_SEARCH_BY_KEY_FINGERPRINT 136 +# define OSSL_STORE_F_OSSL_STORE_SEARCH_BY_NAME 137 +# define OSSL_STORE_F_OSSL_STORE_UNREGISTER_LOADER_INT 116 +# define OSSL_STORE_F_TRY_DECODE_PARAMS 121 +# define OSSL_STORE_F_TRY_DECODE_PKCS12 122 +# define OSSL_STORE_F_TRY_DECODE_PKCS8ENCRYPTED 125 + +/* + * OSSL_STORE reason codes. + */ +# define OSSL_STORE_R_AMBIGUOUS_CONTENT_TYPE 107 +# define OSSL_STORE_R_BAD_PASSWORD_READ 115 +# define OSSL_STORE_R_ERROR_VERIFYING_PKCS12_MAC 113 +# define OSSL_STORE_R_FINGERPRINT_SIZE_DOES_NOT_MATCH_DIGEST 121 +# define OSSL_STORE_R_INVALID_SCHEME 106 +# define OSSL_STORE_R_IS_NOT_A 112 +# define OSSL_STORE_R_LOADER_INCOMPLETE 116 +# define OSSL_STORE_R_LOADING_STARTED 117 +# define OSSL_STORE_R_NOT_A_CERTIFICATE 100 +# define OSSL_STORE_R_NOT_A_CRL 101 +# define OSSL_STORE_R_NOT_A_KEY 102 +# define OSSL_STORE_R_NOT_A_NAME 103 +# define OSSL_STORE_R_NOT_PARAMETERS 104 +# define OSSL_STORE_R_PASSPHRASE_CALLBACK_ERROR 114 +# define OSSL_STORE_R_PATH_MUST_BE_ABSOLUTE 108 +# define OSSL_STORE_R_SEARCH_ONLY_SUPPORTED_FOR_DIRECTORIES 119 +# define OSSL_STORE_R_UI_PROCESS_INTERRUPTED_OR_CANCELLED 109 +# define OSSL_STORE_R_UNREGISTERED_SCHEME 105 +# define OSSL_STORE_R_UNSUPPORTED_CONTENT_TYPE 110 +# define OSSL_STORE_R_UNSUPPORTED_OPERATION 118 +# define OSSL_STORE_R_UNSUPPORTED_SEARCH_TYPE 120 +# define OSSL_STORE_R_URI_AUTHORITY_UNSUPPORTED 111 + +#endif diff --git a/openssl-wasm/include/openssl/symhacks.h b/openssl-wasm/include/openssl/symhacks.h new file mode 100644 index 0000000..156ea6e --- /dev/null +++ b/openssl-wasm/include/openssl/symhacks.h @@ -0,0 +1,37 @@ +/* + * Copyright 1999-2018 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_SYMHACKS_H +# define HEADER_SYMHACKS_H + +# include + +/* Case insensitive linking causes problems.... */ +# if defined(OPENSSL_SYS_VMS) +# 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 + +/* 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/openssl-wasm/include/openssl/tls1.h b/openssl-wasm/include/openssl/tls1.h new file mode 100644 index 0000000..76d9fda --- /dev/null +++ b/openssl-wasm/include/openssl/tls1.h @@ -0,0 +1,1237 @@ +/* + * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved. + * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved + * Copyright 2005 Nokia. All rights reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_TLS1_H +# define HEADER_TLS1_H + +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Default security level if not overridden at config time */ +# ifndef OPENSSL_TLS_SECURITY_LEVEL +# define OPENSSL_TLS_SECURITY_LEVEL 1 +# endif + +# define TLS1_VERSION 0x0301 +# define TLS1_1_VERSION 0x0302 +# define TLS1_2_VERSION 0x0303 +# define TLS1_3_VERSION 0x0304 +# define TLS_MAX_VERSION TLS1_3_VERSION + +/* Special value for method supporting multiple versions */ +# define TLS_ANY_VERSION 0x10000 + +# define TLS1_VERSION_MAJOR 0x03 +# define TLS1_VERSION_MINOR 0x01 + +# define TLS1_1_VERSION_MAJOR 0x03 +# define TLS1_1_VERSION_MINOR 0x02 + +# define TLS1_2_VERSION_MAJOR 0x03 +# define TLS1_2_VERSION_MINOR 0x03 + +# define TLS1_get_version(s) \ + ((SSL_version(s) >> 8) == TLS1_VERSION_MAJOR ? SSL_version(s) : 0) + +# define TLS1_get_client_version(s) \ + ((SSL_client_version(s) >> 8) == TLS1_VERSION_MAJOR ? SSL_client_version(s) : 0) + +# define TLS1_AD_DECRYPTION_FAILED 21 +# define TLS1_AD_RECORD_OVERFLOW 22 +# define TLS1_AD_UNKNOWN_CA 48/* fatal */ +# define TLS1_AD_ACCESS_DENIED 49/* fatal */ +# define TLS1_AD_DECODE_ERROR 50/* fatal */ +# define TLS1_AD_DECRYPT_ERROR 51 +# define TLS1_AD_EXPORT_RESTRICTION 60/* fatal */ +# define TLS1_AD_PROTOCOL_VERSION 70/* fatal */ +# define TLS1_AD_INSUFFICIENT_SECURITY 71/* fatal */ +# define TLS1_AD_INTERNAL_ERROR 80/* fatal */ +# define TLS1_AD_INAPPROPRIATE_FALLBACK 86/* fatal */ +# define TLS1_AD_USER_CANCELLED 90 +# define TLS1_AD_NO_RENEGOTIATION 100 +/* TLSv1.3 alerts */ +# define TLS13_AD_MISSING_EXTENSION 109 /* fatal */ +# define TLS13_AD_CERTIFICATE_REQUIRED 116 /* fatal */ +/* 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 */ +# define TLS1_AD_NO_APPLICATION_PROTOCOL 120 /* 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 */ +/* + * Prior to TLSv1.3 the supported_groups extension was known as + * elliptic_curves + */ +# define TLSEXT_TYPE_supported_groups 10 +# define TLSEXT_TYPE_elliptic_curves TLSEXT_TYPE_supported_groups +# define TLSEXT_TYPE_ec_point_formats 11 + + +/* ExtensionType value from RFC5054 */ +# define TLSEXT_TYPE_srp 12 + +/* ExtensionType values from RFC5246 */ +# define TLSEXT_TYPE_signature_algorithms 13 + +/* ExtensionType value from RFC5764 */ +# define TLSEXT_TYPE_use_srtp 14 + +/* ExtensionType value from RFC5620 */ +# define TLSEXT_TYPE_heartbeat 15 + +/* ExtensionType value from RFC7301 */ +# define TLSEXT_TYPE_application_layer_protocol_negotiation 16 + +/* + * Extension type for Certificate Transparency + * https://tools.ietf.org/html/rfc6962#section-3.3.1 + */ +# define TLSEXT_TYPE_signed_certificate_timestamp 18 + +/* + * ExtensionType value for TLS padding extension. + * http://tools.ietf.org/html/draft-agl-tls-padding + */ +# define TLSEXT_TYPE_padding 21 + +/* ExtensionType value from RFC7366 */ +# define TLSEXT_TYPE_encrypt_then_mac 22 + +/* ExtensionType value from RFC7627 */ +# define TLSEXT_TYPE_extended_master_secret 23 + +/* ExtensionType value from RFC4507 */ +# define TLSEXT_TYPE_session_ticket 35 + +/* As defined for TLS1.3 */ +# define TLSEXT_TYPE_psk 41 +# define TLSEXT_TYPE_early_data 42 +# define TLSEXT_TYPE_supported_versions 43 +# define TLSEXT_TYPE_cookie 44 +# define TLSEXT_TYPE_psk_kex_modes 45 +# define TLSEXT_TYPE_certificate_authorities 47 +# define TLSEXT_TYPE_post_handshake_auth 49 +# define TLSEXT_TYPE_signature_algorithms_cert 50 +# define TLSEXT_TYPE_key_share 51 + +/* 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 RFC3546 */ +# define TLSEXT_NAMETYPE_host_name 0 +/* status request value from RFC3546 */ +# define TLSEXT_STATUSTYPE_ocsp 1 + +/* ECPointFormat values from RFC4492 */ +# 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 RFC5246 */ +# define TLSEXT_signature_anonymous 0 +# define TLSEXT_signature_rsa 1 +# define TLSEXT_signature_dsa 2 +# define TLSEXT_signature_ecdsa 3 +# define TLSEXT_signature_gostr34102001 237 +# define TLSEXT_signature_gostr34102012_256 238 +# define TLSEXT_signature_gostr34102012_512 239 + +/* Total number of different signature algorithms */ +# define TLSEXT_signature_num 7 + +# 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 +# define TLSEXT_hash_gostr3411 237 +# define TLSEXT_hash_gostr34112012_256 238 +# define TLSEXT_hash_gostr34112012_512 239 + +/* Total number of different digest algorithms */ + +# define TLSEXT_hash_num 10 + +/* Flag set for unrecognised algorithms */ +# define TLSEXT_nid_unknown 0x1000000 + +/* ECC curves */ + +# define TLSEXT_curve_P_256 23 +# define TLSEXT_curve_P_384 24 + +/* OpenSSL value to disable maximum fragment length extension */ +# define TLSEXT_max_fragment_length_DISABLED 0 +/* Allowed values for max fragment length extension */ +# define TLSEXT_max_fragment_length_512 1 +# define TLSEXT_max_fragment_length_1024 2 +# define TLSEXT_max_fragment_length_2048 3 +# define TLSEXT_max_fragment_length_4096 4 + +int SSL_CTX_set_tlsext_max_fragment_length(SSL_CTX *ctx, uint8_t mode); +int SSL_set_tlsext_max_fragment_length(SSL *ssl, uint8_t mode); + +# define TLSEXT_MAXLEN_host_name 255 + +__owur const char *SSL_get_servername(const SSL *s, const int type); +__owur 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 + * 0 or -1 otherwise. + */ +__owur int SSL_export_keying_material(SSL *s, unsigned char *out, size_t olen, + const char *label, size_t llen, + const unsigned char *context, + size_t contextlen, int use_context); + +/* + * SSL_export_keying_material_early exports a value derived from the + * early exporter master secret, as specified in + * https://tools.ietf.org/html/draft-ietf-tls-tls13-23. It writes + * |olen| bytes to |out| given a label and optional context. It + * returns 1 on success and 0 otherwise. + */ +__owur int SSL_export_keying_material_early(SSL *s, unsigned char *out, + size_t olen, const char *label, + size_t llen, + const unsigned char *context, + size_t contextlen); + +int SSL_get_peer_signature_type_nid(const SSL *s, int *pnid); +int SSL_get_signature_type_nid(const SSL *s, int *pnid); + +int SSL_get_sigalgs(SSL *s, int idx, + int *psign, int *phash, int *psignandhash, + unsigned char *rsig, unsigned char *rhash); + +int SSL_get_shared_sigalgs(SSL *s, int idx, + int *psign, int *phash, int *psignandhash, + unsigned char *rsig, unsigned char *rhash); + +__owur int SSL_check_chain(SSL *s, X509 *x, EVP_PKEY *pk, STACK_OF(X509) *chain); + +# define SSL_set_tlsext_host_name(s,name) \ + SSL_ctrl(s,SSL_CTRL_SET_TLSEXT_HOSTNAME,TLSEXT_NAMETYPE_host_name,\ + (void *)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,arg) + +# define SSL_get_tlsext_status_type(ssl) \ + SSL_ctrl(ssl,SSL_CTRL_GET_TLSEXT_STATUS_REQ_TYPE,0,NULL) + +# 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,arg) + +# define SSL_set_tlsext_status_exts(ssl, arg) \ + SSL_ctrl(ssl,SSL_CTRL_SET_TLSEXT_STATUS_REQ_EXTS,0,arg) + +# define SSL_get_tlsext_status_ids(ssl, arg) \ + SSL_ctrl(ssl,SSL_CTRL_GET_TLSEXT_STATUS_REQ_IDS,0,arg) + +# define SSL_set_tlsext_status_ids(ssl, arg) \ + SSL_ctrl(ssl,SSL_CTRL_SET_TLSEXT_STATUS_REQ_IDS,0,arg) + +# define SSL_get_tlsext_status_ocsp_resp(ssl, arg) \ + SSL_ctrl(ssl,SSL_CTRL_GET_TLSEXT_STATUS_REQ_OCSP_RESP,0,arg) + +# define SSL_set_tlsext_status_ocsp_resp(ssl, arg, arglen) \ + SSL_ctrl(ssl,SSL_CTRL_SET_TLSEXT_STATUS_REQ_OCSP_RESP,arglen,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,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_get_tlsext_status_cb(ssl, cb) \ + SSL_CTX_ctrl(ssl,SSL_CTRL_GET_TLSEXT_STATUS_REQ_CB,0,(void *)cb) +# 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_get_tlsext_status_arg(ssl, arg) \ + SSL_CTX_ctrl(ssl,SSL_CTRL_GET_TLSEXT_STATUS_REQ_CB_ARG,0,arg) +# define SSL_CTX_set_tlsext_status_arg(ssl, arg) \ + SSL_CTX_ctrl(ssl,SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB_ARG,0,arg) + +# define SSL_CTX_set_tlsext_status_type(ssl, type) \ + SSL_CTX_ctrl(ssl,SSL_CTRL_SET_TLSEXT_STATUS_REQ_TYPE,type,NULL) + +# define SSL_CTX_get_tlsext_status_type(ssl) \ + SSL_CTX_ctrl(ssl,SSL_CTRL_GET_TLSEXT_STATUS_REQ_TYPE,0,NULL) + +# 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_DTLSEXT_HB_ENABLED 0x01 +# define SSL_DTLSEXT_HB_DONT_SEND_REQUESTS 0x02 +# define SSL_DTLSEXT_HB_DONT_RECV_REQUESTS 0x04 +# define SSL_get_dtlsext_heartbeat_pending(ssl) \ + SSL_ctrl(ssl,SSL_CTRL_GET_DTLS_EXT_HEARTBEAT_PENDING,0,NULL) +# define SSL_set_dtlsext_heartbeat_no_requests(ssl, arg) \ + SSL_ctrl(ssl,SSL_CTRL_SET_DTLS_EXT_HEARTBEAT_NO_REQUESTS,arg,NULL) + +# if OPENSSL_API_COMPAT < 0x10100000L +# define SSL_CTRL_TLS_EXT_SEND_HEARTBEAT \ + SSL_CTRL_DTLS_EXT_SEND_HEARTBEAT +# define SSL_CTRL_GET_TLS_EXT_HEARTBEAT_PENDING \ + SSL_CTRL_GET_DTLS_EXT_HEARTBEAT_PENDING +# define SSL_CTRL_SET_TLS_EXT_HEARTBEAT_NO_REQUESTS \ + SSL_CTRL_SET_DTLS_EXT_HEARTBEAT_NO_REQUESTS +# define SSL_TLSEXT_HB_ENABLED \ + SSL_DTLSEXT_HB_ENABLED +# define SSL_TLSEXT_HB_DONT_SEND_REQUESTS \ + SSL_DTLSEXT_HB_DONT_SEND_REQUESTS +# define SSL_TLSEXT_HB_DONT_RECV_REQUESTS \ + SSL_DTLSEXT_HB_DONT_RECV_REQUESTS +# define SSL_get_tlsext_heartbeat_pending(ssl) \ + SSL_get_dtlsext_heartbeat_pending(ssl) +# define SSL_set_tlsext_heartbeat_no_requests(ssl, arg) \ + SSL_set_dtlsext_heartbeat_no_requests(ssl,arg) +# 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 +# define TLS1_CK_DHE_PSK_WITH_RC4_128_SHA 0x0300008E +# define TLS1_CK_DHE_PSK_WITH_3DES_EDE_CBC_SHA 0x0300008F +# define TLS1_CK_DHE_PSK_WITH_AES_128_CBC_SHA 0x03000090 +# define TLS1_CK_DHE_PSK_WITH_AES_256_CBC_SHA 0x03000091 +# define TLS1_CK_RSA_PSK_WITH_RC4_128_SHA 0x03000092 +# define TLS1_CK_RSA_PSK_WITH_3DES_EDE_CBC_SHA 0x03000093 +# define TLS1_CK_RSA_PSK_WITH_AES_128_CBC_SHA 0x03000094 +# define TLS1_CK_RSA_PSK_WITH_AES_256_CBC_SHA 0x03000095 + +/* PSK ciphersuites from 5487 */ +# define TLS1_CK_PSK_WITH_AES_128_GCM_SHA256 0x030000A8 +# define TLS1_CK_PSK_WITH_AES_256_GCM_SHA384 0x030000A9 +# define TLS1_CK_DHE_PSK_WITH_AES_128_GCM_SHA256 0x030000AA +# define TLS1_CK_DHE_PSK_WITH_AES_256_GCM_SHA384 0x030000AB +# define TLS1_CK_RSA_PSK_WITH_AES_128_GCM_SHA256 0x030000AC +# define TLS1_CK_RSA_PSK_WITH_AES_256_GCM_SHA384 0x030000AD +# define TLS1_CK_PSK_WITH_AES_128_CBC_SHA256 0x030000AE +# define TLS1_CK_PSK_WITH_AES_256_CBC_SHA384 0x030000AF +# define TLS1_CK_PSK_WITH_NULL_SHA256 0x030000B0 +# define TLS1_CK_PSK_WITH_NULL_SHA384 0x030000B1 +# define TLS1_CK_DHE_PSK_WITH_AES_128_CBC_SHA256 0x030000B2 +# define TLS1_CK_DHE_PSK_WITH_AES_256_CBC_SHA384 0x030000B3 +# define TLS1_CK_DHE_PSK_WITH_NULL_SHA256 0x030000B4 +# define TLS1_CK_DHE_PSK_WITH_NULL_SHA384 0x030000B5 +# define TLS1_CK_RSA_PSK_WITH_AES_128_CBC_SHA256 0x030000B6 +# define TLS1_CK_RSA_PSK_WITH_AES_256_CBC_SHA384 0x030000B7 +# define TLS1_CK_RSA_PSK_WITH_NULL_SHA256 0x030000B8 +# define TLS1_CK_RSA_PSK_WITH_NULL_SHA384 0x030000B9 + +/* NULL PSK ciphersuites from RFC4785 */ +# define TLS1_CK_PSK_WITH_NULL_SHA 0x0300002C +# define TLS1_CK_DHE_PSK_WITH_NULL_SHA 0x0300002D +# define TLS1_CK_RSA_PSK_WITH_NULL_SHA 0x0300002E + +/* 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 + +/* CCM ciphersuites from RFC6655 */ +# define TLS1_CK_RSA_WITH_AES_128_CCM 0x0300C09C +# define TLS1_CK_RSA_WITH_AES_256_CCM 0x0300C09D +# define TLS1_CK_DHE_RSA_WITH_AES_128_CCM 0x0300C09E +# define TLS1_CK_DHE_RSA_WITH_AES_256_CCM 0x0300C09F +# define TLS1_CK_RSA_WITH_AES_128_CCM_8 0x0300C0A0 +# define TLS1_CK_RSA_WITH_AES_256_CCM_8 0x0300C0A1 +# define TLS1_CK_DHE_RSA_WITH_AES_128_CCM_8 0x0300C0A2 +# define TLS1_CK_DHE_RSA_WITH_AES_256_CCM_8 0x0300C0A3 +# define TLS1_CK_PSK_WITH_AES_128_CCM 0x0300C0A4 +# define TLS1_CK_PSK_WITH_AES_256_CCM 0x0300C0A5 +# define TLS1_CK_DHE_PSK_WITH_AES_128_CCM 0x0300C0A6 +# define TLS1_CK_DHE_PSK_WITH_AES_256_CCM 0x0300C0A7 +# define TLS1_CK_PSK_WITH_AES_128_CCM_8 0x0300C0A8 +# define TLS1_CK_PSK_WITH_AES_256_CCM_8 0x0300C0A9 +# define TLS1_CK_DHE_PSK_WITH_AES_128_CCM_8 0x0300C0AA +# define TLS1_CK_DHE_PSK_WITH_AES_256_CCM_8 0x0300C0AB + +/* CCM ciphersuites from RFC7251 */ +# define TLS1_CK_ECDHE_ECDSA_WITH_AES_128_CCM 0x0300C0AC +# define TLS1_CK_ECDHE_ECDSA_WITH_AES_256_CCM 0x0300C0AD +# define TLS1_CK_ECDHE_ECDSA_WITH_AES_128_CCM_8 0x0300C0AE +# define TLS1_CK_ECDHE_ECDSA_WITH_AES_256_CCM_8 0x0300C0AF + +/* TLS 1.2 Camellia SHA-256 ciphersuites from RFC5932 */ +# define TLS1_CK_RSA_WITH_CAMELLIA_128_CBC_SHA256 0x030000BA +# define TLS1_CK_DH_DSS_WITH_CAMELLIA_128_CBC_SHA256 0x030000BB +# define TLS1_CK_DH_RSA_WITH_CAMELLIA_128_CBC_SHA256 0x030000BC +# define TLS1_CK_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256 0x030000BD +# define TLS1_CK_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 0x030000BE +# define TLS1_CK_ADH_WITH_CAMELLIA_128_CBC_SHA256 0x030000BF + +# define TLS1_CK_RSA_WITH_CAMELLIA_256_CBC_SHA256 0x030000C0 +# define TLS1_CK_DH_DSS_WITH_CAMELLIA_256_CBC_SHA256 0x030000C1 +# define TLS1_CK_DH_RSA_WITH_CAMELLIA_256_CBC_SHA256 0x030000C2 +# define TLS1_CK_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256 0x030000C3 +# define TLS1_CK_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 0x030000C4 +# define TLS1_CK_ADH_WITH_CAMELLIA_256_CBC_SHA256 0x030000C5 + +/* ECC ciphersuites from RFC4492 */ +# 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 + +/* ECDHE PSK ciphersuites from RFC5489 */ +# define TLS1_CK_ECDHE_PSK_WITH_RC4_128_SHA 0x0300C033 +# define TLS1_CK_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA 0x0300C034 +# define TLS1_CK_ECDHE_PSK_WITH_AES_128_CBC_SHA 0x0300C035 +# define TLS1_CK_ECDHE_PSK_WITH_AES_256_CBC_SHA 0x0300C036 + +# define TLS1_CK_ECDHE_PSK_WITH_AES_128_CBC_SHA256 0x0300C037 +# define TLS1_CK_ECDHE_PSK_WITH_AES_256_CBC_SHA384 0x0300C038 + +/* NULL PSK ciphersuites from RFC4785 */ +# define TLS1_CK_ECDHE_PSK_WITH_NULL_SHA 0x0300C039 +# define TLS1_CK_ECDHE_PSK_WITH_NULL_SHA256 0x0300C03A +# define TLS1_CK_ECDHE_PSK_WITH_NULL_SHA384 0x0300C03B + +/* Camellia-CBC ciphersuites from RFC6367 */ +# define TLS1_CK_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 0x0300C072 +# define TLS1_CK_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 0x0300C073 +# define TLS1_CK_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 0x0300C074 +# define TLS1_CK_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 0x0300C075 +# define TLS1_CK_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 0x0300C076 +# define TLS1_CK_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384 0x0300C077 +# define TLS1_CK_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256 0x0300C078 +# define TLS1_CK_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384 0x0300C079 + +# define TLS1_CK_PSK_WITH_CAMELLIA_128_CBC_SHA256 0x0300C094 +# define TLS1_CK_PSK_WITH_CAMELLIA_256_CBC_SHA384 0x0300C095 +# define TLS1_CK_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 0x0300C096 +# define TLS1_CK_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 0x0300C097 +# define TLS1_CK_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256 0x0300C098 +# define TLS1_CK_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384 0x0300C099 +# define TLS1_CK_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 0x0300C09A +# define TLS1_CK_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 0x0300C09B + +/* draft-ietf-tls-chacha20-poly1305-03 */ +# define TLS1_CK_ECDHE_RSA_WITH_CHACHA20_POLY1305 0x0300CCA8 +# define TLS1_CK_ECDHE_ECDSA_WITH_CHACHA20_POLY1305 0x0300CCA9 +# define TLS1_CK_DHE_RSA_WITH_CHACHA20_POLY1305 0x0300CCAA +# define TLS1_CK_PSK_WITH_CHACHA20_POLY1305 0x0300CCAB +# define TLS1_CK_ECDHE_PSK_WITH_CHACHA20_POLY1305 0x0300CCAC +# define TLS1_CK_DHE_PSK_WITH_CHACHA20_POLY1305 0x0300CCAD +# define TLS1_CK_RSA_PSK_WITH_CHACHA20_POLY1305 0x0300CCAE + +/* TLS v1.3 ciphersuites */ +# define TLS1_3_CK_AES_128_GCM_SHA256 0x03001301 +# define TLS1_3_CK_AES_256_GCM_SHA384 0x03001302 +# define TLS1_3_CK_CHACHA20_POLY1305_SHA256 0x03001303 +# define TLS1_3_CK_AES_128_CCM_SHA256 0x03001304 +# define TLS1_3_CK_AES_128_CCM_8_SHA256 0x03001305 + +/* Aria ciphersuites from RFC6209 */ +# define TLS1_CK_RSA_WITH_ARIA_128_GCM_SHA256 0x0300C050 +# define TLS1_CK_RSA_WITH_ARIA_256_GCM_SHA384 0x0300C051 +# define TLS1_CK_DHE_RSA_WITH_ARIA_128_GCM_SHA256 0x0300C052 +# define TLS1_CK_DHE_RSA_WITH_ARIA_256_GCM_SHA384 0x0300C053 +# define TLS1_CK_DH_RSA_WITH_ARIA_128_GCM_SHA256 0x0300C054 +# define TLS1_CK_DH_RSA_WITH_ARIA_256_GCM_SHA384 0x0300C055 +# define TLS1_CK_DHE_DSS_WITH_ARIA_128_GCM_SHA256 0x0300C056 +# define TLS1_CK_DHE_DSS_WITH_ARIA_256_GCM_SHA384 0x0300C057 +# define TLS1_CK_DH_DSS_WITH_ARIA_128_GCM_SHA256 0x0300C058 +# define TLS1_CK_DH_DSS_WITH_ARIA_256_GCM_SHA384 0x0300C059 +# define TLS1_CK_DH_anon_WITH_ARIA_128_GCM_SHA256 0x0300C05A +# define TLS1_CK_DH_anon_WITH_ARIA_256_GCM_SHA384 0x0300C05B +# define TLS1_CK_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256 0x0300C05C +# define TLS1_CK_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384 0x0300C05D +# define TLS1_CK_ECDH_ECDSA_WITH_ARIA_128_GCM_SHA256 0x0300C05E +# define TLS1_CK_ECDH_ECDSA_WITH_ARIA_256_GCM_SHA384 0x0300C05F +# define TLS1_CK_ECDHE_RSA_WITH_ARIA_128_GCM_SHA256 0x0300C060 +# define TLS1_CK_ECDHE_RSA_WITH_ARIA_256_GCM_SHA384 0x0300C061 +# define TLS1_CK_ECDH_RSA_WITH_ARIA_128_GCM_SHA256 0x0300C062 +# define TLS1_CK_ECDH_RSA_WITH_ARIA_256_GCM_SHA384 0x0300C063 +# define TLS1_CK_PSK_WITH_ARIA_128_GCM_SHA256 0x0300C06A +# define TLS1_CK_PSK_WITH_ARIA_256_GCM_SHA384 0x0300C06B +# define TLS1_CK_DHE_PSK_WITH_ARIA_128_GCM_SHA256 0x0300C06C +# define TLS1_CK_DHE_PSK_WITH_ARIA_256_GCM_SHA384 0x0300C06D +# define TLS1_CK_RSA_PSK_WITH_ARIA_128_GCM_SHA256 0x0300C06E +# define TLS1_CK_RSA_PSK_WITH_ARIA_256_GCM_SHA384 0x0300C06F + +/* a bundle of RFC standard cipher names, generated from ssl3_ciphers[] */ +# define TLS1_RFC_RSA_WITH_AES_128_SHA "TLS_RSA_WITH_AES_128_CBC_SHA" +# define TLS1_RFC_DHE_DSS_WITH_AES_128_SHA "TLS_DHE_DSS_WITH_AES_128_CBC_SHA" +# define TLS1_RFC_DHE_RSA_WITH_AES_128_SHA "TLS_DHE_RSA_WITH_AES_128_CBC_SHA" +# define TLS1_RFC_ADH_WITH_AES_128_SHA "TLS_DH_anon_WITH_AES_128_CBC_SHA" +# define TLS1_RFC_RSA_WITH_AES_256_SHA "TLS_RSA_WITH_AES_256_CBC_SHA" +# define TLS1_RFC_DHE_DSS_WITH_AES_256_SHA "TLS_DHE_DSS_WITH_AES_256_CBC_SHA" +# define TLS1_RFC_DHE_RSA_WITH_AES_256_SHA "TLS_DHE_RSA_WITH_AES_256_CBC_SHA" +# define TLS1_RFC_ADH_WITH_AES_256_SHA "TLS_DH_anon_WITH_AES_256_CBC_SHA" +# define TLS1_RFC_RSA_WITH_NULL_SHA256 "TLS_RSA_WITH_NULL_SHA256" +# define TLS1_RFC_RSA_WITH_AES_128_SHA256 "TLS_RSA_WITH_AES_128_CBC_SHA256" +# define TLS1_RFC_RSA_WITH_AES_256_SHA256 "TLS_RSA_WITH_AES_256_CBC_SHA256" +# define TLS1_RFC_DHE_DSS_WITH_AES_128_SHA256 "TLS_DHE_DSS_WITH_AES_128_CBC_SHA256" +# define TLS1_RFC_DHE_RSA_WITH_AES_128_SHA256 "TLS_DHE_RSA_WITH_AES_128_CBC_SHA256" +# define TLS1_RFC_DHE_DSS_WITH_AES_256_SHA256 "TLS_DHE_DSS_WITH_AES_256_CBC_SHA256" +# define TLS1_RFC_DHE_RSA_WITH_AES_256_SHA256 "TLS_DHE_RSA_WITH_AES_256_CBC_SHA256" +# define TLS1_RFC_ADH_WITH_AES_128_SHA256 "TLS_DH_anon_WITH_AES_128_CBC_SHA256" +# define TLS1_RFC_ADH_WITH_AES_256_SHA256 "TLS_DH_anon_WITH_AES_256_CBC_SHA256" +# define TLS1_RFC_RSA_WITH_AES_128_GCM_SHA256 "TLS_RSA_WITH_AES_128_GCM_SHA256" +# define TLS1_RFC_RSA_WITH_AES_256_GCM_SHA384 "TLS_RSA_WITH_AES_256_GCM_SHA384" +# define TLS1_RFC_DHE_RSA_WITH_AES_128_GCM_SHA256 "TLS_DHE_RSA_WITH_AES_128_GCM_SHA256" +# define TLS1_RFC_DHE_RSA_WITH_AES_256_GCM_SHA384 "TLS_DHE_RSA_WITH_AES_256_GCM_SHA384" +# define TLS1_RFC_DHE_DSS_WITH_AES_128_GCM_SHA256 "TLS_DHE_DSS_WITH_AES_128_GCM_SHA256" +# define TLS1_RFC_DHE_DSS_WITH_AES_256_GCM_SHA384 "TLS_DHE_DSS_WITH_AES_256_GCM_SHA384" +# define TLS1_RFC_ADH_WITH_AES_128_GCM_SHA256 "TLS_DH_anon_WITH_AES_128_GCM_SHA256" +# define TLS1_RFC_ADH_WITH_AES_256_GCM_SHA384 "TLS_DH_anon_WITH_AES_256_GCM_SHA384" +# define TLS1_RFC_RSA_WITH_AES_128_CCM "TLS_RSA_WITH_AES_128_CCM" +# define TLS1_RFC_RSA_WITH_AES_256_CCM "TLS_RSA_WITH_AES_256_CCM" +# define TLS1_RFC_DHE_RSA_WITH_AES_128_CCM "TLS_DHE_RSA_WITH_AES_128_CCM" +# define TLS1_RFC_DHE_RSA_WITH_AES_256_CCM "TLS_DHE_RSA_WITH_AES_256_CCM" +# define TLS1_RFC_RSA_WITH_AES_128_CCM_8 "TLS_RSA_WITH_AES_128_CCM_8" +# define TLS1_RFC_RSA_WITH_AES_256_CCM_8 "TLS_RSA_WITH_AES_256_CCM_8" +# define TLS1_RFC_DHE_RSA_WITH_AES_128_CCM_8 "TLS_DHE_RSA_WITH_AES_128_CCM_8" +# define TLS1_RFC_DHE_RSA_WITH_AES_256_CCM_8 "TLS_DHE_RSA_WITH_AES_256_CCM_8" +# define TLS1_RFC_PSK_WITH_AES_128_CCM "TLS_PSK_WITH_AES_128_CCM" +# define TLS1_RFC_PSK_WITH_AES_256_CCM "TLS_PSK_WITH_AES_256_CCM" +# define TLS1_RFC_DHE_PSK_WITH_AES_128_CCM "TLS_DHE_PSK_WITH_AES_128_CCM" +# define TLS1_RFC_DHE_PSK_WITH_AES_256_CCM "TLS_DHE_PSK_WITH_AES_256_CCM" +# define TLS1_RFC_PSK_WITH_AES_128_CCM_8 "TLS_PSK_WITH_AES_128_CCM_8" +# define TLS1_RFC_PSK_WITH_AES_256_CCM_8 "TLS_PSK_WITH_AES_256_CCM_8" +# define TLS1_RFC_DHE_PSK_WITH_AES_128_CCM_8 "TLS_PSK_DHE_WITH_AES_128_CCM_8" +# define TLS1_RFC_DHE_PSK_WITH_AES_256_CCM_8 "TLS_PSK_DHE_WITH_AES_256_CCM_8" +# define TLS1_RFC_ECDHE_ECDSA_WITH_AES_128_CCM "TLS_ECDHE_ECDSA_WITH_AES_128_CCM" +# define TLS1_RFC_ECDHE_ECDSA_WITH_AES_256_CCM "TLS_ECDHE_ECDSA_WITH_AES_256_CCM" +# define TLS1_RFC_ECDHE_ECDSA_WITH_AES_128_CCM_8 "TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8" +# define TLS1_RFC_ECDHE_ECDSA_WITH_AES_256_CCM_8 "TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8" +# define TLS1_3_RFC_AES_128_GCM_SHA256 "TLS_AES_128_GCM_SHA256" +# define TLS1_3_RFC_AES_256_GCM_SHA384 "TLS_AES_256_GCM_SHA384" +# define TLS1_3_RFC_CHACHA20_POLY1305_SHA256 "TLS_CHACHA20_POLY1305_SHA256" +# define TLS1_3_RFC_AES_128_CCM_SHA256 "TLS_AES_128_CCM_SHA256" +# define TLS1_3_RFC_AES_128_CCM_8_SHA256 "TLS_AES_128_CCM_8_SHA256" +# define TLS1_RFC_ECDHE_ECDSA_WITH_NULL_SHA "TLS_ECDHE_ECDSA_WITH_NULL_SHA" +# define TLS1_RFC_ECDHE_ECDSA_WITH_DES_192_CBC3_SHA "TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA" +# define TLS1_RFC_ECDHE_ECDSA_WITH_AES_128_CBC_SHA "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA" +# define TLS1_RFC_ECDHE_ECDSA_WITH_AES_256_CBC_SHA "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA" +# define TLS1_RFC_ECDHE_RSA_WITH_NULL_SHA "TLS_ECDHE_RSA_WITH_NULL_SHA" +# define TLS1_RFC_ECDHE_RSA_WITH_DES_192_CBC3_SHA "TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA" +# define TLS1_RFC_ECDHE_RSA_WITH_AES_128_CBC_SHA "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA" +# define TLS1_RFC_ECDHE_RSA_WITH_AES_256_CBC_SHA "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA" +# define TLS1_RFC_ECDH_anon_WITH_NULL_SHA "TLS_ECDH_anon_WITH_NULL_SHA" +# define TLS1_RFC_ECDH_anon_WITH_DES_192_CBC3_SHA "TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA" +# define TLS1_RFC_ECDH_anon_WITH_AES_128_CBC_SHA "TLS_ECDH_anon_WITH_AES_128_CBC_SHA" +# define TLS1_RFC_ECDH_anon_WITH_AES_256_CBC_SHA "TLS_ECDH_anon_WITH_AES_256_CBC_SHA" +# define TLS1_RFC_ECDHE_ECDSA_WITH_AES_128_SHA256 "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256" +# define TLS1_RFC_ECDHE_ECDSA_WITH_AES_256_SHA384 "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384" +# define TLS1_RFC_ECDHE_RSA_WITH_AES_128_SHA256 "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256" +# define TLS1_RFC_ECDHE_RSA_WITH_AES_256_SHA384 "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384" +# define TLS1_RFC_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256" +# define TLS1_RFC_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384" +# define TLS1_RFC_ECDHE_RSA_WITH_AES_128_GCM_SHA256 "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256" +# define TLS1_RFC_ECDHE_RSA_WITH_AES_256_GCM_SHA384 "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384" +# define TLS1_RFC_PSK_WITH_NULL_SHA "TLS_PSK_WITH_NULL_SHA" +# define TLS1_RFC_DHE_PSK_WITH_NULL_SHA "TLS_DHE_PSK_WITH_NULL_SHA" +# define TLS1_RFC_RSA_PSK_WITH_NULL_SHA "TLS_RSA_PSK_WITH_NULL_SHA" +# define TLS1_RFC_PSK_WITH_3DES_EDE_CBC_SHA "TLS_PSK_WITH_3DES_EDE_CBC_SHA" +# define TLS1_RFC_PSK_WITH_AES_128_CBC_SHA "TLS_PSK_WITH_AES_128_CBC_SHA" +# define TLS1_RFC_PSK_WITH_AES_256_CBC_SHA "TLS_PSK_WITH_AES_256_CBC_SHA" +# define TLS1_RFC_DHE_PSK_WITH_3DES_EDE_CBC_SHA "TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA" +# define TLS1_RFC_DHE_PSK_WITH_AES_128_CBC_SHA "TLS_DHE_PSK_WITH_AES_128_CBC_SHA" +# define TLS1_RFC_DHE_PSK_WITH_AES_256_CBC_SHA "TLS_DHE_PSK_WITH_AES_256_CBC_SHA" +# define TLS1_RFC_RSA_PSK_WITH_3DES_EDE_CBC_SHA "TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA" +# define TLS1_RFC_RSA_PSK_WITH_AES_128_CBC_SHA "TLS_RSA_PSK_WITH_AES_128_CBC_SHA" +# define TLS1_RFC_RSA_PSK_WITH_AES_256_CBC_SHA "TLS_RSA_PSK_WITH_AES_256_CBC_SHA" +# define TLS1_RFC_PSK_WITH_AES_128_GCM_SHA256 "TLS_PSK_WITH_AES_128_GCM_SHA256" +# define TLS1_RFC_PSK_WITH_AES_256_GCM_SHA384 "TLS_PSK_WITH_AES_256_GCM_SHA384" +# define TLS1_RFC_DHE_PSK_WITH_AES_128_GCM_SHA256 "TLS_DHE_PSK_WITH_AES_128_GCM_SHA256" +# define TLS1_RFC_DHE_PSK_WITH_AES_256_GCM_SHA384 "TLS_DHE_PSK_WITH_AES_256_GCM_SHA384" +# define TLS1_RFC_RSA_PSK_WITH_AES_128_GCM_SHA256 "TLS_RSA_PSK_WITH_AES_128_GCM_SHA256" +# define TLS1_RFC_RSA_PSK_WITH_AES_256_GCM_SHA384 "TLS_RSA_PSK_WITH_AES_256_GCM_SHA384" +# define TLS1_RFC_PSK_WITH_AES_128_CBC_SHA256 "TLS_PSK_WITH_AES_128_CBC_SHA256" +# define TLS1_RFC_PSK_WITH_AES_256_CBC_SHA384 "TLS_PSK_WITH_AES_256_CBC_SHA384" +# define TLS1_RFC_PSK_WITH_NULL_SHA256 "TLS_PSK_WITH_NULL_SHA256" +# define TLS1_RFC_PSK_WITH_NULL_SHA384 "TLS_PSK_WITH_NULL_SHA384" +# define TLS1_RFC_DHE_PSK_WITH_AES_128_CBC_SHA256 "TLS_DHE_PSK_WITH_AES_128_CBC_SHA256" +# define TLS1_RFC_DHE_PSK_WITH_AES_256_CBC_SHA384 "TLS_DHE_PSK_WITH_AES_256_CBC_SHA384" +# define TLS1_RFC_DHE_PSK_WITH_NULL_SHA256 "TLS_DHE_PSK_WITH_NULL_SHA256" +# define TLS1_RFC_DHE_PSK_WITH_NULL_SHA384 "TLS_DHE_PSK_WITH_NULL_SHA384" +# define TLS1_RFC_RSA_PSK_WITH_AES_128_CBC_SHA256 "TLS_RSA_PSK_WITH_AES_128_CBC_SHA256" +# define TLS1_RFC_RSA_PSK_WITH_AES_256_CBC_SHA384 "TLS_RSA_PSK_WITH_AES_256_CBC_SHA384" +# define TLS1_RFC_RSA_PSK_WITH_NULL_SHA256 "TLS_RSA_PSK_WITH_NULL_SHA256" +# define TLS1_RFC_RSA_PSK_WITH_NULL_SHA384 "TLS_RSA_PSK_WITH_NULL_SHA384" +# define TLS1_RFC_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA "TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA" +# define TLS1_RFC_ECDHE_PSK_WITH_AES_128_CBC_SHA "TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA" +# define TLS1_RFC_ECDHE_PSK_WITH_AES_256_CBC_SHA "TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA" +# define TLS1_RFC_ECDHE_PSK_WITH_AES_128_CBC_SHA256 "TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256" +# define TLS1_RFC_ECDHE_PSK_WITH_AES_256_CBC_SHA384 "TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384" +# define TLS1_RFC_ECDHE_PSK_WITH_NULL_SHA "TLS_ECDHE_PSK_WITH_NULL_SHA" +# define TLS1_RFC_ECDHE_PSK_WITH_NULL_SHA256 "TLS_ECDHE_PSK_WITH_NULL_SHA256" +# define TLS1_RFC_ECDHE_PSK_WITH_NULL_SHA384 "TLS_ECDHE_PSK_WITH_NULL_SHA384" +# define TLS1_RFC_SRP_SHA_WITH_3DES_EDE_CBC_SHA "TLS_SRP_SHA_WITH_3DES_EDE_CBC_SHA" +# define TLS1_RFC_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA "TLS_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA" +# define TLS1_RFC_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA "TLS_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA" +# define TLS1_RFC_SRP_SHA_WITH_AES_128_CBC_SHA "TLS_SRP_SHA_WITH_AES_128_CBC_SHA" +# define TLS1_RFC_SRP_SHA_RSA_WITH_AES_128_CBC_SHA "TLS_SRP_SHA_RSA_WITH_AES_128_CBC_SHA" +# define TLS1_RFC_SRP_SHA_DSS_WITH_AES_128_CBC_SHA "TLS_SRP_SHA_DSS_WITH_AES_128_CBC_SHA" +# define TLS1_RFC_SRP_SHA_WITH_AES_256_CBC_SHA "TLS_SRP_SHA_WITH_AES_256_CBC_SHA" +# define TLS1_RFC_SRP_SHA_RSA_WITH_AES_256_CBC_SHA "TLS_SRP_SHA_RSA_WITH_AES_256_CBC_SHA" +# define TLS1_RFC_SRP_SHA_DSS_WITH_AES_256_CBC_SHA "TLS_SRP_SHA_DSS_WITH_AES_256_CBC_SHA" +# define TLS1_RFC_DHE_RSA_WITH_CHACHA20_POLY1305 "TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256" +# define TLS1_RFC_ECDHE_RSA_WITH_CHACHA20_POLY1305 "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256" +# define TLS1_RFC_ECDHE_ECDSA_WITH_CHACHA20_POLY1305 "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256" +# define TLS1_RFC_PSK_WITH_CHACHA20_POLY1305 "TLS_PSK_WITH_CHACHA20_POLY1305_SHA256" +# define TLS1_RFC_ECDHE_PSK_WITH_CHACHA20_POLY1305 "TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256" +# define TLS1_RFC_DHE_PSK_WITH_CHACHA20_POLY1305 "TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256" +# define TLS1_RFC_RSA_PSK_WITH_CHACHA20_POLY1305 "TLS_RSA_PSK_WITH_CHACHA20_POLY1305_SHA256" +# define TLS1_RFC_RSA_WITH_CAMELLIA_128_CBC_SHA256 "TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256" +# define TLS1_RFC_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256 "TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256" +# define TLS1_RFC_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 "TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256" +# define TLS1_RFC_ADH_WITH_CAMELLIA_128_CBC_SHA256 "TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA256" +# define TLS1_RFC_RSA_WITH_CAMELLIA_256_CBC_SHA256 "TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256" +# define TLS1_RFC_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256 "TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256" +# define TLS1_RFC_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 "TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256" +# define TLS1_RFC_ADH_WITH_CAMELLIA_256_CBC_SHA256 "TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA256" +# define TLS1_RFC_RSA_WITH_CAMELLIA_256_CBC_SHA "TLS_RSA_WITH_CAMELLIA_256_CBC_SHA" +# define TLS1_RFC_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA "TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA" +# define TLS1_RFC_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA "TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA" +# define TLS1_RFC_ADH_WITH_CAMELLIA_256_CBC_SHA "TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA" +# define TLS1_RFC_RSA_WITH_CAMELLIA_128_CBC_SHA "TLS_RSA_WITH_CAMELLIA_128_CBC_SHA" +# define TLS1_RFC_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA "TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA" +# define TLS1_RFC_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA "TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA" +# define TLS1_RFC_ADH_WITH_CAMELLIA_128_CBC_SHA "TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA" +# define TLS1_RFC_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 "TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256" +# define TLS1_RFC_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 "TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384" +# define TLS1_RFC_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 "TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256" +# define TLS1_RFC_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384 "TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384" +# define TLS1_RFC_PSK_WITH_CAMELLIA_128_CBC_SHA256 "TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256" +# define TLS1_RFC_PSK_WITH_CAMELLIA_256_CBC_SHA384 "TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384" +# define TLS1_RFC_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 "TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256" +# define TLS1_RFC_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 "TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384" +# define TLS1_RFC_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256 "TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256" +# define TLS1_RFC_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384 "TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384" +# define TLS1_RFC_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 "TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256" +# define TLS1_RFC_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 "TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384" +# define TLS1_RFC_RSA_WITH_SEED_SHA "TLS_RSA_WITH_SEED_CBC_SHA" +# define TLS1_RFC_DHE_DSS_WITH_SEED_SHA "TLS_DHE_DSS_WITH_SEED_CBC_SHA" +# define TLS1_RFC_DHE_RSA_WITH_SEED_SHA "TLS_DHE_RSA_WITH_SEED_CBC_SHA" +# define TLS1_RFC_ADH_WITH_SEED_SHA "TLS_DH_anon_WITH_SEED_CBC_SHA" +# define TLS1_RFC_ECDHE_PSK_WITH_RC4_128_SHA "TLS_ECDHE_PSK_WITH_RC4_128_SHA" +# define TLS1_RFC_ECDH_anon_WITH_RC4_128_SHA "TLS_ECDH_anon_WITH_RC4_128_SHA" +# define TLS1_RFC_ECDHE_ECDSA_WITH_RC4_128_SHA "TLS_ECDHE_ECDSA_WITH_RC4_128_SHA" +# define TLS1_RFC_ECDHE_RSA_WITH_RC4_128_SHA "TLS_ECDHE_RSA_WITH_RC4_128_SHA" +# define TLS1_RFC_PSK_WITH_RC4_128_SHA "TLS_PSK_WITH_RC4_128_SHA" +# define TLS1_RFC_RSA_PSK_WITH_RC4_128_SHA "TLS_RSA_PSK_WITH_RC4_128_SHA" +# define TLS1_RFC_DHE_PSK_WITH_RC4_128_SHA "TLS_DHE_PSK_WITH_RC4_128_SHA" +# define TLS1_RFC_RSA_WITH_ARIA_128_GCM_SHA256 "TLS_RSA_WITH_ARIA_128_GCM_SHA256" +# define TLS1_RFC_RSA_WITH_ARIA_256_GCM_SHA384 "TLS_RSA_WITH_ARIA_256_GCM_SHA384" +# define TLS1_RFC_DHE_RSA_WITH_ARIA_128_GCM_SHA256 "TLS_DHE_RSA_WITH_ARIA_128_GCM_SHA256" +# define TLS1_RFC_DHE_RSA_WITH_ARIA_256_GCM_SHA384 "TLS_DHE_RSA_WITH_ARIA_256_GCM_SHA384" +# define TLS1_RFC_DH_RSA_WITH_ARIA_128_GCM_SHA256 "TLS_DH_RSA_WITH_ARIA_128_GCM_SHA256" +# define TLS1_RFC_DH_RSA_WITH_ARIA_256_GCM_SHA384 "TLS_DH_RSA_WITH_ARIA_256_GCM_SHA384" +# define TLS1_RFC_DHE_DSS_WITH_ARIA_128_GCM_SHA256 "TLS_DHE_DSS_WITH_ARIA_128_GCM_SHA256" +# define TLS1_RFC_DHE_DSS_WITH_ARIA_256_GCM_SHA384 "TLS_DHE_DSS_WITH_ARIA_256_GCM_SHA384" +# define TLS1_RFC_DH_DSS_WITH_ARIA_128_GCM_SHA256 "TLS_DH_DSS_WITH_ARIA_128_GCM_SHA256" +# define TLS1_RFC_DH_DSS_WITH_ARIA_256_GCM_SHA384 "TLS_DH_DSS_WITH_ARIA_256_GCM_SHA384" +# define TLS1_RFC_DH_anon_WITH_ARIA_128_GCM_SHA256 "TLS_DH_anon_WITH_ARIA_128_GCM_SHA256" +# define TLS1_RFC_DH_anon_WITH_ARIA_256_GCM_SHA384 "TLS_DH_anon_WITH_ARIA_256_GCM_SHA384" +# define TLS1_RFC_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256 "TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256" +# define TLS1_RFC_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384 "TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384" +# define TLS1_RFC_ECDH_ECDSA_WITH_ARIA_128_GCM_SHA256 "TLS_ECDH_ECDSA_WITH_ARIA_128_GCM_SHA256" +# define TLS1_RFC_ECDH_ECDSA_WITH_ARIA_256_GCM_SHA384 "TLS_ECDH_ECDSA_WITH_ARIA_256_GCM_SHA384" +# define TLS1_RFC_ECDHE_RSA_WITH_ARIA_128_GCM_SHA256 "TLS_ECDHE_RSA_WITH_ARIA_128_GCM_SHA256" +# define TLS1_RFC_ECDHE_RSA_WITH_ARIA_256_GCM_SHA384 "TLS_ECDHE_RSA_WITH_ARIA_256_GCM_SHA384" +# define TLS1_RFC_ECDH_RSA_WITH_ARIA_128_GCM_SHA256 "TLS_ECDH_RSA_WITH_ARIA_128_GCM_SHA256" +# define TLS1_RFC_ECDH_RSA_WITH_ARIA_256_GCM_SHA384 "TLS_ECDH_RSA_WITH_ARIA_256_GCM_SHA384" +# define TLS1_RFC_PSK_WITH_ARIA_128_GCM_SHA256 "TLS_PSK_WITH_ARIA_128_GCM_SHA256" +# define TLS1_RFC_PSK_WITH_ARIA_256_GCM_SHA384 "TLS_PSK_WITH_ARIA_256_GCM_SHA384" +# define TLS1_RFC_DHE_PSK_WITH_ARIA_128_GCM_SHA256 "TLS_DHE_PSK_WITH_ARIA_128_GCM_SHA256" +# define TLS1_RFC_DHE_PSK_WITH_ARIA_256_GCM_SHA384 "TLS_DHE_PSK_WITH_ARIA_256_GCM_SHA384" +# define TLS1_RFC_RSA_PSK_WITH_ARIA_128_GCM_SHA256 "TLS_RSA_PSK_WITH_ARIA_128_GCM_SHA256" +# define TLS1_RFC_RSA_PSK_WITH_ARIA_256_GCM_SHA384 "TLS_RSA_PSK_WITH_ARIA_256_GCM_SHA384" + + +/* + * XXX Backward compatibility alert: Older versions of OpenSSL gave some DHE + * ciphers names with "EDH" instead of "DHE". Going forward, we should be + * using DHE everywhere, though we may indefinitely maintain aliases for + * users or configurations that used "EDH" + */ +# define TLS1_TXT_DHE_DSS_WITH_RC4_128_SHA "DHE-DSS-RC4-SHA" + +# define TLS1_TXT_PSK_WITH_NULL_SHA "PSK-NULL-SHA" +# define TLS1_TXT_DHE_PSK_WITH_NULL_SHA "DHE-PSK-NULL-SHA" +# define TLS1_TXT_RSA_PSK_WITH_NULL_SHA "RSA-PSK-NULL-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 RFC4492 */ +# 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" + +# define TLS1_TXT_DHE_PSK_WITH_RC4_128_SHA "DHE-PSK-RC4-SHA" +# define TLS1_TXT_DHE_PSK_WITH_3DES_EDE_CBC_SHA "DHE-PSK-3DES-EDE-CBC-SHA" +# define TLS1_TXT_DHE_PSK_WITH_AES_128_CBC_SHA "DHE-PSK-AES128-CBC-SHA" +# define TLS1_TXT_DHE_PSK_WITH_AES_256_CBC_SHA "DHE-PSK-AES256-CBC-SHA" +# define TLS1_TXT_RSA_PSK_WITH_RC4_128_SHA "RSA-PSK-RC4-SHA" +# define TLS1_TXT_RSA_PSK_WITH_3DES_EDE_CBC_SHA "RSA-PSK-3DES-EDE-CBC-SHA" +# define TLS1_TXT_RSA_PSK_WITH_AES_128_CBC_SHA "RSA-PSK-AES128-CBC-SHA" +# define TLS1_TXT_RSA_PSK_WITH_AES_256_CBC_SHA "RSA-PSK-AES256-CBC-SHA" + +/* PSK ciphersuites from RFC 5487 */ +# define TLS1_TXT_PSK_WITH_AES_128_GCM_SHA256 "PSK-AES128-GCM-SHA256" +# define TLS1_TXT_PSK_WITH_AES_256_GCM_SHA384 "PSK-AES256-GCM-SHA384" +# define TLS1_TXT_DHE_PSK_WITH_AES_128_GCM_SHA256 "DHE-PSK-AES128-GCM-SHA256" +# define TLS1_TXT_DHE_PSK_WITH_AES_256_GCM_SHA384 "DHE-PSK-AES256-GCM-SHA384" +# define TLS1_TXT_RSA_PSK_WITH_AES_128_GCM_SHA256 "RSA-PSK-AES128-GCM-SHA256" +# define TLS1_TXT_RSA_PSK_WITH_AES_256_GCM_SHA384 "RSA-PSK-AES256-GCM-SHA384" + +# define TLS1_TXT_PSK_WITH_AES_128_CBC_SHA256 "PSK-AES128-CBC-SHA256" +# define TLS1_TXT_PSK_WITH_AES_256_CBC_SHA384 "PSK-AES256-CBC-SHA384" +# define TLS1_TXT_PSK_WITH_NULL_SHA256 "PSK-NULL-SHA256" +# define TLS1_TXT_PSK_WITH_NULL_SHA384 "PSK-NULL-SHA384" + +# define TLS1_TXT_DHE_PSK_WITH_AES_128_CBC_SHA256 "DHE-PSK-AES128-CBC-SHA256" +# define TLS1_TXT_DHE_PSK_WITH_AES_256_CBC_SHA384 "DHE-PSK-AES256-CBC-SHA384" +# define TLS1_TXT_DHE_PSK_WITH_NULL_SHA256 "DHE-PSK-NULL-SHA256" +# define TLS1_TXT_DHE_PSK_WITH_NULL_SHA384 "DHE-PSK-NULL-SHA384" + +# define TLS1_TXT_RSA_PSK_WITH_AES_128_CBC_SHA256 "RSA-PSK-AES128-CBC-SHA256" +# define TLS1_TXT_RSA_PSK_WITH_AES_256_CBC_SHA384 "RSA-PSK-AES256-CBC-SHA384" +# define TLS1_TXT_RSA_PSK_WITH_NULL_SHA256 "RSA-PSK-NULL-SHA256" +# define TLS1_TXT_RSA_PSK_WITH_NULL_SHA384 "RSA-PSK-NULL-SHA384" + +/* 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" + +/* TLS 1.2 Camellia SHA-256 ciphersuites from RFC5932 */ +# define TLS1_TXT_RSA_WITH_CAMELLIA_128_CBC_SHA256 "CAMELLIA128-SHA256" +# define TLS1_TXT_DH_DSS_WITH_CAMELLIA_128_CBC_SHA256 "DH-DSS-CAMELLIA128-SHA256" +# define TLS1_TXT_DH_RSA_WITH_CAMELLIA_128_CBC_SHA256 "DH-RSA-CAMELLIA128-SHA256" +# define TLS1_TXT_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256 "DHE-DSS-CAMELLIA128-SHA256" +# define TLS1_TXT_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 "DHE-RSA-CAMELLIA128-SHA256" +# define TLS1_TXT_ADH_WITH_CAMELLIA_128_CBC_SHA256 "ADH-CAMELLIA128-SHA256" + +# define TLS1_TXT_RSA_WITH_CAMELLIA_256_CBC_SHA256 "CAMELLIA256-SHA256" +# define TLS1_TXT_DH_DSS_WITH_CAMELLIA_256_CBC_SHA256 "DH-DSS-CAMELLIA256-SHA256" +# define TLS1_TXT_DH_RSA_WITH_CAMELLIA_256_CBC_SHA256 "DH-RSA-CAMELLIA256-SHA256" +# define TLS1_TXT_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256 "DHE-DSS-CAMELLIA256-SHA256" +# define TLS1_TXT_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 "DHE-RSA-CAMELLIA256-SHA256" +# define TLS1_TXT_ADH_WITH_CAMELLIA_256_CBC_SHA256 "ADH-CAMELLIA256-SHA256" + +# define TLS1_TXT_PSK_WITH_CAMELLIA_128_CBC_SHA256 "PSK-CAMELLIA128-SHA256" +# define TLS1_TXT_PSK_WITH_CAMELLIA_256_CBC_SHA384 "PSK-CAMELLIA256-SHA384" +# define TLS1_TXT_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 "DHE-PSK-CAMELLIA128-SHA256" +# define TLS1_TXT_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 "DHE-PSK-CAMELLIA256-SHA384" +# define TLS1_TXT_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256 "RSA-PSK-CAMELLIA128-SHA256" +# define TLS1_TXT_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384 "RSA-PSK-CAMELLIA256-SHA384" +# define TLS1_TXT_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 "ECDHE-PSK-CAMELLIA128-SHA256" +# define TLS1_TXT_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 "ECDHE-PSK-CAMELLIA256-SHA384" + +/* 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" + +/* CCM ciphersuites from RFC6655 */ +# define TLS1_TXT_RSA_WITH_AES_128_CCM "AES128-CCM" +# define TLS1_TXT_RSA_WITH_AES_256_CCM "AES256-CCM" +# define TLS1_TXT_DHE_RSA_WITH_AES_128_CCM "DHE-RSA-AES128-CCM" +# define TLS1_TXT_DHE_RSA_WITH_AES_256_CCM "DHE-RSA-AES256-CCM" + +# define TLS1_TXT_RSA_WITH_AES_128_CCM_8 "AES128-CCM8" +# define TLS1_TXT_RSA_WITH_AES_256_CCM_8 "AES256-CCM8" +# define TLS1_TXT_DHE_RSA_WITH_AES_128_CCM_8 "DHE-RSA-AES128-CCM8" +# define TLS1_TXT_DHE_RSA_WITH_AES_256_CCM_8 "DHE-RSA-AES256-CCM8" + +# define TLS1_TXT_PSK_WITH_AES_128_CCM "PSK-AES128-CCM" +# define TLS1_TXT_PSK_WITH_AES_256_CCM "PSK-AES256-CCM" +# define TLS1_TXT_DHE_PSK_WITH_AES_128_CCM "DHE-PSK-AES128-CCM" +# define TLS1_TXT_DHE_PSK_WITH_AES_256_CCM "DHE-PSK-AES256-CCM" + +# define TLS1_TXT_PSK_WITH_AES_128_CCM_8 "PSK-AES128-CCM8" +# define TLS1_TXT_PSK_WITH_AES_256_CCM_8 "PSK-AES256-CCM8" +# define TLS1_TXT_DHE_PSK_WITH_AES_128_CCM_8 "DHE-PSK-AES128-CCM8" +# define TLS1_TXT_DHE_PSK_WITH_AES_256_CCM_8 "DHE-PSK-AES256-CCM8" + +/* CCM ciphersuites from RFC7251 */ +# define TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_CCM "ECDHE-ECDSA-AES128-CCM" +# define TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_CCM "ECDHE-ECDSA-AES256-CCM" +# define TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_CCM_8 "ECDHE-ECDSA-AES128-CCM8" +# define TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_CCM_8 "ECDHE-ECDSA-AES256-CCM8" + +/* 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" + +/* TLS v1.2 PSK GCM ciphersuites from RFC5487 */ +# define TLS1_TXT_PSK_WITH_AES_128_GCM_SHA256 "PSK-AES128-GCM-SHA256" +# define TLS1_TXT_PSK_WITH_AES_256_GCM_SHA384 "PSK-AES256-GCM-SHA384" + +/* ECDHE PSK ciphersuites from RFC 5489 */ +# define TLS1_TXT_ECDHE_PSK_WITH_RC4_128_SHA "ECDHE-PSK-RC4-SHA" +# define TLS1_TXT_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA "ECDHE-PSK-3DES-EDE-CBC-SHA" +# define TLS1_TXT_ECDHE_PSK_WITH_AES_128_CBC_SHA "ECDHE-PSK-AES128-CBC-SHA" +# define TLS1_TXT_ECDHE_PSK_WITH_AES_256_CBC_SHA "ECDHE-PSK-AES256-CBC-SHA" + +# define TLS1_TXT_ECDHE_PSK_WITH_AES_128_CBC_SHA256 "ECDHE-PSK-AES128-CBC-SHA256" +# define TLS1_TXT_ECDHE_PSK_WITH_AES_256_CBC_SHA384 "ECDHE-PSK-AES256-CBC-SHA384" + +# define TLS1_TXT_ECDHE_PSK_WITH_NULL_SHA "ECDHE-PSK-NULL-SHA" +# define TLS1_TXT_ECDHE_PSK_WITH_NULL_SHA256 "ECDHE-PSK-NULL-SHA256" +# define TLS1_TXT_ECDHE_PSK_WITH_NULL_SHA384 "ECDHE-PSK-NULL-SHA384" + +/* Camellia-CBC ciphersuites from RFC6367 */ +# define TLS1_TXT_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 "ECDHE-ECDSA-CAMELLIA128-SHA256" +# define TLS1_TXT_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 "ECDHE-ECDSA-CAMELLIA256-SHA384" +# define TLS1_TXT_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 "ECDH-ECDSA-CAMELLIA128-SHA256" +# define TLS1_TXT_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 "ECDH-ECDSA-CAMELLIA256-SHA384" +# define TLS1_TXT_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 "ECDHE-RSA-CAMELLIA128-SHA256" +# define TLS1_TXT_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384 "ECDHE-RSA-CAMELLIA256-SHA384" +# define TLS1_TXT_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256 "ECDH-RSA-CAMELLIA128-SHA256" +# define TLS1_TXT_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384 "ECDH-RSA-CAMELLIA256-SHA384" + +/* draft-ietf-tls-chacha20-poly1305-03 */ +# define TLS1_TXT_ECDHE_RSA_WITH_CHACHA20_POLY1305 "ECDHE-RSA-CHACHA20-POLY1305" +# define TLS1_TXT_ECDHE_ECDSA_WITH_CHACHA20_POLY1305 "ECDHE-ECDSA-CHACHA20-POLY1305" +# define TLS1_TXT_DHE_RSA_WITH_CHACHA20_POLY1305 "DHE-RSA-CHACHA20-POLY1305" +# define TLS1_TXT_PSK_WITH_CHACHA20_POLY1305 "PSK-CHACHA20-POLY1305" +# define TLS1_TXT_ECDHE_PSK_WITH_CHACHA20_POLY1305 "ECDHE-PSK-CHACHA20-POLY1305" +# define TLS1_TXT_DHE_PSK_WITH_CHACHA20_POLY1305 "DHE-PSK-CHACHA20-POLY1305" +# define TLS1_TXT_RSA_PSK_WITH_CHACHA20_POLY1305 "RSA-PSK-CHACHA20-POLY1305" + +/* Aria ciphersuites from RFC6209 */ +# define TLS1_TXT_RSA_WITH_ARIA_128_GCM_SHA256 "ARIA128-GCM-SHA256" +# define TLS1_TXT_RSA_WITH_ARIA_256_GCM_SHA384 "ARIA256-GCM-SHA384" +# define TLS1_TXT_DHE_RSA_WITH_ARIA_128_GCM_SHA256 "DHE-RSA-ARIA128-GCM-SHA256" +# define TLS1_TXT_DHE_RSA_WITH_ARIA_256_GCM_SHA384 "DHE-RSA-ARIA256-GCM-SHA384" +# define TLS1_TXT_DH_RSA_WITH_ARIA_128_GCM_SHA256 "DH-RSA-ARIA128-GCM-SHA256" +# define TLS1_TXT_DH_RSA_WITH_ARIA_256_GCM_SHA384 "DH-RSA-ARIA256-GCM-SHA384" +# define TLS1_TXT_DHE_DSS_WITH_ARIA_128_GCM_SHA256 "DHE-DSS-ARIA128-GCM-SHA256" +# define TLS1_TXT_DHE_DSS_WITH_ARIA_256_GCM_SHA384 "DHE-DSS-ARIA256-GCM-SHA384" +# define TLS1_TXT_DH_DSS_WITH_ARIA_128_GCM_SHA256 "DH-DSS-ARIA128-GCM-SHA256" +# define TLS1_TXT_DH_DSS_WITH_ARIA_256_GCM_SHA384 "DH-DSS-ARIA256-GCM-SHA384" +# define TLS1_TXT_DH_anon_WITH_ARIA_128_GCM_SHA256 "ADH-ARIA128-GCM-SHA256" +# define TLS1_TXT_DH_anon_WITH_ARIA_256_GCM_SHA384 "ADH-ARIA256-GCM-SHA384" +# define TLS1_TXT_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256 "ECDHE-ECDSA-ARIA128-GCM-SHA256" +# define TLS1_TXT_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384 "ECDHE-ECDSA-ARIA256-GCM-SHA384" +# define TLS1_TXT_ECDH_ECDSA_WITH_ARIA_128_GCM_SHA256 "ECDH-ECDSA-ARIA128-GCM-SHA256" +# define TLS1_TXT_ECDH_ECDSA_WITH_ARIA_256_GCM_SHA384 "ECDH-ECDSA-ARIA256-GCM-SHA384" +# define TLS1_TXT_ECDHE_RSA_WITH_ARIA_128_GCM_SHA256 "ECDHE-ARIA128-GCM-SHA256" +# define TLS1_TXT_ECDHE_RSA_WITH_ARIA_256_GCM_SHA384 "ECDHE-ARIA256-GCM-SHA384" +# define TLS1_TXT_ECDH_RSA_WITH_ARIA_128_GCM_SHA256 "ECDH-ARIA128-GCM-SHA256" +# define TLS1_TXT_ECDH_RSA_WITH_ARIA_256_GCM_SHA384 "ECDH-ARIA256-GCM-SHA384" +# define TLS1_TXT_PSK_WITH_ARIA_128_GCM_SHA256 "PSK-ARIA128-GCM-SHA256" +# define TLS1_TXT_PSK_WITH_ARIA_256_GCM_SHA384 "PSK-ARIA256-GCM-SHA384" +# define TLS1_TXT_DHE_PSK_WITH_ARIA_128_GCM_SHA256 "DHE-PSK-ARIA128-GCM-SHA256" +# define TLS1_TXT_DHE_PSK_WITH_ARIA_256_GCM_SHA384 "DHE-PSK-ARIA256-GCM-SHA384" +# define TLS1_TXT_RSA_PSK_WITH_ARIA_128_GCM_SHA256 "RSA-PSK-ARIA128-GCM-SHA256" +# define TLS1_TXT_RSA_PSK_WITH_ARIA_256_GCM_SHA384 "RSA-PSK-ARIA256-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_GOST01_SIGN 22 +# define TLS_CT_GOST12_SIGN 238 +# define TLS_CT_GOST12_512_SIGN 239 + +/* + * when correcting this number, correct also SSL3_CT_NUMBER in ssl3.h (see + * comment there) + */ +# define TLS_CT_NUMBER 10 + +# if defined(SSL3_CT_NUMBER) +# if TLS_CT_NUMBER != SSL3_CT_NUMBER +# error "SSL/TLS CT_NUMBER values do not match" +# endif +# endif + +# define TLS1_FINISH_MAC_LENGTH 12 + +# define TLS_MD_MAX_CONST_SIZE 22 +# 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_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 +# define TLS_MD_EXTENDED_MASTER_SECRET_CONST "extended master secret" +# define TLS_MD_EXTENDED_MASTER_SECRET_CONST_SIZE 22 + +# ifdef CHARSET_EBCDIC +# undef TLS_MD_CLIENT_FINISH_CONST +/* + * client finished + */ +# define TLS_MD_CLIENT_FINISH_CONST "\x63\x6c\x69\x65\x6e\x74\x20\x66\x69\x6e\x69\x73\x68\x65\x64" + +# undef TLS_MD_SERVER_FINISH_CONST +/* + * server finished + */ +# define TLS_MD_SERVER_FINISH_CONST "\x73\x65\x72\x76\x65\x72\x20\x66\x69\x6e\x69\x73\x68\x65\x64" + +# undef TLS_MD_SERVER_WRITE_KEY_CONST +/* + * server write key + */ +# define TLS_MD_SERVER_WRITE_KEY_CONST "\x73\x65\x72\x76\x65\x72\x20\x77\x72\x69\x74\x65\x20\x6b\x65\x79" + +# undef TLS_MD_KEY_EXPANSION_CONST +/* + * key expansion + */ +# define TLS_MD_KEY_EXPANSION_CONST "\x6b\x65\x79\x20\x65\x78\x70\x61\x6e\x73\x69\x6f\x6e" + +# undef TLS_MD_CLIENT_WRITE_KEY_CONST +/* + * client write key + */ +# define TLS_MD_CLIENT_WRITE_KEY_CONST "\x63\x6c\x69\x65\x6e\x74\x20\x77\x72\x69\x74\x65\x20\x6b\x65\x79" + +# undef TLS_MD_SERVER_WRITE_KEY_CONST +/* + * server write key + */ +# define TLS_MD_SERVER_WRITE_KEY_CONST "\x73\x65\x72\x76\x65\x72\x20\x77\x72\x69\x74\x65\x20\x6b\x65\x79" + +# undef TLS_MD_IV_BLOCK_CONST +/* + * IV block + */ +# define TLS_MD_IV_BLOCK_CONST "\x49\x56\x20\x62\x6c\x6f\x63\x6b" + +# undef TLS_MD_MASTER_SECRET_CONST +/* + * master secret + */ +# define TLS_MD_MASTER_SECRET_CONST "\x6d\x61\x73\x74\x65\x72\x20\x73\x65\x63\x72\x65\x74" +# undef TLS_MD_EXTENDED_MASTER_SECRET_CONST +/* + * extended master secret + */ +# define TLS_MD_EXTENDED_MASTER_SECRET_CONST "\x65\x78\x74\x65\x6e\x64\x65\x64\x20\x6d\x61\x73\x74\x65\x72\x20\x73\x65\x63\x72\x65\x74" +# endif + +/* TLS Session Ticket extension struct */ +struct tls_session_ticket_ext_st { + unsigned short length; + void *data; +}; + +#ifdef __cplusplus +} +#endif +#endif diff --git a/openssl-wasm/include/openssl/ts.h b/openssl-wasm/include/openssl/ts.h new file mode 100644 index 0000000..3b58aa5 --- /dev/null +++ b/openssl-wasm/include/openssl/ts.h @@ -0,0 +1,559 @@ +/* + * Copyright 2006-2018 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_TS_H +# define HEADER_TS_H + +# include + +# ifndef OPENSSL_NO_TS +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# ifdef __cplusplus +extern "C" { +# endif + +# include +# include + +typedef struct TS_msg_imprint_st TS_MSG_IMPRINT; +typedef struct TS_req_st TS_REQ; +typedef struct TS_accuracy_st TS_ACCURACY; +typedef struct TS_tst_info_st TS_TST_INFO; + +/* Possible values for status. */ +# 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. */ +# 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 TS_STATUS_INFO; +typedef struct ESS_issuer_serial ESS_ISSUER_SERIAL; +typedef struct ESS_cert_id ESS_CERT_ID; +typedef struct ESS_signing_cert ESS_SIGNING_CERT; + +DEFINE_STACK_OF(ESS_CERT_ID) + +typedef struct ESS_cert_id_v2_st ESS_CERT_ID_V2; +typedef struct ESS_signing_cert_v2_st ESS_SIGNING_CERT_V2; + +DEFINE_STACK_OF(ESS_CERT_ID_V2) + +typedef struct TS_resp_st TS_RESP; + +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); + +#ifndef OPENSSL_NO_STDIO +TS_REQ *d2i_TS_REQ_fp(FILE *fp, TS_REQ **a); +int i2d_TS_REQ_fp(FILE *fp, TS_REQ *a); +#endif +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); + +#ifndef OPENSSL_NO_STDIO +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); +#endif +TS_MSG_IMPRINT *d2i_TS_MSG_IMPRINT_bio(BIO *bio, TS_MSG_IMPRINT **a); +int i2d_TS_MSG_IMPRINT_bio(BIO *bio, 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); + +#ifndef OPENSSL_NO_STDIO +TS_RESP *d2i_TS_RESP_fp(FILE *fp, TS_RESP **a); +int i2d_TS_RESP_fp(FILE *fp, TS_RESP *a); +#endif +TS_RESP *d2i_TS_RESP_bio(BIO *bio, TS_RESP **a); +int i2d_TS_RESP_bio(BIO *bio, 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); + +#ifndef OPENSSL_NO_STDIO +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); +#endif +TS_TST_INFO *d2i_TS_TST_INFO_bio(BIO *bio, TS_TST_INFO **a); +int i2d_TS_TST_INFO_bio(BIO *bio, 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); + +ESS_CERT_ID_V2 *ESS_CERT_ID_V2_new(void); +void ESS_CERT_ID_V2_free(ESS_CERT_ID_V2 *a); +int i2d_ESS_CERT_ID_V2(const ESS_CERT_ID_V2 *a, unsigned char **pp); +ESS_CERT_ID_V2 *d2i_ESS_CERT_ID_V2(ESS_CERT_ID_V2 **a, + const unsigned char **pp, long length); +ESS_CERT_ID_V2 *ESS_CERT_ID_V2_dup(ESS_CERT_ID_V2 *a); + +ESS_SIGNING_CERT_V2 *ESS_SIGNING_CERT_V2_new(void); +void ESS_SIGNING_CERT_V2_free(ESS_SIGNING_CERT_V2 *a); +int i2d_ESS_SIGNING_CERT_V2(const ESS_SIGNING_CERT_V2 *a, unsigned char **pp); +ESS_SIGNING_CERT_V2 *d2i_ESS_SIGNING_CERT_V2(ESS_SIGNING_CERT_V2 **a, + const unsigned char **pp, + long length); +ESS_SIGNING_CERT_V2 *ESS_SIGNING_CERT_V2_dup(ESS_SIGNING_CERT_V2 *a); + +int TS_REQ_set_version(TS_REQ *a, long version); +long TS_REQ_get_version(const TS_REQ *a); + +int TS_STATUS_INFO_set_status(TS_STATUS_INFO *a, int i); +const ASN1_INTEGER *TS_STATUS_INFO_get0_status(const TS_STATUS_INFO *a); + +const STACK_OF(ASN1_UTF8STRING) * +TS_STATUS_INFO_get0_text(const TS_STATUS_INFO *a); + +const ASN1_BIT_STRING * +TS_STATUS_INFO_get0_failure_info(const TS_STATUS_INFO *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, const 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, const 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, const 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 TS_RESP_CTX; + +DEFINE_STACK_OF_CONST(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); + +int TS_RESP_CTX_set_signer_digest(TS_RESP_CTX *ctx, + const EVP_MD *signer_digest); +int TS_RESP_CTX_set_ess_cert_id_digest(TS_RESP_CTX *ctx, const EVP_MD *md); + +/* This parameter must be set. */ +int TS_RESP_CTX_set_def_policy(TS_RESP_CTX *ctx, const 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, const 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 + +/* Maximum status message length */ +# define TS_MAX_STATUS_LENGTH (1024 * 1024) + +/* 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 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, + */ +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); +int TS_VERIFY_CTX_set_flags(TS_VERIFY_CTX *ctx, int f); +int TS_VERIFY_CTX_add_flags(TS_VERIFY_CTX *ctx, int f); +BIO *TS_VERIFY_CTX_set_data(TS_VERIFY_CTX *ctx, BIO *b); +unsigned char *TS_VERIFY_CTX_set_imprint(TS_VERIFY_CTX *ctx, + unsigned char *hexstr, long len); +X509_STORE *TS_VERIFY_CTX_set_store(TS_VERIFY_CTX *ctx, X509_STORE *s); +STACK_OF(X509) *TS_VERIFY_CTS_set_certs(TS_VERIFY_CTX *ctx, STACK_OF(X509) *certs); + +/*- + * 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); +#ifndef OPENSSL_NO_ENGINE +int TS_CONF_set_crypto_device(CONF *conf, const char *section, + const char *device); +int TS_CONF_set_default_engine(const char *name); +#endif +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_signer_digest(CONF *conf, const char *section, + const char *md, 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); +int TS_CONF_set_ess_cert_id_digest(CONF *conf, const char *section, + TS_RESP_CTX *ctx); + +# ifdef __cplusplus +} +# endif +# endif +#endif diff --git a/openssl-wasm/include/openssl/tserr.h b/openssl-wasm/include/openssl/tserr.h new file mode 100644 index 0000000..07f2333 --- /dev/null +++ b/openssl-wasm/include/openssl/tserr.h @@ -0,0 +1,132 @@ +/* + * Generated by util/mkerr.pl DO NOT EDIT + * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_TSERR_H +# define HEADER_TSERR_H + +# ifndef HEADER_SYMHACKS_H +# include +# endif + +# include + +# ifndef OPENSSL_NO_TS + +# ifdef __cplusplus +extern "C" +# endif +int ERR_load_TS_strings(void); + +/* + * TS function codes. + */ +# 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_ADD_SIGNING_CERT_V2 147 +# define TS_F_ESS_CERT_ID_NEW_INIT 113 +# define TS_F_ESS_CERT_ID_V2_NEW_INIT 156 +# define TS_F_ESS_SIGNING_CERT_NEW_INIT 114 +# define TS_F_ESS_SIGNING_CERT_V2_NEW_INIT 157 +# 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_INVALID 151 +# define TS_F_TS_CONF_LOAD_CERT 153 +# define TS_F_TS_CONF_LOAD_CERTS 154 +# define TS_F_TS_CONF_LOAD_KEY 155 +# define TS_F_TS_CONF_LOOKUP_FAIL 152 +# 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_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 + +/* + * TS reason codes. + */ +# define TS_R_BAD_PKCS7_TYPE 132 +# define TS_R_BAD_TYPE 133 +# define TS_R_CANNOT_LOAD_CERT 137 +# define TS_R_CANNOT_LOAD_KEY 138 +# 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_DETACHED_CONTENT 134 +# define TS_R_ESS_ADD_SIGNING_CERT_ERROR 116 +# define TS_R_ESS_ADD_SIGNING_CERT_V2_ERROR 139 +# 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_VAR_BAD_VALUE 135 +# define TS_R_VAR_LOOKUP_FAILURE 136 +# define TS_R_WRONG_CONTENT_TYPE 114 + +# endif +#endif diff --git a/openssl-wasm/include/openssl/txt_db.h b/openssl-wasm/include/openssl/txt_db.h new file mode 100644 index 0000000..ec981a4 --- /dev/null +++ b/openssl-wasm/include/openssl/txt_db.h @@ -0,0 +1,57 @@ +/* + * Copyright 1995-2017 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_TXT_DB_H +# define HEADER_TXT_DB_H + +# include +# include +# 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 +# define DB_ERROR_WRONG_NUM_FIELDS 6 + +#ifdef __cplusplus +extern "C" { +#endif + +typedef OPENSSL_STRING *OPENSSL_PSTRING; +DEFINE_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; + +TXT_DB *TXT_DB_read(BIO *in, int num); +long TXT_DB_write(BIO *out, TXT_DB *db); +int TXT_DB_create_index(TXT_DB *db, int field, int (*qual) (OPENSSL_STRING *), + OPENSSL_LH_HASHFUNC hash, OPENSSL_LH_COMPFUNC 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/openssl-wasm/include/openssl/ui.h b/openssl-wasm/include/openssl/ui.h new file mode 100644 index 0000000..7c721ec --- /dev/null +++ b/openssl-wasm/include/openssl/ui.h @@ -0,0 +1,368 @@ +/* + * Copyright 2001-2018 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_UI_H +# define HEADER_UI_H + +# include + +# if OPENSSL_API_COMPAT < 0x10100000L +# include +# endif +# include +# include +# include +# include + +/* For compatibility reasons, the macro OPENSSL_NO_UI is currently retained */ +# if OPENSSL_API_COMPAT < 0x10200000L +# ifdef OPENSSL_NO_UI_CONSOLE +# define OPENSSL_NO_UI +# endif +# endif + +# ifdef __cplusplus +extern "C" { +# endif + +/* + * 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 useful 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); +/* + * Alternatively, this function is used to duplicate the user data. + * This uses the duplicator method function. The destroy function will + * be used to free the user data in this case. + */ +int UI_dup_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); +int UI_get_result_length(UI *ui, int i); + +/* When all strings have been added, process the whole thing. */ +int UI_process(UI *ui); + +/* + * Give a user interface parameterised 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) + +# define UI_get_ex_new_index(l, p, newf, dupf, freef) \ + CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_UI, l, p, newf, dupf, freef) +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); + +# ifndef OPENSSL_NO_UI_CONSOLE + +/* The method with all the built-in thingies */ +UI_METHOD *UI_OpenSSL(void); + +# endif + +/* + * NULL method. Literally does nothing, but may serve as a placeholder + * to avoid internal default. + */ +const UI_METHOD *UI_null(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 with 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; +DEFINE_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(const 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_data_duplicator(UI_METHOD *method, + void *(*duplicator) (UI *ui, void *ui_data), + void (*destructor)(UI *ui, void *ui_data)); +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_set_ex_data(UI_METHOD *method, int idx, void *data); +int (*UI_method_get_opener(const UI_METHOD *method)) (UI *); +int (*UI_method_get_writer(const UI_METHOD *method)) (UI *, UI_STRING *); +int (*UI_method_get_flusher(const UI_METHOD *method)) (UI *); +int (*UI_method_get_reader(const UI_METHOD *method)) (UI *, UI_STRING *); +int (*UI_method_get_closer(const UI_METHOD *method)) (UI *); +char *(*UI_method_get_prompt_constructor(const UI_METHOD *method)) + (UI *, const char *, const char *); +void *(*UI_method_get_data_duplicator(const UI_METHOD *method)) (UI *, void *); +void (*UI_method_get_data_destructor(const UI_METHOD *method)) (UI *, void *); +const void *UI_method_get_ex_data(const UI_METHOD *method, int idx); + +/* + * 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 prompt + * 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); +int UI_get_result_string_length(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); +int UI_set_result_ex(UI *ui, UI_STRING *uis, const char *result, int len); + +/* 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); +UI_METHOD *UI_UTIL_wrap_read_pem_callback(pem_password_cb *cb, int rwflag); + + +# ifdef __cplusplus +} +# endif +#endif diff --git a/openssl-wasm/include/openssl/uierr.h b/openssl-wasm/include/openssl/uierr.h new file mode 100644 index 0000000..bd68864 --- /dev/null +++ b/openssl-wasm/include/openssl/uierr.h @@ -0,0 +1,65 @@ +/* + * Generated by util/mkerr.pl DO NOT EDIT + * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_UIERR_H +# define HEADER_UIERR_H + +# ifndef HEADER_SYMHACKS_H +# include +# endif + +# ifdef __cplusplus +extern "C" +# endif +int ERR_load_UI_strings(void); + +/* + * UI function codes. + */ +# define UI_F_CLOSE_CONSOLE 115 +# define UI_F_ECHO_CONSOLE 116 +# define UI_F_GENERAL_ALLOCATE_BOOLEAN 108 +# define UI_F_GENERAL_ALLOCATE_PROMPT 109 +# define UI_F_NOECHO_CONSOLE 117 +# define UI_F_OPEN_CONSOLE 114 +# define UI_F_UI_CONSTRUCT_PROMPT 121 +# define UI_F_UI_CREATE_METHOD 112 +# 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_USER_DATA 118 +# define UI_F_UI_DUP_VERIFY_STRING 106 +# define UI_F_UI_GET0_RESULT 107 +# define UI_F_UI_GET_RESULT_LENGTH 119 +# define UI_F_UI_NEW_METHOD 104 +# define UI_F_UI_PROCESS 113 +# define UI_F_UI_SET_RESULT 105 +# define UI_F_UI_SET_RESULT_EX 120 + +/* + * UI 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_PROCESSING_ERROR 107 +# define UI_R_RESULT_TOO_LARGE 100 +# define UI_R_RESULT_TOO_SMALL 101 +# define UI_R_SYSASSIGN_ERROR 109 +# define UI_R_SYSDASSGN_ERROR 110 +# define UI_R_SYSQIOW_ERROR 111 +# define UI_R_UNKNOWN_CONTROL_COMMAND 106 +# define UI_R_UNKNOWN_TTYGET_ERRNO_VALUE 108 +# define UI_R_USER_DATA_DUPLICATION_UNSUPPORTED 112 + +#endif diff --git a/openssl-wasm/include/openssl/whrlpool.h b/openssl-wasm/include/openssl/whrlpool.h new file mode 100644 index 0000000..20ea350 --- /dev/null +++ b/openssl-wasm/include/openssl/whrlpool.h @@ -0,0 +1,48 @@ +/* + * Copyright 2005-2016 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_WHRLPOOL_H +# define HEADER_WHRLPOOL_H + +#include + +# ifndef OPENSSL_NO_WHIRLPOOL +# 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; + +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); + +# ifdef __cplusplus +} +# endif +# endif + +#endif diff --git a/openssl-wasm/include/openssl/x509.h b/openssl-wasm/include/openssl/x509.h new file mode 100644 index 0000000..3ff86ec --- /dev/null +++ b/openssl-wasm/include/openssl/x509.h @@ -0,0 +1,1050 @@ +/* + * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved. + * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_X509_H +# define HEADER_X509_H + +# include +# include +# include +# include +# include +# include +# include +# include +# include + +# if OPENSSL_API_COMPAT < 0x10100000L +# include +# include +# include +# endif + +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + + +/* Flags for X509_get_signature_info() */ +/* Signature info is valid */ +# define X509_SIG_INFO_VALID 0x1 +/* Signature is suitable for TLS use */ +# define X509_SIG_INFO_TLS 0x2 + +# 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 + +struct X509_algor_st { + ASN1_OBJECT *algorithm; + ASN1_TYPE *parameter; +} /* X509_ALGOR */ ; + +typedef STACK_OF(X509_ALGOR) X509_ALGORS; + +typedef struct X509_val_st { + ASN1_TIME *notBefore; + ASN1_TIME *notAfter; +} X509_VAL; + +typedef struct X509_sig_st X509_SIG; + +typedef struct X509_name_entry_st X509_NAME_ENTRY; + +DEFINE_STACK_OF(X509_NAME_ENTRY) + +DEFINE_STACK_OF(X509_NAME) + +# define X509_EX_V_NETSCAPE_HACK 0x8000 +# define X509_EX_V_INIT 0x0001 +typedef struct X509_extension_st X509_EXTENSION; + +typedef STACK_OF(X509_EXTENSION) X509_EXTENSIONS; + +DEFINE_STACK_OF(X509_EXTENSION) + +typedef struct x509_attributes_st X509_ATTRIBUTE; + +DEFINE_STACK_OF(X509_ATTRIBUTE) + +typedef struct X509_req_info_st X509_REQ_INFO; + +typedef struct X509_req_st X509_REQ; + +typedef struct x509_cert_aux_st X509_CERT_AUX; + +typedef struct x509_cinf_st X509_CINF; + +DEFINE_STACK_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; + +DEFINE_STACK_OF(X509_TRUST) + +/* standard trust ids */ + +# define X509_TRUST_DEFAULT 0 /* 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 (1U << 0) +# define X509_TRUST_DYNAMIC_NAME (1U << 1) +/* No compat trust if self-signed, preempts "DO_SS" */ +# define X509_TRUST_NO_SS_COMPAT (1U << 2) +/* Compat trust if no explicit accepted trust EKUs */ +# define X509_TRUST_DO_SS_COMPAT (1U << 3) +/* Accept "anyEKU" as a wildcard trust OID */ +# define X509_TRUST_OK_ANY_EKU (1U << 4) + +/* check_trust return codes */ + +# define X509_TRUST_TRUSTED 1 +# define X509_TRUST_REJECTED 2 +# define X509_TRUST_UNTRUSTED 3 + +/* Flags for X509_print_ex() */ + +# define X509_FLAG_COMPAT 0 +# define X509_FLAG_NO_HEADER 1L +# define X509_FLAG_NO_VERSION (1L << 1) +# define X509_FLAG_NO_SERIAL (1L << 2) +# define X509_FLAG_NO_SIGNAME (1L << 3) +# define X509_FLAG_NO_ISSUER (1L << 4) +# define X509_FLAG_NO_VALIDITY (1L << 5) +# define X509_FLAG_NO_SUBJECT (1L << 6) +# define X509_FLAG_NO_PUBKEY (1L << 7) +# define X509_FLAG_NO_EXTENSIONS (1L << 8) +# define X509_FLAG_NO_SIGDUMP (1L << 9) +# define X509_FLAG_NO_AUX (1L << 10) +# define X509_FLAG_NO_ATTRIBUTES (1L << 11) +# define X509_FLAG_NO_IDS (1L << 12) + +/* Flags specific to X509_NAME_print_ex() */ + +/* The field separator information */ + +# define XN_FLAG_SEP_MASK (0xf << 16) + +# define XN_FLAG_COMPAT 0/* Traditional; 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) + +DEFINE_STACK_OF(X509_REVOKED) + +typedef struct X509_crl_info_st X509_CRL_INFO; + +DEFINE_STACK_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; +} X509_PKEY; + +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; +} X509_INFO; + +DEFINE_STACK_OF(X509_INFO) + +/* + * The next 2 structures and their 8 routines are used to manipulate Netscape's + * spki structures - useful if you are writing a CA web page + */ +typedef struct Netscape_spkac_st { + X509_PUBKEY *pubkey; + ASN1_IA5STRING *challenge; /* challenge sent in atlas >= PR2 */ +} NETSCAPE_SPKAC; + +typedef struct Netscape_spki_st { + NETSCAPE_SPKAC *spkac; /* signed public key and challenge */ + X509_ALGOR sig_algor; + ASN1_BIT_STRING *signature; +} NETSCAPE_SPKI; + +/* Netscape certificate sequence structure */ +typedef struct Netscape_certificate_sequence { + ASN1_OBJECT *type; + STACK_OF(X509) *certs; +} NETSCAPE_CERT_SEQUENCE; + +/*- Unused (and iv length is wrong) +typedef struct CBCParameter_st + { + unsigned char iv[8]; + } CBC_PARAM; +*/ + +/* Password based encryption structure */ + +typedef struct PBEPARAM_st { + ASN1_OCTET_STRING *salt; + ASN1_INTEGER *iter; +} PBEPARAM; + +/* Password based encryption V2 structures */ + +typedef struct PBE2PARAM_st { + X509_ALGOR *keyfunc; + X509_ALGOR *encryption; +} PBE2PARAM; + +typedef struct PBKDF2PARAM_st { +/* Usually OCTET STRING but could be anything */ + ASN1_TYPE *salt; + ASN1_INTEGER *iter; + ASN1_INTEGER *keylength; + X509_ALGOR *prf; +} PBKDF2PARAM; + +#ifndef OPENSSL_NO_SCRYPT +typedef struct SCRYPT_PARAMS_st { + ASN1_OCTET_STRING *salt; + ASN1_INTEGER *costParameter; + ASN1_INTEGER *blockSize; + ASN1_INTEGER *parallelizationParameter; + ASN1_INTEGER *keyLength; +} SCRYPT_PARAMS; +#endif + +#ifdef __cplusplus +} +#endif + +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# define X509_EXT_PACK_UNKNOWN 1 +# define X509_EXT_PACK_STRING 2 + +# define X509_extract_key(x) X509_get_pubkey(x)/*****/ +# define X509_REQ_extract_key(a) X509_REQ_get_pubkey(a) +# define X509_name_cmp(a,b) X509_NAME_cmp((a),(b)) + +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); + +const char *X509_verify_cert_error_string(long n); + +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, const X509_ALGOR *alg, + const 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); +# ifndef OPENSSL_NO_OCSP +int X509_http_nbio(OCSP_REQ_CTX *rctx, X509 **pcert); +# endif +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); +# ifndef OPENSSL_NO_OCSP +int X509_CRL_http_nbio(OCSP_REQ_CTX *rctx, X509_CRL **pcrl); +# endif +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); + +# ifndef OPENSSL_NO_STDIO +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 + +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); + +X509 *X509_dup(X509 *x509); +X509_ATTRIBUTE *X509_ATTRIBUTE_dup(X509_ATTRIBUTE *xa); +X509_EXTENSION *X509_EXTENSION_dup(X509_EXTENSION *ex); +X509_CRL *X509_CRL_dup(X509_CRL *crl); +X509_REVOKED *X509_REVOKED_dup(X509_REVOKED *rev); +X509_REQ *X509_REQ_dup(X509_REQ *req); +X509_ALGOR *X509_ALGOR_dup(X509_ALGOR *xn); +int X509_ALGOR_set0(X509_ALGOR *alg, ASN1_OBJECT *aobj, int ptype, + void *pval); +void X509_ALGOR_get0(const ASN1_OBJECT **paobj, int *pptype, + const void **ppval, const X509_ALGOR *algor); +void X509_ALGOR_set_md(X509_ALGOR *alg, const EVP_MD *md); +int X509_ALGOR_cmp(const X509_ALGOR *a, const X509_ALGOR *b); +int X509_ALGOR_copy(X509_ALGOR *dest, const X509_ALGOR *src); + +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_get0(X509_PUBKEY *key); +EVP_PKEY *X509_PUBKEY_get(X509_PUBKEY *key); +int X509_get_pubkey_parameters(EVP_PKEY *pkey, STACK_OF(X509) *chain); +long X509_get_pathlen(X509 *x); +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) +void X509_SIG_get0(const X509_SIG *sig, const X509_ALGOR **palg, + const ASN1_OCTET_STRING **pdigest); +void X509_SIG_getm(X509_SIG *sig, X509_ALGOR **palg, + ASN1_OCTET_STRING **pdigest); + +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) + +#define X509_get_ex_new_index(l, p, newf, dupf, freef) \ + CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_X509, l, p, newf, dupf, freef) +int X509_set_ex_data(X509 *r, int idx, void *arg); +void *X509_get_ex_data(X509 *r, int idx); +int i2d_X509_AUX(X509 *a, unsigned char **pp); +X509 *d2i_X509_AUX(X509 **a, const unsigned char **pp, long length); + +int i2d_re_X509_tbs(X509 *x, unsigned char **pp); + +int X509_SIG_INFO_get(const X509_SIG_INFO *siginf, int *mdnid, int *pknid, + int *secbits, uint32_t *flags); +void X509_SIG_INFO_set(X509_SIG_INFO *siginf, int mdnid, int pknid, + int secbits, uint32_t flags); + +int X509_get_signature_info(X509 *x, int *mdnid, int *pknid, int *secbits, + uint32_t *flags); + +void X509_get0_signature(const ASN1_BIT_STRING **psig, + const X509_ALGOR **palg, const X509 *x); +int X509_get_signature_nid(const X509 *x); + +int X509_trusted(const X509 *x); +int X509_alias_set1(X509 *x, const unsigned char *name, int len); +int X509_keyid_set1(X509 *x, const 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, const ASN1_OBJECT *obj); +int X509_add1_reject_object(X509 *x, const ASN1_OBJECT *obj); +void X509_trust_clear(X509 *x); +void X509_reject_clear(X509 *x); + +STACK_OF(ASN1_OBJECT) *X509_get0_trust_objects(X509 *x); +STACK_OF(ASN1_OBJECT) *X509_get0_reject_objects(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); + +DECLARE_ASN1_FUNCTIONS(NETSCAPE_SPKI) +DECLARE_ASN1_FUNCTIONS(NETSCAPE_SPKAC) +DECLARE_ASN1_FUNCTIONS(NETSCAPE_CERT_SEQUENCE) + +X509_INFO *X509_INFO_new(void); +void X509_INFO_free(X509_INFO *a); +char *X509_NAME_oneline(const 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); + +long X509_get_version(const X509 *x); +int X509_set_version(X509 *x, long version); +int X509_set_serialNumber(X509 *x, ASN1_INTEGER *serial); +ASN1_INTEGER *X509_get_serialNumber(X509 *x); +const ASN1_INTEGER *X509_get0_serialNumber(const X509 *x); +int X509_set_issuer_name(X509 *x, X509_NAME *name); +X509_NAME *X509_get_issuer_name(const X509 *a); +int X509_set_subject_name(X509 *x, X509_NAME *name); +X509_NAME *X509_get_subject_name(const X509 *a); +const ASN1_TIME * X509_get0_notBefore(const X509 *x); +ASN1_TIME *X509_getm_notBefore(const X509 *x); +int X509_set1_notBefore(X509 *x, const ASN1_TIME *tm); +const ASN1_TIME *X509_get0_notAfter(const X509 *x); +ASN1_TIME *X509_getm_notAfter(const X509 *x); +int X509_set1_notAfter(X509 *x, const ASN1_TIME *tm); +int X509_set_pubkey(X509 *x, EVP_PKEY *pkey); +int X509_up_ref(X509 *x); +int X509_get_signature_type(const X509 *x); + +# if OPENSSL_API_COMPAT < 0x10100000L +# define X509_get_notBefore X509_getm_notBefore +# define X509_get_notAfter X509_getm_notAfter +# define X509_set_notBefore X509_set1_notBefore +# define X509_set_notAfter X509_set1_notAfter +#endif + + +/* + * This one is only used so that a binary form can output, as in + * i2d_X509_PUBKEY(X509_get_X509_PUBKEY(x), &buf) + */ +X509_PUBKEY *X509_get_X509_PUBKEY(const X509 *x); +const STACK_OF(X509_EXTENSION) *X509_get0_extensions(const X509 *x); +void X509_get0_uids(const X509 *x, const ASN1_BIT_STRING **piuid, + const ASN1_BIT_STRING **psuid); +const X509_ALGOR *X509_get0_tbs_sigalg(const X509 *x); + +EVP_PKEY *X509_get0_pubkey(const X509 *x); +EVP_PKEY *X509_get_pubkey(X509 *x); +ASN1_BIT_STRING *X509_get0_pubkey_bitstr(const X509 *x); +int X509_certificate_type(const X509 *x, const EVP_PKEY *pubkey); + +long X509_REQ_get_version(const X509_REQ *req); +int X509_REQ_set_version(X509_REQ *x, long version); +X509_NAME *X509_REQ_get_subject_name(const X509_REQ *req); +int X509_REQ_set_subject_name(X509_REQ *req, X509_NAME *name); +void X509_REQ_get0_signature(const X509_REQ *req, const ASN1_BIT_STRING **psig, + const X509_ALGOR **palg); +void X509_REQ_set0_signature(X509_REQ *req, ASN1_BIT_STRING *psig); +int X509_REQ_set1_signature_algo(X509_REQ *req, X509_ALGOR *palg); +int X509_REQ_get_signature_nid(const X509_REQ *req); +int i2d_re_X509_REQ_tbs(X509_REQ *req, unsigned char **pp); +int X509_REQ_set_pubkey(X509_REQ *x, EVP_PKEY *pkey); +EVP_PKEY *X509_REQ_get_pubkey(X509_REQ *req); +EVP_PKEY *X509_REQ_get0_pubkey(X509_REQ *req); +X509_PUBKEY *X509_REQ_get_X509_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, const 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_set1_lastUpdate(X509_CRL *x, const ASN1_TIME *tm); +int X509_CRL_set1_nextUpdate(X509_CRL *x, const ASN1_TIME *tm); +int X509_CRL_sort(X509_CRL *crl); +int X509_CRL_up_ref(X509_CRL *crl); + +# if OPENSSL_API_COMPAT < 0x10100000L +# define X509_CRL_set_lastUpdate X509_CRL_set1_lastUpdate +# define X509_CRL_set_nextUpdate X509_CRL_set1_nextUpdate +#endif + +long X509_CRL_get_version(const X509_CRL *crl); +const ASN1_TIME *X509_CRL_get0_lastUpdate(const X509_CRL *crl); +const ASN1_TIME *X509_CRL_get0_nextUpdate(const X509_CRL *crl); +DEPRECATEDIN_1_1_0(ASN1_TIME *X509_CRL_get_lastUpdate(X509_CRL *crl)) +DEPRECATEDIN_1_1_0(ASN1_TIME *X509_CRL_get_nextUpdate(X509_CRL *crl)) +X509_NAME *X509_CRL_get_issuer(const X509_CRL *crl); +const STACK_OF(X509_EXTENSION) *X509_CRL_get0_extensions(const X509_CRL *crl); +STACK_OF(X509_REVOKED) *X509_CRL_get_REVOKED(X509_CRL *crl); +void X509_CRL_get0_signature(const X509_CRL *crl, const ASN1_BIT_STRING **psig, + const X509_ALGOR **palg); +int X509_CRL_get_signature_nid(const X509_CRL *crl); +int i2d_re_X509_CRL_tbs(X509_CRL *req, unsigned char **pp); + +const ASN1_INTEGER *X509_REVOKED_get0_serialNumber(const X509_REVOKED *x); +int X509_REVOKED_set_serialNumber(X509_REVOKED *x, ASN1_INTEGER *serial); +const ASN1_TIME *X509_REVOKED_get0_revocationDate(const X509_REVOKED *x); +int X509_REVOKED_set_revocationDate(X509_REVOKED *r, ASN1_TIME *tm); +const STACK_OF(X509_EXTENSION) * +X509_REVOKED_get0_extensions(const X509_REVOKED *r); + +X509_CRL *X509_CRL_diff(X509_CRL *base, X509_CRL *newer, + EVP_PKEY *skey, const EVP_MD *md, unsigned int flags); + +int X509_REQ_check_private_key(X509_REQ *x509, EVP_PKEY *pkey); + +int X509_check_private_key(const X509 *x509, const EVP_PKEY *pkey); +int X509_chain_check_suiteb(int *perror_depth, + X509 *x, STACK_OF(X509) *chain, + unsigned long flags); +int X509_CRL_check_suiteb(X509_CRL *crl, EVP_PKEY *pk, unsigned long flags); +STACK_OF(X509) *X509_chain_up_ref(STACK_OF(X509) *chain); + +int X509_issuer_and_serial_cmp(const X509 *a, const X509 *b); +unsigned long X509_issuer_and_serial_hash(X509 *a); + +int X509_issuer_name_cmp(const X509 *a, const X509 *b); +unsigned long X509_issuer_name_hash(X509 *a); + +int X509_subject_name_cmp(const X509 *a, const X509 *b); +unsigned long X509_subject_name_hash(X509 *x); + +# ifndef OPENSSL_NO_MD5 +unsigned long X509_issuer_name_hash_old(X509 *a); +unsigned long X509_subject_name_hash_old(X509 *x); +# endif + +int X509_cmp(const X509 *a, const X509 *b); +int X509_NAME_cmp(const X509_NAME *a, const X509_NAME *b); +unsigned long X509_NAME_hash(X509_NAME *x); +unsigned long X509_NAME_hash_old(X509_NAME *x); + +int X509_CRL_cmp(const X509_CRL *a, const X509_CRL *b); +int X509_CRL_match(const X509_CRL *a, const X509_CRL *b); +int X509_aux_print(BIO *out, X509 *x, int indent); +# ifndef OPENSSL_NO_STDIO +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, const X509_NAME *nm, int indent, + unsigned long flags); +# endif + +int X509_NAME_print(BIO *bp, const X509_NAME *name, int obase); +int X509_NAME_print_ex(BIO *out, const 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_CRL_print_ex(BIO *out, X509_CRL *x, unsigned long nmflag); +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); + +int X509_NAME_entry_count(const 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, const ASN1_OBJECT *obj, + char *buf, int len); + +/* + * NOTE: you should be passing -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, const ASN1_OBJECT *obj, + int lastpos); +X509_NAME_ENTRY *X509_NAME_get_entry(const 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, const X509_NAME_ENTRY *ne, + int loc, int set); +int X509_NAME_add_entry_by_OBJ(X509_NAME *name, const ASN1_OBJECT *obj, int type, + const unsigned char *bytes, int len, int loc, + int set); +int X509_NAME_add_entry_by_NID(X509_NAME *name, int nid, int type, + const 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, + const 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, + const ASN1_OBJECT *obj, int type, + const unsigned char *bytes, + int len); +int X509_NAME_ENTRY_set_object(X509_NAME_ENTRY *ne, const 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(const X509_NAME_ENTRY *ne); +ASN1_STRING * X509_NAME_ENTRY_get_data(const X509_NAME_ENTRY *ne); +int X509_NAME_ENTRY_set(const X509_NAME_ENTRY *ne); + +int X509_NAME_get0_der(X509_NAME *nm, const unsigned char **pder, + size_t *pderlen); + +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, + const 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(const X509 *x); +int X509_get_ext_by_NID(const X509 *x, int nid, int lastpos); +int X509_get_ext_by_OBJ(const X509 *x, const ASN1_OBJECT *obj, int lastpos); +int X509_get_ext_by_critical(const X509 *x, int crit, int lastpos); +X509_EXTENSION *X509_get_ext(const 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(const 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(const X509_CRL *x); +int X509_CRL_get_ext_by_NID(const X509_CRL *x, int nid, int lastpos); +int X509_CRL_get_ext_by_OBJ(const X509_CRL *x, const ASN1_OBJECT *obj, + int lastpos); +int X509_CRL_get_ext_by_critical(const X509_CRL *x, int crit, int lastpos); +X509_EXTENSION *X509_CRL_get_ext(const 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(const 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(const X509_REVOKED *x); +int X509_REVOKED_get_ext_by_NID(const X509_REVOKED *x, int nid, int lastpos); +int X509_REVOKED_get_ext_by_OBJ(const X509_REVOKED *x, const ASN1_OBJECT *obj, + int lastpos); +int X509_REVOKED_get_ext_by_critical(const X509_REVOKED *x, int crit, + int lastpos); +X509_EXTENSION *X509_REVOKED_get_ext(const 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(const 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, + const ASN1_OBJECT *obj, int crit, + ASN1_OCTET_STRING *data); +int X509_EXTENSION_set_object(X509_EXTENSION *ex, const 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(const 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, + const 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(const STACK_OF(X509_ATTRIBUTE) *x, + const 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(const 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, const 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) +#ifndef OPENSSL_NO_SCRYPT +DECLARE_ASN1_FUNCTIONS(SCRYPT_PARAMS) +#endif + +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); + +#ifndef OPENSSL_NO_SCRYPT +X509_ALGOR *PKCS5_pbe2_set_scrypt(const EVP_CIPHER *cipher, + const unsigned char *salt, int saltlen, + unsigned char *aiv, uint64_t N, uint64_t r, + uint64_t p); +#endif + +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(const PKCS8_PRIV_KEY_INFO *p8); +PKCS8_PRIV_KEY_INFO *EVP_PKEY2PKCS8(EVP_PKEY *pkey); + +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(const ASN1_OBJECT **ppkalg, + const unsigned char **pk, int *ppklen, + const X509_ALGOR **pa, const PKCS8_PRIV_KEY_INFO *p8); + +const STACK_OF(X509_ATTRIBUTE) * +PKCS8_pkey_get0_attrs(const PKCS8_PRIV_KEY_INFO *p8); +int PKCS8_pkey_add1_attr_by_NID(PKCS8_PRIV_KEY_INFO *p8, int nid, int type, + const unsigned char *bytes, int len); + +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), + const char *name, int arg1, void *arg2); +void X509_TRUST_cleanup(void); +int X509_TRUST_get_flags(const X509_TRUST *xp); +char *X509_TRUST_get0_name(const X509_TRUST *xp); +int X509_TRUST_get_trust(const X509_TRUST *xp); + +# ifdef __cplusplus +} +# endif +#endif diff --git a/openssl-wasm/include/openssl/x509_vfy.h b/openssl-wasm/include/openssl/x509_vfy.h new file mode 100644 index 0000000..25c79f1 --- /dev/null +++ b/openssl-wasm/include/openssl/x509_vfy.h @@ -0,0 +1,632 @@ +/* + * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_X509_VFY_H +# define HEADER_X509_VFY_H + +/* + * Protect against recursion, x509.h and x509_vfy.h each include the other. + */ +# ifndef HEADER_X509_H +# include +# endif + +# include +# include +# include +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +/*- +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. +*/ + +typedef enum { + X509_LU_NONE = 0, + X509_LU_X509, X509_LU_CRL +} X509_LOOKUP_TYPE; + +#if OPENSSL_API_COMPAT < 0x10100000L +#define X509_LU_RETRY -1 +#define X509_LU_FAIL 0 +#endif + +DEFINE_STACK_OF(X509_LOOKUP) +DEFINE_STACK_OF(X509_OBJECT) +DEFINE_STACK_OF(X509_VERIFY_PARAM) + +int X509_STORE_set_depth(X509_STORE *store, int depth); + +typedef int (*X509_STORE_CTX_verify_cb)(int, X509_STORE_CTX *); +typedef int (*X509_STORE_CTX_verify_fn)(X509_STORE_CTX *); +typedef int (*X509_STORE_CTX_get_issuer_fn)(X509 **issuer, + X509_STORE_CTX *ctx, X509 *x); +typedef int (*X509_STORE_CTX_check_issued_fn)(X509_STORE_CTX *ctx, + X509 *x, X509 *issuer); +typedef int (*X509_STORE_CTX_check_revocation_fn)(X509_STORE_CTX *ctx); +typedef int (*X509_STORE_CTX_get_crl_fn)(X509_STORE_CTX *ctx, + X509_CRL **crl, X509 *x); +typedef int (*X509_STORE_CTX_check_crl_fn)(X509_STORE_CTX *ctx, X509_CRL *crl); +typedef int (*X509_STORE_CTX_cert_crl_fn)(X509_STORE_CTX *ctx, + X509_CRL *crl, X509 *x); +typedef int (*X509_STORE_CTX_check_policy_fn)(X509_STORE_CTX *ctx); +typedef STACK_OF(X509) *(*X509_STORE_CTX_lookup_certs_fn)(X509_STORE_CTX *ctx, + X509_NAME *nm); +typedef STACK_OF(X509_CRL) *(*X509_STORE_CTX_lookup_crls_fn)(X509_STORE_CTX *ctx, + X509_NAME *nm); +typedef int (*X509_STORE_CTX_cleanup_fn)(X509_STORE_CTX *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 +# define X509_V_ERR_UNSPECIFIED 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 +/* The application is not happy */ +# define X509_V_ERR_APPLICATION_VERIFICATION 50 +# 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 +/* Another issuer check debug option */ +# define X509_V_ERR_PATH_LOOP 55 +/* Suite B mode algorithm violation */ +# define X509_V_ERR_SUITE_B_INVALID_VERSION 56 +# define X509_V_ERR_SUITE_B_INVALID_ALGORITHM 57 +# define X509_V_ERR_SUITE_B_INVALID_CURVE 58 +# define X509_V_ERR_SUITE_B_INVALID_SIGNATURE_ALGORITHM 59 +# define X509_V_ERR_SUITE_B_LOS_NOT_ALLOWED 60 +# define X509_V_ERR_SUITE_B_CANNOT_SIGN_P_384_WITH_P_256 61 +/* Host, email and IP check errors */ +# define X509_V_ERR_HOSTNAME_MISMATCH 62 +# define X509_V_ERR_EMAIL_MISMATCH 63 +# define X509_V_ERR_IP_ADDRESS_MISMATCH 64 +/* DANE TLSA errors */ +# define X509_V_ERR_DANE_NO_MATCH 65 +/* security level errors */ +# define X509_V_ERR_EE_KEY_TOO_SMALL 66 +# define X509_V_ERR_CA_KEY_TOO_SMALL 67 +# define X509_V_ERR_CA_MD_TOO_WEAK 68 +/* Caller error */ +# define X509_V_ERR_INVALID_CALL 69 +/* Issuer lookup error */ +# define X509_V_ERR_STORE_LOOKUP 70 +/* Certificate transparency */ +# define X509_V_ERR_NO_VALID_SCTS 71 + +# define X509_V_ERR_PROXY_SUBJECT_NAME_VIOLATION 72 +/* OCSP status errors */ +# define X509_V_ERR_OCSP_VERIFY_NEEDED 73 /* Need OCSP verification */ +# define X509_V_ERR_OCSP_VERIFY_FAILED 74 /* Couldn't verify cert through OCSP */ +# define X509_V_ERR_OCSP_CERT_UNKNOWN 75 /* Certificate wasn't recognized by the OCSP responder */ +# define X509_V_ERR_SIGNATURE_ALGORITHM_MISMATCH 76 +# define X509_V_ERR_NO_ISSUER_PUBLIC_KEY 77 +# define X509_V_ERR_UNSUPPORTED_SIGNATURE_ALGORITHM 78 +# define X509_V_ERR_EC_KEY_EXPLICIT_PARAMS 79 + +/* Certificate verify flags */ + +# if OPENSSL_API_COMPAT < 0x10100000L +# define X509_V_FLAG_CB_ISSUER_CHECK 0x0 /* Deprecated */ +# endif +/* 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 self-signed CA signature */ +# define X509_V_FLAG_CHECK_SS_SIGNATURE 0x4000 +/* Use trusted store first */ +# define X509_V_FLAG_TRUSTED_FIRST 0x8000 +/* Suite B 128 bit only mode: not normally used */ +# define X509_V_FLAG_SUITEB_128_LOS_ONLY 0x10000 +/* Suite B 192 bit only mode */ +# define X509_V_FLAG_SUITEB_192_LOS 0x20000 +/* Suite B 128 bit mode allowing 192 bit algorithms */ +# define X509_V_FLAG_SUITEB_128_LOS 0x30000 +/* Allow partial chains if at least one certificate is in trusted store */ +# define X509_V_FLAG_PARTIAL_CHAIN 0x80000 +/* + * If the initial chain is not trusted, do not attempt to build an alternative + * chain. Alternate chain checking was introduced in 1.1.0. Setting this flag + * will force the behaviour to match that of previous versions. + */ +# define X509_V_FLAG_NO_ALT_CHAINS 0x100000 +/* Do not check certificate/CRL validity against current time */ +# define X509_V_FLAG_NO_CHECK_TIME 0x200000 + +# 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, X509_LOOKUP_TYPE type, + X509_NAME *name); +X509_OBJECT *X509_OBJECT_retrieve_by_subject(STACK_OF(X509_OBJECT) *h, + X509_LOOKUP_TYPE type, + X509_NAME *name); +X509_OBJECT *X509_OBJECT_retrieve_match(STACK_OF(X509_OBJECT) *h, + X509_OBJECT *x); +int X509_OBJECT_up_ref_count(X509_OBJECT *a); +X509_OBJECT *X509_OBJECT_new(void); +void X509_OBJECT_free(X509_OBJECT *a); +X509_LOOKUP_TYPE X509_OBJECT_get_type(const X509_OBJECT *a); +X509 *X509_OBJECT_get0_X509(const X509_OBJECT *a); +int X509_OBJECT_set1_X509(X509_OBJECT *a, X509 *obj); +X509_CRL *X509_OBJECT_get0_X509_CRL(X509_OBJECT *a); +int X509_OBJECT_set1_X509_CRL(X509_OBJECT *a, X509_CRL *obj); +X509_STORE *X509_STORE_new(void); +void X509_STORE_free(X509_STORE *v); +int X509_STORE_lock(X509_STORE *ctx); +int X509_STORE_unlock(X509_STORE *ctx); +int X509_STORE_up_ref(X509_STORE *v); +STACK_OF(X509_OBJECT) *X509_STORE_get0_objects(X509_STORE *v); + +STACK_OF(X509) *X509_STORE_CTX_get1_certs(X509_STORE_CTX *st, X509_NAME *nm); +STACK_OF(X509_CRL) *X509_STORE_CTX_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); +X509_VERIFY_PARAM *X509_STORE_get0_param(X509_STORE *ctx); + +void X509_STORE_set_verify(X509_STORE *ctx, X509_STORE_CTX_verify_fn verify); +#define X509_STORE_set_verify_func(ctx, func) \ + X509_STORE_set_verify((ctx),(func)) +void X509_STORE_CTX_set_verify(X509_STORE_CTX *ctx, + X509_STORE_CTX_verify_fn verify); +X509_STORE_CTX_verify_fn X509_STORE_get_verify(X509_STORE *ctx); +void X509_STORE_set_verify_cb(X509_STORE *ctx, + X509_STORE_CTX_verify_cb verify_cb); +# define X509_STORE_set_verify_cb_func(ctx,func) \ + X509_STORE_set_verify_cb((ctx),(func)) +X509_STORE_CTX_verify_cb X509_STORE_get_verify_cb(X509_STORE *ctx); +void X509_STORE_set_get_issuer(X509_STORE *ctx, + X509_STORE_CTX_get_issuer_fn get_issuer); +X509_STORE_CTX_get_issuer_fn X509_STORE_get_get_issuer(X509_STORE *ctx); +void X509_STORE_set_check_issued(X509_STORE *ctx, + X509_STORE_CTX_check_issued_fn check_issued); +X509_STORE_CTX_check_issued_fn X509_STORE_get_check_issued(X509_STORE *ctx); +void X509_STORE_set_check_revocation(X509_STORE *ctx, + X509_STORE_CTX_check_revocation_fn check_revocation); +X509_STORE_CTX_check_revocation_fn X509_STORE_get_check_revocation(X509_STORE *ctx); +void X509_STORE_set_get_crl(X509_STORE *ctx, + X509_STORE_CTX_get_crl_fn get_crl); +X509_STORE_CTX_get_crl_fn X509_STORE_get_get_crl(X509_STORE *ctx); +void X509_STORE_set_check_crl(X509_STORE *ctx, + X509_STORE_CTX_check_crl_fn check_crl); +X509_STORE_CTX_check_crl_fn X509_STORE_get_check_crl(X509_STORE *ctx); +void X509_STORE_set_cert_crl(X509_STORE *ctx, + X509_STORE_CTX_cert_crl_fn cert_crl); +X509_STORE_CTX_cert_crl_fn X509_STORE_get_cert_crl(X509_STORE *ctx); +void X509_STORE_set_check_policy(X509_STORE *ctx, + X509_STORE_CTX_check_policy_fn check_policy); +X509_STORE_CTX_check_policy_fn X509_STORE_get_check_policy(X509_STORE *ctx); +void X509_STORE_set_lookup_certs(X509_STORE *ctx, + X509_STORE_CTX_lookup_certs_fn lookup_certs); +X509_STORE_CTX_lookup_certs_fn X509_STORE_get_lookup_certs(X509_STORE *ctx); +void X509_STORE_set_lookup_crls(X509_STORE *ctx, + X509_STORE_CTX_lookup_crls_fn lookup_crls); +#define X509_STORE_set_lookup_crls_cb(ctx, func) \ + X509_STORE_set_lookup_crls((ctx), (func)) +X509_STORE_CTX_lookup_crls_fn X509_STORE_get_lookup_crls(X509_STORE *ctx); +void X509_STORE_set_cleanup(X509_STORE *ctx, + X509_STORE_CTX_cleanup_fn cleanup); +X509_STORE_CTX_cleanup_fn X509_STORE_get_cleanup(X509_STORE *ctx); + +#define X509_STORE_get_ex_new_index(l, p, newf, dupf, freef) \ + CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_X509_STORE, l, p, newf, dupf, freef) +int X509_STORE_set_ex_data(X509_STORE *ctx, int idx, void *data); +void *X509_STORE_get_ex_data(X509_STORE *ctx, int idx); + +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_set0_trusted_stack(X509_STORE_CTX *ctx, STACK_OF(X509) *sk); +void X509_STORE_CTX_cleanup(X509_STORE_CTX *ctx); + +X509_STORE *X509_STORE_CTX_get0_store(X509_STORE_CTX *ctx); +X509 *X509_STORE_CTX_get0_cert(X509_STORE_CTX *ctx); +STACK_OF(X509)* X509_STORE_CTX_get0_untrusted(X509_STORE_CTX *ctx); +void X509_STORE_CTX_set0_untrusted(X509_STORE_CTX *ctx, STACK_OF(X509) *sk); +void X509_STORE_CTX_set_verify_cb(X509_STORE_CTX *ctx, + X509_STORE_CTX_verify_cb verify); +X509_STORE_CTX_verify_cb X509_STORE_CTX_get_verify_cb(X509_STORE_CTX *ctx); +X509_STORE_CTX_verify_fn X509_STORE_CTX_get_verify(X509_STORE_CTX *ctx); +X509_STORE_CTX_get_issuer_fn X509_STORE_CTX_get_get_issuer(X509_STORE_CTX *ctx); +X509_STORE_CTX_check_issued_fn X509_STORE_CTX_get_check_issued(X509_STORE_CTX *ctx); +X509_STORE_CTX_check_revocation_fn X509_STORE_CTX_get_check_revocation(X509_STORE_CTX *ctx); +X509_STORE_CTX_get_crl_fn X509_STORE_CTX_get_get_crl(X509_STORE_CTX *ctx); +X509_STORE_CTX_check_crl_fn X509_STORE_CTX_get_check_crl(X509_STORE_CTX *ctx); +X509_STORE_CTX_cert_crl_fn X509_STORE_CTX_get_cert_crl(X509_STORE_CTX *ctx); +X509_STORE_CTX_check_policy_fn X509_STORE_CTX_get_check_policy(X509_STORE_CTX *ctx); +X509_STORE_CTX_lookup_certs_fn X509_STORE_CTX_get_lookup_certs(X509_STORE_CTX *ctx); +X509_STORE_CTX_lookup_crls_fn X509_STORE_CTX_get_lookup_crls(X509_STORE_CTX *ctx); +X509_STORE_CTX_cleanup_fn X509_STORE_CTX_get_cleanup(X509_STORE_CTX *ctx); + +#if OPENSSL_API_COMPAT < 0x10100000L +# define X509_STORE_CTX_get_chain X509_STORE_CTX_get0_chain +# define X509_STORE_CTX_set_chain X509_STORE_CTX_set0_untrusted +# define X509_STORE_CTX_trusted_stack X509_STORE_CTX_set0_trusted_stack +# define X509_STORE_get_by_subject X509_STORE_CTX_get_by_subject +# define X509_STORE_get1_certs X509_STORE_CTX_get1_certs +# define X509_STORE_get1_crls X509_STORE_CTX_get1_crls +/* the following macro is misspelled; use X509_STORE_get1_certs instead */ +# define X509_STORE_get1_cert X509_STORE_CTX_get1_certs +/* the following macro is misspelled; use X509_STORE_get1_crls instead */ +# define X509_STORE_get1_crl X509_STORE_CTX_get1_crls +#endif + +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); + +typedef int (*X509_LOOKUP_ctrl_fn)(X509_LOOKUP *ctx, int cmd, const char *argc, + long argl, char **ret); +typedef int (*X509_LOOKUP_get_by_subject_fn)(X509_LOOKUP *ctx, + X509_LOOKUP_TYPE type, + X509_NAME *name, + X509_OBJECT *ret); +typedef int (*X509_LOOKUP_get_by_issuer_serial_fn)(X509_LOOKUP *ctx, + X509_LOOKUP_TYPE type, + X509_NAME *name, + ASN1_INTEGER *serial, + X509_OBJECT *ret); +typedef int (*X509_LOOKUP_get_by_fingerprint_fn)(X509_LOOKUP *ctx, + X509_LOOKUP_TYPE type, + const unsigned char* bytes, + int len, + X509_OBJECT *ret); +typedef int (*X509_LOOKUP_get_by_alias_fn)(X509_LOOKUP *ctx, + X509_LOOKUP_TYPE type, + const char *str, + int len, + X509_OBJECT *ret); + +X509_LOOKUP_METHOD *X509_LOOKUP_meth_new(const char *name); +void X509_LOOKUP_meth_free(X509_LOOKUP_METHOD *method); + +int X509_LOOKUP_meth_set_new_item(X509_LOOKUP_METHOD *method, + int (*new_item) (X509_LOOKUP *ctx)); +int (*X509_LOOKUP_meth_get_new_item(const X509_LOOKUP_METHOD* method)) + (X509_LOOKUP *ctx); + +int X509_LOOKUP_meth_set_free(X509_LOOKUP_METHOD *method, + void (*free_fn) (X509_LOOKUP *ctx)); +void (*X509_LOOKUP_meth_get_free(const X509_LOOKUP_METHOD* method)) + (X509_LOOKUP *ctx); + +int X509_LOOKUP_meth_set_init(X509_LOOKUP_METHOD *method, + int (*init) (X509_LOOKUP *ctx)); +int (*X509_LOOKUP_meth_get_init(const X509_LOOKUP_METHOD* method)) + (X509_LOOKUP *ctx); + +int X509_LOOKUP_meth_set_shutdown(X509_LOOKUP_METHOD *method, + int (*shutdown) (X509_LOOKUP *ctx)); +int (*X509_LOOKUP_meth_get_shutdown(const X509_LOOKUP_METHOD* method)) + (X509_LOOKUP *ctx); + +int X509_LOOKUP_meth_set_ctrl(X509_LOOKUP_METHOD *method, + X509_LOOKUP_ctrl_fn ctrl_fn); +X509_LOOKUP_ctrl_fn X509_LOOKUP_meth_get_ctrl(const X509_LOOKUP_METHOD *method); + +int X509_LOOKUP_meth_set_get_by_subject(X509_LOOKUP_METHOD *method, + X509_LOOKUP_get_by_subject_fn fn); +X509_LOOKUP_get_by_subject_fn X509_LOOKUP_meth_get_get_by_subject( + const X509_LOOKUP_METHOD *method); + +int X509_LOOKUP_meth_set_get_by_issuer_serial(X509_LOOKUP_METHOD *method, + X509_LOOKUP_get_by_issuer_serial_fn fn); +X509_LOOKUP_get_by_issuer_serial_fn X509_LOOKUP_meth_get_get_by_issuer_serial( + const X509_LOOKUP_METHOD *method); + +int X509_LOOKUP_meth_set_get_by_fingerprint(X509_LOOKUP_METHOD *method, + X509_LOOKUP_get_by_fingerprint_fn fn); +X509_LOOKUP_get_by_fingerprint_fn X509_LOOKUP_meth_get_get_by_fingerprint( + const X509_LOOKUP_METHOD *method); + +int X509_LOOKUP_meth_set_get_by_alias(X509_LOOKUP_METHOD *method, + X509_LOOKUP_get_by_alias_fn fn); +X509_LOOKUP_get_by_alias_fn X509_LOOKUP_meth_get_get_by_alias( + const X509_LOOKUP_METHOD *method); + + +int X509_STORE_add_cert(X509_STORE *ctx, X509 *x); +int X509_STORE_add_crl(X509_STORE *ctx, X509_CRL *x); + +int X509_STORE_CTX_get_by_subject(X509_STORE_CTX *vs, X509_LOOKUP_TYPE type, + X509_NAME *name, X509_OBJECT *ret); +X509_OBJECT *X509_STORE_CTX_get_obj_by_subject(X509_STORE_CTX *vs, + X509_LOOKUP_TYPE type, + X509_NAME *name); + +int X509_LOOKUP_ctrl(X509_LOOKUP *ctx, int cmd, const char *argc, + long argl, char **ret); + +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); + +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, X509_LOOKUP_TYPE type, + X509_NAME *name, X509_OBJECT *ret); +int X509_LOOKUP_by_issuer_serial(X509_LOOKUP *ctx, X509_LOOKUP_TYPE type, + X509_NAME *name, ASN1_INTEGER *serial, + X509_OBJECT *ret); +int X509_LOOKUP_by_fingerprint(X509_LOOKUP *ctx, X509_LOOKUP_TYPE type, + const unsigned char *bytes, int len, + X509_OBJECT *ret); +int X509_LOOKUP_by_alias(X509_LOOKUP *ctx, X509_LOOKUP_TYPE type, + const char *str, int len, X509_OBJECT *ret); +int X509_LOOKUP_set_method_data(X509_LOOKUP *ctx, void *data); +void *X509_LOOKUP_get_method_data(const X509_LOOKUP *ctx); +X509_STORE *X509_LOOKUP_get_store(const X509_LOOKUP *ctx); +int X509_LOOKUP_shutdown(X509_LOOKUP *ctx); + +int X509_STORE_load_locations(X509_STORE *ctx, + const char *file, const char *dir); +int X509_STORE_set_default_paths(X509_STORE *ctx); + +#define X509_STORE_CTX_get_ex_new_index(l, p, newf, dupf, freef) \ + CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_X509_STORE_CTX, l, p, newf, dupf, freef) +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); +void X509_STORE_CTX_set_error_depth(X509_STORE_CTX *ctx, int depth); +X509 *X509_STORE_CTX_get_current_cert(X509_STORE_CTX *ctx); +void X509_STORE_CTX_set_current_cert(X509_STORE_CTX *ctx, X509 *x); +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_get0_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_set0_verified_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); + +X509_POLICY_TREE *X509_STORE_CTX_get0_policy_tree(X509_STORE_CTX *ctx); +int X509_STORE_CTX_get_explicit_policy(X509_STORE_CTX *ctx); +int X509_STORE_CTX_get_num_untrusted(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); + +/* + * Bridge opacity barrier between libcrypt and libssl, also needed to support + * offline testing in test/danetest.c + */ +void X509_STORE_CTX_set0_dane(X509_STORE_CTX *ctx, SSL_DANE *dane); +#define DANE_FLAG_NO_DANE_EE_NAMECHECKS (1L << 0) + +/* 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_auth_level(X509_VERIFY_PARAM *param, int auth_level); +time_t X509_VERIFY_PARAM_get_time(const X509_VERIFY_PARAM *param); +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_set_inh_flags(X509_VERIFY_PARAM *param, + uint32_t flags); +uint32_t X509_VERIFY_PARAM_get_inh_flags(const X509_VERIFY_PARAM *param); + +int X509_VERIFY_PARAM_set1_host(X509_VERIFY_PARAM *param, + const char *name, size_t namelen); +int X509_VERIFY_PARAM_add1_host(X509_VERIFY_PARAM *param, + const char *name, size_t namelen); +void X509_VERIFY_PARAM_set_hostflags(X509_VERIFY_PARAM *param, + unsigned int flags); +unsigned int X509_VERIFY_PARAM_get_hostflags(const X509_VERIFY_PARAM *param); +char *X509_VERIFY_PARAM_get0_peername(X509_VERIFY_PARAM *); +void X509_VERIFY_PARAM_move_peername(X509_VERIFY_PARAM *, X509_VERIFY_PARAM *); +int X509_VERIFY_PARAM_set1_email(X509_VERIFY_PARAM *param, + const char *email, size_t emaillen); +int X509_VERIFY_PARAM_set1_ip(X509_VERIFY_PARAM *param, + const unsigned char *ip, size_t iplen); +int X509_VERIFY_PARAM_set1_ip_asc(X509_VERIFY_PARAM *param, + const char *ipasc); + +int X509_VERIFY_PARAM_get_depth(const X509_VERIFY_PARAM *param); +int X509_VERIFY_PARAM_get_auth_level(const X509_VERIFY_PARAM *param); +const char *X509_VERIFY_PARAM_get0_name(const X509_VERIFY_PARAM *param); + +int X509_VERIFY_PARAM_add0_table(X509_VERIFY_PARAM *param); +int X509_VERIFY_PARAM_get_count(void); +const X509_VERIFY_PARAM *X509_VERIFY_PARAM_get0(int id); +const X509_VERIFY_PARAM *X509_VERIFY_PARAM_lookup(const char *name); +void X509_VERIFY_PARAM_table_cleanup(void); + +/* Non positive return values are errors */ +#define X509_PCY_TREE_FAILURE -2 /* Failure to satisfy explicit policy */ +#define X509_PCY_TREE_INVALID -1 /* Inconsistent or invalid extensions */ +#define X509_PCY_TREE_INTERNAL 0 /* Internal error, most likely malloc */ + +/* + * Positive return values form a bit mask, all but the first are internal to + * the library and don't appear in results from X509_policy_check(). + */ +#define X509_PCY_TREE_VALID 1 /* The policy tree is valid */ +#define X509_PCY_TREE_EMPTY 2 /* The policy tree is empty */ +#define X509_PCY_TREE_EXPLICIT 4 /* Explicit policy required */ + +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/openssl-wasm/include/openssl/x509err.h b/openssl-wasm/include/openssl/x509err.h new file mode 100644 index 0000000..cd08673 --- /dev/null +++ b/openssl-wasm/include/openssl/x509err.h @@ -0,0 +1,129 @@ +/* + * Generated by util/mkerr.pl DO NOT EDIT + * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_X509ERR_H +# define HEADER_X509ERR_H + +# include + +# ifdef __cplusplus +extern "C" +# endif +int ERR_load_X509_strings(void); + +/* + * X509 function codes. + */ +# define X509_F_ADD_CERT_DIR 100 +# define X509_F_BUILD_CHAIN 106 +# define X509_F_BY_FILE_CTRL 101 +# define X509_F_CHECK_NAME_CONSTRAINTS 149 +# define X509_F_CHECK_POLICY 145 +# define X509_F_DANE_I2D 107 +# define X509_F_DIR_CTRL 102 +# define X509_F_GET_CERT_BY_SUBJECT 103 +# define X509_F_I2D_X509_AUX 151 +# define X509_F_LOOKUP_CERTS_SK 152 +# define X509_F_NETSCAPE_SPKI_B64_DECODE 129 +# define X509_F_NETSCAPE_SPKI_B64_ENCODE 130 +# define X509_F_NEW_DIR 153 +# define X509_F_X509AT_ADD1_ATTR 135 +# define X509_F_X509V3_ADD_EXT 104 +# define X509_F_X509_ATTRIBUTE_CREATE_BY_NID 136 +# define X509_F_X509_ATTRIBUTE_CREATE_BY_OBJ 137 +# define X509_F_X509_ATTRIBUTE_CREATE_BY_TXT 140 +# define X509_F_X509_ATTRIBUTE_GET0_DATA 139 +# define X509_F_X509_ATTRIBUTE_SET1_DATA 138 +# define X509_F_X509_CHECK_PRIVATE_KEY 128 +# define X509_F_X509_CRL_DIFF 105 +# define X509_F_X509_CRL_METHOD_NEW 154 +# 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_LOOKUP_METH_NEW 160 +# define X509_F_X509_LOOKUP_NEW 155 +# define X509_F_X509_NAME_ADD_ENTRY 113 +# define X509_F_X509_NAME_CANON 156 +# 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_OBJECT_NEW 150 +# define X509_F_X509_PRINT_EX_FP 118 +# define X509_F_X509_PUBKEY_DECODE 148 +# define X509_F_X509_PUBKEY_GET 161 +# define X509_F_X509_PUBKEY_GET0 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_ADD_LOOKUP 157 +# 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_STORE_NEW 158 +# 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 +# define X509_F_X509_VERIFY_PARAM_NEW 159 + +/* + * X509 reason codes. + */ +# define X509_R_AKID_MISMATCH 110 +# define X509_R_BAD_SELECTOR 133 +# define X509_R_BAD_X509_FILETYPE 100 +# define X509_R_BASE64_DECODE_ERROR 118 +# define X509_R_CANT_CHECK_DH_KEY 114 +# define X509_R_CERT_ALREADY_IN_HASH_TABLE 101 +# define X509_R_CRL_ALREADY_DELTA 127 +# define X509_R_CRL_VERIFY_FAILURE 131 +# define X509_R_IDP_MISMATCH 128 +# define X509_R_INVALID_ATTRIBUTES 138 +# define X509_R_INVALID_DIRECTORY 113 +# define X509_R_INVALID_FIELD_NAME 119 +# define X509_R_INVALID_TRUST 123 +# define X509_R_ISSUER_MISMATCH 129 +# define X509_R_KEY_TYPE_MISMATCH 115 +# define X509_R_KEY_VALUES_MISMATCH 116 +# define X509_R_LOADING_CERT_DIR 103 +# define X509_R_LOADING_DEFAULTS 104 +# define X509_R_METHOD_NOT_SUPPORTED 124 +# define X509_R_NAME_TOO_LONG 134 +# define X509_R_NEWER_CRL_NOT_NEWER 132 +# define X509_R_NO_CERTIFICATE_FOUND 135 +# define X509_R_NO_CERTIFICATE_OR_CRL_FOUND 136 +# define X509_R_NO_CERT_SET_FOR_US_TO_VERIFY 105 +# define X509_R_NO_CRL_FOUND 137 +# define X509_R_NO_CRL_NUMBER 130 +# define X509_R_PUBLIC_KEY_DECODE_ERROR 125 +# define X509_R_PUBLIC_KEY_ENCODE_ERROR 126 +# define X509_R_SHOULD_RETRY 106 +# define X509_R_UNABLE_TO_FIND_PARAMETERS_IN_CHAIN 107 +# define X509_R_UNABLE_TO_GET_CERTS_PUBLIC_KEY 108 +# define X509_R_UNKNOWN_KEY_TYPE 117 +# define X509_R_UNKNOWN_NID 109 +# define X509_R_UNKNOWN_PURPOSE_ID 121 +# define X509_R_UNKNOWN_TRUST_ID 120 +# define X509_R_UNSUPPORTED_ALGORITHM 111 +# define X509_R_WRONG_LOOKUP_TYPE 112 +# define X509_R_WRONG_TYPE 122 + +#endif diff --git a/openssl-wasm/include/openssl/x509v3.h b/openssl-wasm/include/openssl/x509v3.h new file mode 100644 index 0000000..90fa359 --- /dev/null +++ b/openssl-wasm/include/openssl/x509v3.h @@ -0,0 +1,938 @@ +/* + * Copyright 1999-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_X509V3_H +# define HEADER_X509V3_H + +# include +# 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, const char *section, const char *value); + STACK_OF(CONF_VALUE) *(*get_section) (void *db, const 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 +# define X509V3_CTX_REPLACE 0x2 + 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; + +DEFINE_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 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; + +typedef STACK_OF(ASN1_INTEGER) TLS_FEATURE; + +DEFINE_STACK_OF(GENERAL_NAME) +typedef STACK_OF(GENERAL_NAME) GENERAL_NAMES; +DEFINE_STACK_OF(GENERAL_NAMES) + +DEFINE_STACK_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; + +DEFINE_STACK_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; + +DEFINE_STACK_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; + +DEFINE_STACK_OF(POLICYQUALINFO) + +typedef struct POLICYINFO_st { + ASN1_OBJECT *policyid; + STACK_OF(POLICYQUALINFO) *qualifiers; +} POLICYINFO; + +typedef STACK_OF(POLICYINFO) CERTIFICATEPOLICIES; + +DEFINE_STACK_OF(POLICYINFO) + +typedef struct POLICY_MAPPING_st { + ASN1_OBJECT *issuerDomainPolicy; + ASN1_OBJECT *subjectDomainPolicy; +} POLICY_MAPPING; + +DEFINE_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; + +DEFINE_STACK_OF(GENERAL_SUBTREE) + +struct NAME_CONSTRAINTS_st { + STACK_OF(GENERAL_SUBTREE) *permittedSubtrees; + STACK_OF(GENERAL_SUBTREE) *excludedSubtrees; +}; + +typedef struct POLICY_CONSTRAINTS_st { + ASN1_INTEGER *requireExplicitPolicy; + ASN1_INTEGER *inhibitPolicyMapping; +} POLICY_CONSTRAINTS; + +/* Proxy certificate structures, see RFC 3820 */ +typedef struct PROXY_POLICY_st { + ASN1_OBJECT *policyLanguage; + ASN1_OCTET_STRING *policy; +} PROXY_POLICY; + +typedef struct PROXY_CERT_INFO_EXTENSION_st { + ASN1_INTEGER *pcPathLengthConstraint; + PROXY_POLICY *proxyPolicy; +} PROXY_CERT_INFO_EXTENSION; + +DECLARE_ASN1_FUNCTIONS(PROXY_POLICY) +DECLARE_ASN1_FUNCTIONS(PROXY_CERT_INFO_EXTENSION) + +struct ISSUING_DIST_POINT_st { + DIST_POINT_NAME *distpoint; + int onlyuser; + int onlyCA; + ASN1_BIT_STRING *onlysomereasons; + int indirectCRL; + int onlyattr; +}; + +/* Values in idp_flags field */ +/* IDP present */ +# define IDP_PRESENT 0x1 +/* IDP values inconsistent */ +# define IDP_INVALID 0x2 +/* onlyuser true */ +# define IDP_ONLYUSER 0x4 +/* onlyCA true */ +# define IDP_ONLYCA 0x8 +/* onlyattr true */ +# define IDP_ONLYATTR 0x10 +/* indirectCRL true */ +# define IDP_INDIRECT 0x20 +/* onlysomereasons present */ +# define IDP_REASONS 0x40 + +# define X509V3_conf_err(val) ERR_add_error_data(6, \ + "section:", (val)->section, \ + ",name:", (val)->name, ",value:", (val)->value) + +# define X509V3_set_ctx_test(ctx) \ + X509V3_set_ctx(ctx, NULL, NULL, NULL, NULL, CTX_TEST) +# define X509V3_set_ctx_nodb(ctx) (ctx)->db = NULL; + +# define EXT_BITSTRING(nid, table) { nid, 0, ASN1_ITEM_ref(ASN1_BIT_STRING), \ + 0,0,0,0, \ + 0,0, \ + (X509V3_EXT_I2V)i2v_ASN1_BIT_STRING, \ + (X509V3_EXT_V2I)v2i_ASN1_BIT_STRING, \ + NULL, NULL, \ + table} + +# define EXT_IA5STRING(nid) { nid, 0, ASN1_ITEM_ref(ASN1_IA5STRING), \ + 0,0,0,0, \ + (X509V3_EXT_I2S)i2s_ASN1_IA5STRING, \ + (X509V3_EXT_S2I)s2i_ASN1_IA5STRING, \ + 0,0,0,0, \ + NULL} + +# define EXT_END { -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} + +/* X509_PURPOSE stuff */ + +# define EXFLAG_BCONS 0x1 +# define EXFLAG_KUSAGE 0x2 +# define EXFLAG_XKUSAGE 0x4 +# define EXFLAG_NSCERT 0x8 + +# define EXFLAG_CA 0x10 +/* Really self issued not necessarily self signed */ +# define EXFLAG_SI 0x20 +# define EXFLAG_V1 0x40 +# define EXFLAG_INVALID 0x80 +/* EXFLAG_SET is set to indicate that some values have been precomputed */ +# define EXFLAG_SET 0x100 +# define EXFLAG_CRITICAL 0x200 +# define EXFLAG_PROXY 0x400 + +# define EXFLAG_INVALID_POLICY 0x800 +# define EXFLAG_FRESHEST 0x1000 +# define EXFLAG_SS 0x2000 /* cert is apparently self-signed */ + +# define EXFLAG_NO_FINGERPRINT 0x100000 + +# define KU_DIGITAL_SIGNATURE 0x0080 +# define KU_NON_REPUDIATION 0x0040 +# define KU_KEY_ENCIPHERMENT 0x0020 +# define KU_DATA_ENCIPHERMENT 0x0010 +# define KU_KEY_AGREEMENT 0x0008 +# define KU_KEY_CERT_SIGN 0x0004 +# define KU_CRL_SIGN 0x0002 +# define KU_ENCIPHER_ONLY 0x0001 +# define KU_DECIPHER_ONLY 0x8000 + +# define NS_SSL_CLIENT 0x80 +# define NS_SSL_SERVER 0x40 +# define NS_SMIME 0x20 +# define NS_OBJSIGN 0x10 +# define NS_SSL_CA 0x04 +# define NS_SMIME_CA 0x02 +# define NS_OBJSIGN_CA 0x01 +# define NS_ANY_CA (NS_SSL_CA|NS_SMIME_CA|NS_OBJSIGN_CA) + +# define XKU_SSL_SERVER 0x1 +# define XKU_SSL_CLIENT 0x2 +# define XKU_SMIME 0x4 +# define XKU_CODE_SIGN 0x8 +# define XKU_SGC 0x10 +# define XKU_OCSP_SIGN 0x20 +# define XKU_TIMESTAMP 0x40 +# define XKU_DVCS 0x80 +# define XKU_ANYEKU 0x100 + +# define X509_PURPOSE_DYNAMIC 0x1 +# define X509_PURPOSE_DYNAMIC_NAME 0x2 + +typedef struct x509_purpose_st { + int purpose; + int trust; /* Default trust ID */ + int flags; + int (*check_purpose) (const struct x509_purpose_st *, const X509 *, int); + char *name; + char *sname; + void *usr_data; +} X509_PURPOSE; + +# define X509_PURPOSE_SSL_CLIENT 1 +# define X509_PURPOSE_SSL_SERVER 2 +# define X509_PURPOSE_NS_SSL_SERVER 3 +# define X509_PURPOSE_SMIME_SIGN 4 +# define X509_PURPOSE_SMIME_ENCRYPT 5 +# define X509_PURPOSE_CRL_SIGN 6 +# define X509_PURPOSE_ANY 7 +# define X509_PURPOSE_OCSP_HELPER 8 +# define X509_PURPOSE_TIMESTAMP_SIGN 9 + +# define X509_PURPOSE_MIN 1 +# define X509_PURPOSE_MAX 9 + +/* Flags for X509V3_EXT_print() */ + +# define X509V3_EXT_UNKNOWN_MASK (0xfL << 16) +/* Return error for unknown extensions */ +# define X509V3_EXT_DEFAULT 0 +/* Print error for unknown extensions */ +# define X509V3_EXT_ERROR_UNKNOWN (1L << 16) +/* ASN1 parse unknown extensions */ +# define X509V3_EXT_PARSE_UNKNOWN (2L << 16) +/* BIO_dump unknown extensions */ +# define X509V3_EXT_DUMP_UNKNOWN (3L << 16) + +/* Flags for X509V3_add1_i2d */ + +# define X509V3_ADD_OP_MASK 0xfL +# define X509V3_ADD_DEFAULT 0L +# define X509V3_ADD_APPEND 1L +# define X509V3_ADD_REPLACE 2L +# define X509V3_ADD_REPLACE_EXISTING 3L +# define X509V3_ADD_KEEP_EXISTING 4L +# define X509V3_ADD_DELETE 5L +# define X509V3_ADD_SILENT 0x10 + +DEFINE_STACK_OF(X509_PURPOSE) + +DECLARE_ASN1_FUNCTIONS(BASIC_CONSTRAINTS) + +DECLARE_ASN1_FUNCTIONS(SXNET) +DECLARE_ASN1_FUNCTIONS(SXNETID) + +int SXNET_add_id_asc(SXNET **psx, const char *zone, const char *user, int userlen); +int SXNET_add_id_ulong(SXNET **psx, unsigned long lzone, const char *user, + int userlen); +int SXNET_add_id_INTEGER(SXNET **psx, ASN1_INTEGER *izone, const char *user, + int userlen); + +ASN1_OCTET_STRING *SXNET_get_id_asc(SXNET *sx, const 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); +char *i2s_ASN1_IA5STRING(X509V3_EXT_METHOD *method, ASN1_IA5STRING *ia5); +ASN1_IA5STRING *s2i_ASN1_IA5STRING(X509V3_EXT_METHOD *method, + X509V3_CTX *ctx, const char *str); + +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(const GENERAL_NAME *a, int *ptype); +int GENERAL_NAME_set0_othername(GENERAL_NAME *gen, + ASN1_OBJECT *oid, ASN1_TYPE *value); +int GENERAL_NAME_get0_otherName(const GENERAL_NAME *gen, + ASN1_OBJECT **poid, ASN1_TYPE **pvalue); + +char *i2s_ASN1_OCTET_STRING(X509V3_EXT_METHOD *method, + const ASN1_OCTET_STRING *ia5); +ASN1_OCTET_STRING *s2i_ASN1_OCTET_STRING(X509V3_EXT_METHOD *method, + X509V3_CTX *ctx, const char *str); + +DECLARE_ASN1_FUNCTIONS(EXTENDED_KEY_USAGE) +int i2a_ACCESS_DESCRIPTION(BIO *bp, const ACCESS_DESCRIPTION *a); + +DECLARE_ASN1_ALLOC_FUNCTIONS(TLS_FEATURE) + +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); +int NAME_CONSTRAINTS_check_CN(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, + const 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, + const char *value); +X509_EXTENSION *X509V3_EXT_nconf(CONF *conf, X509V3_CTX *ctx, const char *name, + const char *value); +int X509V3_EXT_add_nconf_sk(CONF *conf, X509V3_CTX *ctx, const char *section, + STACK_OF(X509_EXTENSION) **sk); +int X509V3_EXT_add_nconf(CONF *conf, X509V3_CTX *ctx, const char *section, + X509 *cert); +int X509V3_EXT_REQ_add_nconf(CONF *conf, X509V3_CTX *ctx, const char *section, + X509_REQ *req); +int X509V3_EXT_CRL_add_nconf(CONF *conf, X509V3_CTX *ctx, const char *section, + X509_CRL *crl); + +X509_EXTENSION *X509V3_EXT_conf_nid(LHASH_OF(CONF_VALUE) *conf, + X509V3_CTX *ctx, int ext_nid, + const char *value); +X509_EXTENSION *X509V3_EXT_conf(LHASH_OF(CONF_VALUE) *conf, X509V3_CTX *ctx, + const char *name, const char *value); +int X509V3_EXT_add_conf(LHASH_OF(CONF_VALUE) *conf, X509V3_CTX *ctx, + const char *section, X509 *cert); +int X509V3_EXT_REQ_add_conf(LHASH_OF(CONF_VALUE) *conf, X509V3_CTX *ctx, + const char *section, X509_REQ *req); +int X509V3_EXT_CRL_add_conf(LHASH_OF(CONF_VALUE) *conf, X509V3_CTX *ctx, + const char *section, X509_CRL *crl); + +int X509V3_add_value_bool_nf(const char *name, int asn1_bool, + STACK_OF(CONF_VALUE) **extlist); +int X509V3_get_value_bool(const CONF_VALUE *value, int *asn1_bool); +int X509V3_get_value_int(const 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, const char *name, const char *section); +STACK_OF(CONF_VALUE) *X509V3_get_section(X509V3_CTX *ctx, const 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, const ASN1_INTEGER *aint, + STACK_OF(CONF_VALUE) **extlist); +char *i2s_ASN1_INTEGER(X509V3_EXT_METHOD *meth, const ASN1_INTEGER *aint); +ASN1_INTEGER *s2i_ASN1_INTEGER(X509V3_EXT_METHOD *meth, const char *value); +char *i2s_ASN1_ENUMERATED(X509V3_EXT_METHOD *meth, const ASN1_ENUMERATED *aint); +char *i2s_ASN1_ENUMERATED_TABLE(X509V3_EXT_METHOD *meth, + const 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(const 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); + +#if OPENSSL_API_COMPAT < 0x10100000L +/* The new declarations are in crypto.h, but the old ones were here. */ +# define hex_to_string OPENSSL_buf2hexstr +# define string_to_hex OPENSSL_hexstr2buf +#endif + +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); +#ifndef OPENSSL_NO_STDIO +int X509V3_EXT_print_fp(FILE *out, X509_EXTENSION *ext, int flag, int indent); +#endif +int X509V3_extensions_print(BIO *out, const char *title, + const 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); +void X509_set_proxy_flag(X509 *x); +void X509_set_proxy_pathlen(X509 *x, long l); +long X509_get_proxy_pathlen(X509 *x); + +uint32_t X509_get_extension_flags(X509 *x); +uint32_t X509_get_key_usage(X509 *x); +uint32_t X509_get_extended_key_usage(X509 *x); +const ASN1_OCTET_STRING *X509_get0_subject_key_id(X509 *x); +const ASN1_OCTET_STRING *X509_get0_authority_key_id(X509 *x); +const GENERAL_NAMES *X509_get0_authority_issuer(X509 *x); +const ASN1_INTEGER *X509_get0_authority_serial(X509 *x); + +int X509_PURPOSE_get_count(void); +X509_PURPOSE *X509_PURPOSE_get0(int idx); +int X509_PURPOSE_get_by_sname(const 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), + const char *name, const char *sname, void *arg); +char *X509_PURPOSE_get0_name(const X509_PURPOSE *xp); +char *X509_PURPOSE_get0_sname(const X509_PURPOSE *xp); +int X509_PURPOSE_get_trust(const X509_PURPOSE *xp); +void X509_PURPOSE_cleanup(void); +int X509_PURPOSE_get_id(const X509_PURPOSE *); + +STACK_OF(OPENSSL_STRING) *X509_get1_email(X509 *x); +STACK_OF(OPENSSL_STRING) *X509_REQ_get1_email(X509_REQ *x); +void X509_email_free(STACK_OF(OPENSSL_STRING) *sk); +STACK_OF(OPENSSL_STRING) *X509_get1_ocsp(X509 *x); +/* Flags for X509_check_* functions */ + +/* + * Always check subject name for host match even if subject alt names present + */ +# define X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT 0x1 +/* Disable wildcard matching for dnsName fields and common name. */ +# define X509_CHECK_FLAG_NO_WILDCARDS 0x2 +/* Wildcards must not match a partial label. */ +# define X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS 0x4 +/* Allow (non-partial) wildcards to match multiple labels. */ +# define X509_CHECK_FLAG_MULTI_LABEL_WILDCARDS 0x8 +/* Constraint verifier subdomain patterns to match a single labels. */ +# define X509_CHECK_FLAG_SINGLE_LABEL_SUBDOMAINS 0x10 +/* Never check the subject CN */ +# define X509_CHECK_FLAG_NEVER_CHECK_SUBJECT 0x20 +/* + * Match reference identifiers starting with "." to any sub-domain. + * This is a non-public flag, turned on implicitly when the subject + * reference identity is a DNS name. + */ +# define _X509_CHECK_FLAG_DOT_SUBDOMAINS 0x8000 + +int X509_check_host(X509 *x, const char *chk, size_t chklen, + unsigned int flags, char **peername); +int X509_check_email(X509 *x, const char *chk, size_t chklen, + unsigned int flags); +int X509_check_ip(X509 *x, const unsigned char *chk, size_t chklen, + unsigned int flags); +int X509_check_ip_asc(X509 *x, const char *ipasc, unsigned int flags); + +ASN1_OCTET_STRING *a2i_IPADDRESS(const char *ipasc); +ASN1_OCTET_STRING *a2i_IPADDRESS_NC(const char *ipasc); +int 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); +DEFINE_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; +DEFINE_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; +DEFINE_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; +DEFINE_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 X509v3_asid_add_inherit(ASIdentifiers *asid, int which); +int X509v3_asid_add_id_or_range(ASIdentifiers *asid, int which, + ASN1_INTEGER *min, ASN1_INTEGER *max); +int X509v3_addr_add_inherit(IPAddrBlocks *addr, + const unsigned afi, const unsigned *safi); +int X509v3_addr_add_prefix(IPAddrBlocks *addr, + const unsigned afi, const unsigned *safi, + unsigned char *a, const int prefixlen); +int X509v3_addr_add_range(IPAddrBlocks *addr, + const unsigned afi, const unsigned *safi, + unsigned char *min, unsigned char *max); +unsigned X509v3_addr_get_afi(const IPAddressFamily *f); +int X509v3_addr_get_range(IPAddressOrRange *aor, const unsigned afi, + unsigned char *min, unsigned char *max, + const int length); + +/* + * Canonical forms. + */ +int X509v3_asid_is_canonical(ASIdentifiers *asid); +int X509v3_addr_is_canonical(IPAddrBlocks *addr); +int X509v3_asid_canonize(ASIdentifiers *asid); +int X509v3_addr_canonize(IPAddrBlocks *addr); + +/* + * Tests for inheritance and containment. + */ +int X509v3_asid_inherits(ASIdentifiers *asid); +int X509v3_addr_inherits(IPAddrBlocks *addr); +int X509v3_asid_subset(ASIdentifiers *a, ASIdentifiers *b); +int X509v3_addr_subset(IPAddrBlocks *a, IPAddrBlocks *b); + +/* + * Check whether RFC 3779 extensions nest properly in chains. + */ +int X509v3_asid_validate_path(X509_STORE_CTX *); +int X509v3_addr_validate_path(X509_STORE_CTX *); +int X509v3_asid_validate_resource_set(STACK_OF(X509) *chain, + ASIdentifiers *ext, + int allow_inheritance); +int X509v3_addr_validate_resource_set(STACK_OF(X509) *chain, + IPAddrBlocks *ext, int allow_inheritance); + +#endif /* OPENSSL_NO_RFC3779 */ + +DEFINE_STACK_OF(ASN1_STRING) + +/* + * Admission Syntax + */ +typedef struct NamingAuthority_st NAMING_AUTHORITY; +typedef struct ProfessionInfo_st PROFESSION_INFO; +typedef struct Admissions_st ADMISSIONS; +typedef struct AdmissionSyntax_st ADMISSION_SYNTAX; +DECLARE_ASN1_FUNCTIONS(NAMING_AUTHORITY) +DECLARE_ASN1_FUNCTIONS(PROFESSION_INFO) +DECLARE_ASN1_FUNCTIONS(ADMISSIONS) +DECLARE_ASN1_FUNCTIONS(ADMISSION_SYNTAX) +DEFINE_STACK_OF(ADMISSIONS) +DEFINE_STACK_OF(PROFESSION_INFO) +typedef STACK_OF(PROFESSION_INFO) PROFESSION_INFOS; + +const ASN1_OBJECT *NAMING_AUTHORITY_get0_authorityId( + const NAMING_AUTHORITY *n); +const ASN1_IA5STRING *NAMING_AUTHORITY_get0_authorityURL( + const NAMING_AUTHORITY *n); +const ASN1_STRING *NAMING_AUTHORITY_get0_authorityText( + const NAMING_AUTHORITY *n); +void NAMING_AUTHORITY_set0_authorityId(NAMING_AUTHORITY *n, + ASN1_OBJECT* namingAuthorityId); +void NAMING_AUTHORITY_set0_authorityURL(NAMING_AUTHORITY *n, + ASN1_IA5STRING* namingAuthorityUrl); +void NAMING_AUTHORITY_set0_authorityText(NAMING_AUTHORITY *n, + ASN1_STRING* namingAuthorityText); + +const GENERAL_NAME *ADMISSION_SYNTAX_get0_admissionAuthority( + const ADMISSION_SYNTAX *as); +void ADMISSION_SYNTAX_set0_admissionAuthority( + ADMISSION_SYNTAX *as, GENERAL_NAME *aa); +const STACK_OF(ADMISSIONS) *ADMISSION_SYNTAX_get0_contentsOfAdmissions( + const ADMISSION_SYNTAX *as); +void ADMISSION_SYNTAX_set0_contentsOfAdmissions( + ADMISSION_SYNTAX *as, STACK_OF(ADMISSIONS) *a); +const GENERAL_NAME *ADMISSIONS_get0_admissionAuthority(const ADMISSIONS *a); +void ADMISSIONS_set0_admissionAuthority(ADMISSIONS *a, GENERAL_NAME *aa); +const NAMING_AUTHORITY *ADMISSIONS_get0_namingAuthority(const ADMISSIONS *a); +void ADMISSIONS_set0_namingAuthority(ADMISSIONS *a, NAMING_AUTHORITY *na); +const PROFESSION_INFOS *ADMISSIONS_get0_professionInfos(const ADMISSIONS *a); +void ADMISSIONS_set0_professionInfos(ADMISSIONS *a, PROFESSION_INFOS *pi); +const ASN1_OCTET_STRING *PROFESSION_INFO_get0_addProfessionInfo( + const PROFESSION_INFO *pi); +void PROFESSION_INFO_set0_addProfessionInfo( + PROFESSION_INFO *pi, ASN1_OCTET_STRING *aos); +const NAMING_AUTHORITY *PROFESSION_INFO_get0_namingAuthority( + const PROFESSION_INFO *pi); +void PROFESSION_INFO_set0_namingAuthority( + PROFESSION_INFO *pi, NAMING_AUTHORITY *na); +const STACK_OF(ASN1_STRING) *PROFESSION_INFO_get0_professionItems( + const PROFESSION_INFO *pi); +void PROFESSION_INFO_set0_professionItems( + PROFESSION_INFO *pi, STACK_OF(ASN1_STRING) *as); +const STACK_OF(ASN1_OBJECT) *PROFESSION_INFO_get0_professionOIDs( + const PROFESSION_INFO *pi); +void PROFESSION_INFO_set0_professionOIDs( + PROFESSION_INFO *pi, STACK_OF(ASN1_OBJECT) *po); +const ASN1_PRINTABLESTRING *PROFESSION_INFO_get0_registrationNumber( + const PROFESSION_INFO *pi); +void PROFESSION_INFO_set0_registrationNumber( + PROFESSION_INFO *pi, ASN1_PRINTABLESTRING *rn); + +# ifdef __cplusplus +} +# endif +#endif diff --git a/openssl-wasm/include/openssl/x509v3err.h b/openssl-wasm/include/openssl/x509v3err.h new file mode 100644 index 0000000..5f25442 --- /dev/null +++ b/openssl-wasm/include/openssl/x509v3err.h @@ -0,0 +1,162 @@ +/* + * Generated by util/mkerr.pl DO NOT EDIT + * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_X509V3ERR_H +# define HEADER_X509V3ERR_H + +# ifndef HEADER_SYMHACKS_H +# include +# endif + +# ifdef __cplusplus +extern "C" +# endif +int ERR_load_X509V3_strings(void); + +/* + * X509V3 function codes. + */ +# define X509V3_F_A2I_GENERAL_NAME 164 +# define X509V3_F_ADDR_VALIDATE_PATH_INTERNAL 166 +# define X509V3_F_ASIDENTIFIERCHOICE_CANONIZE 161 +# define X509V3_F_ASIDENTIFIERCHOICE_IS_CANONICAL 162 +# define X509V3_F_BIGNUM_TO_STRING 167 +# define X509V3_F_COPY_EMAIL 122 +# define X509V3_F_COPY_ISSUER 123 +# define X509V3_F_DO_DIRNAME 144 +# define X509V3_F_DO_EXT_I2D 135 +# define X509V3_F_DO_EXT_NCONF 151 +# define X509V3_F_GNAMES_FROM_SECTNAME 156 +# 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_LEVEL_ADD_NODE 168 +# define X509V3_F_NOTICE_SECTION 132 +# define X509V3_F_NREF_NOS 133 +# define X509V3_F_POLICY_CACHE_CREATE 169 +# define X509V3_F_POLICY_CACHE_NEW 170 +# define X509V3_F_POLICY_DATA_NEW 171 +# 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_SKEY_ID 115 +# define X509V3_F_SET_DIST_POINT_NAME 158 +# 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_TREE_INIT 172 +# 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_V2I_TLS_FEATURE 165 +# 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_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 + +/* + * X509V3 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_INCORRECT_POLICY_SYNTAX_TAG 152 +# define X509V3_R_INVALID_ASNUMBER 162 +# define X509V3_R_INVALID_ASRANGE 163 +# define X509V3_R_INVALID_BOOLEAN_STRING 104 +# define X509V3_R_INVALID_EXTENSION_STRING 105 +# define X509V3_R_INVALID_INHERITANCE 165 +# define X509V3_R_INVALID_IPADDRESS 166 +# define X509V3_R_INVALID_MULTIPLE_RDNS 161 +# define X509V3_R_INVALID_NAME 106 +# define X509V3_R_INVALID_NULL_ARGUMENT 107 +# define X509V3_R_INVALID_NULL_NAME 108 +# define X509V3_R_INVALID_NULL_VALUE 109 +# define X509V3_R_INVALID_NUMBER 140 +# define X509V3_R_INVALID_NUMBERS 141 +# define X509V3_R_INVALID_OBJECT_IDENTIFIER 110 +# define X509V3_R_INVALID_OPTION 138 +# define X509V3_R_INVALID_POLICY_IDENTIFIER 134 +# define X509V3_R_INVALID_PROXY_POLICY_SETTING 153 +# define X509V3_R_INVALID_PURPOSE 146 +# define X509V3_R_INVALID_SAFI 164 +# define X509V3_R_INVALID_SECTION 135 +# define X509V3_R_INVALID_SYNTAX 143 +# define X509V3_R_ISSUER_DECODE_ERROR 126 +# define X509V3_R_MISSING_VALUE 124 +# define X509V3_R_NEED_ORGANIZATION_AND_NUMBERS 142 +# define X509V3_R_NO_CONFIG_DATABASE 136 +# define X509V3_R_NO_ISSUER_CERTIFICATE 121 +# define X509V3_R_NO_ISSUER_DETAILS 127 +# define X509V3_R_NO_POLICY_IDENTIFIER 139 +# define X509V3_R_NO_PROXY_CERT_POLICY_LANGUAGE_DEFINED 154 +# define X509V3_R_NO_PUBLIC_KEY 114 +# define X509V3_R_NO_SUBJECT_DETAILS 125 +# define X509V3_R_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_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 + +#endif diff --git a/openssl-wasm/lib/libcrypto.a b/openssl-wasm/lib/libcrypto.a new file mode 100644 index 0000000000000000000000000000000000000000..c1359c06d9ee7ffab37ddda57d077c58b74a527c GIT binary patch literal 3084270 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≪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�ZTzz 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
>(aY%dFcrdFj(lSf|9ke_wj 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

TdF6rwOHMc9u$*P8t#IG>gb>tgqZH)P@N=*$R)T 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

w=$0%L@&RjKPO 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�Ll;37>q>l={(QwZ(Vj89bAXL2E&qrvidXbP8 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�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 nH2Wil46v%R-X+b)nEt(t5% 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

kVClR8ELa4u9yZiX$A->6;0!!Q;5 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 z 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�QMuokB?q#1DmNxSdT?G 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 z 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

aU<}xR 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

PW2MB0Z&m0S>QQ!*G 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�Cl36o>+bHF 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%0D^+c&RQNJW z3O*MUWPQz8L6{0b`$jMeLPp3v9Mz)U7o`MbWTV_H8LK6Ow2WvVl?2@}SPg^uduWI` z5OsnP0*D1BWNc6fD!5wcxS7?1M5q`#Lg!cN>^Wv6XGA0ZL(p-kfX2E4z_C|?5OA9+ zRd<{oyVjvX&sYaE91RSiFwoXl062_dqMxS+IzUk2jTaLaA~BG`Gh&}0vpwBWh@5d( zS;Z%jyDXSD5#`S697ft#KnloVaH)JYgj`hsIoNPNv_g+p=)oK)9X~JV_>OqT6KDsH zH?&kMk37<(iQ_jB1Yb=EZ_V?fUYT+Xn+5eU+Yw0m<6z*8OWCsrImi!G?V z+J8By9l9amP50>=}MBO+ag#4LYViUz7E|~3o3Q}JAz8%3ks61tQW*{!<~($C+M6T zOh-^FbSxaqi`MKmv!J6!pf%S2;N(1hOUq-d7VYO#h@r!0kU%9@0V?&V z0GfY61-aO2gxsW*kG2G2`rHyhbFhJlIcAL&-6+~Fn+iu7{m?WT?Lg8k8Y{SRDso+Y zwF;SC(dy7T&{iOt>3B+(MQF!V8wSdwcC2%g2w6GF$-=ETmD?o!tC zj%Tj!1cI#X?iR)VK&R%vAkM+>x{^4S2_0$T$lu+o#T#kZP5zsw&T#?xZ_<`(&nzvr7)T!|qFk`RGsf zcn?oAHF6x6uF{l1I`*8!;H+C(1T*T&lm+AaAG zIx5lrCdaFTSn0~Ohxi+N4_ya|+po=Efp*V=ujZ2Y{d?9R;c}b~B?(JGhd|2hki0EP zLF~hb1$E?L&|x6TIv=hlKo|6%alD!+cF}w$7Wyxt&7ST|n{* zM}4P51Xj|es`HXwvxK7Y<>#Zz`Ql1%OL{|1p>iP2;66Q>^!l3|VfmHa8>CAwLkicV zNuxWH-XIf>HOmtr*-ukmzc4%GUgbX??-m7N<1zRF8CZKPzAsl^19Fy3y!7V|WqMo= zhWRTb$5RTuiq*bDc|)YxlInPcNr4ZQfow?ztW8e87harV;<)$Xprl@M`iVGf>DdMv zBP3!=Vxr%G! zTyS{hj2-?d)yeJRj4RJpT%XQ1eoWbN(IX8G`{xXM*myiuG< z<+-KuO1Z^L8{{1)7s3|yGZR$a6{jVhtFI0_t;0&|DmgL9X^Ur(ipsLI$Fm3^qf48w z7znO*#Ir~(Wm%?-Dm|FYoRr?^PG?z8Gr-cE5a)KLj;L5|*&wEs<*Pi{>1Fv!M=Z#T zGovhD>98dq#Lb=EhF9!j1R=qEoZZW^mDH%S?J>GyZROYiIeV66l^QE#jf=mxw~Q_l z$Zj3OqNc%-)!sHXej>HEkE0>6)Q<6dDh?>y&4K*y?vY$;M-}A6bK0SpVS~hFY^PL1 zmOH0eE)hEJC>Bs#VP?06VO$UH#ZLR0=)oZ3loZk{31LTn*+#BKi`x!~;Bmq)kRc#I2 zW=#{_!3|AQ_j#fN<}dYtd9)ERozXfG0Z;WrnPAt>xsvPXw+7F?fSjXCXHH z3KJtHj3|;#Mo#b5{%ive9;Z9A37IhU2>${UMXE}e`2n}vf*g;`qx$Fev8p)9VWLfn)Jah(<7 zDhP(QRuBwrtsofs{|oB&OzKNemwvzm__*Ne-PZr-1y|L1iNWepeC|m=3=Bf7-melv zAr_cuR39PcI0rFjJ58YZK&bUbXPCOjvAiEUcvL=yh!>n@I?FAn@41$DgNv-&-Qh&f zxQ*&P#B53;=JezUsDCFL)%6g1y^UiYNREVe*JLC8J~>Rih1mC?#ZN~=%JmXRxZa|g zX}c<@=OGIFvO@Mx)MyCJr5YjXYI!$8)YaRX!b|%n5Pbb@YOHz{v2UeN!H0;rAU#Um z28q|LX=Hm0BCz!9bR)fyZdMA}oc^<)Nej2Tq$0wO-h zG^_I=9lHf=Yw!Es1fn~21H}e%_7$o*%tC1%|eyx zwUVbet~+b9@2dENPM*(i4BYB^afvD+c1T0Z1Cx)4NK`Z5R-#VBl1!s+`6woUh1om zm-<)8OZ^+UGnSG2|FHMvaZ*)xzUOXrs_OPqy|2(!)!l%o*c*$)7_NW@TJLBJHNBsbARiu2MFh&e-zGd`UEtW<_PCh(wACo%oWb12Fh+S`h|0wfmV+i z2MK4LaWLsn9U`DYHBUIp%>#vVt~nr_Yt8w>xxqY))TaRD5ff0JHwQ^~3hGtgnukIY z%UU3uH5Te!ZlT_-)~|(gCn734uUiYDhGh*2=UBT&m{-{if490*hxQ-gt4^i2r90K# z(KU%xr^3;EuO)VU+}E8_QG6-1uTXJ({iwYt5C^E}zQSBX!r>95^8+QO`SS+*`-Xaz zrkANSgtnmDR5Ye!4Zpl*;xRX)aWu2pw*w_WohCmfEGP0J%(7xtWswN84gstRgblqvo4)^yY0UTG@UU!P z&6d@4B|Y$n-kCF|Da=Y}Xnu(rZJ8eJ^k41Ev5gs7Hp}FC;1MtGAL_-+VZY#_QU-zR z==5F+BFlLy7(3qja93d9{m1`1Kw}QEN@8IJ3^95s{3R5&U zsBoa#g^Py|(G%`Z;_#up%-@ncF%b~Cd>*UPXUk>k_a%*BE`LjEU);l1^|wrmWl=cu z63c0ovu>5y(5O_aWb!HG3iCaf2p`$XvM>+vGp#oMnP#bKi8+PUX|m*QPI(1{)L8`- zq;NTq!9n<&;udi1Xdwtoie++*5T@H6M?@O%#-)@pkpjjcRUtX`Aaf&kWhE-;3I%mk z72@n+NB3rW&lBncga-Uv<$5zBy+JR=?`^#9jbUe~T53R#$#6Ht;AFC3uux5~%_-`? zw3%8)J#s)hQpv#MlfLkYSyL2NV3WoPOkIS!!0$r6v%nrPvdGP3&mb&tvLY13P%wDg)fJ+*GR$~6}HwvXofe9p> zNH>DwXuQV&AR`7)OG&*c>fM(6fZ$nsM$`n+N+2{xBy}e(2RINicuqL5k4^tq9!2O6h;rwKwL`3y!CKusI)(_aDs_0p%x%@R8)?xAeF$ILho{8 zk75(DLoV*}>%1;E=eqPKm?sV~01-G)!qXjEqo+O6=5!ze9gCQfi>vUCQ2&Z4QLYjr z2NTbV2bfkp(y#Km{Vvz7q6#R*x>2M@<`CiGd)zNk(Z_&i+eN!v#3{3AZcyd`u_b5r?>`AbY5H>zr`!i68 z6Ds-#w^1=X+2_rLfNIxbzIo`eKL>@+LqxC6dL;gYMBn^>={tfXg0CZ?9vVozC)^l4 zI(`g~FE|rJBBn10+je0#KveUaoZMVJ${=B4fkeQQg0KN%Y8;q8*QL`WkpzxF_#^Q1 zx-1OeY^)-4*}P{Xq!$oZKt7SH-Qx(jeem0M+i05#WsHxJgad9HwB$g5g%7qn7}|kT zj8r8&UcmhX{7t~Yg!UO>CrPs$Wa=d%P9kf4Unf96rXiy`k*BIIpJ}0+!FyWNQWryy zW{d+1CqD~s7Wr9V8{}t!YmlD>rh&K|4+{SdK6USD)1B!OQ9UaSxxMLjL-0M#7C(2~ ze}cQJekqn3ak&!FlrJ_CuwpW7aj)UHj~OU@2F8_d8iw4A&-aEQ&M;kh9WL1S;~Ddm z2{#!UB*F%-TC+sapCRpM)WR^lDkSTFae56M=<{C)w)H;H*)?(Jg7<;H&6eUjItKZ= zxP>=?qF4S>zKhO-n1Qdl>du|ZgCtj7lSB2`l@Z-371y2H@*Oc|;bmkAj#;SMtBYMM z`3C3Y>CCUA%%b}2x`Z!oIh}c(Tc8K7^Z9D&x~u32iLvt1@u4&P5dHgPeA5YU<1?u9 zs2-j8qyn>8=aKSKD({5CxxH?ix=U~4WcQyGABK2%6e3fpFBeqOJv zRZ!%x^py%6mg(m;!ZQJu4MpFC@NlqYbzXh-jzABM+We9t;+9TJ#I`Ap=)#kun4lqe zve0uTRUUZ@B0)s(Y)d(3@LWdyfD}ish?pSC%Fk~`%<=pK{|7%j#LcvHL;Os{O9L+q zlofTBY%|=k_|@r1n1N2guRWxkWw^h>uik`UJCx8N>BOB%@K zz*Xr_!V(UL{okV*8s8S?FY-^$^fq}ZogI@VP2j^bWQV4_o%_5L<4EJk0~A9AhJ^G> zaZnUX1!X>O#Wz@sf$f4nlrRIvTzVp={l|3ZZQ*duXK?UATFBsFCP_;37a+htNNqo6 z3xwbQ7cN++N|@mhE(tgT%<-rVz3fv74FCFve$$T=7^oIK@Z)s(>}6+dRL5twaDxJd zf&xSAmW7KK_4W@9Ef^B~vLCL=XFrdih;f-3S(wMN748dnm(P7+N(P)MFf}4$+yZ;c zCoxq0!VD|+f*0mv^)4nSZ0ZqLkz?a5fP+c!(o}xQZZr1o9Uf#;y@N!Y7s0%)MZJ7} zDVejX$h7Q(Yb>9z^ZN%CPo}_M>48U=oHE^zwOKeGvq>&ti-* zUOv#SppC8>+7C?VLxvRS(!KZn>GW9)IKV^QO!nP> zpXs6frR)+9?jP)jPH2DcZ@N|cvZ=H7-)CRU@S>qXV&CxuM>v~Fnos3oET=;d^rfC- zT5SNT5o#@j_$2#|SHKSEH_ds*ec8 z=nSL7;bJU`w|gqqFC#_~cL*~?W?F(g??lkd(Qy9Cy)s*z>@?3HDm5z9f`3t8vDmV< zVzCW)lYb;I03N7@ZUOp2A2>11VX=`1kLGKuuxt&>0jvWeur~e8uwojP1gw1`u*keJ zGR|${71yv5fQ5rW5s=4t-`@-?sbRT*)e(UO%eB7^tr88Y6rj=(Q0c!FRG9`<4p6XC z3yly4X&S2tnHv4Qs<%eLR#TQ?CfMjCgX1L|8wtOQo(_Lp8PH+Z$IC!;)##VOG zY{3e0!zL5QvNc65SRF5dQIL^q% zF%Bc^I|u~g7dd(~1fAOcAc!XwLNpXa#3N+!L7Msj&pgE;ZL^RK*l7p+X%=)f5oVLV!$1{+n&>S2hEmGG} z?-aJ_NI&Wa3pmi9MRV2xw*2)xL7?+bOCc=)kKalCj&Z($|Gklmbxb52qAFZq7H9)y z3U(quKb(|gtSA)C5P^qGq_)rrmOr}q|700K<3`}2tQWr%1r{Y5MNXRZ?D970Kru=H;s+(2p&+H%hX&&79K0BNVw z#!HWre4g_NAIc*ob&E(|#1*R}2*k4su6F#r{>G9TLkj@i8l3;kFgoVWBh2(q|T1 z)>~vaOF}BdH>5Cetw0J`(b+=qBj?rU^cmOJ`5P*`1>@PU{ev5y?Vfcz+&-XK4(99G~0-nTPUyUd7{d zMGPc-uG3W)w@cf7F_tsPKNSY~X6{H(n>_a~lRflufat}3XBY9M5swj;$~1BiIW^_p zEqO&0=1vzqkyiw2`$ca@i-=~JMxl2reAlN_Q{DBk9*|JCePQPQAfn^DG9H)FOFUod`4W%4OP6>&OX%FdiNjAQ zO{AljqC<-2s7af{6uKztjug-xZP5n@waZ=01s<9!83^7hO^+_)3Y4mC>I<5>X7iE9 z7wmAI==E9E*@Qb!xK8w1tm@E(I9w-s-Boq&%c~Q;#;Q8Fz=pv@ucxX?I$9-q?Nn88 z;nYxwBo{JCQZTvH^Xbq3DlQ0Uik%fKjhmuH{;K34@wj!F^j4+z58ODdHL$a=&G5pF zO~2JUD4me{UiQ%7M)?Tcm1~qc zXmY>OR$0Pw9NV-VL(q8z963;L7AjdXE!8bf@{R!yf*PjTGmjrml3x?-)M}b#dQs3V zOgu$-5TEN=&szT3|FXu2p86Ef8i8ZImwDdt0)xjmLNgDjCpnl8nBKTKMFrFIUn{VU zQ=8r zuBIjo9>*u$LwI7&$Q#Ey{y13a2g~pByb2%s6|hWX>Kev_(8Z`3VY;bnE<=jNV(J|Q zkn-2$=RPDHwUUlzI+GKM$dp6JGwBR5o?jF!pmn-A=9JI#@B*THU`)*`P8Gh3Fn5s_ z5*~~(1n*UwEiGO5%VR*8c5F}g3S&R9?LPxmz@Lo#K}&s`f7H&(t7YY9GZkt z_URj1bcD`&-f(06hxN@PpA8!f*Pb>LTD{&T{Mv8U4E%!AjQF&9L%R0+Mt%$|1go>! z$pgjLhU?DQC+(@wZOAy*bd$Tx8{}vtgv+U>TQ-Z`HuMi6S{Lc)dKZ~)eK3Z}`PkoL zx^+JG1%*$TZc}(H1r^?gHV%)B;&Odtx(!Pw~Mm!_N0gQMipmRpw_!el?v z7eaoaa3x~YP3Dnah?{m2IjbxeK}`G+PY#duCIqaDjFrGY2=ImB-yjX0gTj|BSF-js zbjQ3`(bp^{&>NO(&DaN7Z(DABZZHoYBlaEBP0!0$R-kz1!Bt02Bkefbb>=KscmyDv zgrA2kfcy}l=IkJ79J)IlSN4#q+9hPhhX_>@i|Bi^TAHvYAsSFr6l8r;!4uSGnk0YRK2HiB@da=7FE1<0gZMMltLbjKuEmS_f73KDiSk*0} z>kJ86#5R6Hqd+JlUx&@yrHoL~I^Dn|1hP9LpaGXta*Hb9A?lK^&;ZptD8YrItw8TC zkt^=D>ER0_QolYl>EJrRPfd^ls(6TYP?tiU2V|m7S9~QItZS{o^7oOhXNO%1DQ>E|i1dIpHLt;)D!!I}sKK6bglf>O{nw zunz>pxCte@5V;0~4~4JlLX?^i{I0HAqKrT3UEOs!L{ni82|e{;v*NDt4FUnVnqZ|| zLDLwX_}K{i#UZ-FnIYJd5WX#x+<8RU+d+2+JTc@-yE|JTbh4+gc(gdY?yfW~SvX=C zfk0IhnJJad0qC08M3l;iR5q8{J)w=r(JE4HBGoQZqeN=7NR1Jx?L=y8i_`?ej{OFzmDoPw3d2Z6q`b4q^T#Xv)T%1bs+_;5 zh}z75St%yJVR4Ph{93TW%+G=mW_}iIF!QsDm|%87fv3P6^uNtU$Nm2v-$i^t4$DI7 zSk9ve9ApS+Vc`hg(~y0(IM@+K#N-J^vpgH0^+v*d*%%?*zZfvk{McxbUn6I!nHKIz zCURDqE%H(`;a+2AgnKjPJb;`hkn;>Z(BC$*(AG^rTenq+6;@WRv=Z(rt4)ZTtgLw2 zYL_n~W0N%sMvYdByuwbn*W06od%HbGh(}-wy244gXFA)#(Z4fR-0W;G??T1{4vZ$B zb6VuGSi(Ia2Cl)%*jRBxY@E0wwv%`VzrVxpW93fbW;s?oCdY~O_#cTNeE`Fa28_wS*#)+E~JBh#G_h0dQNpdG~ZE~!*J2_51oJ_cnCt)DEG1(%& zO*V^jTtlpKvrG zc(?>w$m>c<#mgmS;^UH(_`akB_Sz6Ylwyn7vDoxEYB%D>1JRAn_a$uT)MG;x!~bL*nbo z>1b1hHdSa-wL97%aU&A9SM4FheO0b_sp_ZlePnE|LSNriRk^2B<9d7{EIxl*-7Frj zHpDa4arseoLVQ~d1@4+UC~()fa&1k*y}AZezM-a6JW`Vq&(&1O&B*+!25^?uR*92p ztL4htgt)TSbZ@Cev%70u`E+f)2%hq@~9 ze4QaS)-{Q5>P&HTeT7(AUoEbwPl-G0E95Kn3HQ}{RD7?#N_<*hEtfT5`86Qp%!Vp? zVMC2r)8NQk8=B>V_sq?xi%4v2nF2fQmM-yGizk<+o5lHQL##>1#lvY+JdsX`4e1K` zS-M7iop$8unS^_82GqDDQzfp-REv8vDfxJ&Sw4@?hbY`kh2Np@wCvC1nry$bK3Cv>P#3LytAT62HLE?0;^J2-9Y!gR@PK3ZWUZqH8iB-4>xaub;Ck=f1@n`DWI~t83(>3 zbvcU=Di&xUqCAU=tg~3e2-V>cg;ZYI>XlU=m2#hNQyZwaMj&q^Fhgv&nQU9jXlivo zZ34S!LGNxem4=;*TBKF_FAIj|s+>F%W!8_aL@hK5tGKJm5(TV5S1^`gaAXAMmTHZ} z!}{hUjy(85AX`Of)JjQD!P|oVYo3;GF~v|e6^W?-Qet@FpaRT#f6&b%1w&>!P?T6b z;GD)J=@2r0sbRc+6%IF|N6DI%1*)*%6ATw=xpfsn>tbe90v{**F%8qkp8&VtG;OE{ z9#7R&Acv0e6O?w~sN@&W5fJG-qZHO-C~B0VOIW0sGfL695KzJTuucSW37x-`^Yi*x z1{e^rpa^Xm&?aqY7OXDG>qF-j^r7>M_Mt`hMf%Vsd41^IfE$TXBn%HE%Zepr z9h_Q5#LgJpkbOccqhW&M3DO2INETtbkDKV9g%+$*1CcBz7z2{?`55>(D84$e$qmxt zD~bhp&fu~`W~6PWc~Squ)=GA2To`K2@4!+Lu=0P zKu9=YD2*C_RfX4RmKorx1N5tOH&~KOKmZH9lfdCvqL<1i)d|wWQJA6-s<7bvLGFP8 z`+Y>#BIb`ILtv7Fm^?$iKvrYT10_w&G7}FN&>c`S+#To$^fAo_=^+6d%*-ChqZ&jf zg`ZXtf>skmxG3QUx()!*Oi(s}Ff|CA4*}~Zt$I?@J5Iwp4NWM7Lq@s3yp&QAvIMOz zKvNko&33P}jrftEh(W^%yU6#~Db?mf2NOw)86OKDUP~5Q1mzin6B+0dW7tOy%*0Uf zTWJum@w2LsHc7;&H47lUfn*3fgu91)h{;GoM!?O=Oq>N&^qVqZGEP-Um;tGa-^wRG zS`lfpPKM=j>NmAQAJhuv5V$B(c}MP9N<)FJ1SDLn*yh14yvic1b6FZUtWIq!k6&m> z`ah6TSxP5_gjNQ<72Ld$Wt~Zr(2&=6?^~Y8^AMjy7^0gujZp$@D z$1o0wl^YrZ^h1=8R?QGiBF_QSUlE>k!vtmW;v>Y>EMzH5&0a86Xn9~EV72QlV<`n} zEI>$nMbU-Dx@qBs#Tm4)u7~R;y|9AQPoak?wgkG#EgeO$iw$qHf9Pm}K{ss$ZO`1o zWz}qqLQlRPu$DWUGu70f+{X0KVDX{l>gc74`DcxmOiU4q)nTO0gXKQdZ}fb}Kp)!D zP#eKd_@7W3g#0^6s|vAdXjMT^1r7`RR&Wd9w;~S_*<{A$b;7@?m8)8jG&!9}C;fGX znFN*w)CoD?k7Pg^K)L*6+AUfinE3hd>VTD0gp!w7J|%T8yy1#2YADQZaZv+uAkfrv z^xJ&MSlFgs*h-vVq|wd!jWFzB7_?#~I|s>|3lr4w;`%Y7yT8xUE*z5n(DM;|Alw(G z6J#W*Ym&S)kPi&R7lMivKWAvJXom5>-UF24`si9? zlD9Ws4+{3U`dMb88UV!uc{li8xI>Yx<+(%?y)s=-x1&&Smcdop}gS@aZv^Ghf%42Y4iP z-vn&WB5bi~Tk*X_WO$8m2U#o{?;EbKY!4{(42JEblb8k1Tr`lSJ3uxLD#a+bNrBLo zCd$oDmhr^tV(2>`lp<(;kqre2zE~ltu1d5Rk-$@tR0lwnwfZ`fqsrA=qDpm`D5-%$ znvf+(jwWOf0-9h^Ak(LbAev};!2Lh(73^qVA!FGxo?X_E$|eW0c$mhWs{X-OMt(?eK6_z?5ks8;A&--2`R2vh^>jNT5k`XF8I-^%TiO1Q+-T<|NfoN0E+txTC-L9YHx& zQG@RNen&6qjzVLJ42OEbaMJ!eJjU^^4-jX71{lKpPZ}V-06+(y7O;974c0KfXB3i! z2?yHKlOSB-57nsKnSZ9Pj^~uluf`a0!9kcIB)6HqE`*&)xK`U6@v8HVW%jMr#wx<;3^Ym6)zUNKh%oe^ym8-*HDs8c>t*nCSb zIs!-x7vhM`#TS%4{|STHjt7&mJdBW$so*nHkl`P{v`U2#I>;(s1581D|8?X@4)tRljU+ah7Wk)$_c z|34mkKzy|~eZm7erVV6QSn#fZyGDA*TKM>-`F(F~QV`FPr#}Y^`;-@^KeO8$06$_v zKxh{6Nd$vR2S*ma(Sb_P@8*$#Kc&wdC>e)9z~YYQn!)h4#dN?}DKgIg618Cms(K>$ zSf&~H-lUE5Umdd#Mgmk4Xw%-N)vHGe9P#e1#wz`>f@w@+<)(V1+#IWP+hd~jTy%S3 z&zp1{1q+*xBLEC7XCtzlHOUPi7-N1aKQ)3Os7FrzM*jiJL5~lQHS|uy%<3+PeZV)K ztkFbPJ?I#FjE)L@ibQ}Tn@&l6g0LAToj7_wx^wt^B_MQe5mnHe0v8;!$icaWe|coV zV;Bobah`KeW_3KFOG6#M%Ied-9}IRe3dey9m7v_;Nk;BB{j%{n)z9EUp0v)YLEaIx-zAk!axUyZzFl<*!kT=)u^F&Az{<{dPze`x9<3+BzCkwBX~ z=x8-+`km5H9>qs^2)8)qH2S6g?gY>c_)U4#Cv|kc&J*4h&>s(XGzb&%I|+)|2zm%Or_!%J5Xd{za-GHF*k>qo!sCm_4e6=7 z7)seF7=%jxyhW&ZHH?xMkLw$rF?U##pHRLNs@i?SgOFFlY6w7w=FY>fhpl4nM@i3M z4od$7EpTr(er!U6S<_fA-wIT?Nw@q1sE_Y32rYj~YzA68uw0i?-yoGkYMJf29i3g> zJ>w@#oCLKT?-U!6`V#noP>ziVd$nM2!C?y)52t4zF$~9nY319R5WmKDn`SLoya+KM z)6*8fWMD9zn{}%2dz-@*wyV&9PukEtLs(E776W64H3CWGY=C|`a@vO}@fSa_BNFf0 zuFcs`oW3Nik-mu>bU`D1q{|WN)Lvl+dP%);pbzUi&TDZwLY>}F3YB6F0CJR< z!Jgp#pv3hQaxYu1UNak#zFwSITeM#3Hgf89Cq>sF+QVQ+`XLj@%Yhp`p;I1D3} zPq_LpdgcIp+e7k^dj9EW=6_{u)f#2w~P# zP&&7F!B8)6C8**Hvm-)P()nPAwqzv$H??*rJDu{u&l~QY(>J(aaNeB0`NBlNvJgT( zLBmx73jsC&$SG}iB8(DrO@F$y%UiKL#pbXh*Suty}k-PMJj}jIifQKIfzRLC%&QhfSm|R z=tk83DJ~&8#W)ctu#pt(%?X%n1W620Z8!(B3xNw8g*g#RFsUNHvjZ`on6M8ae_H0`Qqra(FHwtdqM+K3*n^f|jje~squ0W|MNm51rHN}ta!GfE zjG*QV`^TB^vI=U!soa9aLv#A!Z7gI0LV*;G5cb_^A|2`YhcXdPF+^~RlNe4SiehN8 zy2fW=L}=pJP-lzpVslK+T%!k(42yZk^esLR(hL9tUzwPC-f{jRH0O}sMT;yE0*DA_ zu)*+~BS;yV_^D2t(5VkktKJL@Cl-c-fM!V}g=2AMXD{n?g+q`bzFFA*MIzLgiKu1a zO|Qlp4IG9zXdxpXigt#v`N$!TSeao_xsiHAUl(#ta1vSOy_r=YeNv*^H9r;KTOs_z+FOQx7C#3XSP^r7%TVJnEFE4-6Ag-Saezl zY;^>zCOBT$^M>D3Xp8|x-~3wtR}DLGMJ+Jw_-|v6ab1{-e7gLf8hePF^NlI)Fn_3X zTRCXBxD<&0Wy$4+;jS?7`z*te7a?&eC9Z}a^jna)ixLkS2^eA+?u$lBh(8;ad>@Jb zq{NqKbF^u=%W-uRrGKVlpos7C7ThH>uYtLXbiQUj3vZvG9$jh=lpo9xCWn><89(A ze9lRYJed)9;PV7NuO&x`FJN}D%pD`oLb$B+-R+=Q?T!^Ux!cP}kg<+3o=3)e zE}*(?;?$CMaa&17JYLcwo+;TuY%W0|ws%QNy+M7TN|R%K!}?8pSuc{;*eoeRqcv8pN|uBqxo z?5j4h9-lX>+Qo`$MD(g|71vdRa@9M?N2Nw^GLa$arC7lY9#qA5g{@$T+Q~O{{GhCvI#RCm(OYPG~{FD=lN?dq{lJ zLX*&v5KGf7;>2`|ydd2zuY}y-p7eA~M0$7mG!n0;_rNYd;wzLMo9UL9XAJkc%uM0l zoq=hJcD7yIko~!QB5SzMWl{Q<>@0*o%kJZTl|`S+TBnNhTYoNZX$AOJ z6t8Q=%j%1*`?!B;MezqHJ__a#XSEsbg)n>&SGMir-qePYd)lUo=i1uj>nM4@4GovI z?}xR}zK>kh-Ys4mwWs(RpKC|A!F-`zoH(XUoHwRjY#NghpW<`kc5PxcK9Az_!FGFz z7-^D9Ja8$>*|A*7Es5X$XX!xYX{27|$G17hMxNCZ_o>WOczBvq22Dkl%3Mz=C~;`_>qK6t)vdqFKS#3B~O#wxFh8 z)C_}N2mc}zY_0de1qnGx z|BQnf#vxahvkZv33b&|wG1~(+@K8>gbKxU6Gc*eDA%wDr;8zZ=2!?|q#8%A%OpCRY zW8l-7F&U0HR$8WP0Nmv3%P?iJfk41t7;sGKY-dexEp6@rX81zbi@0K}5dc}XcVSQh zk!L947})hC83S3NcweVmxp-gcAh?-1h5n1GhqHW3iCRtV`4NIoh%-n(403Yi9n;dS zdp9bCQwYfBlaHG%Gs=11^FhabV8lX@}Mz=-&&0f8dEXvX(pV~B7=aR zG^S$SV>**GrogrbNs)QKUz1dF6c--Cswlx&N0mf&jM)7eF(0j;D7h=~^P!t=dFg>R zo&;~SXM)BAPN8&c6C7>xR?U$TJUQh#6tz^rm#Tq0Zd}u zXfBb381i-;uk}1r280{|+F$@#@EpM>?C!hmz4u6ZM1$WIW=xHK- z3*S7;-pG9uX1?aL^cX3l8`Ty<&}`w32~iIiw!6*Pw^zq~pnDsTS2x5h1WHk%9YT%h zO3Ams{3|8j@rvGK^Xy{zdRKV&p6vrlC#jQ%1#~53=DVkGAtpFaXaN%L)1G=c0S_KH1IxH;}ksg!> z?Ty@Jk@OEzsE)6afsCpFPvNBCQ9^28p-Ut-t3^f!d{6Q6FOlXHtq0FIgl>)&Za%D} zmG$1hGupqsY@!7<;612KBw1C&oMKH$L(@^4D8|&d$lV}0DTMhKjSTuNnIy(cZj6;3 zg{v->7$5_P!}5l2nyN`^fUFh-L4Z0ZZiAT;e3cBq+()KMP?D>T0}x&`0p10CWikXa zF=cZ|n#e`)f5OKf+A7oy^{L(VY8uQewF#_h{*ixem7XTR^BMpR1$st2q72a;*H&cZ zuC3BLp6)5Ey=jq^3td~Kr<}s7$Pa95K$*&MEiSlxZDqwjTwC@1wa87>JqvZjSh^+R zRS)bPLx>CT!T)%02yrbwbm_Yp-*@4I$A@?T-%sOXaHBH|r-{TKS_2<2h=&0cEZ1Yb8iq`Y4H(b^TNdqo;BaH7>w{ad)~o=xF@5+)94q$ znud{q)Jtf)-{9im{<%m%?<1i@V^Q)Qf=f7gNWd3hYt6%Nhm|Hqm z=c#Hh;2+9ed>{@g#L$4i>t!^M$6UvPS}&7O)ojcUVpk}_-&^v z7Jl35bm(md?_6+mSUCv23DBi?(Gd&#dl&T`I3J5)e(n{cCru z?qgC(IJI-B2uq4P%0zii2H)9P9?^m5N>S55CSb)%1+=qI5BQ|&YL|eP0jVs={9h)S z|JZu5F)n6~q_+5Y#-9ifnpz94R!5qu|hPS`oke<4ZSqs(hR zz!$Z#D2}|F1(AFeha?odmql~r5sk!h>#8IT*!Q8_d6m#A#JRHQycB zA^nG=|E>cUAEY``oZN7bQ^lZBnz~?+P*7A=RmtCSK~mXq85E6CY454~P7nA+#QI^^ zUCpF9**pDL`%a%Zd&b@~d*=-GliKBhNAzNJc*O&!MRl)&;wr^yh6+XGe5lNw;lhZI zumnNz!^om5_CFR-tzss`6}zjjsXBfv5069l{-PTiphLs`z4PY{YwlJ)vx-U2a{-WD z!#X;z&jSm>kg6ER;i$_&JZ7Gce90weh9s9HrDSGVo+mfX+cFhrk~?>%qCdNccFa2Z zYQj|9*c|rb5^`ZsIpV5UHC983BJX@XJKRAq+ykWh}c*=-}H%J5)OsrIBA{PzOyDei`o}1oK zZYq}>p7gD9_3Zc_d+$5$pv8l83T8JPWVYByDa@>jA|q^DaWQ~hEEakwLhbtOYqNY$mN8@E#dgY(9!6=-EmZ>;uh$KL@a$k%^mA0^l1Ia9aTf zlg@JhOM1=>u*!T4UR9NJ;4&BmniSXs64(Kb^=D;C6r4diiUOF0u{4?g8!A$Xa_<70 zCtqfaLQBOh(E;twHDF>Nh>n>S1Kv)lWz;`dez1No!B@=V&@$k)L2Rw0!Ia6a7l;Ap z!IWAtDZxx5Gv1u2J?7pxN0xxjEd_#nbs5Xu!2G{oSrhP`_s zi+xfdL?#UfCO?Sz0Yd0%NCzZ*ZMo z3!DL;U@(TP$8XY+sSYTxJdf%hhN-TxED9cL5d?h8C!p=Gna_Lzf>4TtYCGD+wxeDS zpao2PaXek6NDev>Q(vjq(B@+&J2bBb6{IRy*Z}!UXkEhVwnZ$PBK;lT(0 zb9jbf$*Tt+9wE`E4n6ps97sHy^kYv_ram5uJ@#n7ZR@cI4>(rZ@gI96O2T80JoJa2 zy#D&5-HC%wKm6Ex0TC9ns-Ai7Zpx%s=o5(?6l9@&Q*a{PqG{`qEk1TM&5v5L?%ftg zBt@R7jv?hu00zp2a(ID7tWFYcVHp1$DHT^(VxDDJ!s#v}_i~#ClszTvS zv0}J7jQ|@BI%c4w8U*Q>A(GyI4S5op3Ye?wuwL0jfIr*^`1r>){`9SfMx47`E@lO>6i%u4X zm30)f3{4zdmY_5IqoRvuaJ%FEpSpwypTVPyHm;$b6L~xJm%LB`gwCQYTkPXkwK^N{ zOTgtS9}TA%-kEs^`)8&)81&+$!TJvkcfSZ+wwI5%W4SFrpUlUG=?WD7NwG9X{M^a*kWkquAgYPX#x5zpZizVM8u%MUJC zczCJ%Dy~8}Roz{HRl!37+fS%yf%wJiKy5zEPUxsKesE(B(U;%25ck^x+^798tfH$E zM_vd!%l)B1A}cu`2zhwkDt**5N|7nI#D!kshB-yuwrJY*5~pW7t!ll*K~q}dW|1Y1 z(078S4TYByZ4lRllIlp!m8}hzUB(G_Egpm-iHB+t1AJz5k+`@%7hY|oo7f@EFYd4k zf$s)LA3 zbV3|&z~-20W-<)Ihrt};0;t!0Qlm7tE1A21c@Nx2pnwS3J!FhIsL&LE)X49n(*RUo z{ZdI4p+=c2p9qm5=}v}1u_4+TBC2T{YBG-YVRbt+h8oy63v+BzBSZX{6pW^~_tobE zD)bU-$=-q48o%f!-c~PH_AQ_79hteIi-^6!1M3|=l#HUI(Y{0~BkXbEE`s{7W@lq` z4F_Ul=AbBsh}{t`n>GFCp|VsKcI-ZPi+DF+_7S(l?(%tLoT=F&cDJ9aswobf-NRfC z^sSec&K~ctiGVj_m?dg>hxIQyWWik0v9%}ow4qva79EbDf91qW(nDdE4nmmOll)GI zhRjK0((deA5^!_ye|qO1(l>kvjF!0$Cwf(PkUC1z}Krt>OYk@jjgv;b>axVYO+xj8*EsP8zNM3ERzc>`L)FyGlH4SBt0Y z8u^}Wxt~I(OMGjWx+|Po*dID6ag9?a?{O^mAqORYbV|jyPQ6$jYY?Z#8s)h$%e^Ru zf-7Q8@wTY~_I?)DPKaq^y( zYL=I$EcdrKf?+^fD*k|d^a>&!eu_AUXIAVWF0BwS7u`|(v0|KfwPGjnK}Co7yrL69 zw#JE-m0eyxr2DM66SzaJBk%m#n0MYQyM$A z)|7YEf=m<{Yh7(=Y(uRTJEkrcyRI%KAFRXbs@p}#@9Ll;U2ljp>VG0Gt{3v!dPClc z&m+it3V9prN6Gh){=VLFk7?LV$TJ%ZxvIesSHe2<-iGbvI;3C1=XK!N8X!_7)#>>v8<_8p4w!Hi<|Zk*EWq1cQ@@R9&6f5a0L6X&b4js zvb#Cur{>RRnEUWax~R0NsLZfX4cesc!m)8!t_4p*eJVDN5~&HU7T;~g z-n|PKFB(=!|9X%w{3<45tPM$)AlK{F3WEyJ7Uhq=dN%j&UopZL4=xA^zybrrh~!cs zPaddx19@p!$VLbaE}lPMiQmdYsOI84F+dXDLGY!dUOG~fH(sl^Q{R%P84=yWRS+bQ zx(e?H>6JRUZouN)U{L>?yGKb+@PpDvRI(4&=iq%B?}uvd35#V!84UX;hemB3sIUPvRl^h z->Ov3+NxB};?uBR*jC&!C4KZ4C+%=Br%|o#O62zAtgQv%{};{_R7>h)>OCI#=*A8<7) zfVn|Dj+l2e_~0;lCF=t{X0YW{g?)myIb!XLM$%j1H-ZOa-3oY9r(~5XvI!ywT*=`# zWAW1fl8*(kx~HKEcr8;Hk6V0@_XQxSy{)D-lSExK=}}EO@D=l3QcYw!=^1-Ak^5*G z(BnQJ_=r}MNb3N-8;X@bPEC$+5=Q04>8TzjjVOc z+aw0ml6JpoG%Eb1zS<0yIyf{?ab5yOuAXFDEpROYJQ}jfDB<4FLR_Y{@`4Vk+sbZ) zC?m`%#6MNxVWiqHv}x78r?nZ!4DycEF7naIv6{=7wLLvSkU!ySu!L)pn^$T86P7{) zXWLswcL)+xgQzUM0d2i+Npl;SB)>s46&x?f+^jQ0mLl4FZ(yQ*5(85rVV3TbHIKjP zHEj}s$P!~U(g~~}?Z_H$8IU<(K*tpf=qO_g1L_G|Y;zEWyaDaNxcdXbdZPjH5(@?t z1W^D>3SmD=wBXCTiQbsCm37v|mf$Uv44u35qf|+2NrOWivxl}b`88xpD7vQi6TqVoG?D+UD#|8=T z1w6d5p(;cNr_i`49rrFZw1B4!9RbTSrukCCd&u9jdI>$ODGqV~!fCwB(Z)`f5g#8iBK)44uxLhKXPy}+rq%Swr(Ou%+72y$B=#*M#(RBD%)Sm_Zc2^RlNJK1l8QTSglx;@!X;; z_X$+EC|}qTe#OGkEMp?5eFpsI1E1VJJ49hOmot6j4q)6iVMcx2^ooegbBfkY3Wo1` zUa`7qUg2dLWL;J`uUD9ACm|-b2KRb+*;FvNbOmM_P|Cw=U1Tcp$SF@(>SbNVYd`_X zRPmZe79ODKD(}X~O7|M!72C*^ah-%WSw{n^qK9l%I&o;W$~zM7{;4?kAE5mEK$&Zb zSj>(=vKVuqQN)wu($s>UbsS!O2u%AC{F+WDs5N8C5T->w#5|dakY)g11rC z(~)jUEpH_1*}5K_^ZW2#Q}q%Wp2_u+x*o)Ze!cfqJ*n#%UR>89+dqxlW>u$D*AZTs zuEU<+%SdWk<)$mJ`_AUwhgHMjfdB#jRSl%en&@cH--6RiDKr@-FRuG}h|g{RP)0!o zwi5+*(d9SsjZur_aq%fZpR|h54^@n(A(qFsS3AC-JM4JcH1uE4<9$4`{2r@{_lQ+c zh90YEYp6~b9L^Q>Y{fx_=a^cEO0b7jeR9EJ@vL6g1cM%Vv=sS~cP5Spg3DXaJGJ1j zz^QOj^srb?Nl;)}^src>4hw``Q5zD&1?6z^vD!olWT{ouC#^wDi{3e;XM_8w+KVR? zV7+lmSl<-E`ubv6UlYap3XS!pQLI-htXKP3mz09Mbg{t21Cy!tGVs<49O`*+jNzT6 zarLhh-}~o=No%VrUFJVk1V6&F!H{Q`QV2yC6q?A31t8 zqO~1tEi-)kIu)ttbC|Xk%RPhV@N!Dh)>7I2qi%`G&$=aM?pbF}@sFp-Eetc2P(f%w zcwn2qu+H=ej}?e%l2$UTXA14};UUI}YLF!vg+#fu8TfNzmTKoE4JgR-Y`i z@FLffB2mhg@sY@95Z&?i0vU3T|DUQEo5q<&u>5^8YA~9V@9CG3y!z0y zR_`$1UmcAEv z#sNZ8F;-YfX`gX`Y&5fdRv1-^umKcMybq9$46~TPxymx1i8kw-3ZU(Mq<+M_)UUy_ zf!;F;|Lpe`FroNDg#NSwCo1{+9N35o(HsNAjxaE69bpo>d5Yyh8=^z+2iN@rRQkn_ zg$FlX0)OOaU|;$X`a6Vvlbf#nLz&z9NqQfo>cM~Bv%;;m{S>|l9h8o zvHOgv-oDfK*?X@UQ)f({jglpyU>j5wYUTXrs4qeA>W~*V@Pk}*x!idF88dg^8yPnt z$Oe_bEL<$XN4FMn{JsJo1YpSPAnR8_GvDFDUr})f%J=?ixaF#YpYP}Gr8`+3in8$( zYWWbT6KX0D%{l6z>;_c12^|n>^hcw(%Wvkr2pz!vW>23rbMJj;Or4JAuZKG5KpVd% zb?_^K;VrRpF-edX59umCx#|09znOOh+#o36v!?Hk);C!pD&@hyg5f`9ahQsI7R;YF z=ZMK^wAo-mILo0oAn6v~pW$*Lh+6R`+%Zhmx;rTQ$Z|``2|_3fK{qNy<`KfBRsBG{_~vND*G6 z<5DhD{}3I{)TL|l@-IaGTt!XCt@aD4#Z>{kGvW9EF-H~-FCKyj!MhM{4d#x66N;h1 z1<+LLN7hyFg)n#Af<^G)fYc3+n^Z+Z{Rbg^7fSmNU$}_uhlKYKnlBhSxNmUYzxu8r zo(>ueE*M6YSDYe#I+Tcz6t6Y|pOBvpxLL^g=~xyEIi2%Pin(%L-*|L~W@p6Q3Pt9e zlXhfZ8guQb`_Q(#BIdd@teO6>ZiHtBAdZ=tw`gC5{e5uYpvIO9g7U|h>+HAh?yv{; zo&gB@Ia_J%z-a`a@AeP-py;)jo5U|AU_$zRVET(0vuEtK7p?ZqfU8qMjiV*6KOi?b ztsu{BH>nMBh(7^@&GMHOkyk>8aZVd|e4w2jk_qcS+XhAMM z?7;pZglI_v)=LO)#&aNDYX{2MC|x;*q;%UM@rHD3(PFwLN}8ymp@PM47+P&>)TAyFON79wJ&RZFC*^ zPAu{uH0;_Ux#*C+IF1zdm^#QWi?tL`QbEX@Vy#K0YmcojR>Xo`d;2m%CpXKaEJ)pi zb9OAtrIf$Mah17N!9&vCsWR6xm)lX9w+tAk&Z@jzg-#cvlUoA9?q+ntIXz{$ltO2G zc_>E#novp@2J;53zEVOilrgC^NGK>fm*p}Pkjb@d5v(vp+iBB#c{}Dd>dw_+_aL1e zHCQfzuI8kw@J{ROgliR%N{1Hbq@IYck)6kfJ(2WuP86ZAHa*=t3+S!-3%jRlQrNjj zPtRmwg-XZ&i1u(sq_UyR3A>2U+V1I?AnFXWso2_JU&M3d9{g@%1Zzu?jO*)|1jWR#N$jfG>w|{$U@3j>4Xar?eAu&e?HvRj0?4yhaRHgWs0sM zJeczQ+`tD(F+}{s3xvuKqEoP(3W0X#V;X8h07pc~mcNz?;q{0-XFjRMIm3W98-G%kf{}a)C4AMVuHf4_`rr7RYcnbE#gcy+G z@VL7aTIS*eBPrG(QpSyjDIbKVqNnlslVOOr3=v6J!`D4n0^^a^phlN76+0}wzcDQ`pOJx&?om^yvp6~~lsBjZB{_TehhtGA3G3ikC>ECBIgClc_W6G+7Dw=d=rbi$4N9;A(LX2H0AZ6#a;M3Dxswe zm7^Dt_X)JszmVwWDCnV|9Z!kd;RVmiW-M-EZASD07$8iZe=@#O);`prSrfK97tI2wo)qQqmwkgURsH z(u}+Sdg_;yqOWU8%f+pwS@CQs0w*D)(Hkh(T-q+g*QF!mg-}>uTZUTKm6f|Ml>wuV z%7D?a<-llVd9}E@yiVQ?mGy_qQRm6>a`($}a*>Uoitd^e>fD^FmiIto{UO}_#p4KL z_)01xHzVUKgl-heD$3=_6_$HO#VCaBsb~<_SD51A3R|v6=35n`F##2|;@HYD^8QN8 z{XK;|da81)dlK&~$$cn(pgsF`x~#uEA@#5V&Q!arn`|^6!J-xo%y{jH|*Vm)&JN2mhO?|aEt-%)OHB6A#G+-7R zQ17mWa`AXWTKuWO6z?}olwYA>Nh1nQXe^g!H1>#&9}i9AS^nZyG7CZc2-LnoRj}ljUw|LgBkj<>HH`Npg8J>_?iBab9z|`%p9RdAS+* ze9{bjmW`+uXN+i)Ye&H5Uf~j6|J_M^?*gMgrH7SeLhtY!DBR z+*v+@jF(2D!Cyv}i@%Oc%cEN?_k?@$yX+yic`0N3HLXc}#Y^JURQLk~6Zqi1YCKnyevj&tlzV(fX0> zWceHtuVi->;MWe(_0(lg-EQS#8s`61Hs2z#bQBUNjB1c)jl%IqiAzRJme-B~9q_pqnd?X41bk;y45#EMDVC0oyDLWH z1UzeW(!FE!zQTQQ^nSv9Ve~IB!K0=4ZnP^;9b>uYjzO!-#{3ee#TY5?8e@pxlXNp| zS25Ztn+sp|{qSYKt1xE^^Oq&guaQ~|PjYLGLxgjsF%J=zi~&SgGT=dOlX0+cJ~j>| zXK#lI=L8d_=b3}#=WT&-9yaF-=Q&EgXZ~6^ACXhI@693MEVYJ(bD6bJIJa1fgtN|q z%ebc~Z}!a3VMTsRLnM+oOJ=U;{Mw)4M)^S<+M!dVjgci}9HjY4m+ z|3GiCBma(l$PLX07kQ^N|8=OZ&~KG9p{IxQI(xc0y7*Vf3glK2LMD6<`=Mw~>?)4z zJ$wTYavSFxi}1HFuZDiuR$aywwfESng~b-^KDKO9(F@zi!xju3(R*OuaKCkAzQTTB zk`S@b$TtUIm44r@GGbJqj7*9eTBLph{?H!NXHK8x?bSQeBlpx~R8bMmnynZ^lwZu) zBvMzg_t=V|G75uvNnB9OWTB{4g~GcR*06nZ4((mIfW!Ne-!5Phk6OosZEAP~k=_-* zO5_Y%c&I8DcFckeNkSG9V44-=fp4a0$NsesHxeLIk!34%EYRLqpxf%0~j=AfD zh87&=n+L1GupP7NY5L54XYC)FzbzRY6%87}Mj=}d=}>4-!>fSEQpC=&NX03^=cHPDg+Kk z*UrKT3aPUjAp!~Ch#wnGie+fCPBb_oRYK3&lauw2WRHu{-8%bM$Nu<;% z$>E8u_2t=0g9gm{!P86O+bm;6J65zyq6{FD8e}@DD{WG$RjLxgL_iCUYC_G2G(Isf zC>baXDnb@6nv~j)1CKtMj{Y3w4Up7$EPN!Xyy1&9gN|j@B}JBx(Ix!VU1%z;Q&2-` z!Gj#i7n`G1h`9QI@3qN&)(X5^`HN32DVj+eG(C^!2kr@3;SSn)@aTjO+-fOrLTa8& zOe(aMDBsqkSQDOD%R4e-DJ?Tv$ynxo`=vCIS(DZNE;78c4c%N12oXA1)yF#$+MrI_ z^o~j^w?rB8P-d#xCvS8*4$&_2-EHtiV$xSO9`Cm1_X4m`?m zj_UT}yl&t0i2(XyX0?tOJKh4hd9mpU1(i|3z0iS49MM?$IAZd`yA;ij9-^8^!c5bK zwzOwpScvzATo8#hWv~n~hHjH}FeGhSM%qDeeZydg6trm6%w;X_IxJp_nyB=R(a7?y z=hcuk=zJmfWTDy*Z?QIo%E{m?qaZnXjb7bKqk7e-xuB6YY%7A7<+Z6sV+tCrR;Euy z8+E8gJq3*(*h-^aRHOSuL94g7(&|xECsM2{Y<3deR*RAwh8?=ui-pa8yOm~}bhFoW zGg>+7EMJ8zlLTfSW5mX5edE zc)qtq1I?8#8GCc|SFhTa>V&wU@PwGC4+vi0Y3w=Wafw%Y1iXJ(SlD>^7_qV^dUiuPeDR9%#Rdm$}EX(T)hbXzyWiM=Xfx;SPpn9)A^84*i+X~5B^oqwLgd~ z)N`jPync!=R@S9Kz3QWKAIKEoVtZJt9#mP5U9R125;}<}I&@NVXeu@<^(lTP4rkI7 z#>4MwB9gAf_6|(oQ~_?Jmq^erP)*4kH%wrPa}_4A@Cl3=)5l$oz*zYq0{?IJ-UPm? z>fRS$dpi4^vooB`B!RFKK#($JVz9Pl7gD7vas}_LeSJ5EBnS}#l3?xs-d>|n1&4|= z4k#+MSWt1OTCIvh9qNQ*ovP@yN*yY7sB?Ya-*2rwopTax?|q;9zt4 zc}h9DFopMoipS^a+3LMeb_95Z4jYWJ?qWcEGS3(GiA;D3E3G&dOvjq>VWFMLKd9Go zG4)M`C2!!gks#`lswx)xdm-qG$6-5ouM8b%o`qJ&O6t>h$((SR>HMG{Hlyxi~lZp61B3-7b3s;^tR7zGG(FDHNt}>v3%&Pl7fcKn$^;5t>Ms)-+?TX?4m%n&GpS_9WS^Dl8trtzrcEf+{)P5;x}F63;Xw z&ICMMW`IL)UKI^#Pu;stR#|BHa5GY)h%XeL5ouuQI3c{;O?&q+R2<SS+_|G4m->VX)Y-82wwz! zZ0hjfh)x7JP#2EqM2Jo83K0)nAz`yaVmCxzAzT|~HlR*UW;P_+GA~b!3%JGrt0LwM$mk)4SRXh_Z?&fKJG&jH6#~xk3m#TOHFNOdOKTGB#UjzYCh(4A_8VS+D z5Jo}^E$?!_kpL}JjS#lOBgOj&-mp+;N5NYrcq@<*NULjR=CL+hCUOE znrx%<`h@-uS!F?!$D)8#zokQ+Ze$Jk66ETfTL?>jKujsCBCnuoG{eS!DHf=pR8fWX zWFTGH`G^34gI#x8c%T?6Is{xn9ur_gR6{B#F;pdyM`&1OL+G#L+z5(?XhV~snhq;0 zi16T--KTQemn6K-hl4xdpfuw_(vUql6m>hQ-WgJS#gm_tdYJOCZB zT?p*YDIe-ihU|8R70ySE>ka3aF9P!aQxy{6K9H*;aRdc*`=m%5y%JRCN8&7m%kjHh z#R(6-PRr)ZpMU6_x%)-n0$3M9r-q=WD%Rr#>}dX@X-X0d-c6=6T}R7QS1=KrC-)y} z*sp<8y**|=L&C)E>_pvbp&tX!N`2%(2SWs97!2H!zP?qgO>;i9T^2$8g3PEP`7)@_ zK;RRqGe>u;sO^??$vY14O~#LUG8NA@{0R8@cy{22|3xqUIUYai$Juyp!jItHiszm9 z5!}DSb2olA-ao{%0GVl}jKp&ye!hknq5u%IWcTjsn!YMug4p?U`U$z45 zrX_s@|8Jn^0?&)FIB3lj&GO>;UV`q;EH9SrPYI{oTeN7&Qt4CHowc~5_lWK;R0>U* zvW_q%OgP(yquy03y5S|Ni*s&5L|-&wD|BaOb@%nLE|PojBKKhA_7#)vgzikIpLp=1 zXwvVXibKv}eYdguFJDTK?6#c@X`-lT75ky>l+Rna@MCfHoG~wc;Q{-ih$(2c`(2I}B&B#W}0G^M6C30WVDdo7Vb@FV|Nq50j7PC*$ z_A5!J5-V*sqE;?hxQhJr&Lhq$t-_C!PHH*a*pfaJf~!-GO~F|n0w<-M3Wwa>*17B zOZrP_&}GG^$f&dW+#ge{l=phdsrK{HVhSgLbFEIZ>eL(sp$ibxXzQ#r+#gfb^U)c2 zEcU;`%hQhQ*X99!8lUc*O7DT!c;wo*?Vx!J4*Mq6_gLB~M$C6G8}3}{4@JI|X0541 z)Mu*_kPT@c!1Fof`6%s}GUl_iOo#i;m5aJ6RCxiUx zmpg~|4r=;79Ly1=EIvz5)`UJLN!_D{VWi;PQuz^alw zk=*xonk+5Q186P54w12hKGvapYE^{kQ%gmf?1;lj^s??gu$C3~nSxS3D>MUcmPR08 zW;H8Xg_X5r$hx>P4-SLo(Df;f6k$F&g#PsLDb_qgCs#oEC{!3|nE{C)s9i;38m9^^ z5}dZLAf>D@rgh4Qe#)2)A zW136Nlkiam8Y;~*T0}&luz7lOtn9QVY76%3_qA!k#sF!V(kg1hnp&EsiRwrYQr^)u z*)k*Q_PM2XA7I=86fIM~4!p_yMnz=e`J-MTzrs*wFZ|S|l@VwFz*qR0UXH6s+zfu$ zLgSPw>R5sN{M#2T?Kq;ZBI@zFv8g($q}A9`8&k`fIzp61YMVY%L^KzhrqoB(znYpx zMTfYlWlXee(^Pn#mik@-#_IKNCc0Miws$TJYj16wDX@i%j>I&7TSS}`%&3e`QfreZ zBKl;Fjl-hexEq^mV*P53D=1B?i*}@OhD&;8{+|<;{9<{5ozaFKK zmZrS^+%%y-nrV|cW$byRk!BVnfJNT7xEmWcVs%97(FMT!Yv*Ft0C^LZp z#0OanzvQ117ojb#nv**%P!WtN@2J_(#qjLt_`Jl`wIYKP&X6hGSRL7!FwA)r%i;iM zmm!6zxW-o`ha9(D1uV$0$5qcFWvIf@F)(w-Na?_3D_220c&}K=L8meoq-K$&@Rp}6 zfmRl4Ku&J1%2*3_gVpMk2^lWXl=49nSUAmdi(s@;qTXs^M0N*PFiP-i>Aw475Qd@9Z~i^N6~N-v1G6CPB=gJuPk z*eb>E%_{p3=CFb{%xdwDSz`}amUDqMUx>}t0&$B~Xg`dIC#*x^QUr=^uUY>nKCw*u z)P&`nnLsrg6BXjB#6O9f6UE|*#6O6a5}Me9-$x0SzkDdsK2 zyk7vq&R-F;w(ti++)&spb{1;(ONEQXYlSu9TI zR#a@iTeL`gR8(W1P>iX8ixqKZaglv-@o;-<@o@NE(d@q2*(E4^VM(3XR-)NEODyN< z5@h>J$!H-~m)64-%NS>KDY9%Wt%GWt1=Y5_gm|oUtoO>E60t9r8De+YDCgZW)bepzoj9pn6Bofd%hlz>?OXA?55LFDE$6v% z6g#P62|8I(FLqS)K&7omJdNKg`0c^(Q~cIe_K348d+ZAUsV7xi&iZPko?BgKUxL8TtNVnws=7|xT-{^;1`!WX z>SIWK9)Xvu`=OADz@Muv@p*NRv#w@@u+OcroQ*Zewz;Oxz6yaGYE}txYfYVV50b?b zh}~5)+Jg}51oq?gBgWes5x9&3zZfyWz7Bz3QDDai_%K4?Q3^agqR4(_1iFFW zXNX)~hscxaY;kU#CLXCX#2a-`e>MBI&t#}V<& z$eHL7BHl#ACx|%C1p#rbn-*ue-?T4rF%9mwF%5{g*>%K2u4ccC$lWf!#dq8adv(3# zoLrB<+4U99t@X2@23bE_IIq>WLFcUgJN93ZzNP`-o!n4lU(hhzz5>5r;`dC0<-F8@ zMg4XIKE+QP>cvT;G<)kP%eih8V(%D*FXZ7-_2RivhInbzDCf;ln7?;N)rr-kHGAV| z3^Ek!oQFo^Q+#%Gz1TB)jPuE8WI29Joqh2bfISAuzZ|namhPB(`$fdOMltV?nFHnC zz3T0Y_OhJI_d?9|dwmzfibQFQf^oye!{ZJXyT@tb6R-zP+k2k4WN&yY+WQ~G1A8ALp2PFP@&6!pfFI}| zY_q)uUg8^85!Bb}puIM^S?C8tfv(nChPP8eJ3L*hwXW8nzjmDl{k6L^=&#+Y{hQEV z(iU5%>QHVwTR&D<8}$JVS@h%a?~QsH^5`jHJ)o~f_&IPCtrvBaKHfME;WLai_;-u( z6a2dk=bQDkLB*cO$!5K2d_!1!j1v(aFuw&=Ig?(`GQTaX4JK8#1%m0;Hje$ZxfT&S z`27v@1iXJ@uEW2lTGNGorM0hqjkTZkvjkN6u1NeZVO^7eKHo1B{~H>B3F!FUk@#m} z-JgIe-$RLZX!|9g==V(GaACcafTG_Y5*@;NE72#cKSP7t`X~Wyzt5n#ZT-ZCdfz%5 zXT;A*4Il+pN7t%Oa2&J(yb|}IyKCaYA8A(SQm`vd&>EX3O_?;s9XEO5_oU9{%O;Z7#g)AsOD7`R;#CVd zZt2pamrdkx#Iwe59iSm+Dda&P>0D<>w)-~~(q`_&h%R%Ck?0m;LkHqb( z1X$(xp78ese!K9az?=Aef}f6G3K3QKfww0{<2fBa6YmG$`H%P!L$Cu+;;ZA(5culF zMfedD@G3lS!w(3pco5HB_<_+N-o;Zx<#FcV8qJx0DpCjgL!rU{ykCP+-nsHeEBcpD zJ_a5rk8YmqFE`+5@Lu2)9NOErqPvq!DRvA5V( zbM+h+>a#)3T6$jgGf$jHZnyb7_0 zK(+MfZudLbWQhNT5xdQBidJ$gMasAbjlr0eyNp4YmG7b&4?MRhqxU#7n_2k|q`V@` zs54h1I0DX}s`Gq-?F&3IjF=I)0tJLao%lY)tAfM`h?zc%1?B_5ya}j+22tYuP?H%A z!C5T0K7LwDf{3<$sMU^!;P^ITxC{ZYDF}ivAElkosEB56no^1Gn1zxU zsm6^6#EQTg?tGw#TEC@LWgo0NhvESEXH)c8;te{lqUIBDZ?c62_n=l4 z(6-vNutqt;8VkH_a-p!Ai-h&{VqtwNBdq;Ogmplvu;v3<`=@eYwO0tMvrt;(HKf&qTqlx}ZKG@^GS}8%+%0O!VEGEEvd#+VdA)GvvssYO2PW5$-yLN% zHiRR~U;tyRk+{HMKqM}(_R)N+fog zO5eH$k%{9qP4k_x?F#)4x-7c=1AV5Cxw6PC$#61`x)b;&#La<)4hV^NLMaVp3^=P- zdVH*f1B>r|1*8&4c33z0N^e-YG^mDQV zJOrQzfTKgV6-tr`D5ygO7^;292eDhofCJwrEjtO}9lm!V1>a)|J}Qsifh7s`6MzSG z7rbIj6QKeLT17(~-6QqFeFc(O3TukzxN~4VJ6#0mY7+ZnsoWJq-VtQ}{H0IP;=-w${K_F>?UcckY1`b{xH2Bl zc3AtN^S%8*5Av?l@>m|nH5Z#UT{#}qVp3~Qf|?<v#T77AmrFmxTU0^5=# zkrN+DZMFpjGyG6ff}}d|f11Ro%u<%Y$!!cWIJuEP5ZV4RBuUCx3@0}WnY%X2D{~WA z5(ko5W<^z=MBYwGDyt?>qLOzYqq}-y(t(q3gExWjnkl*w9@F1`iYiuR7q zPS7(}ki0{-!CmVQ^f{*D4EMZE>Y_56T`b$m!_AMkIyP1=Z{>p-g3ZQG|07tlxR$ya zMg8_B`-)|n7_EzM8e+C74z)zLZvR-bPlgr6b2JS+D_v~YZ1G$0uU-TH>Rs@zKGM?m ziP)1)1L01brx!YRfK%l>1s0X_2CdzXz@$3KD7CLJ9Or5Sd42^u2){AP>_-jFei@Ow zjS3;&HY#oSKyZ!+J4&oGhuLR9S7`$UE(SB|7YJ;pz>Ow&BeZoz@zJzZGy(+4I^drb zLO%dB$%M5GZy@i1D47635=qx-^-;MxOfP>GCv;1hL`!1Ci_Z~UKhpiI{5&a#V2D2hUp2w!rr=9;8Y5xEIOT$s{%O^0<_`J)O8z2VibidFOw)-P5LHMS**&^JH4J}ut%!x_(wgWfCQ)%KKDc2 zRu#*H%&2awipQY^zSD-6JvF$XLnPoHkTFvW?M%Q8RF`dBRo0K!?W>J+6=_tn(JgSH4ac?AriO z)u5~;-=I7Nvp6nPpol0;kz_)LaN+2Gu3nVV4MUikVI|tT9IbG{2W^qHf0 zRruc{uOn}y-(Z{oNrN=qE>wf#sCobd#CJdg~eqP zL^}5kwNtc<6Zoe@iLD{*9lZbWZ>J{T*Q+QK&!<(K@WwgmgBR=%4^3^bwiLlzvST38$LV>J(%qfHz`m3rGX z=Xz}|z2cARdmr_IS|}*aZ-clJ^ha^@O8I<`S`-H&7{?7$`Kb4lhkkoS$`V(E;xLF@ z7nP-JHpR6?@{!sU#dSpDk}7VQievXyg;D8R^yWRN+xh9+QGi%1^hbres5hiO7gM+U zS7h(!l+B>PN2{BU+~nbk%G2d+J>`o0ZRS!t4JX84JV;UG~NqvUqxc! zULSG#SO@40IM7(p{6f=FV5) z4W?7nHR+g^DO0?zE@0?=sOWOj$siAF4#D)L%6Wt76n9PP?piW0(&lfVs0ZIuy-OA? zU%BiM#UPEjb9%`nsFutNtAC3tTG@RBlvkjy)HP=|+WZut?$?cubu6X!0LJYk+!bEg z?xzE`O;C?;6AKnTu_MfaAc)%#?gFGkV-~Pg#vp|*b7o;-5SDizU6@5hVVu13U?VTi zP%F{(583T#km&NH`jE+x>O(X|m?fELSgJdemc-(?A+wBIi7peg5)Go2B(+k`twd9B zXUjyxvX#nQtBS&`DxtnaGee6cR(L+zaj2bPCDfZ(R$*4hDpe*&YhqSB=POEIZLC_d zr%CES8B>_U<0*um`S)g}X=ILwOb(@+byZPFU>&o6iXvH>BjZWnG6zX+ZEh*{gx1Tt zO=)4)$8&ID&Os{=-c7>wAO)_mfrfYWmIB=4v#+pWa%-VT#66h=_hStL^m=0(b=Yj%=dWa4+f1*tEQZOx#qMevR+z) z?W88|=_GsJO;HpVI?t9I4-3$?6ITYvGtarg<)9_R)evH(sM5H$K(w!Nl5^_>3ol-0 ztPs^1r?fL&nBL<=0^QbW)q4F=;joq_sp`>ngh>kqROyG zYtDGQHCpyQnllq```Pv(n)5xpwWsV}&B3ND{>8A@YMS#?_}36;YnFWx0-GtYRkQ6I z5P(pI5O--Q`!NKb)^PN_s2TQ~2)sjqk5J}#U31nFUFbCU-8dhCO%(XKp0aO1;MY2c zJa_4ay%T|_DDZpTvR_5uO$xk=GJi#24UvpaHd6LEMoqy*MoGcXjbgFgs1;|JBgDU( zb>cLuPTXdV6pvXW#4C9Ji{*;7iF$EJmo z)&eOtV3yWytrbFQ+EihEs!bEtfR4BI`gDk>=`)12S>H!kTlB9B>n43)VZp)zY{cu3 zXxmBocIn@Qjd&eWZSUzbh4rBhC^j0+Xvpv&S!c|G)SLkp>stn--99sBe>I6)X^?o~ z#4{jneIa$Laq8689O~9(M9fGi88azf7TAK1Qn&PnXoaNyW|EeYEL+yGbm{U=MbaV@ z;44=3OB3KA?STC%724(mUdo6K$gE5<=)SbO7veC)q~(K29mT*yWPMWDEiC(`=}SzU z(1jKyB_(W0O48EkiZfLyZlR$fPXzo*gkZ zr810?^b@|{y0|QZPsp8=Bo@fe8Ilx&ys|Fv(d5lr!S^ji-=S+XUx{C#j^WlWoE^sg zk&9CHE8Uy0pXB|6;O?M*LzVmPprzz3cChvi_&du%@@vq)q2Pp6@t}W0m76X z`*6eIZ#2j%EhtF-oMskb&+6@?ZL57LuALCyHu9mr7E5#JwJ~l{yl5VzP&_~&M^E{T z-2e+jSSF2zJxg=u;O!98J{M>5MxuUPu9@N*NZs5Cw$6Q8Qapy!``?lHM@oDLi7!Pe z9-(oI|46K;9Ueh(5^c{8{31m%(X@r8W?zKqYeVgAhF zbh61TAU>W0x~8Zb;$-_z5CQ_>;ON+eUUFaZ%Le&p-WLmOt7BDia^lA-pPs&yQRnjB zMG+~WyuL)3BU3<5L;8BzRL3I0Oe9Ag;e4#JACPEq9MtXP1zRL(0EZM`$|vO$l^a^I zs&BEx2H1`}Ny9+xAsv+eCH zzCVal8REeWDzcQ#Z{rFvogFbzFUD<#6k0Mup(VPp|09eP_;W=(ay$C4CNsJ;fC&*LTUJw~(ZU9KwM259fa*^O#%FaJ?IY>eXQB1ivWh1b= zO~O_g*lq@RZqiM8_j0p9d3eZbI6tCQGw`Lr0!FSS4L}1RU(`qq738znthdf^D4`-a zn?N(W0$DBFxzN;7{-B4lS~Rep0RF|Z(O^nJBWaA0ElO(WU&5HFphr((HI>JqK1pSP z@Yza0O8Ts5uo?e5Id{N5QUeC04xO>3^8>Q6PWH%QJpJp^C~!mCui!K-J~0D|M@1Eo zWl{};SdKT8hpg5x7WQ&!k?`~jX+{%EL%|NTlbdp3+WSb?@dtRVCJlX(kQrt=58x+7 z+O=6K?F?QYX_`a$IgzD4Q0+9>s^*4-w_cSbAf+^!?LETNjiMf*xvV>bWsvaB(Bwp8 zaFoSVo{}CZ(1uyCXgOuA)w5M0l!x@0bWNh9&+>HSop8xov^)Z-Gb<`7CdJ*9rPqLc zEZ4qDJB#}7vt45;Y*06pMpOBvj9OM*s(X3rQYl$=saRPT+y0j=tN3&96i%t26+oZ; zxfHJPAojAE?gmA4HwgGCyG8u(Qwox>+ckKa@wA)}urB60#S&Q9?WaJa|Gv^>f-+iP zDIw&MKdQCbk0TS5W!|h=ZS&{1&u*JP>ySC~7R)&qXgW!_g_aOegg~XgBz`y1i?=&V zs;&W*KFBGbYEGqh=z{$ZK4i{l*C<3z-}rC^Pv!(UR_PccitvMrU0UJxx)?OG4XUD zEeDyn3>h4Qg)ufM=97-66$*H*FN5_mVb)aTsX_8}YFU6UH(6w0J8U>h>E%nT5ax)= z+yu#~ssulznix5GyQG=J^2Vb}Bpqmu#DI6@FDgv8I)7QVLRMdsKT-Cy0i6Nnk-Ks; zu&6X5e@R86PefIC8g1ALVpB=9s91C`iF;Qch1fzpun2N3wY20jBuAA(mU>UlQU3En%Ob+0F*s zpT(uPK>rGX+bM8Agd<^&cHErh_6Op%= zX|Wq-JpPP`6D>rXZVj_9vux)I3S0-X9d}yQ_A`ihi6Y*z(y*akBg83*T5(>Y*uFF| zykJXWgt$6UVBZGWp}P~v^)M3NMBp6?e40qxr$9*bJll3ICLNQ1KczwT2USPE3%P17U^)a{^a z^>%lxRPIVaT&8PrCZvnaUC_2)+aW4Cq^w1whrBQ9fqpgLg!m$;!?qx!Y(|>FgApAd zYwGIZILzBI2u+**JwiwZ`SX#Wyvg2lXZk65Q)J}Oh4-N8H+_^TPc2k>(BucuwFvIA ziw4_&*6!-XD>0y!8~dVpPSp?yz=URA;9IRpya_k5?|%Q{BnvIslJ$(^?0?bA6*`>X%@+zM^`9OP4JC^51Xkw5H}9e%GBe%#IY=mNMKv zsnDkf`roz?$R(uiU`RDobVU6cLZL?tK{U)O;hj$)JEltrwigrga_C}`78ob-F?DGW z;$#7l!4~#mD}oS;WTi#xTm+NUY7>g+3Q8$AZmOE)M_5B+KCVDyK%yNKH5k*70J1J3 zBAR+hMvlgzFwW}Z{V+-?T;VGsG7T|CRb<*>Rh|~vJuufUWy=-ok41&TG|4xOaW6|E zLx_E#yT4lwEjuax$7a%3YA4}+IV4$4F#^wI#wcXO+{_ulfYvJ6u#r~7N`^c<41>>y zLZRV5p;?KPNE=a#Vs)+SpCk`}f+7k}gy<5)bLl@tSH$-NVjc(qBsLw3Q$!`1LD9Wf zPM74XN7QS?bkyp><#dIlbb-QCU(cM#-NFkvk!!dC$V~(1AHb<48KGsuCFx=O&r}FJ zk96)L;1o?~2gse;=%5H1fpjwHSf)PHMJ1r+QM>S^p@>!j@#KF~^>P_}cwls zf5&JRP!Ur{m6$j&g+)Dtwn)U9x~O`MwpE`YFzxqQAGFVUyw6fPn)*yN=k%G9RiDwx zXrD0zkv{9H&k(MT_E|W$QU5%xUZeh?8Shv~_3JYY^e?wDzb#d9zEy@k0uUxM=B^}f zgj`7=-=R4`C>I}*wuLvnr@;q+oV^lBI!_JtvIZ7oCz3|zoi%$a;GF*JhT`RNn;XWFj zd|i02`d_d7;Gn0h#);$zyy>bjmH494uVq~cE}r$hf+QXk2Pnqgx|l}aDtvSTlqo$y zcpQbtg<+S%ZWta$;bCDIUbTqq9F$K|I2nZLn}%9OJ@p?01=9LT{^)bY3OXOLxP0q~ z>T*drB=0Kl*Ab}X=vc6Y<;@#eF(5AMkuTnGT4?bcM>|7(9Ha)CX)H?K8hRw#f>scq z0ud8yMobjw;8DDEoVZy^SKyQ~nxUjimu@naf<uIQi?&} z#epLEFRYx8LYCa<0HXk-jZcM!M08VkHSC72$xfbKvk)gn0_-~F8%I)|I zbgkaTSDyp`R#Cz-44B7*%XQ?F1rix%CDlSv>{a3;THcT0Q_Bzroki$^E*V7F&d5h$ zJPHm3dC1T&Ivda(o}>&jR3c4a4`5CT8llOg;Wk0DW_}61VO~sPEkTFNKXM2~AZ;Ud zT1Ivh;I#25-fvC;OEmsTU#Y88$4znrSV(AsmxkoQ0Bi*l>BBX6r)c1d#p^g#)q%Ue zvm09u`j1yr(4S}Kkp-d)RwvS2$g^^;|E~WW7w33f56w3*51JKGoE)}SSduA82)&d? zA})u}t8I#5N9fZ922roARF$=V zdw!dD$gKU_XB{-J{X26dSB01;=I|&~s86|mF-MfqWkIz=mSPx4v#vZVx&yAC`bdAn z92teIb7^-+FWK{R3;iBSArNWfz^t!R^-$GO$h&*{;Pj|Zm<>_DNFKs>FGH*ubCjP- zL%^xbtT9IyhxLLwgPRZYZ@{r3&P%3(oO*yUks%`my?w9=*$-X;zXy_GT84-@eK1D{ z9V}=wAVBY{`Z|v2hJpfuD}r!4JX0-Mj$GuFpkpa2Bc8=V$WipkY7|XK#&@n*zEs6` z_|*r#As8eYE7(ooMgy{rmdUab#t>7@OL~vSRTNM$r{tL4ZU8_PG6#jcg_CeO4IFK#3F&X|>!h}6*87*j@sTvN3B?vf(D-+B!7myuLhB|v zN{qru3;X&e`KvgOQ8nejAi9eCu+M#jlRZXjJ4dr|Zk6f6#?5mq9+QlM7E^rP5{D&N z)*ot$KTg`4!Mxax-xHAGmm-0VDEJEqtDk9w_8Abv-vHi){c~LtH-MwD0|D`%UTi<7 zr|r-1TL&J+*+z-D0Gy2b48#7Np*g=dP{r%80`X^~5Jt&07$rv)7nqv(g<0fWkAT<# z>*SA^Y5QHIenhD!TAFjJg_pA|qu_kY6qi_*eG?*YvjFG4U}Zc7P3MmhF_1vSx8%{Hvv+C|Q-qy%ukU2MOI6!0uy zjlxdapCWL45`j}-oBX0AG#w~#RWfPclG2!nms6(rW6H7zpj2@} z8d*7@NoI&D9jHtd%XxjU_6JkwR;v-B|gLPv8hg*rS`f4!#*GA>81ko z67g1XsW>iEFSfyw_)VEwaZ1T(aZAY<@m$GX;!pUUSXwMjEgdU1m5vkFLp9?5(uDnX zsph<23b;QnO^OX=I&ogR9d8rp{vUbe4jf zvjWVVerQV^1NDl3g<{2k2E~ds8WbzmYEY~=MT26+dJQ@iXK7HU*q}k3;zDhvur}dF zVQtpFEvzjXG%2=evxT)?YZKP>+IOIjq3s8K3~hg5?a<~3>u&A4!n#j80O}dq6ac$Z zJCL+I4k9g&gQi>0YX>26mo^vr8rs2MO|mo{RK2vL`jly(YvkfjzRQ1o`*qV>TBcH( z>mDB3`n`v?Imf3xvrUmf$kPI{t4I=u`y#FU6ilp^)<>S9O|O>dntz*BySyapd{UcH zN+mH{m|{GL`8yjYO)sHROlZwAHOE4#c?CQNCw@vv%Lwr^lpDm}MHf66)^lUr8t9Dln6{KQ)BJNFPpw-+*A=eT+}`<-Ra-7G~fIq{Qj4uxQ)d z1&18QtuwuvYnBQtieBBny#3Gx-+>`+ny;ATZ;V9FwCglU=PKD;1|i82tKgcFi^sK3 zIipNq9qa%o)fS9c2lEn>xE+#)tot&lcG5~&DII@N{h6v^l7L*B{`fLl(GMD0(wC0R z1eWal8(%&mjJ!En*x_+YV=@U@+Jiwma(a*JU%hSkQj@s;;pU}7=8;Jz4Ji_Mv>-|N zEW(gDO-V8uE^^jHks@M1n(kcnX;hAamTLYLnLFv{_EN}|s83U=q@wXluO0cE+R!Q!i-MVDiUu;P;G;zsHz8Xd0mfGkay zNytsQX-ODpKyAWJA`y~`pc=3p4p?OC zWCN=Se6+J&?@?am`6?bR8zMKraXpFl4#(=jV^|N!0VeDg%G-BOeG2^qK}2+w zPFMhdAZT+l0R+;=CTd&v*7ky5NP_@{n0j3`;_w8cehuQX zr*TD+UO`g3Y0s6E50v5>CJKS9`b44C@=@t;p%yblmMfb?58KuU)N)Z)SMM~Te(032Gd&~3>A7_;BA*Fj_SLtM_2V2sAqtN znhFj?3&!)CD!+yNdo-1QkLIrj8sb>}36dwV5J?QVjIFNO@1$!Eq z(*i`SD*<%{<|cp&i=)#M->roRJgASG6d^MbZ+WDRX!m^=dmSAJa_hy>g58G;vVv=1 zj5dh2!*XaBIv71tHv)P9Jvf$jpxxdBB!yW4BhLnG!nAvVdq%q#HVar1%Un!b5$r|L zzD$fZ*tLRg3x;$G&Puig3y8sEL^{3(OL7d9S_N!J6#xQI%T2Em8?V<21_AcFc-6oi zu+#D35)K3U$49y1o|tHo2MPNo&bFlAlf-}}|Zq_wR@*KkP z3~UX{vq~Pl{xM|&d?F3IWZ|lTPzoFyUL&1$=oEBk@JJTY^x`a}BLSpqBj}fAvr@|Galb9 zv>-!(oa3-Y5m5kKBEln}iW-0sBpXZ|n9NHh183AYxim@E3ydj`5I7VxnfieQ6HqDr z$ewxvU=oc9H42`259;tH?N{pneZOoGMNf4o}z#1EP7X*r&3p4_`4njFwY0PC$co_=sUwevR?>78{ z%_tspm;jX65Fv>2jaD$m1|!0_4`2o6gY0Ol-_`b`<>3loaadcL0eD=E`i@VTpMBUq z_~j@pT_9N~j!#W(exws{(TLtyt{-0+PbNr*H1tD(sxj-RX1d>Axca{jOl9mwCL8fF*W>2a+i z>yf8ksL3>_5bEPOP0(bTG-vp%vgZtWkU((dpUgxsnb-)i)yg1d7L$qL3}gvK`} zlNK0IW{iXagjW-(|Iy-NKrCv{!r_qB9`Yc8RPnMBuuf@oLO@IcgfDya3CL9y0>T#= zIdj-8l2{o#6l=}jOUwpnA>vC464@dGSd4}@rEo^-vGHL5{RyLkkYGe! zm?@4aKkB0a;Q$6q;t?2HEGd8j5r%R+D&^5F#dQ$&1+)yW5DZ>%;t6WhkBwia67)!+JBa1YoFdQ% zSmbx<*azkU3IWTA(8m_<$4?B|51wYydd*;gU}}8%Fj7KQC<|td08j&PwJHeN7>o{P z3v&|87FuNy1WW^#oWB4Z=ZQ5~3AH#-L(RFJLI@o{`b*;XA-#}x;Q4+mMGWz$AuX2G z+a;WRqXil$3;x#0hcNLR8;PS=YI?GY6W)a|1m&xj&p-6r3l3>(15n!{3V(+qzkwh9 z72tOvy?8sJS$HbFslREcaU0$#jw+{?=cqX0eW*DlOlO>R@LW*-JV>R_MhKsL+kNQwk>NvL*ff-CgrnE$m;} zO{N>Y`*o+J`1Ri_SD<(3XG8EUB+rW^e}LpRRSS{_U>tMI_`WfH z`=k+CYdGkmx6W`(MB)wJw{%K44KZ`(!IX`6rr``5(>2Nef3p9A7^H4B9Agah5IM6ndf@a9_Bv#g3k&*ch@(e&4{%Z(FnNq1Oz>ySCx~hVfG+{!%v!v zW?6QE(#gvRaQNAGmaknny->gbfT0B{XfujLDh$Ei9b5{Sni)`A)v7^-Ch0APT9MGO zEML;JG6$xJ0lq0PA_#$ls;=c=l&{R?xQ3?s8Z)qbYSxrxtyO7pvbH=sS}Fz(FVE>V zs}qi>$cdK)>MC;*nB%NeI`xss-p=-A9sQk)Ls3Mk+m8QInL733x3t^YYE1jiOg(&ycJ_7yE{5 zt2rqwFwOm(+-lV1WJ^lG>SeZGOIW@&jdWjH1xmYN%2Y>`hM{Q%qQrWcH|V&z#GHQS zT2v%xXrQR1Jkm%LKfpjE8*N_A>~<|_yo@r zQsc$e)L3x?p3mX=DxN2&$BJ{(;~_yYR@{T<8|ksmU(z@zKSSVBXRNr=8805g^Y?fj zS1?wbQZQa@$MY6EU&QluJbzj^R-9KjUi=!*d+~f7&kqZy*vA*?&e|eO(rHEG#l=OI zy}d}Ye}%}~i!fUE6q)v;2>gx$FBE0$*ARFMT4~}vq`#1bEtB*Z}JaB*%a z1{by&?ku&$3#AFMxy%*!mRaHz{Ejb&3Egs6JX3Co>nobXqxh|^Y!;VRw}^-Fdmg{t z)uY72!&}5__&p3C+OLk(>_3mx#784*#5Q+?xW}y%54tdl={AV->POi(;reo0J=V#6 z^`q^9QMz-&Cyg#FGaO*}(4o2V>DiB$v&5 zOg5x5=o0HF$Y8932*yuH1Y;eEV4O!H7#r#BHyWfgo+M$6H%J)cZ4geZ&oxM7tftlc z71ij2teG!2;Y&-n{FhI1Vp>a!60V3yPTWBAk_x0DlnqNMJi&4lzJebMO_1~isr5-o ziF*lk9P^(fDG}w)Yg8wUekpTMN(WUk-m{qY`He=EC=p6nmhbD9a-S?Lku7?`k%Nd{ zWC>faNJT!seii}i3yzYkLm$-qAbTgl^<_|1q?91#A~79624uv%Lk|AlVePZp4p|@# zorDU6gm$t#Mvikn!3u%O2)0tzWn`4&D|3xehlzEAw-;v0HG;+!=haQ*ez7nFBvx3a zBG>7nFMUfR#Tt{44e6Je^LW4s`W*3!*wj>*BBZa_4OMq@Oq`a9rlLNRX!}T|FnxtyFTVKG!2Bql@n<)7f)=WW8T-l}s5&)oXfe+&boPNuD zf^vYU%%VQx>5I#X*kcx$1lM47V(_pOO$G83+ikEnMj;CZZ%=674fG$39}(G> z%Ew~)=%PWA|A8gR)6<|dPMD!2$yh1_=)FqTgiOFSNVN_iD zo~FQu7zAb)k~YWdQYM9|tPrrEIv6PUhoqv^XObiVjc7ZU;0Vdf19!u_LPe5)NQf?w ze@NZiOi6#h98p-o4fPuHcbMiotLP^lUCs0?|LolU-p~>p#f!rs*qx;K_ z&W?3-CUq18t|W2_h)w0g6|le53=;2)ctuNL7!H(Ro|p60y!f+nnVJ<4H?c5nNwf2Q ze3W+{dDEoQU09m3?8RASuZWga*6V<5%glEKvPE+GuMRUyi5CzLX@=1qw88U9%d-n} zgowp*H6UU!Ad@won6so#8Ei?lLV84@Vgcw7Z z7iRw@TQWhOsUDni#-APPOP|XWjz^o{MV2`edrj5i5}30MC$cW zXACgH_K>$`E1g-+naEl@G=K?N5QMf{*iBE zmwXNY@wWd+n;<} zPCnT`bv3eW3JeEB4StwhwpXi(2OdDPSD!@JZRnRHb%2&D7xa6Ag>dbcoAn!FUFNOU zL=&cWR;-Ld~t5S2ufF?~e5`a%Mdd>*LOxKBBP)<9)o3g0!;Z zecU1Y2x&Sst+AE;dpU#Q%0?Af+e%OiwQVa?(`XZx4>@ppWX=Br{`|{bf|kE@G>9_6 z7;Ltfe3ZY>kW# zmbJlO@_^w_If+PM)*`b(hX$V}m<73)=gfuN;pM94>}pj9yQ2E~FIIB^Uc2nFj|~TV zzxT;thxJ*p{TuSPdAc0mzt^h$drf@*9+3O@fWLqH*aV*;IbYq+2AhKSV({$A2hW>v zcy=pzUWvoAOTx3uhlfN0EQu0eB76%7h+=#iSTlt7%X$=^Y&p)uxIc?h9E8sFb7LHS zG31|y)F3;I)C~s{dR|BWV)sBc1Le*NG+p;`ahH8UFt_?i;iRAx3vN10H3{zpAz9Xt zC8(hCtR(9m*wK5$DySQC!S{tz9wse-BI-V{vI`2aw@%BWMo(1DP9$#9oRp%Q5lj0D zurDSM^Na#;(wUsV^dkzv@^EUYY7xOZkhlWZzIlr!pxPbbo43NYtbq0Om0-)GIq3uhy6s_&Q*H7dVuukkn1LB^;!`4$ zHZ2JTIF#I>y{K(8BI9`2RJLq?TfVJ_Sv*LgGMx=K+>SW`xMpMUtkLh=jy3=b5@k7f#4qVA~Wa;({Ed_@% z$aO98C~wm&@rdS#XJHKYB(NjT(2=r@thRTV_VAw}y$0R<*bpHf~?BbmvVA z*^f&g`#A|@-;$^lzf4q%-@ttBOJGgDmO!d^H@;HqS)^HdVmzL7+=11VH{da6=vObr)XQX|A|sXFmcYNY*C$`#M2 z>h0Yr&Hf91$EP)WZCZCWrW>&Rq(|AeA#hI`74A%zIv=J{;i(QPyc9|c;yR~N-0zIG zUvba{XnTvlIHk@-1;}$<0rK2efILqXRNAlMmi$)17;qg6M%h0F5%QcuWZqO*>io74 znO`hK=JyJb`GlfMaY4~u_EvBvuY;bqxV5O%d94U}J}p9?(~FVkvf@hnhGO0Mb@5oJ zXcvzXFBgxq-$lgQ3>dhlXU2=mGheeG%jnLt*d?4jkO6T{EJ4BZODgTlO3<4U>P^W6 z`*{Rjp}?M!iDGr>MDdH#Qs;?M6necBg^nvjp|i>=?MupZ=jUbM_HHj5Z{Lc*U1i|j z{K4_kE@V(&9GAEs$s}? z_b}vpZW!|YX;`KG$uQkH4jfc*QuTOoUUjSevudouj$ zS+%I)7qzJ2j#||4L~W)0hgv{Wi##9HmO7UVNBWJ!k^b;-q`x%0(!Ozo?%X;8>GzJ9 zXg`g>E(*Lp0+rQKWpz|p9aUCWY45Jnojr9(|G2Ky**p^IH;+X6qa%_2%E(Ib;mA6B zy{ifKLJ;M~8dlLXp*IPAYT;Lym)a39Qx&7srN4Z<)W#W2jhqteP!`!flk~x`+VV+kcjz!jpNtvtQ&0GMu#xX4V zNnTSreLvmul7U|gz&QXEi~jZ1qpES|ay7+EQ7L?VCv~b=ew@Fc^0GQrEPge|XSK1J zua}a0&F=Yi-$A3QFj1x?7y&e$Yaeif#e zgZ2(bfoOYcxrQB@Q!MdXAK6ARoSh-E`xLP26`h39ON2he=aKU*%_#sHc+8I^#tuo8 zIKsOd!zXH>gTns3qk}c80$U zGdY61M98!}{BX@28tnu2ZKg($w}?Tj5N7%d`0b|i1q^aH!j3^N#p$pdLX5mAA&Q4` z0BNu#JHd4 zSQ%Os6JsKXU(}6UPtc7*?ENLHpysl1csP>Ij%v=0!U3M0s}3F|~{n6OUPbaEeDA*_eA z>aV6C6xonj@weEJX=-i#qSHH%4VkC}l)ja|m%{%f*(YBnhAhd2GBNqiaX#;}rI@6+ zlrIv~cci+}vsg<^8pm%ZkL*pBv=fW7)R9pX0w@iE(Kgt zX^C_cq+eJ=={;m3Lmv5|y%QJW4A6a2lu_NghtUM4EQ26c5K5MKF9azh(h;VBoLNv0 za&xFDtT}f^RJr4x=K{kc3`kFgv5p2(VwK!Fup1fWU@;Jo;$T??8dXt$bj+?JxfVu2 zh#>%1a^Qem!0<_767c7e;J)&>NIRM-*+cJ|XfF6@gLDq(g7y=nE5J(u6HtLbatxpb zqW(g#c0nsFG(lB8L-WqnRAujTW!~eVn>(4|b)m*H;i)VSsw~W*0PmilCLRr}eK1dk zDD5nTlJG8~)ere1L=fMj0FQ)su8IUxj^>M`P!irx{hXjN8Wgb98DY6YdL)1#;y;ahqBD2tDm z1<8yDt_y-fT%g`5j!NJo5Z9O0_yP13dpgWuv#OO(?8Lu4;Ok0ZnlnY&+ThAA+LgActOjJ^wpC{Hz`I{Z8QbUX9CTz!up#)dJRLZNzzb?kXffYq!!{+Ri~w+RMn~Q z#RU>9TMuD&r+ z3g%0cro!=$)f|Ig}fFjmaL&)A1?C~mL9pymCzLtdSL6cvn)qaI>#v@k+1Rq7^ku;rr z6rZLkdHmrhijPm~iAm4rQhYw573cgX;fy)*@+p#7{vq71bW5sG4U2v&WwJTnZ=1bf z&OvR`{+*O~j*y6ml$4Eb5-BO0yfg$U3G}5QF+j}#d0{|U*w+m!#gcc70&2Fz0G;&B zv}ak5YcUki9L-0#3v7bW4PWxtP)HJ?86;(RC1W{2r#N>FNfZDX0>0GgtHIyv}yI~|S4|c-?>o}`v{G2a`-7N6&k1z3zAwoIW&H1W^D0Z{iua&4= zrSlGGJFNZC`QCnQ?ep3WnRD=L;1cI+PP%t_|F^prEni7YWKg?O2z!hAyNL~ZrRFO{ z1JgnKkO6WE=PvJeWdUX?->x~v1Q%&{f{;aNT$qy9$MKK%Xk2Q9ZdVZJHV2w)^aI#N zglh|A1js@J83B3#Gxda5gg61PfC%Fj7(xLkSQSjc%I>>nmghj=BP*bLr2r#{R@tQp zV=>beIq{N?X2Cd2Wp0`zrU8)|mYbFj#V7@Abo}R-1}FVnAN>LTl-4p;dH0s6t}Sq? zlyxGn$oe?>CcAG;JB;Va2Zb);4onB@QyvOcHbU@Uf`W)Ov|mK=jXI^r8DWw_k#oN8 z9F`Dbp)FP2ak6#dv^g5s*cd%loX1|EYKLGI%Zvyl92!YQja00Ap zp9YNMY+{^VsF%Rjw(eX>f$QPG@+#V0qTHXP1rDDDCXzL|KEDhc{4F#g=*;!EOU1Bnf46NG z&H`%BSM&;qP%^qQLRTV&h5T-XLbNMao$X|2!#Gyr5OF_yLz9wn6~rQF385Q| zf<&F~g$9drb>S@PNIo}#dDYeaPFj``rDZV(jS(56xUfi~GKJ}@iIrkrigU!LW^IQ- zB17RaOdi>$5l$iT6(%HsyrCO2fy+P$9Y0qCjfatf2BPcuhzcb$y(bzWO-5~l^cd5d zfZPy~2pEp6-dA?nreUi=0}%XHkbqB*3xy9O`8rZC60JoNyF8MvXM_dXPmGt4*s^dz z@j5WDa0Tf`1uKbMQZk+UlEN=ZRtb|(y=Mi%ZeduZ~|J5c8c ze>4blSgmlkliA=)GKAdJwE=&_-i!k>1Y7&CVp@DafH7XD{99<-n@Bp z=I)2~H+&&$_Ik}Jr;7YPf_no6y!&7;DPG}x#6AtD8t~Y$s(a<^<;&n%B%s&5fr^yj z^{kZ7^AhX$v?5~NhB&eAk|?omOO#mmS{zwEiO!z}p%<1#h;^##^MNW$sYXdv6M7L_ zpU>`3hWr49C?m|SfS?wkx50i&grEl7DiJY7*kA!c4Pt(_W|qV&2BOFof>?$zlZMM6 zVHW$eQw5^((BlX*Q<_zp4wFm)3=hTQ=S%DxR%&wN*{!@KAnX{Rzkm!?gj6yNxb)*f zNU~3e^nrpuP{;+9@=0o6r3M=pHXbiQ~Uiiw;Dcdm;g z?<@?_?)Q(#hj9}#@oH&oc?@xW#p!~R{%dgXf6vCjTL=d))5I8E%reAWQ?#3+-x6yy z-QK8a_E!9E)HLw`=zNa@>wX&!ZBEmZ&bc~p@=Nrz0~=v5astHKc^8B}ahy>k&Vfwg z&x~UGE+gqYU?AU+%$4rY; ztx|iNm2|GP5b&ghk%Z;DgyrLHyEZ~tJG6RXJq5y`1x1Lj zFy_Cq_sdfUTUr~H$k^ebSCX4)5>nE(hJf7+NPopBgg)6Y@SPp^n61AJbnEZ&M3VO| zkXM>4N<<8;Agmyl7>u^(n#SPhL7h!AvOb8jX->=MY?>2%XK3W@8SH6=_VXo08u92_ z1)CC#-xm|1lY;D31jZv6kB?j%h?>c9{*?x@0gL3x!18u^F9U4VBG*zxHmjSn4dLFK zJCkFSghy>iH`!cHTJcb>O{4=7E*T;1@+|SR(PeDW3OP?~yn^XHT+fh%STVF63da0E zZL&=NGV{!OEJO1gi=3h|%7-gRpo>kHn2<3JFPFHu$m;^|Xi#l|=FSYLwwA{i2%z$_ zU4a_}*GAYfutr5jrTSEP;VKrj$1wG%8xOSlWd^>0z*Mc~LQhh0+R55&y}{T#Ug6G! zVRIQSCLxn`3gF|Jpl&v?PcXnj1x^R$lmXDG=Ex!j*xWgd>+q`LX=FJ%sEXZ#LkmsS z<7z0z7c#cBtMt{$^a0eBuqYpgmwd~hnZVBF1YRy zZtn-#b1E^<2~?htDS0NOB|afA;4cSbs7_$6W8*|U;oR5%MLBHoZFZ2R-~`Mn->yjK5YQ^UE;1!9 zFT04-z0A?2v0s3R*y-j+#QIX2N zudl$4>6GAL@$!nro!j&#;7$p6*_8m_!@^i_E6PiN7!C-!bpdEn_6C(;LcR7y{m2A! zANHf1`|%Lf7yA&xuE35)ZdW)me^(?F#9t^MMN12?NE33Q+rKHCzx=K?@ilOASi{EU*};0lXoC0x~*BN!@xXj&H%H zDMG>ossP)EtN;ZJRKc4R?xFkD!#F&sGGu1}Irtqf@OY~$qZNFgb#1k9*^vUQxoFZB zhCY*8NK$us-lbU#`gU0>HdDe&k(K#;D>bg=z&~MNrDhlQSxc^Sz@0#aiWI{HBdVXO zwn$O)d%iy=C`>c_*kl(V3637-p<9~AhQ3H)5}%I$ZL{bSTp*+FSj|{{kZFPk3R+Jt z5LWCQG?tp$&XQ6iQJV0m30h8hcgyKYDG=PG^k7np4HuOqP)W+WP3EzJ4VOBjqaBim zf;ds2H4pt=+7XqXsRqANB5Y7SsD{?7Z@GwyOZt>@Sd+b>c$%~g!p&houw`m~uZcoN zqkzdVX3E(FEh^|R$VC=f^v89!9M_pamwZsdbBr3%7$i28{kM$N6z*LxO8!pFHR^+m zk{gUtB7kx<>PZBn6mGN(6?erSDA|wL?i&mih7ZUHq#?Za>%(F(>bsxk>k z9D--j{4_8R7VD3`L^-oCY$T+)4&stJ&JEcACD}*WKsK4r zyuK1A0n^E2$W(HbR6DIk4B1mg%*cGYq`=~d9x^p*cKMr5!dF1O8_KMmV45%K>{yCy z4+*CP)$Kcv49B@`D_1UG36sgB<61`1#AckoYQ>7>D`6@c39n-uBa%+f(`9{cVOIL) z;0T+AKqt8Fy^?kkBaAd^0%Q_(*(b_VlxotX6Cnf_=Ll!9#S{^_q-H}z(poJ6dPtRz z@>0tZgJfYRMN$dXESm}h)HoF>C8A^5=)eqbK<=0de;-mUG>n_ZTBqQF!iVuNz6tyz zd!1Eok7cW2_UTD7Mog}aBdttfDo>=L87XS0lypnYYTssF&mvUM0Vh~dSmcdD6|6}&Tc-P{Wr?RP6!tP+4$(U>AO9&h9Y40CbUkE}?zb&ye?``3 z?TGslJg3_bzmD3pzf zjfF^lK_QY~T^ONX7FN^kg(>&GLQ6af1H9rHM8gbkTD)C|ay~(l(~An+i;FCAbrCZD z0vcoK?xF}iQdCG!6is(uM9gbNT=hlU(eX*s{W0VgZc6Sz_aqDGk>rej*_VE!L+b+8 zj%M4W_%EN_S6zKWQ-h2RadzZhIpK42G}}f#?!!MU_~o;9UFwNyqT&&N`Cp79nkDL9N)(v3TzV>f-uK9&eG%UMh>6 zxA*c6&2`BzQO0x8Brds1TXQd=6<(oh^L2ykLfofqSk#r^PU-RKI)?WpRVxM1&P%ONR^ngnAX6}*nMW~eN3XCh1Bs#gYkCHzFV zO;p-1U~|bVU&zo>Ks!1{I#=}fgvA3A2h7{2W5sY!=TO(`4y8nO!jWt&m=%h^0>UbM ztQ=I$GwxN2)ZLo(qNPB0&b8Z8_ZsI;;-`WZgYMCFs(WNLFRq3pzTt6`ku%7nmo{jE zP;2%K^>+3z9$mWvB5V?x>KcB34zeV9)JX9q7Mkej?N+HvxL$a$avk(`L&YrA&T4@Q zKf}m|bv-Ke7qa*g85Uni%tQ7;>nOvzmUree$$;@;%Q9^%W(vdNKLf_yI86VM{}(%h zb4V$N#H_~VefQgc@c~N?T)Iqg2+QK<-O2!8$7a^&#AF`SV6%TU=Voh5d@`6tV}>_o ztXC=;y`yjwjguGK{_>dy(z2BogTWtDpT#_>(vFS5%2zmirkBE?I8p#KP8o)G)IO|V z6=h)6)hC%P9K{Tcs{TG%03S|pmWhEyhXbEZ6@bR+R&t`G^)Vchz@osbp<-D;?#q+g zASmt=iJ$N|5d|G~1BFy`!a>HECVQkChA&sdSf6Cs4D>3DqeU z86c;DbChI$0v@bUp#r?Iqqh=lXF}-?CzULOOk@znbqNSh;pBy*JfKLihcxp+5y9G> zm~)^(CN(@2W9yerQpyCXY0*G{1QmNnrtmStl+A}6V+Qyl2+|59)8I55$!6QY^#pi6 z{pQca{8aBKBnID7agWgc(g@@jT*a+nYm?xzNQzTz%a+O2G@S!}M=njk9p-b%OQK@| z{u3xdvCg<>aLALH5VU>(9n~IymxxQFYTS>IM3crn0(3T;-vh=<+F=Y_W~4ywFF_e4 z|2}Uc0Aa2tSYQLI00^=V+&|F3oXU*``YqduLvugB7NMiwn2Cx9D~_Fr@N76> z(s65mkClW2wPGnam<+apF_4gU`jJL-vw0bs0- z8_;Z;`Ku6f-uRh-HI#mpjIVHsu#_82i_PZw$S6mJu0mMBmFDH-003Vy)BO!gB}BuW zFFR3Gb$7Nw>d&1(f`#_dU`g}r!%tCbAScGJQ02q|VKB)V=FyIM1@9+S3Ow%QLF?)f zZx3-_0Tb8ze9T;rG0r^^W+cb>IV>*#fT)*5F3y9oPfQI;a!<}D8f!4|$ee4*^!(;j zu5;4Xt!MKbqou;Qf2thN0WP&s$~!chXG`7kj1LzIAV1_r1}9$+C78{VLy38~vTB0i zgt6$)<^F7&;n{MD?9yxF|+D>dIGxf!K2+qzw&Y~m+P*jG}rPH%41e;A@ppA$s_@oJoeQc0k02eTz^l(9Kt@Y(8HyY z=FKWCx8W5@PQARi=FCwVcQr>*QfiUqx>Tz&F9Tx+YS#Fy9D5KB#tua7F#s%hkRl#4 zaF>gY!rKjXd&^Zoa(lqJHXCve;7w%>-e~GegTADCq2@B{q2_l%#4Bq6vPck>H3eY_MtSI7;v6IE-H_>T$Uq`< zmmeZnpOh3(@^VJiL%Z?|@hc?W+{ijY4=oT?s(S&aj0P#ahZQJ~yay4(W{UAoG%4SL zEvy8e2Fd-mKPeLEB&bqZOSDGxWp2^2M>c#c(P%KTY06zMcCr35q+oNZng-O%g&vg$ ztg-J!hCc5oly}rVm0S%5*!&74YUBXLkLUUawdgbQBZ>*h?~Dwi50Tg)7x}y9ph$#& zTi+Db@Op`tk6HWsa1CSs-M6hByS#fxmr$7d7g*Spq3zP%4-C9k*Z4@9`n;D&sXykv z!xJ8=4tYI;u`n|P8e&HfXyzUfxVd9&6<2q#9;fQG{m%7q1Sle3Du$uTR+mtcJct^{S|>6Np&X#85BnDX-DGPC*6NDNd2HkyOXyjY%{VG?hJ2Qo~LQR#ENpjh&rAcKaU}t7%|OX22g`Qea{Tb19Jxt23gviH70Jy5>#n8vZX}}MvNcC zmBEO~hBdKO1}lSC9?Uy(UgVgKauqbbYCcs}$akX7$4ln;@-hT*37d7whA&MC!u>(3 zoAJMu$5u`M-^vqJd1i)jLk;=0h90tB9)g&VBURd+x0QA*wjKjba<^uf-&2WS;C+JX z)v^^ZUgUtlnTi|!L^UCybuBar3-ob!=aIvbd}u$JN)JJBAkc>-Fbks(@jUwQLMA-= zz+}Yv%aLm+NAmcyF#fP#nnf6YHjf^;-g0abvD}Y~c)^sygGhzqPL$wbcOJnCMt}@p zpd;~w0Bmr0v&Hj@M((;}Mp{#-sVinQC7cXtOsYB#kU}d=AF4o>nU_AZ5{F(42Br~} zgR?|HA5QM$=;K&TpEHgSzcNs9dS+vsc(PICU+I(26^`l=fBV0OL|JbEnIK=&obuaL z68zqm_FFX%j%(HbQ@z&QMz2)^!tbKo15Yua_CFNj)B zR6Y6q|EsA+%lp%bYHXkEElhSWd@&E%auDj7i1)OiPQ&faXBkww+*QF1ZwA8Ck%J>7 zPenXjWd?sU;Ez9S23QhOj?Qt#a68EKRCv=OVTCp=a=JU3O(y<-TwB00s4q3)qDpx&$Mk#q z_fe~874F@G-92)>U&_}My+;iw{rTzp@Q@Edg;!|~&y_`VI{59v6Dqdy4`qM#Zc znmKg8?ZN95@?JDWe0aD& z@V}`O$cOZ-?&L$2An+e!iPFVABg0*t>v~cQDu_AT5{ZFf01HAcwnWjgIr~GmPYUPSi6Xy8z2#fGcK+0+~*SBIpk&Vg6DS8323P649=q zehum^#Cro9QcKWp28Vl)<6}$ModX;2^%>$0n7?dEYIRTlI;qIzBnWs8b`7r!0)A+V zlI1`wwQQtw?YdAYSK6X*gfZrDRn~t%b~Yqk`5~^}Xf4@0Dj9~Z)jeHnWcLLcEL~~t zRIa*pM^`5zS++#WBuc4E_sDfp7QsMAV}&j;SdQ%+=XsdRy~WngDRt966D zjBT67kn)N%i=^m;!l!c$?(-q5XzpC10ze91<#(*@9O+t3N!a*+{yA+315a2Da|fAw z*q18JpglViHqhHWY(a6fIjanxECA9mZ&|yybpBo)^Y>rUv2Za=YOv7^dv=+Gw&b9t zOAc7pF6BHR69bg&InpL_M<}M2>{=y3;s-)lBqWatC45k$T$c+`NsZX`NhI|sfT)JqoY2jt zBxvjwCGg{?<3gFb)*LKrmF$e&rXH(>GSq4u?Ok#*b&L#+LUzgCwPIV1LiTP70~V~2 z>a(SRV6t~tz%s$U0UCP`CAy=!Lsuu+dzK!_@-BLWu`S`jZ})(RxvGg&LMZ@*Ku-zB z^!Kjm=|@ZQBXQK@G)hjVT$Q9gT~LRm{fsgAF07u)kQQa^!mAF>xH`JEs~ zcTaamD7rlWhzc8B(Fd#6GMcM<;bd7q$XeUcIXbd>5E9fIg4jiQW0gb`*?Z-U#e4?o z8M5~dWSTmH3fxCkEhDOG+>bH$tx%Q4ix_5s4or+4dYU!&%M+((O>_Us?0f^mGOHiG zczjl#N@aWD-R!uma{BD>=TCDsW0MJ{eib3nHAeuOm--?X+lJ#Lz{|7Sc^A1^r$jg{kr{z+l-98*3GdCdDX z<_T-c69%=LIq;x&GbapW&_@tj3JbA2zPTWpY`OmffX}bp0(#CZp;MwRodHWdcg9NGM_{by3E1j6IbJ}&jZdKe zf_pvg@ct9pOkNfh^ak|xot&5q0q{z?AW=nkB?{;h{BABNpg+T)&OZuV`e9KCT~p-J zy>Oo^s-U-vroc8%3Ec*<>-X@xx_ByWEv}~fic|D(aVfo7Ttgq@du&3fd&Y#c`;!Tl zxNO2SO58MII{k9OcJ%Uusr2rI?deA)G50bE`#)PUpWZ830P{EPbYW=;-B{|<@8G^x zT0ws+o#Y-j(Qr3UH0bJy3+dL0i|8)6k54S6=kYyOwwJrP%y6&4?-u+XE`vaQ8EW^f zGRNIiZn)Q$TjHj2)cYOyxVIcJPnNsxD~NdqzY{AgacTtuudHy~U%_){#ZE*IR?Kw& zT4A^!A>eb4J#$itd)*{U{CpBT_rUWOJnu~c)Z-^Z#D6kEe>~ZxYbMWj@11P8kKy+Y zB0l7ZGb$bT(n<)mR|4|SD{I}~!t)?|o~)ed9#dtB6RQB|Vtia#h4eqKa^2s-^Gp?z zyi`?3?^o5iV^b_~{1gP7F{Pd^ol@_9j)3E)+T@-&)e`6O$Cjz-#N|^P=%-T~>AtB= z?tdcUFH@1_&8aip&*0fu4bQ37Gu;cTE%8(K{Ia@^?#J)R>N@w8YScz54SPD4I6Gxi z;?h(LU6U$vpGCl5Q%L<^sX98orp`SL?DHSiAmAtPJWyk}Pu3XpTuq8zt|@iL(rNbx zX-k}$MuTrjPp2!=+qu8M3FD=-N%u~lM>lR)PQTo)f^Oe#65S6y70=_har?=1`u3G{ z?)Fu5)%GU+3cvU8yLJbYp2Y7YoMnE4-#hqSxFg)=BpusQO`BS3=$NC&g5f8X#8#SZ zOP$@nL5_DAnFlR%4*e#~419~s^~;^n4stdePUa7cgPhZiPI7)|tRV9$<6!5fMi)6Z z8jvi%$M~9aztKamKd_R_=Z!<0myA{9yk@K>^Hbwc=V%k+-N%`IWS(n&-MPSAL(WBJ z|G%zYiDB%qzWVEf*5;O!{5w3OSK>y#B5@B_hK00734V0oKQ9R08$^O<26&=iK7iXd zDr9-+Z5SMy;LEJ97+qNpBZ&}~#%W%q$61L_TZ6p=(9p?3#4J{wPy3rMo-H%xk(_2V zJW_aloNTw0m<}*drPl)yg@M0QpU2uG<+c-AAv$pwWIQs@5G3F@%U3T5y+X)?1-9uV zX(&?y(({+MXFmauiXy&H$lA0vaywXL7-5SBaiOH5t@!JRC+Kx%Ru8U|F%;E}JhZ}O z1S$B5uQgp>Q<`(te<@%3<57mMMKHkCGv_L4Vkx1T_TGk_OaGel7c!+cLkauf!T>kP zlA+$Ggo)D-7{mQFvyX9)fLl~tydu>&i0|e?yhkfm0AngZPd++ka#&bRK4nhum6s$F zA7EjnJ%D;=9C8o&pn#nTEpK>Njf)f$@7$%Zg_Jtwd%yg-pYn4vQw;2~KSFTD@}7n) z72msozXin&Oxa=l&mo9Pay;aFq=d9D>Bn~l@*)M15ZqBu^P$HZY5g`tUkU7)x~ELGVXkJF3D7# zhhNgZ%(Y+<*nF)^Y1@BbS_QnloK!G#mCGZPQx@|GA0=2%?HpcB^bcM|GS*SAU@zWo z#-YDw*Vj@Gz8M%hd zmSA)N(m1Gk-g7_*6KJGzZkP2`o~79;lkuw=2BphG%jofKT7u(f6 z-l%JsT|2urHDk_-Im2_lJ*RhQj%2dUS=Bo-r)%}l;M(5NwX;_Z4zB9&86F%R>gt)@ zHMn*bv*3mXI{RlK+3L|1GOWMYAHsS9CY-NOyA66^(QbF*9IgPv^)e^pV;#-OdqU&^0_$tQhTI zGizGmF-aN{-*GRsDl2I{SxbMw#WpNXdS3rsluz4fYv`!%eJpOSa1FP*7uD|v6~ zRZ*@+yoHd9R?2~{iKBd(a4cCY4URpC+VQX~uK{hNdZpv#OD&{cv3$`BDO4gi z87xQxEO6QNy1$vwSZvmE&H6UdlJCe+94cgtaNLq;-N6@QD*wiDRGgiapI2)Z8G%F| zZ?m-A9zgN-OFsCKdoD&_UeGyGx*wa0Q#lDPSW}>w7i3WA02GArwIzZ~g>#s%tc3MJ zVOyxQsPLxD;p&o5bv|GEnYBe>)1rttZX6L8hltQPZ{}6W$C-}EAN7ICUh9d8e?%y7}@fE zAfwUepu$V-1VJ@6sD2yp11l!OLd&3+b4<_@P}{3t(WRj)H;^L@70Rl)P$()8MP06o z@^_pN8ujbqxB4{+(y?A(wYP+F9M!ZLbbyRhVdYC|p8^u@;QXXv{Q!c zi}F2*I0WKaJRFr&o|HS{zNAK)nhrh>9aD5a{6tSm*eajNgz>Zh!155JCMB@~(+fI* ziLQZ>?spBI4-smabJ00C9D_nus#Lli9-LJl zGwIgQ@Xd>rk-#2!x_;VC+Iw%km3pvdpbXypkUln6M8)}T9!fqq;{EN^)8GCIv5Cw-9>~u-0Z)T0qr@>?6 z_ho+u67V&B@Q2e}wqf88f++RDP(Sg*SR-_F*&&PDm$RM$Z}XR`g1*7XhHfwd`15gP zH-@my9LS2GBN95kVXJLYj=09K+_myq>;pqM-x(a>8~9J~If~0Gd>#$m&c3b%@-~^m z#?>*xe_)CVXfQfhsbPTjqyFyHjM^i&>px^i#9oFM;BYQC#l$#LeH~y~LDJ5tg8-FH zs$7Tn!=dBe)0n0S2E$8Z5}yuOW((_v&eC!OjmJ>`Y>_>&R8rQ#1_p469qbj$G!R&4 z!R34CE~;`w*40TB zr77jin}JB^m7>gdm4jh*YC1j?X-yinG%itPW?e_B0JgheIl)0 z3sK`JU1*r@?YLHZ)o{dHxOk%v4HsOA8uv=m5!XQr6!b#5?(gAw#;hWG&a9wMz(e>E zbV6MR4#aKNGcy5UTqhCi$-QU6UD0`lYmbuTt^D=wh zM4k`f`HVfs#U|5P&@**;%n{edfW$2^m+p&2>8aQb^l~iiet?KiIpT!4OQ*$W&_(em z-3pns|A<@kpYdt*F22tbwtKB`#7$5+MZdzsl!u^q>J?$pdtw@GN|>}IF@tVO>_B%U z((Yq;n)NgkPSFbqm;Q=~&ynCe<4VA5j+Gw2cC5{2#k6gh=ELmBuiCHx6h!Am(e5R`zRN9{YL|?`FaM;L`*Dmol(Rmj{2}CXn~t zzCy?bW&XhK_xQny7odd_q&6OF1d4oc&f=>Mbz0|ljLbsF+}A)esLAIoKAvDRFvg4= z+;%YE2mVMl!t*G(n6s_#g^*zHNf7B_@cu8}i1?^`4Pv$N&o4O3;S>-K>;-mJe2ZsKNQT4JDajzS1U3(j=mAvpD|hkp~=7$4=e{2s`cNegU?FIqO64jmy5^9{+E3i$p$|DsFDp8 zLow_8k)2mt)5#HotjfxhTiL!47&85Ve}QOmtxDUG6bZX zXh+9wa^1Nu9T=sd7=0)1{@5_YMQlv_7MQWT9}L7lz|Q60acBBDekYkO{Rn2WuQH?V z?WQ5_VV=VyW-+~htJ7mGLu`Vy1#PxU+>7A3!YT#d0-oF8xx)g?Kf{{#sX*dvwz{*$ zE*AIMWhDM&my>u0#}gWJAlv6mrt_Rix&kMW+nlKTsAGsHAv;LVK|Sqj&J_BaGu0i# z&5RVn32&-lYa14Hrlzo|Hp$#KVjfWFtcPzj&0%Fp|2zEhQn zGiV~PYaJf{$m$EwvkZ>e}Z=k#9NPct^D7_so9w2k& ziU&xV)H{{{7~ZN4X$7+C<%f)EU%Y&&l(_5Y?i}e+SK;Lyw0y4vmhQd$P_T6u z9?;>$Z`st`Z$^$BAt9#&*<ue!9FKu_E9qTKE@k#IhrHEY6A}qfxR5n&D&e^4-8CwTSMr&%UgW_7HU> zE{$)zpP{@dpZ-GU64h9IRKU;i&uchIDdiRZ@r%pt^LExslN@<;BhJA&Y@LC%_)rc1RAMiY4Y*ccE8^J3=@dX*4f-e2G~c(U)Q#zD@`6(q;1{#2mh8mo z7pEM)sKx<`Phx6`FIPgk6);9E()!f@=LJw|z45B+Q`D$5mXqj&T(TfRHq`n@;cqKzyQf=4)0@aTZ}DM0g)?0ybIMIQK!LOIM>;yy3PX1 z2%H0N7R!V99r;<=kx^q(c4jhq6m*g?b0kRd=kX~ZV1tGRvq+uiktZ9?O@?kM^oniN zE}r&6&Ldy#ewbUkmj*ZG*|mF_#gb3*=;W#e{32A0$=XDVI- zYk_6Pm%6P-zJLdzD%QJsTt2>eM^6lR%NDXB9W5;=0PYJp|6JP`cLIKm#tM$m(y zDC?Ay{+KaU7nsB3=Pl#~$qFjd(}jN37e0VIdmoqx%X?G87A621UH( zeT7BJN8%8RnUSQigDamLyTpL5rn!+#7HgZI}`c9_$mO3l~FF*7unU6@g`wX)Eykv&t2``bytJF zaLH}P_6(YX)ThIbWd28Ef47f)gu5}J!Es?Cr#7}RsmV}mbQqUJTQO}BZ)cwF6=AaF zWRpZt#j;i-SxtgCHvNZAfLc%CVqG=~=iny6e}0ohRAwx6XcA=LCW(w|5^S$!lW_K+ zNye|fkNHHg5k-`cpD6C&y2%`=hnius{X>&GCtD=Yo$_<7DH8qVpQOzB0?JfvV*mI> zls)fLh9z(uWpb$m>Jd!f(3A8}wS*~K!c>C;<#0=w<66QW99j5|9~`gx_+lJjvJAHb z*6{3s^roq|;gDj*4IFp2G&WY=_&w598fFfFziR;M_J(IK079=;168TkRE;iGV#+BR zyXW2Y5h7(^)t7tXw5ik^$qg{o80bPKZ??21LT~m$p3>BLWLKW;kL9U=)3Hei{HJtg z^8}=HsAAf=S0>>p$WWMIlkh-jsmSasfiYIN1e7vb+ze<^?DBB=CH48HEoo{3WFQit zE@ZG$FjA&8kWT6#P4m*Cv=qwiAiQ?+K28kOkr@&lDGMVK!loLCk{IUg8DcRoR5rld z!nu?#Sswx)DbS*3X8(mp%?5Tns1@`bDg5k}@f?9BP@5h8;sMX(;EP4wv7yH`2GEx+ z(U-iGJyKmQ63L@3j#CVP%VL>Xd2E+L_^RiqIzR%Dg1kH%AERY%)ux|I0)4oU0^Omr zhEBZERy|I47_^^E?<dK)=H$l5$mSk3uLEZC``F-FP0Ve z+ZKI8wHWrdr1bJa2Qk+jZ+KbXKY3C?JkMe>Otpei(#TE7-Awia)r8#Zd1fP}QJuGR zp_^=004u5F(v&pxWNryrC4McwZRw-cflO`CyOmCJ9M^R(mwQmw;;Ph=qlNrl&b>-j zU&@>&Yd`4o<(X!ejo+tY#4tvo_kDSq;PaZCdQI*?YDi)}kegHVX>_}z`tXmjuu^F` zMa!aYP0xfeA70{llEqU2bwH9D%K-)vmWLf)Qpzc@d0j_55j8|;;}g*vAKaJgjwvbc zgJD*fL-_pP*4MOseW@4} z)K%6*y@DD6+H{GM5rGn6b0m&VxA2_hEB;2saka744t66v zf!N8Pa*}kRchr6b5j~G$OUFxPVNR2(a2&fiPoMYGh|hB2j)CeGvLB7ZXtC^KT>Jk| z5W@~{uL5Q&NR;p@BdeDIZ|=<+??g(9nIy0}BzzpNjU=yQY?;xRP2RT1aL_c|$1%}! zr?0`Pg*6FOE;>{UicM3|A^C+qLyOXGDlx=6M+;=*d;Jji zyO{TVEPp8hoAz9R0GjZYsBRW#)DzyHk=w6|N&Bj5=82B`gOQ4_@oY|q;!?ga+6!t@ zv6J$Nb0yYFM1KdxWQte@7J)%H?8H20J#hsBdDP*RAJheNJUR|)Hx);%aqDmyHE|S)Q4`aBRMf=z zoS&UIo!~y2PVRxrZ1iPpA8xQ|wXOHXhwzu~em z)cCpq%^<|Xd@Ry*hlkjd}MIvkt zb|IX8Q_e2LK4TX$;MibLdTcTh*vZW-ue^*>%Kjuy?6I-&^I%0ZWvux`kcswV>d-wA zz?Tv#G4C$yHJn9Ao0F&tz}eBNfXc%Z_|z&L+#M~vk_0%#lGzHiL8^tJ*$~Ed{T9Yu zgrz$T_CqKXL?uz_XaI?Vf98gf8{9ak$NYTzU&^x(Xw2+uWVK+3;$=MIbXReBnRUDb zEaW1!++`H#$*l(C3|+Yj8JI>(whoJTvuHTC34bNIO*p6D9#*(Lzy+y5d%&qe{j*z| zcBPw4NB#D|G{CIb;vl~IP^X7rPIcii( zF2Q)t&x^i6FAOst^q67MJhTQCD>?6~wQ-76GY#)iNKUAF_{mANPga{sf;pRS5r8Eo z2k&iH9Uzg3yI>^9&QMSgGrG*VKIJl&+eY65%R2Ckk?d-~b{o(z*0RrQpX;Jfr$HSB z?O=-E@ga??gA0-CvISqjP~8W?@)p_RX7QP-{0cwq@WIBK%jl!K;OMrT?WGm&%Q;ff z5$`x@3I%-zU5C%7xc-2N5}pmfe8G(d_b9wE#Dc~HMyBBdh&OX#Is%yzKCa_XCjSGF z%H+*lb)3^e;%t5`qlkCw;yDa>Dg_~;Jm)Pp%fxm8e7SIzFFmLoUsWQq(A#erf2M^4 zWz;?R+Ci9y!r4)n5VQ1V3j5IZW%!sQ>8H9&~_Na)+e&OP1!o58w&|BuWeHHFWPTEKmMb;=08!V`v$nGrH6wNAL&?3lD8`U= z=oGD{-rOtRxo%z00JIf!HW8H8Cu^XeTneDFXlh*t8#Z9&_0Yy{?h}JfD0B&y`b|pJ z?B>2v_;nxMPsuxK5!C#muEk-?0;>lhFPhv5?{y2h2Roz&d96)+ ziNFJ*&VG%*d0;|$2L}0lB$SO8D*v~8`@6ef?f}ny<0?ePCudS}XG+e(<8!i?E1_hi zj$GA;eNb3`eeXK556;q4zpg_n9{5_U6VG^h*FnCNl5@yB#O+;oL~}>i3QE?7+O(|% z_BN7rWFK0<>GxjZEm*J=vciq8_E89GApKI@qDts;SX0WLp`__Px8A)*osB6 zDFnV1?<^?UOvx7KxMO+d&3P#^{-yl?;1~Qk+Ouo(Xw(M&IqC3ZEGMiXPgrA~uzym! zcTTyiiQt#KJcQo@ePX&h7-E)5)NHwj7~)&_T4lLoh9QnO@O_$L)0Kw9>IlR=9Plvo z5qy9rKqunZajJ=cbD)pl3cLfl6#>8IfcwoDJ&E6o_H ze`GSzW06Vpmq?}iCIa4t5(D})5~B;;DRi|v!Tq&sh`U?_KIBH|4{nM3s$1>8i{B<( zhMg8g#JSN3T?xyscOc+i4)_lQ{3KRGH^$QRIJB3)5HrN9F+{urEd!@Rp}>{#>2!0v z#JxXmh)4MG)id#kd$g#gi^LSVPE2s`5C8=Q1N0wIH}DLsdcGt|+}DLcA3>$UaZn~e zrzK+U1&M0+O8oA`&h|cNJEunyJGg&<=Q*expjY5|2c8cT&?WOZJSTyFO2ka)caz5Ju1 zCU;Y^+C2xqi(!G}XUVDVpOR=`%sS#@%sb+=VkEnuxXHb(xZ1rRzsK==vlz`(43M7| zTXcL$E8SR9PQNc{b>Ay7#K$Fw*jO5&yGvW4b-kQUpV;c&G|>>hU}HjePK-e1I*=)A zrMt_ZJHD*dJ)ztXKPX4!IZ&^DRXNm8l(*7_73H+GqSbxA!Vs@iAoA}O5ju7f(It~w z>ETJ`^!B7y_w>nzIA<~opG_wB*9f?a10I?jb6&&Eo4POXf& zXH~W(E~ylBb>%MZzgJe%BbDX!RON2&aaDWJ*;RYema4gQWt9gN>btmiR#m$XRaMhp ztLD+?Rr8@ZeF0rNrJe4cGM`?UvXEY#vWVWA((WETwc7p7)V9RkQ}?9@rtU{?Ox@r8 zV5%WbtVW?{R9kduwd-DAZHSvW;P&d6drx&+;_>Rm^lbGm?)%l%?pUgt&QI-0*Qe&w z-KhoiNNR6-FV#*b)Xb;zYxZ%ktf{77*X-clS7V5WYXIcwnwa}y%^vh-%@X>g=0G|= zy_8N(dvsoU7x&`yGP)A(&FQwpZRy2yXL=WUAzeV=hOY$FQC(R zIE=2^VLsit!vZ>W#$j~PjQMokjBnC^&X`Ld&X`B1?YNMBxZ@(aX~%E5x9?~~p4>4e zUWUqbdV9whowU^5}Y-&!@Y2(A%4o9TW7}H zKf?0@d)}DYK_AZirhD?v)%5PH!`z$e4RKpNo)g_&zuvv06(hD4o=02P)9-dYjNab0 zoKD&8V7h&`uhEOUea(Gqw`%vJ-Ky!--Mi?r-M{AkZ1-yS4*VY4y_){Kd$+rBkG8}~ zd-TxRd#rR%+S3qs?zsvIXZKv~{?My-FTw9R{4Shlh{xt3;@Nqt>9P4k?v)Fw-J9{- zx}cgKUC>3(F6g7T7ObJM_I~%2_G6Jwb=!Lxo>Ak(? z|Es>4>=_!$JemCRHOkp(L;fMh;5R~fHI0;UhW^3MZk=?v11B?VR1HhYkQkJZ?r}z3YF##zNEet6S8dip zs{WNR*ciYLtO)f|h94qq*%BiDevAZ>v{tLUC-SkK7E{UZJ9Jpg{ zI>qjmXd2JY;g6^HWp{2g{dIPiMAN&auM#P zcVKskn{H$G(O7zacHfSr4`O$7EWMK5+E{v&-Bc`n61&M*`XY9>#L_pjyCj~zhuyhu z`U!ToM$>;~cXK5DF}q`tw1~pp5=l>HcPyHoBi&ef4|bo6rVn8E?Pz+1^heSo>^>Sv zpTzFwX!?BVkEVahuK(w4vBhTl2(W;DgJ7t5Nk0U)8}8F^d*Hqb_lIze7)pm*1ot?& z+rd2+ZVTMaaQBBh26rXgO>j5BJss}paKU>?UkrC8+*{$Ug8Km65xB3zJqNB4C;AcG zNpLTQ3vFj~3EYKnSHnFRZZF)ma4&;nFV<+>_wWhkHESrEt%M+Yk2)xSQZ!3in*NC&0ZN?rCsufeQ3iUQ5AHK?Plfvm+!NtK9GAd_N>{)=3hr#UC&Qf!_dK`NU#8{)E3dhzV=9={4nQMuoVq)SdP7mE1P|+@r%sTr=F;SY2%SGM~;v&QU+S_YVFI@p`OI#EO zS$yq{kf@A{$*lV$?-O8Tdmt`~`g@M(>6faY1_rws`#&IXU~q&h(LcwN_gY-U28Mc8 zb_@(MU-O-~C|x($-`ll88+7a%g2H#seY_CGSuy-Vmb`O>Na|pItSldqlXry>MLIN7 z)Gb0x(0cAW)^+tNei=aACqx2IT|1x&e*~Ej^0*LD4nZpT{wPFAMyqdsF(mJngecBZ5Xn3j z^6pKDiCMv!X8B`6lw?IIm6GKBEda$lFX)q0pvDUP^g7s2e`bM*j|}znU_7uE81I4t zF@ZIzKE#)p;-l+sRdNeRg^^CH*EDz~=P+wDd?)NOmY-b6?Ah$`_JCTB`ITMkI%w zy!VpAzY*XJA?7xDClv>ILR?_-&M#JF2Nq8i2|pblEFaK&zbO_)D>}PVz3X6%q8m0P zn5Kt{h2X$JY5WoaPZx{iih-2UKar9Qd}w~`H>lH zgXrTYVrkU{^$x7YIE0xm z0zXc-%Oj!WtRyi7b10*0u{S~TmqJCzIGyK%iCEP&QZn2h=qHtlqD+LYlyl26m7;2j zQMsxNE4_xH#sqq%za>KaT_I3|>m+lYyvIVBbhBh-dZSEC@quDRK5|3Qc&d*8?xyk# zHrmoFLeDMFRLpSaN?x5W4<*dZDz}tpC{#THN$)8~Be5~vAs)`ylmz|knQ~FM7EwHi z{7QPITudG4!5A4FTGfdiABNcAKnm8QQ<>U1u0oUy4D#Sy*}E#m8;})z{X*W4DnuC~ zbZNY^z#ftZH{!0V5EC+S-900?m*T44S|KJPJYR)9Q6aYHC|Oqw%}>RKdPX}}^?;z2 zy#qZw>i$t73OViQ3QQ*{SYATdrb!Y{y_g`eU*`FfMA;zBb}Qm|Xl4N2G)W`}N6?qE zhWnk9L{8!UWR}VM0t(cGu;JbmlnAXF!Qsbyf0CG%8xc&083;d`EN1J3-(KA_plJ{2 zW&L@*7)q(2#sK`clc7q_pU*-Q(bJQ~l+l6C6&PWdv9X-^4U?&e_a}?Wyh%`jaw^_j zDXK;X)(i}Odmse`N_u7p55sFK#RNY^Fhu~X-&Bh7oN#}>eWFqn`H{i+`AelJ865~F z$y5;WL8T}TN3hBwlyG8|C}dsmpl&cFwTRO_myLyQ=g;2^?ny6u`0DMjufc)r zNTBYoF%r(#&nBR>gy}Q zrkCp*CNb?k|8m46>Zk(PK+q4})E2EEdL-Y1wiW*vW$SSvWM!23E+I9@bHrDPGCZVxzX1Jak z>vyK|OhJtev%&>6HqOoh)iftub+GFdCZVyVF5C)@t@UB@8`~Pf1vS++h9NiAK}aBj zMpHd*p+nw=mN2NM#@4LZrnWE|P0hQ6(P(PfH7jrHZdtKyyNB~O*X|K+h32|F!?n>| zKQ~;H%?(~wY~#EvP)+l*yv+;3h03vew$AJo)$}wAL*P zm)lyuJPf(D;UJ#3g2asnhYMi+mtk{N*th|kfhbyP8sWaSUZOxFz$dJ(1(iI+bu)dd-xUGj{^DO+<7waTaV1n-?o9K zh2raLzeBUb{<`mG;agw-y{!7JZ}>N=45x4WKKH+%y!xi2vhz2O8QkYG30jUevTD4( z^%x@y#rn2m4erE2mWJAm1{FGI;q@_YS*B(wmCbAswB@0r4RlNxuROjMgyaT-lH5R$k{bwG zasxq3ZXl@14Foy4fuJWh5Cr80=A)=CA4PTfD5}dxQC&WY>he*9Gh!}Eb@?c&%STaN zK8ot{QN)XU4(+_k=LY7Zh}Zetl=&#)l|DCRK8kp)&rO++qWXLk@p4ZWv4l`ak{GhN zu)1Dmim4XScD9)95H;C!&T*M!3%uo?bFAUON|saVl2Zi>cGF>{Zs#~Tje?xr667o> zAZNcqa+Vj7b6Ap`?qYKKAxb_{LeBR}$=PU3BPjGVKKa&pc$D#*Fim_*LC#$yNxO2JZMZM=WzqZ0RCvC$oY#=L(UrptN^@cOe5zLV>;lO+X0@rJ>Z!; z0G>Gm@XQ?n&)f;{%$a}(tzOREcunp+XwC*a6UMmyXu?R>UrgBHdc%a3uJ=q>>H5Tk zfv$}f40N4h!8X@fRtw-+t$=5>0iLxB;90u@p0yj`S-S(CwFlr?djg&{7w{|(@T_@& zXUzvZYXRWd?SN-51U!2YIoH^Gk@GWqZ*p$4_aWyldtY)Mu=gY9_xAqeJZmq8VKDmu za$dKWkn^s6AUXfAmy&a=vy7aRo#o`5=^RAPkDY_bxy1Pz;5ml?o^vSRIbR1n=No|M z90qvKHv!N27T`G@fae?zcuptaIV%7!(gk>tZorH50A6Gz;6+veUSu`kMS1}*(g%2v zHGmiC2fWByz>5q3UStsPBCr+pZe%^+MTP*+9R@rXww}&(M*+`00`S~#1D<;%;JF(B z&;1VIx!(mm_j`cn{u|)A-v>PRD8PfnIsm#jXF30Hakz4hjp9V*oE*h5$~iL%K{e;c W(c|&&CD9Y`?={gAjekuO5dRC!CFdFd literal 0 HcmV?d00001 diff --git a/openssl-wasm/lib/libssl.a b/openssl-wasm/lib/libssl.a new file mode 100644 index 0000000000000000000000000000000000000000..cb10195ff2c888b6fbd41c8ea430484e4ab91beb GIT binary patch literal 666736 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

0(uQmn*jDZWma5j|+rL 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ά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["argv"][1].replace(/\\/g,"/")}arguments_=process["argv"].slice(2);if(typeof module!=="undefined"){module["exports"]=Module}process["on"]("uncaughtException",function(ex){if(!(ex instanceof ExitStatus)){throw ex}});process["on"]("unhandledRejection",abort);quit_=function(status){process["exit"](status)};Module["inspect"]=function(){return"[Emscripten Module object]"}}else if(ENVIRONMENT_IS_SHELL){if(typeof read!="undefined"){read_=function shell_read(f){return read(f)}}readBinary=function readBinary(f){var data;if(typeof readbuffer==="function"){return new Uint8Array(readbuffer(f))}data=read(f,"binary");assert(typeof data==="object");return data};if(typeof scriptArgs!="undefined"){arguments_=scriptArgs}else if(typeof arguments!="undefined"){arguments_=arguments}if(typeof quit==="function"){quit_=function(status){quit(status)}}if(typeof print!=="undefined"){if(typeof console==="undefined")console={};console.log=print;console.warn=console.error=typeof printErr!=="undefined"?printErr:print}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!=="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.lastIndexOf("/")+1)}else{scriptDirectory=""}{read_=function(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=function(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=function(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=function(title){document.title=title}}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.warn.bind(console);for(key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var STACK_ALIGN=16;function alignMemory(size,factor){if(!factor)factor=STACK_ALIGN;return Math.ceil(size/factor)*factor}var tempRet0=0;var setTempRet0=function(value){tempRet0=value};var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var noExitRuntime=Module["noExitRuntime"]||true;if(typeof WebAssembly!=="object"){abort("no native wasm support detected")}var wasmMemory;var ABORT=false;var EXITSTATUS;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}var UTF8Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf8"):undefined;function UTF8ArrayToString(heap,idx,maxBytesToRead){var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heap[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heap.subarray&&UTF8Decoder){return UTF8Decoder.decode(heap.subarray(idx,endPtr))}else{var str="";while(idx>10,56320|ch&1023)}}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):""}function stringToUTF8Array(str,heap,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127)++len;else if(u<=2047)len+=2;else if(u<=65535)len+=3;else len+=4}return len}var UTF16Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf-16le"):undefined;function UTF16ToString(ptr,maxBytesToRead){var endPtr=ptr;var idx=endPtr>>1;var maxIdx=idx+maxBytesToRead/2;while(!(idx>=maxIdx)&&HEAPU16[idx])++idx;endPtr=idx<<1;if(endPtr-ptr>32&&UTF16Decoder){return UTF16Decoder.decode(HEAPU8.subarray(ptr,endPtr))}else{var str="";for(var i=0;!(i>=maxBytesToRead/2);++i){var codeUnit=HEAP16[ptr+i*2>>1];if(codeUnit==0)break;str+=String.fromCharCode(codeUnit)}return str}}function stringToUTF16(str,outPtr,maxBytesToWrite){if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<2)return 0;maxBytesToWrite-=2;var startPtr=outPtr;var numCharsToWrite=maxBytesToWrite>1]=codeUnit;outPtr+=2}HEAP16[outPtr>>1]=0;return outPtr-startPtr}function lengthBytesUTF16(str){return str.length*2}function UTF32ToString(ptr,maxBytesToRead){var i=0;var str="";while(!(i>=maxBytesToRead/4)){var utf32=HEAP32[ptr+i*4>>2];if(utf32==0)break;++i;if(utf32>=65536){var ch=utf32-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}else{str+=String.fromCharCode(utf32)}}return str}function stringToUTF32(str,outPtr,maxBytesToWrite){if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<4)return 0;var startPtr=outPtr;var endPtr=startPtr+maxBytesToWrite-4;for(var i=0;i=55296&&codeUnit<=57343){var trailSurrogate=str.charCodeAt(++i);codeUnit=65536+((codeUnit&1023)<<10)|trailSurrogate&1023}HEAP32[outPtr>>2]=codeUnit;outPtr+=4;if(outPtr+4>endPtr)break}HEAP32[outPtr>>2]=0;return outPtr-startPtr}function lengthBytesUTF32(str){var len=0;for(var i=0;i=55296&&codeUnit<=57343)++i;len+=4}return len}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferAndViews(buf){buffer=buf;Module["HEAP8"]=HEAP8=new Int8Array(buf);Module["HEAP16"]=HEAP16=new Int16Array(buf);Module["HEAP32"]=HEAP32=new Int32Array(buf);Module["HEAPU8"]=HEAPU8=new Uint8Array(buf);Module["HEAPU16"]=HEAPU16=new Uint16Array(buf);Module["HEAPU32"]=HEAPU32=new Uint32Array(buf);Module["HEAPF32"]=HEAPF32=new Float32Array(buf);Module["HEAPF64"]=HEAPF64=new Float64Array(buf)}var INITIAL_MEMORY=Module["INITIAL_MEMORY"]||16777216;var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;if(!Module["noFSInit"]&&!FS.init.initialized)FS.init();TTY.init();callRuntimeCallbacks(__ATINIT__)}function preMain(){FS.ignorePermissions=false;callRuntimeCallbacks(__ATMAIN__)}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["preloadedImages"]={};Module["preloadedAudios"]={};function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}what+="";err(what);ABORT=true;EXITSTATUS=1;what="abort("+what+"). Build with -s ASSERTIONS=1 for more info.";var e=new WebAssembly.RuntimeError(what);throw e}function hasPrefix(str,prefix){return String.prototype.startsWith?str.startsWith(prefix):str.indexOf(prefix)===0}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return hasPrefix(filename,dataURIPrefix)}var fileURIPrefix="file://";function isFileURI(filename){return hasPrefix(filename,fileURIPrefix)}var wasmBinaryFile="wdecryptor.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(file){try{if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}else{throw"both async and sync fetching of the wasm failed"}}catch(err){abort(err)}}function getBinaryPromise(){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch==="function"&&!isFileURI(wasmBinaryFile)){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()}).catch(function(){return getBinary(wasmBinaryFile)})}else{if(readAsync){return new Promise(function(resolve,reject){readAsync(wasmBinaryFile,function(response){resolve(new Uint8Array(response))},reject)})}}}return Promise.resolve().then(function(){return getBinary(wasmBinaryFile)})}function createWasm(){var info={"a":asmLibraryArg};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;wasmMemory=Module["asm"]["u"];updateGlobalBufferAndViews(wasmMemory.buffer);wasmTable=Module["asm"]["w"];addOnInit(Module["asm"]["v"]);removeRunDependency("wasm-instantiate")}addRunDependency("wasm-instantiate");function receiveInstantiatedSource(output){receiveInstance(output["instance"])}function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){var result=WebAssembly.instantiate(binary,info);return result}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)})}function instantiateAsync(){if(!wasmBinary&&typeof WebAssembly.instantiateStreaming==="function"&&!isDataURI(wasmBinaryFile)&&!isFileURI(wasmBinaryFile)&&typeof fetch==="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,info);return result.then(receiveInstantiatedSource,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(receiveInstantiatedSource)})})}else{return instantiateArrayBuffer(receiveInstantiatedSource)}}if(Module["instantiateWasm"]){try{var exports=Module["instantiateWasm"](info,receiveInstance);return exports}catch(e){err("Module.instantiateWasm callback failed with error: "+e);return false}}instantiateAsync();return{}}var tempDouble;var tempI64;function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback=="function"){callback(Module);continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){wasmTable.get(func)()}else{wasmTable.get(func)(callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}function setErrNo(value){HEAP32[___errno_location()>>2]=value;return value}var PATH={splitPath:function(filename){var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:function(parts,allowAboveRoot){var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts},normalize:function(path){var isAbsolute=path.charAt(0)==="/",trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter(function(p){return!!p}),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path},dirname:function(path){var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir},basename:function(path){if(path==="/")return"/";path=PATH.normalize(path);path=path.replace(/\/$/,"");var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)},extname:function(path){return PATH.splitPath(path)[3]},join:function(){var paths=Array.prototype.slice.call(arguments,0);return PATH.normalize(paths.join("/"))},join2:function(l,r){return PATH.normalize(l+"/"+r)}};function getRandomDevice(){if(typeof crypto==="object"&&typeof crypto["getRandomValues"]==="function"){var randomBuffer=new Uint8Array(1);return function(){crypto.getRandomValues(randomBuffer);return randomBuffer[0]}}else if(ENVIRONMENT_IS_NODE){try{var crypto_module=require("crypto");return function(){return crypto_module["randomBytes"](1)[0]}}catch(e){}}return function(){abort("randomDevice")}}var PATH_FS={resolve:function(){var resolvedPath="",resolvedAbsolute=false;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?arguments[i]:FS.cwd();if(typeof path!=="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=path.charAt(0)==="/"}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter(function(p){return!!p}),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."},relative:function(from,to){from=PATH_FS.resolve(from).substr(1);to=PATH_FS.resolve(to).substr(1);function trim(arr){var start=0;for(;start=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i0){result=buf.slice(0,bytesRead).toString("utf-8")}else{result=null}}else if(typeof window!="undefined"&&typeof window.prompt=="function"){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else if(typeof readline=="function"){result=readline();if(result!==null){result+="\n"}}if(!result){return null}tty.input=intArrayFromString(result,true)}return tty.input.shift()},put_char:function(tty,val){if(val===null||val===10){out(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},flush:function(tty){if(tty.output&&tty.output.length>0){out(UTF8ArrayToString(tty.output,0));tty.output=[]}}},default_tty1_ops:{put_char:function(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},flush:function(tty){if(tty.output&&tty.output.length>0){err(UTF8ArrayToString(tty.output,0));tty.output=[]}}}};function mmapAlloc(size){var alignedSize=alignMemory(size,16384);var ptr=_malloc(alignedSize);while(size=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity>>0);if(prevCapacity!=0)newCapacity=Math.max(newCapacity,256);var oldContents=node.contents;node.contents=new Uint8Array(newCapacity);if(node.usedBytes>0)node.contents.set(oldContents.subarray(0,node.usedBytes),0)},resizeFileStorage:function(node,newSize){if(node.usedBytes==newSize)return;if(newSize==0){node.contents=null;node.usedBytes=0}else{var oldContents=node.contents;node.contents=new Uint8Array(newSize);if(oldContents){node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)))}node.usedBytes=newSize}},node_ops:{getattr:function(node){var attr={};attr.dev=FS.isChrdev(node.mode)?node.id:1;attr.ino=node.id;attr.mode=node.mode;attr.nlink=1;attr.uid=0;attr.gid=0;attr.rdev=node.rdev;if(FS.isDir(node.mode)){attr.size=4096}else if(FS.isFile(node.mode)){attr.size=node.usedBytes}else if(FS.isLink(node.mode)){attr.size=node.link.length}else{attr.size=0}attr.atime=new Date(node.timestamp);attr.mtime=new Date(node.timestamp);attr.ctime=new Date(node.timestamp);attr.blksize=4096;attr.blocks=Math.ceil(attr.size/attr.blksize);return attr},setattr:function(node,attr){if(attr.mode!==undefined){node.mode=attr.mode}if(attr.timestamp!==undefined){node.timestamp=attr.timestamp}if(attr.size!==undefined){MEMFS.resizeFileStorage(node,attr.size)}},lookup:function(parent,name){throw FS.genericErrors[44]},mknod:function(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)},rename:function(old_node,new_dir,new_name){if(FS.isDir(old_node.mode)){var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(new_node){for(var i in new_node.contents){throw new FS.ErrnoError(55)}}}delete old_node.parent.contents[old_node.name];old_node.parent.timestamp=Date.now();old_node.name=new_name;new_dir.contents[new_name]=old_node;new_dir.timestamp=old_node.parent.timestamp;old_node.parent=new_dir},unlink:function(parent,name){delete parent.contents[name];parent.timestamp=Date.now()},rmdir:function(parent,name){var node=FS.lookupNode(parent,name);for(var i in node.contents){throw new FS.ErrnoError(55)}delete parent.contents[name];parent.timestamp=Date.now()},readdir:function(node){var entries=[".",".."];for(var key in node.contents){if(!node.contents.hasOwnProperty(key)){continue}entries.push(key)}return entries},symlink:function(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return node},readlink:function(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(28)}return node.link}},stream_ops:{read:function(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i0||position+length8){throw new FS.ErrnoError(32)}var parts=PATH.normalizeArray(path.split("/").filter(function(p){return!!p}),false);var current=FS.root;var current_path="/";for(var i=0;i40){throw new FS.ErrnoError(32)}}}}return{path:current_path,node:current}},getPath:function(node){var path;while(true){if(FS.isRoot(node)){var mount=node.mount.mountpoint;if(!path)return mount;return mount[mount.length-1]!=="/"?mount+"/"+path:mount+path}path=path?node.name+"/"+path:node.name;node=node.parent}},hashName:function(parentid,name){var hash=0;for(var i=0;i>>0)%FS.nameTable.length},hashAddNode:function(node){var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node},hashRemoveNode:function(node){var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}},lookupNode:function(parent,name){var errCode=FS.mayLookup(parent);if(errCode){throw new FS.ErrnoError(errCode,parent)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)},createNode:function(parent,name,mode,rdev){var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node},destroyNode:function(node){FS.hashRemoveNode(node)},isRoot:function(node){return node===node.parent},isMountpoint:function(node){return!!node.mounted},isFile:function(mode){return(mode&61440)===32768},isDir:function(mode){return(mode&61440)===16384},isLink:function(mode){return(mode&61440)===40960},isChrdev:function(mode){return(mode&61440)===8192},isBlkdev:function(mode){return(mode&61440)===24576},isFIFO:function(mode){return(mode&61440)===4096},isSocket:function(mode){return(mode&49152)===49152},flagModes:{"r":0,"r+":2,"w":577,"w+":578,"a":1089,"a+":1090},modeStringToFlags:function(str){var flags=FS.flagModes[str];if(typeof flags==="undefined"){throw new Error("Unknown file open mode: "+str)}return flags},flagsToPermissionString:function(flag){var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms},nodePermissions:function(node,perms){if(FS.ignorePermissions){return 0}if(perms.indexOf("r")!==-1&&!(node.mode&292)){return 2}else if(perms.indexOf("w")!==-1&&!(node.mode&146)){return 2}else if(perms.indexOf("x")!==-1&&!(node.mode&73)){return 2}return 0},mayLookup:function(dir){var errCode=FS.nodePermissions(dir,"x");if(errCode)return errCode;if(!dir.node_ops.lookup)return 2;return 0},mayCreate:function(dir,name){try{var node=FS.lookupNode(dir,name);return 20}catch(e){}return FS.nodePermissions(dir,"wx")},mayDelete:function(dir,name,isdir){var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var errCode=FS.nodePermissions(dir,"wx");if(errCode){return errCode}if(isdir){if(!FS.isDir(node.mode)){return 54}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return 10}}else{if(FS.isDir(node.mode)){return 31}}return 0},mayOpen:function(node,flags){if(!node){return 44}if(FS.isLink(node.mode)){return 32}else if(FS.isDir(node.mode)){if(FS.flagsToPermissionString(flags)!=="r"||flags&512){return 31}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))},MAX_OPEN_FDS:4096,nextfd:function(fd_start,fd_end){fd_start=fd_start||0;fd_end=fd_end||FS.MAX_OPEN_FDS;for(var fd=fd_start;fd<=fd_end;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(33)},getStream:function(fd){return FS.streams[fd]},createStream:function(stream,fd_start,fd_end){if(!FS.FSStream){FS.FSStream=function(){};FS.FSStream.prototype={object:{get:function(){return this.node},set:function(val){this.node=val}},isRead:{get:function(){return(this.flags&2097155)!==1}},isWrite:{get:function(){return(this.flags&2097155)!==0}},isAppend:{get:function(){return this.flags&1024}}}}var newStream=new FS.FSStream;for(var p in stream){newStream[p]=stream[p]}stream=newStream;var fd=FS.nextfd(fd_start,fd_end);stream.fd=fd;FS.streams[fd]=stream;return stream},closeStream:function(fd){FS.streams[fd]=null},chrdev_stream_ops:{open:function(stream){var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;if(stream.stream_ops.open){stream.stream_ops.open(stream)}},llseek:function(){throw new FS.ErrnoError(70)}},major:function(dev){return dev>>8},minor:function(dev){return dev&255},makedev:function(ma,mi){return ma<<8|mi},registerDevice:function(dev,ops){FS.devices[dev]={stream_ops:ops}},getDevice:function(dev){return FS.devices[dev]},getMounts:function(mount){var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push.apply(check,m.mounts)}return mounts},syncfs:function(populate,callback){if(typeof populate==="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){err("warning: "+FS.syncFSRequests+" FS.syncfs operations in flight at once, probably just doing extra work")}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(errCode){FS.syncFSRequests--;return callback(errCode)}function done(errCode){if(errCode){if(!done.errored){done.errored=true;return doCallback(errCode)}return}if(++completed>=mounts.length){doCallback(null)}}mounts.forEach(function(mount){if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)})},mount:function(type,opts,mountpoint){var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(10)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}}var mount={type:type,opts:opts,mountpoint:mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot},unmount:function(mountpoint){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(28)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach(function(hash){var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.indexOf(current.mount)!==-1){FS.destroyNode(current)}current=next}});node.mounted=null;var idx=node.mount.mounts.indexOf(mount);node.mount.mounts.splice(idx,1)},lookup:function(parent,name){return parent.node_ops.lookup(parent,name)},mknod:function(path,mode,dev){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name||name==="."||name===".."){throw new FS.ErrnoError(28)}var errCode=FS.mayCreate(parent,name);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(63)}return parent.node_ops.mknod(parent,name,mode,dev)},create:function(path,mode){mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;return FS.mknod(path,mode,0)},mkdir:function(path,mode){mode=mode!==undefined?mode:511;mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)},mkdirTree:function(path,mode){var dirs=path.split("/");var d="";for(var i=0;ithis.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]};LazyUint8Array.prototype.setDataGetter=function LazyUint8Array_setDataGetter(getter){this.getter=getter};LazyUint8Array.prototype.cacheLength=function LazyUint8Array_cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=function(from,to){if(from>to)throw new Error("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)throw new Error("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);if(typeof Uint8Array!="undefined")xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}else{return intArrayFromString(xhr.responseText||"",true)}};var lazyArray=this;lazyArray.setDataGetter(function(chunkNum){var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]==="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]==="undefined")throw new Error("doXHR failed!");return lazyArray.chunks[chunkNum]});if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;out("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true};if(typeof XMLHttpRequest!=="undefined"){if(!ENVIRONMENT_IS_WORKER)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var lazyArray=new LazyUint8Array;Object.defineProperties(lazyArray,{length:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._length}},chunkSize:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize}}});var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url:url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:function(){return this.contents.length}}});var stream_ops={};var keys=Object.keys(node.stream_ops);keys.forEach(function(key){var fn=node.stream_ops[key];stream_ops[key]=function forceLoadLazyFile(){FS.forceLoadFile(node);return fn.apply(null,arguments)}});stream_ops.read=function stream_ops_read(stream,buffer,offset,length,position){FS.forceLoadFile(node);var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);if(contents.slice){for(var i=0;i>2]=stat.dev;HEAP32[buf+4>>2]=0;HEAP32[buf+8>>2]=stat.ino;HEAP32[buf+12>>2]=stat.mode;HEAP32[buf+16>>2]=stat.nlink;HEAP32[buf+20>>2]=stat.uid;HEAP32[buf+24>>2]=stat.gid;HEAP32[buf+28>>2]=stat.rdev;HEAP32[buf+32>>2]=0;tempI64=[stat.size>>>0,(tempDouble=stat.size,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+40>>2]=tempI64[0],HEAP32[buf+44>>2]=tempI64[1];HEAP32[buf+48>>2]=4096;HEAP32[buf+52>>2]=stat.blocks;HEAP32[buf+56>>2]=stat.atime.getTime()/1e3|0;HEAP32[buf+60>>2]=0;HEAP32[buf+64>>2]=stat.mtime.getTime()/1e3|0;HEAP32[buf+68>>2]=0;HEAP32[buf+72>>2]=stat.ctime.getTime()/1e3|0;HEAP32[buf+76>>2]=0;tempI64=[stat.ino>>>0,(tempDouble=stat.ino,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+80>>2]=tempI64[0],HEAP32[buf+84>>2]=tempI64[1];return 0},doMsync:function(addr,stream,len,flags,offset){var buffer=HEAPU8.slice(addr,addr+len);FS.msync(stream,buffer,offset,len,flags)},doMkdir:function(path,mode){path=PATH.normalize(path);if(path[path.length-1]==="/")path=path.substr(0,path.length-1);FS.mkdir(path,mode,0);return 0},doMknod:function(path,mode,dev){switch(mode&61440){case 32768:case 8192:case 24576:case 4096:case 49152:break;default:return-28}FS.mknod(path,mode,dev);return 0},doReadlink:function(path,buf,bufsize){if(bufsize<=0)return-28;var ret=FS.readlink(path);var len=Math.min(bufsize,lengthBytesUTF8(ret));var endChar=HEAP8[buf+len];stringToUTF8(ret,buf,bufsize+1);HEAP8[buf+len]=endChar;return len},doAccess:function(path,amode){if(amode&~7){return-28}var node;var lookup=FS.lookupPath(path,{follow:true});node=lookup.node;if(!node){return-44}var perms="";if(amode&4)perms+="r";if(amode&2)perms+="w";if(amode&1)perms+="x";if(perms&&FS.nodePermissions(node,perms)){return-2}return 0},doDup:function(path,flags,suggestFD){var suggest=FS.getStream(suggestFD);if(suggest)FS.close(suggest);return FS.open(path,flags,0,suggestFD,suggestFD).fd},doReadv:function(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i>2];var len=HEAP32[iov+(i*8+4)>>2];var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>2];var len=HEAP32[iov+(i*8+4)>>2];var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr}return ret},varargs:undefined,get:function(){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret},getStr:function(ptr){var ret=UTF8ToString(ptr);return ret},getStreamFromFD:function(fd){var stream=FS.getStream(fd);if(!stream)throw new FS.ErrnoError(8);return stream},get64:function(low,high){return low}};function ___sys_fcntl64(fd,cmd,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(cmd){case 0:{var arg=SYSCALLS.get();if(arg<0){return-28}var newStream;newStream=FS.open(stream.path,stream.flags,0,arg);return newStream.fd}case 1:case 2:return 0;case 3:return stream.flags;case 4:{var arg=SYSCALLS.get();stream.flags|=arg;return 0}case 12:{var arg=SYSCALLS.get();var offset=0;HEAP16[arg+offset>>1]=2;return 0}case 13:case 14:return 0;case 16:case 8:return-28;case 9:setErrNo(28);return-1;default:{return-28}}}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_ioctl(fd,op,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(op){case 21509:case 21505:{if(!stream.tty)return-59;return 0}case 21510:case 21511:case 21512:case 21506:case 21507:case 21508:{if(!stream.tty)return-59;return 0}case 21519:{if(!stream.tty)return-59;var argp=SYSCALLS.get();HEAP32[argp>>2]=0;return 0}case 21520:{if(!stream.tty)return-59;return-28}case 21531:{var argp=SYSCALLS.get();return FS.ioctl(stream,op,argp)}case 21523:{if(!stream.tty)return-59;return 0}case 21524:{if(!stream.tty)return-59;return 0}default:abort("bad ioctl syscall "+op)}}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_open(path,flags,varargs){SYSCALLS.varargs=varargs;try{var pathname=SYSCALLS.getStr(path);var mode=varargs?SYSCALLS.get():0;var stream=FS.open(pathname,flags,mode);return stream.fd}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function getShiftFromSize(size){switch(size){case 1:return 0;case 2:return 1;case 4:return 2;case 8:return 3;default:throw new TypeError("Unknown type size: "+size)}}function embind_init_charCodes(){var codes=new Array(256);for(var i=0;i<256;++i){codes[i]=String.fromCharCode(i)}embind_charCodes=codes}var embind_charCodes=undefined;function readLatin1String(ptr){var ret="";var c=ptr;while(HEAPU8[c]){ret+=embind_charCodes[HEAPU8[c++]]}return ret}var awaitingDependencies={};var registeredTypes={};var typeDependencies={};var char_0=48;var char_9=57;function makeLegalFunctionName(name){if(undefined===name){return"_unknown"}name=name.replace(/[^a-zA-Z0-9_]/g,"$");var f=name.charCodeAt(0);if(f>=char_0&&f<=char_9){return"_"+name}else{return name}}function createNamedFunction(name,body){name=makeLegalFunctionName(name);return new Function("body","return function "+name+"() {\n"+' "use strict";'+" return body.apply(this, arguments);\n"+"};\n")(body)}function extendError(baseErrorType,errorName){var errorClass=createNamedFunction(errorName,function(message){this.name=errorName;this.message=message;var stack=new Error(message).stack;if(stack!==undefined){this.stack=this.toString()+"\n"+stack.replace(/^Error(:[^\n]*)?\n/,"")}});errorClass.prototype=Object.create(baseErrorType.prototype);errorClass.prototype.constructor=errorClass;errorClass.prototype.toString=function(){if(this.message===undefined){return this.name}else{return this.name+": "+this.message}};return errorClass}var BindingError=undefined;function throwBindingError(message){throw new BindingError(message)}var InternalError=undefined;function throwInternalError(message){throw new InternalError(message)}function whenDependentTypesAreResolved(myTypes,dependentTypes,getTypeConverters){myTypes.forEach(function(type){typeDependencies[type]=dependentTypes});function onComplete(typeConverters){var myTypeConverters=getTypeConverters(typeConverters);if(myTypeConverters.length!==myTypes.length){throwInternalError("Mismatched type converter count")}for(var i=0;i>shift])},destructorFunction:null})}var emval_free_list=[];var emval_handle_array=[{},{value:undefined},{value:null},{value:true},{value:false}];function __emval_decref(handle){if(handle>4&&0===--emval_handle_array[handle].refcount){emval_handle_array[handle]=undefined;emval_free_list.push(handle)}}function count_emval_handles(){var count=0;for(var i=5;i>2])}function __embind_register_emval(rawType,name){name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":function(handle){var rv=emval_handle_array[handle].value;__emval_decref(handle);return rv},"toWireType":function(destructors,value){return __emval_register(value)},"argPackAdvance":8,"readValueFromPointer":simpleReadValueFromPointer,destructorFunction:null})}function _embind_repr(v){if(v===null){return"null"}var t=typeof v;if(t==="object"||t==="array"||t==="function"){return v.toString()}else{return""+v}}function floatReadValueFromPointer(name,shift){switch(shift){case 2:return function(pointer){return this["fromWireType"](HEAPF32[pointer>>2])};case 3:return function(pointer){return this["fromWireType"](HEAPF64[pointer>>3])};default:throw new TypeError("Unknown float type: "+name)}}function __embind_register_float(rawType,name,size){var shift=getShiftFromSize(size);name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":function(value){return value},"toWireType":function(destructors,value){if(typeof value!=="number"&&typeof value!=="boolean"){throw new TypeError('Cannot convert "'+_embind_repr(value)+'" to '+this.name)}return value},"argPackAdvance":8,"readValueFromPointer":floatReadValueFromPointer(name,shift),destructorFunction:null})}function new_(constructor,argumentList){if(!(constructor instanceof Function)){throw new TypeError("new_ called with constructor type "+typeof constructor+" which is not a function")}var dummy=createNamedFunction(constructor.name||"unknownFunctionName",function(){});dummy.prototype=constructor.prototype;var obj=new dummy;var r=constructor.apply(obj,argumentList);return r instanceof Object?r:obj}function runDestructors(destructors){while(destructors.length){var ptr=destructors.pop();var del=destructors.pop();del(ptr)}}function craftInvokerFunction(humanName,argTypes,classType,cppInvokerFunc,cppTargetFunc){var argCount=argTypes.length;if(argCount<2){throwBindingError("argTypes array size mismatch! Must at least get return value and 'this' types!")}var isClassMethodFunc=argTypes[1]!==null&&classType!==null;var needsDestructorStack=false;for(var i=1;i0?", ":"")+argsListWired}invokerFnBody+=(returns?"var rv = ":"")+"invoker(fn"+(argsListWired.length>0?", ":"")+argsListWired+");\n";if(needsDestructorStack){invokerFnBody+="runDestructors(destructors);\n"}else{for(var i=isClassMethodFunc?1:2;i>2)+i])}return array}function replacePublicSymbol(name,value,numArguments){if(!Module.hasOwnProperty(name)){throwInternalError("Replacing nonexistant public symbol")}if(undefined!==Module[name].overloadTable&&undefined!==numArguments){Module[name].overloadTable[numArguments]=value}else{Module[name]=value;Module[name].argCount=numArguments}}function dynCallLegacy(sig,ptr,args){var f=Module["dynCall_"+sig];return args&&args.length?f.apply(null,[ptr].concat(args)):f.call(null,ptr)}function dynCall(sig,ptr,args){if(sig.indexOf("j")!=-1){return dynCallLegacy(sig,ptr,args)}return wasmTable.get(ptr).apply(null,args)}function getDynCaller(sig,ptr){var argCache=[];return function(){argCache.length=arguments.length;for(var i=0;i>1]}:function readU16FromPointer(pointer){return HEAPU16[pointer>>1]};case 2:return signed?function readS32FromPointer(pointer){return HEAP32[pointer>>2]}:function readU32FromPointer(pointer){return HEAPU32[pointer>>2]};default:throw new TypeError("Unknown integer type: "+name)}}function __embind_register_integer(primitiveType,name,size,minRange,maxRange){name=readLatin1String(name);if(maxRange===-1){maxRange=4294967295}var shift=getShiftFromSize(size);var fromWireType=function(value){return value};if(minRange===0){var bitshift=32-8*size;fromWireType=function(value){return value<>>bitshift}}var isUnsignedType=name.indexOf("unsigned")!=-1;registerType(primitiveType,{name:name,"fromWireType":fromWireType,"toWireType":function(destructors,value){if(typeof value!=="number"&&typeof value!=="boolean"){throw new TypeError('Cannot convert "'+_embind_repr(value)+'" to '+this.name)}if(valuemaxRange){throw new TypeError('Passing a number "'+_embind_repr(value)+'" from JS side to C/C++ side to an argument of type "'+name+'", which is outside the valid range ['+minRange+", "+maxRange+"]!")}return isUnsignedType?value>>>0:value|0},"argPackAdvance":8,"readValueFromPointer":integerReadValueFromPointer(name,shift,minRange!==0),destructorFunction:null})}function __embind_register_memory_view(rawType,dataTypeIndex,name){var typeMapping=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array];var TA=typeMapping[dataTypeIndex];function decodeMemoryView(handle){handle=handle>>2;var heap=HEAPU32;var size=heap[handle];var data=heap[handle+1];return new TA(buffer,data,size)}name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":decodeMemoryView,"argPackAdvance":8,"readValueFromPointer":decodeMemoryView},{ignoreDuplicateRegistrations:true})}function __embind_register_std_string(rawType,name){name=readLatin1String(name);var stdStringIsUTF8=name==="std::string";registerType(rawType,{name:name,"fromWireType":function(value){var length=HEAPU32[value>>2];var str;if(stdStringIsUTF8){var decodeStartPtr=value+4;for(var i=0;i<=length;++i){var currentBytePtr=value+4+i;if(i==length||HEAPU8[currentBytePtr]==0){var maxRead=currentBytePtr-decodeStartPtr;var stringSegment=UTF8ToString(decodeStartPtr,maxRead);if(str===undefined){str=stringSegment}else{str+=String.fromCharCode(0);str+=stringSegment}decodeStartPtr=currentBytePtr+1}}}else{var a=new Array(length);for(var i=0;i>2]=length;if(stdStringIsUTF8&&valueIsOfTypeString){stringToUTF8(value,ptr+4,length+1)}else{if(valueIsOfTypeString){for(var i=0;i255){_free(ptr);throwBindingError("String has UTF-16 code units that do not fit in 8 bits")}HEAPU8[ptr+4+i]=charCode}}else{for(var i=0;i>2];var HEAP=getHeap();var str;var decodeStartPtr=value+4;for(var i=0;i<=length;++i){var currentBytePtr=value+4+i*charSize;if(i==length||HEAP[currentBytePtr>>shift]==0){var maxReadBytes=currentBytePtr-decodeStartPtr;var stringSegment=decodeString(decodeStartPtr,maxReadBytes);if(str===undefined){str=stringSegment}else{str+=String.fromCharCode(0);str+=stringSegment}decodeStartPtr=currentBytePtr+charSize}}_free(value);return str},"toWireType":function(destructors,value){if(!(typeof value==="string")){throwBindingError("Cannot pass non-string to C++ string type "+name)}var length=lengthBytesUTF(value);var ptr=_malloc(4+length+charSize);HEAPU32[ptr>>2]=length>>shift;encodeString(value,ptr+4,length+charSize);if(destructors!==null){destructors.push(_free,ptr)}return ptr},"argPackAdvance":8,"readValueFromPointer":simpleReadValueFromPointer,destructorFunction:function(ptr){_free(ptr)}})}function __embind_register_void(rawType,name){name=readLatin1String(name);registerType(rawType,{isVoid:true,name:name,"argPackAdvance":0,"fromWireType":function(){return undefined},"toWireType":function(destructors,o){return undefined}})}function _abort(){abort()}function _emscripten_memcpy_big(dest,src,num){HEAPU8.copyWithin(dest,src,src+num)}function abortOnCannotGrowMemory(requestedSize){abort("OOM")}function _emscripten_resize_heap(requestedSize){var oldSize=HEAPU8.length;abortOnCannotGrowMemory(requestedSize)}function _fd_close(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);FS.close(stream);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return e.errno}}function _fd_read(fd,iov,iovcnt,pnum){try{var stream=SYSCALLS.getStreamFromFD(fd);var num=SYSCALLS.doReadv(stream,iov,iovcnt);HEAP32[pnum>>2]=num;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return e.errno}}function _fd_seek(fd,offset_low,offset_high,whence,newOffset){try{var stream=SYSCALLS.getStreamFromFD(fd);var HIGH_OFFSET=4294967296;var offset=offset_high*HIGH_OFFSET+(offset_low>>>0);var DOUBLE_LIMIT=9007199254740992;if(offset<=-DOUBLE_LIMIT||offset>=DOUBLE_LIMIT){return-61}FS.llseek(stream,offset,whence);tempI64=[stream.position>>>0,(tempDouble=stream.position,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[newOffset>>2]=tempI64[0],HEAP32[newOffset+4>>2]=tempI64[1];if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return e.errno}}function _fd_write(fd,iov,iovcnt,pnum){try{var stream=SYSCALLS.getStreamFromFD(fd);var num=SYSCALLS.doWritev(stream,iov,iovcnt);HEAP32[pnum>>2]=num;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return e.errno}}function _setTempRet0($i){setTempRet0($i|0)}var FSNode=function(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.mounted=null;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.node_ops={};this.stream_ops={};this.rdev=rdev};var readMode=292|73;var writeMode=146;Object.defineProperties(FSNode.prototype,{read:{get:function(){return(this.mode&readMode)===readMode},set:function(val){val?this.mode|=readMode:this.mode&=~readMode}},write:{get:function(){return(this.mode&writeMode)===writeMode},set:function(val){val?this.mode|=writeMode:this.mode&=~writeMode}},isFolder:{get:function(){return FS.isDir(this.mode)}},isDevice:{get:function(){return FS.isChrdev(this.mode)}}});FS.FSNode=FSNode;FS.staticInit();embind_init_charCodes();BindingError=Module["BindingError"]=extendError(Error,"BindingError");InternalError=Module["InternalError"]=extendError(Error,"InternalError");init_emval();UnboundTypeError=Module["UnboundTypeError"]=extendError(Error,"UnboundTypeError");function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}var asmLibraryArg={"i":___sys_fcntl64,"s":___sys_ioctl,"j":___sys_open,"l":__embind_register_bool,"k":__embind_register_emval,"e":__embind_register_float,"d":__embind_register_function,"b":__embind_register_integer,"a":__embind_register_memory_view,"f":__embind_register_std_string,"c":__embind_register_std_wstring,"t":__embind_register_void,"q":_abort,"o":_emscripten_memcpy_big,"p":_emscripten_resize_heap,"h":_fd_close,"r":_fd_read,"m":_fd_seek,"g":_fd_write,"n":_setTempRet0};var asm=createWasm();var ___wasm_call_ctors=Module["___wasm_call_ctors"]=function(){return(___wasm_call_ctors=Module["___wasm_call_ctors"]=Module["asm"]["v"]).apply(null,arguments)};var _malloc=Module["_malloc"]=function(){return(_malloc=Module["_malloc"]=Module["asm"]["x"]).apply(null,arguments)};var ___getTypeName=Module["___getTypeName"]=function(){return(___getTypeName=Module["___getTypeName"]=Module["asm"]["y"]).apply(null,arguments)};var ___embind_register_native_and_builtin_types=Module["___embind_register_native_and_builtin_types"]=function(){return(___embind_register_native_and_builtin_types=Module["___embind_register_native_and_builtin_types"]=Module["asm"]["z"]).apply(null,arguments)};var ___errno_location=Module["___errno_location"]=function(){return(___errno_location=Module["___errno_location"]=Module["asm"]["A"]).apply(null,arguments)};var _free=Module["_free"]=function(){return(_free=Module["_free"]=Module["asm"]["B"]).apply(null,arguments)};var dynCall_jiji=Module["dynCall_jiji"]=function(){return(dynCall_jiji=Module["dynCall_jiji"]=Module["asm"]["C"]).apply(null,arguments)};var calledRun;function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(args){args=args||arguments_;if(runDependencies>0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();preMain();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}Module["run"]=run;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}run(); diff --git a/wdecryptor.wasm b/wdecryptor.wasm new file mode 100755 index 0000000000000000000000000000000000000000..961984884b8ba9cd32861df1ea8417d6992e9de1 GIT binary patch literal 35944 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 literal 0 HcmV?d00001 -- 2.25.1 From 8a8e7a8233c0415330e316522b42a7c46cce570d Mon Sep 17 00:00:00 2001 From: sagudev Date: Fri, 9 Apr 2021 08:11:09 +0200 Subject: [PATCH 2/2] import/export --- decryptor.js | 27 +- package.json | 2 +- wdecryptor.js | 5307 ++++++++++++++++++++++++++++++++++++++++++++++- wdecryptor.wasm | Bin 35944 -> 45947 bytes 4 files changed, 5333 insertions(+), 3 deletions(-) diff --git a/decryptor.js b/decryptor.js index d314c2e..a8914df 100644 --- a/decryptor.js +++ b/decryptor.js @@ -11,4 +11,29 @@ exports.decryptFile = (key, inputFilename, outputFilename) => { exports.decryptBuffer = (key, data) => { return decryptor.decryptBuffer(key, data); -} \ No newline at end of file +} + +var dec = require("./wdecryptor.js"); + +dec().then((instance) => { + console.log("set"); + exports.wasm_getKey = (trackId) => { + return instance.getKey(trackId); + } + + exports.wasm_decryptFile = (key, inputFilename, outputFilename) => { + instance.decryptFile(key, inputFilename, outputFilename); + return; + } + + exports.wasm_decryptBuffer = (key, data) => { + return instance.decryptBuffer(key, data); + } + console.log("test") + id = "73078403"; + console.log(decryptor.getKey(id)) + console.log(instance.getKey(id)) +}); + + +console.log("out") \ No newline at end of file diff --git a/package.json b/package.json index 10a54ed..52f5f6a 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "main": "decryptor.js", "scripts": { "build": "node-gyp rebuild", - "build:wasm" : "docker run -it --rm -v $(pwd):/src -u $(id -u):$(id -g) emscripten/emsdk emcc -lssl -lcrypto -L ./openssl-wasm/lib/ -I ./openssl-wasm/include -O3 -s WASM=1 --bind -o wdecryptor.js ./native/wdecryptor.cc" + "build:wasm": "docker run -it --rm -v $(pwd):/src -u $(id -u):$(id -g) emscripten/emsdk emcc -lssl -lcrypto -L ./openssl-wasm/lib/ -I ./openssl-wasm/include -s MODULARIZE -O1 -s WASM=1 --bind -o wdecryptor.js ./native/wdecryptor.cc" }, "author": "", "dependencies": { diff --git a/wdecryptor.js b/wdecryptor.js index 523fa60..8e9632b 100644 --- a/wdecryptor.js +++ b/wdecryptor.js @@ -1 +1,5306 @@ -var Module=typeof Module!=="undefined"?Module:{};var moduleOverrides={};var key;for(key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}var arguments_=[];var thisProgram="./this.program";var quit_=function(status,toThrow){throw toThrow};var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;ENVIRONMENT_IS_WEB=typeof window==="object";ENVIRONMENT_IS_WORKER=typeof importScripts==="function";ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof process.versions==="object"&&typeof process.versions.node==="string";ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary,setWindowTitle;var nodeFS;var nodePath;if(ENVIRONMENT_IS_NODE){if(ENVIRONMENT_IS_WORKER){scriptDirectory=require("path").dirname(scriptDirectory)+"/"}else{scriptDirectory=__dirname+"/"}read_=function shell_read(filename,binary){if(!nodeFS)nodeFS=require("fs");if(!nodePath)nodePath=require("path");filename=nodePath["normalize"](filename);return nodeFS["readFileSync"](filename,binary?null:"utf8")};readBinary=function readBinary(filename){var ret=read_(filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};if(process["argv"].length>1){thisProgram=process["argv"][1].replace(/\\/g,"/")}arguments_=process["argv"].slice(2);if(typeof module!=="undefined"){module["exports"]=Module}process["on"]("uncaughtException",function(ex){if(!(ex instanceof ExitStatus)){throw ex}});process["on"]("unhandledRejection",abort);quit_=function(status){process["exit"](status)};Module["inspect"]=function(){return"[Emscripten Module object]"}}else if(ENVIRONMENT_IS_SHELL){if(typeof read!="undefined"){read_=function shell_read(f){return read(f)}}readBinary=function readBinary(f){var data;if(typeof readbuffer==="function"){return new Uint8Array(readbuffer(f))}data=read(f,"binary");assert(typeof data==="object");return data};if(typeof scriptArgs!="undefined"){arguments_=scriptArgs}else if(typeof arguments!="undefined"){arguments_=arguments}if(typeof quit==="function"){quit_=function(status){quit(status)}}if(typeof print!=="undefined"){if(typeof console==="undefined")console={};console.log=print;console.warn=console.error=typeof printErr!=="undefined"?printErr:print}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!=="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.lastIndexOf("/")+1)}else{scriptDirectory=""}{read_=function(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=function(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=function(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=function(title){document.title=title}}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.warn.bind(console);for(key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var STACK_ALIGN=16;function alignMemory(size,factor){if(!factor)factor=STACK_ALIGN;return Math.ceil(size/factor)*factor}var tempRet0=0;var setTempRet0=function(value){tempRet0=value};var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var noExitRuntime=Module["noExitRuntime"]||true;if(typeof WebAssembly!=="object"){abort("no native wasm support detected")}var wasmMemory;var ABORT=false;var EXITSTATUS;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}var UTF8Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf8"):undefined;function UTF8ArrayToString(heap,idx,maxBytesToRead){var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heap[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heap.subarray&&UTF8Decoder){return UTF8Decoder.decode(heap.subarray(idx,endPtr))}else{var str="";while(idx>10,56320|ch&1023)}}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):""}function stringToUTF8Array(str,heap,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127)++len;else if(u<=2047)len+=2;else if(u<=65535)len+=3;else len+=4}return len}var UTF16Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf-16le"):undefined;function UTF16ToString(ptr,maxBytesToRead){var endPtr=ptr;var idx=endPtr>>1;var maxIdx=idx+maxBytesToRead/2;while(!(idx>=maxIdx)&&HEAPU16[idx])++idx;endPtr=idx<<1;if(endPtr-ptr>32&&UTF16Decoder){return UTF16Decoder.decode(HEAPU8.subarray(ptr,endPtr))}else{var str="";for(var i=0;!(i>=maxBytesToRead/2);++i){var codeUnit=HEAP16[ptr+i*2>>1];if(codeUnit==0)break;str+=String.fromCharCode(codeUnit)}return str}}function stringToUTF16(str,outPtr,maxBytesToWrite){if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<2)return 0;maxBytesToWrite-=2;var startPtr=outPtr;var numCharsToWrite=maxBytesToWrite>1]=codeUnit;outPtr+=2}HEAP16[outPtr>>1]=0;return outPtr-startPtr}function lengthBytesUTF16(str){return str.length*2}function UTF32ToString(ptr,maxBytesToRead){var i=0;var str="";while(!(i>=maxBytesToRead/4)){var utf32=HEAP32[ptr+i*4>>2];if(utf32==0)break;++i;if(utf32>=65536){var ch=utf32-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}else{str+=String.fromCharCode(utf32)}}return str}function stringToUTF32(str,outPtr,maxBytesToWrite){if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<4)return 0;var startPtr=outPtr;var endPtr=startPtr+maxBytesToWrite-4;for(var i=0;i=55296&&codeUnit<=57343){var trailSurrogate=str.charCodeAt(++i);codeUnit=65536+((codeUnit&1023)<<10)|trailSurrogate&1023}HEAP32[outPtr>>2]=codeUnit;outPtr+=4;if(outPtr+4>endPtr)break}HEAP32[outPtr>>2]=0;return outPtr-startPtr}function lengthBytesUTF32(str){var len=0;for(var i=0;i=55296&&codeUnit<=57343)++i;len+=4}return len}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferAndViews(buf){buffer=buf;Module["HEAP8"]=HEAP8=new Int8Array(buf);Module["HEAP16"]=HEAP16=new Int16Array(buf);Module["HEAP32"]=HEAP32=new Int32Array(buf);Module["HEAPU8"]=HEAPU8=new Uint8Array(buf);Module["HEAPU16"]=HEAPU16=new Uint16Array(buf);Module["HEAPU32"]=HEAPU32=new Uint32Array(buf);Module["HEAPF32"]=HEAPF32=new Float32Array(buf);Module["HEAPF64"]=HEAPF64=new Float64Array(buf)}var INITIAL_MEMORY=Module["INITIAL_MEMORY"]||16777216;var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;if(!Module["noFSInit"]&&!FS.init.initialized)FS.init();TTY.init();callRuntimeCallbacks(__ATINIT__)}function preMain(){FS.ignorePermissions=false;callRuntimeCallbacks(__ATMAIN__)}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["preloadedImages"]={};Module["preloadedAudios"]={};function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}what+="";err(what);ABORT=true;EXITSTATUS=1;what="abort("+what+"). Build with -s ASSERTIONS=1 for more info.";var e=new WebAssembly.RuntimeError(what);throw e}function hasPrefix(str,prefix){return String.prototype.startsWith?str.startsWith(prefix):str.indexOf(prefix)===0}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return hasPrefix(filename,dataURIPrefix)}var fileURIPrefix="file://";function isFileURI(filename){return hasPrefix(filename,fileURIPrefix)}var wasmBinaryFile="wdecryptor.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(file){try{if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}else{throw"both async and sync fetching of the wasm failed"}}catch(err){abort(err)}}function getBinaryPromise(){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch==="function"&&!isFileURI(wasmBinaryFile)){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()}).catch(function(){return getBinary(wasmBinaryFile)})}else{if(readAsync){return new Promise(function(resolve,reject){readAsync(wasmBinaryFile,function(response){resolve(new Uint8Array(response))},reject)})}}}return Promise.resolve().then(function(){return getBinary(wasmBinaryFile)})}function createWasm(){var info={"a":asmLibraryArg};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;wasmMemory=Module["asm"]["u"];updateGlobalBufferAndViews(wasmMemory.buffer);wasmTable=Module["asm"]["w"];addOnInit(Module["asm"]["v"]);removeRunDependency("wasm-instantiate")}addRunDependency("wasm-instantiate");function receiveInstantiatedSource(output){receiveInstance(output["instance"])}function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){var result=WebAssembly.instantiate(binary,info);return result}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)})}function instantiateAsync(){if(!wasmBinary&&typeof WebAssembly.instantiateStreaming==="function"&&!isDataURI(wasmBinaryFile)&&!isFileURI(wasmBinaryFile)&&typeof fetch==="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,info);return result.then(receiveInstantiatedSource,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(receiveInstantiatedSource)})})}else{return instantiateArrayBuffer(receiveInstantiatedSource)}}if(Module["instantiateWasm"]){try{var exports=Module["instantiateWasm"](info,receiveInstance);return exports}catch(e){err("Module.instantiateWasm callback failed with error: "+e);return false}}instantiateAsync();return{}}var tempDouble;var tempI64;function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback=="function"){callback(Module);continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){wasmTable.get(func)()}else{wasmTable.get(func)(callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}function setErrNo(value){HEAP32[___errno_location()>>2]=value;return value}var PATH={splitPath:function(filename){var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:function(parts,allowAboveRoot){var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts},normalize:function(path){var isAbsolute=path.charAt(0)==="/",trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter(function(p){return!!p}),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path},dirname:function(path){var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir},basename:function(path){if(path==="/")return"/";path=PATH.normalize(path);path=path.replace(/\/$/,"");var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)},extname:function(path){return PATH.splitPath(path)[3]},join:function(){var paths=Array.prototype.slice.call(arguments,0);return PATH.normalize(paths.join("/"))},join2:function(l,r){return PATH.normalize(l+"/"+r)}};function getRandomDevice(){if(typeof crypto==="object"&&typeof crypto["getRandomValues"]==="function"){var randomBuffer=new Uint8Array(1);return function(){crypto.getRandomValues(randomBuffer);return randomBuffer[0]}}else if(ENVIRONMENT_IS_NODE){try{var crypto_module=require("crypto");return function(){return crypto_module["randomBytes"](1)[0]}}catch(e){}}return function(){abort("randomDevice")}}var PATH_FS={resolve:function(){var resolvedPath="",resolvedAbsolute=false;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?arguments[i]:FS.cwd();if(typeof path!=="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=path.charAt(0)==="/"}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter(function(p){return!!p}),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."},relative:function(from,to){from=PATH_FS.resolve(from).substr(1);to=PATH_FS.resolve(to).substr(1);function trim(arr){var start=0;for(;start=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i0){result=buf.slice(0,bytesRead).toString("utf-8")}else{result=null}}else if(typeof window!="undefined"&&typeof window.prompt=="function"){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else if(typeof readline=="function"){result=readline();if(result!==null){result+="\n"}}if(!result){return null}tty.input=intArrayFromString(result,true)}return tty.input.shift()},put_char:function(tty,val){if(val===null||val===10){out(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},flush:function(tty){if(tty.output&&tty.output.length>0){out(UTF8ArrayToString(tty.output,0));tty.output=[]}}},default_tty1_ops:{put_char:function(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},flush:function(tty){if(tty.output&&tty.output.length>0){err(UTF8ArrayToString(tty.output,0));tty.output=[]}}}};function mmapAlloc(size){var alignedSize=alignMemory(size,16384);var ptr=_malloc(alignedSize);while(size=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity>>0);if(prevCapacity!=0)newCapacity=Math.max(newCapacity,256);var oldContents=node.contents;node.contents=new Uint8Array(newCapacity);if(node.usedBytes>0)node.contents.set(oldContents.subarray(0,node.usedBytes),0)},resizeFileStorage:function(node,newSize){if(node.usedBytes==newSize)return;if(newSize==0){node.contents=null;node.usedBytes=0}else{var oldContents=node.contents;node.contents=new Uint8Array(newSize);if(oldContents){node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)))}node.usedBytes=newSize}},node_ops:{getattr:function(node){var attr={};attr.dev=FS.isChrdev(node.mode)?node.id:1;attr.ino=node.id;attr.mode=node.mode;attr.nlink=1;attr.uid=0;attr.gid=0;attr.rdev=node.rdev;if(FS.isDir(node.mode)){attr.size=4096}else if(FS.isFile(node.mode)){attr.size=node.usedBytes}else if(FS.isLink(node.mode)){attr.size=node.link.length}else{attr.size=0}attr.atime=new Date(node.timestamp);attr.mtime=new Date(node.timestamp);attr.ctime=new Date(node.timestamp);attr.blksize=4096;attr.blocks=Math.ceil(attr.size/attr.blksize);return attr},setattr:function(node,attr){if(attr.mode!==undefined){node.mode=attr.mode}if(attr.timestamp!==undefined){node.timestamp=attr.timestamp}if(attr.size!==undefined){MEMFS.resizeFileStorage(node,attr.size)}},lookup:function(parent,name){throw FS.genericErrors[44]},mknod:function(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)},rename:function(old_node,new_dir,new_name){if(FS.isDir(old_node.mode)){var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(new_node){for(var i in new_node.contents){throw new FS.ErrnoError(55)}}}delete old_node.parent.contents[old_node.name];old_node.parent.timestamp=Date.now();old_node.name=new_name;new_dir.contents[new_name]=old_node;new_dir.timestamp=old_node.parent.timestamp;old_node.parent=new_dir},unlink:function(parent,name){delete parent.contents[name];parent.timestamp=Date.now()},rmdir:function(parent,name){var node=FS.lookupNode(parent,name);for(var i in node.contents){throw new FS.ErrnoError(55)}delete parent.contents[name];parent.timestamp=Date.now()},readdir:function(node){var entries=[".",".."];for(var key in node.contents){if(!node.contents.hasOwnProperty(key)){continue}entries.push(key)}return entries},symlink:function(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return node},readlink:function(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(28)}return node.link}},stream_ops:{read:function(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i0||position+length8){throw new FS.ErrnoError(32)}var parts=PATH.normalizeArray(path.split("/").filter(function(p){return!!p}),false);var current=FS.root;var current_path="/";for(var i=0;i40){throw new FS.ErrnoError(32)}}}}return{path:current_path,node:current}},getPath:function(node){var path;while(true){if(FS.isRoot(node)){var mount=node.mount.mountpoint;if(!path)return mount;return mount[mount.length-1]!=="/"?mount+"/"+path:mount+path}path=path?node.name+"/"+path:node.name;node=node.parent}},hashName:function(parentid,name){var hash=0;for(var i=0;i>>0)%FS.nameTable.length},hashAddNode:function(node){var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node},hashRemoveNode:function(node){var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}},lookupNode:function(parent,name){var errCode=FS.mayLookup(parent);if(errCode){throw new FS.ErrnoError(errCode,parent)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)},createNode:function(parent,name,mode,rdev){var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node},destroyNode:function(node){FS.hashRemoveNode(node)},isRoot:function(node){return node===node.parent},isMountpoint:function(node){return!!node.mounted},isFile:function(mode){return(mode&61440)===32768},isDir:function(mode){return(mode&61440)===16384},isLink:function(mode){return(mode&61440)===40960},isChrdev:function(mode){return(mode&61440)===8192},isBlkdev:function(mode){return(mode&61440)===24576},isFIFO:function(mode){return(mode&61440)===4096},isSocket:function(mode){return(mode&49152)===49152},flagModes:{"r":0,"r+":2,"w":577,"w+":578,"a":1089,"a+":1090},modeStringToFlags:function(str){var flags=FS.flagModes[str];if(typeof flags==="undefined"){throw new Error("Unknown file open mode: "+str)}return flags},flagsToPermissionString:function(flag){var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms},nodePermissions:function(node,perms){if(FS.ignorePermissions){return 0}if(perms.indexOf("r")!==-1&&!(node.mode&292)){return 2}else if(perms.indexOf("w")!==-1&&!(node.mode&146)){return 2}else if(perms.indexOf("x")!==-1&&!(node.mode&73)){return 2}return 0},mayLookup:function(dir){var errCode=FS.nodePermissions(dir,"x");if(errCode)return errCode;if(!dir.node_ops.lookup)return 2;return 0},mayCreate:function(dir,name){try{var node=FS.lookupNode(dir,name);return 20}catch(e){}return FS.nodePermissions(dir,"wx")},mayDelete:function(dir,name,isdir){var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var errCode=FS.nodePermissions(dir,"wx");if(errCode){return errCode}if(isdir){if(!FS.isDir(node.mode)){return 54}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return 10}}else{if(FS.isDir(node.mode)){return 31}}return 0},mayOpen:function(node,flags){if(!node){return 44}if(FS.isLink(node.mode)){return 32}else if(FS.isDir(node.mode)){if(FS.flagsToPermissionString(flags)!=="r"||flags&512){return 31}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))},MAX_OPEN_FDS:4096,nextfd:function(fd_start,fd_end){fd_start=fd_start||0;fd_end=fd_end||FS.MAX_OPEN_FDS;for(var fd=fd_start;fd<=fd_end;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(33)},getStream:function(fd){return FS.streams[fd]},createStream:function(stream,fd_start,fd_end){if(!FS.FSStream){FS.FSStream=function(){};FS.FSStream.prototype={object:{get:function(){return this.node},set:function(val){this.node=val}},isRead:{get:function(){return(this.flags&2097155)!==1}},isWrite:{get:function(){return(this.flags&2097155)!==0}},isAppend:{get:function(){return this.flags&1024}}}}var newStream=new FS.FSStream;for(var p in stream){newStream[p]=stream[p]}stream=newStream;var fd=FS.nextfd(fd_start,fd_end);stream.fd=fd;FS.streams[fd]=stream;return stream},closeStream:function(fd){FS.streams[fd]=null},chrdev_stream_ops:{open:function(stream){var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;if(stream.stream_ops.open){stream.stream_ops.open(stream)}},llseek:function(){throw new FS.ErrnoError(70)}},major:function(dev){return dev>>8},minor:function(dev){return dev&255},makedev:function(ma,mi){return ma<<8|mi},registerDevice:function(dev,ops){FS.devices[dev]={stream_ops:ops}},getDevice:function(dev){return FS.devices[dev]},getMounts:function(mount){var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push.apply(check,m.mounts)}return mounts},syncfs:function(populate,callback){if(typeof populate==="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){err("warning: "+FS.syncFSRequests+" FS.syncfs operations in flight at once, probably just doing extra work")}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(errCode){FS.syncFSRequests--;return callback(errCode)}function done(errCode){if(errCode){if(!done.errored){done.errored=true;return doCallback(errCode)}return}if(++completed>=mounts.length){doCallback(null)}}mounts.forEach(function(mount){if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)})},mount:function(type,opts,mountpoint){var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(10)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}}var mount={type:type,opts:opts,mountpoint:mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot},unmount:function(mountpoint){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(28)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach(function(hash){var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.indexOf(current.mount)!==-1){FS.destroyNode(current)}current=next}});node.mounted=null;var idx=node.mount.mounts.indexOf(mount);node.mount.mounts.splice(idx,1)},lookup:function(parent,name){return parent.node_ops.lookup(parent,name)},mknod:function(path,mode,dev){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name||name==="."||name===".."){throw new FS.ErrnoError(28)}var errCode=FS.mayCreate(parent,name);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(63)}return parent.node_ops.mknod(parent,name,mode,dev)},create:function(path,mode){mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;return FS.mknod(path,mode,0)},mkdir:function(path,mode){mode=mode!==undefined?mode:511;mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)},mkdirTree:function(path,mode){var dirs=path.split("/");var d="";for(var i=0;ithis.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]};LazyUint8Array.prototype.setDataGetter=function LazyUint8Array_setDataGetter(getter){this.getter=getter};LazyUint8Array.prototype.cacheLength=function LazyUint8Array_cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=function(from,to){if(from>to)throw new Error("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)throw new Error("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);if(typeof Uint8Array!="undefined")xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}else{return intArrayFromString(xhr.responseText||"",true)}};var lazyArray=this;lazyArray.setDataGetter(function(chunkNum){var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]==="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]==="undefined")throw new Error("doXHR failed!");return lazyArray.chunks[chunkNum]});if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;out("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true};if(typeof XMLHttpRequest!=="undefined"){if(!ENVIRONMENT_IS_WORKER)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var lazyArray=new LazyUint8Array;Object.defineProperties(lazyArray,{length:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._length}},chunkSize:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize}}});var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url:url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:function(){return this.contents.length}}});var stream_ops={};var keys=Object.keys(node.stream_ops);keys.forEach(function(key){var fn=node.stream_ops[key];stream_ops[key]=function forceLoadLazyFile(){FS.forceLoadFile(node);return fn.apply(null,arguments)}});stream_ops.read=function stream_ops_read(stream,buffer,offset,length,position){FS.forceLoadFile(node);var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);if(contents.slice){for(var i=0;i>2]=stat.dev;HEAP32[buf+4>>2]=0;HEAP32[buf+8>>2]=stat.ino;HEAP32[buf+12>>2]=stat.mode;HEAP32[buf+16>>2]=stat.nlink;HEAP32[buf+20>>2]=stat.uid;HEAP32[buf+24>>2]=stat.gid;HEAP32[buf+28>>2]=stat.rdev;HEAP32[buf+32>>2]=0;tempI64=[stat.size>>>0,(tempDouble=stat.size,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+40>>2]=tempI64[0],HEAP32[buf+44>>2]=tempI64[1];HEAP32[buf+48>>2]=4096;HEAP32[buf+52>>2]=stat.blocks;HEAP32[buf+56>>2]=stat.atime.getTime()/1e3|0;HEAP32[buf+60>>2]=0;HEAP32[buf+64>>2]=stat.mtime.getTime()/1e3|0;HEAP32[buf+68>>2]=0;HEAP32[buf+72>>2]=stat.ctime.getTime()/1e3|0;HEAP32[buf+76>>2]=0;tempI64=[stat.ino>>>0,(tempDouble=stat.ino,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+80>>2]=tempI64[0],HEAP32[buf+84>>2]=tempI64[1];return 0},doMsync:function(addr,stream,len,flags,offset){var buffer=HEAPU8.slice(addr,addr+len);FS.msync(stream,buffer,offset,len,flags)},doMkdir:function(path,mode){path=PATH.normalize(path);if(path[path.length-1]==="/")path=path.substr(0,path.length-1);FS.mkdir(path,mode,0);return 0},doMknod:function(path,mode,dev){switch(mode&61440){case 32768:case 8192:case 24576:case 4096:case 49152:break;default:return-28}FS.mknod(path,mode,dev);return 0},doReadlink:function(path,buf,bufsize){if(bufsize<=0)return-28;var ret=FS.readlink(path);var len=Math.min(bufsize,lengthBytesUTF8(ret));var endChar=HEAP8[buf+len];stringToUTF8(ret,buf,bufsize+1);HEAP8[buf+len]=endChar;return len},doAccess:function(path,amode){if(amode&~7){return-28}var node;var lookup=FS.lookupPath(path,{follow:true});node=lookup.node;if(!node){return-44}var perms="";if(amode&4)perms+="r";if(amode&2)perms+="w";if(amode&1)perms+="x";if(perms&&FS.nodePermissions(node,perms)){return-2}return 0},doDup:function(path,flags,suggestFD){var suggest=FS.getStream(suggestFD);if(suggest)FS.close(suggest);return FS.open(path,flags,0,suggestFD,suggestFD).fd},doReadv:function(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i>2];var len=HEAP32[iov+(i*8+4)>>2];var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>2];var len=HEAP32[iov+(i*8+4)>>2];var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr}return ret},varargs:undefined,get:function(){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret},getStr:function(ptr){var ret=UTF8ToString(ptr);return ret},getStreamFromFD:function(fd){var stream=FS.getStream(fd);if(!stream)throw new FS.ErrnoError(8);return stream},get64:function(low,high){return low}};function ___sys_fcntl64(fd,cmd,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(cmd){case 0:{var arg=SYSCALLS.get();if(arg<0){return-28}var newStream;newStream=FS.open(stream.path,stream.flags,0,arg);return newStream.fd}case 1:case 2:return 0;case 3:return stream.flags;case 4:{var arg=SYSCALLS.get();stream.flags|=arg;return 0}case 12:{var arg=SYSCALLS.get();var offset=0;HEAP16[arg+offset>>1]=2;return 0}case 13:case 14:return 0;case 16:case 8:return-28;case 9:setErrNo(28);return-1;default:{return-28}}}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_ioctl(fd,op,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(op){case 21509:case 21505:{if(!stream.tty)return-59;return 0}case 21510:case 21511:case 21512:case 21506:case 21507:case 21508:{if(!stream.tty)return-59;return 0}case 21519:{if(!stream.tty)return-59;var argp=SYSCALLS.get();HEAP32[argp>>2]=0;return 0}case 21520:{if(!stream.tty)return-59;return-28}case 21531:{var argp=SYSCALLS.get();return FS.ioctl(stream,op,argp)}case 21523:{if(!stream.tty)return-59;return 0}case 21524:{if(!stream.tty)return-59;return 0}default:abort("bad ioctl syscall "+op)}}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_open(path,flags,varargs){SYSCALLS.varargs=varargs;try{var pathname=SYSCALLS.getStr(path);var mode=varargs?SYSCALLS.get():0;var stream=FS.open(pathname,flags,mode);return stream.fd}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function getShiftFromSize(size){switch(size){case 1:return 0;case 2:return 1;case 4:return 2;case 8:return 3;default:throw new TypeError("Unknown type size: "+size)}}function embind_init_charCodes(){var codes=new Array(256);for(var i=0;i<256;++i){codes[i]=String.fromCharCode(i)}embind_charCodes=codes}var embind_charCodes=undefined;function readLatin1String(ptr){var ret="";var c=ptr;while(HEAPU8[c]){ret+=embind_charCodes[HEAPU8[c++]]}return ret}var awaitingDependencies={};var registeredTypes={};var typeDependencies={};var char_0=48;var char_9=57;function makeLegalFunctionName(name){if(undefined===name){return"_unknown"}name=name.replace(/[^a-zA-Z0-9_]/g,"$");var f=name.charCodeAt(0);if(f>=char_0&&f<=char_9){return"_"+name}else{return name}}function createNamedFunction(name,body){name=makeLegalFunctionName(name);return new Function("body","return function "+name+"() {\n"+' "use strict";'+" return body.apply(this, arguments);\n"+"};\n")(body)}function extendError(baseErrorType,errorName){var errorClass=createNamedFunction(errorName,function(message){this.name=errorName;this.message=message;var stack=new Error(message).stack;if(stack!==undefined){this.stack=this.toString()+"\n"+stack.replace(/^Error(:[^\n]*)?\n/,"")}});errorClass.prototype=Object.create(baseErrorType.prototype);errorClass.prototype.constructor=errorClass;errorClass.prototype.toString=function(){if(this.message===undefined){return this.name}else{return this.name+": "+this.message}};return errorClass}var BindingError=undefined;function throwBindingError(message){throw new BindingError(message)}var InternalError=undefined;function throwInternalError(message){throw new InternalError(message)}function whenDependentTypesAreResolved(myTypes,dependentTypes,getTypeConverters){myTypes.forEach(function(type){typeDependencies[type]=dependentTypes});function onComplete(typeConverters){var myTypeConverters=getTypeConverters(typeConverters);if(myTypeConverters.length!==myTypes.length){throwInternalError("Mismatched type converter count")}for(var i=0;i>shift])},destructorFunction:null})}var emval_free_list=[];var emval_handle_array=[{},{value:undefined},{value:null},{value:true},{value:false}];function __emval_decref(handle){if(handle>4&&0===--emval_handle_array[handle].refcount){emval_handle_array[handle]=undefined;emval_free_list.push(handle)}}function count_emval_handles(){var count=0;for(var i=5;i>2])}function __embind_register_emval(rawType,name){name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":function(handle){var rv=emval_handle_array[handle].value;__emval_decref(handle);return rv},"toWireType":function(destructors,value){return __emval_register(value)},"argPackAdvance":8,"readValueFromPointer":simpleReadValueFromPointer,destructorFunction:null})}function _embind_repr(v){if(v===null){return"null"}var t=typeof v;if(t==="object"||t==="array"||t==="function"){return v.toString()}else{return""+v}}function floatReadValueFromPointer(name,shift){switch(shift){case 2:return function(pointer){return this["fromWireType"](HEAPF32[pointer>>2])};case 3:return function(pointer){return this["fromWireType"](HEAPF64[pointer>>3])};default:throw new TypeError("Unknown float type: "+name)}}function __embind_register_float(rawType,name,size){var shift=getShiftFromSize(size);name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":function(value){return value},"toWireType":function(destructors,value){if(typeof value!=="number"&&typeof value!=="boolean"){throw new TypeError('Cannot convert "'+_embind_repr(value)+'" to '+this.name)}return value},"argPackAdvance":8,"readValueFromPointer":floatReadValueFromPointer(name,shift),destructorFunction:null})}function new_(constructor,argumentList){if(!(constructor instanceof Function)){throw new TypeError("new_ called with constructor type "+typeof constructor+" which is not a function")}var dummy=createNamedFunction(constructor.name||"unknownFunctionName",function(){});dummy.prototype=constructor.prototype;var obj=new dummy;var r=constructor.apply(obj,argumentList);return r instanceof Object?r:obj}function runDestructors(destructors){while(destructors.length){var ptr=destructors.pop();var del=destructors.pop();del(ptr)}}function craftInvokerFunction(humanName,argTypes,classType,cppInvokerFunc,cppTargetFunc){var argCount=argTypes.length;if(argCount<2){throwBindingError("argTypes array size mismatch! Must at least get return value and 'this' types!")}var isClassMethodFunc=argTypes[1]!==null&&classType!==null;var needsDestructorStack=false;for(var i=1;i0?", ":"")+argsListWired}invokerFnBody+=(returns?"var rv = ":"")+"invoker(fn"+(argsListWired.length>0?", ":"")+argsListWired+");\n";if(needsDestructorStack){invokerFnBody+="runDestructors(destructors);\n"}else{for(var i=isClassMethodFunc?1:2;i>2)+i])}return array}function replacePublicSymbol(name,value,numArguments){if(!Module.hasOwnProperty(name)){throwInternalError("Replacing nonexistant public symbol")}if(undefined!==Module[name].overloadTable&&undefined!==numArguments){Module[name].overloadTable[numArguments]=value}else{Module[name]=value;Module[name].argCount=numArguments}}function dynCallLegacy(sig,ptr,args){var f=Module["dynCall_"+sig];return args&&args.length?f.apply(null,[ptr].concat(args)):f.call(null,ptr)}function dynCall(sig,ptr,args){if(sig.indexOf("j")!=-1){return dynCallLegacy(sig,ptr,args)}return wasmTable.get(ptr).apply(null,args)}function getDynCaller(sig,ptr){var argCache=[];return function(){argCache.length=arguments.length;for(var i=0;i>1]}:function readU16FromPointer(pointer){return HEAPU16[pointer>>1]};case 2:return signed?function readS32FromPointer(pointer){return HEAP32[pointer>>2]}:function readU32FromPointer(pointer){return HEAPU32[pointer>>2]};default:throw new TypeError("Unknown integer type: "+name)}}function __embind_register_integer(primitiveType,name,size,minRange,maxRange){name=readLatin1String(name);if(maxRange===-1){maxRange=4294967295}var shift=getShiftFromSize(size);var fromWireType=function(value){return value};if(minRange===0){var bitshift=32-8*size;fromWireType=function(value){return value<>>bitshift}}var isUnsignedType=name.indexOf("unsigned")!=-1;registerType(primitiveType,{name:name,"fromWireType":fromWireType,"toWireType":function(destructors,value){if(typeof value!=="number"&&typeof value!=="boolean"){throw new TypeError('Cannot convert "'+_embind_repr(value)+'" to '+this.name)}if(valuemaxRange){throw new TypeError('Passing a number "'+_embind_repr(value)+'" from JS side to C/C++ side to an argument of type "'+name+'", which is outside the valid range ['+minRange+", "+maxRange+"]!")}return isUnsignedType?value>>>0:value|0},"argPackAdvance":8,"readValueFromPointer":integerReadValueFromPointer(name,shift,minRange!==0),destructorFunction:null})}function __embind_register_memory_view(rawType,dataTypeIndex,name){var typeMapping=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array];var TA=typeMapping[dataTypeIndex];function decodeMemoryView(handle){handle=handle>>2;var heap=HEAPU32;var size=heap[handle];var data=heap[handle+1];return new TA(buffer,data,size)}name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":decodeMemoryView,"argPackAdvance":8,"readValueFromPointer":decodeMemoryView},{ignoreDuplicateRegistrations:true})}function __embind_register_std_string(rawType,name){name=readLatin1String(name);var stdStringIsUTF8=name==="std::string";registerType(rawType,{name:name,"fromWireType":function(value){var length=HEAPU32[value>>2];var str;if(stdStringIsUTF8){var decodeStartPtr=value+4;for(var i=0;i<=length;++i){var currentBytePtr=value+4+i;if(i==length||HEAPU8[currentBytePtr]==0){var maxRead=currentBytePtr-decodeStartPtr;var stringSegment=UTF8ToString(decodeStartPtr,maxRead);if(str===undefined){str=stringSegment}else{str+=String.fromCharCode(0);str+=stringSegment}decodeStartPtr=currentBytePtr+1}}}else{var a=new Array(length);for(var i=0;i>2]=length;if(stdStringIsUTF8&&valueIsOfTypeString){stringToUTF8(value,ptr+4,length+1)}else{if(valueIsOfTypeString){for(var i=0;i255){_free(ptr);throwBindingError("String has UTF-16 code units that do not fit in 8 bits")}HEAPU8[ptr+4+i]=charCode}}else{for(var i=0;i>2];var HEAP=getHeap();var str;var decodeStartPtr=value+4;for(var i=0;i<=length;++i){var currentBytePtr=value+4+i*charSize;if(i==length||HEAP[currentBytePtr>>shift]==0){var maxReadBytes=currentBytePtr-decodeStartPtr;var stringSegment=decodeString(decodeStartPtr,maxReadBytes);if(str===undefined){str=stringSegment}else{str+=String.fromCharCode(0);str+=stringSegment}decodeStartPtr=currentBytePtr+charSize}}_free(value);return str},"toWireType":function(destructors,value){if(!(typeof value==="string")){throwBindingError("Cannot pass non-string to C++ string type "+name)}var length=lengthBytesUTF(value);var ptr=_malloc(4+length+charSize);HEAPU32[ptr>>2]=length>>shift;encodeString(value,ptr+4,length+charSize);if(destructors!==null){destructors.push(_free,ptr)}return ptr},"argPackAdvance":8,"readValueFromPointer":simpleReadValueFromPointer,destructorFunction:function(ptr){_free(ptr)}})}function __embind_register_void(rawType,name){name=readLatin1String(name);registerType(rawType,{isVoid:true,name:name,"argPackAdvance":0,"fromWireType":function(){return undefined},"toWireType":function(destructors,o){return undefined}})}function _abort(){abort()}function _emscripten_memcpy_big(dest,src,num){HEAPU8.copyWithin(dest,src,src+num)}function abortOnCannotGrowMemory(requestedSize){abort("OOM")}function _emscripten_resize_heap(requestedSize){var oldSize=HEAPU8.length;abortOnCannotGrowMemory(requestedSize)}function _fd_close(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);FS.close(stream);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return e.errno}}function _fd_read(fd,iov,iovcnt,pnum){try{var stream=SYSCALLS.getStreamFromFD(fd);var num=SYSCALLS.doReadv(stream,iov,iovcnt);HEAP32[pnum>>2]=num;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return e.errno}}function _fd_seek(fd,offset_low,offset_high,whence,newOffset){try{var stream=SYSCALLS.getStreamFromFD(fd);var HIGH_OFFSET=4294967296;var offset=offset_high*HIGH_OFFSET+(offset_low>>>0);var DOUBLE_LIMIT=9007199254740992;if(offset<=-DOUBLE_LIMIT||offset>=DOUBLE_LIMIT){return-61}FS.llseek(stream,offset,whence);tempI64=[stream.position>>>0,(tempDouble=stream.position,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[newOffset>>2]=tempI64[0],HEAP32[newOffset+4>>2]=tempI64[1];if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return e.errno}}function _fd_write(fd,iov,iovcnt,pnum){try{var stream=SYSCALLS.getStreamFromFD(fd);var num=SYSCALLS.doWritev(stream,iov,iovcnt);HEAP32[pnum>>2]=num;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return e.errno}}function _setTempRet0($i){setTempRet0($i|0)}var FSNode=function(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.mounted=null;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.node_ops={};this.stream_ops={};this.rdev=rdev};var readMode=292|73;var writeMode=146;Object.defineProperties(FSNode.prototype,{read:{get:function(){return(this.mode&readMode)===readMode},set:function(val){val?this.mode|=readMode:this.mode&=~readMode}},write:{get:function(){return(this.mode&writeMode)===writeMode},set:function(val){val?this.mode|=writeMode:this.mode&=~writeMode}},isFolder:{get:function(){return FS.isDir(this.mode)}},isDevice:{get:function(){return FS.isChrdev(this.mode)}}});FS.FSNode=FSNode;FS.staticInit();embind_init_charCodes();BindingError=Module["BindingError"]=extendError(Error,"BindingError");InternalError=Module["InternalError"]=extendError(Error,"InternalError");init_emval();UnboundTypeError=Module["UnboundTypeError"]=extendError(Error,"UnboundTypeError");function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}var asmLibraryArg={"i":___sys_fcntl64,"s":___sys_ioctl,"j":___sys_open,"l":__embind_register_bool,"k":__embind_register_emval,"e":__embind_register_float,"d":__embind_register_function,"b":__embind_register_integer,"a":__embind_register_memory_view,"f":__embind_register_std_string,"c":__embind_register_std_wstring,"t":__embind_register_void,"q":_abort,"o":_emscripten_memcpy_big,"p":_emscripten_resize_heap,"h":_fd_close,"r":_fd_read,"m":_fd_seek,"g":_fd_write,"n":_setTempRet0};var asm=createWasm();var ___wasm_call_ctors=Module["___wasm_call_ctors"]=function(){return(___wasm_call_ctors=Module["___wasm_call_ctors"]=Module["asm"]["v"]).apply(null,arguments)};var _malloc=Module["_malloc"]=function(){return(_malloc=Module["_malloc"]=Module["asm"]["x"]).apply(null,arguments)};var ___getTypeName=Module["___getTypeName"]=function(){return(___getTypeName=Module["___getTypeName"]=Module["asm"]["y"]).apply(null,arguments)};var ___embind_register_native_and_builtin_types=Module["___embind_register_native_and_builtin_types"]=function(){return(___embind_register_native_and_builtin_types=Module["___embind_register_native_and_builtin_types"]=Module["asm"]["z"]).apply(null,arguments)};var ___errno_location=Module["___errno_location"]=function(){return(___errno_location=Module["___errno_location"]=Module["asm"]["A"]).apply(null,arguments)};var _free=Module["_free"]=function(){return(_free=Module["_free"]=Module["asm"]["B"]).apply(null,arguments)};var dynCall_jiji=Module["dynCall_jiji"]=function(){return(dynCall_jiji=Module["dynCall_jiji"]=Module["asm"]["C"]).apply(null,arguments)};var calledRun;function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(args){args=args||arguments_;if(runDependencies>0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();preMain();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}Module["run"]=run;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}run(); + +var Module = (function() { + var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined; + if (typeof __filename !== 'undefined') _scriptDir = _scriptDir || __filename; + return ( +function(Module) { + Module = Module || {}; + + + +// The Module object: Our interface to the outside world. We import +// and export values on it. There are various ways Module can be used: +// 1. Not defined. We create it here +// 2. A function parameter, function(Module) { ..generated code.. } +// 3. pre-run appended it, var Module = {}; ..generated code.. +// 4. External script tag defines var Module. +// We need to check if Module already exists (e.g. case 3 above). +// Substitution will be replaced with actual code on later stage of the build, +// this way Closure Compiler will not mangle it (e.g. case 4. above). +// Note that if you want to run closure, and also to use Module +// after the generated code, you will need to define var Module = {}; +// before the code. Then that object will be used in the code, and you +// can continue to use Module afterwards as well. +var Module = typeof Module !== 'undefined' ? Module : {}; + +// Set up the promise that indicates the Module is initialized +var readyPromiseResolve, readyPromiseReject; +Module['ready'] = new Promise(function(resolve, reject) { + readyPromiseResolve = resolve; + readyPromiseReject = reject; +}); + +// --pre-jses are emitted after the Module integration code, so that they can +// refer to Module (if they choose; they can also define Module) +// {{PRE_JSES}} + +// Sometimes an existing Module object exists with properties +// meant to overwrite the default module functionality. Here +// we collect those properties and reapply _after_ we configure +// the current environment's defaults to avoid having to be so +// defensive during initialization. +var moduleOverrides = {}; +var key; +for (key in Module) { + if (Module.hasOwnProperty(key)) { + moduleOverrides[key] = Module[key]; + } +} + +var arguments_ = []; +var thisProgram = './this.program'; +var quit_ = function(status, toThrow) { + throw toThrow; +}; + +// Determine the runtime environment we are in. You can customize this by +// setting the ENVIRONMENT setting at compile time (see settings.js). + +var ENVIRONMENT_IS_WEB = false; +var ENVIRONMENT_IS_WORKER = false; +var ENVIRONMENT_IS_NODE = false; +var ENVIRONMENT_IS_SHELL = false; +ENVIRONMENT_IS_WEB = typeof window === 'object'; +ENVIRONMENT_IS_WORKER = typeof importScripts === 'function'; +// N.b. Electron.js environment is simultaneously a NODE-environment, but +// also a web environment. +ENVIRONMENT_IS_NODE = typeof process === 'object' && typeof process.versions === 'object' && typeof process.versions.node === 'string'; +ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER; + +// `/` should be present at the end if `scriptDirectory` is not empty +var scriptDirectory = ''; +function locateFile(path) { + if (Module['locateFile']) { + return Module['locateFile'](path, scriptDirectory); + } + return scriptDirectory + path; +} + +// Hooks that are implemented differently in different runtime environments. +var read_, + readAsync, + readBinary, + setWindowTitle; + +var nodeFS; +var nodePath; + +if (ENVIRONMENT_IS_NODE) { + if (ENVIRONMENT_IS_WORKER) { + scriptDirectory = require('path').dirname(scriptDirectory) + '/'; + } else { + scriptDirectory = __dirname + '/'; + } + +// include: node_shell_read.js + + +read_ = function shell_read(filename, binary) { + if (!nodeFS) nodeFS = require('fs'); + if (!nodePath) nodePath = require('path'); + filename = nodePath['normalize'](filename); + return nodeFS['readFileSync'](filename, binary ? null : 'utf8'); +}; + +readBinary = function readBinary(filename) { + var ret = read_(filename, true); + if (!ret.buffer) { + ret = new Uint8Array(ret); + } + assert(ret.buffer); + return ret; +}; + +// end include: node_shell_read.js + if (process['argv'].length > 1) { + thisProgram = process['argv'][1].replace(/\\/g, '/'); + } + + arguments_ = process['argv'].slice(2); + + // MODULARIZE will export the module in the proper place outside, we don't need to export here + + process['on']('uncaughtException', function(ex) { + // suppress ExitStatus exceptions from showing an error + if (!(ex instanceof ExitStatus)) { + throw ex; + } + }); + + process['on']('unhandledRejection', abort); + + quit_ = function(status) { + process['exit'](status); + }; + + Module['inspect'] = function () { return '[Emscripten Module object]'; }; + +} else +if (ENVIRONMENT_IS_SHELL) { + + if (typeof read != 'undefined') { + read_ = function shell_read(f) { + return read(f); + }; + } + + readBinary = function readBinary(f) { + var data; + if (typeof readbuffer === 'function') { + return new Uint8Array(readbuffer(f)); + } + data = read(f, 'binary'); + assert(typeof data === 'object'); + return data; + }; + + if (typeof scriptArgs != 'undefined') { + arguments_ = scriptArgs; + } else if (typeof arguments != 'undefined') { + arguments_ = arguments; + } + + if (typeof quit === 'function') { + quit_ = function(status) { + quit(status); + }; + } + + if (typeof print !== 'undefined') { + // Prefer to use print/printErr where they exist, as they usually work better. + if (typeof console === 'undefined') console = /** @type{!Console} */({}); + console.log = /** @type{!function(this:Console, ...*): undefined} */ (print); + console.warn = console.error = /** @type{!function(this:Console, ...*): undefined} */ (typeof printErr !== 'undefined' ? printErr : print); + } + +} else + +// Note that this includes Node.js workers when relevant (pthreads is enabled). +// Node.js workers are detected as a combination of ENVIRONMENT_IS_WORKER and +// ENVIRONMENT_IS_NODE. +if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { + if (ENVIRONMENT_IS_WORKER) { // Check worker, not web, since window could be polyfilled + scriptDirectory = self.location.href; + } else if (typeof document !== 'undefined' && document.currentScript) { // web + scriptDirectory = document.currentScript.src; + } + // When MODULARIZE, this JS may be executed later, after document.currentScript + // is gone, so we saved it, and we use it here instead of any other info. + if (_scriptDir) { + scriptDirectory = _scriptDir; + } + // blob urls look like blob:http://site.com/etc/etc and we cannot infer anything from them. + // otherwise, slice off the final part of the url to find the script directory. + // if scriptDirectory does not contain a slash, lastIndexOf will return -1, + // and scriptDirectory will correctly be replaced with an empty string. + if (scriptDirectory.indexOf('blob:') !== 0) { + scriptDirectory = scriptDirectory.substr(0, scriptDirectory.lastIndexOf('/')+1); + } else { + scriptDirectory = ''; + } + + // Differentiate the Web Worker from the Node Worker case, as reading must + // be done differently. + { + +// include: web_or_worker_shell_read.js + + + read_ = function(url) { + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, false); + xhr.send(null); + return xhr.responseText; + }; + + if (ENVIRONMENT_IS_WORKER) { + readBinary = function(url) { + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, false); + xhr.responseType = 'arraybuffer'; + xhr.send(null); + return new Uint8Array(/** @type{!ArrayBuffer} */(xhr.response)); + }; + } + + readAsync = function(url, onload, onerror) { + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, true); + xhr.responseType = 'arraybuffer'; + xhr.onload = function() { + if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) { // file URLs can return 0 + onload(xhr.response); + return; + } + onerror(); + }; + xhr.onerror = onerror; + xhr.send(null); + }; + +// end include: web_or_worker_shell_read.js + } + + setWindowTitle = function(title) { document.title = title }; +} else +{ +} + +// Set up the out() and err() hooks, which are how we can print to stdout or +// stderr, respectively. +var out = Module['print'] || console.log.bind(console); +var err = Module['printErr'] || console.warn.bind(console); + +// Merge back in the overrides +for (key in moduleOverrides) { + if (moduleOverrides.hasOwnProperty(key)) { + Module[key] = moduleOverrides[key]; + } +} +// Free the object hierarchy contained in the overrides, this lets the GC +// reclaim data used e.g. in memoryInitializerRequest, which is a large typed array. +moduleOverrides = null; + +// Emit code to handle expected values on the Module object. This applies Module.x +// to the proper local x. This has two benefits: first, we only emit it if it is +// expected to arrive, and second, by using a local everywhere else that can be +// minified. + +if (Module['arguments']) arguments_ = Module['arguments']; + +if (Module['thisProgram']) thisProgram = Module['thisProgram']; + +if (Module['quit']) quit_ = Module['quit']; + +// perform assertions in shell.js after we set up out() and err(), as otherwise if an assertion fails it cannot print the message + + + + +var STACK_ALIGN = 16; + +function alignMemory(size, factor) { + if (!factor) factor = STACK_ALIGN; // stack alignment (16-byte) by default + return Math.ceil(size / factor) * factor; +} + +function getNativeTypeSize(type) { + switch (type) { + case 'i1': case 'i8': return 1; + case 'i16': return 2; + case 'i32': return 4; + case 'i64': return 8; + case 'float': return 4; + case 'double': return 8; + default: { + if (type[type.length-1] === '*') { + return 4; // A pointer + } else if (type[0] === 'i') { + var bits = Number(type.substr(1)); + assert(bits % 8 === 0, 'getNativeTypeSize invalid bits ' + bits + ', type ' + type); + return bits / 8; + } else { + return 0; + } + } + } +} + +function warnOnce(text) { + if (!warnOnce.shown) warnOnce.shown = {}; + if (!warnOnce.shown[text]) { + warnOnce.shown[text] = 1; + err(text); + } +} + +// include: runtime_functions.js + + +// Wraps a JS function as a wasm function with a given signature. +function convertJsFunctionToWasm(func, sig) { + + // If the type reflection proposal is available, use the new + // "WebAssembly.Function" constructor. + // Otherwise, construct a minimal wasm module importing the JS function and + // re-exporting it. + if (typeof WebAssembly.Function === "function") { + var typeNames = { + 'i': 'i32', + 'j': 'i64', + 'f': 'f32', + 'd': 'f64' + }; + var type = { + parameters: [], + results: sig[0] == 'v' ? [] : [typeNames[sig[0]]] + }; + for (var i = 1; i < sig.length; ++i) { + type.parameters.push(typeNames[sig[i]]); + } + return new WebAssembly.Function(type, func); + } + + // The module is static, with the exception of the type section, which is + // generated based on the signature passed in. + var typeSection = [ + 0x01, // id: section, + 0x00, // length: 0 (placeholder) + 0x01, // count: 1 + 0x60, // form: func + ]; + var sigRet = sig.slice(0, 1); + var sigParam = sig.slice(1); + var typeCodes = { + 'i': 0x7f, // i32 + 'j': 0x7e, // i64 + 'f': 0x7d, // f32 + 'd': 0x7c, // f64 + }; + + // Parameters, length + signatures + typeSection.push(sigParam.length); + for (var i = 0; i < sigParam.length; ++i) { + typeSection.push(typeCodes[sigParam[i]]); + } + + // Return values, length + signatures + // With no multi-return in MVP, either 0 (void) or 1 (anything else) + if (sigRet == 'v') { + typeSection.push(0x00); + } else { + typeSection = typeSection.concat([0x01, typeCodes[sigRet]]); + } + + // Write the overall length of the type section back into the section header + // (excepting the 2 bytes for the section id and length) + typeSection[1] = typeSection.length - 2; + + // Rest of the module is static + var bytes = new Uint8Array([ + 0x00, 0x61, 0x73, 0x6d, // magic ("\0asm") + 0x01, 0x00, 0x00, 0x00, // version: 1 + ].concat(typeSection, [ + 0x02, 0x07, // import section + // (import "e" "f" (func 0 (type 0))) + 0x01, 0x01, 0x65, 0x01, 0x66, 0x00, 0x00, + 0x07, 0x05, // export section + // (export "f" (func 0 (type 0))) + 0x01, 0x01, 0x66, 0x00, 0x00, + ])); + + // We can compile this wasm module synchronously because it is very small. + // This accepts an import (at "e.f"), that it reroutes to an export (at "f") + var module = new WebAssembly.Module(bytes); + var instance = new WebAssembly.Instance(module, { + 'e': { + 'f': func + } + }); + var wrappedFunc = instance.exports['f']; + return wrappedFunc; +} + +var freeTableIndexes = []; + +// Weak map of functions in the table to their indexes, created on first use. +var functionsInTableMap; + +function getEmptyTableSlot() { + // Reuse a free index if there is one, otherwise grow. + if (freeTableIndexes.length) { + return freeTableIndexes.pop(); + } + // Grow the table + try { + wasmTable.grow(1); + } catch (err) { + if (!(err instanceof RangeError)) { + throw err; + } + throw 'Unable to grow wasm table. Set ALLOW_TABLE_GROWTH.'; + } + return wasmTable.length - 1; +} + +// Add a wasm function to the table. +function addFunctionWasm(func, sig) { + // Check if the function is already in the table, to ensure each function + // gets a unique index. First, create the map if this is the first use. + if (!functionsInTableMap) { + functionsInTableMap = new WeakMap(); + for (var i = 0; i < wasmTable.length; i++) { + var item = wasmTable.get(i); + // Ignore null values. + if (item) { + functionsInTableMap.set(item, i); + } + } + } + if (functionsInTableMap.has(func)) { + return functionsInTableMap.get(func); + } + + // It's not in the table, add it now. + + var ret = getEmptyTableSlot(); + + // Set the new value. + try { + // Attempting to call this with JS function will cause of table.set() to fail + wasmTable.set(ret, func); + } catch (err) { + if (!(err instanceof TypeError)) { + throw err; + } + var wrapped = convertJsFunctionToWasm(func, sig); + wasmTable.set(ret, wrapped); + } + + functionsInTableMap.set(func, ret); + + return ret; +} + +function removeFunction(index) { + functionsInTableMap.delete(wasmTable.get(index)); + freeTableIndexes.push(index); +} + +// 'sig' parameter is required for the llvm backend but only when func is not +// already a WebAssembly function. +function addFunction(func, sig) { + + return addFunctionWasm(func, sig); +} + +// end include: runtime_functions.js +// include: runtime_debug.js + + +// end include: runtime_debug.js +function makeBigInt(low, high, unsigned) { + return unsigned ? ((+((low>>>0)))+((+((high>>>0)))*4294967296.0)) : ((+((low>>>0)))+((+((high|0)))*4294967296.0)); +} + +var tempRet0 = 0; + +var setTempRet0 = function(value) { + tempRet0 = value; +}; + +var getTempRet0 = function() { + return tempRet0; +}; + + + +// === Preamble library stuff === + +// Documentation for the public APIs defined in this file must be updated in: +// site/source/docs/api_reference/preamble.js.rst +// A prebuilt local version of the documentation is available at: +// site/build/text/docs/api_reference/preamble.js.txt +// You can also build docs locally as HTML or other formats in site/ +// An online HTML version (which may be of a different version of Emscripten) +// is up at http://kripken.github.io/emscripten-site/docs/api_reference/preamble.js.html + +var wasmBinary; +if (Module['wasmBinary']) wasmBinary = Module['wasmBinary']; +var noExitRuntime = Module['noExitRuntime'] || true; + +if (typeof WebAssembly !== 'object') { + abort('no native wasm support detected'); +} + +// include: runtime_safe_heap.js + + +// In MINIMAL_RUNTIME, setValue() and getValue() are only available when building with safe heap enabled, for heap safety checking. +// In traditional runtime, setValue() and getValue() are always available (although their use is highly discouraged due to perf penalties) + +/** @param {number} ptr + @param {number} value + @param {string} type + @param {number|boolean=} noSafe */ +function setValue(ptr, value, type, noSafe) { + type = type || 'i8'; + if (type.charAt(type.length-1) === '*') type = 'i32'; // pointers are 32-bit + switch (type) { + case 'i1': HEAP8[((ptr)>>0)] = value; break; + case 'i8': HEAP8[((ptr)>>0)] = value; break; + case 'i16': HEAP16[((ptr)>>1)] = value; break; + case 'i32': HEAP32[((ptr)>>2)] = value; break; + case 'i64': (tempI64 = [value>>>0,(tempDouble=value,(+(Math.abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? ((Math.min((+(Math.floor((tempDouble)/4294967296.0))), 4294967295.0))|0)>>>0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)],HEAP32[((ptr)>>2)] = tempI64[0],HEAP32[(((ptr)+(4))>>2)] = tempI64[1]); break; + case 'float': HEAPF32[((ptr)>>2)] = value; break; + case 'double': HEAPF64[((ptr)>>3)] = value; break; + default: abort('invalid type for setValue: ' + type); + } +} + +/** @param {number} ptr + @param {string} type + @param {number|boolean=} noSafe */ +function getValue(ptr, type, noSafe) { + type = type || 'i8'; + if (type.charAt(type.length-1) === '*') type = 'i32'; // pointers are 32-bit + switch (type) { + case 'i1': return HEAP8[((ptr)>>0)]; + case 'i8': return HEAP8[((ptr)>>0)]; + case 'i16': return HEAP16[((ptr)>>1)]; + case 'i32': return HEAP32[((ptr)>>2)]; + case 'i64': return HEAP32[((ptr)>>2)]; + case 'float': return HEAPF32[((ptr)>>2)]; + case 'double': return HEAPF64[((ptr)>>3)]; + default: abort('invalid type for getValue: ' + type); + } + return null; +} + +// end include: runtime_safe_heap.js +// Wasm globals + +var wasmMemory; + +//======================================== +// Runtime essentials +//======================================== + +// whether we are quitting the application. no code should run after this. +// set in exit() and abort() +var ABORT = false; + +// set by exit() and abort(). Passed to 'onExit' handler. +// NOTE: This is also used as the process return code code in shell environments +// but only when noExitRuntime is false. +var EXITSTATUS; + +/** @type {function(*, string=)} */ +function assert(condition, text) { + if (!condition) { + abort('Assertion failed: ' + text); + } +} + +// Returns the C function with a specified identifier (for C++, you need to do manual name mangling) +function getCFunc(ident) { + var func = Module['_' + ident]; // closure exported function + assert(func, 'Cannot call unknown function ' + ident + ', make sure it is exported'); + return func; +} + +// C calling interface. +/** @param {string|null=} returnType + @param {Array=} argTypes + @param {Arguments|Array=} args + @param {Object=} opts */ +function ccall(ident, returnType, argTypes, args, opts) { + // For fast lookup of conversion functions + var toC = { + 'string': function(str) { + var ret = 0; + if (str !== null && str !== undefined && str !== 0) { // null string + // at most 4 bytes per UTF-8 code point, +1 for the trailing '\0' + var len = (str.length << 2) + 1; + ret = stackAlloc(len); + stringToUTF8(str, ret, len); + } + return ret; + }, + 'array': function(arr) { + var ret = stackAlloc(arr.length); + writeArrayToMemory(arr, ret); + return ret; + } + }; + + function convertReturnValue(ret) { + if (returnType === 'string') return UTF8ToString(ret); + if (returnType === 'boolean') return Boolean(ret); + return ret; + } + + var func = getCFunc(ident); + var cArgs = []; + var stack = 0; + if (args) { + for (var i = 0; i < args.length; i++) { + var converter = toC[argTypes[i]]; + if (converter) { + if (stack === 0) stack = stackSave(); + cArgs[i] = converter(args[i]); + } else { + cArgs[i] = args[i]; + } + } + } + var ret = func.apply(null, cArgs); + + ret = convertReturnValue(ret); + if (stack !== 0) stackRestore(stack); + return ret; +} + +/** @param {string=} returnType + @param {Array=} argTypes + @param {Object=} opts */ +function cwrap(ident, returnType, argTypes, opts) { + argTypes = argTypes || []; + // When the function takes numbers and returns a number, we can just return + // the original function + var numericArgs = argTypes.every(function(type){ return type === 'number'}); + var numericRet = returnType !== 'string'; + if (numericRet && numericArgs && !opts) { + return getCFunc(ident); + } + return function() { + return ccall(ident, returnType, argTypes, arguments, opts); + } +} + +var ALLOC_NORMAL = 0; // Tries to use _malloc() +var ALLOC_STACK = 1; // Lives for the duration of the current function call + +// allocate(): This is for internal use. You can use it yourself as well, but the interface +// is a little tricky (see docs right below). The reason is that it is optimized +// for multiple syntaxes to save space in generated code. So you should +// normally not use allocate(), and instead allocate memory using _malloc(), +// initialize it with setValue(), and so forth. +// @slab: An array of data. +// @allocator: How to allocate memory, see ALLOC_* +/** @type {function((Uint8Array|Array), number)} */ +function allocate(slab, allocator) { + var ret; + + if (allocator == ALLOC_STACK) { + ret = stackAlloc(slab.length); + } else { + ret = _malloc(slab.length); + } + + if (slab.subarray || slab.slice) { + HEAPU8.set(/** @type {!Uint8Array} */(slab), ret); + } else { + HEAPU8.set(new Uint8Array(slab), ret); + } + return ret; +} + +// include: runtime_strings.js + + +// runtime_strings.js: Strings related runtime functions that are part of both MINIMAL_RUNTIME and regular runtime. + +// Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the given array that contains uint8 values, returns +// a copy of that string as a Javascript String object. + +var UTF8Decoder = typeof TextDecoder !== 'undefined' ? new TextDecoder('utf8') : undefined; + +/** + * @param {number} idx + * @param {number=} maxBytesToRead + * @return {string} + */ +function UTF8ArrayToString(heap, idx, maxBytesToRead) { + var endIdx = idx + maxBytesToRead; + var endPtr = idx; + // TextDecoder needs to know the byte length in advance, it doesn't stop on null terminator by itself. + // Also, use the length info to avoid running tiny strings through TextDecoder, since .subarray() allocates garbage. + // (As a tiny code save trick, compare endPtr against endIdx using a negation, so that undefined means Infinity) + while (heap[endPtr] && !(endPtr >= endIdx)) ++endPtr; + + if (endPtr - idx > 16 && heap.subarray && UTF8Decoder) { + return UTF8Decoder.decode(heap.subarray(idx, endPtr)); + } else { + var str = ''; + // If building with TextDecoder, we have already computed the string length above, so test loop end condition against that + while (idx < endPtr) { + // For UTF8 byte structure, see: + // http://en.wikipedia.org/wiki/UTF-8#Description + // https://www.ietf.org/rfc/rfc2279.txt + // https://tools.ietf.org/html/rfc3629 + var u0 = heap[idx++]; + if (!(u0 & 0x80)) { str += String.fromCharCode(u0); continue; } + var u1 = heap[idx++] & 63; + if ((u0 & 0xE0) == 0xC0) { str += String.fromCharCode(((u0 & 31) << 6) | u1); continue; } + var u2 = heap[idx++] & 63; + if ((u0 & 0xF0) == 0xE0) { + u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; + } else { + u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (heap[idx++] & 63); + } + + if (u0 < 0x10000) { + str += String.fromCharCode(u0); + } else { + var ch = u0 - 0x10000; + str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF)); + } + } + } + return str; +} + +// Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the emscripten HEAP, returns a +// copy of that string as a Javascript String object. +// maxBytesToRead: an optional length that specifies the maximum number of bytes to read. You can omit +// this parameter to scan the string until the first \0 byte. If maxBytesToRead is +// passed, and the string at [ptr, ptr+maxBytesToReadr[ contains a null byte in the +// middle, then the string will cut short at that byte index (i.e. maxBytesToRead will +// not produce a string of exact length [ptr, ptr+maxBytesToRead[) +// N.B. mixing frequent uses of UTF8ToString() with and without maxBytesToRead may +// throw JS JIT optimizations off, so it is worth to consider consistently using one +// style or the other. +/** + * @param {number} ptr + * @param {number=} maxBytesToRead + * @return {string} + */ +function UTF8ToString(ptr, maxBytesToRead) { + return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ''; +} + +// Copies the given Javascript String object 'str' to the given byte array at address 'outIdx', +// encoded in UTF8 form and null-terminated. The copy will require at most str.length*4+1 bytes of space in the HEAP. +// Use the function lengthBytesUTF8 to compute the exact number of bytes (excluding null terminator) that this function will write. +// Parameters: +// str: the Javascript string to copy. +// heap: the array to copy to. Each index in this array is assumed to be one 8-byte element. +// outIdx: The starting offset in the array to begin the copying. +// maxBytesToWrite: The maximum number of bytes this function can write to the array. +// This count should include the null terminator, +// i.e. if maxBytesToWrite=1, only the null terminator will be written and nothing else. +// maxBytesToWrite=0 does not write any bytes to the output, not even the null terminator. +// Returns the number of bytes written, EXCLUDING the null terminator. + +function stringToUTF8Array(str, heap, outIdx, maxBytesToWrite) { + if (!(maxBytesToWrite > 0)) // Parameter maxBytesToWrite is not optional. Negative values, 0, null, undefined and false each don't write out any bytes. + return 0; + + var startIdx = outIdx; + var endIdx = outIdx + maxBytesToWrite - 1; // -1 for string null terminator. + for (var i = 0; i < str.length; ++i) { + // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! So decode UTF16->UTF32->UTF8. + // See http://unicode.org/faq/utf_bom.html#utf16-3 + // For UTF8 byte structure, see http://en.wikipedia.org/wiki/UTF-8#Description and https://www.ietf.org/rfc/rfc2279.txt and https://tools.ietf.org/html/rfc3629 + var u = str.charCodeAt(i); // possibly a lead surrogate + if (u >= 0xD800 && u <= 0xDFFF) { + var u1 = str.charCodeAt(++i); + u = 0x10000 + ((u & 0x3FF) << 10) | (u1 & 0x3FF); + } + if (u <= 0x7F) { + if (outIdx >= endIdx) break; + heap[outIdx++] = u; + } else if (u <= 0x7FF) { + if (outIdx + 1 >= endIdx) break; + heap[outIdx++] = 0xC0 | (u >> 6); + heap[outIdx++] = 0x80 | (u & 63); + } else if (u <= 0xFFFF) { + if (outIdx + 2 >= endIdx) break; + heap[outIdx++] = 0xE0 | (u >> 12); + heap[outIdx++] = 0x80 | ((u >> 6) & 63); + heap[outIdx++] = 0x80 | (u & 63); + } else { + if (outIdx + 3 >= endIdx) break; + heap[outIdx++] = 0xF0 | (u >> 18); + heap[outIdx++] = 0x80 | ((u >> 12) & 63); + heap[outIdx++] = 0x80 | ((u >> 6) & 63); + heap[outIdx++] = 0x80 | (u & 63); + } + } + // Null-terminate the pointer to the buffer. + heap[outIdx] = 0; + return outIdx - startIdx; +} + +// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', +// null-terminated and encoded in UTF8 form. The copy will require at most str.length*4+1 bytes of space in the HEAP. +// Use the function lengthBytesUTF8 to compute the exact number of bytes (excluding null terminator) that this function will write. +// Returns the number of bytes written, EXCLUDING the null terminator. + +function stringToUTF8(str, outPtr, maxBytesToWrite) { + return stringToUTF8Array(str, HEAPU8,outPtr, maxBytesToWrite); +} + +// Returns the number of bytes the given Javascript string takes if encoded as a UTF8 byte array, EXCLUDING the null terminator byte. +function lengthBytesUTF8(str) { + var len = 0; + for (var i = 0; i < str.length; ++i) { + // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! So decode UTF16->UTF32->UTF8. + // See http://unicode.org/faq/utf_bom.html#utf16-3 + var u = str.charCodeAt(i); // possibly a lead surrogate + if (u >= 0xD800 && u <= 0xDFFF) u = 0x10000 + ((u & 0x3FF) << 10) | (str.charCodeAt(++i) & 0x3FF); + if (u <= 0x7F) ++len; + else if (u <= 0x7FF) len += 2; + else if (u <= 0xFFFF) len += 3; + else len += 4; + } + return len; +} + +// end include: runtime_strings.js +// include: runtime_strings_extra.js + + +// runtime_strings_extra.js: Strings related runtime functions that are available only in regular runtime. + +// Given a pointer 'ptr' to a null-terminated ASCII-encoded string in the emscripten HEAP, returns +// a copy of that string as a Javascript String object. + +function AsciiToString(ptr) { + var str = ''; + while (1) { + var ch = HEAPU8[((ptr++)>>0)]; + if (!ch) return str; + str += String.fromCharCode(ch); + } +} + +// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', +// null-terminated and encoded in ASCII form. The copy will require at most str.length+1 bytes of space in the HEAP. + +function stringToAscii(str, outPtr) { + return writeAsciiToMemory(str, outPtr, false); +} + +// Given a pointer 'ptr' to a null-terminated UTF16LE-encoded string in the emscripten HEAP, returns +// a copy of that string as a Javascript String object. + +var UTF16Decoder = typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-16le') : undefined; + +function UTF16ToString(ptr, maxBytesToRead) { + var endPtr = ptr; + // TextDecoder needs to know the byte length in advance, it doesn't stop on null terminator by itself. + // Also, use the length info to avoid running tiny strings through TextDecoder, since .subarray() allocates garbage. + var idx = endPtr >> 1; + var maxIdx = idx + maxBytesToRead / 2; + // If maxBytesToRead is not passed explicitly, it will be undefined, and this + // will always evaluate to true. This saves on code size. + while (!(idx >= maxIdx) && HEAPU16[idx]) ++idx; + endPtr = idx << 1; + + if (endPtr - ptr > 32 && UTF16Decoder) { + return UTF16Decoder.decode(HEAPU8.subarray(ptr, endPtr)); + } else { + var str = ''; + + // If maxBytesToRead is not passed explicitly, it will be undefined, and the for-loop's condition + // will always evaluate to true. The loop is then terminated on the first null char. + for (var i = 0; !(i >= maxBytesToRead / 2); ++i) { + var codeUnit = HEAP16[(((ptr)+(i*2))>>1)]; + if (codeUnit == 0) break; + // fromCharCode constructs a character from a UTF-16 code unit, so we can pass the UTF16 string right through. + str += String.fromCharCode(codeUnit); + } + + return str; + } +} + +// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', +// null-terminated and encoded in UTF16 form. The copy will require at most str.length*4+2 bytes of space in the HEAP. +// Use the function lengthBytesUTF16() to compute the exact number of bytes (excluding null terminator) that this function will write. +// Parameters: +// str: the Javascript string to copy. +// outPtr: Byte address in Emscripten HEAP where to write the string to. +// maxBytesToWrite: The maximum number of bytes this function can write to the array. This count should include the null +// terminator, i.e. if maxBytesToWrite=2, only the null terminator will be written and nothing else. +// maxBytesToWrite<2 does not write any bytes to the output, not even the null terminator. +// Returns the number of bytes written, EXCLUDING the null terminator. + +function stringToUTF16(str, outPtr, maxBytesToWrite) { + // Backwards compatibility: if max bytes is not specified, assume unsafe unbounded write is allowed. + if (maxBytesToWrite === undefined) { + maxBytesToWrite = 0x7FFFFFFF; + } + if (maxBytesToWrite < 2) return 0; + maxBytesToWrite -= 2; // Null terminator. + var startPtr = outPtr; + var numCharsToWrite = (maxBytesToWrite < str.length*2) ? (maxBytesToWrite / 2) : str.length; + for (var i = 0; i < numCharsToWrite; ++i) { + // charCodeAt returns a UTF-16 encoded code unit, so it can be directly written to the HEAP. + var codeUnit = str.charCodeAt(i); // possibly a lead surrogate + HEAP16[((outPtr)>>1)] = codeUnit; + outPtr += 2; + } + // Null-terminate the pointer to the HEAP. + HEAP16[((outPtr)>>1)] = 0; + return outPtr - startPtr; +} + +// Returns the number of bytes the given Javascript string takes if encoded as a UTF16 byte array, EXCLUDING the null terminator byte. + +function lengthBytesUTF16(str) { + return str.length*2; +} + +function UTF32ToString(ptr, maxBytesToRead) { + var i = 0; + + var str = ''; + // If maxBytesToRead is not passed explicitly, it will be undefined, and this + // will always evaluate to true. This saves on code size. + while (!(i >= maxBytesToRead / 4)) { + var utf32 = HEAP32[(((ptr)+(i*4))>>2)]; + if (utf32 == 0) break; + ++i; + // Gotcha: fromCharCode constructs a character from a UTF-16 encoded code (pair), not from a Unicode code point! So encode the code point to UTF-16 for constructing. + // See http://unicode.org/faq/utf_bom.html#utf16-3 + if (utf32 >= 0x10000) { + var ch = utf32 - 0x10000; + str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF)); + } else { + str += String.fromCharCode(utf32); + } + } + return str; +} + +// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', +// null-terminated and encoded in UTF32 form. The copy will require at most str.length*4+4 bytes of space in the HEAP. +// Use the function lengthBytesUTF32() to compute the exact number of bytes (excluding null terminator) that this function will write. +// Parameters: +// str: the Javascript string to copy. +// outPtr: Byte address in Emscripten HEAP where to write the string to. +// maxBytesToWrite: The maximum number of bytes this function can write to the array. This count should include the null +// terminator, i.e. if maxBytesToWrite=4, only the null terminator will be written and nothing else. +// maxBytesToWrite<4 does not write any bytes to the output, not even the null terminator. +// Returns the number of bytes written, EXCLUDING the null terminator. + +function stringToUTF32(str, outPtr, maxBytesToWrite) { + // Backwards compatibility: if max bytes is not specified, assume unsafe unbounded write is allowed. + if (maxBytesToWrite === undefined) { + maxBytesToWrite = 0x7FFFFFFF; + } + if (maxBytesToWrite < 4) return 0; + var startPtr = outPtr; + var endPtr = startPtr + maxBytesToWrite - 4; + for (var i = 0; i < str.length; ++i) { + // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! We must decode the string to UTF-32 to the heap. + // See http://unicode.org/faq/utf_bom.html#utf16-3 + var codeUnit = str.charCodeAt(i); // possibly a lead surrogate + if (codeUnit >= 0xD800 && codeUnit <= 0xDFFF) { + var trailSurrogate = str.charCodeAt(++i); + codeUnit = 0x10000 + ((codeUnit & 0x3FF) << 10) | (trailSurrogate & 0x3FF); + } + HEAP32[((outPtr)>>2)] = codeUnit; + outPtr += 4; + if (outPtr + 4 > endPtr) break; + } + // Null-terminate the pointer to the HEAP. + HEAP32[((outPtr)>>2)] = 0; + return outPtr - startPtr; +} + +// Returns the number of bytes the given Javascript string takes if encoded as a UTF16 byte array, EXCLUDING the null terminator byte. + +function lengthBytesUTF32(str) { + var len = 0; + for (var i = 0; i < str.length; ++i) { + // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! We must decode the string to UTF-32 to the heap. + // See http://unicode.org/faq/utf_bom.html#utf16-3 + var codeUnit = str.charCodeAt(i); + if (codeUnit >= 0xD800 && codeUnit <= 0xDFFF) ++i; // possibly a lead surrogate, so skip over the tail surrogate. + len += 4; + } + + return len; +} + +// Allocate heap space for a JS string, and write it there. +// It is the responsibility of the caller to free() that memory. +function allocateUTF8(str) { + var size = lengthBytesUTF8(str) + 1; + var ret = _malloc(size); + if (ret) stringToUTF8Array(str, HEAP8, ret, size); + return ret; +} + +// Allocate stack space for a JS string, and write it there. +function allocateUTF8OnStack(str) { + var size = lengthBytesUTF8(str) + 1; + var ret = stackAlloc(size); + stringToUTF8Array(str, HEAP8, ret, size); + return ret; +} + +// Deprecated: This function should not be called because it is unsafe and does not provide +// a maximum length limit of how many bytes it is allowed to write. Prefer calling the +// function stringToUTF8Array() instead, which takes in a maximum length that can be used +// to be secure from out of bounds writes. +/** @deprecated + @param {boolean=} dontAddNull */ +function writeStringToMemory(string, buffer, dontAddNull) { + warnOnce('writeStringToMemory is deprecated and should not be called! Use stringToUTF8() instead!'); + + var /** @type {number} */ lastChar, /** @type {number} */ end; + if (dontAddNull) { + // stringToUTF8Array always appends null. If we don't want to do that, remember the + // character that existed at the location where the null will be placed, and restore + // that after the write (below). + end = buffer + lengthBytesUTF8(string); + lastChar = HEAP8[end]; + } + stringToUTF8(string, buffer, Infinity); + if (dontAddNull) HEAP8[end] = lastChar; // Restore the value under the null character. +} + +function writeArrayToMemory(array, buffer) { + HEAP8.set(array, buffer); +} + +/** @param {boolean=} dontAddNull */ +function writeAsciiToMemory(str, buffer, dontAddNull) { + for (var i = 0; i < str.length; ++i) { + HEAP8[((buffer++)>>0)] = str.charCodeAt(i); + } + // Null-terminate the pointer to the HEAP. + if (!dontAddNull) HEAP8[((buffer)>>0)] = 0; +} + +// end include: runtime_strings_extra.js +// Memory management + +function alignUp(x, multiple) { + if (x % multiple > 0) { + x += multiple - (x % multiple); + } + return x; +} + +var HEAP, +/** @type {ArrayBuffer} */ + buffer, +/** @type {Int8Array} */ + HEAP8, +/** @type {Uint8Array} */ + HEAPU8, +/** @type {Int16Array} */ + HEAP16, +/** @type {Uint16Array} */ + HEAPU16, +/** @type {Int32Array} */ + HEAP32, +/** @type {Uint32Array} */ + HEAPU32, +/** @type {Float32Array} */ + HEAPF32, +/** @type {Float64Array} */ + HEAPF64; + +function updateGlobalBufferAndViews(buf) { + buffer = buf; + Module['HEAP8'] = HEAP8 = new Int8Array(buf); + Module['HEAP16'] = HEAP16 = new Int16Array(buf); + Module['HEAP32'] = HEAP32 = new Int32Array(buf); + Module['HEAPU8'] = HEAPU8 = new Uint8Array(buf); + Module['HEAPU16'] = HEAPU16 = new Uint16Array(buf); + Module['HEAPU32'] = HEAPU32 = new Uint32Array(buf); + Module['HEAPF32'] = HEAPF32 = new Float32Array(buf); + Module['HEAPF64'] = HEAPF64 = new Float64Array(buf); +} + +var TOTAL_STACK = 5242880; + +var INITIAL_MEMORY = Module['INITIAL_MEMORY'] || 16777216; + +// include: runtime_init_table.js +// In regular non-RELOCATABLE mode the table is exported +// from the wasm module and this will be assigned once +// the exports are available. +var wasmTable; + +// end include: runtime_init_table.js +// include: runtime_stack_check.js + + +// end include: runtime_stack_check.js +// include: runtime_assertions.js + + +// end include: runtime_assertions.js +var __ATPRERUN__ = []; // functions called before the runtime is initialized +var __ATINIT__ = []; // functions called during startup +var __ATMAIN__ = []; // functions called when main() is to be run +var __ATEXIT__ = []; // functions called during shutdown +var __ATPOSTRUN__ = []; // functions called after the main() is called + +var runtimeInitialized = false; +var runtimeExited = false; + +function preRun() { + + if (Module['preRun']) { + if (typeof Module['preRun'] == 'function') Module['preRun'] = [Module['preRun']]; + while (Module['preRun'].length) { + addOnPreRun(Module['preRun'].shift()); + } + } + + callRuntimeCallbacks(__ATPRERUN__); +} + +function initRuntime() { + runtimeInitialized = true; + + if (!Module["noFSInit"] && !FS.init.initialized) FS.init(); +TTY.init(); + callRuntimeCallbacks(__ATINIT__); +} + +function preMain() { + FS.ignorePermissions = false; + callRuntimeCallbacks(__ATMAIN__); +} + +function exitRuntime() { + runtimeExited = true; +} + +function postRun() { + + if (Module['postRun']) { + if (typeof Module['postRun'] == 'function') Module['postRun'] = [Module['postRun']]; + while (Module['postRun'].length) { + addOnPostRun(Module['postRun'].shift()); + } + } + + callRuntimeCallbacks(__ATPOSTRUN__); +} + +function addOnPreRun(cb) { + __ATPRERUN__.unshift(cb); +} + +function addOnInit(cb) { + __ATINIT__.unshift(cb); +} + +function addOnPreMain(cb) { + __ATMAIN__.unshift(cb); +} + +function addOnExit(cb) { +} + +function addOnPostRun(cb) { + __ATPOSTRUN__.unshift(cb); +} + +// include: runtime_math.js + + +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/imul + +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/fround + +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/clz32 + +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/trunc + +// end include: runtime_math.js +// A counter of dependencies for calling run(). If we need to +// do asynchronous work before running, increment this and +// decrement it. Incrementing must happen in a place like +// Module.preRun (used by emcc to add file preloading). +// Note that you can add dependencies in preRun, even though +// it happens right before run - run will be postponed until +// the dependencies are met. +var runDependencies = 0; +var runDependencyWatcher = null; +var dependenciesFulfilled = null; // overridden to take different actions when all run dependencies are fulfilled + +function getUniqueRunDependency(id) { + return id; +} + +function addRunDependency(id) { + runDependencies++; + + if (Module['monitorRunDependencies']) { + Module['monitorRunDependencies'](runDependencies); + } + +} + +function removeRunDependency(id) { + runDependencies--; + + if (Module['monitorRunDependencies']) { + Module['monitorRunDependencies'](runDependencies); + } + + if (runDependencies == 0) { + if (runDependencyWatcher !== null) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + } + if (dependenciesFulfilled) { + var callback = dependenciesFulfilled; + dependenciesFulfilled = null; + callback(); // can add another dependenciesFulfilled + } + } +} + +Module["preloadedImages"] = {}; // maps url to image data +Module["preloadedAudios"] = {}; // maps url to audio data + +/** @param {string|number=} what */ +function abort(what) { + if (Module['onAbort']) { + Module['onAbort'](what); + } + + what += ''; + err(what); + + ABORT = true; + EXITSTATUS = 1; + + what = 'abort(' + what + '). Build with -s ASSERTIONS=1 for more info.'; + + // Use a wasm runtime error, because a JS error might be seen as a foreign + // exception, which means we'd run destructors on it. We need the error to + // simply make the program stop. + var e = new WebAssembly.RuntimeError(what); + + readyPromiseReject(e); + // Throw the error whether or not MODULARIZE is set because abort is used + // in code paths apart from instantiation where an exception is expected + // to be thrown when abort is called. + throw e; +} + +// {{MEM_INITIALIZER}} + +// include: memoryprofiler.js + + +// end include: memoryprofiler.js +// include: URIUtils.js + + +function hasPrefix(str, prefix) { + return String.prototype.startsWith ? + str.startsWith(prefix) : + str.indexOf(prefix) === 0; +} + +// Prefix of data URIs emitted by SINGLE_FILE and related options. +var dataURIPrefix = 'data:application/octet-stream;base64,'; + +// Indicates whether filename is a base64 data URI. +function isDataURI(filename) { + return hasPrefix(filename, dataURIPrefix); +} + +var fileURIPrefix = "file://"; + +// Indicates whether filename is delivered via file protocol (as opposed to http/https) +function isFileURI(filename) { + return hasPrefix(filename, fileURIPrefix); +} + +// end include: URIUtils.js +var wasmBinaryFile = 'wdecryptor.wasm'; +if (!isDataURI(wasmBinaryFile)) { + wasmBinaryFile = locateFile(wasmBinaryFile); +} + +function getBinary(file) { + try { + if (file == wasmBinaryFile && wasmBinary) { + return new Uint8Array(wasmBinary); + } + if (readBinary) { + return readBinary(file); + } else { + throw "both async and sync fetching of the wasm failed"; + } + } + catch (err) { + abort(err); + } +} + +function getBinaryPromise() { + // If we don't have the binary yet, try to to load it asynchronously. + // Fetch has some additional restrictions over XHR, like it can't be used on a file:// url. + // See https://github.com/github/fetch/pull/92#issuecomment-140665932 + // Cordova or Electron apps are typically loaded from a file:// url. + // So use fetch if it is available and the url is not a file, otherwise fall back to XHR. + if (!wasmBinary && (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER)) { + if (typeof fetch === 'function' + && !isFileURI(wasmBinaryFile) + ) { + return fetch(wasmBinaryFile, { credentials: 'same-origin' }).then(function(response) { + if (!response['ok']) { + throw "failed to load wasm binary file at '" + wasmBinaryFile + "'"; + } + return response['arrayBuffer'](); + }).catch(function () { + return getBinary(wasmBinaryFile); + }); + } + else { + if (readAsync) { + // fetch is not available or url is file => try XHR (readAsync uses XHR internally) + return new Promise(function(resolve, reject) { + readAsync(wasmBinaryFile, function(response) { resolve(new Uint8Array(/** @type{!ArrayBuffer} */(response))) }, reject) + }); + } + } + } + + // Otherwise, getBinary should be able to get it synchronously + return Promise.resolve().then(function() { return getBinary(wasmBinaryFile); }); +} + +// Create the wasm instance. +// Receives the wasm imports, returns the exports. +function createWasm() { + // prepare imports + var info = { + 'env': asmLibraryArg, + 'wasi_snapshot_preview1': asmLibraryArg, + }; + // Load the wasm module and create an instance of using native support in the JS engine. + // handle a generated wasm instance, receiving its exports and + // performing other necessary setup + /** @param {WebAssembly.Module=} module*/ + function receiveInstance(instance, module) { + var exports = instance.exports; + + Module['asm'] = exports; + + wasmMemory = Module['asm']['memory']; + updateGlobalBufferAndViews(wasmMemory.buffer); + + wasmTable = Module['asm']['__indirect_function_table']; + + addOnInit(Module['asm']['__wasm_call_ctors']); + + removeRunDependency('wasm-instantiate'); + } + // we can't run yet (except in a pthread, where we have a custom sync instantiator) + addRunDependency('wasm-instantiate'); + + function receiveInstantiatedSource(output) { + // 'output' is a WebAssemblyInstantiatedSource object which has both the module and instance. + // receiveInstance() will swap in the exports (to Module.asm) so they can be called + // TODO: Due to Closure regression https://github.com/google/closure-compiler/issues/3193, the above line no longer optimizes out down to the following line. + // When the regression is fixed, can restore the above USE_PTHREADS-enabled path. + receiveInstance(output['instance']); + } + + function instantiateArrayBuffer(receiver) { + return getBinaryPromise().then(function(binary) { + var result = WebAssembly.instantiate(binary, info); + return result; + }).then(receiver, function(reason) { + err('failed to asynchronously prepare wasm: ' + reason); + + abort(reason); + }); + } + + // Prefer streaming instantiation if available. + function instantiateAsync() { + if (!wasmBinary && + typeof WebAssembly.instantiateStreaming === 'function' && + !isDataURI(wasmBinaryFile) && + // Don't use streaming for file:// delivered objects in a webview, fetch them synchronously. + !isFileURI(wasmBinaryFile) && + typeof fetch === 'function') { + return fetch(wasmBinaryFile, { credentials: 'same-origin' }).then(function (response) { + var result = WebAssembly.instantiateStreaming(response, info); + return result.then(receiveInstantiatedSource, function(reason) { + // We expect the most common failure cause to be a bad MIME type for the binary, + // in which case falling back to ArrayBuffer instantiation should work. + err('wasm streaming compile failed: ' + reason); + err('falling back to ArrayBuffer instantiation'); + return instantiateArrayBuffer(receiveInstantiatedSource); + }); + }); + } else { + return instantiateArrayBuffer(receiveInstantiatedSource); + } + } + + // User shell pages can write their own Module.instantiateWasm = function(imports, successCallback) callback + // to manually instantiate the Wasm module themselves. This allows pages to run the instantiation parallel + // to any other async startup actions they are performing. + if (Module['instantiateWasm']) { + try { + var exports = Module['instantiateWasm'](info, receiveInstance); + return exports; + } catch(e) { + err('Module.instantiateWasm callback failed with error: ' + e); + return false; + } + } + + // If instantiation fails, reject the module ready promise. + instantiateAsync().catch(readyPromiseReject); + return {}; // no exports yet; we'll fill them in later +} + +// Globals used by JS i64 conversions (see makeSetValue) +var tempDouble; +var tempI64; + +// === Body === + +var ASM_CONSTS = { + +}; + + + + + + + function callRuntimeCallbacks(callbacks) { + while (callbacks.length > 0) { + var callback = callbacks.shift(); + if (typeof callback == 'function') { + callback(Module); // Pass the module as the first argument. + continue; + } + var func = callback.func; + if (typeof func === 'number') { + if (callback.arg === undefined) { + wasmTable.get(func)(); + } else { + wasmTable.get(func)(callback.arg); + } + } else { + func(callback.arg === undefined ? null : callback.arg); + } + } + } + + function demangle(func) { + return func; + } + + function demangleAll(text) { + var regex = + /\b_Z[\w\d_]+/g; + return text.replace(regex, + function(x) { + var y = demangle(x); + return x === y ? x : (y + ' [' + x + ']'); + }); + } + + function jsStackTrace() { + var error = new Error(); + if (!error.stack) { + // IE10+ special cases: It does have callstack info, but it is only populated if an Error object is thrown, + // so try that as a special-case. + try { + throw new Error(); + } catch(e) { + error = e; + } + if (!error.stack) { + return '(no stack trace available)'; + } + } + return error.stack.toString(); + } + + var runtimeKeepaliveCounter=0; + function keepRuntimeAlive() { + return noExitRuntime || runtimeKeepaliveCounter > 0; + } + + function stackTrace() { + var js = jsStackTrace(); + if (Module['extraStackTrace']) js += '\n' + Module['extraStackTrace'](); + return demangleAll(js); + } + + var ExceptionInfoAttrs={DESTRUCTOR_OFFSET:0,REFCOUNT_OFFSET:4,TYPE_OFFSET:8,CAUGHT_OFFSET:12,RETHROWN_OFFSET:13,SIZE:16}; + function ___cxa_allocate_exception(size) { + // Thrown object is prepended by exception metadata block + return _malloc(size + ExceptionInfoAttrs.SIZE) + ExceptionInfoAttrs.SIZE; + } + + function ExceptionInfo(excPtr) { + this.excPtr = excPtr; + this.ptr = excPtr - ExceptionInfoAttrs.SIZE; + + this.set_type = function(type) { + HEAP32[(((this.ptr)+(ExceptionInfoAttrs.TYPE_OFFSET))>>2)] = type; + }; + + this.get_type = function() { + return HEAP32[(((this.ptr)+(ExceptionInfoAttrs.TYPE_OFFSET))>>2)]; + }; + + this.set_destructor = function(destructor) { + HEAP32[(((this.ptr)+(ExceptionInfoAttrs.DESTRUCTOR_OFFSET))>>2)] = destructor; + }; + + this.get_destructor = function() { + return HEAP32[(((this.ptr)+(ExceptionInfoAttrs.DESTRUCTOR_OFFSET))>>2)]; + }; + + this.set_refcount = function(refcount) { + HEAP32[(((this.ptr)+(ExceptionInfoAttrs.REFCOUNT_OFFSET))>>2)] = refcount; + }; + + this.set_caught = function (caught) { + caught = caught ? 1 : 0; + HEAP8[(((this.ptr)+(ExceptionInfoAttrs.CAUGHT_OFFSET))>>0)] = caught; + }; + + this.get_caught = function () { + return HEAP8[(((this.ptr)+(ExceptionInfoAttrs.CAUGHT_OFFSET))>>0)] != 0; + }; + + this.set_rethrown = function (rethrown) { + rethrown = rethrown ? 1 : 0; + HEAP8[(((this.ptr)+(ExceptionInfoAttrs.RETHROWN_OFFSET))>>0)] = rethrown; + }; + + this.get_rethrown = function () { + return HEAP8[(((this.ptr)+(ExceptionInfoAttrs.RETHROWN_OFFSET))>>0)] != 0; + }; + + // Initialize native structure fields. Should be called once after allocated. + this.init = function(type, destructor) { + this.set_type(type); + this.set_destructor(destructor); + this.set_refcount(0); + this.set_caught(false); + this.set_rethrown(false); + } + + this.add_ref = function() { + var value = HEAP32[(((this.ptr)+(ExceptionInfoAttrs.REFCOUNT_OFFSET))>>2)]; + HEAP32[(((this.ptr)+(ExceptionInfoAttrs.REFCOUNT_OFFSET))>>2)] = value + 1; + }; + + // Returns true if last reference released. + this.release_ref = function() { + var prev = HEAP32[(((this.ptr)+(ExceptionInfoAttrs.REFCOUNT_OFFSET))>>2)]; + HEAP32[(((this.ptr)+(ExceptionInfoAttrs.REFCOUNT_OFFSET))>>2)] = prev - 1; + return prev === 1; + }; + } + + var exceptionLast=0; + + var uncaughtExceptionCount=0; + function ___cxa_throw(ptr, type, destructor) { + var info = new ExceptionInfo(ptr); + // Initialize ExceptionInfo content after it was allocated in __cxa_allocate_exception. + info.init(type, destructor); + exceptionLast = ptr; + uncaughtExceptionCount++; + throw ptr; + } + + function setErrNo(value) { + HEAP32[((___errno_location())>>2)] = value; + return value; + } + + var PATH={splitPath:function(filename) { + var splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/; + return splitPathRe.exec(filename).slice(1); + },normalizeArray:function(parts, allowAboveRoot) { + // if the path tries to go above the root, `up` ends up > 0 + var up = 0; + for (var i = parts.length - 1; i >= 0; i--) { + var last = parts[i]; + if (last === '.') { + parts.splice(i, 1); + } else if (last === '..') { + parts.splice(i, 1); + up++; + } else if (up) { + parts.splice(i, 1); + up--; + } + } + // if the path is allowed to go above the root, restore leading ..s + if (allowAboveRoot) { + for (; up; up--) { + parts.unshift('..'); + } + } + return parts; + },normalize:function(path) { + var isAbsolute = path.charAt(0) === '/', + trailingSlash = path.substr(-1) === '/'; + // Normalize the path + path = PATH.normalizeArray(path.split('/').filter(function(p) { + return !!p; + }), !isAbsolute).join('/'); + if (!path && !isAbsolute) { + path = '.'; + } + if (path && trailingSlash) { + path += '/'; + } + return (isAbsolute ? '/' : '') + path; + },dirname:function(path) { + var result = PATH.splitPath(path), + root = result[0], + dir = result[1]; + if (!root && !dir) { + // No dirname whatsoever + return '.'; + } + if (dir) { + // It has a dirname, strip trailing slash + dir = dir.substr(0, dir.length - 1); + } + return root + dir; + },basename:function(path) { + // EMSCRIPTEN return '/'' for '/', not an empty string + if (path === '/') return '/'; + path = PATH.normalize(path); + path = path.replace(/\/$/, ""); + var lastSlash = path.lastIndexOf('/'); + if (lastSlash === -1) return path; + return path.substr(lastSlash+1); + },extname:function(path) { + return PATH.splitPath(path)[3]; + },join:function() { + var paths = Array.prototype.slice.call(arguments, 0); + return PATH.normalize(paths.join('/')); + },join2:function(l, r) { + return PATH.normalize(l + '/' + r); + }}; + + function getRandomDevice() { + if (typeof crypto === 'object' && typeof crypto['getRandomValues'] === 'function') { + // for modern web browsers + var randomBuffer = new Uint8Array(1); + return function() { crypto.getRandomValues(randomBuffer); return randomBuffer[0]; }; + } else + if (ENVIRONMENT_IS_NODE) { + // for nodejs with or without crypto support included + try { + var crypto_module = require('crypto'); + // nodejs has crypto support + return function() { return crypto_module['randomBytes'](1)[0]; }; + } catch (e) { + // nodejs doesn't have crypto support + } + } + // we couldn't find a proper implementation, as Math.random() is not suitable for /dev/random, see emscripten-core/emscripten/pull/7096 + return function() { abort("randomDevice"); }; + } + + var PATH_FS={resolve:function() { + var resolvedPath = '', + resolvedAbsolute = false; + for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) { + var path = (i >= 0) ? arguments[i] : FS.cwd(); + // Skip empty and invalid entries + if (typeof path !== 'string') { + throw new TypeError('Arguments to path.resolve must be strings'); + } else if (!path) { + return ''; // an invalid portion invalidates the whole thing + } + resolvedPath = path + '/' + resolvedPath; + resolvedAbsolute = path.charAt(0) === '/'; + } + // At this point the path should be resolved to a full absolute path, but + // handle relative paths to be safe (might happen when process.cwd() fails) + resolvedPath = PATH.normalizeArray(resolvedPath.split('/').filter(function(p) { + return !!p; + }), !resolvedAbsolute).join('/'); + return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.'; + },relative:function(from, to) { + from = PATH_FS.resolve(from).substr(1); + to = PATH_FS.resolve(to).substr(1); + function trim(arr) { + var start = 0; + for (; start < arr.length; start++) { + if (arr[start] !== '') break; + } + var end = arr.length - 1; + for (; end >= 0; end--) { + if (arr[end] !== '') break; + } + if (start > end) return []; + return arr.slice(start, end - start + 1); + } + var fromParts = trim(from.split('/')); + var toParts = trim(to.split('/')); + var length = Math.min(fromParts.length, toParts.length); + var samePartsLength = length; + for (var i = 0; i < length; i++) { + if (fromParts[i] !== toParts[i]) { + samePartsLength = i; + break; + } + } + var outputParts = []; + for (var i = samePartsLength; i < fromParts.length; i++) { + outputParts.push('..'); + } + outputParts = outputParts.concat(toParts.slice(samePartsLength)); + return outputParts.join('/'); + }}; + + var TTY={ttys:[],init:function () { + // https://github.com/emscripten-core/emscripten/pull/1555 + // if (ENVIRONMENT_IS_NODE) { + // // currently, FS.init does not distinguish if process.stdin is a file or TTY + // // device, it always assumes it's a TTY device. because of this, we're forcing + // // process.stdin to UTF8 encoding to at least make stdin reading compatible + // // with text files until FS.init can be refactored. + // process['stdin']['setEncoding']('utf8'); + // } + },shutdown:function() { + // https://github.com/emscripten-core/emscripten/pull/1555 + // if (ENVIRONMENT_IS_NODE) { + // // inolen: any idea as to why node -e 'process.stdin.read()' wouldn't exit immediately (with process.stdin being a tty)? + // // isaacs: because now it's reading from the stream, you've expressed interest in it, so that read() kicks off a _read() which creates a ReadReq operation + // // inolen: I thought read() in that case was a synchronous operation that just grabbed some amount of buffered data if it exists? + // // isaacs: it is. but it also triggers a _read() call, which calls readStart() on the handle + // // isaacs: do process.stdin.pause() and i'd think it'd probably close the pending call + // process['stdin']['pause'](); + // } + },register:function(dev, ops) { + TTY.ttys[dev] = { input: [], output: [], ops: ops }; + FS.registerDevice(dev, TTY.stream_ops); + },stream_ops:{open:function(stream) { + var tty = TTY.ttys[stream.node.rdev]; + if (!tty) { + throw new FS.ErrnoError(43); + } + stream.tty = tty; + stream.seekable = false; + },close:function(stream) { + // flush any pending line data + stream.tty.ops.flush(stream.tty); + },flush:function(stream) { + stream.tty.ops.flush(stream.tty); + },read:function(stream, buffer, offset, length, pos /* ignored */) { + if (!stream.tty || !stream.tty.ops.get_char) { + throw new FS.ErrnoError(60); + } + var bytesRead = 0; + for (var i = 0; i < length; i++) { + var result; + try { + result = stream.tty.ops.get_char(stream.tty); + } catch (e) { + throw new FS.ErrnoError(29); + } + if (result === undefined && bytesRead === 0) { + throw new FS.ErrnoError(6); + } + if (result === null || result === undefined) break; + bytesRead++; + buffer[offset+i] = result; + } + if (bytesRead) { + stream.node.timestamp = Date.now(); + } + return bytesRead; + },write:function(stream, buffer, offset, length, pos) { + if (!stream.tty || !stream.tty.ops.put_char) { + throw new FS.ErrnoError(60); + } + try { + for (var i = 0; i < length; i++) { + stream.tty.ops.put_char(stream.tty, buffer[offset+i]); + } + } catch (e) { + throw new FS.ErrnoError(29); + } + if (length) { + stream.node.timestamp = Date.now(); + } + return i; + }},default_tty_ops:{get_char:function(tty) { + if (!tty.input.length) { + var result = null; + if (ENVIRONMENT_IS_NODE) { + // we will read data by chunks of BUFSIZE + var BUFSIZE = 256; + var buf = Buffer.alloc ? Buffer.alloc(BUFSIZE) : new Buffer(BUFSIZE); + var bytesRead = 0; + + try { + bytesRead = nodeFS.readSync(process.stdin.fd, buf, 0, BUFSIZE, null); + } catch(e) { + // Cross-platform differences: on Windows, reading EOF throws an exception, but on other OSes, + // reading EOF returns 0. Uniformize behavior by treating the EOF exception to return 0. + if (e.toString().indexOf('EOF') != -1) bytesRead = 0; + else throw e; + } + + if (bytesRead > 0) { + result = buf.slice(0, bytesRead).toString('utf-8'); + } else { + result = null; + } + } else + if (typeof window != 'undefined' && + typeof window.prompt == 'function') { + // Browser. + result = window.prompt('Input: '); // returns null on cancel + if (result !== null) { + result += '\n'; + } + } else if (typeof readline == 'function') { + // Command line. + result = readline(); + if (result !== null) { + result += '\n'; + } + } + if (!result) { + return null; + } + tty.input = intArrayFromString(result, true); + } + return tty.input.shift(); + },put_char:function(tty, val) { + if (val === null || val === 10) { + out(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } else { + if (val != 0) tty.output.push(val); // val == 0 would cut text output off in the middle. + } + },flush:function(tty) { + if (tty.output && tty.output.length > 0) { + out(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } + }},default_tty1_ops:{put_char:function(tty, val) { + if (val === null || val === 10) { + err(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } else { + if (val != 0) tty.output.push(val); + } + },flush:function(tty) { + if (tty.output && tty.output.length > 0) { + err(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } + }}}; + + function mmapAlloc(size) { + var alignedSize = alignMemory(size, 16384); + var ptr = _malloc(alignedSize); + while (size < alignedSize) HEAP8[ptr + size++] = 0; + return ptr; + } + var MEMFS={ops_table:null,mount:function(mount) { + return MEMFS.createNode(null, '/', 16384 | 511 /* 0777 */, 0); + },createNode:function(parent, name, mode, dev) { + if (FS.isBlkdev(mode) || FS.isFIFO(mode)) { + // no supported + throw new FS.ErrnoError(63); + } + if (!MEMFS.ops_table) { + MEMFS.ops_table = { + dir: { + node: { + getattr: MEMFS.node_ops.getattr, + setattr: MEMFS.node_ops.setattr, + lookup: MEMFS.node_ops.lookup, + mknod: MEMFS.node_ops.mknod, + rename: MEMFS.node_ops.rename, + unlink: MEMFS.node_ops.unlink, + rmdir: MEMFS.node_ops.rmdir, + readdir: MEMFS.node_ops.readdir, + symlink: MEMFS.node_ops.symlink + }, + stream: { + llseek: MEMFS.stream_ops.llseek + } + }, + file: { + node: { + getattr: MEMFS.node_ops.getattr, + setattr: MEMFS.node_ops.setattr + }, + stream: { + llseek: MEMFS.stream_ops.llseek, + read: MEMFS.stream_ops.read, + write: MEMFS.stream_ops.write, + allocate: MEMFS.stream_ops.allocate, + mmap: MEMFS.stream_ops.mmap, + msync: MEMFS.stream_ops.msync + } + }, + link: { + node: { + getattr: MEMFS.node_ops.getattr, + setattr: MEMFS.node_ops.setattr, + readlink: MEMFS.node_ops.readlink + }, + stream: {} + }, + chrdev: { + node: { + getattr: MEMFS.node_ops.getattr, + setattr: MEMFS.node_ops.setattr + }, + stream: FS.chrdev_stream_ops + } + }; + } + var node = FS.createNode(parent, name, mode, dev); + if (FS.isDir(node.mode)) { + node.node_ops = MEMFS.ops_table.dir.node; + node.stream_ops = MEMFS.ops_table.dir.stream; + node.contents = {}; + } else if (FS.isFile(node.mode)) { + node.node_ops = MEMFS.ops_table.file.node; + node.stream_ops = MEMFS.ops_table.file.stream; + node.usedBytes = 0; // The actual number of bytes used in the typed array, as opposed to contents.length which gives the whole capacity. + // When the byte data of the file is populated, this will point to either a typed array, or a normal JS array. Typed arrays are preferred + // for performance, and used by default. However, typed arrays are not resizable like normal JS arrays are, so there is a small disk size + // penalty involved for appending file writes that continuously grow a file similar to std::vector capacity vs used -scheme. + node.contents = null; + } else if (FS.isLink(node.mode)) { + node.node_ops = MEMFS.ops_table.link.node; + node.stream_ops = MEMFS.ops_table.link.stream; + } else if (FS.isChrdev(node.mode)) { + node.node_ops = MEMFS.ops_table.chrdev.node; + node.stream_ops = MEMFS.ops_table.chrdev.stream; + } + node.timestamp = Date.now(); + // add the new node to the parent + if (parent) { + parent.contents[name] = node; + parent.timestamp = node.timestamp; + } + return node; + },getFileDataAsTypedArray:function(node) { + if (!node.contents) return new Uint8Array(0); + if (node.contents.subarray) return node.contents.subarray(0, node.usedBytes); // Make sure to not return excess unused bytes. + return new Uint8Array(node.contents); + },expandFileStorage:function(node, newCapacity) { + var prevCapacity = node.contents ? node.contents.length : 0; + if (prevCapacity >= newCapacity) return; // No need to expand, the storage was already large enough. + // Don't expand strictly to the given requested limit if it's only a very small increase, but instead geometrically grow capacity. + // For small filesizes (<1MB), perform size*2 geometric increase, but for large sizes, do a much more conservative size*1.125 increase to + // avoid overshooting the allocation cap by a very large margin. + var CAPACITY_DOUBLING_MAX = 1024 * 1024; + newCapacity = Math.max(newCapacity, (prevCapacity * (prevCapacity < CAPACITY_DOUBLING_MAX ? 2.0 : 1.125)) >>> 0); + if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256); // At minimum allocate 256b for each file when expanding. + var oldContents = node.contents; + node.contents = new Uint8Array(newCapacity); // Allocate new storage. + if (node.usedBytes > 0) node.contents.set(oldContents.subarray(0, node.usedBytes), 0); // Copy old data over to the new storage. + },resizeFileStorage:function(node, newSize) { + if (node.usedBytes == newSize) return; + if (newSize == 0) { + node.contents = null; // Fully decommit when requesting a resize to zero. + node.usedBytes = 0; + } else { + var oldContents = node.contents; + node.contents = new Uint8Array(newSize); // Allocate new storage. + if (oldContents) { + node.contents.set(oldContents.subarray(0, Math.min(newSize, node.usedBytes))); // Copy old data over to the new storage. + } + node.usedBytes = newSize; + } + },node_ops:{getattr:function(node) { + var attr = {}; + // device numbers reuse inode numbers. + attr.dev = FS.isChrdev(node.mode) ? node.id : 1; + attr.ino = node.id; + attr.mode = node.mode; + attr.nlink = 1; + attr.uid = 0; + attr.gid = 0; + attr.rdev = node.rdev; + if (FS.isDir(node.mode)) { + attr.size = 4096; + } else if (FS.isFile(node.mode)) { + attr.size = node.usedBytes; + } else if (FS.isLink(node.mode)) { + attr.size = node.link.length; + } else { + attr.size = 0; + } + attr.atime = new Date(node.timestamp); + attr.mtime = new Date(node.timestamp); + attr.ctime = new Date(node.timestamp); + // NOTE: In our implementation, st_blocks = Math.ceil(st_size/st_blksize), + // but this is not required by the standard. + attr.blksize = 4096; + attr.blocks = Math.ceil(attr.size / attr.blksize); + return attr; + },setattr:function(node, attr) { + if (attr.mode !== undefined) { + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + node.timestamp = attr.timestamp; + } + if (attr.size !== undefined) { + MEMFS.resizeFileStorage(node, attr.size); + } + },lookup:function(parent, name) { + throw FS.genericErrors[44]; + },mknod:function(parent, name, mode, dev) { + return MEMFS.createNode(parent, name, mode, dev); + },rename:function(old_node, new_dir, new_name) { + // if we're overwriting a directory at new_name, make sure it's empty. + if (FS.isDir(old_node.mode)) { + var new_node; + try { + new_node = FS.lookupNode(new_dir, new_name); + } catch (e) { + } + if (new_node) { + for (var i in new_node.contents) { + throw new FS.ErrnoError(55); + } + } + } + // do the internal rewiring + delete old_node.parent.contents[old_node.name]; + old_node.parent.timestamp = Date.now() + old_node.name = new_name; + new_dir.contents[new_name] = old_node; + new_dir.timestamp = old_node.parent.timestamp; + old_node.parent = new_dir; + },unlink:function(parent, name) { + delete parent.contents[name]; + parent.timestamp = Date.now(); + },rmdir:function(parent, name) { + var node = FS.lookupNode(parent, name); + for (var i in node.contents) { + throw new FS.ErrnoError(55); + } + delete parent.contents[name]; + parent.timestamp = Date.now(); + },readdir:function(node) { + var entries = ['.', '..']; + for (var key in node.contents) { + if (!node.contents.hasOwnProperty(key)) { + continue; + } + entries.push(key); + } + return entries; + },symlink:function(parent, newname, oldpath) { + var node = MEMFS.createNode(parent, newname, 511 /* 0777 */ | 40960, 0); + node.link = oldpath; + return node; + },readlink:function(node) { + if (!FS.isLink(node.mode)) { + throw new FS.ErrnoError(28); + } + return node.link; + }},stream_ops:{read:function(stream, buffer, offset, length, position) { + var contents = stream.node.contents; + if (position >= stream.node.usedBytes) return 0; + var size = Math.min(stream.node.usedBytes - position, length); + if (size > 8 && contents.subarray) { // non-trivial, and typed array + buffer.set(contents.subarray(position, position + size), offset); + } else { + for (var i = 0; i < size; i++) buffer[offset + i] = contents[position + i]; + } + return size; + },write:function(stream, buffer, offset, length, position, canOwn) { + + if (!length) return 0; + var node = stream.node; + node.timestamp = Date.now(); + + if (buffer.subarray && (!node.contents || node.contents.subarray)) { // This write is from a typed array to a typed array? + if (canOwn) { + node.contents = buffer.subarray(offset, offset + length); + node.usedBytes = length; + return length; + } else if (node.usedBytes === 0 && position === 0) { // If this is a simple first write to an empty file, do a fast set since we don't need to care about old data. + node.contents = buffer.slice(offset, offset + length); + node.usedBytes = length; + return length; + } else if (position + length <= node.usedBytes) { // Writing to an already allocated and used subrange of the file? + node.contents.set(buffer.subarray(offset, offset + length), position); + return length; + } + } + + // Appending to an existing file and we need to reallocate, or source data did not come as a typed array. + MEMFS.expandFileStorage(node, position+length); + if (node.contents.subarray && buffer.subarray) { + // Use typed array write which is available. + node.contents.set(buffer.subarray(offset, offset + length), position); + } else { + for (var i = 0; i < length; i++) { + node.contents[position + i] = buffer[offset + i]; // Or fall back to manual write if not. + } + } + node.usedBytes = Math.max(node.usedBytes, position + length); + return length; + },llseek:function(stream, offset, whence) { + var position = offset; + if (whence === 1) { + position += stream.position; + } else if (whence === 2) { + if (FS.isFile(stream.node.mode)) { + position += stream.node.usedBytes; + } + } + if (position < 0) { + throw new FS.ErrnoError(28); + } + return position; + },allocate:function(stream, offset, length) { + MEMFS.expandFileStorage(stream.node, offset + length); + stream.node.usedBytes = Math.max(stream.node.usedBytes, offset + length); + },mmap:function(stream, address, length, position, prot, flags) { + if (address !== 0) { + // We don't currently support location hints for the address of the mapping + throw new FS.ErrnoError(28); + } + if (!FS.isFile(stream.node.mode)) { + throw new FS.ErrnoError(43); + } + var ptr; + var allocated; + var contents = stream.node.contents; + // Only make a new copy when MAP_PRIVATE is specified. + if (!(flags & 2) && contents.buffer === buffer) { + // We can't emulate MAP_SHARED when the file is not backed by the buffer + // we're mapping to (e.g. the HEAP buffer). + allocated = false; + ptr = contents.byteOffset; + } else { + // Try to avoid unnecessary slices. + if (position > 0 || position + length < contents.length) { + if (contents.subarray) { + contents = contents.subarray(position, position + length); + } else { + contents = Array.prototype.slice.call(contents, position, position + length); + } + } + allocated = true; + ptr = mmapAlloc(length); + if (!ptr) { + throw new FS.ErrnoError(48); + } + HEAP8.set(contents, ptr); + } + return { ptr: ptr, allocated: allocated }; + },msync:function(stream, buffer, offset, length, mmapFlags) { + if (!FS.isFile(stream.node.mode)) { + throw new FS.ErrnoError(43); + } + if (mmapFlags & 2) { + // MAP_PRIVATE calls need not to be synced back to underlying fs + return 0; + } + + var bytesWritten = MEMFS.stream_ops.write(stream, buffer, 0, length, offset, false); + // should we check if bytesWritten and length are the same? + return 0; + }}}; + var FS={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,trackingDelegate:{},tracking:{openFlags:{READ:1,WRITE:2}},ErrnoError:null,genericErrors:{},filesystems:null,syncFSRequests:0,lookupPath:function(path, opts) { + path = PATH_FS.resolve(FS.cwd(), path); + opts = opts || {}; + + if (!path) return { path: '', node: null }; + + var defaults = { + follow_mount: true, + recurse_count: 0 + }; + for (var key in defaults) { + if (opts[key] === undefined) { + opts[key] = defaults[key]; + } + } + + if (opts.recurse_count > 8) { // max recursive lookup of 8 + throw new FS.ErrnoError(32); + } + + // split the path + var parts = PATH.normalizeArray(path.split('/').filter(function(p) { + return !!p; + }), false); + + // start at the root + var current = FS.root; + var current_path = '/'; + + for (var i = 0; i < parts.length; i++) { + var islast = (i === parts.length-1); + if (islast && opts.parent) { + // stop resolving + break; + } + + current = FS.lookupNode(current, parts[i]); + current_path = PATH.join2(current_path, parts[i]); + + // jump to the mount's root node if this is a mountpoint + if (FS.isMountpoint(current)) { + if (!islast || (islast && opts.follow_mount)) { + current = current.mounted.root; + } + } + + // by default, lookupPath will not follow a symlink if it is the final path component. + // setting opts.follow = true will override this behavior. + if (!islast || opts.follow) { + var count = 0; + while (FS.isLink(current.mode)) { + var link = FS.readlink(current_path); + current_path = PATH_FS.resolve(PATH.dirname(current_path), link); + + var lookup = FS.lookupPath(current_path, { recurse_count: opts.recurse_count }); + current = lookup.node; + + if (count++ > 40) { // limit max consecutive symlinks to 40 (SYMLOOP_MAX). + throw new FS.ErrnoError(32); + } + } + } + } + + return { path: current_path, node: current }; + },getPath:function(node) { + var path; + while (true) { + if (FS.isRoot(node)) { + var mount = node.mount.mountpoint; + if (!path) return mount; + return mount[mount.length-1] !== '/' ? mount + '/' + path : mount + path; + } + path = path ? node.name + '/' + path : node.name; + node = node.parent; + } + },hashName:function(parentid, name) { + var hash = 0; + + for (var i = 0; i < name.length; i++) { + hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0; + } + return ((parentid + hash) >>> 0) % FS.nameTable.length; + },hashAddNode:function(node) { + var hash = FS.hashName(node.parent.id, node.name); + node.name_next = FS.nameTable[hash]; + FS.nameTable[hash] = node; + },hashRemoveNode:function(node) { + var hash = FS.hashName(node.parent.id, node.name); + if (FS.nameTable[hash] === node) { + FS.nameTable[hash] = node.name_next; + } else { + var current = FS.nameTable[hash]; + while (current) { + if (current.name_next === node) { + current.name_next = node.name_next; + break; + } + current = current.name_next; + } + } + },lookupNode:function(parent, name) { + var errCode = FS.mayLookup(parent); + if (errCode) { + throw new FS.ErrnoError(errCode, parent); + } + var hash = FS.hashName(parent.id, name); + for (var node = FS.nameTable[hash]; node; node = node.name_next) { + var nodeName = node.name; + if (node.parent.id === parent.id && nodeName === name) { + return node; + } + } + // if we failed to find it in the cache, call into the VFS + return FS.lookup(parent, name); + },createNode:function(parent, name, mode, rdev) { + var node = new FS.FSNode(parent, name, mode, rdev); + + FS.hashAddNode(node); + + return node; + },destroyNode:function(node) { + FS.hashRemoveNode(node); + },isRoot:function(node) { + return node === node.parent; + },isMountpoint:function(node) { + return !!node.mounted; + },isFile:function(mode) { + return (mode & 61440) === 32768; + },isDir:function(mode) { + return (mode & 61440) === 16384; + },isLink:function(mode) { + return (mode & 61440) === 40960; + },isChrdev:function(mode) { + return (mode & 61440) === 8192; + },isBlkdev:function(mode) { + return (mode & 61440) === 24576; + },isFIFO:function(mode) { + return (mode & 61440) === 4096; + },isSocket:function(mode) { + return (mode & 49152) === 49152; + },flagModes:{"r":0,"r+":2,"w":577,"w+":578,"a":1089,"a+":1090},modeStringToFlags:function(str) { + var flags = FS.flagModes[str]; + if (typeof flags === 'undefined') { + throw new Error('Unknown file open mode: ' + str); + } + return flags; + },flagsToPermissionString:function(flag) { + var perms = ['r', 'w', 'rw'][flag & 3]; + if ((flag & 512)) { + perms += 'w'; + } + return perms; + },nodePermissions:function(node, perms) { + if (FS.ignorePermissions) { + return 0; + } + // return 0 if any user, group or owner bits are set. + if (perms.indexOf('r') !== -1 && !(node.mode & 292)) { + return 2; + } else if (perms.indexOf('w') !== -1 && !(node.mode & 146)) { + return 2; + } else if (perms.indexOf('x') !== -1 && !(node.mode & 73)) { + return 2; + } + return 0; + },mayLookup:function(dir) { + var errCode = FS.nodePermissions(dir, 'x'); + if (errCode) return errCode; + if (!dir.node_ops.lookup) return 2; + return 0; + },mayCreate:function(dir, name) { + try { + var node = FS.lookupNode(dir, name); + return 20; + } catch (e) { + } + return FS.nodePermissions(dir, 'wx'); + },mayDelete:function(dir, name, isdir) { + var node; + try { + node = FS.lookupNode(dir, name); + } catch (e) { + return e.errno; + } + var errCode = FS.nodePermissions(dir, 'wx'); + if (errCode) { + return errCode; + } + if (isdir) { + if (!FS.isDir(node.mode)) { + return 54; + } + if (FS.isRoot(node) || FS.getPath(node) === FS.cwd()) { + return 10; + } + } else { + if (FS.isDir(node.mode)) { + return 31; + } + } + return 0; + },mayOpen:function(node, flags) { + if (!node) { + return 44; + } + if (FS.isLink(node.mode)) { + return 32; + } else if (FS.isDir(node.mode)) { + if (FS.flagsToPermissionString(flags) !== 'r' || // opening for write + (flags & 512)) { // TODO: check for O_SEARCH? (== search for dir only) + return 31; + } + } + return FS.nodePermissions(node, FS.flagsToPermissionString(flags)); + },MAX_OPEN_FDS:4096,nextfd:function(fd_start, fd_end) { + fd_start = fd_start || 0; + fd_end = fd_end || FS.MAX_OPEN_FDS; + for (var fd = fd_start; fd <= fd_end; fd++) { + if (!FS.streams[fd]) { + return fd; + } + } + throw new FS.ErrnoError(33); + },getStream:function(fd) { + return FS.streams[fd]; + },createStream:function(stream, fd_start, fd_end) { + if (!FS.FSStream) { + FS.FSStream = /** @constructor */ function(){}; + FS.FSStream.prototype = { + object: { + get: function() { return this.node; }, + set: function(val) { this.node = val; } + }, + isRead: { + get: function() { return (this.flags & 2097155) !== 1; } + }, + isWrite: { + get: function() { return (this.flags & 2097155) !== 0; } + }, + isAppend: { + get: function() { return (this.flags & 1024); } + } + }; + } + // clone it, so we can return an instance of FSStream + var newStream = new FS.FSStream(); + for (var p in stream) { + newStream[p] = stream[p]; + } + stream = newStream; + var fd = FS.nextfd(fd_start, fd_end); + stream.fd = fd; + FS.streams[fd] = stream; + return stream; + },closeStream:function(fd) { + FS.streams[fd] = null; + },chrdev_stream_ops:{open:function(stream) { + var device = FS.getDevice(stream.node.rdev); + // override node's stream ops with the device's + stream.stream_ops = device.stream_ops; + // forward the open call + if (stream.stream_ops.open) { + stream.stream_ops.open(stream); + } + },llseek:function() { + throw new FS.ErrnoError(70); + }},major:function(dev) { + return ((dev) >> 8); + },minor:function(dev) { + return ((dev) & 0xff); + },makedev:function(ma, mi) { + return ((ma) << 8 | (mi)); + },registerDevice:function(dev, ops) { + FS.devices[dev] = { stream_ops: ops }; + },getDevice:function(dev) { + return FS.devices[dev]; + },getMounts:function(mount) { + var mounts = []; + var check = [mount]; + + while (check.length) { + var m = check.pop(); + + mounts.push(m); + + check.push.apply(check, m.mounts); + } + + return mounts; + },syncfs:function(populate, callback) { + if (typeof(populate) === 'function') { + callback = populate; + populate = false; + } + + FS.syncFSRequests++; + + if (FS.syncFSRequests > 1) { + err('warning: ' + FS.syncFSRequests + ' FS.syncfs operations in flight at once, probably just doing extra work'); + } + + var mounts = FS.getMounts(FS.root.mount); + var completed = 0; + + function doCallback(errCode) { + FS.syncFSRequests--; + return callback(errCode); + } + + function done(errCode) { + if (errCode) { + if (!done.errored) { + done.errored = true; + return doCallback(errCode); + } + return; + } + if (++completed >= mounts.length) { + doCallback(null); + } + }; + + // sync all mounts + mounts.forEach(function (mount) { + if (!mount.type.syncfs) { + return done(null); + } + mount.type.syncfs(mount, populate, done); + }); + },mount:function(type, opts, mountpoint) { + var root = mountpoint === '/'; + var pseudo = !mountpoint; + var node; + + if (root && FS.root) { + throw new FS.ErrnoError(10); + } else if (!root && !pseudo) { + var lookup = FS.lookupPath(mountpoint, { follow_mount: false }); + + mountpoint = lookup.path; // use the absolute path + node = lookup.node; + + if (FS.isMountpoint(node)) { + throw new FS.ErrnoError(10); + } + + if (!FS.isDir(node.mode)) { + throw new FS.ErrnoError(54); + } + } + + var mount = { + type: type, + opts: opts, + mountpoint: mountpoint, + mounts: [] + }; + + // create a root node for the fs + var mountRoot = type.mount(mount); + mountRoot.mount = mount; + mount.root = mountRoot; + + if (root) { + FS.root = mountRoot; + } else if (node) { + // set as a mountpoint + node.mounted = mount; + + // add the new mount to the current mount's children + if (node.mount) { + node.mount.mounts.push(mount); + } + } + + return mountRoot; + },unmount:function (mountpoint) { + var lookup = FS.lookupPath(mountpoint, { follow_mount: false }); + + if (!FS.isMountpoint(lookup.node)) { + throw new FS.ErrnoError(28); + } + + // destroy the nodes for this mount, and all its child mounts + var node = lookup.node; + var mount = node.mounted; + var mounts = FS.getMounts(mount); + + Object.keys(FS.nameTable).forEach(function (hash) { + var current = FS.nameTable[hash]; + + while (current) { + var next = current.name_next; + + if (mounts.indexOf(current.mount) !== -1) { + FS.destroyNode(current); + } + + current = next; + } + }); + + // no longer a mountpoint + node.mounted = null; + + // remove this mount from the child mounts + var idx = node.mount.mounts.indexOf(mount); + node.mount.mounts.splice(idx, 1); + },lookup:function(parent, name) { + return parent.node_ops.lookup(parent, name); + },mknod:function(path, mode, dev) { + var lookup = FS.lookupPath(path, { parent: true }); + var parent = lookup.node; + var name = PATH.basename(path); + if (!name || name === '.' || name === '..') { + throw new FS.ErrnoError(28); + } + var errCode = FS.mayCreate(parent, name); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + if (!parent.node_ops.mknod) { + throw new FS.ErrnoError(63); + } + return parent.node_ops.mknod(parent, name, mode, dev); + },create:function(path, mode) { + mode = mode !== undefined ? mode : 438 /* 0666 */; + mode &= 4095; + mode |= 32768; + return FS.mknod(path, mode, 0); + },mkdir:function(path, mode) { + mode = mode !== undefined ? mode : 511 /* 0777 */; + mode &= 511 | 512; + mode |= 16384; + return FS.mknod(path, mode, 0); + },mkdirTree:function(path, mode) { + var dirs = path.split('/'); + var d = ''; + for (var i = 0; i < dirs.length; ++i) { + if (!dirs[i]) continue; + d += '/' + dirs[i]; + try { + FS.mkdir(d, mode); + } catch(e) { + if (e.errno != 20) throw e; + } + } + },mkdev:function(path, mode, dev) { + if (typeof(dev) === 'undefined') { + dev = mode; + mode = 438 /* 0666 */; + } + mode |= 8192; + return FS.mknod(path, mode, dev); + },symlink:function(oldpath, newpath) { + if (!PATH_FS.resolve(oldpath)) { + throw new FS.ErrnoError(44); + } + var lookup = FS.lookupPath(newpath, { parent: true }); + var parent = lookup.node; + if (!parent) { + throw new FS.ErrnoError(44); + } + var newname = PATH.basename(newpath); + var errCode = FS.mayCreate(parent, newname); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + if (!parent.node_ops.symlink) { + throw new FS.ErrnoError(63); + } + return parent.node_ops.symlink(parent, newname, oldpath); + },rename:function(old_path, new_path) { + var old_dirname = PATH.dirname(old_path); + var new_dirname = PATH.dirname(new_path); + var old_name = PATH.basename(old_path); + var new_name = PATH.basename(new_path); + // parents must exist + var lookup, old_dir, new_dir; + + // let the errors from non existant directories percolate up + lookup = FS.lookupPath(old_path, { parent: true }); + old_dir = lookup.node; + lookup = FS.lookupPath(new_path, { parent: true }); + new_dir = lookup.node; + + if (!old_dir || !new_dir) throw new FS.ErrnoError(44); + // need to be part of the same mount + if (old_dir.mount !== new_dir.mount) { + throw new FS.ErrnoError(75); + } + // source must exist + var old_node = FS.lookupNode(old_dir, old_name); + // old path should not be an ancestor of the new path + var relative = PATH_FS.relative(old_path, new_dirname); + if (relative.charAt(0) !== '.') { + throw new FS.ErrnoError(28); + } + // new path should not be an ancestor of the old path + relative = PATH_FS.relative(new_path, old_dirname); + if (relative.charAt(0) !== '.') { + throw new FS.ErrnoError(55); + } + // see if the new path already exists + var new_node; + try { + new_node = FS.lookupNode(new_dir, new_name); + } catch (e) { + // not fatal + } + // early out if nothing needs to change + if (old_node === new_node) { + return; + } + // we'll need to delete the old entry + var isdir = FS.isDir(old_node.mode); + var errCode = FS.mayDelete(old_dir, old_name, isdir); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + // need delete permissions if we'll be overwriting. + // need create permissions if new doesn't already exist. + errCode = new_node ? + FS.mayDelete(new_dir, new_name, isdir) : + FS.mayCreate(new_dir, new_name); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + if (!old_dir.node_ops.rename) { + throw new FS.ErrnoError(63); + } + if (FS.isMountpoint(old_node) || (new_node && FS.isMountpoint(new_node))) { + throw new FS.ErrnoError(10); + } + // if we are going to change the parent, check write permissions + if (new_dir !== old_dir) { + errCode = FS.nodePermissions(old_dir, 'w'); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + } + try { + if (FS.trackingDelegate['willMovePath']) { + FS.trackingDelegate['willMovePath'](old_path, new_path); + } + } catch(e) { + err("FS.trackingDelegate['willMovePath']('"+old_path+"', '"+new_path+"') threw an exception: " + e.message); + } + // remove the node from the lookup hash + FS.hashRemoveNode(old_node); + // do the underlying fs rename + try { + old_dir.node_ops.rename(old_node, new_dir, new_name); + } catch (e) { + throw e; + } finally { + // add the node back to the hash (in case node_ops.rename + // changed its name) + FS.hashAddNode(old_node); + } + try { + if (FS.trackingDelegate['onMovePath']) FS.trackingDelegate['onMovePath'](old_path, new_path); + } catch(e) { + err("FS.trackingDelegate['onMovePath']('"+old_path+"', '"+new_path+"') threw an exception: " + e.message); + } + },rmdir:function(path) { + var lookup = FS.lookupPath(path, { parent: true }); + var parent = lookup.node; + var name = PATH.basename(path); + var node = FS.lookupNode(parent, name); + var errCode = FS.mayDelete(parent, name, true); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + if (!parent.node_ops.rmdir) { + throw new FS.ErrnoError(63); + } + if (FS.isMountpoint(node)) { + throw new FS.ErrnoError(10); + } + try { + if (FS.trackingDelegate['willDeletePath']) { + FS.trackingDelegate['willDeletePath'](path); + } + } catch(e) { + err("FS.trackingDelegate['willDeletePath']('"+path+"') threw an exception: " + e.message); + } + parent.node_ops.rmdir(parent, name); + FS.destroyNode(node); + try { + if (FS.trackingDelegate['onDeletePath']) FS.trackingDelegate['onDeletePath'](path); + } catch(e) { + err("FS.trackingDelegate['onDeletePath']('"+path+"') threw an exception: " + e.message); + } + },readdir:function(path) { + var lookup = FS.lookupPath(path, { follow: true }); + var node = lookup.node; + if (!node.node_ops.readdir) { + throw new FS.ErrnoError(54); + } + return node.node_ops.readdir(node); + },unlink:function(path) { + var lookup = FS.lookupPath(path, { parent: true }); + var parent = lookup.node; + var name = PATH.basename(path); + var node = FS.lookupNode(parent, name); + var errCode = FS.mayDelete(parent, name, false); + if (errCode) { + // According to POSIX, we should map EISDIR to EPERM, but + // we instead do what Linux does (and we must, as we use + // the musl linux libc). + throw new FS.ErrnoError(errCode); + } + if (!parent.node_ops.unlink) { + throw new FS.ErrnoError(63); + } + if (FS.isMountpoint(node)) { + throw new FS.ErrnoError(10); + } + try { + if (FS.trackingDelegate['willDeletePath']) { + FS.trackingDelegate['willDeletePath'](path); + } + } catch(e) { + err("FS.trackingDelegate['willDeletePath']('"+path+"') threw an exception: " + e.message); + } + parent.node_ops.unlink(parent, name); + FS.destroyNode(node); + try { + if (FS.trackingDelegate['onDeletePath']) FS.trackingDelegate['onDeletePath'](path); + } catch(e) { + err("FS.trackingDelegate['onDeletePath']('"+path+"') threw an exception: " + e.message); + } + },readlink:function(path) { + var lookup = FS.lookupPath(path); + var link = lookup.node; + if (!link) { + throw new FS.ErrnoError(44); + } + if (!link.node_ops.readlink) { + throw new FS.ErrnoError(28); + } + return PATH_FS.resolve(FS.getPath(link.parent), link.node_ops.readlink(link)); + },stat:function(path, dontFollow) { + var lookup = FS.lookupPath(path, { follow: !dontFollow }); + var node = lookup.node; + if (!node) { + throw new FS.ErrnoError(44); + } + if (!node.node_ops.getattr) { + throw new FS.ErrnoError(63); + } + return node.node_ops.getattr(node); + },lstat:function(path) { + return FS.stat(path, true); + },chmod:function(path, mode, dontFollow) { + var node; + if (typeof path === 'string') { + var lookup = FS.lookupPath(path, { follow: !dontFollow }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + node.node_ops.setattr(node, { + mode: (mode & 4095) | (node.mode & ~4095), + timestamp: Date.now() + }); + },lchmod:function(path, mode) { + FS.chmod(path, mode, true); + },fchmod:function(fd, mode) { + var stream = FS.getStream(fd); + if (!stream) { + throw new FS.ErrnoError(8); + } + FS.chmod(stream.node, mode); + },chown:function(path, uid, gid, dontFollow) { + var node; + if (typeof path === 'string') { + var lookup = FS.lookupPath(path, { follow: !dontFollow }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + node.node_ops.setattr(node, { + timestamp: Date.now() + // we ignore the uid / gid for now + }); + },lchown:function(path, uid, gid) { + FS.chown(path, uid, gid, true); + },fchown:function(fd, uid, gid) { + var stream = FS.getStream(fd); + if (!stream) { + throw new FS.ErrnoError(8); + } + FS.chown(stream.node, uid, gid); + },truncate:function(path, len) { + if (len < 0) { + throw new FS.ErrnoError(28); + } + var node; + if (typeof path === 'string') { + var lookup = FS.lookupPath(path, { follow: true }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + if (FS.isDir(node.mode)) { + throw new FS.ErrnoError(31); + } + if (!FS.isFile(node.mode)) { + throw new FS.ErrnoError(28); + } + var errCode = FS.nodePermissions(node, 'w'); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + node.node_ops.setattr(node, { + size: len, + timestamp: Date.now() + }); + },ftruncate:function(fd, len) { + var stream = FS.getStream(fd); + if (!stream) { + throw new FS.ErrnoError(8); + } + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(28); + } + FS.truncate(stream.node, len); + },utime:function(path, atime, mtime) { + var lookup = FS.lookupPath(path, { follow: true }); + var node = lookup.node; + node.node_ops.setattr(node, { + timestamp: Math.max(atime, mtime) + }); + },open:function(path, flags, mode, fd_start, fd_end) { + if (path === "") { + throw new FS.ErrnoError(44); + } + flags = typeof flags === 'string' ? FS.modeStringToFlags(flags) : flags; + mode = typeof mode === 'undefined' ? 438 /* 0666 */ : mode; + if ((flags & 64)) { + mode = (mode & 4095) | 32768; + } else { + mode = 0; + } + var node; + if (typeof path === 'object') { + node = path; + } else { + path = PATH.normalize(path); + try { + var lookup = FS.lookupPath(path, { + follow: !(flags & 131072) + }); + node = lookup.node; + } catch (e) { + // ignore + } + } + // perhaps we need to create the node + var created = false; + if ((flags & 64)) { + if (node) { + // if O_CREAT and O_EXCL are set, error out if the node already exists + if ((flags & 128)) { + throw new FS.ErrnoError(20); + } + } else { + // node doesn't exist, try to create it + node = FS.mknod(path, mode, 0); + created = true; + } + } + if (!node) { + throw new FS.ErrnoError(44); + } + // can't truncate a device + if (FS.isChrdev(node.mode)) { + flags &= ~512; + } + // if asked only for a directory, then this must be one + if ((flags & 65536) && !FS.isDir(node.mode)) { + throw new FS.ErrnoError(54); + } + // check permissions, if this is not a file we just created now (it is ok to + // create and write to a file with read-only permissions; it is read-only + // for later use) + if (!created) { + var errCode = FS.mayOpen(node, flags); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + } + // do truncation if necessary + if ((flags & 512)) { + FS.truncate(node, 0); + } + // we've already handled these, don't pass down to the underlying vfs + flags &= ~(128 | 512 | 131072); + + // register the stream with the filesystem + var stream = FS.createStream({ + node: node, + path: FS.getPath(node), // we want the absolute path to the node + flags: flags, + seekable: true, + position: 0, + stream_ops: node.stream_ops, + // used by the file family libc calls (fopen, fwrite, ferror, etc.) + ungotten: [], + error: false + }, fd_start, fd_end); + // call the new stream's open function + if (stream.stream_ops.open) { + stream.stream_ops.open(stream); + } + if (Module['logReadFiles'] && !(flags & 1)) { + if (!FS.readFiles) FS.readFiles = {}; + if (!(path in FS.readFiles)) { + FS.readFiles[path] = 1; + err("FS.trackingDelegate error on read file: " + path); + } + } + try { + if (FS.trackingDelegate['onOpenFile']) { + var trackingFlags = 0; + if ((flags & 2097155) !== 1) { + trackingFlags |= FS.tracking.openFlags.READ; + } + if ((flags & 2097155) !== 0) { + trackingFlags |= FS.tracking.openFlags.WRITE; + } + FS.trackingDelegate['onOpenFile'](path, trackingFlags); + } + } catch(e) { + err("FS.trackingDelegate['onOpenFile']('"+path+"', flags) threw an exception: " + e.message); + } + return stream; + },close:function(stream) { + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if (stream.getdents) stream.getdents = null; // free readdir state + try { + if (stream.stream_ops.close) { + stream.stream_ops.close(stream); + } + } catch (e) { + throw e; + } finally { + FS.closeStream(stream.fd); + } + stream.fd = null; + },isClosed:function(stream) { + return stream.fd === null; + },llseek:function(stream, offset, whence) { + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if (!stream.seekable || !stream.stream_ops.llseek) { + throw new FS.ErrnoError(70); + } + if (whence != 0 && whence != 1 && whence != 2) { + throw new FS.ErrnoError(28); + } + stream.position = stream.stream_ops.llseek(stream, offset, whence); + stream.ungotten = []; + return stream.position; + },read:function(stream, buffer, offset, length, position) { + if (length < 0 || position < 0) { + throw new FS.ErrnoError(28); + } + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if ((stream.flags & 2097155) === 1) { + throw new FS.ErrnoError(8); + } + if (FS.isDir(stream.node.mode)) { + throw new FS.ErrnoError(31); + } + if (!stream.stream_ops.read) { + throw new FS.ErrnoError(28); + } + var seeking = typeof position !== 'undefined'; + if (!seeking) { + position = stream.position; + } else if (!stream.seekable) { + throw new FS.ErrnoError(70); + } + var bytesRead = stream.stream_ops.read(stream, buffer, offset, length, position); + if (!seeking) stream.position += bytesRead; + return bytesRead; + },write:function(stream, buffer, offset, length, position, canOwn) { + if (length < 0 || position < 0) { + throw new FS.ErrnoError(28); + } + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(8); + } + if (FS.isDir(stream.node.mode)) { + throw new FS.ErrnoError(31); + } + if (!stream.stream_ops.write) { + throw new FS.ErrnoError(28); + } + if (stream.seekable && stream.flags & 1024) { + // seek to the end before writing in append mode + FS.llseek(stream, 0, 2); + } + var seeking = typeof position !== 'undefined'; + if (!seeking) { + position = stream.position; + } else if (!stream.seekable) { + throw new FS.ErrnoError(70); + } + var bytesWritten = stream.stream_ops.write(stream, buffer, offset, length, position, canOwn); + if (!seeking) stream.position += bytesWritten; + try { + if (stream.path && FS.trackingDelegate['onWriteToFile']) FS.trackingDelegate['onWriteToFile'](stream.path); + } catch(e) { + err("FS.trackingDelegate['onWriteToFile']('"+stream.path+"') threw an exception: " + e.message); + } + return bytesWritten; + },allocate:function(stream, offset, length) { + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if (offset < 0 || length <= 0) { + throw new FS.ErrnoError(28); + } + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(8); + } + if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) { + throw new FS.ErrnoError(43); + } + if (!stream.stream_ops.allocate) { + throw new FS.ErrnoError(138); + } + stream.stream_ops.allocate(stream, offset, length); + },mmap:function(stream, address, length, position, prot, flags) { + // User requests writing to file (prot & PROT_WRITE != 0). + // Checking if we have permissions to write to the file unless + // MAP_PRIVATE flag is set. According to POSIX spec it is possible + // to write to file opened in read-only mode with MAP_PRIVATE flag, + // as all modifications will be visible only in the memory of + // the current process. + if ((prot & 2) !== 0 + && (flags & 2) === 0 + && (stream.flags & 2097155) !== 2) { + throw new FS.ErrnoError(2); + } + if ((stream.flags & 2097155) === 1) { + throw new FS.ErrnoError(2); + } + if (!stream.stream_ops.mmap) { + throw new FS.ErrnoError(43); + } + return stream.stream_ops.mmap(stream, address, length, position, prot, flags); + },msync:function(stream, buffer, offset, length, mmapFlags) { + if (!stream || !stream.stream_ops.msync) { + return 0; + } + return stream.stream_ops.msync(stream, buffer, offset, length, mmapFlags); + },munmap:function(stream) { + return 0; + },ioctl:function(stream, cmd, arg) { + if (!stream.stream_ops.ioctl) { + throw new FS.ErrnoError(59); + } + return stream.stream_ops.ioctl(stream, cmd, arg); + },readFile:function(path, opts) { + opts = opts || {}; + opts.flags = opts.flags || 0; + opts.encoding = opts.encoding || 'binary'; + if (opts.encoding !== 'utf8' && opts.encoding !== 'binary') { + throw new Error('Invalid encoding type "' + opts.encoding + '"'); + } + var ret; + var stream = FS.open(path, opts.flags); + var stat = FS.stat(path); + var length = stat.size; + var buf = new Uint8Array(length); + FS.read(stream, buf, 0, length, 0); + if (opts.encoding === 'utf8') { + ret = UTF8ArrayToString(buf, 0); + } else if (opts.encoding === 'binary') { + ret = buf; + } + FS.close(stream); + return ret; + },writeFile:function(path, data, opts) { + opts = opts || {}; + opts.flags = opts.flags || 577; + var stream = FS.open(path, opts.flags, opts.mode); + if (typeof data === 'string') { + var buf = new Uint8Array(lengthBytesUTF8(data)+1); + var actualNumBytes = stringToUTF8Array(data, buf, 0, buf.length); + FS.write(stream, buf, 0, actualNumBytes, undefined, opts.canOwn); + } else if (ArrayBuffer.isView(data)) { + FS.write(stream, data, 0, data.byteLength, undefined, opts.canOwn); + } else { + throw new Error('Unsupported data type'); + } + FS.close(stream); + },cwd:function() { + return FS.currentPath; + },chdir:function(path) { + var lookup = FS.lookupPath(path, { follow: true }); + if (lookup.node === null) { + throw new FS.ErrnoError(44); + } + if (!FS.isDir(lookup.node.mode)) { + throw new FS.ErrnoError(54); + } + var errCode = FS.nodePermissions(lookup.node, 'x'); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + FS.currentPath = lookup.path; + },createDefaultDirectories:function() { + FS.mkdir('/tmp'); + FS.mkdir('/home'); + FS.mkdir('/home/web_user'); + },createDefaultDevices:function() { + // create /dev + FS.mkdir('/dev'); + // setup /dev/null + FS.registerDevice(FS.makedev(1, 3), { + read: function() { return 0; }, + write: function(stream, buffer, offset, length, pos) { return length; } + }); + FS.mkdev('/dev/null', FS.makedev(1, 3)); + // setup /dev/tty and /dev/tty1 + // stderr needs to print output using err() rather than out() + // so we register a second tty just for it. + TTY.register(FS.makedev(5, 0), TTY.default_tty_ops); + TTY.register(FS.makedev(6, 0), TTY.default_tty1_ops); + FS.mkdev('/dev/tty', FS.makedev(5, 0)); + FS.mkdev('/dev/tty1', FS.makedev(6, 0)); + // setup /dev/[u]random + var random_device = getRandomDevice(); + FS.createDevice('/dev', 'random', random_device); + FS.createDevice('/dev', 'urandom', random_device); + // we're not going to emulate the actual shm device, + // just create the tmp dirs that reside in it commonly + FS.mkdir('/dev/shm'); + FS.mkdir('/dev/shm/tmp'); + },createSpecialDirectories:function() { + // create /proc/self/fd which allows /proc/self/fd/6 => readlink gives the + // name of the stream for fd 6 (see test_unistd_ttyname) + FS.mkdir('/proc'); + var proc_self = FS.mkdir('/proc/self'); + FS.mkdir('/proc/self/fd'); + FS.mount({ + mount: function() { + var node = FS.createNode(proc_self, 'fd', 16384 | 511 /* 0777 */, 73); + node.node_ops = { + lookup: function(parent, name) { + var fd = +name; + var stream = FS.getStream(fd); + if (!stream) throw new FS.ErrnoError(8); + var ret = { + parent: null, + mount: { mountpoint: 'fake' }, + node_ops: { readlink: function() { return stream.path } } + }; + ret.parent = ret; // make it look like a simple root node + return ret; + } + }; + return node; + } + }, {}, '/proc/self/fd'); + },createStandardStreams:function() { + // TODO deprecate the old functionality of a single + // input / output callback and that utilizes FS.createDevice + // and instead require a unique set of stream ops + + // by default, we symlink the standard streams to the + // default tty devices. however, if the standard streams + // have been overwritten we create a unique device for + // them instead. + if (Module['stdin']) { + FS.createDevice('/dev', 'stdin', Module['stdin']); + } else { + FS.symlink('/dev/tty', '/dev/stdin'); + } + if (Module['stdout']) { + FS.createDevice('/dev', 'stdout', null, Module['stdout']); + } else { + FS.symlink('/dev/tty', '/dev/stdout'); + } + if (Module['stderr']) { + FS.createDevice('/dev', 'stderr', null, Module['stderr']); + } else { + FS.symlink('/dev/tty1', '/dev/stderr'); + } + + // open default streams for the stdin, stdout and stderr devices + var stdin = FS.open('/dev/stdin', 0); + var stdout = FS.open('/dev/stdout', 1); + var stderr = FS.open('/dev/stderr', 1); + },ensureErrnoError:function() { + if (FS.ErrnoError) return; + FS.ErrnoError = /** @this{Object} */ function ErrnoError(errno, node) { + this.node = node; + this.setErrno = /** @this{Object} */ function(errno) { + this.errno = errno; + }; + this.setErrno(errno); + this.message = 'FS error'; + + }; + FS.ErrnoError.prototype = new Error(); + FS.ErrnoError.prototype.constructor = FS.ErrnoError; + // Some errors may happen quite a bit, to avoid overhead we reuse them (and suffer a lack of stack info) + [44].forEach(function(code) { + FS.genericErrors[code] = new FS.ErrnoError(code); + FS.genericErrors[code].stack = ''; + }); + },staticInit:function() { + FS.ensureErrnoError(); + + FS.nameTable = new Array(4096); + + FS.mount(MEMFS, {}, '/'); + + FS.createDefaultDirectories(); + FS.createDefaultDevices(); + FS.createSpecialDirectories(); + + FS.filesystems = { + 'MEMFS': MEMFS, + }; + },init:function(input, output, error) { + FS.init.initialized = true; + + FS.ensureErrnoError(); + + // Allow Module.stdin etc. to provide defaults, if none explicitly passed to us here + Module['stdin'] = input || Module['stdin']; + Module['stdout'] = output || Module['stdout']; + Module['stderr'] = error || Module['stderr']; + + FS.createStandardStreams(); + },quit:function() { + FS.init.initialized = false; + // force-flush all streams, so we get musl std streams printed out + var fflush = Module['_fflush']; + if (fflush) fflush(0); + // close all of our streams + for (var i = 0; i < FS.streams.length; i++) { + var stream = FS.streams[i]; + if (!stream) { + continue; + } + FS.close(stream); + } + },getMode:function(canRead, canWrite) { + var mode = 0; + if (canRead) mode |= 292 | 73; + if (canWrite) mode |= 146; + return mode; + },findObject:function(path, dontResolveLastLink) { + var ret = FS.analyzePath(path, dontResolveLastLink); + if (ret.exists) { + return ret.object; + } else { + return null; + } + },analyzePath:function(path, dontResolveLastLink) { + // operate from within the context of the symlink's target + try { + var lookup = FS.lookupPath(path, { follow: !dontResolveLastLink }); + path = lookup.path; + } catch (e) { + } + var ret = { + isRoot: false, exists: false, error: 0, name: null, path: null, object: null, + parentExists: false, parentPath: null, parentObject: null + }; + try { + var lookup = FS.lookupPath(path, { parent: true }); + ret.parentExists = true; + ret.parentPath = lookup.path; + ret.parentObject = lookup.node; + ret.name = PATH.basename(path); + lookup = FS.lookupPath(path, { follow: !dontResolveLastLink }); + ret.exists = true; + ret.path = lookup.path; + ret.object = lookup.node; + ret.name = lookup.node.name; + ret.isRoot = lookup.path === '/'; + } catch (e) { + ret.error = e.errno; + }; + return ret; + },createPath:function(parent, path, canRead, canWrite) { + parent = typeof parent === 'string' ? parent : FS.getPath(parent); + var parts = path.split('/').reverse(); + while (parts.length) { + var part = parts.pop(); + if (!part) continue; + var current = PATH.join2(parent, part); + try { + FS.mkdir(current); + } catch (e) { + // ignore EEXIST + } + parent = current; + } + return current; + },createFile:function(parent, name, properties, canRead, canWrite) { + var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name); + var mode = FS.getMode(canRead, canWrite); + return FS.create(path, mode); + },createDataFile:function(parent, name, data, canRead, canWrite, canOwn) { + var path = name ? PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name) : parent; + var mode = FS.getMode(canRead, canWrite); + var node = FS.create(path, mode); + if (data) { + if (typeof data === 'string') { + var arr = new Array(data.length); + for (var i = 0, len = data.length; i < len; ++i) arr[i] = data.charCodeAt(i); + data = arr; + } + // make sure we can write to the file + FS.chmod(node, mode | 146); + var stream = FS.open(node, 577); + FS.write(stream, data, 0, data.length, 0, canOwn); + FS.close(stream); + FS.chmod(node, mode); + } + return node; + },createDevice:function(parent, name, input, output) { + var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name); + var mode = FS.getMode(!!input, !!output); + if (!FS.createDevice.major) FS.createDevice.major = 64; + var dev = FS.makedev(FS.createDevice.major++, 0); + // Create a fake device that a set of stream ops to emulate + // the old behavior. + FS.registerDevice(dev, { + open: function(stream) { + stream.seekable = false; + }, + close: function(stream) { + // flush any pending line data + if (output && output.buffer && output.buffer.length) { + output(10); + } + }, + read: function(stream, buffer, offset, length, pos /* ignored */) { + var bytesRead = 0; + for (var i = 0; i < length; i++) { + var result; + try { + result = input(); + } catch (e) { + throw new FS.ErrnoError(29); + } + if (result === undefined && bytesRead === 0) { + throw new FS.ErrnoError(6); + } + if (result === null || result === undefined) break; + bytesRead++; + buffer[offset+i] = result; + } + if (bytesRead) { + stream.node.timestamp = Date.now(); + } + return bytesRead; + }, + write: function(stream, buffer, offset, length, pos) { + for (var i = 0; i < length; i++) { + try { + output(buffer[offset+i]); + } catch (e) { + throw new FS.ErrnoError(29); + } + } + if (length) { + stream.node.timestamp = Date.now(); + } + return i; + } + }); + return FS.mkdev(path, mode, dev); + },forceLoadFile:function(obj) { + if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true; + if (typeof XMLHttpRequest !== 'undefined') { + throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread."); + } else if (read_) { + // Command-line. + try { + // WARNING: Can't read binary files in V8's d8 or tracemonkey's js, as + // read() will try to parse UTF8. + obj.contents = intArrayFromString(read_(obj.url), true); + obj.usedBytes = obj.contents.length; + } catch (e) { + throw new FS.ErrnoError(29); + } + } else { + throw new Error('Cannot load without read() or XMLHttpRequest.'); + } + },createLazyFile:function(parent, name, url, canRead, canWrite) { + // Lazy chunked Uint8Array (implements get and length from Uint8Array). Actual getting is abstracted away for eventual reuse. + /** @constructor */ + function LazyUint8Array() { + this.lengthKnown = false; + this.chunks = []; // Loaded chunks. Index is the chunk number + } + LazyUint8Array.prototype.get = /** @this{Object} */ function LazyUint8Array_get(idx) { + if (idx > this.length-1 || idx < 0) { + return undefined; + } + var chunkOffset = idx % this.chunkSize; + var chunkNum = (idx / this.chunkSize)|0; + return this.getter(chunkNum)[chunkOffset]; + }; + LazyUint8Array.prototype.setDataGetter = function LazyUint8Array_setDataGetter(getter) { + this.getter = getter; + }; + LazyUint8Array.prototype.cacheLength = function LazyUint8Array_cacheLength() { + // Find length + var xhr = new XMLHttpRequest(); + xhr.open('HEAD', url, false); + xhr.send(null); + if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status); + var datalength = Number(xhr.getResponseHeader("Content-length")); + var header; + var hasByteServing = (header = xhr.getResponseHeader("Accept-Ranges")) && header === "bytes"; + var usesGzip = (header = xhr.getResponseHeader("Content-Encoding")) && header === "gzip"; + + var chunkSize = 1024*1024; // Chunk size in bytes + + if (!hasByteServing) chunkSize = datalength; + + // Function to get a range from the remote URL. + var doXHR = (function(from, to) { + if (from > to) throw new Error("invalid range (" + from + ", " + to + ") or no bytes requested!"); + if (to > datalength-1) throw new Error("only " + datalength + " bytes available! programmer error!"); + + // TODO: Use mozResponseArrayBuffer, responseStream, etc. if available. + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, false); + if (datalength !== chunkSize) xhr.setRequestHeader("Range", "bytes=" + from + "-" + to); + + // Some hints to the browser that we want binary data. + if (typeof Uint8Array != 'undefined') xhr.responseType = 'arraybuffer'; + if (xhr.overrideMimeType) { + xhr.overrideMimeType('text/plain; charset=x-user-defined'); + } + + xhr.send(null); + if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status); + if (xhr.response !== undefined) { + return new Uint8Array(/** @type{Array} */(xhr.response || [])); + } else { + return intArrayFromString(xhr.responseText || '', true); + } + }); + var lazyArray = this; + lazyArray.setDataGetter(function(chunkNum) { + var start = chunkNum * chunkSize; + var end = (chunkNum+1) * chunkSize - 1; // including this byte + end = Math.min(end, datalength-1); // if datalength-1 is selected, this is the last block + if (typeof(lazyArray.chunks[chunkNum]) === "undefined") { + lazyArray.chunks[chunkNum] = doXHR(start, end); + } + if (typeof(lazyArray.chunks[chunkNum]) === "undefined") throw new Error("doXHR failed!"); + return lazyArray.chunks[chunkNum]; + }); + + if (usesGzip || !datalength) { + // if the server uses gzip or doesn't supply the length, we have to download the whole file to get the (uncompressed) length + chunkSize = datalength = 1; // this will force getter(0)/doXHR do download the whole file + datalength = this.getter(0).length; + chunkSize = datalength; + out("LazyFiles on gzip forces download of the whole file when length is accessed"); + } + + this._length = datalength; + this._chunkSize = chunkSize; + this.lengthKnown = true; + }; + if (typeof XMLHttpRequest !== 'undefined') { + if (!ENVIRONMENT_IS_WORKER) throw 'Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc'; + var lazyArray = new LazyUint8Array(); + Object.defineProperties(lazyArray, { + length: { + get: /** @this{Object} */ function() { + if (!this.lengthKnown) { + this.cacheLength(); + } + return this._length; + } + }, + chunkSize: { + get: /** @this{Object} */ function() { + if (!this.lengthKnown) { + this.cacheLength(); + } + return this._chunkSize; + } + } + }); + + var properties = { isDevice: false, contents: lazyArray }; + } else { + var properties = { isDevice: false, url: url }; + } + + var node = FS.createFile(parent, name, properties, canRead, canWrite); + // This is a total hack, but I want to get this lazy file code out of the + // core of MEMFS. If we want to keep this lazy file concept I feel it should + // be its own thin LAZYFS proxying calls to MEMFS. + if (properties.contents) { + node.contents = properties.contents; + } else if (properties.url) { + node.contents = null; + node.url = properties.url; + } + // Add a function that defers querying the file size until it is asked the first time. + Object.defineProperties(node, { + usedBytes: { + get: /** @this {FSNode} */ function() { return this.contents.length; } + } + }); + // override each stream op with one that tries to force load the lazy file first + var stream_ops = {}; + var keys = Object.keys(node.stream_ops); + keys.forEach(function(key) { + var fn = node.stream_ops[key]; + stream_ops[key] = function forceLoadLazyFile() { + FS.forceLoadFile(node); + return fn.apply(null, arguments); + }; + }); + // use a custom read function + stream_ops.read = function stream_ops_read(stream, buffer, offset, length, position) { + FS.forceLoadFile(node); + var contents = stream.node.contents; + if (position >= contents.length) + return 0; + var size = Math.min(contents.length - position, length); + if (contents.slice) { // normal array + for (var i = 0; i < size; i++) { + buffer[offset + i] = contents[position + i]; + } + } else { + for (var i = 0; i < size; i++) { // LazyUint8Array from sync binary XHR + buffer[offset + i] = contents.get(position + i); + } + } + return size; + }; + node.stream_ops = stream_ops; + return node; + },createPreloadedFile:function(parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn, preFinish) { + Browser.init(); // XXX perhaps this method should move onto Browser? + // TODO we should allow people to just pass in a complete filename instead + // of parent and name being that we just join them anyways + var fullname = name ? PATH_FS.resolve(PATH.join2(parent, name)) : parent; + var dep = getUniqueRunDependency('cp ' + fullname); // might have several active requests for the same fullname + function processData(byteArray) { + function finish(byteArray) { + if (preFinish) preFinish(); + if (!dontCreateFile) { + FS.createDataFile(parent, name, byteArray, canRead, canWrite, canOwn); + } + if (onload) onload(); + removeRunDependency(dep); + } + var handled = false; + Module['preloadPlugins'].forEach(function(plugin) { + if (handled) return; + if (plugin['canHandle'](fullname)) { + plugin['handle'](byteArray, fullname, finish, function() { + if (onerror) onerror(); + removeRunDependency(dep); + }); + handled = true; + } + }); + if (!handled) finish(byteArray); + } + addRunDependency(dep); + if (typeof url == 'string') { + Browser.asyncLoad(url, function(byteArray) { + processData(byteArray); + }, onerror); + } else { + processData(url); + } + },indexedDB:function() { + return window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB; + },DB_NAME:function() { + return 'EM_FS_' + window.location.pathname; + },DB_VERSION:20,DB_STORE_NAME:"FILE_DATA",saveFilesToDB:function(paths, onload, onerror) { + onload = onload || function(){}; + onerror = onerror || function(){}; + var indexedDB = FS.indexedDB(); + try { + var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION); + } catch (e) { + return onerror(e); + } + openRequest.onupgradeneeded = function openRequest_onupgradeneeded() { + out('creating db'); + var db = openRequest.result; + db.createObjectStore(FS.DB_STORE_NAME); + }; + openRequest.onsuccess = function openRequest_onsuccess() { + var db = openRequest.result; + var transaction = db.transaction([FS.DB_STORE_NAME], 'readwrite'); + var files = transaction.objectStore(FS.DB_STORE_NAME); + var ok = 0, fail = 0, total = paths.length; + function finish() { + if (fail == 0) onload(); else onerror(); + } + paths.forEach(function(path) { + var putRequest = files.put(FS.analyzePath(path).object.contents, path); + putRequest.onsuccess = function putRequest_onsuccess() { ok++; if (ok + fail == total) finish() }; + putRequest.onerror = function putRequest_onerror() { fail++; if (ok + fail == total) finish() }; + }); + transaction.onerror = onerror; + }; + openRequest.onerror = onerror; + },loadFilesFromDB:function(paths, onload, onerror) { + onload = onload || function(){}; + onerror = onerror || function(){}; + var indexedDB = FS.indexedDB(); + try { + var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION); + } catch (e) { + return onerror(e); + } + openRequest.onupgradeneeded = onerror; // no database to load from + openRequest.onsuccess = function openRequest_onsuccess() { + var db = openRequest.result; + try { + var transaction = db.transaction([FS.DB_STORE_NAME], 'readonly'); + } catch(e) { + onerror(e); + return; + } + var files = transaction.objectStore(FS.DB_STORE_NAME); + var ok = 0, fail = 0, total = paths.length; + function finish() { + if (fail == 0) onload(); else onerror(); + } + paths.forEach(function(path) { + var getRequest = files.get(path); + getRequest.onsuccess = function getRequest_onsuccess() { + if (FS.analyzePath(path).exists) { + FS.unlink(path); + } + FS.createDataFile(PATH.dirname(path), PATH.basename(path), getRequest.result, true, true, true); + ok++; + if (ok + fail == total) finish(); + }; + getRequest.onerror = function getRequest_onerror() { fail++; if (ok + fail == total) finish() }; + }); + transaction.onerror = onerror; + }; + openRequest.onerror = onerror; + }}; + var SYSCALLS={mappings:{},DEFAULT_POLLMASK:5,umask:511,calculateAt:function(dirfd, path, allowEmpty) { + if (path[0] === '/') { + return path; + } + // relative path + var dir; + if (dirfd === -100) { + dir = FS.cwd(); + } else { + var dirstream = FS.getStream(dirfd); + if (!dirstream) throw new FS.ErrnoError(8); + dir = dirstream.path; + } + if (path.length == 0) { + if (!allowEmpty) { + throw new FS.ErrnoError(44);; + } + return dir; + } + return PATH.join2(dir, path); + },doStat:function(func, path, buf) { + try { + var stat = func(path); + } catch (e) { + if (e && e.node && PATH.normalize(path) !== PATH.normalize(FS.getPath(e.node))) { + // an error occurred while trying to look up the path; we should just report ENOTDIR + return -54; + } + throw e; + } + HEAP32[((buf)>>2)] = stat.dev; + HEAP32[(((buf)+(4))>>2)] = 0; + HEAP32[(((buf)+(8))>>2)] = stat.ino; + HEAP32[(((buf)+(12))>>2)] = stat.mode; + HEAP32[(((buf)+(16))>>2)] = stat.nlink; + HEAP32[(((buf)+(20))>>2)] = stat.uid; + HEAP32[(((buf)+(24))>>2)] = stat.gid; + HEAP32[(((buf)+(28))>>2)] = stat.rdev; + HEAP32[(((buf)+(32))>>2)] = 0; + (tempI64 = [stat.size>>>0,(tempDouble=stat.size,(+(Math.abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? ((Math.min((+(Math.floor((tempDouble)/4294967296.0))), 4294967295.0))|0)>>>0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)],HEAP32[(((buf)+(40))>>2)] = tempI64[0],HEAP32[(((buf)+(44))>>2)] = tempI64[1]); + HEAP32[(((buf)+(48))>>2)] = 4096; + HEAP32[(((buf)+(52))>>2)] = stat.blocks; + HEAP32[(((buf)+(56))>>2)] = (stat.atime.getTime() / 1000)|0; + HEAP32[(((buf)+(60))>>2)] = 0; + HEAP32[(((buf)+(64))>>2)] = (stat.mtime.getTime() / 1000)|0; + HEAP32[(((buf)+(68))>>2)] = 0; + HEAP32[(((buf)+(72))>>2)] = (stat.ctime.getTime() / 1000)|0; + HEAP32[(((buf)+(76))>>2)] = 0; + (tempI64 = [stat.ino>>>0,(tempDouble=stat.ino,(+(Math.abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? ((Math.min((+(Math.floor((tempDouble)/4294967296.0))), 4294967295.0))|0)>>>0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)],HEAP32[(((buf)+(80))>>2)] = tempI64[0],HEAP32[(((buf)+(84))>>2)] = tempI64[1]); + return 0; + },doMsync:function(addr, stream, len, flags, offset) { + var buffer = HEAPU8.slice(addr, addr + len); + FS.msync(stream, buffer, offset, len, flags); + },doMkdir:function(path, mode) { + // remove a trailing slash, if one - /a/b/ has basename of '', but + // we want to create b in the context of this function + path = PATH.normalize(path); + if (path[path.length-1] === '/') path = path.substr(0, path.length-1); + FS.mkdir(path, mode, 0); + return 0; + },doMknod:function(path, mode, dev) { + // we don't want this in the JS API as it uses mknod to create all nodes. + switch (mode & 61440) { + case 32768: + case 8192: + case 24576: + case 4096: + case 49152: + break; + default: return -28; + } + FS.mknod(path, mode, dev); + return 0; + },doReadlink:function(path, buf, bufsize) { + if (bufsize <= 0) return -28; + var ret = FS.readlink(path); + + var len = Math.min(bufsize, lengthBytesUTF8(ret)); + var endChar = HEAP8[buf+len]; + stringToUTF8(ret, buf, bufsize+1); + // readlink is one of the rare functions that write out a C string, but does never append a null to the output buffer(!) + // stringToUTF8() always appends a null byte, so restore the character under the null byte after the write. + HEAP8[buf+len] = endChar; + + return len; + },doAccess:function(path, amode) { + if (amode & ~7) { + // need a valid mode + return -28; + } + var node; + var lookup = FS.lookupPath(path, { follow: true }); + node = lookup.node; + if (!node) { + return -44; + } + var perms = ''; + if (amode & 4) perms += 'r'; + if (amode & 2) perms += 'w'; + if (amode & 1) perms += 'x'; + if (perms /* otherwise, they've just passed F_OK */ && FS.nodePermissions(node, perms)) { + return -2; + } + return 0; + },doDup:function(path, flags, suggestFD) { + var suggest = FS.getStream(suggestFD); + if (suggest) FS.close(suggest); + return FS.open(path, flags, 0, suggestFD, suggestFD).fd; + },doReadv:function(stream, iov, iovcnt, offset) { + var ret = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAP32[(((iov)+(i*8))>>2)]; + var len = HEAP32[(((iov)+(i*8 + 4))>>2)]; + var curr = FS.read(stream, HEAP8,ptr, len, offset); + if (curr < 0) return -1; + ret += curr; + if (curr < len) break; // nothing more to read + } + return ret; + },doWritev:function(stream, iov, iovcnt, offset) { + var ret = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAP32[(((iov)+(i*8))>>2)]; + var len = HEAP32[(((iov)+(i*8 + 4))>>2)]; + var curr = FS.write(stream, HEAP8,ptr, len, offset); + if (curr < 0) return -1; + ret += curr; + } + return ret; + },varargs:undefined,get:function() { + SYSCALLS.varargs += 4; + var ret = HEAP32[(((SYSCALLS.varargs)-(4))>>2)]; + return ret; + },getStr:function(ptr) { + var ret = UTF8ToString(ptr); + return ret; + },getStreamFromFD:function(fd) { + var stream = FS.getStream(fd); + if (!stream) throw new FS.ErrnoError(8); + return stream; + },get64:function(low, high) { + return low; + }}; + function ___sys_fcntl64(fd, cmd, varargs) {SYSCALLS.varargs = varargs; + try { + + var stream = SYSCALLS.getStreamFromFD(fd); + switch (cmd) { + case 0: { + var arg = SYSCALLS.get(); + if (arg < 0) { + return -28; + } + var newStream; + newStream = FS.open(stream.path, stream.flags, 0, arg); + return newStream.fd; + } + case 1: + case 2: + return 0; // FD_CLOEXEC makes no sense for a single process. + case 3: + return stream.flags; + case 4: { + var arg = SYSCALLS.get(); + stream.flags |= arg; + return 0; + } + case 12: + /* case 12: Currently in musl F_GETLK64 has same value as F_GETLK, so omitted to avoid duplicate case blocks. If that changes, uncomment this */ { + + var arg = SYSCALLS.get(); + var offset = 0; + // We're always unlocked. + HEAP16[(((arg)+(offset))>>1)] = 2; + return 0; + } + case 13: + case 14: + /* case 13: Currently in musl F_SETLK64 has same value as F_SETLK, so omitted to avoid duplicate case blocks. If that changes, uncomment this */ + /* case 14: Currently in musl F_SETLKW64 has same value as F_SETLKW, so omitted to avoid duplicate case blocks. If that changes, uncomment this */ + + + return 0; // Pretend that the locking is successful. + case 16: + case 8: + return -28; // These are for sockets. We don't have them fully implemented yet. + case 9: + // musl trusts getown return values, due to a bug where they must be, as they overlap with errors. just return -1 here, so fnctl() returns that, and we set errno ourselves. + setErrNo(28); + return -1; + default: { + return -28; + } + } + } catch (e) { + if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); + return -e.errno; + } + } + + function ___sys_ioctl(fd, op, varargs) {SYSCALLS.varargs = varargs; + try { + + var stream = SYSCALLS.getStreamFromFD(fd); + switch (op) { + case 21509: + case 21505: { + if (!stream.tty) return -59; + return 0; + } + case 21510: + case 21511: + case 21512: + case 21506: + case 21507: + case 21508: { + if (!stream.tty) return -59; + return 0; // no-op, not actually adjusting terminal settings + } + case 21519: { + if (!stream.tty) return -59; + var argp = SYSCALLS.get(); + HEAP32[((argp)>>2)] = 0; + return 0; + } + case 21520: { + if (!stream.tty) return -59; + return -28; // not supported + } + case 21531: { + var argp = SYSCALLS.get(); + return FS.ioctl(stream, op, argp); + } + case 21523: { + // TODO: in theory we should write to the winsize struct that gets + // passed in, but for now musl doesn't read anything on it + if (!stream.tty) return -59; + return 0; + } + case 21524: { + // TODO: technically, this ioctl call should change the window size. + // but, since emscripten doesn't have any concept of a terminal window + // yet, we'll just silently throw it away as we do TIOCGWINSZ + if (!stream.tty) return -59; + return 0; + } + default: abort('bad ioctl syscall ' + op); + } + } catch (e) { + if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); + return -e.errno; + } + } + + function ___sys_open(path, flags, varargs) {SYSCALLS.varargs = varargs; + try { + + var pathname = SYSCALLS.getStr(path); + var mode = varargs ? SYSCALLS.get() : 0; + var stream = FS.open(pathname, flags, mode); + return stream.fd; + } catch (e) { + if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); + return -e.errno; + } + } + + function getShiftFromSize(size) { + switch (size) { + case 1: return 0; + case 2: return 1; + case 4: return 2; + case 8: return 3; + default: + throw new TypeError('Unknown type size: ' + size); + } + } + + function embind_init_charCodes() { + var codes = new Array(256); + for (var i = 0; i < 256; ++i) { + codes[i] = String.fromCharCode(i); + } + embind_charCodes = codes; + } + var embind_charCodes=undefined; + function readLatin1String(ptr) { + var ret = ""; + var c = ptr; + while (HEAPU8[c]) { + ret += embind_charCodes[HEAPU8[c++]]; + } + return ret; + } + + var awaitingDependencies={}; + + var registeredTypes={}; + + var typeDependencies={}; + + var char_0=48; + + var char_9=57; + function makeLegalFunctionName(name) { + if (undefined === name) { + return '_unknown'; + } + name = name.replace(/[^a-zA-Z0-9_]/g, '$'); + var f = name.charCodeAt(0); + if (f >= char_0 && f <= char_9) { + return '_' + name; + } else { + return name; + } + } + function createNamedFunction(name, body) { + name = makeLegalFunctionName(name); + /*jshint evil:true*/ + return new Function( + "body", + "return function " + name + "() {\n" + + " \"use strict\";" + + " return body.apply(this, arguments);\n" + + "};\n" + )(body); + } + function extendError(baseErrorType, errorName) { + var errorClass = createNamedFunction(errorName, function(message) { + this.name = errorName; + this.message = message; + + var stack = (new Error(message)).stack; + if (stack !== undefined) { + this.stack = this.toString() + '\n' + + stack.replace(/^Error(:[^\n]*)?\n/, ''); + } + }); + errorClass.prototype = Object.create(baseErrorType.prototype); + errorClass.prototype.constructor = errorClass; + errorClass.prototype.toString = function() { + if (this.message === undefined) { + return this.name; + } else { + return this.name + ': ' + this.message; + } + }; + + return errorClass; + } + var BindingError=undefined; + function throwBindingError(message) { + throw new BindingError(message); + } + + var InternalError=undefined; + function throwInternalError(message) { + throw new InternalError(message); + } + function whenDependentTypesAreResolved(myTypes, dependentTypes, getTypeConverters) { + myTypes.forEach(function(type) { + typeDependencies[type] = dependentTypes; + }); + + function onComplete(typeConverters) { + var myTypeConverters = getTypeConverters(typeConverters); + if (myTypeConverters.length !== myTypes.length) { + throwInternalError('Mismatched type converter count'); + } + for (var i = 0; i < myTypes.length; ++i) { + registerType(myTypes[i], myTypeConverters[i]); + } + } + + var typeConverters = new Array(dependentTypes.length); + var unregisteredTypes = []; + var registered = 0; + dependentTypes.forEach(function(dt, i) { + if (registeredTypes.hasOwnProperty(dt)) { + typeConverters[i] = registeredTypes[dt]; + } else { + unregisteredTypes.push(dt); + if (!awaitingDependencies.hasOwnProperty(dt)) { + awaitingDependencies[dt] = []; + } + awaitingDependencies[dt].push(function() { + typeConverters[i] = registeredTypes[dt]; + ++registered; + if (registered === unregisteredTypes.length) { + onComplete(typeConverters); + } + }); + } + }); + if (0 === unregisteredTypes.length) { + onComplete(typeConverters); + } + } + /** @param {Object=} options */ + function registerType(rawType, registeredInstance, options) { + options = options || {}; + + if (!('argPackAdvance' in registeredInstance)) { + throw new TypeError('registerType registeredInstance requires argPackAdvance'); + } + + var name = registeredInstance.name; + if (!rawType) { + throwBindingError('type "' + name + '" must have a positive integer typeid pointer'); + } + if (registeredTypes.hasOwnProperty(rawType)) { + if (options.ignoreDuplicateRegistrations) { + return; + } else { + throwBindingError("Cannot register type '" + name + "' twice"); + } + } + + registeredTypes[rawType] = registeredInstance; + delete typeDependencies[rawType]; + + if (awaitingDependencies.hasOwnProperty(rawType)) { + var callbacks = awaitingDependencies[rawType]; + delete awaitingDependencies[rawType]; + callbacks.forEach(function(cb) { + cb(); + }); + } + } + function __embind_register_bool(rawType, name, size, trueValue, falseValue) { + var shift = getShiftFromSize(size); + + name = readLatin1String(name); + registerType(rawType, { + name: name, + 'fromWireType': function(wt) { + // ambiguous emscripten ABI: sometimes return values are + // true or false, and sometimes integers (0 or 1) + return !!wt; + }, + 'toWireType': function(destructors, o) { + return o ? trueValue : falseValue; + }, + 'argPackAdvance': 8, + 'readValueFromPointer': function(pointer) { + // TODO: if heap is fixed (like in asm.js) this could be executed outside + var heap; + if (size === 1) { + heap = HEAP8; + } else if (size === 2) { + heap = HEAP16; + } else if (size === 4) { + heap = HEAP32; + } else { + throw new TypeError("Unknown boolean type size: " + name); + } + return this['fromWireType'](heap[pointer >> shift]); + }, + destructorFunction: null, // This type does not need a destructor + }); + } + + var emval_free_list=[]; + + var emval_handle_array=[{},{value:undefined},{value:null},{value:true},{value:false}]; + function __emval_decref(handle) { + if (handle > 4 && 0 === --emval_handle_array[handle].refcount) { + emval_handle_array[handle] = undefined; + emval_free_list.push(handle); + } + } + + function count_emval_handles() { + var count = 0; + for (var i = 5; i < emval_handle_array.length; ++i) { + if (emval_handle_array[i] !== undefined) { + ++count; + } + } + return count; + } + + function get_first_emval() { + for (var i = 5; i < emval_handle_array.length; ++i) { + if (emval_handle_array[i] !== undefined) { + return emval_handle_array[i]; + } + } + return null; + } + function init_emval() { + Module['count_emval_handles'] = count_emval_handles; + Module['get_first_emval'] = get_first_emval; + } + function __emval_register(value) { + switch (value) { + case undefined :{ return 1; } + case null :{ return 2; } + case true :{ return 3; } + case false :{ return 4; } + default:{ + var handle = emval_free_list.length ? + emval_free_list.pop() : + emval_handle_array.length; + + emval_handle_array[handle] = {refcount: 1, value: value}; + return handle; + } + } + } + + function simpleReadValueFromPointer(pointer) { + return this['fromWireType'](HEAPU32[pointer >> 2]); + } + function __embind_register_emval(rawType, name) { + name = readLatin1String(name); + registerType(rawType, { + name: name, + 'fromWireType': function(handle) { + var rv = emval_handle_array[handle].value; + __emval_decref(handle); + return rv; + }, + 'toWireType': function(destructors, value) { + return __emval_register(value); + }, + 'argPackAdvance': 8, + 'readValueFromPointer': simpleReadValueFromPointer, + destructorFunction: null, // This type does not need a destructor + + // TODO: do we need a deleteObject here? write a test where + // emval is passed into JS via an interface + }); + } + + function _embind_repr(v) { + if (v === null) { + return 'null'; + } + var t = typeof v; + if (t === 'object' || t === 'array' || t === 'function') { + return v.toString(); + } else { + return '' + v; + } + } + + function floatReadValueFromPointer(name, shift) { + switch (shift) { + case 2: return function(pointer) { + return this['fromWireType'](HEAPF32[pointer >> 2]); + }; + case 3: return function(pointer) { + return this['fromWireType'](HEAPF64[pointer >> 3]); + }; + default: + throw new TypeError("Unknown float type: " + name); + } + } + function __embind_register_float(rawType, name, size) { + var shift = getShiftFromSize(size); + name = readLatin1String(name); + registerType(rawType, { + name: name, + 'fromWireType': function(value) { + return value; + }, + 'toWireType': function(destructors, value) { + // todo: Here we have an opportunity for -O3 level "unsafe" optimizations: we could + // avoid the following if() and assume value is of proper type. + if (typeof value !== "number" && typeof value !== "boolean") { + throw new TypeError('Cannot convert "' + _embind_repr(value) + '" to ' + this.name); + } + return value; + }, + 'argPackAdvance': 8, + 'readValueFromPointer': floatReadValueFromPointer(name, shift), + destructorFunction: null, // This type does not need a destructor + }); + } + + function new_(constructor, argumentList) { + if (!(constructor instanceof Function)) { + throw new TypeError('new_ called with constructor type ' + typeof(constructor) + " which is not a function"); + } + + /* + * Previously, the following line was just: + + function dummy() {}; + + * Unfortunately, Chrome was preserving 'dummy' as the object's name, even though at creation, the 'dummy' has the + * correct constructor name. Thus, objects created with IMVU.new would show up in the debugger as 'dummy', which + * isn't very helpful. Using IMVU.createNamedFunction addresses the issue. Doublely-unfortunately, there's no way + * to write a test for this behavior. -NRD 2013.02.22 + */ + var dummy = createNamedFunction(constructor.name || 'unknownFunctionName', function(){}); + dummy.prototype = constructor.prototype; + var obj = new dummy; + + var r = constructor.apply(obj, argumentList); + return (r instanceof Object) ? r : obj; + } + + function runDestructors(destructors) { + while (destructors.length) { + var ptr = destructors.pop(); + var del = destructors.pop(); + del(ptr); + } + } + function craftInvokerFunction(humanName, argTypes, classType, cppInvokerFunc, cppTargetFunc) { + // humanName: a human-readable string name for the function to be generated. + // argTypes: An array that contains the embind type objects for all types in the function signature. + // argTypes[0] is the type object for the function return value. + // argTypes[1] is the type object for function this object/class type, or null if not crafting an invoker for a class method. + // argTypes[2...] are the actual function parameters. + // classType: The embind type object for the class to be bound, or null if this is not a method of a class. + // cppInvokerFunc: JS Function object to the C++-side function that interops into C++ code. + // cppTargetFunc: Function pointer (an integer to FUNCTION_TABLE) to the target C++ function the cppInvokerFunc will end up calling. + var argCount = argTypes.length; + + if (argCount < 2) { + throwBindingError("argTypes array size mismatch! Must at least get return value and 'this' types!"); + } + + var isClassMethodFunc = (argTypes[1] !== null && classType !== null); + + // Free functions with signature "void function()" do not need an invoker that marshalls between wire types. + // TODO: This omits argument count check - enable only at -O3 or similar. + // if (ENABLE_UNSAFE_OPTS && argCount == 2 && argTypes[0].name == "void" && !isClassMethodFunc) { + // return FUNCTION_TABLE[fn]; + // } + + // Determine if we need to use a dynamic stack to store the destructors for the function parameters. + // TODO: Remove this completely once all function invokers are being dynamically generated. + var needsDestructorStack = false; + + for (var i = 1; i < argTypes.length; ++i) { // Skip return value at index 0 - it's not deleted here. + if (argTypes[i] !== null && argTypes[i].destructorFunction === undefined) { // The type does not define a destructor function - must use dynamic stack + needsDestructorStack = true; + break; + } + } + + var returns = (argTypes[0].name !== "void"); + + var argsList = ""; + var argsListWired = ""; + for (var i = 0; i < argCount - 2; ++i) { + argsList += (i!==0?", ":"")+"arg"+i; + argsListWired += (i!==0?", ":"")+"arg"+i+"Wired"; + } + + var invokerFnBody = + "return function "+makeLegalFunctionName(humanName)+"("+argsList+") {\n" + + "if (arguments.length !== "+(argCount - 2)+") {\n" + + "throwBindingError('function "+humanName+" called with ' + arguments.length + ' arguments, expected "+(argCount - 2)+" args!');\n" + + "}\n"; + + if (needsDestructorStack) { + invokerFnBody += + "var destructors = [];\n"; + } + + var dtorStack = needsDestructorStack ? "destructors" : "null"; + var args1 = ["throwBindingError", "invoker", "fn", "runDestructors", "retType", "classParam"]; + var args2 = [throwBindingError, cppInvokerFunc, cppTargetFunc, runDestructors, argTypes[0], argTypes[1]]; + + if (isClassMethodFunc) { + invokerFnBody += "var thisWired = classParam.toWireType("+dtorStack+", this);\n"; + } + + for (var i = 0; i < argCount - 2; ++i) { + invokerFnBody += "var arg"+i+"Wired = argType"+i+".toWireType("+dtorStack+", arg"+i+"); // "+argTypes[i+2].name+"\n"; + args1.push("argType"+i); + args2.push(argTypes[i+2]); + } + + if (isClassMethodFunc) { + argsListWired = "thisWired" + (argsListWired.length > 0 ? ", " : "") + argsListWired; + } + + invokerFnBody += + (returns?"var rv = ":"") + "invoker(fn"+(argsListWired.length>0?", ":"")+argsListWired+");\n"; + + if (needsDestructorStack) { + invokerFnBody += "runDestructors(destructors);\n"; + } else { + for (var i = isClassMethodFunc?1:2; i < argTypes.length; ++i) { // Skip return value at index 0 - it's not deleted here. Also skip class type if not a method. + var paramName = (i === 1 ? "thisWired" : ("arg"+(i - 2)+"Wired")); + if (argTypes[i].destructorFunction !== null) { + invokerFnBody += paramName+"_dtor("+paramName+"); // "+argTypes[i].name+"\n"; + args1.push(paramName+"_dtor"); + args2.push(argTypes[i].destructorFunction); + } + } + } + + if (returns) { + invokerFnBody += "var ret = retType.fromWireType(rv);\n" + + "return ret;\n"; + } else { + } + invokerFnBody += "}\n"; + + args1.push(invokerFnBody); + + var invokerFunction = new_(Function, args1).apply(null, args2); + return invokerFunction; + } + + function ensureOverloadTable(proto, methodName, humanName) { + if (undefined === proto[methodName].overloadTable) { + var prevFunc = proto[methodName]; + // Inject an overload resolver function that routes to the appropriate overload based on the number of arguments. + proto[methodName] = function() { + // TODO This check can be removed in -O3 level "unsafe" optimizations. + if (!proto[methodName].overloadTable.hasOwnProperty(arguments.length)) { + throwBindingError("Function '" + humanName + "' called with an invalid number of arguments (" + arguments.length + ") - expects one of (" + proto[methodName].overloadTable + ")!"); + } + return proto[methodName].overloadTable[arguments.length].apply(this, arguments); + }; + // Move the previous function into the overload table. + proto[methodName].overloadTable = []; + proto[methodName].overloadTable[prevFunc.argCount] = prevFunc; + } + } + /** @param {number=} numArguments */ + function exposePublicSymbol(name, value, numArguments) { + if (Module.hasOwnProperty(name)) { + if (undefined === numArguments || (undefined !== Module[name].overloadTable && undefined !== Module[name].overloadTable[numArguments])) { + throwBindingError("Cannot register public name '" + name + "' twice"); + } + + // We are exposing a function with the same name as an existing function. Create an overload table and a function selector + // that routes between the two. + ensureOverloadTable(Module, name, name); + if (Module.hasOwnProperty(numArguments)) { + throwBindingError("Cannot register multiple overloads of a function with the same number of arguments (" + numArguments + ")!"); + } + // Add the new function into the overload table. + Module[name].overloadTable[numArguments] = value; + } + else { + Module[name] = value; + if (undefined !== numArguments) { + Module[name].numArguments = numArguments; + } + } + } + + function heap32VectorToArray(count, firstElement) { + var array = []; + for (var i = 0; i < count; i++) { + array.push(HEAP32[(firstElement >> 2) + i]); + } + return array; + } + + /** @param {number=} numArguments */ + function replacePublicSymbol(name, value, numArguments) { + if (!Module.hasOwnProperty(name)) { + throwInternalError('Replacing nonexistant public symbol'); + } + // If there's an overload table for this symbol, replace the symbol in the overload table instead. + if (undefined !== Module[name].overloadTable && undefined !== numArguments) { + Module[name].overloadTable[numArguments] = value; + } + else { + Module[name] = value; + Module[name].argCount = numArguments; + } + } + + function dynCallLegacy(sig, ptr, args) { + var f = Module["dynCall_" + sig]; + return args && args.length ? f.apply(null, [ptr].concat(args)) : f.call(null, ptr); + } + function dynCall(sig, ptr, args) { + // Without WASM_BIGINT support we cannot directly call function with i64 as + // part of thier signature, so we rely the dynCall functions generated by + // wasm-emscripten-finalize + if (sig.indexOf('j') != -1) { + return dynCallLegacy(sig, ptr, args); + } + return wasmTable.get(ptr).apply(null, args) + } + function getDynCaller(sig, ptr) { + var argCache = []; + return function() { + argCache.length = arguments.length; + for (var i = 0; i < arguments.length; i++) { + argCache[i] = arguments[i]; + } + return dynCall(sig, ptr, argCache); + }; + } + function embind__requireFunction(signature, rawFunction) { + signature = readLatin1String(signature); + + function makeDynCaller() { + if (signature.indexOf('j') != -1) { + return getDynCaller(signature, rawFunction); + } + return wasmTable.get(rawFunction); + } + + var fp = makeDynCaller(); + if (typeof fp !== "function") { + throwBindingError("unknown function pointer with signature " + signature + ": " + rawFunction); + } + return fp; + } + + var UnboundTypeError=undefined; + + function getTypeName(type) { + var ptr = ___getTypeName(type); + var rv = readLatin1String(ptr); + _free(ptr); + return rv; + } + function throwUnboundTypeError(message, types) { + var unboundTypes = []; + var seen = {}; + function visit(type) { + if (seen[type]) { + return; + } + if (registeredTypes[type]) { + return; + } + if (typeDependencies[type]) { + typeDependencies[type].forEach(visit); + return; + } + unboundTypes.push(type); + seen[type] = true; + } + types.forEach(visit); + + throw new UnboundTypeError(message + ': ' + unboundTypes.map(getTypeName).join([', '])); + } + function __embind_register_function(name, argCount, rawArgTypesAddr, signature, rawInvoker, fn) { + var argTypes = heap32VectorToArray(argCount, rawArgTypesAddr); + name = readLatin1String(name); + + rawInvoker = embind__requireFunction(signature, rawInvoker); + + exposePublicSymbol(name, function() { + throwUnboundTypeError('Cannot call ' + name + ' due to unbound types', argTypes); + }, argCount - 1); + + whenDependentTypesAreResolved([], argTypes, function(argTypes) { + var invokerArgsArray = [argTypes[0] /* return value */, null /* no class 'this'*/].concat(argTypes.slice(1) /* actual params */); + replacePublicSymbol(name, craftInvokerFunction(name, invokerArgsArray, null /* no class 'this'*/, rawInvoker, fn), argCount - 1); + return []; + }); + } + + function integerReadValueFromPointer(name, shift, signed) { + // integers are quite common, so generate very specialized functions + switch (shift) { + case 0: return signed ? + function readS8FromPointer(pointer) { return HEAP8[pointer]; } : + function readU8FromPointer(pointer) { return HEAPU8[pointer]; }; + case 1: return signed ? + function readS16FromPointer(pointer) { return HEAP16[pointer >> 1]; } : + function readU16FromPointer(pointer) { return HEAPU16[pointer >> 1]; }; + case 2: return signed ? + function readS32FromPointer(pointer) { return HEAP32[pointer >> 2]; } : + function readU32FromPointer(pointer) { return HEAPU32[pointer >> 2]; }; + default: + throw new TypeError("Unknown integer type: " + name); + } + } + function __embind_register_integer(primitiveType, name, size, minRange, maxRange) { + name = readLatin1String(name); + if (maxRange === -1) { // LLVM doesn't have signed and unsigned 32-bit types, so u32 literals come out as 'i32 -1'. Always treat those as max u32. + maxRange = 4294967295; + } + + var shift = getShiftFromSize(size); + + var fromWireType = function(value) { + return value; + }; + + if (minRange === 0) { + var bitshift = 32 - 8*size; + fromWireType = function(value) { + return (value << bitshift) >>> bitshift; + }; + } + + var isUnsignedType = (name.indexOf('unsigned') != -1); + + registerType(primitiveType, { + name: name, + 'fromWireType': fromWireType, + 'toWireType': function(destructors, value) { + // todo: Here we have an opportunity for -O3 level "unsafe" optimizations: we could + // avoid the following two if()s and assume value is of proper type. + if (typeof value !== "number" && typeof value !== "boolean") { + throw new TypeError('Cannot convert "' + _embind_repr(value) + '" to ' + this.name); + } + if (value < minRange || value > maxRange) { + throw new TypeError('Passing a number "' + _embind_repr(value) + '" from JS side to C/C++ side to an argument of type "' + name + '", which is outside the valid range [' + minRange + ', ' + maxRange + ']!'); + } + return isUnsignedType ? (value >>> 0) : (value | 0); + }, + 'argPackAdvance': 8, + 'readValueFromPointer': integerReadValueFromPointer(name, shift, minRange !== 0), + destructorFunction: null, // This type does not need a destructor + }); + } + + function __embind_register_memory_view(rawType, dataTypeIndex, name) { + var typeMapping = [ + Int8Array, + Uint8Array, + Int16Array, + Uint16Array, + Int32Array, + Uint32Array, + Float32Array, + Float64Array, + ]; + + var TA = typeMapping[dataTypeIndex]; + + function decodeMemoryView(handle) { + handle = handle >> 2; + var heap = HEAPU32; + var size = heap[handle]; // in elements + var data = heap[handle + 1]; // byte offset into emscripten heap + return new TA(buffer, data, size); + } + + name = readLatin1String(name); + registerType(rawType, { + name: name, + 'fromWireType': decodeMemoryView, + 'argPackAdvance': 8, + 'readValueFromPointer': decodeMemoryView, + }, { + ignoreDuplicateRegistrations: true, + }); + } + + function __embind_register_std_string(rawType, name) { + name = readLatin1String(name); + var stdStringIsUTF8 + //process only std::string bindings with UTF8 support, in contrast to e.g. std::basic_string + = (name === "std::string"); + + registerType(rawType, { + name: name, + 'fromWireType': function(value) { + var length = HEAPU32[value >> 2]; + + var str; + if (stdStringIsUTF8) { + var decodeStartPtr = value + 4; + // Looping here to support possible embedded '0' bytes + for (var i = 0; i <= length; ++i) { + var currentBytePtr = value + 4 + i; + if (i == length || HEAPU8[currentBytePtr] == 0) { + var maxRead = currentBytePtr - decodeStartPtr; + var stringSegment = UTF8ToString(decodeStartPtr, maxRead); + if (str === undefined) { + str = stringSegment; + } else { + str += String.fromCharCode(0); + str += stringSegment; + } + decodeStartPtr = currentBytePtr + 1; + } + } + } else { + var a = new Array(length); + for (var i = 0; i < length; ++i) { + a[i] = String.fromCharCode(HEAPU8[value + 4 + i]); + } + str = a.join(''); + } + + _free(value); + + return str; + }, + 'toWireType': function(destructors, value) { + if (value instanceof ArrayBuffer) { + value = new Uint8Array(value); + } + + var getLength; + var valueIsOfTypeString = (typeof value === 'string'); + + if (!(valueIsOfTypeString || value instanceof Uint8Array || value instanceof Uint8ClampedArray || value instanceof Int8Array)) { + throwBindingError('Cannot pass non-string to std::string'); + } + if (stdStringIsUTF8 && valueIsOfTypeString) { + getLength = function() {return lengthBytesUTF8(value);}; + } else { + getLength = function() {return value.length;}; + } + + // assumes 4-byte alignment + var length = getLength(); + var ptr = _malloc(4 + length + 1); + HEAPU32[ptr >> 2] = length; + if (stdStringIsUTF8 && valueIsOfTypeString) { + stringToUTF8(value, ptr + 4, length + 1); + } else { + if (valueIsOfTypeString) { + for (var i = 0; i < length; ++i) { + var charCode = value.charCodeAt(i); + if (charCode > 255) { + _free(ptr); + throwBindingError('String has UTF-16 code units that do not fit in 8 bits'); + } + HEAPU8[ptr + 4 + i] = charCode; + } + } else { + for (var i = 0; i < length; ++i) { + HEAPU8[ptr + 4 + i] = value[i]; + } + } + } + + if (destructors !== null) { + destructors.push(_free, ptr); + } + return ptr; + }, + 'argPackAdvance': 8, + 'readValueFromPointer': simpleReadValueFromPointer, + destructorFunction: function(ptr) { _free(ptr); }, + }); + } + + function __embind_register_std_wstring(rawType, charSize, name) { + name = readLatin1String(name); + var decodeString, encodeString, getHeap, lengthBytesUTF, shift; + if (charSize === 2) { + decodeString = UTF16ToString; + encodeString = stringToUTF16; + lengthBytesUTF = lengthBytesUTF16; + getHeap = function() { return HEAPU16; }; + shift = 1; + } else if (charSize === 4) { + decodeString = UTF32ToString; + encodeString = stringToUTF32; + lengthBytesUTF = lengthBytesUTF32; + getHeap = function() { return HEAPU32; }; + shift = 2; + } + registerType(rawType, { + name: name, + 'fromWireType': function(value) { + // Code mostly taken from _embind_register_std_string fromWireType + var length = HEAPU32[value >> 2]; + var HEAP = getHeap(); + var str; + + var decodeStartPtr = value + 4; + // Looping here to support possible embedded '0' bytes + for (var i = 0; i <= length; ++i) { + var currentBytePtr = value + 4 + i * charSize; + if (i == length || HEAP[currentBytePtr >> shift] == 0) { + var maxReadBytes = currentBytePtr - decodeStartPtr; + var stringSegment = decodeString(decodeStartPtr, maxReadBytes); + if (str === undefined) { + str = stringSegment; + } else { + str += String.fromCharCode(0); + str += stringSegment; + } + decodeStartPtr = currentBytePtr + charSize; + } + } + + _free(value); + + return str; + }, + 'toWireType': function(destructors, value) { + if (!(typeof value === 'string')) { + throwBindingError('Cannot pass non-string to C++ string type ' + name); + } + + // assumes 4-byte alignment + var length = lengthBytesUTF(value); + var ptr = _malloc(4 + length + charSize); + HEAPU32[ptr >> 2] = length >> shift; + + encodeString(value, ptr + 4, length + charSize); + + if (destructors !== null) { + destructors.push(_free, ptr); + } + return ptr; + }, + 'argPackAdvance': 8, + 'readValueFromPointer': simpleReadValueFromPointer, + destructorFunction: function(ptr) { _free(ptr); }, + }); + } + + function __embind_register_void(rawType, name) { + name = readLatin1String(name); + registerType(rawType, { + isVoid: true, // void return values can be optimized out sometimes + name: name, + 'argPackAdvance': 0, + 'fromWireType': function() { + return undefined; + }, + 'toWireType': function(destructors, o) { + // TODO: assert if anything else is given? + return undefined; + }, + }); + } + + function _abort() { + abort(); + } + + function _emscripten_memcpy_big(dest, src, num) { + HEAPU8.copyWithin(dest, src, src + num); + } + + function abortOnCannotGrowMemory(requestedSize) { + abort('OOM'); + } + function _emscripten_resize_heap(requestedSize) { + var oldSize = HEAPU8.length; + abortOnCannotGrowMemory(requestedSize); + } + + function _fd_close(fd) {try { + + var stream = SYSCALLS.getStreamFromFD(fd); + FS.close(stream); + return 0; + } catch (e) { + if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); + return e.errno; + } + } + + function _fd_read(fd, iov, iovcnt, pnum) {try { + + var stream = SYSCALLS.getStreamFromFD(fd); + var num = SYSCALLS.doReadv(stream, iov, iovcnt); + HEAP32[((pnum)>>2)] = num + return 0; + } catch (e) { + if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); + return e.errno; + } + } + + function _fd_seek(fd, offset_low, offset_high, whence, newOffset) {try { + + + var stream = SYSCALLS.getStreamFromFD(fd); + var HIGH_OFFSET = 0x100000000; // 2^32 + // use an unsigned operator on low and shift high by 32-bits + var offset = offset_high * HIGH_OFFSET + (offset_low >>> 0); + + var DOUBLE_LIMIT = 0x20000000000000; // 2^53 + // we also check for equality since DOUBLE_LIMIT + 1 == DOUBLE_LIMIT + if (offset <= -DOUBLE_LIMIT || offset >= DOUBLE_LIMIT) { + return -61; + } + + FS.llseek(stream, offset, whence); + (tempI64 = [stream.position>>>0,(tempDouble=stream.position,(+(Math.abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? ((Math.min((+(Math.floor((tempDouble)/4294967296.0))), 4294967295.0))|0)>>>0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)],HEAP32[((newOffset)>>2)] = tempI64[0],HEAP32[(((newOffset)+(4))>>2)] = tempI64[1]); + if (stream.getdents && offset === 0 && whence === 0) stream.getdents = null; // reset readdir state + return 0; + } catch (e) { + if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); + return e.errno; + } + } + + function _fd_write(fd, iov, iovcnt, pnum) {try { + + var stream = SYSCALLS.getStreamFromFD(fd); + var num = SYSCALLS.doWritev(stream, iov, iovcnt); + HEAP32[((pnum)>>2)] = num + return 0; + } catch (e) { + if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); + return e.errno; + } + } + + function _setTempRet0($i) { + setTempRet0(($i) | 0); + } +var FSNode = /** @constructor */ function(parent, name, mode, rdev) { + if (!parent) { + parent = this; // root node sets parent to itself + } + this.parent = parent; + this.mount = parent.mount; + this.mounted = null; + this.id = FS.nextInode++; + this.name = name; + this.mode = mode; + this.node_ops = {}; + this.stream_ops = {}; + this.rdev = rdev; + }; + var readMode = 292/*292*/ | 73/*73*/; + var writeMode = 146/*146*/; + Object.defineProperties(FSNode.prototype, { + read: { + get: /** @this{FSNode} */function() { + return (this.mode & readMode) === readMode; + }, + set: /** @this{FSNode} */function(val) { + val ? this.mode |= readMode : this.mode &= ~readMode; + } + }, + write: { + get: /** @this{FSNode} */function() { + return (this.mode & writeMode) === writeMode; + }, + set: /** @this{FSNode} */function(val) { + val ? this.mode |= writeMode : this.mode &= ~writeMode; + } + }, + isFolder: { + get: /** @this{FSNode} */function() { + return FS.isDir(this.mode); + } + }, + isDevice: { + get: /** @this{FSNode} */function() { + return FS.isChrdev(this.mode); + } + } + }); + FS.FSNode = FSNode; + FS.staticInit();; +embind_init_charCodes(); +BindingError = Module['BindingError'] = extendError(Error, 'BindingError');; +InternalError = Module['InternalError'] = extendError(Error, 'InternalError');; +init_emval();; +UnboundTypeError = Module['UnboundTypeError'] = extendError(Error, 'UnboundTypeError');; +var ASSERTIONS = false; + + + +/** @type {function(string, boolean=, number=)} */ +function intArrayFromString(stringy, dontAddNull, length) { + var len = length > 0 ? length : lengthBytesUTF8(stringy)+1; + var u8array = new Array(len); + var numBytesWritten = stringToUTF8Array(stringy, u8array, 0, u8array.length); + if (dontAddNull) u8array.length = numBytesWritten; + return u8array; +} + +function intArrayToString(array) { + var ret = []; + for (var i = 0; i < array.length; i++) { + var chr = array[i]; + if (chr > 0xFF) { + if (ASSERTIONS) { + assert(false, 'Character code ' + chr + ' (' + String.fromCharCode(chr) + ') at offset ' + i + ' not in 0x00-0xFF.'); + } + chr &= 0xFF; + } + ret.push(String.fromCharCode(chr)); + } + return ret.join(''); +} + + +var asmLibraryArg = { + "__cxa_allocate_exception": ___cxa_allocate_exception, + "__cxa_throw": ___cxa_throw, + "__sys_fcntl64": ___sys_fcntl64, + "__sys_ioctl": ___sys_ioctl, + "__sys_open": ___sys_open, + "_embind_register_bool": __embind_register_bool, + "_embind_register_emval": __embind_register_emval, + "_embind_register_float": __embind_register_float, + "_embind_register_function": __embind_register_function, + "_embind_register_integer": __embind_register_integer, + "_embind_register_memory_view": __embind_register_memory_view, + "_embind_register_std_string": __embind_register_std_string, + "_embind_register_std_wstring": __embind_register_std_wstring, + "_embind_register_void": __embind_register_void, + "abort": _abort, + "emscripten_memcpy_big": _emscripten_memcpy_big, + "emscripten_resize_heap": _emscripten_resize_heap, + "fd_close": _fd_close, + "fd_read": _fd_read, + "fd_seek": _fd_seek, + "fd_write": _fd_write, + "setTempRet0": _setTempRet0 +}; +var asm = createWasm(); +/** @type {function(...*):?} */ +var ___wasm_call_ctors = Module["___wasm_call_ctors"] = function() { + return (___wasm_call_ctors = Module["___wasm_call_ctors"] = Module["asm"]["__wasm_call_ctors"]).apply(null, arguments); +}; + +/** @type {function(...*):?} */ +var _memset = Module["_memset"] = function() { + return (_memset = Module["_memset"] = Module["asm"]["memset"]).apply(null, arguments); +}; + +/** @type {function(...*):?} */ +var _malloc = Module["_malloc"] = function() { + return (_malloc = Module["_malloc"] = Module["asm"]["malloc"]).apply(null, arguments); +}; + +/** @type {function(...*):?} */ +var ___getTypeName = Module["___getTypeName"] = function() { + return (___getTypeName = Module["___getTypeName"] = Module["asm"]["__getTypeName"]).apply(null, arguments); +}; + +/** @type {function(...*):?} */ +var ___embind_register_native_and_builtin_types = Module["___embind_register_native_and_builtin_types"] = function() { + return (___embind_register_native_and_builtin_types = Module["___embind_register_native_and_builtin_types"] = Module["asm"]["__embind_register_native_and_builtin_types"]).apply(null, arguments); +}; + +/** @type {function(...*):?} */ +var _ntohs = Module["_ntohs"] = function() { + return (_ntohs = Module["_ntohs"] = Module["asm"]["ntohs"]).apply(null, arguments); +}; + +/** @type {function(...*):?} */ +var _htons = Module["_htons"] = function() { + return (_htons = Module["_htons"] = Module["asm"]["htons"]).apply(null, arguments); +}; + +/** @type {function(...*):?} */ +var _htonl = Module["_htonl"] = function() { + return (_htonl = Module["_htonl"] = Module["asm"]["htonl"]).apply(null, arguments); +}; + +/** @type {function(...*):?} */ +var ___errno_location = Module["___errno_location"] = function() { + return (___errno_location = Module["___errno_location"] = Module["asm"]["__errno_location"]).apply(null, arguments); +}; + +/** @type {function(...*):?} */ +var _free = Module["_free"] = function() { + return (_free = Module["_free"] = Module["asm"]["free"]).apply(null, arguments); +}; + +/** @type {function(...*):?} */ +var stackSave = Module["stackSave"] = function() { + return (stackSave = Module["stackSave"] = Module["asm"]["stackSave"]).apply(null, arguments); +}; + +/** @type {function(...*):?} */ +var stackRestore = Module["stackRestore"] = function() { + return (stackRestore = Module["stackRestore"] = Module["asm"]["stackRestore"]).apply(null, arguments); +}; + +/** @type {function(...*):?} */ +var stackAlloc = Module["stackAlloc"] = function() { + return (stackAlloc = Module["stackAlloc"] = Module["asm"]["stackAlloc"]).apply(null, arguments); +}; + +/** @type {function(...*):?} */ +var _memalign = Module["_memalign"] = function() { + return (_memalign = Module["_memalign"] = Module["asm"]["memalign"]).apply(null, arguments); +}; + +/** @type {function(...*):?} */ +var dynCall_jiji = Module["dynCall_jiji"] = function() { + return (dynCall_jiji = Module["dynCall_jiji"] = Module["asm"]["dynCall_jiji"]).apply(null, arguments); +}; + + + + + +// === Auto-generated postamble setup entry stuff === + + + +var calledRun; + +/** + * @constructor + * @this {ExitStatus} + */ +function ExitStatus(status) { + this.name = "ExitStatus"; + this.message = "Program terminated with exit(" + status + ")"; + this.status = status; +} + +var calledMain = false; + +dependenciesFulfilled = function runCaller() { + // If run has never been called, and we should call run (INVOKE_RUN is true, and Module.noInitialRun is not false) + if (!calledRun) run(); + if (!calledRun) dependenciesFulfilled = runCaller; // try this again later, after new deps are fulfilled +}; + +/** @type {function(Array=)} */ +function run(args) { + args = args || arguments_; + + if (runDependencies > 0) { + return; + } + + preRun(); + + // a preRun added a dependency, run will be called later + if (runDependencies > 0) { + return; + } + + function doRun() { + // run may have just been called through dependencies being fulfilled just in this very frame, + // or while the async setStatus time below was happening + if (calledRun) return; + calledRun = true; + Module['calledRun'] = true; + + if (ABORT) return; + + initRuntime(); + + preMain(); + + readyPromiseResolve(Module); + if (Module['onRuntimeInitialized']) Module['onRuntimeInitialized'](); + + postRun(); + } + + if (Module['setStatus']) { + Module['setStatus']('Running...'); + setTimeout(function() { + setTimeout(function() { + Module['setStatus'](''); + }, 1); + doRun(); + }, 1); + } else + { + doRun(); + } +} +Module['run'] = run; + +/** @param {boolean|number=} implicit */ +function exit(status, implicit) { + EXITSTATUS = status; + + // if this is just main exit-ing implicitly, and the status is 0, then we + // don't need to do anything here and can just leave. if the status is + // non-zero, though, then we need to report it. + // (we may have warned about this earlier, if a situation justifies doing so) + if (implicit && keepRuntimeAlive() && status === 0) { + return; + } + + if (keepRuntimeAlive()) { + } else { + + exitRuntime(); + + if (Module['onExit']) Module['onExit'](status); + + ABORT = true; + } + + quit_(status, new ExitStatus(status)); +} + +if (Module['preInit']) { + if (typeof Module['preInit'] == 'function') Module['preInit'] = [Module['preInit']]; + while (Module['preInit'].length > 0) { + Module['preInit'].pop()(); + } +} + +run(); + + + + + + + + return Module.ready +} +); +})(); +if (typeof exports === 'object' && typeof module === 'object') + module.exports = Module; +else if (typeof define === 'function' && define['amd']) + define([], function() { return Module; }); +else if (typeof exports === 'object') + exports["Module"] = Module; diff --git a/wdecryptor.wasm b/wdecryptor.wasm index 961984884b8ba9cd32861df1ea8417d6992e9de1..00cecda8c6e554bcf63e8fdf45c62ff402bb87e2 100755 GIT binary patch literal 45947 zcmdVD3!F{W`v<)DK9@N&=giC=48yqWb0Xt@$^AN8xzwnXbgwbSV9tygGjj|IGlWzs zT~s1bid>>Zg(QSZQX++-BqB+QT;K0^t$og%xlr%#_xrz}-eJz!dtILASsf2> zQPK*As*0khkBloWR;u(@)S~`sk@!&h+lq>KsTCC|{JT;n;>*D=d^^QAE)=T@ z4P~9^F}6q@+h4zvAXfzAiQWgL>duZQH06|r4899a3Q!|DR$jlj- znx8Q^vmlU>pE_uGPI@3SH%EzNeL`w#`pC4@wCwEM^t3=mYR1U)jA5c$Wwl#Y2ZrS5 zj!>K|i7yARFgJ6cVz0PvKyGff;$mH5xqbzKfvE+7{LGxevUkl2Ta2)p2;^1EHOUxS zn3gU3CzPwq%n4)+&d8Spl)~s*Xr2$V@HBNgGx$BsY*cEI)(bT0{)ubfgVb z+?QzJLWA_|+=2{6y-bS{`I&(X#Z6KiX#;Ze14NYBq47Rbl}mV(UtGE#?R zqzzNVe8z`WVub0#Mx_qO9Bk2EkP)~gW9YD(GXl*O?GlJddqGA5jskT~!qaek1VfQRNTH@Z+$lthcH1R@EG6rz)Z@^x<@>s?%xL zM7a{Bs!@ufmHa^I@KbWH$%6mrGm0wwkA9+5jr2RfN{7R3bK7jus%o=2Jh4tSqEbwZ z3nNo83970I!Zi(}aNr+C!Ja7Re+R0?kIiOtNAL$Q9Igmgq|4=sjEp2l?0~D<+-R-H zo~l~equVDIgXQWlwLt^NByp)0YsH%LFZz%)5t;cJ>4A`aNDZV7$j(p|=TKoBl%F&R{9uU4 zs9_m5qz%nb?rWG@PUCXY0-1#wscA4c1BPd22QqU~1885MjCSM%a)%Tsr!~irKyFTf za!y`kD`zwvaPsqWa#Mv3qG_6}*$3rkWGIKU$bvvxdRE`G!VKjP%_DAZ&L{x=8Oonp zl(;u(yOdL!3&Tmv&K#Vh9M(JoN9A12q53oZnaV{ia+_e6Vyf<>W7-v0)^Fab-5TvH z^+|1>_OSM{_L#OxTdlpPt<%J_Rv_d~^>1n%3E8t&gAEJa$f zmTYLmSuX2b}??)Sy|!Cv(9 z_-uZXous&Yy5Ddb(S9QqRgQu@{QAwE$7XFD>o+|kj99RN$(SEb4L=y&T$&1Gq776?S6-P9{TGQvWC`s^DA|)|?BQ6Zhf+;Vq zwhR1mM1v{|%~Ml8_~1T)pQ8bqI8?*||F{LuW3WJ9hTvUqjNjrE=s_^h19@X#Wl+zn zBwrP@2NXBamkegfuTOn5G8}!7FK@gJR$}mFkgr+t`^RWs9{Wo#t=&@wdnaGKg}t4x zDzSS2trYgBe%PNKL|%Me};EV?!2bm$HE+VxNY1OhwcRs#nx*Td5tPjrk@>Q^_Jl0=cJG1}{E6b!_!|o48a0oOgX1% z-H9Q7(;l49%Ar|w5ofGX4IHF0{IY2ky1C_KqTr=f4qT{D8 z{BeIcrj6%+*?@TqVX}oVMU}#I=CcVqF!3drChlK74~pjanT#EK$5^WVRh_gQ9-`2h8s4_ zodY&FgDMciSrsgI5+m%HXv(>I_Ts|nU}2QtJtjm{PzUC1+O`LC5Nj!3oTwlf@2=fC z&~L_+tq<&l1NZqE5| zq#hy_GZ9}F>Ap{wm%tdU3|wITM7KmX}U$zI57H9Aqn?}Kxu z-xubsn#Ex9aruEGhaqwpt1z4NxPG6rjpjjPAp~$D0&+DpUiHd%J0Xri2GC2x0k+Xx zXdEkiw;%3SxUp)X33+1Pj6IN>_z^J6Z8SJogdzwV5Iz+7eOk2QcDv^y>@PwE;upjq zBB1e`#cBsd(UJ|DsiLRZ{#u42;F{NADhLtqX?8`_!svy-5YME)CzbMMk*TU(7_%eRNA0kT-n-NtQvdgU{}{d_RDt;T5bLX;Z8QEdkM#jrXNSSx-s=0{zA)Z|AM zelT(Yd%#o}AkiN9Kw5#%X2ukn=OXgVVpl#xM%3EOs-lRu2=s98w3_Im2_e|bi)x;! z1qe}k@sYp}gC9x!XwHvz{74SBzt{Yq+22n8;@PsCPpf}FiH-mLB-Z`+lUVcLPhypS zKZ%}yF^T_c`)d!{U*r)lV}BoZBmTVtA#;|`Sr<*2my0kH0!D=CLQqPg({+PLRz@OO$&?|Wz|%N+VfRH6Z)6x=Tw8ci z1-ym}Bk`cQgDo9lEpctNL={^`pry-jnl7YJ^qPi~xk_XvdExQ7Iw-u3=%6q~>O$WR zic?(axMD8U1t=Y`$Uq}e3zvo~)~e!)wODolyjR77178UE&DiVcHqDWKUnHEMgUco{ z>`086SkTA?AgCjJv?XwFq=1aPDw*qzl4;yXzgNQ&3VCR+8^0d>M&Z{%c;WxRuOfd; zgwtWSY1pm7>PoEGnkXPD;8nu!^?;$|mo5SqWf8EH^eo-RCEFNouP3aHX+bkQ-Y8j2 zlomWA%Ik1*nnDw%{J)(LpHea#YBmsKv#A=FY- zYe`W>zFdeZ7#Nh+D6r7?e<89_Qe-_8S!i}7^du@Ix*muwOHd;O6MBj^LSg@b{`(>% z4F(9fm zWFT};)eXNF3LL73pp;ZXb4oRaaV)uqvRhq4k`%NbcA?x9RbEN^fkpxvVrik}Qrf8K z0wWsI6giQxsH?aa+Es^Ti*2yQ3ih9hU4C=3AvR_p>Bv%uk6wx34y=LQoV?@w98CzR zQ%j~nMa-@RupPpD41;snxoZ=B5z-zQPJZhFT6EMi5Qo`AJ}C6^3nhDx~V zvOT%ICMywYl&wq%RU%X>TWN$U5$ct#ObS&ZR4rTCJXDELyKH5`+T|7sB!ewxTI4 zOVuo&25HeuWbE|B8u9|j75${9C-8o@%FRet*Qfzn6#Uvihh|mT{Fr@-4I61TQw>1o zk_=6MLaV`BQhb~SAHD8K->CGoZZl8qa5gQ&3^+Amcp-(OiI z?^~;2lM^)C%;yXwqd{sNG}@n}Ptm+~4Oq+ry!I*jd@Y*fsz7Zsry{Qhm02PDGDB>Sf_$PD)hP(HzA&l zLT!X86I@3mRu8-rJ>F#MlPwL!oq!^}J-ONe{pD3h+`6MsD_VQq@qj09&~}ODv+F*? z?v7NeY~N&GFf&fS`~n)(7iaP!Zr@J8Ob(JHv&tnHp9`T z5RzMnc5X!xw@A|~dKbN`In3{N^78_!$vwpLo z-UuC;+(5roxMfwpO(MBge%%ow2WHD%34nEwhSf@O@yL8c9AVXVoaO*b>%<26DrDIj zuLoTX6-JBRSPb}P`PCQvFpI(%CD>CPb7s196%mG_-(CYKXLrFpXow&UuWRmV0-*jj zZG?HcGek{zyf8owg&^zqn0CMZlO`bD!!{}k0OMZ#-Xk<$KRRN(j%e}8p9iGUszWtmKX-f#=&|;BFxY;Wwl>c zhcq&q(*|~$s-7!BnQ;DY$h!dVGB4sMA~?BV`!E3z5}79f=1ZO}rBXorFxGty<)yd} z78W-`p`PTvMs>mFAnMWK2Z1*W>m}hr47e@?3kVwEC++(E2!) zuDXihjCHqHo#lZL06Ya3hycK&Ej*bcVsZi1$(~=@)HX%>82HW^jl7tBjKijn^}@F{ z^4d%lk(eq>JOU$N#lkMn>%wIu;;YC!FCuJ!M6hQ>>2~v#Mp$gQ^&)dYBd^Es=*6nJ zqLDY+h}Orc=7vVz7$Zg>ubLk>^2Qpm`U9%@btA8C==ucJ+}p?-XT<3fRrBXY-bzL# zeUfVa+Q?hksH{Jzn&%sNs~A=E$*TE4V{g0>uRo;f53Am)=EIG>)v$M4O?T*zsNMwg zna1AgMuJft_fu4F4b$#TG~aIQt!dOS5{;U=Q-4(T)-pA3ZF56oZylqSQQN44(#KS< zfwo?Adt!aUK~ThFMcPgTvSO}tkcSL#ow=JF=q z`bK^IN!8rb#G7O!=})QV*(TlwMg#q6)qJ_Bx1rHcpN37xrrt(IBmEiGJlNFR*l4Uj ztC|yXah{)W9dmmlS8VTc!q zQC_r_40E9vCQ3r%L~h`+1%bZ(Pk{EgtS8XlDFF&j;;afd>C_|3 zc!OB?-+*~H42h|)iRr;)ZNI5;Xo zxT}kG{|%gVgtPv?hqHljKK$?DY$Tjb|2>?|g!9pV59edT`Q*QcvxRUz{qNyyC7jRx zdpO$&=kxy_&KHEU{lACvCE@J&2XNw$>o7NepwLqz{DSKiCHullgeLB?6sb1OD(PS2 z1}<2HYXO9f2poqqY>ah_>TfPtEkNxK2es#tZ3U>km#h|`zO_IlAWfiu$F^{mf~-7} z73&ri`zojq-S=DF1*-4aO26cwez;_{0Cm6uRh^Xl$hH^Z&%#L&H3uuI5deO&0EnAI z;WvlFZ+;HHITC(zH2mh5@S9`dH@}A891p+wE&S$0_|5O(Hz%zdouad$VTt63g5xd9 z6l`u;reN+>WeSR0l_^*hRv_5%hlSG3Wun5?R#f@tr7BK^S6J5q)amdFEezCO;T5*9 ziZkIA_OObx;T4XsigV!=;XTfWSA_St5MJR70|jvwqZK2Mkk{47_$M|gkg-T9VR5Qb z;}VOoP-tzf9(w1-#b;J;hAp;d_y{Nw^U{z=p1jJq85NT{AQDs!W1}kU} z%3B2i*5EjU`X;OVwyx~wi+a3HL} zspvc54C_MGv}9ynPHN2Ss!S}2#5vMHNa7+{@r&k0c4jpmXXDhXY@DR^HWj3z(d~rB zq@1FU*JOoas(A#Uzko$p@3?E}$D zL5;-U+bp_HbeRY*YK;V66R|zO{%~yi@4~}k)EJxzoKN>eZ+Stgh#2Dp**=1`p-sj7 zkqE1B2sN*_aN_AL0U(@K)VK2~+$<17*W6jw?C=P2sIv(YcvqK?mhqwrh$@P;*lPEI za%7}@8uFk9CJ+g)MW!fAii^gxXvi)i5rJJb?6TRgA;QfzyQ#Pjgm|RFzF-n9PMJ2Q z^=-+9f@CM3L_-*alp~t-z$NCJyEV2vQZ2`cMmQX9;CS-+vm^XC)jV$egpsH>G!s{@ zY_A4jcz}%upDSo5NVRjyk=BGnSJVgu5gUo}*+>?M#Y1VJ1syPbq>lR&*p}hkVk%E+ zeqJF>j9XQogdHLim*{JaB@wwr^SMomySAbMtU0bf($M;3jjggEjV4SE0qo*gc5K)f z);^S>^65Pchg@%tT~4JZnv3abEZh*p8~cis=mfyP9+i~CB#k?N*j?gohR3hR=!+=9 z%o`HOb4gB#AYRc?^L>~BObw62cTiIBU5veA9O-4g z4LnA{a~ywTL6ikk!?OtJ1#C~vSCL|lCKV=*a-7Q3k^DQctjMss~G3>3F21s`qh0DK|Xh+|P9Hk!vPW+Ei=M-F0r{F7>|Us5GkaZ zvJhqAa1u0+)8`bnLc-Ob5)zGCCuuTZuY5>tV<$ERQiI0AFW6va`4p)$%TRNKwu&QB zPC)iKg$`@bK{e3}kqqylxLc{**rP7MAV~#;CPFVU=~_yn&nD=_B-4D_KyMX8bFZSA z!}QF?=C|B$#TMx4wiH}!?~rhy;n@$l4Z*!A6+E|_FVeV}D%~9>2|i1H)kM`;mp{t z7TaKeK$fk6&E=&nrC@a{LL(*7J&sHRSlG+!pqUUKRf><~EucxiR?0O&e8N2q*ot-v zy4%G*F^Dt`+BEtu!scT$_-Kx&X}GNdLr$Zmnu!6k&Tz5SXZFF9OxL=964Yq0v zfQy0fiAC6e@{W!`h3C@D(HM(qOOaAcV=PIt*+{b>&c=8LF>q-D*#Rzju7*i7RXIw7 zF$MuB*GH=yw7wXj$08hRN5p{g;v%@(_ib>>l%DEftTd?T5eo_ow&{u{oH>w)JDkv8 z%R6i@GkO3?fU?vk2V9(twrfG2FasrB!Admq6q@@)*C3z}WD_1&LMq0?ffp}!EsGm= z82~C3n#U^y5Q1L<(H<)lfpBWHpJt3N?--)U?qy3$~gd4=pz1JWAddo<}vXIz|L&T4#*u9ANA}}L94?73{86Ie~ zFFNFx04bX4?4!?Dz0vF)ZPtUJ^A1J>fr%>bK_O00`C>?BGz~~JD>dx9#bB7RW<3Ni zz!`0LvWQV?sA72Fs-K4}sL>IEp2mu*KaF*gxba4d=@%=MXaFVp$UG0GjS3Ef-+yM*&p zE+!%--W`v2C|1qwSeHb4DwAr9tcV7-WN%fELky%eVc;w5NsLQTHJd%r;Y<{w3d;qa zaj61+ST}ftS>7yaYg0T4!Ml!lQBt+w4I{v+!5cz|58jAQRoq5p)5YJEM94$5>BMMs%ekGh%4bVi9Cw6xgW8`zrKjHP~LI zmyZYKV~IYCu~H0!#~9qka{a)i60k{C@{86gq-&CL*FLIC!Zg8(bJbb0G^VOsb+E#}Qh0icGyz zd>DAa`bkHHF^WJ;qoKC}ohF8kR?G_on}1u@{OVZ#|)x4X5NqCO%e%B3(wLYYSgbi5P&D)PFp z;7F_5C;O0Fz1d=U(+Ydxoe#~e=C)GJC##w|)_P@_(v5p1`kjym#mn?IraXukc%q7Z zTDPdNW9EfGF-(3@y_I<-FXVs}V7j$=;x%F=otYVn%0aR*Dm%;SYcnHLkSAjH)nO4{ zAoB*rnpj2=j$uRmjbujgT03PFc@MfjmLub37DF2FajnmmXk`LH0EHB*mtu{Ifa zJ0apyC=K@%0D=;VTsl%GFq3<5-g|*&9zc>8r@wi(P;>9nm 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 IULWQE0VzN!lmGw# literal 35944 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 -- 2.25.1

x>%A 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%0Ak;$EfkM;4kdSNMANYyO`KKUe*l zy1VdQ;McUD3(t&xP4AHASu^&Oc#bG|Eb|v>HZ*H*iN{|MW9LiU0@wl1(D_w*ZRoyz zh38zq?%yvHwX^V()~{>7NqOn|?{bVWwY1(;c=g0q8Px2KmDe5(6( zXGUp(|M45Xs?vfpqu=n)l!-d4w7|*u4Q+O5!Kb?4(1X%r8O9vx85-u?(gL^RH>`Q` zUUqe9!P(PqIP*&jydUnVyge5GS!eYW2UyK)UA#DaRg0$acRM)vEMY7l)ClT z17ggY(gF|QH?4;JjPs~8Kb9{n&8p>pOnT0ix>TAmOIs#oYU#C7UY7B= zOw1>w8MCbA(lfN|i2MwlC#7+0-wK)dpOSL7)jDY$TYI{+z>E5A{TZ1U&q}jln^EbN zU|Y}0G4@J1##vQb;Pm{CuU^{A@jox^<)|;nG1`lAj2@FmHeQnVGFQucSue{mc7q(_ zyizza7R-3HFa|4TtdWTtmx=b8O!T!fFZ=+27 z@0Ys2qyO>fs@g0Q?E{(UAIikoBoi|w6YC=>ch%l3<*qs(mlk|eP&HpmX~DNPRr7yR z_>RMZ8lTEU+aeP^EfeE2nV4H;Vtpt89Ew07bJ&djm`*MtQ)X34}qTPA8yCfXdC=yPRa%quJKW2$Xd%fy;56MKP7 zoP`o`d?A_m7nK$GDAiFH%S2lu@1@ts#CTXH<|8t(9+in5mWlIN;iF?wj-@j3FDu*& z%W~ApM0;E&`V%rSmdnJ9$i#Y5esp_&N;X@05Ae1LsHA-<9_=Hb}=*Hv+KPW5s_NN)@hh+ud*0GYuCaleU;Bz+gR9V5d0IcQlQCY!vE6p%Bmlb@A)C}w6 z!cSw(uv?^~V>q8kvugT2Eh})9n(5yn6E!Up?KA1oO?|6OjL&6aw#vl%LMHZ?GI6#^ zuMNwWk%|ASvI3{4S?bp^(Y8xjSbCfEzOamM?4#?`7?m_p&?Xy`1053hFjk_~ZA&bBgZs zPc1KaH(}|IfK0S$GSR1(7rf(ipE0AnpyHwX%&PK&vlZ6=m|0%%I@EpkEO{Jfwlt34 z7c4JuO;`hDPI8iRWmG)V?8F1V=t9soMlps=Bt%P*8Go4 zGq0&n$T8Y-IYy62kEIz;%8zBPkcst_l&NOd$&ckcEfL-Kj7zid_ zd@K{QMJCoKGO<6EiL*r_jxQ|}|7S8$x5`BOTqb&}OpGte3*4aYm|sfo6vx^oy}ukg zQ(o{*L3f<5%H1^z{`XA^i;H|+_*ht7WV;-rw#hNtH-(Rm1xCItFZh;?6-IWHdwd0t zWo8RMk+8W?zfcF9D~$;9|cCgyILSU=0e?vRPI zMF~)v5#_W`1tl#7q`*%6UnOafs-oer%fr^6f z%ZBEkR#EV60*jAKmt(XUa*SS8QQ*D|&6rtHP$w}obCw)q&6Z>Apd91Okz#b;Tq#EP z&y!=+>WYH*g`sQnD+*^`*B8h!#zHy949PLpB00uhEXO!Yq!`0jQ{fqZ;5)_eKU`7Z z>kLDEM2^uOm1Fd<9Ai8t$Cyjy7;BjvW7o>Wd0Zl ztdoiLv`p-0Wa2z45z7~?DDcLH<$q2l>Pnett7M|r%fxuTqTpKq7Akq6qTqX+VOcNA zF?Ot?;9I|8IWJWdd{Z!N-)fooUzUm5AQSBsndq;|#8^{N@Eydk&A3dg*W|tIwK8#D zm-cdejWY4SA?@X;Z^}e_tD@k0li}zI>9fT#-j?RjG1p1Q!m-v@6x2x!$8M5|^G@NT zV*!(Q3qLnZpMOI|L9N^LsmY3h@9(BhdrywhH_9=_`xOOsEz@T<%f$MiqM*iT`s@$o z7-y3dMxp00=zxJ_|sb6m?{Ny+N#wQg8-xRQ*$)|FRwMCAx)6#7C zozJ8g)wi|q(-^Cod|pxT>wu}MtfdznEw z#+oC?*mLC=XPy*e`Ko&roCi(IKVK&50-0zFWuk{hcqo~2?+c2(P>jX zHNDCXzw-9m4;MGB#OmOOyZ22z{QqxyiN*8}zwKs0y8c_g$1|ua;I?aS#J?Q=-#b@g zsiFS{{&73X|Dpe065#Rl`ES(!-+~gWfc=;J|6M8%80r6a!+m|_k#Lh_8R4GDGQv$} z%lBvizZ zL=i(4MGR>aF(MC@$OE@GEZSEk@=%F9R3ZDQLA`g|wLnHFgh&*tw#-iLb zA`gwoLnHFgh&(hR4~@t}Bl6IRJai%toyY?>o-E2uC-TsVJai%toybEc^3aJq3?dJM z$ipD=Fo-;G7tNyF3?dKr_QLY(-XQWYh&&7;50l8lB=RtcJWL`FlgI?BAhehOp`?BAhfU;R6M5J~9yXDOP2^z{ zdDuiAxLIpaZZ?sJP2}Mac{oHK4v~jLnxd{zd0OBvK5K zNijq!#Spm^LnKoSkxel~I>iwA6hkCb45^H8v)|%KKb4W6%E(V;eHe zQW?3Y{NhL|Blo0V97$#5p7x6)sf^qce^I1+<}Zd+M((-4IFic9J^L3&QW?4D|Kdn0 zBi8{GMYXmQj9kl597$w^D?^GSad8L*iHuYqk&)^nGQ#ausWFL+aJdK-No0iEtrC%xXTYT+ zR3w!Vatj8<4@70;mJEs`sf^sBL2)FN5#5F+uKr*I7Yb5 zEfq;*gxlRxkwiusIaDN-5#<>)$}`|99b!z%GiX$uL8Cl_ zMtKI@ZkKu>DkI7>Xq0ErD9?af@DdM1)fqI(GiX$uL8CkaZp%wO5S0;CXTU9biQOsB zfGd2cNa|Hb)fsT954Ah>s-rvuuKA&Mr(SiGXTZfj#P06T4)TYpMtKH}@(dbPXV56m zpiy-O-0GKlbSfjtGia1&z|}#-n3QMGs5*m2c?ONDGia1&(5N~CE*T=866G0i;Sd!` zWkl5(aI0Wycj{F~c?R4znA)8>MpT^vw-6?Fr#yp3c?OO03>sBu&?wKKQFR8~UYL4H zR7R9%z!gWuyW^rG3KGXir#ypB)fsRB5;Z3A$$-m{s7N9sovJhFlxM&tNyM0xXTXI? zR3!1L(<#q@TNP8gQyEd70kw9ZxcG@8E|`J zVob_2=#*#BDbJu&o&!AJD z0k?Q2GNL>KuE?Sysn0sI}GrG&Lrb5#47fauc%D?9!Js^YL3sw;wwfA~deu>$!Js^YL3svTIYvAXU-z^$#R zF{z9w&tOoV!Js??Zg)*Q5ak&R$}O}o&i^&Q4d5NBg!-2QZ!qjskAKmiAc&bSd?eLt<M`XEXp(BcI(6gQJ%q~>I}H`I<-4>jHo(;MR^8`@(dPLXTUAliASeAgGG4; zi}DN>ouqe-9 zQFR83@(dQ`87#^(Sd?e5D9>O~bq3t}otRI`Ggwre!J<5aMR^8`@(j2oJn`t1XTYuD zsYvR5M0o~_@(j3DJT)fuSx0#Wi}DN>Ggy>oz-{D-r$l)Mi}DN>RcEj$&tOrW z!J<5aMR^8`@(dQ`87#^(Sd?e5D9>O~p24C#gGG4;i}DN>Ggy>oz-{S?V?=od zi}DN>P#2MD6>I}G@J+V9G8Enck z;MVrk?o>vUXRs;HU{jvKrhc2iE$^vEr!t~EgH3q`oAL}c zHsu*?$}`xMXRs;HU{jvKraXg9c?O&E3^wH%Y|1m(lxMIh&tOxY!KOTeO?d{J@(ecR z8Enck*pz3mDbHY2zfIVbXRs;HU{jvKrs@nf zHsu*?$}`xMXRs;HU{jvKraXg9c?O&E3^wH%Y|1m(lxMIh&tOxY!KOTeO?d{J@(ecR z8Enck*pz3mDbHY2p24O(gF|@+hpIC;lxJ|LI)g)b28XIMIFx5_s5*l~c?O5_3=ZWP z9Lh5|lxJ|L-zFT&GdPrIa4652WXK*Ob;832yp*({_c?O5_3=ZWP z9Lh5|lxJ`#&)`s=!J#~ZLwN>=@(d2;863(pIFx5_D9_+fp249!gF|@+hw=;#2WXK*Ob;832yp*({_c?O5_3=ZWP9Lh5| zlxJ`#&)`s=!J#~ZLwN>=@(d2;863(pIFx5_D9_+fp249!gF|@+hw=;#qiJm=H@yQB9_d}^&~_rnVaiMh*&Z=(wF$%Vn)#jez%%IP%1aSThAb3soeZ- zMT3Z?a`U@24I-Ax&F@wyOLBx`|xz&&2SkjmH zNnhf33n0V@WNvN=goq_`bBiEEESZ~I1|ed}+(=*IcPk;qBaptt@76+ySTZ-a8bZX9 zxw-WaB9_d}t%wxIlD@=G`Vzle6d^_+b92igL@b$`TNoi?$=ux12oX!>M*0%JTOBDL zf%GMQw?0C|lDWAR5+at&&8?9Tv1D#;m83Y9^d)}Mm-yX62{8hhn_DU&V#(axVhIsT z=H`}5h*&B&v7lv9tXR>Kpj2*RO-mw{%1x|lNyJjQiFGZBSSmNMvSo2B=}W}gmP9O> z8(A+A%Ucp7P{&OreTi7%k{E%^jjWfbq%RSxTo#W@`Vz6uB@s&=H`14=WW7WseThoe zOH|UAsH86u>s=NhbqLRKuta?d|OCC3}UZRq|M67&SJTB==RMMBI zWW7WseThoeOH|UAsARoFC4GrX`Vz4QW^rz$FA=L?60ziQBkLt9=}W{)n8di`aU<&` zD(OqaYM902lDgEFtS9D(Op9vRyFHy;QiAwqsm8_Sjq%RRGWEMYP(wC^DFHy;QiAwqsm8_Sjq%Tp)dWlN<5|#8N zVy(>L+(=&{R?8$}$>T=WOH|UAsARoFC4GrX)=R{qnMKb`teQzs>f9~X%_L%}+{DV6 zL@eb?#M+reEcIEUk@XU>d}i?oWW7Wzph?71eo`arC1MRtVgxcb@^>7uj3zMxXb z5+jhWNz#{Sq%YA(Un17tEPgc7muTegIAZxtVg&O2M*0%50w*y7c@7|biAMSou?lDL zxTG)9NM9lr;v_~Ob0d9;Sc{Vwfy|BcC1N?w;t|MtiCB=6h$Y`|WW7YJ$w`brzTZe+ zqLIEtBYlZjn6v27#LAomrF@B4o0Ev8-fv=cP9m1dO{~vJ#8Ssitk78;OV&%o8l6Ne znHyOz(Mew-*6Ae1C37QviBA5GBi8CH9+&hbVzo{pmduU(9Y-hse~DPJlNguGjjWf5 zMLUTRsB?f$`Vz5jXYmN6FA*zu60ziKlB}1A#XE@+sB?f$`VyV=C1L^3;&Dk|qLcL! zv4$rx0+}0GFA>Xl5+jhgk-kK%GVg%|OAQto_V#(ad z-*Lp6p2Z`OzCw6ZDK>8A~ z!Y2_+z9z|fiCE;57=b))WW7YJ^I1Fs=}W{)pF}MAnk0RRSnQJ+fjn-cFA?i~5+ji3 zH`14gB|nQtAbp8g^pl7sUz4OS(aCy=Soo6|mppEyFA-~h7L6bl|0F2&`)(0g<(!B8TWJZ@yYM64M~j6fbYvR-14zC^4WT0Ac4OT@~dL@afF z6KjVOvE*?h>m_3OP+|n~xRLb|gRGYrq%RR`h!#H@=}W{aqC_m28|h2LLZZY7WNxG{ z5o?JSk3jkov6?6mOCC4Umxu*Li4n+i0O?B%@^>7A{2fQEDq8$#7ux+pOMd4417C1Qcmq7lRjqXeaL6KjkTvD9l)tTIZ(QlBLz`Tt(U zLZie8)H%Q;eTi6Ww0H#4mx$FyiC8i>@_HPx;3zQy^?ozSdWl$bw0H#4mzd=Ldlk!$ z5+hLO0F$hjh?Pf)5y<04)=R|Vqr?d0aU*?+Sbwy51hQUYlE34KB}j=8sP~&m{{IrO z3MnxH^?ozSdWl$ww0H!vUSg8IM65+hj6l97Nnc`;|Gz}6M@o!K=0^GwldPABHA#!d zCI5ekN!ClmvZTZa$$9F#f>GN+k1K*EcJY$ zlzG2Zl=60^+~fI0sqjwgrj*a_*4yKK7MQrz-b(rM-Wa60_b_ieHg@+$ zNN4ZC-e8|f?<4qo5`Sy^DCLPh2;YiMrVk=^_8IKmi;dr0`bb};ytXd}d9UvDy&Lei8Gm~K_YcHS%LfhfHVwiw4Z_Z!3>u3m z8iWZPtdvIwW1sEld^Z?z^M?%ct{$S4uN{K8^+U#E>>=a4p-QFvkxImUfX>HmXBRqq zD)Ho}4jt^R9;%ct9t!$2I;)0anDo$L-aXjZKNKM|hYj{D9X7%9(y)o%b;FeMY#^Lyfmf;oN%8%;1lrJ5Hecl{3%)1>M z-;csR9ix!j!=uM}-x;lxzdsuL(YGVzfGFnPPGyV|I)Cq@ro|tf$XYRzqJsTz-;aNDz=lOk--!pIWp`Hzs5Apso zSt;+Fj6G*fsqj8K1@G}Gu&u97(LC#>9P0UM$|0Vo4m!-!aFFh4I>_+sI_NNO;NVKn zqJzhH9y@rX=c$9sdVYQ|>$&9+*7L(dnfHf7F_ni_dKMgZq$hFMQJ$^%t2z8APXqq; z;&1g4M|<8o;z;k8M^t*-@wXR$%kX*hqz{R_;~VDPiH+SpOyPbXroGlb&YScr>c+BolP8a|dZ#O2WWMMFjbeXwVVKE|_BAL)HvSIXbk z0pHgLd(+tXQt$2Y%rp9U9yiLo&l#1Toht+X``F~ioqJr*_F>F9*2DgEoQIwL7Y{q{ zcn`aRd)W0Sc-T!Rdf2_ZCkrSid03TlvWJBf-iw8mQ#`CzIn~3W3LnH`%4r_fpq%bu z35AbjN#(B|*6d1J;S*U#Im5%+lrudnr|`pBUOCIdI+e3MEZB`(EY$5B53A|+HxG++ z<8NWWZs&SfeYf*GEZ&VLF=Ds#J*=tQ1s;~_#y`T4-7fU7R#&p!_-2gR?e8Ae(d{A+ z3v}l#7_|Gv9#-A`A08I&&bMIH?w5F2UH3~pEY_WG#i-pc^RUM5mwQ;UJO2WscE7^I zTDo89VVUkcgHgL*9BP9?83s?!otC)E+k=dslKjc$LEPJ^qFCT?sNiUtuA3Bl348!uTT!i?W-L zzbkRZmn$s6{*C-yNiiN(Seo68{9Va19#dG3-Gcntt$3zA`D+Rb_Ph=G_q-j?v?qU4 zVUeD9Apf3s;+gj3>lGI7c^C5Uc{iSEPo7j*s^>k(zvsOeujhTpyyt(Ac~Aanh(uYA>gl0;4up7&kJ_6D%G+)XW zbz_0DM?tEDhRXQTZY*3D2B{SqE#pshW3jTwKpKQ5%6NS@mMmKe(kwJx#$V~iGG)s^ z+JxrH_?z8WzN{9cQ)sZ9Z|KHC<&T5Zls^HDl=DUH%mMt>tylT=~<`j`C-q!HQ?0)fG`_q~bYfUByahykZr!v7#QDtl&E^ z4;9a&-%{}cG*iLbF%K0lqTgN-gXSyv9?V0pm(Z{3wHg}g#rI(zdcBN(ZLbDsv=^V+ zoyB^+f_{V0L@yrf&XT=e1!?ZJ2Ab~07jdc6kC_2Q3oXZc=h(eLc_IyBgu zFYnGmy&KW5>HP*Y(wj%SvuN)((Xa3Q7Bt?Qzto*2dMD6t>isq})tj&F&eFZtq2Jnj zJv7^!ukX%sy_?YQ==}~f(1$m7XTd)2qF>!-12o)+f6|>r`Xte>>+>Eo)`x%DoyGfX zM8C1m`_NRMW@wAhOdr0ZJInU@0HnRohtPZ<{#|z#=(`F1s=g^`s4s8t&cb~^Lcg}} zW@xl8--Vg!`!V_reOsW3zI-=krtc@{H~0M%n(oW@U}pMmLBFkU8k+0N^O%{wpP}E` zcPlj5kMGCK^!ptBntrX&NI(8NW~Sd4=-2oA5*qKvr}bcoe%sJ*>X(70`thnBEZy%b z^jrIV4bAo24(;gI1`YQA23pOKeuj;`<1NWg{BQ!FQ z$9k~n!2KZgLgNGZ%b0;{n1O-6fwT_%9hx1;U+ckg1E+SwJPZs#gM+3) zs|QVoMh4A*)(xtH#s|%WHVRD+;_EO2gJyxW44Mti4C3$iVA(-I^xFr`fd&T8g;ouo z2MrD8n=ucAtI@9=JRcez%(q}31}{LrVemp|Vle*_Sq~1O-!^y=G&h)UN7jQEqu)7r z2{br_e}}Ax)SzE8f;!qTev|IcQ=iuV*YdbS3)DLsvo5 zLwN&ZnW6RQw+($Bnj6aBWGp}Q1@t?Iz6cEt<4MLs!(!;y40{P08OAp=79F-4{rX`q zL*v7ED`Saa4d^!wdj*;r#=m7OJ?vHVTZgTIW{2@zjOB*K(eD`c8Z>XlyvoV}6FeiGJhox1h=4{5Qx16mKpIrNSn~y2;S6_x zds$@E#~^h=W25+^UKStK0@5fnIf_5&WvNl0fV2qBjN+@jEIaB`kanT@QM|#+0;9Kp zR0$1@=5Kgecyt=1cJyb^=xF|qm&HbJMZaP6=g`Dx{(+YzN4KKiJo*c0X7rcPw$a<5 zxzYR+FUyb4px-(AD`;>G|I*7sW4=beX3TbIWDMWoWzjKh=+}?=1{xp3b6%Dh^DX*K zV|GAOWB9LLmL8Kuzje%a(CipKqlD$g>_opqXkaX_E@8p3--A>O4UgpuOIT!VJ4l_- z*jT=}gvH1H0MaNlIhH?G!ct>@1Zf$&3z`|rBPA?5Hiv$@(EL~)En$IiKY>(@+YJqk z83F=y#6mga*g+rV<9~-n#`E_|Sakf&@$r092}_I*fHVnBjptiR zSbF?4kk;|jq1o|#8)jzw4D>sM1}5+-ieu+Fbkwn zXmSFdRmxHmW`nc{%}n5-QkI<%1ZfwVpTL)vvcSYSAXP#`6M0=J3s0O2QY$n%k-t#N zViV_qGzd*h0Olv=F35 zXk-%qrj$h|g+S_s#wYPyDN9UR1kxllHHq&pW$8(aL0W}oC-GTjEH`NhNQcnCWWK13 z1t-^lR0|DH=Cx%kGWlVUI-#-2{Mj-VpZo|&qtN7JzPgO1CO-<&A~Z9Zzfs1rlfxkG zLi3Y(vWx|$JO)xFG&F^OT*ksvmV(p@jZWcTma*8BWgrbg6I1wiWh^4R2)v`lf(O@uR0|Cs%$v(uV(D) z=3B~H{NQIm8ighg=3key)WOe!v3d`1Ne zAF>jpR%rAPzMz7|4p{}#AT)6Zf2@Kf52*)f7MebU*Hy60A{XCPp~=Je;$AFu z*cy-)p_#+@B@VjW1U(CiWXk=`tK#Cnhpp#dL%vNsF* znn0?BhJC!gH;ee*0jU!j^YJykS={$7NTblCkFV>^Qoao!Exsf)XCKTA@)t-`<-w;)_8CaK(7eVs_F(~iD@c{lkj^*vVPXAqkXoTpop0^KVtOk` zgV2P|zwX15`WGP0Leo0m*@tEHFG1Rb=5)Th56kP@Kstp64ZaWaV`M;TghmWLy)TOz zUxCyMjT?M!UzRYw25AzSGWg=YENyHDX%(6^_|m>CXS9KI7~enxCSTE)1b@*)WRv<;v6>^;zk&8PQcQTrG4>xIT`KDQrB*n2^mgr;o1xF1W~ zd5~72S(`8I$8z?sARR&j4qwra1)Y5$)k4D#U)hgEoc$nmLSqhJ-H*kcPLM{SNr$iP z$5PI3AT2^O4qw-gWu4za+J)vFzOf$*967ZI=0|AgNWQrr3m+K(sTCSMl5g$DVnkLPyO6sSz4E zicjy)qDRdFsTUeQiqGxO5=YGjX%d<`iZAZZ(nkeBT7_nh;>-H8+);BtI)ny}=5_s9 z@aVZ9)k4EZ^XL1s$kFpa>V(FQ=CAf=@uRCj8igj0=5O_9siWtEv{hmK-z@n{>1n7XZb(XfOHBC{+Ul7z(Rk17^FsMn*B3hF@WX%{1`}w(7-W#;{cXD<_VB?q4{I@<^e2l>~fGQ zp`l~>)&VShYy_lMX!KbA^#B$-_DPTip^0Pp&H*fW>{B3ZLUYIR zeFIqj*gB9-p~2($^nomN+|wX6LLg~pHLiwCmAanFJ@2~8cxmkwm< z~N-T+b~G{X7xK`hE& z0jU=n=X~xUmOvQ>v%%LuQ=Bgz#L_&Dek+PG_%^}$(m^c8*P`FSUxx-x;422P;0cZB zSD)|(G<*VIHHbw{coY4)6W)TxPT&oLSp0+p`i&>N4NacF-x$PFC#*xi<%IRn%nAJ6 zK`eVh6Z-8ZyaUajz&8zIffL_Fzv{#d(9nrIJ&1)*Orl?V;(O5OiTo@4hH>IX^c#dG zPUJfWvE+&GgER|GpU8h6#4;x~gS4Ia0W^0a?;OPPCw_>2r_kU@eCA*lI%yL~jnK$R ze9mANJt+lJf6_Gn{pyoHgN9G$j|^s!leeN@ck<`Z*vWk9U=}~Q75&DOzknuB=1&Y} zsgu7%zvbj@(9Fqv#bA~_IfH)t$zMV9C-Y|pv%o1|qhEE(c4+7nzH%@NpVEeYtbLvkZt*7pWW>4jx zV`fhM8T}5Sfzx;!X6CdGkm}R+K*Oi;cFfFazo1_yG;F z(sJ6b(9CIk>JXMaZ6EsWr|pO4Pvg^vu)yh^=vSTo8#Ht}pE-nuPj{bxtaTqD5SISyERa^A*}w9&Ls;&wvq3t92F~E? zhOponL6B;p;WPNgAuMvn9FRJpu`~GQAuN8zT#!bg$us!YAuM&qJdl<%s-c-P_*a;j zGv=e;e#Qc5{tUhoGjrxb^sCMcK|^QqpD{CME<(Td%*D{?nY?odi=DXy{f0AZpoug2 z%u1F#^I`Ox&wK=$K9et~WSKJ`MZfLLFf?~2f3%Y2&wLF1&NG)ngJt3 zYN3&{_;Zykde-CU*PrzSG=3IeUC9z>El0oUtOzu97Jt2xrO$d2{noQqK(lA@rb?DO z>nZd*&Z>h3&gLIfvf$ZIqhEdYGtlta{L@MnIr~}k>&}isV`uZvDp~yO=g@CFdnGh^ zHqTVD)Y+@hZ#lajnmL>AsASo*pGUu4X#Q;eV2vtBp)7OGYLGUexpVm3p)7yS%OIUXgMZ^ohO*G# z8bE47p z^1Qb}nuVs%^5?Aw=@c3~pT9JWh0bpRsSz4EpT9ngMbCc+ zr2hPOq4D$iJHuGw{0-KL%+Qn!b>~ zF`Q*CYyoK#n!Av17|!w+ege`dH28P^(Qp>}`==l^LL-0YpATozzi$Dl7aIRN|7JK# z{5=iQBsBGRzH2y3|NS$NR-xIy^IwOv+~2o?bO;Sx#Al3P!HYfzsTLZ(h|eFvA{VuS z)CrAU#2+2O;un1Z(kL`}5r1+7OI`FONQ=-OfwT$DUCeik zVEK!`0qGPP{0IMO1PlG+TaX%|k$>?0BUtnwJ3#7%#{a=*j%0~{WI>vQrvAYfj%4Y7 zdIQzKdMlJ7yPg@!NT&yQr0OWHx|gvKu6Yeus8B|m^P z3QbexdxHJb+B{Xy?-!_tkFZ~ImR%rB6 z{@q9xyL2~5gV4mK{Ac{vjZ1$9X%?Ekl>au8WiIUiX%m{el+PZ;@|W%b>Adt8Xz(&V zcN7axp^?k@!ci=GSstWbX#6t%@F{pN`p{dLGvQaF3**=g~q1ns$icu_g z*?y1?p@GZ!bE8=B@=lOyq2bGU{U{c{{5O!s%YTO^FXu0gVyVlg_QY&l9)M;p=P!+7 z*~_P)-+uXYX#R5EFp34Pn1Ozk(9jip%_tVWq6(x|X!Hucb`*V8l*{R>Pr4GX5-5FAgw~PSMn{GjVl*`bO;Sx#XrYvT(uCST4?wxzHJnX zTonST6B@gUZ^!&xwFsn9X!0t)1M_p$VvrW0nXCBsn4hbbfV2zEU&VJ}ey*+osS+Bx zn*WUXx%y#{TA|Ua`CiP=)sKKQ2u)ng_hWvpeiWoxX!>eCbu`Od9R_I=n!B3M7|rrm zKL*k%Gs?jWa?NcD_Li5-17e}+eb#)+BLPOW_mq)Ykbx(uT3XNXJ*NkSd z>z)B=5SqA-zdo8JuX`4xS!nt?{ubuvx+qAS(A;%=J?7`S=Ri7z2LH)7V1E9&5~N0G zXq)BM%pZsIY&p)3BX%(9NC*Okk`R5BD9YO=w^UpCq z*S`o-Ei`;R--h|QJ_b@JGkW`rq1k`&N5`<-zupAt5E{6VFB`*xH@*c@Ei`;1Up|IKZcKpG360&z zpBlsBH@*$hC^UH^e|8K@-M9{M*hv;$Nc>JeUN&g@qhD8n4f<)gER?E{hNP``T6$;Agw~P|K?jT zKmYy^q(f-nX8t+m=jKfy)k4EJ^KF=)n^PclLSr}c?U*LE44pZ|1u&Kex1iR0$2;!hgp6-0}%XtzC*^2~FL~myBiUTepF<3eDciA05kbw`M>(ga&To%f_darmPKycj((lc*lql&u`GUD8%U$j?oV_EjLZ$a9H z=5OOKj%9({cYst04c*RP9?QbFXF+O(MsMe9#rEi`;5--h|Qvje2=&OOlB zoqRjy=gwcyZxoumlkdR%+_@K|MQG+u-j4aXGY`@(G=C@m3G;K;uOL-ILwE6CFh6(g z1F01ny^HV1{M@x4q(NxnE*==il6Q52Gz(4N#b=IVnY(@iX}jxpXzngPcO1*#HPwsx zxhnt--pxbfSm^F)=-1pm9U8ftKQfL*@1B8v{oPg2_}#pA9826i6aA*UXF*eU^A+P* z`tI52w+hYP&7O z3QgX_w&b??PzkUjEKF7QQ!xeyz~x zz5Ii5EOzfAkcN8~LzDL|fi~Y;1I^s~FtqL7N1(ZT`KOqZdmlx=^WHEtcpu+_Il1pK z^lR>03XR;yzrvi{w+#LI`)Z+y`yPij-S-4Eecy6u>wOVu?!G6X9rvw(2LJOEwE91F z(8zzDhSvS(8EE`J&q5pj6NRS!^BlD0KP#cx|Ez+x|EC@rxc_-*)%`C(!}q@kt-U`6 zjo#0{M_%{8gnon2#Qpq79QXTIgER|G-_L)-alij%khc39pt<{b9y#9s3i_S*zX}aL zzysr1=z%rp*E|r1Mjqh7@htklYv|WMuofDBfQQDj!~?IR-}FEuH1z;qGM=R$cmw^` z2i}BcAK=Tzv)lu3q2KX90vdRb*Ntbv2j51&`oVS3@PqvM@htM-di3iaY=Xufk!42rQJeY)L9^}dKEc@Vl=(j((5t@IHe>9#29(o`Bs)w4P zp@;a^@htq%2k6%djXuP;k7u!mJ_KnHns|t}jc3V+Hi0w?O+UnUjAxmLQXp+Ya}V+F z#5(fZHap%rqqf*w)qL0C!Aa`Dw~mfSp}U zaJs^GO<-bfpcjsjEo=&YsB9)0J-kTf3Sp z;KGS4H(mJ_u%oL9%)oq3WWgEA4#4WJCJeZIB8$vWvVe76O$_kai7Y-t`3|tLt4RXB zIFY4hC_4dLx|$4N!$g*yp?nY6-qqv*Uz^ARRZ2TxRaXkAMwbO#(1EktM5?U4YG9O&aini7Zp4+q#+@;EG8sKUaHdX_|7C2nWF>&>$;j4;KoTTK1Z1Y*x1!10XJbj=O}XlTe_MIU<>ARjxrCh zy{pLseunv+t5gG4bv2>63jY%GIaiqvSliV^0k>m5=PC;T8@ieVU>5T^S6K+y+|{H3 zf53dsRYHJmT}=*fH|BG$vIwxVs|n7-TO0E^Pgx9D)73-(J29X0lqG=m^OPDialmPl zSz?~@Ft(cJDUYB@0nVJv(({x@vDG?H38TpZ1}C%JJmoQLb<9(iq6tZ+9|(8Q`0K5sIMS1Zf0)mW`W&?EsLnaonv%9Ge?sa95?$pAh%nPsb$r?Ayt zt<<5(1J+Mwf%(eQ*s7YZJcA}QAD;!2S$MwkEVgRrD^WC2z{bfeHeY!TTMhG-m1q)x zO_N!2zOo8i&GVIdG-<%*$t*Kpc^+GB^OYCSS7K;F3zV18)GSa| zqlqq1UPe>DKxsgeSfIRurfGrlDw^~HWeu9v1xg%EZh`U|nvMm^S~S6h%Ij#V7b=Zt z!VB>MF_}dcDsNz`ZlUrfniyakW@(}F7PcA}DhV`6z;?{iLgj62wJcQDp~(PtV3rmt z>#^0oP-#Mw2i%KU3Mubkt16_tizb9?s`g<*LdphgHH4HTngrl)NHe6ohpo<#vJp*i zk-}$8VWCCJ``D^kq%@<60M47jqKlLduvNcE`4CMUaLE*wSfp&iR?{LSg(d~KYzj*+ zQa-{~>mp?{nk?W`Q&?`1@-enL7AY-g0*e*CY6=T3RzAU2^E*$UXQSos`H2JnL^EW21~#a4S)lL!1{3JWYz zz5uN1YC=mCo|(eJOO!7GYrC2#;P+ElY>BcBu%W9-0Cr4a$t6k#u(_*A1O7IJWtJ#k z0k(BDIl%v8?_I#FDAKjj`g(P(PSQzO+^>#{sDs=>uH1BHSOTNWIOqT~d-nhD{YNfQ zK?F>~jPAYvEkQt|f{l<#UQH(%F-3|3CJ=H6(DN|%BmIgDadLKbs*~p%7zv68OTNr%^({G%9a&$9^`oq zZ6MDKl=&;^bC8QQ6t1Lk9}SenE9q|_OEi>&{M$fTv63!;tkh5g^5Q^Qw~|^x)@x`2 z`Q1R-ypp~Ed2S_r31|iRBg%6neFf>#O1cOrScPZRAX&JIzJ^q^ioOAqf_!9qH6Zs6mUShx24ua4CXlZU zmdzzp0`i=OR*?0BWm^fY1$jwB!CD&k)?itA|vmEv*B&RYMiX_Xo?G zwNwhSRzm~Gmcg=VEv*N6Mnen83nghRD`Zss?#cL;iZ)7DHsgdU^%qQVqo* z&km8L>uE2@G7S|VKR`jQr+px+HPnIp2nD&GYCtw>Xa?DWf?QAgL7vyp2J$l$&1 zHqcR!XEd~ce0ZpA-9YsqFKWmyqj5`z%7QXF26Cx}Vvx&+%F;4=9b}n?3Xo3>l~rYQ z9AveII*==d%7!v(0NJRa8D#NL*-}PtfIP3E4dj}kGXGh66XaqIh0oHsr-#boXX!1F zB^t^>t{*BZo~1^Rl^SY5mJOA4&(aBy^%|N$ZW=0^pQX1!p3~3@a`RBx_AH$Qc}YXT zMjH40P+7QpO^MEFh4<^gza{3(7ISs8Kmt$joIsFafrE`a7TkbB5B zfch;|0BGJq4+G9^p+^9%ThQsCc(%}^kS=YZrGSF1=t`1h;Z|A(sYpX9$P3A`d@DT$ za;t_akZsAbW-BcRS*xJ|sERkyi zp%`SzFj@LMJqfZ*Lj}lZhsmnvsR(4XhB}Zh43iDd(+ZG{8k#}w9wu9!rBYjXOL{7QaBnAWJlqgM4$CtayP|gRIn01M;0=vhD?X3S_;8CXnZb z$>tYm4ajpZPzj(FIJqxm0LmkMiDYBu0HiB%_&B^LE+>IJccD0Il0;Tvdu}+fLgdUD{4N00len z5KfVWJ7_1Qq8(HTCAT8ZVdjX|8X&<0$C)EI|cG7-8^-g*f(6EyZ z02+5vEua~}7pBUVo%9-{^E>Gvpbg~1sWQKk4nbO6Np*n2N>o*Qq@#Nk<`7R#H8n2ITrwSyxHNAk|mW>wqSZ&!x)dN;(edTqQLCT0w44m2H*u2Bb@s z^d_KS7kZmiS-6Ydf>gAN8Udvs_ovG8U33D{)?M^ApbF&SR9Ul&PC}~PMNNPPkZ+{Q zrd@Oj(wSX!8qfmrRH|&gs-YOU~^MS2fpnTDzt z=`5sb4Gk|+Go(fh%?NM-CHNw}5AwW*HjrPV1b5R1AQ$hZ4*`X{F0^-fyQu}x1oFu=*}R)Rfpl&+eF|s=xh74v?WWHl zUD8lcg`Pc47FN-DkVRGWIiM8e<}_JeMSp{|wTdnPszB~YlQmV;3aM5@1IRsTvZ;!` z0C}d0z67*@+@B^}tLQ687pv$ZApa#)K$?D+(VZ@R_>u605u>Nr^~uM^dqGDJ+#0^d4gP)E}QpIKBRMdXd$2#9V1k9)r}Vp{1IZLprY^{}n2Pv{*y&EA%*|5)Bov&=Zg5_)Ry|fZik%scUv6F>R0=5GhXEGyzK_;JD%(fT04hL!ioEZm4Unq$ zQ5m2PuP8lr1~1F05pMoCPOyY&~`}YG_-=; zoFUt4Xa~qkHMA2@upa~63|Y9JDj^l^r(J+jkh?Qv`F?s4(pC*sAopg-n*FpJWUYn< zkoz-a(|)P~d1gPo1Zdq)djJ>r)60N@SE(AX^i_HVQ2HwE1(dx?`v6t1QVpQ`RoV|| zc$HoSG`>m)04=XlE#UmC^co=l038G@K0t>6#RsSkP;!6{11b*C5kTbuItr*eK=pw7 z19S|~e1KjDoI60r0c{7U0dVO6y#Xk!r8faZwe%LCyp|dPTWjeApr)4I2GrKlNkCIA zH381l(kVb|Eu98jtfhAVRj<(*K=o_%E}-r;OvYu%hS%slNR6-2SwJ($;~BE$HEM=* zUPBwm)2R1@^ghVN8VV2MB^333kUjueqM;mQE9(6qeF(DhAe{r$9i)!{^#|#%faZhr zG2q-mY5}wzq)z~s4$`N9!b9{Kpy&{t2b3P7ao?kE57Fn4wjQFt0jfYQ&XhHW=mMnL zL(~dr0J$tvHXWibAe}ixUjkY{uFRCJhv+Lv7Z1@zKzN@&6pbq4oOxaLJ-$QDwqf3BhkOwklOC9|H>3kji z2xtRYpDFVX(}H-E*JQU{fF_WwnX>sXJp}38VJZN$g8VL1wjHL2AzeC5j{pjf(4&B&BeWDyeuS0* zwjQC!05wNwIiU6k6#|-$(BptJN9YMa>k)bqaPbHg0Sb=N3cykg#Yb`X50|A!X(h-q z4HY1l4VP6%X%)z74Rs(3hs%beR1C6FLo>)Hhs&0uv>N33qx2M@4dlwn zjgT#`Qx&B1uhUC_HjsrQWd3p518MPbdKpl79OXGe79Xc-NF~SV6+k)2XGX}1D+NT0B8mI$_UwZoN6ImI!>J#mN!rxq^%8f7*GYWX@sn4pd*lK8|WyY0p$B5WK#pxLpswy z#{exLKOG@k8|ZaN7aQm}ApZ>-_tgkl@CG$NTKWdP0VoD}X@o3&gWiNx_6EHLr~tWS zq^x>_8X;A`K_>upARikk8{VL|AvL~1CjreMSB;b{Z%`AY^KZ~8KpV)?kuv{HIt^*@ zoAeH#@J$TJN6O+i=?tWjH|bqKImjI&WyPEH9;C`Q=`5fIJkZRwezXBTGLhn6NHoZk3Lpt*owE$W` z){m5}Z_y`^F1|&d0`eQNlrmBlG}32~mNwFPKrzTOBV}nLeGaLtk^Tm#0C^6D)kqg0 zRX0*Apbq4D6jmdB0jaT(z63ObyokbTq^}^IZ={QWHjtN4SSRRfNQ+O>ZV1}F!)bd;<(LEk~D)KCL*`6yX;g8mM&UPBYeqEWK>1bq+k+zGk_Xa)Jy zDA{&`et>l81pNpocpD9Rlq`Ik79^kq-==&(Dag&EWck~)5YpDS=>b3$$ep8P&D*pH zQmuvtkkzAP)7!KdZZ;z6t zC+T63Wg03#o*E^qPSPVFt54FSfI5)Pqh!NLS_-N0BrO9pgZy-qY&l7fK{|humIK;A zemzR&H&G#^#ZB}$ps)$kr=w+Y6FmW`q=}vcl!JV9w5({NB1n}@v;t5Aa>Zy_*F-BJ z)i=>9KoiJyqh)gw6+=4LM5_UGsvyi$(Gaf0;KaA+CaW^oy>oSwt-yy4pjgO-@z?sCbVK zLaNkI_Z}UBRIj1=J*tCrPD9&!bQsbl4TWdv2&5tnrDstc*UR#=bQI)P4OJlPt`{5g zaZYyZyqvi+=1l5sQ}H3!5!2H%re~*(oH{ja z+SK7QvQu$L{InSv1I7LYNNlIPsX2FK=VjfVJvDEBPIj(2*qWM$6im+@Y)_j%`>vsP zXWuB zGs8176qlNjnx?(n7AL0W-c2}QoF3-H7`F+!|2Ddx?l(SS+4N-3`E#eNtl2Z?WKYe> z(n&D{G2MOqq)Az~&!01$b6TlbeSS3t1P5cvRj3kr206iN7GEVoYGcy4CxH4-8zyRSJ_tK;bN(3ed+d0>|0i zmF)o8_A7`KAp*j_RV??$+=)DjZQhu_FplxYEM~mb8?&5ooi}C`<89uU&5ZNBF}oNS zcw_c6?(@dfGrE6)aomK%PPHFd^}EYuAe1;}rNo#>LN zxtTM-Ek-(-o1TNpM?8V$WXCWuWBxoytH|!k(!{{;#%ImR{!7-(IWw~Fg~Mhi+?<&+ z(q_*Av5V|@_Q?b^g4rMDC6~R_J6`hc&2zjo!OPs4GyK{2&dklrg_jTEW&WJI=FI)e z96w^h@zIM=h88OSF4U|M^C90{orP(13)Unn)fJyBe8TVvGE^?XskXuK-YR@VhAI)J zk=I<*JBeOoc$05V24{#)WW?y}Hm>)V!(5ICVccXKu2SRVQ1f=oi)1$(<<@5k>{q z5ewmqB$DyjyY>_g>26Qqg9+^^d{Ll1h0j2=r|?~p_7pxO(4N8<653Pv97*T)Nlihs zF6CP+>=Oj07xiTIFzlasgt*4Elcf-url<<@#z$^TTgG9BK^ItL_JK7^64tQ>VeT*u zFU6xVPP+kJ_-_)0yseXvclyLXWCzau_w1R|{`>uR%E*rW_hv44OZDBV6PNe%pSaCr zK&S4}K%fjJjA!_6j`@iWzEfcG#MCS_`|)F^aQE{QU3&s|2=nIW=|_PuIM#%*lm7YE zDYx*0fV(qKIEQ36fA2RLVj@ao3{#kKIwX}oBV2hRt; z7@r^*hKgTkUtDW+3nb(W zH@X>PII3%n_#`7hH@VN7{vPeg=QsQwH;SM8)Ke?T7;beqgIlhm5Kh*(cVQevV`dwM`=FXghvA5@bHSml&xa@Sxt>Y(7o_upw z?p;~8W1OTrD_D@%=~!$+rT{4^~W!`$h2X6YU*F)TFqe-T~S-BV}d zV?08QY}<8zdej^ic;5WnJGExp=@di#TzJBB=jP-IFPBKy@X&MTWhwuG_1C*I_=jc2VzM0@rgZo(A#rTgbZ|o!L4igwB%lJfJ=dQYIm2nFn;_5t# z;oAL9m*Yd{a5a1{5PpxJI~?vJjWJi@;eozJIm}X>6}ll!_BZ|Tt2^NS!f%E=`GxL< z(6f!Q;fWoMW67ND0LI-H4qoRt@9(6TZV^jPaB1MbTTCNDYSi{n4c|XK)XO z{#KyZ3ixI@i6&cjZGyWtahKgpc&%{q<`2&s`rls2BH=0EBo29Jsp-MY@c zn+jIsK57C24~$@Lf`QR5tFq!pf+r9^tG|JKIGIPhU>tR4mAb&-fa#}z3Np)m#PDm3 z%D>93>hY0ZqzwN%8TN-VJWRbf>1PN$Av$X`yAhPjx#`lGCb{hpx$ILQcB zsau~;{plnJRISZ&9zY%__v6{Y&(UC;2=HdU zp>XW3V@+~L11Ml0ZXLc!0>S)i2KQK3^>F3NQdI%G%l^MwNx#Qv$Gv47<>b^%61N20 zGpej+`3h7zjDQ*)kdvGw*6vf?0DP)O(+6Q9OLHOV0EnMK4 zDZKc_;KxpUJqW*n&UFAd#<{)$$b24tzs7G2eq-^w4Zke>I4r-Gb39$~y9d89__2Sy zHmYmp`IUV>e(e8I5`ysK>vg~}KzztVtT7j`AWEI+=Xx@5Iez@d>Bo`JVhj++DC3K3Iz4=iW1dxd_&n*S9z!MXllz~4C6S-{^q*O;X--S%|Ww6_pm_e4MZX5e=%eq->9eXp?lo;;9l=EdUz~*NyJlx`4zAyWTqwJs z6O>)8wbHORu<*R>X1xxfQ6kCBvb*&ugjRO>yX;{-=r!!6UZkqn+ubUIu+|+*OPg#Af&*1Wfh1kBgdWeFsvQwW^!-f<* z7Vyn4D_*vk)>~K%FfANDi0@I#i>8Im-lp{#rtwV+3j@+Ri**5MEyowFq=oM@EtS>= z555X!9m3qcw7$hUkHlxSWQnxakSvwfIzyI8>jJ)^C9MS>d@9U(*&{2YwTWb$ri>j9F(rvQ1i_dE_Oe*~B-;EPUN(vDey!FVJ|c zo#sF0TjTWHd0A6)=lply8dFo#MvPLgjkkr?8aDCmZn!=A-J^z#T-?d^j%cbU17W9S$E=$2zdlbvQ2VbU17W z9S$E=$G4Z&;kdNZ;jkTaIDAwcCl_5VAC5~q9S++;hr>tJu^SV4(aXwlX{W_^3J-a3>ZuAC5~q9S++; zhr>tJ@$qGKI4mT{;`FbAKyMHtI zMJeo$-=Y8Fa77Lu56pM{1+K?B^4Q6@W=)=Op)OheHU(QAloXImE%BhE;~6;g*TxCyoC-!f!A_8ZN*uzlZT3 z=YU`AL|~s`-&)9&^M|AC)E{%~fi?Wq;oS6bXdK0+UIjTN94nVQ@dO9|1(tj41eI4L zW5UE=-vVl#CzO;ih}n&d%a7kbkrWRy>l7!)(iPFIgNvIycKR8(o7pk&ahQrfjGsIO z)VEr7ypLICC8{GWjm@EAk_%Oyv;p7PuZ@d||=Hy$E!mnaNWy4vQ zj(2XYGgx_Gd8|Fd)xwVMz3JX0?CE=G=@ynkPE8Ca6MyW^e_Z-q!R3K)Q^;DbaQq=H zv0;snUreEWQCui}%MsE|ANO=$anylzagqIG3gR=_8!N;g`)uE5`@yyEv#$mh>a#Dz zId|O+fyoobI)$~s4kgA96|A5CuElR2s|>8O?d!t}YmAdQ=G=yKV;IK`iN%QyhbCjg zm`HWdlWtZw$;V+z*FlL}%v{Des+?;mKJq5{qZ1iB@*gMjUxNyE$Gh!d{G>ll7(4#v zTgD=eL-C=kVa_Mw9vR6!Z{WjtyDKJU<|zBN!0bEb=D>dLZa91sZ}XIrc7U9pV0&S; zr)-fPOt2I0oSJ)Qxc{OAyVK0v-1*r#6Q|yteG^;}XahWI^0(RdIo$RHJ0UkaXXez| z6X)MOEjtI^_9oadIobD&Mf8vkCfL1lVbe4_ds6m2^RsjF#>2L6PA(SBF!3CC4}Sj) z>p_T+{t5*M$-d?)#o#U`*zpc`GmNLeJClYNtZ(6RS1|HYKCm8)ahV1+?SWl+y{tC zt#&3)yN^o>)P+Pl-lb4ZV7^ze{dw;6shpN6GnKbTI@z6bvR!hLvebg#HJxl*hlWw) z3=kVT*@>E9-*;s*R~h6S8!~XOcCsz5(FyF~Fk)dLly(q#ch1cH!#o&DaVpP(m;;N( zAn_^Eqw6W6P`~fQ#m||Zk)5OBe#mFrj@9Rk0N2M8J{yyKx?H$SN_=)#SB{8lo6q*C z3etYZ!Qu|b;INME=1lzn3UXO9^9)QNqc1XL7tB_)3&Q3TrngIEJjzPP zhv{CcYdZ%ujp6eMGp18ey&lMssh{6kf>z1X*0G&}DxLA38K=jhjz2Y5687YpFiy|y zn(-k8dK~8}&=M5Hu!4k;0%y2qCTazaKc%3Pel$9i%7p3j1#{pG&&bpv9T6&QR?*oP z%!50QGrQ;rU7t!xSNGAc#(GXRxl{{gdb~!an^-MF zTQ}BrMdz^6bB1>2&)iHnepSw{45fevfKCDWL+yZ5F=3qB4zvU{Jy}ivP&?2L!c1~& zlSAq3Top=Vu%TVuEi5m=Q5%_V&Vv+G^ln5#6zK&hXV z4h<;{ISMn`?HJsVoK`waD-HQ{DlsLpz3|W~yuGjtg;%k{)X4UtMqy@JsJ$q^s=cI# z+KVD}{xU+hLU82d-U>ki%6`tuGDEjQ&`p@bb;LnN=WT?}a){OXMkaQ}z8 zEI`jd)-x(GRCQ`pWsY`wOXW*t=Q^ifRE&=M`mnkRj+KIS6=a}g2y6L8SX~7jh51XT zu7Z@#&##=i3el{T4Bc8o&yU>fd$RKID7-$*xH)quET(-4f67c5l@+-8##<&K31QB| zlSLf)x~SRj8zxN2nmlC^hWwF!Mhp{P@>wbh4(wR;5u0#_?f?{_*6$IwhA9}C!nWN( zTkBD&2<7Xh^xZOc%J`@n(^AsH1Er;=!+gl6jZ-H~oHG8#@j4el`*D-4yLD2W2Zv6I zS6my?otBotrsQr?($X_Aqu}eTvNirsQ(#Lr;g*Ri=We`dSOp|Q*NOZ5&=JRm=P@l~ zctpgRBanJuryIv(QX_D)w&f2m^t9n4Io@DGMvM|&LWb+Wd@Byc2dZ{|E^ocie$9!+}6^<1`k`NJ{%4Nq%&>MulWC~=uSu5`EebRG#h zbzLH&P5UL+vu;=8C;s7gD2XZK`6dhHJ3akZT+41@5AVuSsP{m7f>~Z(UiXN2GsbXo z<5i`pO%f3?W(K%m-55voV5w(^E?uX$S46zSZ{YOyRPEBKxC#Gb{J1F-un!|b#fY(@ zb4bO=-Yn^I4(q>F!uy8bhv_57p}KtWO2NcG+D2xfo=;4g- zg59{z#?QozP?2V&-YBdvG3}=CHjsI7J`oezmSa;VmdL zV@gCsnSVe;zV3msW5-XPoHcIz>@yN2n8Yjxpnh=K9bWdmI%%7|{aW0Yx8qjUmsl>UwiBYWJA zai+tR=<=a1A8A;R+A-3M%SEa}aimeIDKzHR4WnbUnV1NUmR7fC=7{@8_n-#Ymx~u$ zey;e5U>xmb^t#<^$FyS4P?YKqj^Pb)bu^8kk@V%#ibaB`wHyk0nc{8Vv35){HZWbL znd^}{I$J|r)iK#&qhB}G(KbRwi90OhPt;vlpJ{g7VwHN?%2VMkQyT5N$tV%yZi`au zp@1B76c6G3Xp~rSzxC-@ggVgW%C~)&86{fWanZ^*6q4iaP%F5hI&iodI&f&r9XK?^ z4qTKiaA_$W{iUJK+J{X;ad+TQSRFXzv;!9y8By|)86_W?QSy-)B_Ekl@{t)OADPI9cw`BN6=8Od=1#KW$i{4;=;^Vp zCVLRBQl&MT>@m2y(Xu9y&1-yFvDO^2F{LK{-D5pOWG^FJ7m>8qLfF8oW*nu+WAu3k`zJB!tJX4{J4qbu4T&Vy#^eUN*WT0>c9fJhD%) za0b?tA3^wxg)b522MCKi5ZI)0wFeP+`XB<2$Jz z(t2Eyy^4jWrDZ(_VH*oC%2?|)2uCFh;NO%U>nwziSU8U`Uqkqwg$KNrwaiQQlU@i< zd1I~TAZ+s{vxTO|IsoA?3k_aroq}+dg})-q7ZAQ>;YWm7W+4I#P2nlaV{L-)JPVbU zv|fR5fQ2KLWu1WV4htVxvDOz5zO~Rqe?*u^W5|9y210R+wAMq|#KH?Pmh}>ZeJmV| ziM38Zcqir;h#W7hKm@TK>n#YU zSZI!w)+Z1yu<#ASEJQ}FxFZCQsQ9B1KeJ61f%wo%Rv!H-yZuk7-B zA$v>`^5>JWNqGu3DE~poU;a_Z8Mg|V_fJATO#dw8GJ=n_^go1LPybWM?es4~?&7Q0 z=wF3AO#e&B&*@J>{y}5?u$XCqSLLM{c z3i+XVkB}dmIYNGG<_h_}iBvr!u>ov{%)?P0^3OPJL;eNlg~)pa>|d`G@Ay<0u z6LPEf--WF3{s&Hq@&0ciYrP2D;{7+A>*4)RAs@3AkdRMU`S|x4Ya#yKXd$BG*8Rwe z^#J6rt;P8FJ8KF4eK_Vp{JShB8QF<>2$$<)m_8f>t9yAWrU3t5hoOM@hvl#pRkR>YzFo{f7P z@^f(mg?uUQ30%Gs$8j8sdlLV?5jRrE_v4Ci`B5CAc+@V$Y z>9bu^V*h`&12rRUM7m%7h1n9i-|J0^bHS^-Utnvgfv1h$L;k-(#Nnk_85w=-VZ2}b`&rTE}&%TH`!eG>T zwpLAVhzMVIlPFh+8SA!Lcky~M2aIlq9eFf>+S?yyU(M_P+PFJn zw=I@hmA;M}c$Fr16~i%$)2kJ##Jj5Lov=wpcLPFlg1^)x=(L`SatDiiVfbLL^A zv6GF^d}8q6g6_&|#2j_dO;py4HDL zjtZosRe_v&E2Yf3@s=scI4HqgG1DuUGxM-h+I7;iV&SiQyp6hu@0xCG;^9$$P>L}^ zj5pTfp0ZHF(@@?1No@`F!8f*H8hWRv+IgxswfYU-Fe{8Pe%?=M@Gek4@51#Pdh4p% zmy5Fr480rC(ECPV7&!?$jIpQHFvj>6sklAxiol+LISV^xaTDqtnm&wL7r>GdalnbU zn<9EsvwqyCI5Z(ZeCUE<&kSyR^>Ir5&TdZUfChJys-O1{LlO2&#_Qd%dYfhv_C#Xi zanKtq@O2iPJd@s6*@w>-ddq{ryGC`rJe`f_+g%4J&3q(9h0fpmBvQPp2y?V1K zR0_WrC54kKd`sCIPO9Kd(-xwZ>c9+K=wM-G=BC5o3Ux{h(Z(lv;mLAJ%*!R_9iM<> zBD`*CjZZ*}2o+U-%WwLYsnqgu8oZ0yGsce{$-c*!RH;zPIbOFA5U)?i3*}B>c-3hY z@Z@!rt0Oj0L?)^pDN+`>ND401{#ULiD5n6;N+LH6NP&$?KwDy+J~Z$J(8^8IhbGA> zxE7ma3z@d(bJ;^SxsjmY|0V*TwJZ45qzhi}7uJE*(G`L7#;@H#AGZs%HY|{e|0-oP z?1RZLv|1_+euaTvvuqPG_IGen5aIo9%2kQN*52Xy?%*7`#p*;8@8H$;MBExEdyg?j z|EClu@;P2ydN?wKce!)RBz2#1Q>Ad)&^v}vr0PhJd;UAo`JUt)AyQWCM67y_1mcz& zjNhlaBG;eR3K;@!$Qeioi4xrjY;C{P+&pSXsr;PcED_$aWk~cs%A~3Ga{t_;HSE9_=4QWO` z^j*sCNy?4ySJi~ztO_!4KYK(_?&AC&j$55l0LEkncRw1pip*={^;n;3!&&Ww<61(u zNKE976l;vZtwjD9e{8$F@>w*o-0)-lP8ehqWsWpJCzqHTBq^3#RsR^I6E3lw2QK-f z7@cWcoBb)2PIgo2bUJHxPg3VGpn@YZ?FnXDauy}Wt&e6vf59CRWR+z!Da$QW?ZL9w za`)=&OvmvP=GDpw9|uXq&+@J0%IxE|VjqmExNdQOeklTfZ+EMmGMtVP&Dr#u(C9a2 z;e-I_4<)8 z7ttq9L|myd)UT>ap~#$k*DmPAC^=E8k&;jzLaHyd3;$h&YQ8~yt5voU#3{V*+XY$Z zaXUB8w#f%-=xUHouY#_04acEQ2I}E%jK+w5*j#5=KV68GJem$23v>a`dhGBv`|5>6 z$6k{67^h@mP=<*hShZnBiVfBJ>2)^O4~D*}dK?^fGX0d^xv+)>Pi(P}I zU@Sb^^u-CE%_euQ?Sc?JgfAY8^v>e2JBkv%1mQ~*zD~mD6Xum}qP3wQkMP(8(}x4` z{Jm62*S;_dW6o4QTW02T;p>7WN97tm1QWil!t5Uk#UWC7pS5EPYbNy$#;Dz3qR8&p zJub|v^eQ&1(~f+_XUz%oYMlq=G=1*;Ie9R9(iSU0-!ORU(=Kw?ax!Zw{0|7_Q^(Fl znk&p}bvAU&xITsJ zE%CjrzsDzAOA?YrVZt!6E+NI*mf*8@B|yQxgf8NPgjDNm5Z^PgB(aOwl9+1kP4wBd zi6CAF@kwHe^&N->oj^R?sf*ayDb;$Z6HW_Z;xLF)ozkrHAiiYcQl~D~QeW~v@N7re zF|GgAY)AUYbbVZ_KWw%`y>b}0xtpZ_-#evsNV`*7_Z9Cp^lPGfYF?82hN52;`IOe> zc!Xfvpn8y~Hz~V`H~9_0SjWaR;cealcap%42=9QuFfQ;8z!V^4YXBzJu+PdnU_0Zj z-T?;~*LeptGH&w@_=ItvcR(9siZ#GCfXBT9u4MFE1JW7KdI#LVIK~<Ma7>^H_2V4kT0GtC{23!EF1kME>0%8tfz%>ZeZ{)@UdYl<6QNio-=pObYwN~jbZB^R6V!&nVjlA z;zVGX$1(NRj%v~dTNymIepZCotm%2s8`$o#^;DF0!Dfn?x1+oQ2RzO`D}JWnS)nW% zv5CQBch{o^HL)}!dv^96m|2>E5TAJLPGL?nXP`I&ZHPXcRC_|eKVmuwihNeUD zJ;0fYWX3;ZZg#GpQ=+OmTrad$TD%QJZRSyaR7_lQhb;S=U>a~Pbskd3(I8>&b{IEl z=PkQi&Ri&%K2^n$moq~Qxt3WbdP_&8)v4Y>ixR)A;gy0c4tEecE{RR&Yy!8HV>y3X3s#5 zojp=KTkOwMTbPdU{_4>9|0RAMNWlTp>g;fJ6u26R;y75ew%`fUdJM~FMf36Eyd4Y= z2R<)J&$6>a@DS;fpf7WZbkC4wCQgxty`XCfic_S!g`^B`xUDQskq)!y#3|CKSX(>Iz^`@ovjBrisC9VjCO-t_`Zk(Bx(I;GQT4vwyRHY49 zR;g}|(neenZo!&1@@III1@oIW>dNq#(^LH7nviRHYX9)kNKZ==J;GemvDqL@%(yx{ zN9mc@gl8dr_|L1Yj; ziU(VJ%cj&Q)+?~%@8}O%=nxip=)gs>!by!{g_DYGbO;+IAOF8~S5ET(7p%MfyNA#p z=NFA|+m1of_6i)ECS>0jA+N$A^n-B-eLAcUuEQbpV{r)mZ*d6yWE?{OKVf+>y|a*a zbrCYRtC0WRO~?lb1{bTThmh;3C(I0}7u$XGhOGhh5pqBEWxJ1lFf^bmU_3xSgS7#{ zxZ)G?!+3!D!z_Z5gj{G`1=9%QYS=9p*C0OQ=ZMc3fcT7S5ud@f3&tSCXADMs#t_73 z3`Kkf%qZSBhW%q238+Ck2D+}1z<>4DoSBw3!ms|q-kQ}1MdGwofO8JMK5WcAdMs!L z;93f>FX6mqJI7VO%xCuu;dSoI97EQP*Ny+2&IA7}q!?c};rTbUa;uiq!<=wN<3#My zr{HpXq#L&0XtzG?qC~jq*gcPz1!wg>G13DLCu8dXhvfGttj{AYnpd9xs1u0IZ+fA* z6MF`!Uih%v%{c+hi2|$&uTpxMWo>Q1fIdB2N2`{#`Rf5X z4xwxW;wA+qj?0>+wzR8UMI4>&<$U(!L}rC{YjMHr*9TRu9hdBR&0NLReiNU?0rdW) z(9RGxo=^^YubH#%&Ndh-**e?q4z!@>NSb{sjlH5S_y8Pyq~@eZy&tD}?c)D^Ov z#Z{$?PYt29<+ZW|iQ&vdHTY1uQFajg6&Ur27xt@|;HP7l2|tuv*{vw`9lzAjLDf9> ztnyfnrgzj_g(p(&YYAC*2g^e>RlQj*`oi5IR~PtDQKEJ%A&` zQ8NY>TKgu+fT^uC*fuA|z@mCUpPlbFoMm4X$*jNXy4-Ou@Z>pOu;8dk9k~Lf;SYg)*;d>XF0{83N zH3_Tc{NzKb`%^I@3H>M%g)M(AfVQ4JxG(umz;WD+4ksK2F-Ee z22hpWpPLN2js*hMu29}mli^QkrOKFS(xR)3gtD7z1~E7JB>{XKyToC-!z@5zo5->#S?}<0n zWxR*M6ZkTsAm9-o3naPpv>Q#W_?`n5nw(+BrH!W2Rlsm5aqpzfzS+$FRX7F*CGbK%^HO4x-IM z96GEh%;DPNA`~E1y{K_9m?I+GB8tEq8KKC{zB#I&N@B>cqh0n#UvU|Cw*;>H2@k3e zu1~sr454!Ph0bt?bl?aPT{|I{@Y48|ZkHj)h<0I)Y403aCV}=!gT-=#&Q+u(M%Wv% zIre8NS5Z8;1vBoae5jHcf7MUK5h|KrN3#l1Z?xu(y7`5rBD`>J(sdi=8d*9MI=Dv` z&u=;?4wlbvwUfJqsKV)0SmS2B))}IBbDS?0#xB8C4s6%c7ECZ%Vgn`fciL`7ue63j z3Ui`fF41eDT7kA^GH=lnnU%61YP6ekROGI>Y>Bt(kw$&YC_yZ|?24 zYtL5-bF#jGw81cH(eae#OHXKvJ z-)tEw#jh-JORUJUMQ(y9pibf`>WnX65Da=e;y6k1K3U=miWLj7Noxg$ms^ZZ;uWK_ zc-RJKOB8uxMVZGIRrs32>z+=c83sOIct|XQJKUnlEJZ>qh} zg2SWMaBGz{Ol+}|ae}8uyo2A`m{_qDzZYXhiM{yM#*7xtIO+5Ua7$u4i>I*T?uFQ2 zirUy;iIcHo#NT2AVqx43Vny6ou`zC(*d8}t?8k1okK=9<7vm;~MfPv3wf1ktR(qVN zvTwF(aeV|kA6W~qS7_>QC~|C zn8Vc5k-_hJIy08W0u1=k*Zm;iSiOLQ>Q+taG9CIux~E}r?cWXF0ALz$-7<8Z|MVD)Gi%(%9=KFuI81} z>3Oi%P}5praq;t9amovpik+FVM2;FqWa1Nfv!`OYSxq3R-2MfVs@XbP_1)1sbHa3> zM46kaWC(ZgxWoqBwi-`(;2R6p|y-t~| zQ=0LoxC|!RyvyF8cssCIT}7K@)7#&WW&)cTxZi&iiQ+HbwES z1=I+_Vd9SC4tN|%&%NNaPZ<;P+=^1cb1P7(s+%*@PUXf#ig9zDa#s@RT=N?u*JJ2E z)`d4}#DkCVa*}xV0RP~P4|@Rg>Wqc}Vvb$o?l|9jS~M2Sh&M8b<8W>{t=nx=^lPuor#!UPP5=Q*6ORq11%M{S1+ z@K&9$YW@iwjxZgz<7o$#gErmd@3^J1%-XB^YJ~N?os*T_vmZ+ zX2Fz9l6luG%t$Du!TjS^f?K?sf2G>308czND?txW=NNZ!H31W1k$?wv0=Q05!*1I8 z@QjLz4R?Y|>c)loMUqjpn2Ktrk>d+#bP8WJl~8_=T(n28XN<~EAP!AO^)urWco!K| zI<TCMuknCZx#RhxnIs zm7;~f3HJ)>nDCiRKL%mE>%|Gc6GQ_7UkmIMiR_x*cDAmlO)#t@B37Pdx=ggJiPIu4 z8}->JQOocIo19>Yc@ZSo^h+nfV3C{4B)26LCr=BG7HEiQdqZXg;`H1adK@&nAsh#a zj5C7?R~`QlK}pz9M}8|zoDqVXjjyWoUKtxC6a-n<;Q{htWY0%!VVqGf1(#v`^VI##sGIw zm<57=?4RtXgJEu6*CX26BJ{ul0ei7iz>UTi;BFotXjL(xO@%ddPAzh!5^yb&%@vuL zXz0zb_!m!V0fo9H#q+j75#T8=l^(Y-fLrzoSdb~gVznDy5b7en{nIq<8IH%_1KN~dWpb8+~0D| z>+XuT4Z12=1KMREWtM&(Vy^kVXwPQVDv(@{+Aqy(7f$1)K&u`N7#Le1r%tEGE%&T; z2o4i?VE_+6&VvXPaGD|>(fH6`K6Le1-NhR{|uEKc4az^3ppaaCW2V>n3LO;NAGIpW){Fr%R^94z~fvx<4@BWe{%cd z3gYKA+G%hw!o6=;YibFrJM~d=l`iNtX5P`!1lmQxwbn+?k^H0_PdSX$TH-ct0(^63&AgSGy6e zozoVP0v??^DZu_#HOj>5q#l|}-c27Y5ssE~3f*|jaAqRkY*Yrh#GPstp=!mg6|7cd zHCU`%2u5El^o2MqO4%=>Y(*@p&hEIe6LTEXg$VfVUyX&8eD<8Yq5QRq(SCfgb@ohb zV!+2F)DF<0&irOVoa^uA>^XPj-8tHS&5VS&ggC@;7WN6(kn9CaUGITf?0RY$RY77_fxuk z^<1y(X$~es)FO`APw&GFcfh=H_(XBYa2@9F9ueHv>Q3^8++hNbZ})~-$ioUATWPO| zRKfdLLSa%p!XP8KR;IGRK9bdT7i0pbHexq!Wb#o+sVJd)!gk&|(;V1s8(AD`Ui(hW z1n}#OJy`P;lgPt0MT}1AKcRGA4MF zN7c=c7AGZD$OBUmn z2tNvNHCcGy=xX2yQjZvAieE|VF0$`|{O?||5r_Ldk0bo53345_!k)nIBFOJSK4O4e ziM_8Ij2P>%kzh6A0e8+ww0^`feTy+oE|%dav-O_N)?QD7briq1JqegQ?;a1OT6UmhTVJJM84Ha6k9#T39Fm< z6u(DedWvl^-Nd1oKH~kDzT#`hCt~|qOK>>cqj5;uinuGpmbiXaGl;)3(F)>0yPs8w zqu}=NF2P#+3e0-{Ogs|bPppf-QalfQGrphIioX4uczDQ9xWZbA;wec$U$i-)zjX}4 ziG(C!f5^oqu%udB~$?3!SG zfZyl%ecyF}SlBJmTGI{Z)pbKrZSLl?s=Eyk2fKB)KJ1nt7IhzJt>{j6S@%Ks&U5!( zVjqa3AWnBjxqR5Ym$j%zg7sLB1o3naVLjIab<|^su@2?RX<0wQVOcL^bak&7v9VW-wWAkm1ivG_5=3LKu2xI0 zWU;t6YO6PDt2f;6JJLHrobEkXTJ+bJ$ufT48_vL*E#ypkIPj(l6m3ae_ zcTP>!v*60kSy?&jZIt?024x|tj|Wpv#E9>2DaXs4E2iAEDX$7RZ~ioF!Qx2YPbcIdqK|D2OxB!SqsFG~1ks-;K*s8`G4|=nEoIjw_3>kJUkyVe6ECzID7> z7}0u_HL^OV&Dk}l7DJ+(9L7e$YV9G8(=<+P@YH9Z>9o5id|`Q3uVd(kQuyg|YE{L; zO1L_7Of7aqQN;Gn%1y`X+A0TWcP$469W$mjA7HOFZq^gvYPJ!xsJ!A4^#6a@dk;7{ifdoEx~F?;dTMrdHb`1&1`wVh#7}t zR=}DiD@(c&uaq?6aiLp*HfU}w9c#$O%O=sIiG?dFe!I zh&HxHSXua^VfrFQ8;_$?{ePwmQ!d)Xd^VOF)aAnFZVL9-d_jb_^()0M>Rsx`WUn1& z84*L>m&Vjjfi>n&F&KdlR!oIOU&bY&NW4*`e__xL zDw42B;Yx|;N08!TlY&R2=Ga0)5lw`NHX5J~S*z1L$7h6QkbpIp_MbD-mP8UTxpYpP zqrsJ?ldKab85$Fdm&6s5Ni6ON@Z=8Sk#3b@dRPB6hV(&O?zJ>K#NrIDF^jH`+!%Bmn2*75T(NsWc*tR~6`os)E z9Fz-&zlJr02aZw?P=YjQrTWVp(#M}p(ZiHW#{v8rsZwx`B>e4Enjp9W_QxovjZBsM zQ?zl0zz*0pniT)L2KiQ&8 z$-&Va6$3|eFxp@~`}7&nQbJCB!UiUUhMbZ58xR>)U@@ZTSk`ReSe7`+*#dUI0_AEL z(7=&62(_UVQK;P&SdU;#Xq&_a0ADb;F5=Ue`BE;0C8%L8bLrCk&TplMENHEkg8rU! zmw1r+Cw|D9hbfEYN=!(JogA^JEA~mtf0MFDiZvN=1SF7-x3cm)2&-OVst~`l z^5S<8S$ZGF(~q{RU?sg8_J*p&BX*5^88=&Rzz&i45KHnGcC9=CGD?@GUZL+9$^9s{{boO0D*IENuyf2(LHa~cYAl$y)BTMFM`sIYI6|V?`1sZG zMfzNzPcxz24HLyX`YiA0W3^V#@BDff%L);*uZyD10cB~+qAorYU`yUPYhfu=@953> zBus1e<2rF9{KH6>wPVb!OxQ7Ih-Q@qVwefTGt__8(ZPh<0zzmN%koBuW9`+FnUR1n z^FPxmvzHfWkC85F%ier4hD-Wiv1<(OWw37$e){X!by)uIh$q`q8Q$60Ght8_(O+8M zJ%o+W_Dkdc8np=GjoWL;Iw=H5)b!HQ?Q*62oBQYdx6+)Mayc6;;PoZ#f4=-OH6UVJ z`WOFEs+>fSAq4J<=-vUWcHVqp6Xw50--aH)Mjv>zj0R3PXr|E&!kq~2XONOEV?iig zl>Zs$!yX^+K5Wl$6A3CK9~%-4Qk_a0g&u!MRJv6}Cm@wRF+qDJNP2m{q}Z=8nn<3} zCn{geHG%|ONCxK~@DH)?$FYU(J=g|kSmK>rA{}W+4kM$FR&=a^Ayw=&2@O;3yb652 zSlJ_u4IGUY)5>Rb5lERs5ysdv-+h{dE?@Cb0PS+g7HdY|jg9cJ=caJZpiUG*gRB%v zXE=_BjJ!Sp!6sP}$_F}KiZLA=6-L*-@r#mT+MF@<4xG-IsnPtqn9?o5#(oPAe7fzP zjsC=iHX-8pPcay`E*o(i>Iv!}^at204*2PmBpWWvp*!3g!>L|2lD#wE#PaHgwFrg#oWLBZ+| zth9294U9g@2wKUfOeT{$N?GaPI(B13K21E_9nz51@(Z>m+gm&`jNlgatx1YQ4N@Sv zG3*P%^TLxh3r_=$l_)K(Jx*-xDU&Q%ejr8>EI)LJ!j#l~gcDd31{-eMbg}+A`drd2 zXV6W0R^!Bp^~9vPjMK!>2Zb=cOiu>WnIUYwSlf{fv)>-ePGi(zkr;C@XH~k=HH1cm zUPFqQ1rf4O2FL~jgzCm3Veot}RuRV#c{PC@vKozRNE#Y!H5#I3=N@^qQT7|5r(_sq zMjPFmMwS1FZXak=g^L(!rq0WSx`B!GXY^06aWU7QOgH3!EQ^7Iufda?PP|-lA%HZ( zjyU8#^qOS`1Z3Ed4-rsPLo8%#__HE|u|wy5Lm2aAL5grt;QX5^lDTx05zy~4#+dI^ zgGOrE4JXHje|h1g8)<_ys7-(5Wc(vnCY^7-b28Rgh!=5VX$>H2&0&ilGc699yGMna?DW6%YY_$n z5j_*M$kCmULyKahJSMSx_*Oti%tg*_#tg6WMBNZ0v+h{YM=%GDZ zl*vqTLnO6D1Jw*X{vafV>aDt9B!Q@A@a3Y9A59lxkd3p8krao8b^@?`2Co7< z2!ZQzAuK#Q;lZ7an2RTc=i7K(JYZdbv%w}Sh47n{>Rr2dF)YR%2zhtm@1&}hFIol* zfy=w;I(97t?g4#Js62%FyH~GRv@EcR_q0&nn$n+za@dGd9%I7pZJ6a> zyJFGWH3zL+4Z|W!kf_g6b*NgLfroJ1fQN9r7?1GJu$23ql`ARX21{kgc;CUC?P7$C zaXZ9a4JT)m{vAA2$Y*${kSqe!&|!Excu&Ba8r+UIHF!_FGkAX+Z`dfb$R=Lzs_w|He=b^;<%>ok6HHp@rXV(rG{oH-eg?4 zx;PKU{dO!O?(+U|bC>q6;bQMhsS!b43t-uAS$DBBJbWSVGbvRQ#3v%&f+0}i;GjaS zQ&tR7UFWFn36*5@0=5wiyn6$*saco7Os7WMl%hpc5OceuMij>dRt|$B6I&}BPdT4- zR6V!297QO>dycA!iiS8san2H^$B$f9!#U^U(tqt@7)12faKsrf{b`73^yHXEm$@3p zSzyZ*qh=6}t{P@Cgr+AK!gCCl_L!?il}2jOmpBnn%3lI}7Qzf@abLC*$|W2FL!Dg0 zJRFGQ5gXFVrY4@7R`ntM%XQzaX;m90Nc7+D(keS{-+6n@+xr{yXaGHhlw&6JQX2yk zr*md=^S7iG=8*rUPO!(K-h+z%vhQG)uQ_Nrqj{JF6_9rh8+YY#SEOW`rV;})irfok zKf}1IV4joW7QpE2qGiQ-YnLC;y_$3VTB?zlw>*Ojc=I}fcM;DxJdj9|D%Xb}N8?$K z2Tnhv8htf>+>B=KTu{W=vwtFMQS*gUTXHzp206*94~riK z<_24*Pr%}1H%^}0`@N;GP&;|eq63z72eKtbK!s1{&0?f*hG+{l%+ifYwCpiooquxM z)E1G0Jd{4%L*dgH(vV@LSF0jsyJig{qX)Gg8MnOMr^Ixzx_>=>j4b}K^< z01>>c8Pe~uVABq9Gm~vClL*zgbMn^7q-hI>-vL%_ZByc=DBIebC<~m*2MJoIj>T8R z8LlZyK9X58iwP5@YH1xIhG^FUF<@K0*gh6)A4z4$Y=*W>-G&+(^LpOWv8||&Wtj%6 zno!w|L8cc860-r;>J*$oAZQS7~4`Ar(<(#Az{z8ttxJ^w7DJX*s;7*Yee3?2|Ga1 zHl@Ea=0S=6-*1O>hyEB2*g5^h;b3sWl(7x^KQ>NRPj10AWT_q1mbNmm zGPYX($AdL&tCks8|6LxelPkklZxC$Jl9;Jqoda8n|4gP1oVXq&zCiqz^b$+Lx$$sY z$VN-;jMr|Knwt`GiKV`WP#)@?LoD6p@mpavQBOE~AgKJgs1OR_^>cmgnYH_h!BQAG`i`($N(;Xq6 za;xQQa0C4jp2Oj$`4}|oB;1#(%iy*}+?dX*$KbmKQmuLMR(e}?l-v##$h^2v7S%6h z19qASJcYo!vXSml^Wx~tD0OmXG~J`-~~kTd36=*MsHp19 zi9);#;D^~s5SPu#3m`6gse;Gp>s4OfiNL*TiV(k3W5r*=GB`0;l;?uObaAd3H^jNT z*qCdP4+HRc4hzTg0KAi{7ROZ7h@axQtfE%_0y4C}s{mq8|lM;L*Y~_>BhO0|0(h1H&qRlcOh^e z#XM4_#Gk9G<);AjRYN*xef3bt_tuGfz!oyg#TOA%0R*EiSCtNnTy! ziQB;24n{P)l^*S8;as?S7vYZhns6Iu!nL$7+?HL1dzCdCu7|Bocq_Jc6Yl%g9>V>r zHAlGX>^+716MHXsT(;*5_iX#?!oAR*C)~^Jy@mU-Hv_Jjy%`zzO>aiQeb<{&=YB}A zPrMmL_j7N?IQOXREEJHPm2pqV&MLTP!t#f^A-j9VJwLm9!M!-Ud!2h(cK4!tWp?** z?lsxno7@{H$t~I4r~N}-v-1g~cl9A#d&}O|)YL*;fMVP?&;4}kVXO?72-=c(uDN(8 z!Q7Z1;y^|>xOxv|b?po21UZ_Ukd4;Fyc=j?qt_uG4~&e?P3?G`hH(vNf@ zwpuK9-oA6^MpWx(QJ0a{#m8D4ktyMqnaMnWY(~pw?6%}*~Mi(tuoi0P^}e+a)%Z{!6vlzja~!lqkFFu*`Gn`Kmis8B(aS_3dD<;yv~ zTra}yu)YD0Nrv-nU79b>?V0+&qMc8n)3kssDje&-iiVo&JfAzO$N$(!e!~rjEN}!e=#UYHzz7o<0v8aLPn#QKU5xg|n}nec6q5?x zlv%`^!ct$pXEThTziNtL2ttq(f@}ar#*dsx zXa>sIuD*?msKbLx%SEGpkmoPLKitxnm;rfiwe)Q|cOKBOb$Ttd-N-!!$rCNB8x~UP zK>N;kA#`6J8m<{lh6%#a0*a0%F=||YLyko^i-v2^CXktXEx3>-gDIfC(O|$ev!+%i zRwOP_M;9~bO0rR4h)og$(vT^TnlUBwjU!PASoURL7y?s3iyPzaPv~21WH#I`fKgm7u+>z)z9gAwBMIJD0C}h-In>C8 zZG+)bY=F#6p!$uHNOYuV6)|PC#aikBLFyVV1XFZxLnohB1tXk|QDD@{DIHJ`8fQn1 z6G#yt9>Vb<0T3;|o*CdqQ z(;927YR>odkcOh9ITS{B@xVJnKLKTxcWV3jG~lVLh!`-;ff@P>0yW?^U25yR7*LT; zc7_Zq4@eX4eNbQIZ7d$VE@MIDnp67b7(yUsOxO|G&<#kYZTb4O#-M^@4CWFEFJ>%Z zE<;a!xIH&08|qwQ;!DUlsAXN+P~)ojWD+Nd1lPA1pj*$>& z{(O_nb`DR8lb~UI5hUWTx3c11OUdV~oOlfa@$W+*{!~!&N(jOK2Ey>q;(5acmj?3h zSEq)k8zJ*9HbVIQx2Zbu0$4cjriMe&*b^r?Bg7?m?ttw3{mw}7np1$XalJUf-BzB1 zPyA(WQQYA+$cNn_>TxI`ix;4U{1znOKX4nxy7VY{N_vPoD~*VY(!<2v>4JC)telt9 z+lnn|3tGuA0V)gPa#=5Kl-r7Xq$M`X(c*PEM!YY#7e~S|?|L}qy*@Ku+?tsnp3Uqa z-_1-EM|hLu>0VJ@gy$DtQQYp07WYEfeG`P;U-HI^H@$K4_-s*JkR2~B%}$VaWsCA5 zgnyrH7JaHkoUFDJ=crcsb1Wn`HZd40KL%cX8eFJ_7Bx>Ls5Ffi`bFh{(>YWC(x-3$GBxn zS9C90O-3VDuKoeG?FNj+WAVXVt5&j@3^@!z>a97c@OHs%ekIp-n|8#& z>^g>HJMJ(rkwV zexN@`G&KT^Zgx4vxd-4J#Aq2;&t`lE_vbU%!8`Qz6A?XTomGD>AsfL=BYjebbYP!w zan_eY8)db#Uy{^_`>aQ{H4)nfHz}d2vTrv)+>ke^jcL7AYm~IVq#Y(pNv3=on{jM% zT|QditZ@;Q(U{R^oj;T5oP^?|Ki(Wsu)oG$l_XBFe}y?JKKwF6fQ~#kY$5NRC3z>C zyoa(bLztiQ;`CWqjiZLF$Dfqn=X|%m(eoXBlFFD9KdawjA6n#!1M5|EP{6)eU|-Cq z)J7a-;MYXs@L>rKGeZ2O)^7%$I21DG!J)7tOcUTp?L#x^Na6VfIyX_{H4x`A24~E% zX0$$e(C(MG8AKf%ny`h%j-5{SKjL13PK0I8Owm@~0^;1Wn(aX6r9cou1;mcgGLp=OGBE$bQN7>cE&cc7Lhg^l6F)GRgE(+rYk|(N9=u#sTIAjV>acvD@jxU@jb< zjP+j^-~=UGe7|i*33?jlSECxhjNlRKQEpOZcL|q}@`oC>n14OuG*5wzkx{+j{CTIO zvQMI6MYy9-oY~WwvjWu?o}`+kg1VSbh&er)CX6(?&tOl$#F!pLuDZpdLo|ncKH~FF z?jlGs!%AsUkf5`X%I6~})yXh+3quE1PLgSW#nT2%JRCh@Lko#9moXWUNcT`;J_gN=47h_*Y|U(l#uCL**%;7tjK{A!{zch9 zmh*uixDFVP#`6!_3M5HlpKPJ(G0jAv$!Zd^k0VkFve5Wgl1^Y^2uqB-V1A+Ki>Vr@ z+0Z%|kkXKWNeLd5a|cyps20p84r%*JJ{>Q{)9Tb($%6U2zO$SDup;MS zB{^SrfTEP*&sD*A}gY46dZl4P-@Ay>PLo!iSdNbWB9FdeW@9GBe2x+XNy1ndi86d^;dtUQkpdQ zOrg_g?DhC3m=ZCuQ<@8`KU1RIXUa@&*Q{c(^(m#))l?upYUM07(6Mo`AWIE-h=eaa z@CQXcL_i?mS>j$qY^@6@I9WKOG&4jqO7!^x91CHOuHj2&-dhtFr+YOHPW_B82yKF} zEbGQFq_o+F5*8D9N|F2_Y%Am=1Aq1yT{H7#jO_++$^yH83Fj`(_S!-p@xwF&O`{5K zo#sLX+&bMbQK*aA?lU`G(T@>DT&I9rLijSs2f?e0{1{v$k^?%&PN|D*L|kdR@-77KqrfA!D=tiB z#g&luxeFV#`(T&u>6DUhr&8*}6cT)ya>Y-byu92=scRenZiAPX`{32(5ipOQajN7N zcz*fFsa8k3h&;(fYPUvR=GH=z#2q4@c9ne7O{w=O_H)D@pH}k1bPDo609=iwe(P-~pY$yGGM;xlOB|hT6gOm*cqp3_k7vh- z7qZ)nEs*f}BCF&{%97{dxdJlzcPS;FQRBoP)p+r$njk+>DfOj71wYQY;+)(L;=$ZR z@lWuLXnCqwfHx-Pvd*REdNJ$doU z<&&Uc!3s~4knEtfu=xVmvSo*uKa)@s9k7dwmP~7EZt8BIK5fbLMT=TH+Bz1uwk_^% znYL(A%K?j~F6nNb+TL`)lD6^UE?TN8*DP91N8$s)t6qz#>g*sFtpNs$dv{O=tX+2S zB+Xdbp>p|JRwJ17on^Je{5kvlqcwhtgi7{92F(U^3Y)_Q8zwnjD5GuobaT^b1q#Q!d z+dxtdnpe?Z1R|7ZD3L_bf-GV6x`~=OR!-EUoV^D@R4--YF(YUIqZuXUCWk1v!hoP3n3s;;RWGIUto@DcTzA5xXQffNzdU!ffmZ1>=6#L@e4 zz1`z|H61qa*`I0`i;mtaV1s-L4KK(Y;Qkp~4E6~IOKI5A>a&y9amGHD_T`xKe5!*T zcK+!bqY1{!9H%v#c($#;mBH?JzsjKKiONprs`=Q{uQFqG!Bqd1)n%}cwcrp3yL_$` z4KSUDA7OouVWf(x-jf46bXPOL1tG@SN z+N02G*8HWdp)O0rVE2IO{+vzn9z4p34PYj<9#~~(7SoDm*8^r~VFU$ZUF(4xz8;-F zh!lY>0$y~q6bA8E5M})CFbreWTElG5RBEQ4S|$-Xf+cLoeFmxx))V4=k;OgGp0IhM zWS|GA@Sz`~8$iVH1B|x1;cNvfjW%y$EHB2AU`$a%= zs{)q0eoedODiA?UTWN`{{+CGVPgB!YCm@5DW5=WYcTn~5amZKvPUgPUQq!*b8|qHQ zOZPV;_lj6<2eB@mG#(jGX?|zoF#il&P5W*vcRVuq?FB#Z#!QR;`J0ft_bYNo$%UZr zVffEKI;C<@SA`WP$cNm~|?(8_j-lZrxINRr3V$@U8xSZ%_t$}eqM&HKhK zAiETX>jj@*1GT&6jIcsQK3s7Gnx8>@i-$utDSifk)+{B8S^aBM;09vPZ&w$>supQ? zp;4}OD6a~;Cd(=G1r@1@*5>(q&F)ND>=xDy?IGHqss{2k7sNK~p?P=+)D1CiQDf?U zQ!7aI6sQhEbC<+Z*>w>COunqJhZlOI!n9Msf)e(Ks0AxlYOq~j6SfN0kq=qAxEtP1 zqlR_li5%?IwGh*EoK`7fx{1>ZXnmoQG(nvT)3v%ggqUU(DzyE>eda^zG_`&VBZqGplp%-m_4LyPg)^su2mrq#(N< zjACTjNYidx)R#sl+F4gFmRf9!@|AK^?Exw^jkd*hrNwGRgRt`<#+5Yx5B^UQFc}&( zrJ%pZE@f$1(3vR(L35@Q1l^fZ5EN#_pNQub6X0dn}b#gHdxA zw6`7s^hp~@HpA7xN46!`r7U?oo((BmT?~I+>V{MvC4z19PzuUkh}nYY6Ff&amOR<9 z)!E?KsLLIsx*oioyPbmEgqRl{OT6h+i;v-v;7n+8T?YZ6_uN`}SlU)cLEJ~2n68tL zr!Bb|&)We0C5>W^f<~5DFI{myOk7?Cw$w&xiQmd? zu`$yC-c6(2lCi~Kq0Ds@6tdJg-e@6y2IkFOUO_(P+3I<340Nv`0(3aIGiPQS<&{}W zJV~2#Lur!bN>{u2@xpEq?p`|xdu4_DV+-#qtqS*EYqGH4uqy2z+g0{)c8z_aJ;XlM z9&TS|k8tm{n}z+1J<@*F-qt-V)hg_ZQ``MRazIwWVGBIiZZ!vFTF2D>9FRMyS2Cp> zkWhtZe=Q{B9UA-#jPxgUfb7%Y6jJOq2w$YE5KxXjVl3|gDFe+7s3QB6yvRa~QM<}z z*`SI9Tq`!@=<60{Pf_h`-jcJ2HZG0)Pncgj%4G&dR6kjnv8aHkOagJ49$`6uuUQK^ zbP|uM)nSewLGklC7cQ9P!eLxVP=)~#a0$Z*xuCsW^H(oD1YfSb z0yUQ^k{@9m7;wy*yY^Y&3udQOgmB&#Fe@a3SnbA`gEe8n{R$g0DRQ zzK{q9CJVL#I(Z1@)VvF!D(COJE0lC}THbWTfSj_V5wn9vWbiA7a23@9P$^nm5hd+c zQ4GixRZs%}gxTgr%Z=0H3R9|qaXOaDiKyB+tBV@IgjG5aL#vt!?VL4#ulZDJH#nlE z0Ps6OSn~ zs1wnYF*&s3(ftN^Jd)7~hjb!Fms*A_i6P%F%j{s_$75o{KLMsX^dtZ{^(*?s?E?NS zIYq_a=z$bl5DtEF7=KJS$fKFN`RrjZ6)ScbA9AA_3}+KuI%W&?6p4QYW};C|+nSWv zfr4Q?B`VW4I$?IKOfZJbf0`ZnH>77qV)^u^P}PicP&x!7a8@1&pR(z7`H7a|sM80o zuYW~Y{y;PtAY~bvFj`=NMr96;^PuU=;LIT4e8X4bJV44aI5TG!I7ej;j`N`D%izpf zg24H4IM4|09LoLeOn~G zN~F~aoWzV|Te38ED~6FR@l3s?u+sd`0>) z{l{Er^dFy%23BKzz&rv$@J>eTyjJd-O!#Ejqo(zz(3?mGv=>%Wo`1EefN3I3{s5>c6hQ)1Bcni7e5aw^Ym>7SFpdEj|6X!)a_QS6rv zBZVylZN15qxdUr)><;dy_(+MhP>LQBGNl3!G+iJZ zNthNyc=;v-RD&((NHar_d1C<=f>fKG2}7xrkjWRaD2&pxvqQ|$O_b4vy7Y+h8No*Q zMs$${`O`X5j*ij>g-|--OfJ(1>P|A_8r%)G*aAMMr<62+QbB(?DmWwp=Z8vmb1CYa zrG=pplaTq5h1jhh`5S{GbDm1(WO`INZOjCWD5b%;9(39(BP>kfsiVT|gjadi3LBXX zTG{5{%FpT8F3dMT9%tIGNHjFJvi+>YFjAw3e@o$v~ht{I)3nAn`MBo!_q zXVgbk5mqHBV#ZtHvkmEYW?rqPW-_g_%kYo}K}jLEluXzL6q}kB!0Kz!2%>Vrl+MhO z0h)+~3p&S-4W2}#vul!(jL3i&825$VA#r{0%!+u!v2@Ptx_YY}rnOP?K=>h><#()|r!RC}Kk-hYM%VsA;hnXRnf`#o`Jh zgflnRv{;n$^=SA29BY;{FN&cKN37w^7GTsk=+Wslk4ZOY<1<}8fpS(4be?NHSVo|Jzp3dYeq|s2-+1}!$UT{vwsObAyZQn#>9$ft-#06 zSrkJrO6VLA4Q@ih@cIke3uiGe=X&YaHvrC(*qDx|hSSaNLe#Ii5cfFV)%?GFonLC; z_wO})EY2c1qL_Gq^D!BBm3dnY1s{2gBbzKa%~mrJ*gGx1ZOH>Nst18XVJ+3NB&>ia zD0Pr8Ohsm1{|5&0ZvXqGX$~$m!xXdRb=+{ZYY2J4uB_8!_@PzA0pmNIr3uw;6+m% z4J)tWbSEt@fWW}d;qUZX0^I9(@=*Yu2H-^k{KZl7aMzN@z=7sTaH%QIcO7{J0M`TX zO9K4XP0J?$c;0PPuMps`un&7AsB(O|QJt0s;PSK*zfO-4kEFL3&!oqS_tN9US#pB- z87zrhBgaBLWSo2v@&&KUiRwK$36@-80`{bgCC|!CR2O6bxGAILT>w0gX;P17nuYjd z#(~g*B|iY*GXng?OUu)s7;=u+rY`XSxXttAJplX;fF}s>hNt950DR$fs3Wt}gg7

zJ@z~ zSd`9(yAJLixM$$rhWirk*x?8p9;55nG>Ogwk6!t8Rv5c z5YSo(`r8Mkd%!9QqJQubqsX@c+tEMhQqf>LN(qTV)qUF%r92n35IXX#_JJLF_z%d~ z?MoO2FybrSalDh>k?G)`wON7P<3qN&I&pXa&L8}EpRxux9fZAWY=vNuP7^jRv5O50 z``Cw9deasLW&OsFWYQds?G|j)j5de!kT)7zG1#WTp(zh|I9%oNZZtM+FkcysEgWpq zjK+ozwrNIVdk5Pzqp{h8ZJN>8`oT8MXlw)(@x!hv<_A@EOIp0yQ^Jo?Ro(e9xT+L1 zmcf;Sx*l*n;VR%N;d;UKhU){D1dfS`RUg?)#;$QU=8aZlNL3xaDwUeN^~?u8j~uQM zQq_|`JNEULB8Mka8nS9~avePQ>Fq<3#Yq(v;X9hdo3H#xj z@3)t7VStsaoQP8bE7@xzjt{J4?}<29u#$cFc*IHuCSvE`O7@s2r>d5}A1kdt zncS$4gDsxEtLE8UWy)!1;vIheHDZ@DhRZX{Hay;XmNz0_T%YAC7Z>z$*pLr=&g{ zwE}oj;K>{~j`;zv5jdYp`uI5E2fS9`d;;skakvloV1e^#tq;e!KH$Rz&L_J*97p+gv{+?`yOiH8-@Gb^uj{n7g^`x7LkDW+N+6hPq`9Y9sRK2KB@i4o z($X>LK+R?e1e=XC_XB>On%5EtUK?p{_N#PE&2R|>!;Q4Gavi9-E`i{>u{mXHTk1&&U@=H^?J?g?{7Fny`K2( zW1nm2C#P&YR^#6C@cpl}DTFg`ec|kt>XqkB%l_N1tB}IFjVXL*z?uu{zzGkx!!vAr z@>gZSi2|oNDQV*Cjx=vR7(<9>Xc%Dl=p8=jeYPh9tx)qc5p1T-X$o$pJq@?zGea|N z&q5kjmCYZIAtIDZ6@qAVV(N!%kN}X-#%xwIkh61}hcaZy-@ycQWGF5om@~FoHIlhK zBv6q-LhqQLlAVT501BlO1VN0;1mO@}mtB#C?3pD(dm(k0jxu#YpSoaI)OC$iKwUmk zhB}pCK6Rna>xD*vt7mHc;OSIxgQyK4X4*fsdynq9-YU{|K2S3O!@ z505a_zvqVOjvZm>*7L{Nf`NFH8^wGFvn-kKxK{>ESRC*-ZaR$2#*Os#CdL_T+KlA| zoZ7XKH`%q3wJ!$rlFUo|Vl;x~5(3KKKTDUcXaQXg&i1jyob6MiPGN(Cn(F?@8w z({@0nuHs)T2>_p(1D`JNkie(s!1oY%RN#B$z-J5G6Zq^L_&x$J5%@ki@cjf{F7W+w z;J*=grNDoa1D_-Cq`>Foz~>9RM&R>v;0py_EAWLm@WlcjEbzrS@MQuYF7RbJ@OFWZ z5;*2eayX}can7aI{>(~$`ETR=P$pG;7$&lSGct?M$ixH9TZyc-Zv}=!IR#T1xB|nW zoPw!CIf3C&PQlcnoWO7>r(o((4lw1_5)GezW3khLT5RmjlYD@3C;53vvDD(&v4$t) z*AHi2yYCa74kV9^4mA`}Tuv5HVEo^C2aH-%O*fq3nS2qhAsyWo_n2&LjFQxVD( zTKNRxMJXbbON1VR(^Ez0DV_=yp+ccmP9R>bB0{A^=p{J4RfOK+>7yd_QE15tl+%DJHKIReQ>MN+J-NbiZR?!K;|xh zQH2~+K;~+ckzD2H3|;m|l%FLt!v3)Ga{cr7{^Ss<8ZxosA5G7;#J%NSpmAg9mH@a@9&iUB;;Ee#L#P zO=)t+8T4QL!!YE+zQKR-4;{HXZqB*q+P^ww?>D!de#1Sx5B}_T`3mjS$6HzRrg=I`#tCNyl&Z3Z{2d|UdaKsRDU)8DsvRn6A=5qY@uPx8k9b(mhc3= zAf#fljZUVh_=8~6#OY%Fl9r|I@IhC>Faz+njx=eU*gUY|TV@dqHCPT_p=+=bstcWx z5*>s84ILeOqNP1JT-UbWR->A_yedq3v1{^N8&5Pn$rCbRt7r z0JGh$Eu$HBmsS@H8W(tlhiJRPSDnaM=F-Ihy*5>DFOYc z=PF|Kr--E@l1D{2jDwikiPOF z&JO^5ROAwUQDnGB6eEFkP}cZsbI)PXufgY$oiIf?U|$b ze|0jy!J=;Oc?q}C4r&aTr&Ee*e0xBzM?@TFHyQN{mU8~ z7u7FrXoFcrDT5ec>{2fwCg>}CM2B+?D+*hXr|3EKshd(id)ADZ`#@m}#2s`{)6zzm zc!BK|SYm8%Y=glB#PW;ZxOBea2NTa$AhT8(%Q6Xp0S)aiBZH)x+7G2LC(sR{yY4k> z-`OxH(T?730b6q{Ab>-*M*!!ybj6Z-sD-tucwCUVOGnOaTB>p=&*aYqfpwjH0tCGY z_)8V9tMkxdKNRL^*bZsuviGP*QuCW&*%ekmS1g^^-qfS z4l*KN!xkA?&sm1ETCMqcHv}$dVu1~7I)awM_I5JJyWlXNWNUp7{UIApR{S^Ek5Xs8 zRbh^;-cu1Q({UtXVvhhH%DT!x6kxK2pp8T^3Klc9=5!pJ*lLv?GomnNg}DhL+cHzC zHBT^#!~_&96&eyGQ9ywXKiMcku{ub?v1qC_r^3{o7z*SVoK)5e8Y2L4hN6hcBq_Uc z=^robSh+m?c}GV%PSMr!u!=N)y!2%Tv}jQr$*MX1XHxdhqL!PMK>s9Mhd<|sqc{;| zu&xT+K!HObz$blO4(VJ6NefoZaQ4zBtO0JO7_zoQ+%O0i6&)aosWNSEF6b%yasl_q zAgq!xpVdFiyMnu;77bianSPd*ce6f*!PnXdz(GQwp(7`7*U=$V!$`BlCDs6y# zt1e~%4iQmFyj76IF-C?dToM?xOB)a#QdZcou1$xQz@h~XEbv8C+GtN3tsu{wR#6o~ zvQRoslP*Rm!301CaOl)^UT5mOG`ajhj6gVTavj-e&i zWpPA_!QlviVn>ZZI1oWOfQa)fKIzh??gUwV-xcUe4qa8}Dg|o@bD|mPpj1dItW2CS zLsl+H2AfluY@?1OjD**uHpuXa9EkeP#Sh|Fadgm!orGp>`wZ&W4yaNry1$@0?#)(* z(0|zSv<=aQJc@-il|APT)e$DZWGqE7D8r1MGe(1I21b>`g|+Z)v2S&aL5P6nwOs<9 z&k_KZD#M6&wuZZ=`c^-ZFQ|pZdPE~|%}Scwm__m=%W8 zEn0W_I6_nnv5QV0{g!SxT=9NaA7zO#xlzM{DP-$(Zd!l=MGIQe*<*X`*`(=VamP}0 zxjs-tF<4N!IifKlD=~kn1_$JV@+MtBBLf+^zRkexW^{|6k;$|N(?ONK`bN|5j&nv5 z6WK;p8{RH6|CCKrlgg4Py)yQKm!NnHFHJRbZkI%M8yUv9Tvh$l%aD zhCk*mRy(q|MsdJql5QG*ZynFxWW7&VWt3+w?1&mIP>3kWMz7;3gv&d3B2ZTxhy5B4@a_m{Fp8%$W1E>AEkl=XD%c{N0QP*IGnZSRuOIO3*`=M^9Nr z&KlcwkF|kxDh4#zmvbHf;4ua~55V8;5;`+b29aYdCqa&mmNfW+lkS4PAT0MDs!F>x$a*=0KOB7 z(WfEUrwbK1$3rGIgaJG^9CJ3ob0d514993|*rO-HMb0Mx{*!?nk(hIJ#C5Naz;io1 z+u(VXJ@3PFvg^8M;4p_Sa$|HYESKKymN@SL_z?rY0`O$mox3b*(WaYbNtwGJF!ZTL%vu5+nS24Gx5xlC|j*@tg7b`H2Z!nGnkF1i^It@Oy<4M+2X}&VJQiDh$QRJWi5*j9hq5x{+xB7EF}|u{JiyR z-ZCq1<(DZ>6cKslrxwRTi@!SL#c?K*zYNX*I1;ZPB}(4 zt;nRq^b7kli}&rXKPBUACQ_H3*V&RuNrt>7xKBZ^hSh?#o1Y_B7`7^9BS9kNgSHsw^{p)6ipoqDz=D}vy%_?U7PPjkSO%-CG9ZgNShWElWRwDd z4e9D&PEVt3lIZEP>#i5EK*umYh#$PU>?I0S!qlb-Du zZoi?!hL0Gz!>InF$BZ2}e!`AB?L2XpN$JT`rp~CFw(D-S0|pKnJY@Gh_EftRX5{{> zIsHX2A&wO!66wI_A~@&pU#I%7DPxQ|U9FvPHkXnWjDZO#=3j>F2CzLN-_ir`4)`C8 zV&_4vYfkVH1TGpajTw21PR*0K2+ME) z?tY9<1XNxh;5WI6VX z0h?SXa3E9QOgS?3hC*Pc2q)ocBPhM9Ic^!GmSOi9={1Jhkx4TbsX6^OQd=XkJ0%>0 zO%%1Ili}gdArwp6{Ak-RU$#&%5g%~(;uQ|d85SwXsa6#UVy6~{B8H|^W3a%Rska$E zdnB&G@p+A9=(`gPwMfk4%njy&l)b?m5XUOX7{_9BTWKxpxGn(P<{+Tp1_QPC)f2UQwE>Ai6{;;3wGVfx zk-o2>>Mk_>s*~kDlZW0bS5P1iLNyYXZ7LQECR<-&fGTB?5txr6#HdAbwiKE`NrTA; z;i$9{-axs7X-%RiYPW}z^wO6YXmJGUHuNYV1ptPC0${YJou@a_+RZ*oO|#6p|P6eejPNH!|4jVc%8qrmTYnsrr=;-QtlyOLgL6ItS&&n zCMv#Z;H@3G4}rZfC@P;hK-?M z?KlGh?8~fMtYSiU641Mt!R~DC*f1)XEcv?Of@9n@D5mLVz_Kq_UZ`QRp7Y}<|@z^IUoreF?!%~(9<|l zfuqg&tbTJPw~A|OgnUc z7(w?i4C1Z`T}uYU)C0?>k9)4LqLn3B?hDfgQa)>JcZ2X1Y{bs zm23MYu-x6y#6TZUyKu0jsI|DcflB`B8{)5Kc95&~qN8=c$C}949*4YQ(;4;7G2QMU zh8wR;yU_a2lQ!Ha4WfmIM+)e!G`x zO@7ZQdCSLZ-i4f?Og8k?M9F}e#?g>>Q8p0#L)!kve1Hqf22Jyj$dhHETsenhMzhn* z^n+k_dIJV>*T6i>$t+Wqg&Ft(=x>ncB}^C#8&0My?^5<99Tyt6s2>y##jgeYGKQzr zJo!p9eR;t$;uw80%&Wh3HkM_G%_FH2IcpNUXp&H0%bk{|F(vmd=Y)ZVLn1R>aQJ&y zAX`R>@7DuQVvrP0nrh9nj1)^PLj;Gl-_fT9b;qNHp0RPx>tlsvbXPQ?^0c zBIN&j6hD?rF~|Q`6f@3GQjEG~bppsU^N;5wC>#jRnGcW(l|I))D3`SW0g*%aCQYxF za>iRuRRWlhOxz4Nw5a&8w~u7%xw<^k7_Qu8(1m7%v~wX|mIGoUmrI~%EXarFY^tjf zVc9;GPRmE=%nMm)Wb?^GkhG;FoL_c4$`hY1cqri^RF=eL8SAnTe#)83>H>>1&Tu`K z0*Q>D?NpB zC^D#Kk=z3!6hvf085_Nbf2Nt{c?}AKUib=W|0bUjpKqqU{AJOGoK6n7`HP1jAZmGl z&JP**ivgSnsl*Bw^XFw!s|sKdkCw$m1Xasoa=T^)kIB;R^6Di|bR8wNPHt7^cQIWE z0m{#L3a7K8nwKu_qhvnj2`R2_1JtkCJakqS(mjOAFR$JuEQ+Z{PV?ssz{jp6S?T-a z;Y!-uLFc@)WSy2>t*~VLB+bGAVMR86Ua@qc7_X4_toBk~44`5e&p$aaIE&766yd+W z>SYf;$5q<_ETmbL2<%k3-yeao3QFggb>ts7%aPSQf~h+H@FhG?r^1WWpKDqi+aHMe?9S1 z0f+0dsFx4a&)#_U(eFt-tKd@F&yVVy_ZqzSh3m(#Z?LD9bEbYZdw)Up&>q++ms1kG z39k0@SuIdsb7v2$=n{oh2XPmkJ)HO2JEx#e&=eA`%Ckpwos*pLWbe@%*}Kcs_&`P! zn8^#~pWfqyT~77w9lDOm=S3=}J*rQaX)}h_cEt62_UQgyVyOd$`Au!}TAP+Y?{X>l zldm=a)c|`;VIkEu$ihy0Y#}36pwGy0g^X0ed5pBjcb$Q7(VkFKK)OnSnU||<$#?(l zIB2`5UFdfzeFuA|t|M*dNKW7Sw{vkpPJALIiV@_MkylP$5Au4FJ+TmP{#@Lby-W9k z*!uj*s~~$)ufni=tyVkTvoit|L$x?eF3gZm4(%z0adJ=j?5SPWQCoc;QeB}=$U#kw zi{(I&JgBiu>pGaPLGyZ%y=&LOd^G6wCVP5!9L41}wj>rY-Sc>~BBNZugw29q}=a0kye%uYHq{f6R-`UVtoF|=!jZkGe- z&F^E4fSgYi0wcc4|lc^pv&N{gZrD|(D!gBn+_cf zEt(7AHd|r374AjLq0cPWIo^)C8?aQTbL}`?YeUV(4ndJ7OmE};N4&2Ogz1`qLtEiq zh5I5N>UhaI{%+{bx49Cbf{LJfTpj?=n`Ll;J> z=vqAQ#q;qw~&|hMFZ*lqJhENifnoq?=QlAP&AmnE-I%ZihIyW#r^5>;(l~{aSc6KTt+Vx z52H_u2hvg9%IKVKHS~D55_+{;clw}PDSZidV#&bZ6(u&^hUe3GzJ=#EB_TSl`#?Iq zJ80-$PFHsCL3eaVdT>XS_N7zdt}HE~J4?IML#3tkXSlz>y$APwX)T>xR!bL`^`*^l zca)XWePuo9&9WN$x~zoOmv^Vr%S-8ExSPvs>49>Go`-v4aXzbat<4&Xv8Q?zO!DytP-H9_&>X z{H#|fcxi8&{?xme9_>BNd8v2QeXTbT{?s24lSWM`Mb))!5y9*x18-+St>4&X{R#GiI4@ z8?((%jXLuSV^{NQWBPxj;u!|`1|9)_uHM;*5#z^=P4eHItkuz%WhtvKInAh=Y4fAL zs+rb2%Uq2bTrGe228u(nT4h!|Rtdv^FduQK?EuV0w>TXYD0nN^9%qXqSn$Q=(;LQ+?f(*`g7%JJf1Km&nB! z%9)9dkf`Y->V7%9em27z+SKLDQjVsPEqSp;-zPR@ul;B5GYiw9#fw|!=@e&8-mQLV z)BKSwbDK%@+VV<;$*Er|(H-;Bd(RwEk2rNx_Q|0_f%o2LuNgCU%>lbQLm^jmc8YWX zgj=$h(V6DLbJT!@qO7_U&jCf>DlvQaDSMBrU&cyEoR;FbH(xPLT@s$*8ta7VDuVvp zy!wL{H!NsV`T9XT3C{*an1^1|$ob5}Y+}O1+?<&^H7#puT-u(+ zkUF2&zEV-rBSQ&mN2*5H*x1UdX2R|2&Z#VFXl+uMEv-!p>QMp_?b0q%$|MuZ1ZH_z zENwvx{o=-@3)&Z|JiF%x2uVB*R$z zbJg|vsltK%s)=_isG4lO6lIcU=FMwwU94CU;TYU0v@KOs3yCO6{rsi{jcx674_yk` zRY7rXbJ@O5W%-kYW$G@ID(ZM)V{2}z9#b}D#_Z`3$(-g|%;37EvP(1rn;`X#D^<%E zMrr(pwxuI@MXfqxVU$RT4(6hAw~<$4B8m$eU|3%SO@G#{x|(d^a=Ny>9#3Ri`nM1h z*tW1?gld`6PWGHy-+t&a&93e_1rw%A(G@GDFV|FNW5jdv&&W(nL~Nh^XV;0Iv~&Zx zJdm<86POuFSaPDECUxaylgY|;oIAd3rYd$KSEe&$WJOoRT#K$WytwX^SaFn_k?_(7 z0x)v!ih~r;)0kN$(M$rW=aT?M1}iG-t{mf%>Y7EbRHFF3IZNuimZb;RAJo#i#OJMw zC`zuJwa7(e@{C#hZ7Mn#CAb0r&eHaS6d*3;Mg-0cSW*n+Gkf>hnVwn)Nmo~-hrB`+ z^`0PHl?Ke?-chzW>a*>rG=soxTx6I9pJXh`26EA|fl_MbN%qU&!gQrA=gRs|s?C;J za;VFDn>K~9l^VvUBR21^h67~}FWxqbKe$L!^^BWIZu&}9l(c&dbTb3d8~<(OML=?`xng`Oz8M*6q*?(A8b{sN7S5@#vuwWT*r@GWP&fL z^p$crFk^fPFX3>${De2IG2QP#B=*RykmcTA7{cm(NKb1ZzJS|MwW0T0k3?v5`btA- z-Qm0fSY|rPX>!JVy0V5-kkbxCJkiLHd99Ags8OYQ%9OG8BBjqli5M(L>rkqbbNY0$ zS(O;-7dPav0#{mUR`5AX_8-#uU31(uO#hEqOI0@1QK$?XKr*(~wMI;eVga1a{G~I! zUy&}Ug_0`88X)sg4v=w_BMeMywjAlRMLt6_)aknSyl|8iH@KjzJc0fG7liRR8&|3U z`1BU9A{oHwnw0fAbv`1(cga*m;F)5fA6Egn`ZdeQy~8vDzVu{S#%0GX^PCcD4nl<5 z=6~=&YNSF9@2{DPe6f=RJnQpCDX6im;Dq8BDJt|KrbC;+&S%a`TBkP^;Nx59;3&09 z=uIF$-;Nu9KRh#Lz%(qYXh1@%3>FP|MLhiLbr6t3G(Jj!N{G^^#mB%>0w@`?5`zem z==yO2;**0qus@%!_eq`CF-K83In1-&Q!;87qB~)#b492>$k(f{8tLx}B%qIy7Of?0 zc`q_UxV)CPO?ab}9KkM2l|`w}nx0(zpp<5XXovuk-&oLk24<6Iwkd6JT%3*0gwHp< zhg2RcYOEs!E?cNibpV=Tbg5z5O$ZWpsC){V_r1DuB^85>=MvbD%dWZ8n#(HtEIx`E zP~pL;Ub#}0s>7*%>q1FJ!)A7kf&1J*7X%s_4SIV8?lTO}I0*B#8=0uMr<8^>QK`2!dkJ zV4SN;yM0EHDkA|(&LoRqc1{!rx=8dyooJREonmbg`mx*-WKtB~@maX(J#IH(q+T%tAOaGr|KD|D9`aQ}M)?#YTDs8N*W zXAQP!U()?1wFY#-cq$s)kPt8ZT<7uWmF$osJ*4XCvI8jeW>v%jmc8u{CMv>FOf+PW zd)?dt_ah6RC{!a5p?qh#9&v%>HACd3rGv4s>S*FV7cMd2FzjgHCl`eIhQYV1=U`!q z!ndsFf_TEhm#b^6q#sNL=8=BJd_18J32kznJu6DY~j8i*eZ&As|>RgN+}V= zmEMU-CZ*k|72A+t0lU`t{e+C{1tZ8YTHQUxx{O{LvF|Au7S{REnVcj(DB#JJrYqX4 zwLl@3c_R}yN38*=QiWDV`owHXXdP%dm^7)8gyjw6BLA>TtX6BmSel<|`ZS#;cSXXT zEx5}=Y8YB_xjirGo)=A8dU(+n6^u;huev4-3D8aMFom6hDj&tGz!ar_v@qbnqMDHV zqsg8Q?J?N%2?#+!UKP(%%5x!m05q2{k%n7G<|LHRKvy8jA6n_}*-kaJDbp8V1e7VI zk(p1r300J&)+~1`kg60eC7ms4y&+cLbsMxcXtuDT!Yvt#KBWv1T-=n&r0U5b`aayI zt}O(hN|2W*f2zJ8Q#M0Q^OEF_SJdcn6ot!Vr8vo*sf=TIKte?`lvRrl&#NZ0pqiv9 zyXTc;8!i?N{&0D?GQpt6x9l&{U)>y!P}mL|Vbcl(!>qszGG>X3_dhO?Z_DSA?TAgDn?x=b`jDWpv<`24Yugsby`;OBtnS6q&Au4phj` z8wyTo?nbk@U&e_4mvTq8oI9I6;l>#^4GQ5M4e4^uRn@zYm*rbmZ>V6UJ;wbh6t+P= z`Zcz-&xJv0H*#`yu~Oy&6!+?4aelLTCWtql%V0!i?q$jiQz$ZPQGC0I z3@(Rx6Qdc2j0XP^w;AtBp&J>5ST)n1uYsRhR51hhpsXGXCj+P_Ev1~8=P%5>t2l{h z1Op^+5K^MohkjHjRGQw^jD(_M;P#O8D(wD+vLYWewai8 z8$U>4GsAmAbOIihzepGzW`-mHg(P&ISYx2dBv=+O!fA}RGF!QhW7fr>iwK%|nRgKb znAu`+M2T}{vv}69tud+Tv{W3pZ?i%)Mn+zi ziI%VcV4#(60WhUs7kOta?+@ABE$@%wkxwcm@FMnWGH;eJ-EZH*p7h#|otCGM>|irU zA{e}Alz-l>9M0X3#ZAHXZWDawi6HvrT$@C5zg-eW*OSXRCB0HtKoNzFl+fizJr+?p zIGP`em)7V?QOyDGPEJ@)Pet0$M*OXVGlTvrRQJ28zRxIN@C~}YS@5~9;s+$2bIEp8 zbus=dhgTia15|O3$=#52DJ6N`kSc#P$O)mk&@Px^T#icB1E5)Ay}hD^HxP?db1Ou?2w}P<5v-+{&2rmF)cyuqac~qa!is7&g&0pFu9z` zMO%}bh?%CDS;QM1R*DziVE8c638!xYNcJC~dd_tsY)00*V!sLAob2mcXGF*x)W54^g3uz*=1e8 zorW#}(rzGlgJK4x*u!1ko%U;=`gzl7`D#slo+I4?e)uaJFTKG`e_zlcT&c}X%I*?* zk1+xKH6lmUzMZ(sVn1p^Z?~RecG_&)nwJpx^SC5chNQS?s6yFwsnZi=b>CYWpK@t{ z`zmimMA7rOR^1fBZB}mgS<4!i?!EUO$+{^?9Q5IYvwh(bgp|7{8)q3r?EF6qFYGnp z_}zvJz+t!lUusk5YEc(zPa}HfFIST~1N2|84G*$TL%vK_4rM;V|DR|2Rx@7{T`RH7 z10NqZ-RNv}?lfd~wsw-<24h}IO+y3TGF_-SKpkL6_J|00Uzl#ZZ`*`qZQuDx7-1a{ z0c?%sM*0qH<3p(l>|bxW;6nOD%MCMl#axE|cq}S8YmED!Fda%q8)W|4gHaV6WCBfF zzlQF$Rtqhv02oYmDs`$!Zryizg`a^Mr&x6n;A7a$HSBjKzJ_H`B5TnL3@ zVJ8-U#wW zlD7kSqsSXg-Wc-6k~faL@x=FS>`2~DvMWZ&&iB zlQ)CB-N@UW%w@$bP@`tjaw^eWo(J^>s}=I1i@=tF$lHU=HnyQ8#ezVy86b7+YqodG zz=bIa?CnYR3f5-f(_qCXZzg%O$eT^xFAUQc^c@1QRhsdQ3KGuM{IJmu6=i*6LikL? z+batg7a=3-8ym(~CEngyz<3v*nt1z=w=dZT7vn^jsS^S4>G>sjzanox^7be10K?3f zG_9-TfGOd7wY=;eJ1X4y6FJLub&a&Y;nqL1Q|D#&!nb!i2&c$72|H1BXh!Ugwlq zQ|khcnT}&P#RlzS(t#GW*v?ub;I20?c%2Dd@EeSfa}NLyGT>sU_e&EH`*hdTWrJG3ip(4&^LC}IW`b*PYM9(Z0M423dEc{0Jw(%j|SrO zULZ#6p+kOY(4#wpMf6Cp*m))xaJL14@Mf@^^Lfyq^-g!^A}8Qp;Q)A@e99w8@=E54elz6?Z9p;kM9` z(SFW)%neVEE+hAX=yGy5MqA1KQxrDNABna*ZzJr(=n8VbjUEgw-&i|c6g$MZJr;29 zjRE>pY$ee)K>rat1ghnSI%mWK?s;)!dPUrEZh+@r_B;{)9sM=l&G}p0aK3_DlQ8J| zLas1g@7M8U|l!IIlWuJJ+~V?mv@Uhx4?53dmiit z<@;_)=R*KKW5AEyy3vLbhb}EiK=-`LxvwPPK3sx;XG*#`Z|?lN%Xgql%6riDIGB+@KSCjHOM`GT+i;JU!530&VM&pf`K$NGCws z{OX?L=ubVz)BQas&Bx$m>86T_^fYwLkEyh1L*+QSy>b#gQrVrJtsF-0 zRSu^wD#P?Wb~R4wWz!|NO8(kjQ|QTFA$qabRQjY>9evwt8m;RcrjvW8>5sj4r3ZSC zqgQ%Qryl@2rcatS^a<11cy7e=Iy~>fb1R-t;rSw-@8J0no?qj6L^AE1jPL)>NP-y` zB^|maIfGt?`yja+eVW{zj<1^GT!;g)%d3EJU6n&0SM5RHRqaV9q{h)Hsom(T)J(cO zHH)^UX47-2U(lziz3AK23_7iPZ@Qs+20c=}kMmS@zKkxx>kFj&pv3-q-xwX)Z(rKfFF`l=+mW8` zH-r8GcSipi^by?gwZEjRYG=@cwY$*wiI^ehTr+G+?%`t z$ij|G#l}MOa--=#QXL+4SY<%>)!~!>$`0#@@#DuR zL#%VM`tVP26-AXD)?E9mlrgoMW1W>m{~c=Z8O8Y=efXRUK+H{0cc7W9Rk|IUteE0x zH8Y-$z=USYK}v~^?RM^2x6kxhQ(3DPO2GU%oh%lJllwU;@1`J%s$Eli;}X$nl*mf` zPGBVh`JEn#`Pqpm!7MC(p=)u-d24)F~tr zr=&1WmX&#Gio+o)(EDy^#}zVC`cy``m@oR1ZNQLEH z6eUA&XKh_!QeI^YuNO^yMNXc=<#4R!4r-W}p*1fsM;lY<%PVHCmZyZ~YGVo@=T;SA zx(J-FYcCl20s!tP3fW{ZYl>n`t0W?uF>9DAHBkN%RkaVLtnNz}M04^?6)lc*U}-pG zB3O~BfN~3u06LpB&N3l4J8dL5`^5%VfuxYFV5Yk33YONLt>CP&cB$ZOj+{bPek|@h zd<)8%D$joDz#mQs3H;$@C$>OiH)}&V8zIl0voz}5?>wa0ZRfiJp`ojf5hNf1;&_dmG2pA(cBU2OC@M>? zzKXW5w=LZ5>bs-N()(a(gYwanAKBOMmdIVGM2k{$wxU%_Mvm%Z8o%%Qo%&8m2#!G_ z3rX$bVG{L!>(xVVPOPr^>w-~B`_Wx$?s?cH=SiMRCm7P6ZI!)6(ooRX` zN9PmyYLcL;B-hg5#0RG|%-T^50o6E>U>J^gaG@!~lDNf>s!=W!OpXJZl_t2$`|7UE{17>V%u=NB*KlES z>DTZs^LTH&dFYUWJT$aZ9vZIlIIo)#UahslM0;E5ftc!0%1~y5xw`y2tzE_J+c|A!=wY*e7 z>0qZ=7nxH*I{4@x=RfB_p)Wt{W3w7;3N!cjf06gz@m&4i1NeQ-i)%(k8ZRSzZ%wbH zvb}o_D;Km-pxW`F_8T-|vs#E%$lP zbDnda=Q&>Yo^zh?LHr~5hK6saNYRe=dnl?&mWm{%Dn;^x8~R>|{!t#8nC4}iH-Y*a zIru207W9RY^wxxqm<8Pg6%K{7iZssKnL_Bu7dlB&Y7yOBNt$Ibg_CfoRu#Yl8Ssu& zkON*xvyq&@$Pon-7=+9O#vvI>Pb;LBAxvV(SrlZUCo$*{YW`B;!ej=&`k@)7QxIu@ z9FO6MOoyD6z)h-G$?wzf<(X`qCp){su&1XMm=ylwTnEZs@XZ!}B*Eunzy~y}#rViF z3)}}&%mRfl@G~cX&$N`2#x{DVgvpQewNSCzh0!!)gQY#CTmlj#! zN2%g4(v;Dx3o0KwNVXvbZsfR@Lf-&(Mo41>w3<;WocAaE%#0y*A-VWM+81$^fDKuI zPw8Be^pK`sv;ui+e11t3hH;LTXLUnbV+bI08lJG;pnA0o8IOgalB0#PlKTNB4>YDFxBdiL83QS$k#n33OHVOV9C@Us z+-YbpjbhtEB%b|fSwL;IW>+~wD`_Sto-^g=enjU+iw$fHVc3C*7}=G~W{TX4p;XG4 zz?j;EVZ?DZsUwbNE?|^+4<@;N1ifLjD#W+mgQYPXV+_||KA?6!NE4h(ZMsNXA+#Bz zcHnaGVkS<~&oAmLM%fiQjzv$ZpaKEwF4>c`S`wm?Ib?&x4ouA`n#p^J@R%4o0SoEt zaY4HX0^kt(g+%TbQ38x5(!&T+?}KRs9m&bmB(+-x_Cb>@VpBWV(NY`}-_aDq6|0jY zDi8~(88Cq@tdkku4;kbr>qAr=3f-t`s2)Jqqer z&?i7)CdofGxq*U`jCjzjs$vR~#vuq7k{Yyt0~O-($Qq1nS*Cm~T^_Xxf20B(y-0{z zMD-+83^h`kXVgv^zAKPZ9GL<KsWi9`(G9OWKt+*6rCDYy70RNb+{XC0BAbzr6g*yA-Cjx;qm+!%utFO~ z^6ihIsF2KJ^^hq;TVwDjO=jRSt^ZH|-T>jKk|F0=Yb>Dt!(|&)`XlbkTE7T{Th%?dj$fV*-YTV@AP@a zXtt$tgJeL4Iv%qf24hcXSTyit2XVc)WiI+12Af~19(0%kc(;Y>nm|!bs(vsxrA8-Y zRY#L3gv!*$8;O6LljvW`wqT3LqU=1Vk|Y7jP}~~Bgm6?YW$OX5%SC*n@KQE}*^}Ib zqKT8V0AVCchM{Z3whw$D3#vf4f=VkTTcX)oMz+9vGx_ThH4A@i_@j!GGb~#qX>7{o zLo8{(Wh8A2T@ftN&^B!b1MeVMA=EjwAY-ycQYDK}2*Z90xXYoowtx%i3IVBNQ&fo7 z3>hjirK#YMR49@12YiH)Pbqx2!MbcoJSZa=bZjvtw=%0!zGPm&nMEm@({G2!_bsH| z2z7P<%#KK#n{J(1YGr!v0#hZ4FfwtbY);Tm6BgJvtSaV3BgX(<8+ zC1dKOT?ixLVD6&;b1}q23XNtz6(wY9Ms+_QnVZ2QJv)()FjHbMmeDi(Aw6s<7ywcM zn~X;0;;_M_5dZ*Wo=amx?@>WC=wIw~h^v$4DnK@AmLgCf-oq*m;!9GRNGdwRqz$Vp zc@Gh;!5NXI79wUZfT_aD%Mq>r)V6?To2as1GGe<~qB7XNu^5J-suA0`>Mu~+wAwXb zBhz_l(&a@Ahj-cPLdY(=>}S#Wfr&&K8@Vzex6eX&oynnh(%=gK<{)G#11v|x31LK# z%Kr48l-^0MBoU(q_6D$RrztaJGmJVZ!VQE_a{I}QQPOCb{+R_ev@kVrnHtX0HNX(! zO4Wc+qiX?NX<F~NSgk}Pl*hxtN zNNTx64_ssk8)Ulho`_7U(`0wtxyDLSjoVlz76Qg0?0gm8lFYO%TI?cr$iB3)KhW52qx77{*}mvk^g%L08D0D<$wUQZD)FLM-K! z3j$~z3_-{W87WMlo2MwDew_je0&YL(aF|6&`y}xglB^w#M&w9GV)SJ4kb@ABc(RSD zM_5tOf`mGm49FK^QUXREagSMJK;0bZ7_^C?wl{^XkMBFja15>aG&M9{E66bmi#fu1L_{pq>6kP(UU4Xg3LlyvNF3)qAF@ZX2E9WB|?cQA|s@m=@OKiE97H~DS##s zXdS(FqCa$V$Q=VT+eRHsb~GiR5BnrrIMl2FdxVz-)pY!8eL43eU$)AAPJX9InV8c1)m5$EvsTgQgX9rz z7-9f32q;rj#0%OgRkZb?nf#3=iy%x;L0TyS^22%}qZdK$_rP&HstuzGvAq<&bL$|<+18cbuJ&_J@icv`+D^jRV8KWA4Y(f!ipgyu*X9>X# zAGxA}f(o$-zF%WKAd%3LJaUH8&JDycp%&4Rg<<4DG3oHYfoF6n!yg>i02%DW8IS>` zWQHC9W5QC5h$71afG#$Zg#s}ygh~*nB@wRxadrT^NyMQheI;O29PIqCv2+~523=b4 zH<`&NEM^g)Wj0(mQV6QKUL$<~p(iXc%EKWuXn>O!I^d=lJqcsj1URavE`(kzx=CCJ z+yu8LGI3cX=UENaq0Zr~rL^W*9@qp*p|G#G%slOq{TsL$n*?KH0@#@^G)AzQUoy zh71r6hPFR*2+mBfsS7fN*KeHZWPX`kh)N#qnS8ps0A*R0g1>26fZ2` z5_(jlp5DMT(8L`%z{huh=Vaf}!yx$~yq6Ax@G+O*Q99MaaxQ`VbBdT01NESOFJ{^i z#_$O50}KQyh|F>tJ}49ao`w&}#D4`Ci4-O*<`Lur0#HrAnViCM9-%bbCVW;O|A-l2 z10;M;!jZEX_$vv|7Qw%HgaYJ`1ZTgHdpVy_p!ItJS`84XIzFH;K%4pE?w$?AF-@ZO zQxLJjTt2}kl{VoyUm~|1u$&nMXy}BZE)bUS30{DIL=Zeag@UxEukao>q_a9p!G1@RC^HAT@)p=Wd z(1o5t$X}>PfL$j-kheeQG0sr&$dDaeB?gVHu-kquKMWEj*@ zq=k$!M1r^C@UR*Fp;T7sQ@ON|={I+9XQ>k4Hz3kqvJA!@(!SMnhzt{0Y^~PuGa^}V zB$_%0;||qsol5FCt8+2#u#U9sw3_Uwn)TaEo)O802DrmJwV8u#ggXNKNsE^svQ{oy zlSC`hgKAJBE5;p*RH4OUjEKg#<46T- zk!(}W%emvplc+`x8#SD?)(Hv}%QkojppR>Vlh#@vp9Tk$Q74UwZ12IaUhbd18iyHvtw~xAp815j1CVWF!HbMUm~k zqcYZx#qQGPTtF33mn`C{f$6c>XaI_*0xBB^i(;`AX_I$*Cw(}2OkDwNWgH!VX%Z>U z9U+CSPBls|`jDd&)=?spOJ|JFV$(YVPqairmM&6RTm=}9rB2yON!eaWwdQ636{%B> z_Zh<-sSNIhn4*{?_FQL9d zGC8|rN@9YXR4@ro3C^mLkc*lms zI=aA7>MV67&pvQ&&8Q(#671;O9b@zUtbwglk5;}i45S=mw4Q6wHp5I#p4Pw4piOvj zC6!gq+`?_;&H{c(N_*#!DupVQ#!=pgZe1(nfGjns1a$w#Ey7CCmEraB3YT-(856oHph3Lt9P%YwsfF|E?VvCv5Cr;zW%pu1rtM zOeSnhL&mv^J^Z|D6$b*-Dh|54RUELoRUGiTRU9x|S`wsZ3Dn!I%7F70eR*7>*EcyO zfcvd#0p~8Q;=sF$w7g4W!*s4}IR`nMasWgK9B8TA)av1Ia43{nI2+Wk`i}de_w(xb7BbttKxZx;A zG#!CfX)zS(xQ&1^t`7bJfHw&E z2xWc%@CO0Q!9nT<9#p`C^Tv1a+T(`+IEH|Ho(_Hqfa?gj!&Aba0`L+6@1e|h(6#&v ze<^$}u?xHlVSD*Xcpd=f`9Rlo@G(@!H^7?thFBsFZe-w`+O4<|ejMi#`8Z@K0)Im_ zxH0}0B38g*wb(iZK9;G_6+foHCGt?jC5R|hFu~tLL@kQ=sldl$6}dzL9AAsAS5(5Y z0XU)vDS3)~?24i(c2|*wJyc|4hm?%)%Sv40h7u$`0FOfz;DP9^5*yDTxI{Jqk+}pP zJ4cw|Wf1WUMZATGAA~s`2jApYD?`L)Wj_8MfLa9n1Rz!gnpT0HS+Amm?*-tH3Z$G; z;p5i;xP^d6Dts(f)dJhAYK-No8snE$0S8q`cnCg+UaMNdxwdeWDP(AYzs+i0@jYr> z;(!{eMvadZsaaxo;jco?6t9JZ?3%?e+o&Lxu28|qYbEBr73#}RM=UI5&L!;zoB zUyZso)}(F?j)=I#77a+u(BNZ7H7v1n@OMwc279AngV#Y~BT8Heo`^QKv&448-&HvM z_Gddge5EFrSfdGv+ralwmZl|k4E_ofLA)yu} z{DjEW+9vn`Z7z|c4H0L+chNO%H|#Y;uF?VWbs#cThmRisAO`_w04M>V6anQre5_i> z68i~%Ejkuhg02O=MVCwL(1pakx_s;uL|lf58z|y|E+2mfK#eYl?RQ;ee7T+gPt)TP znR+lF4(KW2=K#0_XY67(_4wEaJp=qNM6Bol*;jW^#|i^t<4D^r36@p}t&wW&9@qP5O`;-;s~s>+rHh1Dcv=K@H0C*b3G@B#n40RY#* z{ZYAr5UYj1Ciq)xD8zQcUyflPyvUGC6dOXO`-XhH27qq}_ya(u5trC+1i*1{estBy z6MqB|fx!Q`4ZLu1G?Y0_;ov|85Zk^49Ab#08us&Sp=SzN^M4B zuWWka-yyOAMJ~7HW68E7@l0FjBwL6$Zp+6n*$VJm@b?KK>ufXoW1d{&RpUr$`Iqi$9A}k!}ht1$Bw#8!q2;KiOVjKaNC8? zuW`Zf&8{$6xkBq1uF7};07b5lddn3i7}v@8cZg^}sV$J2q>8k*xj3t9fODm5b+d6yn%?8-jng89v}|ro9P7)KK9UK z68;t*w+Vu+&)mY&vg7PM0`XM z^?mqwGXU#60odkgiQn{uxzjTQ#KE&Y{tkc|1bp|@!DIWv^4u4)ZRi_@?*ZTd0#5V= ziu#6QkNSq=6%hFrMSkvUiCyyw$L@KB?GCeH;^AJzN`U))RwCRVkaY=Qf04j}fO1K<64 zKha}67e4jzR&(L;0T+BB^B$weDsCz~)^Jgif4D$W3wJv_UgzzA`(0id+&}R^=a%=4 zhnio>-v#$od_=@f{%*Ku@D(v$9zPu(&+#+ho{eY1JrCal_lI~E+~47Q;hv$e5AJ&v zNa7Sw>KTP>xYsG{hx;Fe18`4OJP7xlim3WyiihBS3U+(En~JFVyNam#IHkjIPgFuI zO;I`m_cZePu+mX@&Q;2R`#A#oF`4%#W2% z!2P-MNx0W2pMv`r^!)!z=W)nM5ptHxIFI{}zT+Gn=`2&kzT?QVNpSisb>t?l)%ocV zCq6qJj#Fo6fw2juf_yBs;TTTR^%4u^`_~@d#Gi;r%HVY2h(P#oJ!6(XoV1Fes?dq9 zl(#SV+zEcbs4xDcTOny5Q6b{I&5Aj#zSqPFRY@r z{3GF9SUArb{6kZiNcm@?+|Y^glV3>q9MUR>g(;I-Ml7XVG)J+Ha6rEfw4vB+4^p$r z8pB8xRivxQ_JByRx>X0wr5MZ*RHhIlR2Lp>tp}&C&Zq;kQBnA#wE0oBpk_(7&6NEq zqo-_0m8G=*k+K-Ah7Qfh+MSz;vO)_a&H~U@r5xcPdq5hy8krWXM8yz3>Tx7JNR=3& zNgA85A(~W>L(17K$i-79wcQ^iXb;tx^hbB_w+^3IL2-_Q!H018nFv1;!C9@k0!Dsq<-wPJ5SLc(tFa~& zFZmjyBWA+Fd$5TU;%KP#l^t+G5!o9Dp5o=MEqpo z*gCcXmc~}ZkFeRG{0RvKY%cbYt%QN!db|lDmxDPhwuZySc5{@mY|!1z2Fb$|XU`3v zIxi6X@v)TQF)%11B5100z(N);Fw}oma6HT2(Zjk(z;?!5+dzNdgl+JQ zNZY{a;8bnKyfB;K@bKW!pos8!a|45H0>i_sgQ6mX=FajDwT5id=LL{)p`r7`tjU`- zw1k{;3H+zJ+1c9#IlH?}b@%sobaiqKbaV;~a&YtacL?xznHps8;%pZ%)yW(yLhMqD z^q-5gAf^TRN6woY6v4H`!PQ{cjKBy>B4A$VOzW_qu<*GHE!D#2MfwMX23ZG(h6nhE zMp!Dq>GiWnq-d9L|8}-@baZlb7NARFwk7rdm8P(k!K5l@vgIy=3zEQzCnomKNxAfd znV0n3iLqb6Fu_dzVg8jn-L{^Ty+)3NqXNJy{@l6XbdmJ9DdBvOoKnS3>(DoH#)aT) z%ITw60Yx$q{0oxvsW=t+)}y`Yp+n-ysZ~7Nq7TgE%-%&bd!hpV(_pR*0zZo|XT$U# z85Dt$b1a&5QThUi$4IAaVjNMt*b5+u1yX~M@$g3yCgY)xbSEg|gpZ7qn&inCk)KTx z;zvZzMdurkm>~5EsxcXdsA66q8I<4!N%((om)c%bD=LiCsL)CE6wkyhlIt6#V}&F` z%oH*~tkQ-Om4S!osQCyO6p@sBQbgyhd12Ja2P9UE&%H3p=N`#5MuwnHIqlPHG1*O0 z6u0v2Deh`SQd?auMI7ymlSBjIFLqlh!i-tYN%ZOUT`VSi7~!a=$n34%qcWrg&6)}v zAr~SZhGQ76OfIC!ETtdYVA%0CE3ni=uKGyxezazD;Lix=nHWq+-oZ*h$c;qK_yp*H zDFL+($>w0q1v@_`8(0WIA$ACuV%$e%VBKQOHDGZR|D(4Clof4`#I_(EIm8bUmg!LI z8ndWDi2Q1y0IhMb&axOB>BhNWMXnxVh$9D0VEG?ns7ShMGE@R3dXjk3QwJ&xPHdDy z1mbuCshvZdkQFHztqg_{1T3epj01v<@hy$tD;ht9kqWs1AvZnHHu5xtm<5Fe=A7Dp{}B;4i`^dOb0Lyk90&vI#Ht@*6 zT@eB>ZdZZ;<{JV67>vpgz>fqK2%rO1K`!W-w~(A7DP99*q`(j>xIh<037st?B^G8< zm?4tT3_qCY&usu{i19-PdfdoY&u^${ibX> zE}ec)HeEqF{jqGiqICKT*>ol8^f$8UgmikfY`U^^`WM-B6*3*Vi5aFpq;s%92rwBT zfV0ui0u3^T2JjA0#3BbU<RyHn$0;K)WN}Lwr@{1(QBL$=N}|u$HbDL_w;)+T zzD_8=a_FZ$?Hta4EnH@x!1h2!pzH)>t>WD~8-cAgowpg&UfgvwIC#eFjkw+Hvg#20=ATwc{ItLn} zV4*@QVmj(i(z;Utc1P&d3_8%4Dq%?4-h&GxIIvg%9_rxLMFu%lfGmNd5&;1l04fG- zMA0gx05cv7xzVGxb{uAF$Lz#t93dl`v0%DEt%0_qhwQczWi;d=xs@P?B7zbckVP?d zfEv>RDucF_|4b?yd_EB&Kre$o5X=Fj$Q_Oh5wJgP13y9@ezdn217#`vlo|X`ng5I* z*%hd}5Xn-#0DknOdw~$B$WkGvD_}ijtWfFER;x$(Mgtk&gZdPFnGh$^VL^bG`0x%W zU8xYvb@JiM1iI|NWbP8c6KK=9G6;(RZld8B_yutp;QbJy3&B?awnC;Ta1}s!72vlL z@HK!FL3IILR!Z=-7vM1vqN@SIVt@q%1y@3N17HPY#sXIvge3sOqD5Y%5Z(m1frfj) zDUG)Po{mmygbRIChffMvUkK6F03m!)z^vL)a3zHBZ2?oz6vOb90hA3Wcr$zsgzpVl z0fgv6Fnn{sHn$hU@ZA9m)u!O#I`Huh+Ft@8x|$%o1F$hNIi%sc0B6y#ogRjj0z3gi zbbWyE9>8#P9(kohcpu<08lDQD&K>}~7D9A&1iQF0fW1lkIIz6w1o|BSTS15}1U~}! z0}UVU4Bt8du7nU>2z~-^eisT}B0y?DfFFeDT5AB`#Zfwh4E!A6lZF)BWJKB7nHh`W z7myy;m4f@4g02R@vmrzmf)4}S*PMbsKzIaTbqg_k6yTE*a1Ov@EUEN*2y+4MXhp%L z5FP`#K>|Jw@L_9l`YC{?*if*REry*2xCeyj(gHQGJOo3?!1(}c*^A+G0N2uRDX4lC z0Nel}y6QpA>pZ|6ohW!XsB2vSI0`~^Wr3>JMSyQXh%N!Br@aK&8$xuQgs>7|$^L!? zu%!IF23V3`Zvd7YpKk${98d26E~o4Fb_eYTfM-KUUfnRP3Sdcj_yDk^JX8Y=XF8Er zC4`>8?&H&iVlY&8)0?P#07eaI)cn^ZTC^)Vk z)D3Vhgy=%>UVtn6Q}FBopcn*j8ieRV@MbQwGl+tlP$*1Sl6_T<&cU$>gd{MHi-I$| z$U$lfAsTGf5TZfk2q7{`b%ziQirx^S!R`ei8l;0DM1yYxglLeBh7b*=i4dYmED%C8 z8P0$ZO*-KaqRDR_glN(OvrvMFLZ+2ywgSC03?4yAgJ7>80ta?ZpXWbfo;i1JRPSTY zmsng3cr$5Q%=`;S1Z$+A#GqXbXSwd$pDR{r%(gUC^q%XUI&Mn#xT>-85$yVeY6WF5oJ;cuJJc58qBL(t#t6`1l6xrBPzbdPCWG~ zvgz{Rm5&t%?NK`QVdKeHQ+JkbjQ2cpyWfvQ8`u67b+fk2+UD|7Dd$Q4_ij4W>;h;Jkw2tU6#xa#mGEgs5_1x4sdjE(^ih`7bhgmbfJ0rVsNLUQ%CJ z-}8xaY7eW=lOAYy`89IQsvXwKW>c2zwHhCPcU-ai_?#NeLhH_p8aEO>$U-bh{^Co$Q<5cTcQ`W+c&UdBo96xp(4R^Tn~Z zc3f;c`fAeWradvG=6dB;L1WH^t)93zWbcznqs>>m|KpH-yXKOI>FEt2tA=#@Jcr*L zGx_qMzP+KsW$8=7wY42fJCl zS(LFci?wUMolE_X7ek`YVVl-AI@>3ef0|jeJl;pg@$%Om!$g+x&}{y1?U#qPmuR0p z0c{8iG~{yA#ZC@4-)az9A|YT%Q1`k0)=KNq*7x%h{MzgIbgyf0^dgPkCFxoQfV{{i ztmC!|O}^(BtqD5ZusgP_?8w!i-(J|jt*551{}ExK_N1ors(D#f_#%AC$~99F53I)RcqjnH{OQsV9soO%<~kd`HM) zMfHFr?(mEvXJaQ{IX(C@wr0(t(WV2q(}s-u!AU%ejV#Y~GVi7l-DTJ}eY;oPKCB2*7+wLNRd?S>~>M7l_l zbP?_FCxbBp0qf7Mko4bNoae*7sTPi|K5CM?lpT{-@6>7Uy<;CMLznKbwGB)2Gs}(> z29~zJ5bxx%{9xkKNwzyB+HE%Z-lU^8qhCm5#ou*cBi>%FWVy?m2-CHRLJ>)w0AYE9 zgJ}xrdKdQJ5G9qDhh=z;cO3FH^`%{tS;ma4;Oe)t=N(Xs4pKdxmo)*4R@nV%*;%JP z%S-+|`t?TdS7Gk?v9C)8Js%b34{9@#7pwfk{aXLHlCKBm%-?xxk;NT=@ zFeT~|w?u;p?Osvs=jS-}Pkng3sod+-?mcG?C53EWbCn^R2_!PVoDp5kCwWRM zmANMl{SZ3%4ey(q_xR$Iv!;Z*r_rdElX3?PfaZa88&VL^*Fm;5Op9(TKX-Ukdcc-D z2?WmG(e&KF$jURwXsq(ACq z`BE6cC_8(!{C$phdiRU>C#@}Y5emV3JH$LTE6J^;Ru;#WkIs*8BWM1%7JC`H=VGz&3@gh>TSw;-pn@*)_S^~(q=Ws z3fpnC6q1H(CXBo0=e};W&Apu#D~mrpsI~ZVFrmco!Wy3I`eWBS*9ne9&g#@XU`_Up zl(D~rmCJoC+(xm#PrNwFJhYqdB)7TqmGWG4Dh6&fu?nBKE9K(GjpgPI^_|X}ZP!{- z{mfqT)Ytq%r76embc&AMxyZBAlH`x7ljYz{MqLja5?k+T{c=nPmE+#I*^6px^+Il4 zHIIO$taF><=jbMH2!7~H8DqEe9n9}cYNxJ_I3FuS8Z7TP4ShVp8JT}=uL~Y zM;4y%e(WOd9Pu)-rHovxE}UdOc8G^=f&=cZ1oH}SYS{0yu25!~Oo$L#pbxkVm{ z7dFq|eQ(6vHUZXt?z;V|xpv7vms}LocxEJG^({(&m$#_5!}Tn;v=l#! z3RKtlG}HL@!-&QO8J!n;Ye-g}TG8O5HS@-?llRT+VG%VV?8zy0jJu7CgPe)gUhaB& z*jNt5_6KZUvv=Q9N!Hism5Qr>z2D*5X~~x1nW0Q3S`^=O%ka_5GZSWZeVe8dI5q2C zin4pROzr7UeLiQNt$H;es?Ya|1vBne-&j>R_sEQJZ_dD=$a|e;oUUCIY?*JN(DVEE z+_XNg=o6HVmMd1c1*zRndVqOP2t zaA0g_i_w9+?KTqap~wG7r(wIEMegHxCE0y?9=&y=|CH>qfUYwi&d^?Jz91I6Hm*}f zl&kibb$2Y+4E(&_FiCf-+W|GhzzA2zK?BN9hlCY3Zd+Y4-}``Pu4KE50!rI9n^CSInPti|Crh| zlNH*%{M#yF=_B8bTJuWg9C&Vfd}$}wh5jpxHd`sF{odN6e1B}{Eyw(+mY*7VmmiE7 z-LtpppYz>&oH>}YwC2OxYNd%sXLy+d{0c*y<<4jz3Jv+_P3)l?e3biefPxV zIe+erG)YX}Nq{>ibGhB<;OH)AfEJj`;l+oOEN!l$52vJiOlpc{AF8B&HBRgOdCZwX>72ETJ`7&F!q&Fg1L8wTel?J_YB z=~4c@ZuIE%kAD;L?W)GJy1sq>QT4hYEWL^KG&j~^_o-18v+Ac9Ep1uz_N*jUfY06R z4`V$SlxY>Z85E2W1OhKC<&d{DB2qi4*=f#crIqvJGd9nAa50no#RxQ!*D~_{@5$>r zn)lnnZkq40`kS0b*~9lJcV)55QWA8Yo^5|9tXJ^#qw96gZM=IIo3MF%=C!BZKBe!c zoNMqsc4PSD>T%lm`&CKq%KU;(qb!dYhIbFY`*zK&*tpaj-8Y{?>nKb}bP$HyCe{c~ z?Bgxz;c3usWY7pqSZhVR6-lxHqa^vtP8WsvD(HR5#X6oGg{>rLP z|AvD1?*g+tzAxY`jkT_EOs~&y_j;02v~}2U#6kv=3thzpxJ%-adG3g7?*3 zQ(1l82-_LqAMRX#NDF`L9B@eu+iPZLx^T?rxO?`K9_WH$19d&URlC~#T{r;3CR@U^ z^{(9B-jN)Q0ib|4ccJLDRF<7QoD2W7pRX{b;@jtX=Ew6yS)8Y*>OQZH9;fo?W#Pe5 z*Rd_t2WoeiFD|?2QaM(47;EpMki{k?lYZFV&e!h04Lfn<#?X7s!Grnlx12rOiN=|w z5Vga2YtANwbCx}^R>V5={Q@;7dUumD{=t#6&kRm>+xD9NwgRc-#ZtjD^cAyb`Wf^U zCe^j9?K(T3tyAcyo;WD*%(d(0+EI-Ugjnp^#x5^Y9IvRQ>1uigu1Lk#&Whf%7V8pG ztT{-3XydElk8N+XrQ7DIr-s0@FxP>wYU>T3BenIA;bpml93n{E%NRC}Lqxo3 zMFi*F{#AO9OPVeUC*wsrK@rEf`6eO#uKJBW95MJ!5-Z7IBge1&$@j+L_D6!Ojkf5Y zn6{tq{WUCpp~qgAuw5n-t80wa7$R6Rd@~)nI}RivB0f0El?D0uCp*DwE5<7wdgp^W zK?YZdffuvnUFOC}qEs}C-K<&Yv$#Ox@In0Xri!6qlO}Bb{DHj+SIeE~)-uMSi%ksA z<)PcHXM3J9_(QWSh0MxZDya>7zd&WebZ2^B)K+h}$d&9e=YLBLemc?W;FtZww)nQh znVnC3-S2*s#cN#C-}-j>Nu@)ZXFfA8+3>4doglXk{2M+cTCp|iBW$B02RiWna=zAN1jJ`Pj80G0m|m9J&-H^-FR%*k zQV=>PU2$0E?T22+I!;ht7-9TPqDMA1FQ`&(mt`~Ecb*!KjhaPeV&vEU#}auAgOP+TN_o+q7Nj(xNdSg z&RwqX9quNN-n^5{JTStwI3v9DnW09T^s)l$#*J_-y3=dlr}$t!g1FM__Ka-{*t2(F zH_q)^Wm@)Vuxqr%@s%OtwcmWn``O7;`zZGG^in+=PH-`&ZdZrsZqi0J*$owy>J4bY|) ziGw_JMPedZ9pwG5E*5L9!`YSHq9ZzdGyiT|ueBvGORs3=52e97XMH*1Z^C-+v$Xbu zUfwUYQR9NInC`#5%?fK6$ zh=ZftPOR(+dpTx3M;t)ZM?T#Bb=gc|Pt}Y;PJ;xQ&$&B>Bc*^=*T3Wn3!64Ix+2uk zYS~&vqjO^nx;u6kRNv_n+pIBpX;ShL?DvhAHxIASJZIqk?cBV{UxEtUyR30(XsC&p z^LG@OEQTm#>2aL-QSVloUAVZK_|g!ZUE(q)Jet*@K2oMTG^-=4Y*)`PEIXEV!@)kPjX4NyK;r}tj;&BXmN0szV?A@VzY{0j~ zcRsgGCL3MyTcn*ZLo>JNu<@7yW-hE-&)n2H?y_H(+&B?`*C+f#v{&H=-F_)=#|F3z zb<*%(@WOCx>sKt*M{P>yEijqbvTU&b3Z}ZQ^UHCs@8;iYox>9le*s#4>Iji;3?RuAN`#ayuZg=M1 zSnqK^O?ugPUzquW*XZ7LUEYi2SDS{dot^u#*5*^!{87<|(_&t~N@=)#;dcBnfe$Bm zx^J_wR>w0*@5_#>uuqN%|HXDzeUZC7cww>T*Oy)wV%ybAEY9>Y{UzCb>y)NVtCO|I zb1jy9IdTFAPq0@pqL|I>hmg_(5)*l29im%bF`}sd&9D(w@-H4(*p#o6gOUbZI@0af zDz!Or2C9D*6W-v(gG~?L&2RjIC#+QA$+fIihs+Wq%J@I&78Yi(x2X8@?wSdMw$JOn zxc|&$kNVhrt9udL-~V^&qr;}f2Qs!DpS#>P^x>jW2Zs$mYQI?1cQR|D_mtAa7bgbH zRGu<*Uci*T9V-TYThM7pZkOiqPVcsH%Daw>U#$@{!jE(G(3FKkea|i2nvMA%yL)Kn zyE@B@*(;1csfWyWIde7pyxuz2n1jQ76HAlaMhxrna?mi3`?~rrv6rWwWk+1+w@nc1 z^}$E`+SNJY7ba&d>9LDvyCQb#ZP%xn8t^JT?j}YQau_l92KM~B*-*sCe|X^1s!{)t z<^SCz7JF9S{;?Z-7cAG^YTuyV`|aVh%xze^hhXjSEP4bHJ3A>JZ9Oji>|{4eyr$Tvc-PL!?m@$ z?H2jAT#=GWY#<);O?9TsQj=sR%jipT23{bb!9tkvt= z^*#SaZZ&m>zxuX4@a>5W`=4)ECUiS(_hit!NA7N&H&mRQ(7Yfia0%F+3a{L0dw4m! z%KgFm6^fLRU5|zr>UxBZMf#Xu-BcY9dCyeyhl3}&Ez>jtGuHo$>;Fs~SnPV$XhVbV zTPn=w=;YNsvYimJt>xz0FW+v@+<#}_cHJX!Er-sp|2@{xvg$~%-@aMq1OMudi)v|i zaHQ&xD)+M`%FCKtmYI*5y9kV7J2~b1nTKi@mZ|i3JWpxUz581x?^oJeuU7ngvBmlG z@7#yi7vA4=`?1EJ@xgzzQjbpI#A|(XA9!)k$>QNpOYgJaAI(~^ zy!xE&hoSvJ9KgyWOSFPBzvl0^ezW5%r*By}-nHK;&yh}9hLurU=hZtDZ+5O2*$2BZ zVk!Tju}Y5?x9fuhr*97l-&yt)&zX_3rJs7wg$}!K^^8nZb3FHfbCXqTWS~EG+L4c) zdMEt)IL7-? zw%bbqW^6KR=qdFurL99YUWr#Vne%){=v938^dT>&#a+GKb&XpxTi+=D<-Ofk#r^j8 z=a5(JJ3P-zQqM-DoqQ+{*Wow6J)Lks^xOAah|8XQxwztcO|JFq)iu*E9iOq=xBnZ9 zw|=KoIluTiDK)9D-TsE_H;(siuJQKmYRPVFSiEHP5TfGlYQy&<`_F4!TXFs-?~L&2gQqxds*{Z3CaDDO!jzARci*+Ds7Q7>EwW^Sa z;@I2w&&{{+CwMH~>7HM@b@A5OgZ5Y7Ah3zg`YTT{2qYLzNmzGLgO zi{gV*PGgN<*PPt{VM?9(+RA~WQ?T$XpETmls}b`X4t)SZ zZ@`ZVrHqxeE+?KfWIFI0uY6B^e7r-N%Ldo)#RFd*RGB}%%E|FW<0MCOhbq-fuM%V3 zkE)F^x_>+*8s%oHCSOhtF5YzR4E(4mecA@8?s6yd2FNZ=D!Go&`C|LUSTrgwR6d>1 zK1QNR@gtk%p>DQd$btpe^QMJqPW$L7m}5F@RST<17YxwWnH8MpoHkBN)wNu*_TDz^ za=?`kmYd@7yj%Kax5g!G3^}smuUXWt*w;7STvXTb^o$P()2e&^RcFdmgKoV#)-9^_ zTsm#FK-?HMeE8b@-9cu?l`~^u4|4dqEbe^BTj?{x`dS==`|#kSQDI$TB%^ey|?#3-#_2tXDlVg7dZhorfaHMzp53Umj zzaCcM*>_b%Lcc1Vc-C;m_p{s%n7r^E=dREi)uGI>hS!9T!rtSpVe*5ZTIQR33pq&dWR*-d+NGeUU9|n;9Bj`8)v8d z-ej{xY3qZ(<7dzM_3pSXy z0_DM(JilPa!CpCar_#G0+4*>q)tm#H0{oWx`uzGm%P_jwQBtNsx_gA1t?Zg+|EB3> z`+mkFt$`h{W$8nfE4%P;QFp)Uy!*w1MuG63>0=osL{19{o*y=C{;#O_^H0x6)tNT! zeZsV`glX48c86@%TX1%Fi06pZ!%ZXj(GL@T=v}QnCCq;-)Trp>G5cqA=@7HDp{q9Z zc;iF-t>$c7+UHomhwc~kD~6_Rv>B(GGi#D2?+iBN&IHxR&13iYDb%^S7HdBt7S{VK z-;%lx4`_G)>C5C^jfrbks}62~kC|^U_?pT5@-YJ1`0~~}ac|K}A%Sg3-|)5jOd=`od5x*KCe;p9}LWtvnQmoV|T2{*M5g6a3|d z!+t=9?#~hL%iqTcR=P${PPEn^LG;zeA}^W6M7fOPY%P8ti=BVI?cJ!oO3CXzb2~0v zzxUa`sHD!B3x_uSm@_T^l85`0&ZCw`cwE5r7UOY~cD#NX@?33lk7ZUZ=NI+LKizzJ z!m>xpOkVsn8#i@Wq>_mi_GXTwj2;bf1 z`Wp+oqY3e$-)M_NhhxMKZ0iXdUg-2rI_3Xtda8C`PaaZB71meDXPKiNrC=t*va}Dd z4v5}WAe$U8RlqEr2MF@S>+kpsN9$`b5dWVpG%=uye`uY9wP1Zgz&2R5$D{I3$LZ(z#F3{rFV&p5 zHp?q!qI-dppNYcOghaN)DhZbFw3O&jfQcgj8) zvtFjnEU!rUP=yyRGIT$dyUpiu(?4~<2>eY&$DvOW|nmL9$%0l`EcV;(#(}t{Z?5CvTL>utD3VbvOamJRIsLYI%N(@$zE3TmBxI!ZCCt)zoUnf zmz(RJp%0Z$4bXX2q+uO*Z)$zthF|^Txgp>V>-9XJ*z#L%E{$6BTfOLOVbOBGepgQn zbRS&sd(EYphE-Los!cB#gtK4$(F~c4E$(&feEHdchfj|4c8naottn!;)mUCyKsT=z zH_tmC8kXE!Iqup1&KCIae6?prARH_#d4%@7@{zG#H2$W_@ad#V&G}`dg5_OvGYj(KQ8Tffy0{{^>#H7Xz!q z^60NBkD64C2Ip`?Lnf|X=|0{l^vV&dIt%3^=Wo3DDafr!<(F<*78?HXw!iQ6m+C`a zZ@rzQ{`4e#6kfWfz313NfAp96uFM@=6TjT`#f^$*DHg%o$8FdV5H@u9{udGY>WfkX z+`624f?qVzZKqZ^u}AQMov-}w*DIPBHkZuSfBQqN|Cl*LS0|kNzHiKzwFXsJzf=dg zbO|+2EiCGv`~0!;`#eEu&MMA<@O6_ji$+CG?BS(vXSJ!{)4aDUs|wzBnK`ygucVL{ zH**UH+iqU8^ws_y0TV;Uu5q1$aXg&b{BLww^YgKVi_H=wi!qT$DmSuvpU;F3cjbw!M2;G&_o~gVhfj z_^q}mP*ovnLd~uAj1J7-iyLynK1M(h;mL3CJw={nliZI5<&Zm+F?T@-lITdjxcFNo zjgbt*k%nccVW?x(ejL@|iEA}v78ZZU2ore-%Ck853Yq`2Jr3xb$0SK3@(+*<%2ZAn z#HmOIeSlcEZ>+9-T`_v#Me;LxOuc*}-=DJ>Y zJyE|jK52g_93}V*BjzY64jAqe6lgnOkeBT+|Cymd3u(1gBS(?xpR;o-B`X^x#i8Mm zf{1xDNN03{Y2kC>v@$q+1rkQg3yO%G5k3ofsS_Y)d9xw_qLi}?K+NMBz(`%h2j=yK z)Y!)`0fT&Ndj2VPTcn4 z*JZ5pnC&aK^l@sZIqabI`PwbTPl6|nx$rPY`(y8rVF8=g_Oq`U_v?JY^UK=7H~TN@ zu>P`JV}Ieav~7Xf&jJm^ZH(PeHr(7}*OVquS5N+e<>e(9J;i8}xqo^Z~ z=B!z=M9=?gs(zfY=K_O~H!6>a>ysp)tO*Gm!%#+l{xZA1(z-P%(=w-a|*->n5D(e+y4 z7rWjlOrIKk@N`y!Pp;$D(A=-dO12ZceOxC$(mI_SA98+t{+h|&W|szF?Dq?LXZ|+d zktETs?XF!LW{&^xjlKQK;Y+YL|JydBCO8V}^ z;_}{|s917~bwi?l8Nv!%v9_q9@clDHt8!zx3MLU4!4~4DLMZ@8@=fOUE4a`!%<4Zn*Ka{9QwDA2xO# zv@5k_&(8<*wb-|%a4G$ha!d*HEYecxjCR= z+5rV`yGb>-{=PC%g?U--PX{rgO-1%8$}DeG_60a_npwm_qr{2 z#x@!J=B#yJwC9xnzF*0mRhMt`_REG>vT<#9q+IRiCs3fZg`Z4Atr+ni(j%u?`CqYn zGBm4sT6RQFVt(GmO*L0?YzK4=c^AuSuD0av`B2m2(%q`O2t&=|-GclFKO0S6y>)8nawqqzVapa9zUtRk7(JulbcK7VDc0%Ghr01yZ(NXRUk)So$FqnS z(rgbcie~g0^I%ecflI-#yjMM*XKJH1)tWVxwLA9hgpFyh zH-ul(+1!Q|w`$75dUwyy%y!oNQM2&bG(FYal`RMAH`dKNuryxvhb=Td40%y{?|KPR0E-UqkC}=_s$-j>U&OHW@ElU^)r+Z26=yXZgni*P|93 zJREZU!AP%rGi=tsl0(Pd(@E|2SbN)C{~SN2I)1~b@qMpu(!hlK6WbIBM+bQ(U}^p@pm7#)6)ZJykz!<>Zv7#s#v>$CXs@@qZU zwpZ>kS3&6xFDJd|LgxBm$4wJ7Hw1k-yP;8S_1@Tl!@HH$aQ9z-VR*;PgbCNU|3B=# zd3+Q_8b4e;)5lC|l5|dPn1sV{&y~r706uePE zP*m_nMZpur0}pmV*ZWxULR409y;%KypX%=E?wJm{@B4Y*fA)uFs_Utzo~q}mr|zn! z9yqpq=YeO9edsSAXm9`h)-ekTZrT6yX|JBOrq*}mThA}v`=Rr$`f>7MMFaXb?wt9` zLBHI5>)!Jodh&o%7EE0J$zT6<tqB*l)9uV%jW7s|mx~F{6UVTD* z&8c7Ze)pPtMnAk<{rc{gI;y`LG4J~BRmGpbc1*7!r~UlWgb}NLdHR<={T9!vJNEU> zcZ^Lh2)sCSmC`(Ii+a?u(!2jY=Y%cEuDOdQp7^IhFYL46>j!TRy!i8k#ew4wf9k%= zhs}BX#2b$vUe!bX_aNx^FO&E}aXFS+xN)X}-to>2Yv20p>5C57`te=y=XYzHBA48M z|MPz@c&%Z{3+?g1sed{AdUpNBnd9$zY1xR6mv?_$HSd?PqtD)WZq*%Ak2`+vgTFZ= zvOIdx)O{}aXYAC2Ru4YxnZ=vlxn#c|%Jth4=@+(N)3AQ@7bl%?+t9t2<&F8*^A}zB z+yirqdaWG!^|KFu^5p8nPv5=xh5rWk?ZEyst{FG^p_3o^=$)$IqYd5V-wmF3*S1Gr zAM-}z2^Fz1OAed0=-e-EYJcF3@+a5qGwsV=n}e7Bvd^G1{<(SUC6oU)^UsSO{!86i zvnNj+H|yk?7gbjV*FXGyq`r8X5$KJN{SoMsT1{Uu9df79+gUS9@4TYN3Q+B7V`j;s|1S#iR~Y#=4=cV4@lA)!JNk^PCr{e3fAZFmFa0=JzPf4LzYk*Pe*NYL z2R$|Pm^DqOB`@e*aPuE}<adW5LT)iqAN|*TYXfqHcQX)}J3acm9y$pPBvc4foEu z1QU<_&VJ;m&M9y0zv9|EPG9-j;=LQcTmE(3Kikv?`rR??svj3tzj@*@lU}{@+q(;I ze(s8zmiencSa(FE&qL*jCyJtFOYZW&{Mj3eD&{}-RmCa)81VI*@11w+UXj*Uewe-P zqSYT<^WZ@C{r$0D;r}-j-r|{iXpZ$2_4L6;fIQ)bg zC%w`XT=~t_7kpc`>ar`|S^sGI@Wlm-Vo%>SYEYkfed?~2C(NpSe(_}=^2fiP&ObQy zgo7@KAJ+Bk`kLg;yZ(Lpl0QEB@`tB1R~)nX_Vdr$IAY>B-+Qr-Dr$EwMHXD?clh5s zrDCHp@|bnIg0-)v2jfKN)e;|i%;7QjOxOEz+_GyVu8tp#`yp7@SZR20?jD{yO;3tE z_ZuFZ2ZiTh!-Lan@H|eQNhX13439xzlj#uz{$_X#0{<{P27!0TGkG*_QG?oth6i&J zcs?^d)mZ0Fe`R=JMgX2~4G->`G z*#J5GiF4fkYCN*!3{T>bcJ z=jW~0%cC+I>5Ydc+VD)hg%?xt3`j1$SnBAg#^y^lVm#0jVk{^SbMlmoOp4~g0H#eN z!98gtBS%L=Yy}WKXdE5O7eQ8r@qoJ*W3{nK(L%P=kyujqN(}XIQnZLY;Xte@Cd6VA zDcv@jLLM zeZBC|y7XgfkgQdQqOtxgD*4KY5A$7ZLpN$;$HfM?QR4&IUOk}32MN?1GPvS$Tr|vH zccz%A@FYX1u}XpJNhUtHhp_78anT`cn=^^(p=^{>FX-Lw81y}UbaWUl>p9p@?nRlg zHOR({RSC?Tpm_A?=x}zilSs`7&*Xp^8|lVOjiTgAGFoFMmyAyuEp$FpEVW~(SaK3i zf`hRx%vdDS1Ih7GH)1sAnaf&`jI;F)eyG>+5(+T!9yDQQGk}h6QW7s2+k%b7Yls04 z#PKOnj@hiC_$Nhc-82$=d$EQ)L6i1jpE?t(-j`U*Nh}o~zaQJ}kzaJbllF&oTStDA z2Y8VH;`ni}6q!pLo%W1 zgf3Yn6;J%Z8?_ou-tlaWL%HJBfAmI8LL4W+3a_n)alAk3RsPs~KRP-E28JD|H75~j z9yKPk*IXApnYB2AQ*~5(?BLW?S8#1TbvSl#?KD?&k%%-*#ak8Yz8~kjg}&`#7xoeTGC9!n+Z)+;b|T9&8_WiZ7q|d$w)_Z zmYZJU6gI*Ou`Ajl5VJ|t#yX<2-Dy>~dXcD&bw%3*VipOshaJ&&H}lC;JxBntE7~Ct zvq@AZJEEPU!_RPB)8$2?I@uMSBM`GlU=_0?dK&9?Xh0%$x(5j$c16z+h}k4kVB}0# zZML-}QTrz^5-Bk9XMvbS0yF!L=vi!`qur~H{KbO=5WAv(6^QwyBAv5i?HKl)7M<&o zLUpuTVndb3mSDEBQ0g_NvA(N*Oh;48n2xqF_Pj)9IZxB|cA+|^5;E(L$bt@~n?2se z8+cZ*F~=E$xznCv#ByU`hSp;Y8UyFXz}#_9F_1=&!89PwC5YMI9%4`y_7v>FQ}rGQ z(l9wU3z&`elm;q-R}7c{?Q032%Emo#&P^e;hZJZ8of`ww@}5$_P};|etmLh-$9i{9 z5iq9qhyZQrDFO!99uc4{1FTeu>6}rvM;xfj9^=G)J%@{q(}N~7rbn6-2YKIP_#V@w zF}O#Xo=WvQdob=1#Z#;7D4sRN45lv9gCevpS5NIIUS$Tw>*p*pp{QmQjMY67f#UU; z2o2hEqr{+kdq`xwM-0!F%FGrG<2|ByHdS^MFyB)iXiV=x5URO{7|3-`Vt|fOjm@rs zw8GURL5%c0VnD0*5Cd80DU^o&9`vAcdx)_IdNc>{pa+HPi5^V`JnLCTxxDI84EpF% zH|;pyb=MB}uDfP9%@91efJXP6CQTJ`DGx+wTrOg5E@A>|R+5{vM?;=~a`bUxx+W?fl%W`2_{NOI z13$Yp%$mA*#K>;$Trs*(IIgC{5lZtI4|>^+p)1B7=!r><2fggZ(55G5H$CPLV|&m1 zWjBTndNkGPk)D|Dc;qj;Yqsf$c~8&uXzt@d4@%dA#4%vpL;l1>D3@M!cCT*dPt1sX ztjwv8nOTtsCFpK;XITyX%z;4%b70W292hhu2ZqwlfuY25V32wa43f)+CBc0T%!7}l z2OqTamJ`>5kE915N$|nmJr{FG=Ue5gB(1;1D}7AcU*ZSCX_MGFl3%-0!Xtc=jOS(~ zg>RH_UU{davIRbs-Q-iX2YeD==R@c-K85Y@Y1)4PI0rA1vrGI6Uc?D#cl#y&00ABc z;6;Csz2?u;J^}Cx0)7YJYFT9)WL0}rmiSvTfFH>UyHMfUwTi@VQUJJJQP@UBWv?qC z?Nb21B;fY|UZm!0*QpX;sseC_s<6k@0_`OLwh-VQ0B+U_+1;AX9@2`~<61F$7Jskc z?;rSk4}YI%#oCV=4mSl5;lhBTeGriNCjs#P_n^dI58`7jm-u76jA`%T<0IY+FA4G9 z+Ar{&8|uT@rJ>&1O?VydmQY{D?t+$h-e6WwpYuLBt zDRxt@T6S-*TJ6U#67q$CUp2GiAsD zOc^zfDTy>w_8rfZ1K}R_JEq_fCS}S&OlgGMGJz>w6Pa?>!AzMi9m150r9<)9v^0q+ zOQge?vO+qXDXXO;n6gGXk}2z@$xL}#I*KVTN=Gwgt8@%g-jt zADFURIv(_V_`2BlN6_<~0D8U?L65#x`=)>%eXaMM1bV)cLC;qQdcLWk=c@-j`r6@} z270~*(DOBdo*$36U+kX_dj1)p=bs6B{$|kg&jLOFDWKJp8RLflg|P@ z`r0A?1@z>)@E2|Z3M=NU}V-Qua^{hNCzF$=8p^nJ04ZDeJ!_+Fx73t3sAV&hm@ ztzx@aS)<~yKxMspIewp3ufXq%>LUDZRTty;ZS_k0Zc}k&UfH4ImX@+hy#~L#Rfu%H z29aK@p%4~p5d9JjtgX<%#cB;IwMK(Zt=FI|PixSY7d55CBAnDZpZih;2rqAIJgSGi^cbn;A(uY2;Pa` z)xo>)yGDGk58jRMr-S$4_r>77_}wbL-wxh~?`^^R@w+3q2EV(+_wL{W_@1BlAbu~- zdkDXa#rKlDwfJ6<_b`5+&+EmMzvcB|${TronestiKc;+^*Pki>${WCxAMyq=WgZ{I zlnZ#6DVOsKrd-P_nX-%zX3Fh+2vhFmLz(h0N6WQx9x8IM9SfCn8k#yfr4T+FnmRk1 z8b?n%Q&JjQ>RV@=Cq?69B4Z-qsH&x)EW6hD@$N~{1G@@f%7M`+i=2SPHO{`2waQ>x``9o&7h{P znQe{C=M0$L)`~cefDpwv`pDl;uEXgX2N414guKKmHuDpak_>J`3*~5f2M&_T6ha4Q zCQgXWuIp@`-QLn7QqEb=q@_kHxp{BW&Nz|IM zgN{C0RH8a0-qumq+0_9xFe*cSomuhfrqy>g`R9t-S56UH+Ugrk)XutwwpJWJll(%1 zB^DCy*HYf&l(w{=(9Lvr_u6jBQ2cymyg`h2j)8$E)QxJ;Hw^zp4nI#zoZs*?AYa1> z9pm(>ZGnD`hL(f{^%dmmLHz-8@znEk0{t^`cNXYBk~_6fFQGf0cw~ME zx%U+6`;z-ap?)~I?-%MPk=tFUpF-|JT|bN5&4v1fB3#$6CUa(4#xW#mRe`t#&&F48|Gmlf-NPHvt)fLuLKPYSnKKayO$^W02sBu~GR+;MsO zljKeg=%152HK5BOxC@K*0pvykdYoK6Uq6K0aRGfgxtqCumVl!i1-w9COK!M8-$L%x z0$sdG++LuE^WpC<(DxyCVSzrA+@%Hj0&?#u(3gwwkWOzGvxOo3V-X(GcayubNbgNA zcP=f~Q{+z0(#8$ z(vK%s=lU#i!(9I}xe>0PPwrH%Ur+AjLj6{9cNXev$sNb_=LDSVuaetdq<=&%)Aer! zyg*lq;SKBh7;+=JK7rhEx_%P5dXe5G!i)5?$?Xp4R|$WyzM5R7>5m9_k^U^Xx~9J& z!ZrP4awD3)i`>b@x>N$Uo$D3kj??rB%TE^+n`P)%4}$wrl!2a=SHsGr0>j z{UdUhYWmm0U!*Ig@ZY29y~&+gtdAsjA=f97`-G;qliOabFD7>>*VmG}S<^ot_kB$d zVtUGUYI=;^aUp#Yxla`7Cz5*)*V~03dQI;8To-Rz@8tR|-&YUaHqpP1nvyDC%~NvcP89F!JPxQ3+@GQm%+Uf?zwPR!JQ9x zJ={OTeGTpfaJR!<4A+O{m5bq)!(9M(Fx+e5*1)|P?xAp3!aW)8S#W2;{R`Z`z=eS{ z{c^bH!(9pYuW;AGZG-z9+>7A84);2^+u>dV_b0gL!7af`&XsV7!<`E^1^0Tm$H1Kh zw*~HUxPOIv3fvpv-UxRM+^gVjh1&x6W4Ncn-3hlFu8c*Y6>v-8&VxG?ZU@{r+;iZj z;a(2+7`SJ{odq}ZFMUlR4`Ec^)rKiXOB2c?y`qp8HO88;Yd)EdKR01o1NBKiP{>P6 z@FZ8jb2ffQ^J(>6O_Q3=1pXU^TyJcnz4u86{jm=39=D>f(w_mjsiARZUBm3oy2hr4 zjx*Z{{9_^SlL6ECy>n)LM^j^6bL(`7HoZvaIHi8z!5Fa2ZlBZDRCkI8y%Fh{bRDumv!S}CGeGMlo$JEX0)g>3bMth{?K?UzFrYT(=NSS5hHTA&{-$?l zP>(reqL_cM^o2z{--w=}cy$rik-56&uBO>`IxCBae`Mb{TOR8=vmJFKy|###IKU*C zwnhrrRK$zT00`HHzvG5CwVL=}+4Sd3v(dYYGsyy+!M;2LrhLT2ad#wob1}!H$u8tf z={-=)F}KJLsGCk=*;LFipPKB@jZC!ni+OLaAS2@U2yJRGW`BRehK9JyP(OV-=8qt| zu!JLplmG3qTk*IUF@s_CPLpW;eA~M z5Lc*~S+d_}ho9cu+SqnFbkm4`MJeY^4QG%>*0qrwZYZU4KZBS*&6f0?rMyr;o#J0# z%1bdjukUP)*3IZ>o6{aMrme7jRm#iVA>zsKW@7o{QeKHLF>$4d@r<_FO&!oD;)*iW z)!g1fD!rhLBafXui|S%6L^)u*gFlmO2_vscUTRZ0Km7jfbH`y?wrn5Awve zC)+UDTgLlkA+^*uHa2x2bC_qa^f~1uY*&^ngbpg~8_ILC+}6+)6RaWl!Q5aG6ax~1 zU&*EJD(cV5`KYYa4WZEji=l8RdFU0G?rNeo@5)|1#2~IcV?5c5kH|_xNC?`9)f+4{ zWu@?WFO%bTC^gE@D4|UCpWoXnI8%Rb=q=QQ)=nI;jq<(UGt5xh=X+DFK{>eMQAW`Z zw26B6v1jzoQ_-`eclYM~ozV@wacaUfeR$Z!p!J@1>|z=kUgyMG+sD)wqk0Q0SBY)u z!$)V6`IREWlfv$lsX?K-j5@j4^1V`(XRg|A*rHqqo9w{&A=T4ch zTq!T_=T13;&~wUoZ=|a3W4}x}idDH>IbG8~BTci9ordM6Y$aaX zpITUvzKP{*Xg2rfd$~jR(9V3x4-2<|-<7`Bp z%?TCaH`|c+2Ji}Z`c~n%lIX@$!yafo7tyL7A`oAm4asW*`EYj%LIgdvBfkvfg_)H+ z(Skz|mk#3n-N5W-{f@k;88`|2b-&i|{dVdo}O{3K*Z5qVUjb{gl)*R739K`Ll z#7s0&3IzT*h?lyeHa5+mWmx1f%KuAFps^EEAZ;-@6sO!j*)e03Av&)Rv{5YfcYpwF6nh*6UvjEzHt zRyaZ(*?%V|kVcAT^RsIRFMvL^Q&g)KpFLEJ5(P{sekSCqp)?$?n|$OUM;wdstgD4u zJyg_eD@=@a9~mknCt!6Lm_ZuP4i%y|K+{??L#;QQs1378T|RbDv_E^jEMf9o{&M5BYUe%Hj55q7V&csI55E+;wZlrC!I#&TNzx?IqO9 zK*yk|se?w5%l8r$%7k{-)pyY>w7IppiyFsud(kY%UEUyrV%uQ zqe-M-$D9bhHG-D`+SyRwLfe{iTI!6c3zFYCf`<@v`Vr{~=B#k{2+=+W2<59^07gW@asqfmB;(XA44TrN@|w zn`<^(NAXfCth3%&m%;K1xct-+3n9ir3Lzlu=TW>sG=Q|C($LjG4b8=)d1(gL*gOMP zGijX$AxlT|J{}>l>T29|g$0Sxyq8CCB9TJi=FwOfrskJs>zKNt=>YWo(LCRTTFHMg znin}iw5bNnpGWgT3!I65$rw92wIsm1ZVWH6@J?x*ZYOo;7@Gj{fxZ*i>&MuMi9Wyp zzvQ56^8V%+UV2)6OEbnGO>Q2(9K$&+HH5`>A&CAkh8Ik$ZwymRak>Do^T+biY4FdP z9d4V`6>ggz?!cJ{62bLjc@Y|-=}jHsuC}&t=j{3xDuvZ!c|k*cYb&goW}47P#_~Rn z<~Ezsma)9Q7*mED+nPGV6t#0sdwW|)7iMmaSmI58HI@(R0fRD2+ng9VMtDCgNFt7N ztQ4MJ-`s+e5G{W2+fJZVkj3z8y%i@X1Ep0 zpALebMz}6!HbMeu283X~kMNQi(_^!pjEJGqMN!^Qkc;(@!CQfV3g0saPeyrJGnV#d zx7T+yPlGwwwrO;Tga)*)MbU<|ijoc^BXeeB&V!R*|N|rDXJX=<-l8nAxmEieE+f?!< zF}?t@(Q}|wI=dX|^-zMBSRoxwy?eoq(%IG2?uhbkf`?`|cXmR`;Uf<@5Ug(p5et&Z z4=K!lKqM33V(#*4wEP&|3#~_AJEuJiy@C~D#9CR+i>QLuhv_y}7*d%{TCuj8>!Qlj zxfxPDq43XHP&9Fvd^P_`Kwq!s#jS0&a5}?CgK{cJ6Gg|u+%oR$`wDq`NAM9XQGcBTZ@CV4++^@|yLWw#PrlISdG?G)7rC$}*9 zXl`&wct?^Ko59q=Wd?#jC%I9p!p@dXtd2Nh-&lj}3gT#Jh!?PAO{dq?aB5r|+t6~% znLQ0!YR;2{wP&7^Ut{Wq*9`ARZJRWMF74z|Dy4-=M? zXp#<)IQl|OAr6=5xcW}(7zFNUs_(?H7KvRWXDllDaBeAMMhC`sifms@W+k>St~kRI zDkx{-Rcp?$WPtUt!)k)guv8xFZHLuz3bQVtMRc zj9A5!!&s>Uxn?gX3-MGHt8|3c4tHiU5g9=iAgnwmq9fTLhc`Bg^>cXRqn(*dB*wT% zRgZOfag)QrU;-x2U|=PaP)eAR$#`qy3?>;YZ*?T$Bvl=)c6nn-Cxg|n6XPhdYK(jx zVy~{Qb%iGPX8j!r)$D^qjdr@JeVzPP*Y3wg+o8$G{!Zj%^Z+MvGB(bI98bHD6XRXT z)xUEgCl7RHGFfww%bS|u%yY7KqLXq>>)kF^=n;n)UYhs78fevqclCw~15{J3s zRv+&2CXZkhj<_{Pl0B#l<ahp622wT5~$-za5@B!;N2irYrxk$e&#N#$b5F$zLpXmMeZN{ug(6 z;;&SrGU>&t=dz(rf3jO*L!5w`d6G*4u@tUrI7Jkz#mx<;OyUt-;y_oDNhBV{eGV5O zhD#mJY{%oc*@1dtM@it4hYL`R`yMVp64yPPti)?@3&hDwJcX+uPF~`*xDVn4BqF#P z;w;`o6t_gkOpv9oi5M=7xG>_EOVmQ!7ztb>ampi6jTJj1)5El1$<9iz`Yk?!h>jtBK$;j5A726!&7BL~CNWBIBe{ z6URLnCoeS#T$yn;NHx{>y4kNu;tGu`N)2w)xKc^sVvSQ`HMO{1;}lRTf{Qlj%QMWS zqPTN|(Tfd;;o=R(FE${KJ2=j)rxK62)iPDRPNFWtj*?vOmU^n@QMbfWsmHQXseRlH zsEs_~PNg>bq?_B?*i&xiYU3N+wV^igv|Apv)z7#Ksy4aNEz{bXXR}gCJ(oqJ_IZ~) zUB8)|L(Zwz`TT7LC4|g%Nwro%Lw^A6ZcnuV+Q6e#6aNH2J2RxoFK>E_H}SQ*UPh zYTuEZy-_R{dDl%N7Jbjnek}IBJK0$L16SGN#K}KhDiw=Wf9O(}SS-0ME7_WlTwOsd zmijm=mD*3-81cxbZW{6EXA;YE6lFZN-7T?r{Bt+^@x%@{xAE#PTuK*g>4QCuf1xOq|J;fx_198gm)$Pc1X{*Te5d^{_cYqW2AGE>uWV2Z$4spY_ht_m z&jlrNLDjjSWG<*C7lftz>=d!opMA4E8u5TdJz!uUCoVY1fq{h_7Y(5o5`y{hrh zs~Qizs`1dP8V^2dJou>b;3MV1N6Lc_tZ?PVYx0B=D|m;2OqT_eAIgIQR~4+E%?Y7c(SIWFkkHf1Sh$eU?mp_ zUUGq8CKm{9a)Dqc7YKfGfnX>X=*1Cr?KzlHFOFc5+XK^!qo@~0SXlLl?!{5mi=(I) zM|3P9C-cZ=3IHG<(2a`JfT%Z?62``SQ@6V0y#S!)XxtLxYQU9Nd>BUjP ziz6BW_Tq>hTggqxi=%2Uj<9i&8=cH!<IId#q{Ech6lNr zUL4T?AqSI22)RHnj%bXKi|NHt%8Mf!Cgeu<;)n(cxtLxY(NG}=lg0|UKrfDHw2+JG z#Sx7caxuL)q7g$brWZ$EV+MNiA}2Z)yS#uN9AVMR3)6!mEPi=mdT@kAFfU9Gj$-t5 zR5tH1uQ3A_#k?@RIKl%S9yGl;@)|S5qFx+%jTx|D=9Q2aM_yxw7_AKC@a{EchBUjp ztBh#Oz?PAv6o(ZZSSc)!v~nLG=x1!G%*QB8vpyyA4p1&6K{Ck6*e;?5E!y?+#epp0%(Z4_F`40d+ z|2WX|r$Ns@9`yXb13mwNpeMu9-o-L3r!AIYIcFrWsN^iFcQ+o3?7|^>|I}P-- z(?L&z?YtG*nV_fr3G}o-gPwL4=#hcB7s)OYyrcxD3BLg4iO2B{}R1D!YT& z41^^)>;S@&+^zUsoQJ(WWl0`3_+Uv6yL!s%JZ$ADYx1yvr>xJzrk(P19(L-K7xS<^ zr)i}JDgqb$nDj*oJEKDK$3<@wm# zQC8(+Lr1wkAG!#zU!!cw$0m)kB_BI8%3Jx^j!{0$#~zIGdH(zO{U-kd z{Qi`WEf(dR0_>|O7ZqSLMOjpU9TesIf{*dLya0P8%BlivkSO;TU{^$0SAeY$WkUh> zKa@=c*z{1g6kw-Ad8+{18_I_T*wauxFTh5I@=XDDFO;7OzQ*r4h2P-!qQYJHT~zq3 z^uKAw50@-(kodRT7^|s?Cd1;N!^YTV>WV@c8)H*_mg&B!epvBihIv0`8ueoW2pfN@ zu<=Jm{w(u<8LNLFz_UgN~SZ$PowO zRy=OB%rsynzdQPmlaD=8nDK)}k2-PLQrJoBWriGk@X-gQ4}_&Nm@yE>{`{1feYevM zGj3oxV6cYbFcfIS^)jbcWG3f8R*ZyTW(~*D4YO=aC76Ac(zx7M*EZeY#>0@Iol$X< zQW!!cG$W&Qd(4!L1+vjpvad*2Dk)8k7@;e@fK8aHJu?xhIId5HMC zV~@8fxvm38>Wss?0<{>Zbbz~#4l>gZZbXRWhz735iMtg7)8>Hgr3b7G+H&V+sy2kK z6MJ666DiPr;!J4f8lGT@#6WizvqVRrASFx&Z-~K87}xA#qJ%A;acj^JFI_1%$kXjJ zj~jJ)M9IdY>xMmH*}OygwtOfHO|6Ya25dzj93e7dBjcewQ%CA7Tc3m~)#3I@r@;YniCd`C@Df>lBNK(0FBr#Z za=goGsdkXint|79;+V=!caqu~3>Y_ILZ3wY(5DW!{2H5a9S>rJ@lm>9P$#UWO6{mJ zE2(iDhJ5%W>z{@fa8Q&mFe(*(k5L_eoX+3?Pl-^)ko3x_51Y2JeCCv(nKguU1!76*2i|4RUhyBZLR_R9xrx`;1 z2jxp)KV>qcUra&p8-#R`Lx+?Mq)V*$I>iM60_*yvMqD3CmUIO{%wVasQYKFI%S1dm z=_?Jx>a0(oRrq0KHtg3InhA>(1n=u5K_U!A2>Ua-2E75G%GW#T>ur4XPx|^BUxB2L z${nFYlD;9t8|eYG0ICL6xZFsBG6fU}Kop565CbGrJ`s&fS5OR7#uTMOa4N%q zE|P)#sQAE+Ea-s~MDjxtJ>|OsqVe&BSvN?hK_4YSRS!`mi0C0RkJ&YfhRlJXcDd4H}(J}kL361eyu71Gc_sYtXE&{pU(VqYVML?{4N-+&>v%N18%56t7%~ufqn}br9&M>ep8qAMTuebzBBIT> zH@Ae&@wrNf^sUObMyiycfO;Acp2})u7C0h+&rC_|lqJQ{N|Au<t`5zfx4IS*JdEVVDKRDf&iBRE%}c6i^CI6k;1I*(a&94TiM?^klY z!HR3;0lBs$eFLRyXGoOrPgzoX){HMo%B}@Iv+wltfB9V+C%P=7WkIxM4>UsgO-EAJJm^;M}6nA8B$ltg2)l;S&}YFGpI zG81Ylw`vHUDtTDTe4`~63RPtm%Umd;Au?#01w>hingq_S$SU-ooB}tp4}$%zzFcvP zov1%Ut6&X7kb6p6znQXGiKa^@352QHG{rz;Frz)l9&}g@h*8~)0R-BQ41Q1T2US4{ ziGW438!+lGdO5$ooH7E}X!sN}pE5r*(~CJdgXGPg+AKyFZ-!V+-Xv5CaP$8 zS4+Y)KBOXrWitnM=LNocdxs-Sw-{NX^rW<`<6LVu18EFnbTM*I`)2945s(m!QK!&( z5X}ri!{CUzEiq&;`g`4!RBs-HsuMzQ69Us`CZs>o0hv&xq4^+xJ0-+>**P14AobZ2Qx5J5MFhV3b~ZZiPh2Shdc~1!Pr0<9(jO zl*6jgCXQYyDzr0aRs~*7S)j3&%+D~&Qg#uihz3)7r3z89uwu3mD(RMr(h?k3C>+&F z4MUSq0^+3r#Dr|2@}iov(Tt^irwS4heg7KC60v59QxcM-d3ZB{xkoBBh8vr~wgrwh_iHDLx#TASquHW4wUu8xmK53@NSNeLY_tuOA zZNP6WGHO4<=!7sn@SDY!q2kWR3Prz9WA%%KUD4K}q={+cvAu5`C z$yUa2_XYC{ced_O^!tUTP@f9z6LS`$Q5nGu6|>q3QfjN_qB@+0ik+5D#f$*0hiLsJ zh=G>~JIHNgn;P)HSm$kE>}kx89j|-bK;9`#PUK-(#Wa;hFM7z;v_50mPIE7!>JpQa zmaR3h5TfJtW`^5daHh5iEDjAhW*mKC}d6K!wRU z!!(?{Z=q=#NLXGY8#nTPWH1&h-Xy z+o~Ir53nrD*;ef2ab(NS5z!9P`!c;B)B7`h0F%>XnTj$m7S;A>DNY~A^g#?0CcT2` zm9RC=89v;J!kF%nP6;VWE@*lFIWJ2&(o*rfL@m3T;i%h}k zF&KAe@*k}Lm|qfhv=p(jA{DrA-Y`69cpjP#=Lv)-C8pB#IyS_w9^qpr%j(^dpRJb^ z^#izH;~k&>NE+T|46sGMAiL3*r`_h`{4QUJv9-Q@?JamdAkXK%LiH-YUtRC_vrT@5 zedX8LZhwHCCl|40axr^Y4zi7M342E_Wk1Vh>^h}feMIrG|0uoK-D+?3Yt@H`A0)O+ zE5Jh!vi60>`8OH}|3@oSuM0@pssQKr1^`$WC{(uwB=%8Y5c?@m#x4zp*-gO;c1N(1 zZ3vdIe+CD$<#|E2Hg5=fGH)pRAaAgC8Rz^;j>tFhLhT87Hj-yEFI3;qPQ;%`S$ zgq>X+Ws8bOvYYUCFa9vfE2y+U63@Un@bt`z3{1 zH;k8`S4!kd3)N+%61%T7&K@Zp%AP6>s@qC^?BAt9c5YcreF%>}Jzo}JTgqzKMde|3 zO?jpIaJf%?1Meq(T)sD+Puz#i>$NYtu-ATUaj!hK9Dm>R`W?HZ_d)EA-V@oKeGX?I z^eJKI^gUAB)|d0`eUa#{zJ=;}{WP|u-_h)ae#dC<^yB=)ehB!YU!itaf6mwRhv%{W zh3e-18vCaIaoU9gIA2K5)Lb{9kgXc<2kjXEHWA>}0fpMt1M%q4KzLRTEL0yIsA(?& zu!R8c4E&?^6+GXP=a+$n+5>|)UpEMzX9g9juMN_)Z2)X1z^*|j{7*h&MeP>tO@R;zqoRVT^e~)+?PT#voUzAD`^$hD8^_GtZq95YTl>nw z#S<~chBGM8{_@m-=_LZ0y=dQp`ADmr_Q87Cb@qG%D{DvDNAdH`ouWS(yGLTLD4z@v z*_*gxW4GMIbM7x^wxnF!O=8d2wXrG^Dl@lQsr!PZrh0m+;Go|zv0H0pjKTmD_|~2+ z63Oh@iriV_GclwSTYr!Nb~CZzE%xA=I{b45*kg}c?11KsvyA*%h8f*P8^va=6{FEK z+Q>pAx-u(9#+0LYBtyg~$q9ogN3o?>b{Wcd|tVJNPFlBC0^d%x;N%@q=UtzT>_(gY{7kM@MfUV4+Yw`iGN5 z${1E7q%du^3A)B=810o}DS;M;D9~8YAt0u|J<$8aq9+)|Mn!+(7u#3Zu#)hJ-72x= zNQ)%KMnHh(X4ohY2Eby3tYsGppa4q>&e6!cH?|N`^m3GvmQxqbIGOQmG6P zpI90}!n6~ph7~H^fDj8UlwrN6QWG5f+p#5NrgOfODJzIiO4AxCasl4_>pJPicDB561UQ+cC%j zu@dV%M^el%7J))xl~_0EV82h=oyV|9;18?r;=Nijwn~Xws6xeZQCgp6ibuuSIZ;p2 z`?@3DAemd`q|U}Zub4igh=%)E4N6~1r)EJFQ&cla8>DoE{E=CiaBNM|{$$105PHH zAQldYXnL^H0`Z#=W3`qbx(N{qA(re)O^8@IR0s#V!GaFf{J;o7uq%vpi&A%TVK3ki z0Zh3ut4xA+#zvVCJ7Wpz*U&+n5YZ;rsrc?fIXCU?2Yc_>=Lc;7`S$ zhCi0xmlF&hPcUBQUX2l>BCN-tDdgox!fxm>#~el$&N1@~8>hK2%Es9T$6C!-^WnvW zwb+_An$g5!OBt+Nwi?!v#Z=Lvu`iQL$Sk!r_qIj|M!4iFu>j^2li*n2VRESzi>AO9 zl1WuAbF3;@mi6Uw3rI0cOj=6nWx;90VWn#>4*3|CStLB4mbHLHD@Ir%l6zw!?tY=m zN9cJ>?qg9s{GekGKJq|uj7RQk&CyMuaZIP5HT^fCls|DWP3~{4ayddU(H3h&1L$c7 z5}PB;X?0p2=s{N4OO^+DkTr)SayTm%4b6K%VRN45rc2J(q+uUQ`LN|kAYkPN~i?ql55`Wqc;LH9H`_f;m zE|7iNwaCd$GJv<^VblBM5^bYgru_|n^Aw4nuOQ%ZC8Vu_=U(!x!!3(9m4JGl8qi)+ zCB8)k@Ex^W+o_gmXKNB)paF1&#=913oBPN5^Jkxb}*_dxyGs?^qQ_LhYv&YO76DR7n(dyVpnt%Lv6G_(uQKI-+ z6G<_rvX116Q>Jtz*FKNvnlg$RCasD?Xc^1=HZHxKe)y3`94pSP+F+0QotS&lp-IQN zWHD)^2G>cP*6YR8v(QPKCbS~2t`x;afS9{wP8AEE#j$ztQgG}%`YY%cfIiLww>Hgy zP3O~^j6~_UFU%erXFmlRL8!ey9fv}Vd7^bFH^g5deomr2UPqLTN zMJBDa1rn8Y9$W~-3ZQ<=3J^qzfzCP83~oqgX1C$(hck>P*{|2hc|V$K*su8unb))o zA?wqeN0}L^HD@81{E2C51#&`!rlu8~6{fF7V{XpF7(FL_jU4?k9bL{$-Ocrj%vnYZ zX}dAc`xP=od5STEH!$VQK}oT94YZGCb67DcPoF8B=$6yX)WC$6I*e5itOk@>wCKDKuV17?A1p$*pB?PY< zoM0wqav~NlP$1dx{|6!?841my^G20eHAoma#!`hNF~ChuY&iC+)4koQuud@+Pf*gN zIby0$pCRMZ6sVXdh6z3dBuuIL(m$IkFVK=t!D{*!)6e-yPIYm}C6Ud)DHpTkZF!OA z^^{e-RqN<2qKrwJ)g^tjO^W!*=L2&C3ps1Qt1ZCN#EW0R!wm9TMv}HGK**HBd zlnBRbQk9C3%h$P5d{S{r5maz`9CDOuoy`7z&eyq zAe?fe`e1>mNCCi#NU8BPLZs54e#2Y`G6)O_`_peq)+ln2T*{x3BP z!8on*fzjp*Q5mbMKd_t=%$J$vndv)0W|YV~kh8nbMNZ`G>V381>OT=ZoAqn$=w_Bl zts_L#%gcXjH(G>B{_B zP23a+8`}V1j z92Qql#H}H5%n&QmDLUNFoq*54kWI7)$;Q+MqoAm(tOLregja92T z6kP$SE9nU}Pd=+5VxnT2au64Rj3Np_EM{9}Ujqnu2|MkZo%YY7gVvyo?Fi$#PG3=# zjf*(Oz(O((iX#V-d4@OBI3prSHGQ?81mMfiK+6Ppm62+C?kwY;Nxp;|Ay$y1J*74l z=z+{t0+FFglnmH4ua_8^tVH8zTn)*Fr;)rMf=r6Db7;>c;~oWEak~MHDoG?8EP7Cz zeQRTZ@*}PYK+_CqREP?04q#CxNRL`l>a&f3u-T78siug{l(YmKv3`zjMK{m=Qzmn1 zP_E2O((Yac#Y_T}M1y5iY}u^XQ}|dk5y*+()DH9LD%9JQE(2NPl9+M!)rcS9B@id2 zg8zq@%_Wav%x2Rv&q+d;ZCbz%d5{Zbwk53d(s~9`YG$=G1LSCS+po9ZFk%Lso(5Cu_qD+s&Vr5Mqf@Z@|oXm>aZ_` zE<<#kAV{5|&nc&{nbjeDqS+J+iS;&zN-J^?A9tI(w_>0M;X@~JTr{i{iMxr+O{c#} zXL&B23;!EB|2IE5a<(RRqP)W9g|0huk67QGC1Pn{aJQE|kawveGYqwV3TIea%8W*=Qq zK_4|&ObEm!Ftm)~phE>NyO>{U=1a?bQ5Rz11+A~jJakoN6%!diwQdIE za3CBE=OK)`Ja?E94jA``fTxConQtweXMJ08KnL4ycCi1-9VD*TjQVMeC>3fK(3c`T ztBb8Lw#xz6D}%@u$Rb!KCKzRJVm>BK$c~8OBUh#y4-&$tFQzWY3PqdBz$-+89@pFw zmng*m#X#dgUnmvv6*AiYP=yeY$rP~B#EOekG<6aC;utu9uk4x66DD6YffLvJ(6Wja zAG_nC5M99ZT$q9}25rcW(4BU(x!8luNF5*!L(7DU!6yVos)cVbBnBo_Mw$>5)W{T+ zn8As;oH2tVL0O?fP)03NOhJi@t9#%R9DGZ|YY4@d_A;SD=6sYoOd~(Pb>NNc_{JfM zp_rr$V9XqM3${eok>Ot-ZwXRiDJ)dVIHr%mq*-%GQ_ydtm@*g1X_9H=9%n(UMWL** zrnM;K7=52=E`m_`LAd*xlZ#(+b$*9qRxDVg`em$B06SZgb~>=bR4c8l^Q%eVARtsm zt@4el)WkUU=iDU!;~*mBic=gy5rkYtTLd|fgaafIH5@SI3R>A2I$L#gsgxnJ*TXpz zv2ek1GIpSuv2SxTw$MTBzseYBWoPV42Q49~oQ%C?tl)`+gw)VD9c(sEx90ZCH=6`S z;{-w5gMU%WL^C6VCIBtsn$S3)(H19XPKkb zn`yRs$ZJp3GG%UzE6k={ETNlCkg>v;Sy$Wx-e zHehFNw!d$(T{{|MwOEz0) zo63hCHoIYIG#i$`=Z?@X%EY4X96bEih6S{;b8wl1mMPdw!;+n)E;CEt=L+?C2bupW zOQ4mVrI#GEva|GvgLXkz+F9z45 zKMQ1E8PE);c{(-_;Rf3Be;NMtt%Z)8aDoBgJ36Jso+xd$gAU!r