| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659 |
- /*
- * Copyright (C) 2014 Space Monkey, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
- #include <string.h>
- #include <openssl/conf.h>
- #include <openssl/bio.h>
- #include <openssl/crypto.h>
- #include <openssl/engine.h>
- #include <openssl/err.h>
- #include <openssl/evp.h>
- #include <openssl/ssl.h>
- #include "_cgo_export.h"
- /*
- * Functions defined in other .c files
- */
- extern int go_init_locks();
- extern void go_thread_locking_callback(int, int, const char*, int);
- static int go_write_bio_puts(BIO *b, const char *str) {
- return go_write_bio_write(b, (char*)str, (int)strlen(str));
- }
- /*
- ************************************************
- * v1.1.X and later implementation
- ************************************************
- */
- #if OPENSSL_VERSION_NUMBER >= 0x1010000fL
- void X_BIO_set_data(BIO* bio, void* data) {
- BIO_set_data(bio, data);
- }
- void* X_BIO_get_data(BIO* bio) {
- return BIO_get_data(bio);
- }
- EVP_MD_CTX* X_EVP_MD_CTX_new() {
- return EVP_MD_CTX_new();
- }
- void X_EVP_MD_CTX_free(EVP_MD_CTX* ctx) {
- EVP_MD_CTX_free(ctx);
- }
- static int x_bio_create(BIO *b) {
- BIO_set_shutdown(b, 1);
- BIO_set_init(b, 1);
- BIO_set_data(b, NULL);
- BIO_clear_flags(b, ~0);
- return 1;
- }
- static int x_bio_free(BIO *b) {
- return 1;
- }
- static BIO_METHOD *writeBioMethod;
- static BIO_METHOD *readBioMethod;
- BIO_METHOD* BIO_s_readBio() { return readBioMethod; }
- BIO_METHOD* BIO_s_writeBio() { return writeBioMethod; }
- int x_bio_init_methods() {
- writeBioMethod = BIO_meth_new(BIO_TYPE_SOURCE_SINK, "Go Write BIO");
- if (!writeBioMethod) {
- return 1;
- }
- if (1 != BIO_meth_set_write(writeBioMethod,
- (int (*)(BIO *, const char *, int))go_write_bio_write)) {
- return 2;
- }
- if (1 != BIO_meth_set_puts(writeBioMethod, go_write_bio_puts)) {
- return 3;
- }
- if (1 != BIO_meth_set_ctrl(writeBioMethod, go_write_bio_ctrl)) {
- return 4;
- }
- if (1 != BIO_meth_set_create(writeBioMethod, x_bio_create)) {
- return 5;
- }
- if (1 != BIO_meth_set_destroy(writeBioMethod, x_bio_free)) {
- return 6;
- }
- readBioMethod = BIO_meth_new(BIO_TYPE_SOURCE_SINK, "Go Read BIO");
- if (!readBioMethod) {
- return 7;
- }
- if (1 != BIO_meth_set_read(readBioMethod, go_read_bio_read)) {
- return 8;
- }
- if (1 != BIO_meth_set_ctrl(readBioMethod, go_read_bio_ctrl)) {
- return 9;
- }
- if (1 != BIO_meth_set_create(readBioMethod, x_bio_create)) {
- return 10;
- }
- if (1 != BIO_meth_set_destroy(readBioMethod, x_bio_free)) {
- return 11;
- }
- return 0;
- }
- const EVP_MD *X_EVP_dss() {
- return NULL;
- }
- const EVP_MD *X_EVP_dss1() {
- return NULL;
- }
- const EVP_MD *X_EVP_sha() {
- return NULL;
- }
- int X_EVP_CIPHER_CTX_encrypting(const EVP_CIPHER_CTX *ctx) {
- return EVP_CIPHER_CTX_encrypting(ctx);
- }
- int X_X509_add_ref(X509* x509) {
- return X509_up_ref(x509);
- }
- const ASN1_TIME *X_X509_get0_notBefore(const X509 *x) {
- return X509_get0_notBefore(x);
- }
- const ASN1_TIME *X_X509_get0_notAfter(const X509 *x) {
- return X509_get0_notAfter(x);
- }
- HMAC_CTX *X_HMAC_CTX_new(void) {
- return HMAC_CTX_new();
- }
- void X_HMAC_CTX_free(HMAC_CTX *ctx) {
- HMAC_CTX_free(ctx);
- }
- #endif
- /*
- ************************************************
- * v1.0.X implementation
- ************************************************
- */
- #if OPENSSL_VERSION_NUMBER < 0x1010000fL
- static int x_bio_create(BIO *b) {
- b->shutdown = 1;
- b->init = 1;
- b->num = -1;
- b->ptr = NULL;
- b->flags = 0;
- return 1;
- }
- static int x_bio_free(BIO *b) {
- return 1;
- }
- static BIO_METHOD writeBioMethod = {
- BIO_TYPE_SOURCE_SINK,
- "Go Write BIO",
- (int (*)(BIO *, const char *, int))go_write_bio_write,
- NULL,
- go_write_bio_puts,
- NULL,
- go_write_bio_ctrl,
- x_bio_create,
- x_bio_free,
- NULL};
- static BIO_METHOD* BIO_s_writeBio() { return &writeBioMethod; }
- static BIO_METHOD readBioMethod = {
- BIO_TYPE_SOURCE_SINK,
- "Go Read BIO",
- NULL,
- go_read_bio_read,
- NULL,
- NULL,
- go_read_bio_ctrl,
- x_bio_create,
- x_bio_free,
- NULL};
- static BIO_METHOD* BIO_s_readBio() { return &readBioMethod; }
- int x_bio_init_methods() {
- /* statically initialized above */
- return 0;
- }
- void X_BIO_set_data(BIO* bio, void* data) {
- bio->ptr = data;
- }
- void* X_BIO_get_data(BIO* bio) {
- return bio->ptr;
- }
- EVP_MD_CTX* X_EVP_MD_CTX_new() {
- return EVP_MD_CTX_create();
- }
- void X_EVP_MD_CTX_free(EVP_MD_CTX* ctx) {
- EVP_MD_CTX_destroy(ctx);
- }
- int X_X509_add_ref(X509* x509) {
- CRYPTO_add(&x509->references, 1, CRYPTO_LOCK_X509);
- return 1;
- }
- const ASN1_TIME *X_X509_get0_notBefore(const X509 *x) {
- return x->cert_info->validity->notBefore;
- }
- const ASN1_TIME *X_X509_get0_notAfter(const X509 *x) {
- return x->cert_info->validity->notAfter;
- }
- const EVP_MD *X_EVP_dss() {
- return EVP_dss();
- }
- const EVP_MD *X_EVP_dss1() {
- return EVP_dss1();
- }
- const EVP_MD *X_EVP_sha() {
- return EVP_sha();
- }
- int X_EVP_CIPHER_CTX_encrypting(const EVP_CIPHER_CTX *ctx) {
- return ctx->encrypt;
- }
- HMAC_CTX *X_HMAC_CTX_new(void) {
- /* v1.1.0 uses a OPENSSL_zalloc to allocate the memory which does not exist
- * in previous versions. malloc+memset to get the same behavior */
- HMAC_CTX *ctx = (HMAC_CTX *)OPENSSL_malloc(sizeof(HMAC_CTX));
- if (ctx) {
- memset(ctx, 0, sizeof(HMAC_CTX));
- HMAC_CTX_init(ctx);
- }
- return ctx;
- }
- void X_HMAC_CTX_free(HMAC_CTX *ctx) {
- if (ctx) {
- HMAC_CTX_cleanup(ctx);
- OPENSSL_free(ctx);
- }
- }
- #endif
- /*
- ************************************************
- * common implementation
- ************************************************
- */
- int X_shim_init() {
- int rc = 0;
- OPENSSL_config(NULL);
- ENGINE_load_builtin_engines();
- SSL_load_error_strings();
- SSL_library_init();
- OpenSSL_add_all_algorithms();
- //
- // Set up OPENSSL thread safety callbacks. We only set the locking
- // callback because the default id callback implementation is good
- // enough for us.
- rc = go_init_locks();
- if (rc != 0) {
- return rc;
- }
- CRYPTO_set_locking_callback(go_thread_locking_callback);
- rc = x_bio_init_methods();
- if (rc != 0) {
- return rc;
- }
- return 0;
- }
- void X_OPENSSL_free(void *ref) {
- OPENSSL_free(ref);
- }
- long X_SSL_set_options(SSL* ssl, long options) {
- return SSL_set_options(ssl, options);
- }
- long X_SSL_get_options(SSL* ssl) {
- return SSL_get_options(ssl);
- }
- long X_SSL_clear_options(SSL* ssl, long options) {
- return SSL_clear_options(ssl, options);
- }
- long X_SSL_set_tlsext_host_name(SSL *ssl, const char *name) {
- return SSL_set_tlsext_host_name(ssl, name);
- }
- const char * X_SSL_get_cipher_name(const SSL *ssl) {
- return SSL_get_cipher_name(ssl);
- }
- int X_SSL_session_reused(SSL *ssl) {
- return SSL_session_reused(ssl);
- }
- int X_SSL_new_index() {
- return SSL_get_ex_new_index(0, NULL, NULL, NULL, NULL);
- }
- int X_SSL_verify_cb(int ok, X509_STORE_CTX* store) {
- SSL* ssl = (SSL *)X509_STORE_CTX_get_ex_data(store,
- SSL_get_ex_data_X509_STORE_CTX_idx());
- void* p = SSL_get_ex_data(ssl, get_ssl_idx());
- // get the pointer to the go Ctx object and pass it back into the thunk
- return go_ssl_verify_cb_thunk(p, ok, store);
- }
- const SSL_METHOD *X_SSLv23_method() {
- return SSLv23_method();
- }
- const SSL_METHOD *X_SSLv3_method() {
- #ifndef OPENSSL_NO_SSL3_METHOD
- return SSLv3_method();
- #else
- return NULL;
- #endif
- }
- const SSL_METHOD *X_TLSv1_method() {
- return TLSv1_method();
- }
- const SSL_METHOD *X_TLSv1_1_method() {
- #if defined(TLS1_1_VERSION) && !defined(OPENSSL_SYSNAME_MACOSX)
- return TLSv1_1_method();
- #else
- return NULL;
- #endif
- }
- const SSL_METHOD *X_TLSv1_2_method() {
- #if defined(TLS1_2_VERSION) && !defined(OPENSSL_SYSNAME_MACOSX)
- return TLSv1_2_method();
- #else
- return NULL;
- #endif
- }
- int X_SSL_CTX_new_index() {
- return SSL_CTX_get_ex_new_index(0, NULL, NULL, NULL, NULL);
- }
- long X_SSL_CTX_set_options(SSL_CTX* ctx, long options) {
- return SSL_CTX_set_options(ctx, options);
- }
- long X_SSL_CTX_clear_options(SSL_CTX* ctx, long options) {
- return SSL_CTX_clear_options(ctx, options);
- }
- long X_SSL_CTX_get_options(SSL_CTX* ctx) {
- return SSL_CTX_get_options(ctx);
- }
- long X_SSL_CTX_set_mode(SSL_CTX* ctx, long modes) {
- return SSL_CTX_set_mode(ctx, modes);
- }
- long X_SSL_CTX_get_mode(SSL_CTX* ctx) {
- return SSL_CTX_get_mode(ctx);
- }
- long X_SSL_CTX_set_session_cache_mode(SSL_CTX* ctx, long modes) {
- return SSL_CTX_set_session_cache_mode(ctx, modes);
- }
- long X_SSL_CTX_sess_set_cache_size(SSL_CTX* ctx, long t) {
- return SSL_CTX_sess_set_cache_size(ctx, t);
- }
- long X_SSL_CTX_sess_get_cache_size(SSL_CTX* ctx) {
- return SSL_CTX_sess_get_cache_size(ctx);
- }
- long X_SSL_CTX_set_timeout(SSL_CTX* ctx, long t) {
- return SSL_CTX_set_timeout(ctx, t);
- }
- long X_SSL_CTX_get_timeout(SSL_CTX* ctx) {
- return SSL_CTX_get_timeout(ctx);
- }
- long X_SSL_CTX_add_extra_chain_cert(SSL_CTX* ctx, X509 *cert) {
- return SSL_CTX_add_extra_chain_cert(ctx, cert);
- }
- long X_SSL_CTX_set_tmp_ecdh(SSL_CTX* ctx, EC_KEY *key) {
- return SSL_CTX_set_tmp_ecdh(ctx, key);
- }
- long X_SSL_CTX_set_tlsext_servername_callback(
- SSL_CTX* ctx, int (*cb)(SSL *con, int *ad, void *args)) {
- return SSL_CTX_set_tlsext_servername_callback(ctx, cb);
- }
- int X_SSL_CTX_verify_cb(int ok, X509_STORE_CTX* store) {
- SSL* ssl = (SSL *)X509_STORE_CTX_get_ex_data(store,
- SSL_get_ex_data_X509_STORE_CTX_idx());
- SSL_CTX* ssl_ctx = SSL_get_SSL_CTX(ssl);
- void* p = SSL_CTX_get_ex_data(ssl_ctx, get_ssl_ctx_idx());
- // get the pointer to the go Ctx object and pass it back into the thunk
- return go_ssl_ctx_verify_cb_thunk(p, ok, store);
- }
- long X_SSL_CTX_set_tmp_dh(SSL_CTX* ctx, DH *dh) {
- return SSL_CTX_set_tmp_dh(ctx, dh);
- }
- long X_PEM_read_DHparams(SSL_CTX* ctx, DH *dh) {
- return SSL_CTX_set_tmp_dh(ctx, dh);
- }
- int X_SSL_CTX_set_tlsext_ticket_key_cb(SSL_CTX *sslctx,
- int (*cb)(SSL *s, unsigned char key_name[16],
- unsigned char iv[EVP_MAX_IV_LENGTH],
- EVP_CIPHER_CTX *ctx, HMAC_CTX *hctx, int enc)) {
- return SSL_CTX_set_tlsext_ticket_key_cb(sslctx, cb);
- }
- int X_SSL_CTX_ticket_key_cb(SSL *s, unsigned char key_name[16],
- unsigned char iv[EVP_MAX_IV_LENGTH],
- EVP_CIPHER_CTX *cctx, HMAC_CTX *hctx, int enc) {
- SSL_CTX* ssl_ctx = SSL_get_SSL_CTX(s);
- void* p = SSL_CTX_get_ex_data(ssl_ctx, get_ssl_ctx_idx());
- // get the pointer to the go Ctx object and pass it back into the thunk
- return go_ticket_key_cb_thunk(p, s, key_name, iv, cctx, hctx, enc);
- }
- int X_BIO_get_flags(BIO *b) {
- return BIO_get_flags(b);
- }
- void X_BIO_set_flags(BIO *b, int flags) {
- return BIO_set_flags(b, flags);
- }
- void X_BIO_clear_flags(BIO *b, int flags) {
- BIO_clear_flags(b, flags);
- }
- int X_BIO_read(BIO *b, void *buf, int len) {
- return BIO_read(b, buf, len);
- }
- int X_BIO_write(BIO *b, const void *buf, int len) {
- return BIO_write(b, buf, len);
- }
- BIO *X_BIO_new_write_bio() {
- return BIO_new(BIO_s_writeBio());
- }
- BIO *X_BIO_new_read_bio() {
- return BIO_new(BIO_s_readBio());
- }
- const EVP_MD *X_EVP_get_digestbyname(const char *name) {
- return EVP_get_digestbyname(name);
- }
- const EVP_MD *X_EVP_md_null() {
- return EVP_md_null();
- }
- const EVP_MD *X_EVP_md5() {
- return EVP_md5();
- }
- const EVP_MD *X_EVP_ripemd160() {
- return EVP_ripemd160();
- }
- const EVP_MD *X_EVP_sha224() {
- return EVP_sha224();
- }
- const EVP_MD *X_EVP_sha1() {
- return EVP_sha1();
- }
- const EVP_MD *X_EVP_sha256() {
- return EVP_sha256();
- }
- const EVP_MD *X_EVP_sha384() {
- return EVP_sha384();
- }
- const EVP_MD *X_EVP_sha512() {
- return EVP_sha512();
- }
- int X_EVP_MD_size(const EVP_MD *md) {
- return EVP_MD_size(md);
- }
- int X_EVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *type, ENGINE *impl) {
- return EVP_DigestInit_ex(ctx, type, impl);
- }
- int X_EVP_DigestUpdate(EVP_MD_CTX *ctx, const void *d, size_t cnt) {
- return EVP_DigestUpdate(ctx, d, cnt);
- }
- int X_EVP_DigestFinal_ex(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *s) {
- return EVP_DigestFinal_ex(ctx, md, s);
- }
- int X_EVP_SignInit(EVP_MD_CTX *ctx, const EVP_MD *type) {
- return EVP_SignInit(ctx, type);
- }
- int X_EVP_SignUpdate(EVP_MD_CTX *ctx, const void *d, unsigned int cnt) {
- return EVP_SignUpdate(ctx, d, cnt);
- }
- EVP_PKEY *X_EVP_PKEY_new(void) {
- return EVP_PKEY_new();
- }
- void X_EVP_PKEY_free(EVP_PKEY *pkey) {
- EVP_PKEY_free(pkey);
- }
- int X_EVP_PKEY_size(EVP_PKEY *pkey) {
- return EVP_PKEY_size(pkey);
- }
- struct rsa_st *X_EVP_PKEY_get1_RSA(EVP_PKEY *pkey) {
- return EVP_PKEY_get1_RSA(pkey);
- }
- int X_EVP_PKEY_set1_RSA(EVP_PKEY *pkey, struct rsa_st *key) {
- return EVP_PKEY_set1_RSA(pkey, key);
- }
- int X_EVP_PKEY_assign_charp(EVP_PKEY *pkey, int type, char *key) {
- return EVP_PKEY_assign(pkey, type, key);
- }
- int X_EVP_SignFinal(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *s, EVP_PKEY *pkey) {
- return EVP_SignFinal(ctx, md, s, pkey);
- }
- int X_EVP_VerifyInit(EVP_MD_CTX *ctx, const EVP_MD *type) {
- return EVP_VerifyInit(ctx, type);
- }
- int X_EVP_VerifyUpdate(EVP_MD_CTX *ctx, const void *d,
- unsigned int cnt) {
- return EVP_VerifyUpdate(ctx, d, cnt);
- }
- int X_EVP_VerifyFinal(EVP_MD_CTX *ctx, const unsigned char *sigbuf, unsigned int siglen, EVP_PKEY *pkey) {
- return EVP_VerifyFinal(ctx, sigbuf, siglen, pkey);
- }
- int X_EVP_CIPHER_block_size(EVP_CIPHER *c) {
- return EVP_CIPHER_block_size(c);
- }
- int X_EVP_CIPHER_key_length(EVP_CIPHER *c) {
- return EVP_CIPHER_key_length(c);
- }
- int X_EVP_CIPHER_iv_length(EVP_CIPHER *c) {
- return EVP_CIPHER_iv_length(c);
- }
- int X_EVP_CIPHER_nid(EVP_CIPHER *c) {
- return EVP_CIPHER_nid(c);
- }
- int X_EVP_CIPHER_CTX_block_size(EVP_CIPHER_CTX *ctx) {
- return EVP_CIPHER_CTX_block_size(ctx);
- }
- int X_EVP_CIPHER_CTX_key_length(EVP_CIPHER_CTX *ctx) {
- return EVP_CIPHER_CTX_key_length(ctx);
- }
- int X_EVP_CIPHER_CTX_iv_length(EVP_CIPHER_CTX *ctx) {
- return EVP_CIPHER_CTX_iv_length(ctx);
- }
- const EVP_CIPHER *X_EVP_CIPHER_CTX_cipher(EVP_CIPHER_CTX *ctx) {
- return EVP_CIPHER_CTX_cipher(ctx);
- }
- size_t X_HMAC_size(const HMAC_CTX *e) {
- return HMAC_size(e);
- }
- int X_HMAC_Init_ex(HMAC_CTX *ctx, const void *key, int len, const EVP_MD *md, ENGINE *impl) {
- return HMAC_Init_ex(ctx, key, len, md, impl);
- }
- int X_HMAC_Update(HMAC_CTX *ctx, const unsigned char *data, size_t len) {
- return HMAC_Update(ctx, data, len);
- }
- int X_HMAC_Final(HMAC_CTX *ctx, unsigned char *md, unsigned int *len) {
- return HMAC_Final(ctx, md, len);
- }
- int X_sk_X509_num(STACK_OF(X509) *sk) {
- return sk_X509_num(sk);
- }
- X509 *X_sk_X509_value(STACK_OF(X509)* sk, int i) {
- return sk_X509_value(sk, i);
- }
|