mirror of
https://git.gnunet.org/libmicrohttpd.git
synced 2026-09-25 04:09:31 +03:00
add connection_https_openssl.c .h
This commit is contained in:
@@ -0,0 +1,166 @@
|
||||
/*
|
||||
This file is part of libmicrohttpd
|
||||
Copyright (C) 2007, 2008, 2010 Daniel Pittman and Christian Grothoff
|
||||
Copyright (C) 2015-2021 Karlson2k (Evgeny Grin)
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file connection_https_openssl.c
|
||||
* @brief Methods for managing SSL/TLS connections with the library OpenSSL. This file is only
|
||||
* compiled if ENABLE_HTTPS is set.
|
||||
* @author Edouard LEFIZELIER
|
||||
*/
|
||||
|
||||
#include "internal.h"
|
||||
#include "connection_https_openssl.h"
|
||||
#include "openssl/bio.h"
|
||||
#include "openssl/ssl.h"
|
||||
#include "openssl/err.h"
|
||||
|
||||
/* Initializing OpenSSL */
|
||||
|
||||
SSL_load_error_strings ();
|
||||
ERR_load_BIO_strings ();
|
||||
OpenSSL_add_all_algorithms ();
|
||||
|
||||
/**
|
||||
* create a new SSL_CTX structure
|
||||
*
|
||||
* @return the SSL_CTX structure
|
||||
*/
|
||||
SSL_CTX *
|
||||
create_context ()
|
||||
{
|
||||
SSL_CTX *ctx;
|
||||
ctx = SSL_CTX_new (SSLv23_client_method ());
|
||||
if (! ctx)
|
||||
{
|
||||
ERR_print_errors (stderr);
|
||||
}
|
||||
return ctx;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* set the context of the SSL_CTX structure, especially the path to the trust store file
|
||||
*
|
||||
* @param ctx the SSL_CTX structure
|
||||
* @param path the path and the filename of the trust store file
|
||||
*/
|
||||
void
|
||||
set_context (SSL_CTX *ctx, char *path)
|
||||
{
|
||||
if (! SSL_CTX_load_verify_locations (ctx, path, NULL))
|
||||
{
|
||||
ERR_print_errors_fp (stderr);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Create a secure connection with the server
|
||||
*
|
||||
* @param bio the BIO structure
|
||||
* @param path the path to the certificate file
|
||||
* @return 1 if an error occured, 0 otherwise
|
||||
*/
|
||||
int
|
||||
create_secure_connection (BIO *bio, const char *path)
|
||||
{
|
||||
SSL_CTX *ctx = SSL_CTX_new (SSLv23_client_method ());
|
||||
SSL ssl;
|
||||
|
||||
// Load the client certificate into the SSL_CTX structure
|
||||
if (! SSL_CTX_load_verify_locations (ctx, path, NULL))
|
||||
{
|
||||
// Error Handler
|
||||
}
|
||||
|
||||
bio = BIO_new_ssl_connect (ctx);
|
||||
BIO_get_ssl (bio, &ssl);
|
||||
// if the server want a new handshake, OpenSSL will open it in the background
|
||||
SSL_set_mode (ssl, SSL_MODE_AUTO_RETRY);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Open a secure connection with the server
|
||||
*
|
||||
* @param bio the BIO structure
|
||||
* @param port the port to connect to
|
||||
* @return 1 if an error occured, 0 otherwise
|
||||
*/
|
||||
int
|
||||
open_secure_connection (BIO *bio, const char *port)
|
||||
{
|
||||
BIO_set_conn_hostname (bio, port);
|
||||
if (BIO_do_connect (bio) <= 0)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
SSL ssl;
|
||||
BIO_get_ssl (bio, &ssl);
|
||||
if (SSL_get_verify_result (ssl) != X509_V_OK)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Reset the BIO structure
|
||||
*
|
||||
* @param bio the BIO structure
|
||||
* @return 1 if an error occured, 0 otherwise
|
||||
*/
|
||||
int
|
||||
reset_bio (BIO *bio)
|
||||
{
|
||||
return ! BIO_reset (bio);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Close the connection with the server
|
||||
*
|
||||
* @param bio the BIO structure
|
||||
* @return 1 if an error occured, 0 otherwise
|
||||
*/
|
||||
int
|
||||
close_connection (BIO *bio)
|
||||
{
|
||||
return ! BIO_free (bio);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Free memory allocated by OpenSSL when the application is shutting down
|
||||
*
|
||||
* @param ctx the SSL_CTX structure
|
||||
*/
|
||||
void
|
||||
shutting_down (SSL_CTX *ctx)
|
||||
{
|
||||
SSL_CTX_free (ctx);
|
||||
// Free the error strings for libcrypto and libssl
|
||||
ERR_free_strings ();
|
||||
// Cleanup all the ciphers and digests
|
||||
EVP_cleanup ();
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
/*
|
||||
This file is part of libmicrohttpd
|
||||
Copyright (C) 2008 Daniel Pittman and Christian Grothoff
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file connection_https.h
|
||||
* @brief Methods for managing connections
|
||||
* @author Edouard LEFIZELIER
|
||||
*/
|
||||
|
||||
#ifndef CONNECTION_HTTPS_EXT_OPENSSL_H
|
||||
#define CONNECTION_HTTPS_EXT_OPENSSL_H
|
||||
@@ -0,0 +1,71 @@
|
||||
/*
|
||||
This file is part of libmicrohttpd
|
||||
Copyright (C) 2019-2021 Karlson2k (Evgeny Grin)
|
||||
|
||||
libmicrohttpd is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library.
|
||||
If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file microhttpd/sha1.c
|
||||
* @brief Calculation of SHA-1 digest as defined in FIPS PUB 180-4 (2015)
|
||||
* @author Édouard LEFIZELIER
|
||||
*/
|
||||
|
||||
#include <openssl/crypto.h>
|
||||
#include "sha1_ext_openssl.h"
|
||||
|
||||
/**
|
||||
* Initialise structure for SHA-1 calculation
|
||||
*
|
||||
* @param ctx the calculation context
|
||||
*/
|
||||
void
|
||||
MHD_SHA1_init (struct Sha1CtxExt_openssl *ctx)
|
||||
{
|
||||
ctx->ext_error = ! SHA1_Init (&ctx->c);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Process portion of bytes.
|
||||
*
|
||||
* @param ctx the calculation context
|
||||
* @param data bytes to add to hash
|
||||
* @param length number of bytes in @a data
|
||||
*/
|
||||
void
|
||||
MHD_SHA1_update (struct Sha1CtxExt_openssl *ctx, const void *buf, int len)
|
||||
{
|
||||
if (0 == ctx->ext_error)
|
||||
{
|
||||
ctx->ext_error = ! SHA1_Update (&ctx->c, buf, len);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Finalise SHA-1 calculation, return digest.
|
||||
*
|
||||
* @param ctx the calculation context
|
||||
* @param md where to store the digest
|
||||
*/
|
||||
void
|
||||
MHD_SHA1_final (struct Sha1CtxExt_openssl *ctx, void *md)
|
||||
{
|
||||
if (0 == ctx->ext_error)
|
||||
{
|
||||
ctx->ext_error = ! SHA1_Final (md, &ctx->c);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,68 @@
|
||||
/*
|
||||
This file is part of GNU libmicrohttpd
|
||||
Copyright (C) 2022 Evgeny Grin (Karlson2k)
|
||||
|
||||
GNU libmicrohttpd is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with GNU libmicrohttpd.
|
||||
If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file microhttpd/md5_ext.h
|
||||
* @brief Wrapper declarations for MD5 calculation performed by TLS library
|
||||
* @author Édouard LEFIZELIER
|
||||
*/
|
||||
|
||||
#ifndef MHD_SHA1_EXT_OPENSSL
|
||||
#define MHD_SHA1_EXT_OPENSSL 1
|
||||
|
||||
#include <openssl/crypto.h>
|
||||
|
||||
/**
|
||||
* SHA1 calculation context
|
||||
*/
|
||||
struct Sha1CtxExt_openssl
|
||||
{
|
||||
SHA_CTX c; /* Hash context*/
|
||||
int ext_error; /**< Non-zero if external error occurs during init or hashing */
|
||||
};
|
||||
|
||||
/**
|
||||
* Initialise structure for MD5 calculation
|
||||
*
|
||||
* @param ctx the calculation context
|
||||
*/
|
||||
void
|
||||
MHD_MD5_init (struct Md5CtxExt_openssl *ctx);
|
||||
|
||||
/**
|
||||
* Process portion of bytes.
|
||||
*
|
||||
* @param ctx the calculation context
|
||||
* @param data bytes to add to hash
|
||||
* @param length number of bytes in @a data
|
||||
*/
|
||||
void
|
||||
MHD_MD5_update (struct Md5CtxExt_openssl *ctx, const void *buf, int len);
|
||||
|
||||
/**
|
||||
* Finalise MD5 calculation, return digest.
|
||||
*
|
||||
* @param ctx the calculation context
|
||||
* @param[out] digest set to the hash, must be #MD5_DIGEST_SIZE bytes
|
||||
*/
|
||||
void
|
||||
MHD_MD5_final (struct Md5CtxExt_openssl *ctx, unsigned char *md);
|
||||
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user