mirror of
https://github.com/transmission/transmission
synced 2024-12-26 09:37:56 +00:00
117ab3e8d2
On a way to factoring out OpenSSL support to a standalone file to ease addition of other crypto libraries support in the future, move helpers providing DH key exchange to crypto-utils.{c,h}. OpenSSL-related functionality (DH context management) is moved to crypto-utils-openssl.c. Since we know in advance that DH secret key management code will be the same for most of backends, implement common functionality in separate crypto-utils-fallback.c. Add new tr_dh_ctx_t and tr_dh_secret_t types and functions to be implemented by crypto backends: * tr_dh_new - allocate DH context, * tr_dh_free - free the context, * tr_dh_make_key - generate private/public keypair, * tr_dh_agree - perform DH key exchange and generate secret key, * tr_dh_secret_derive - calculate secret key hash, * tr_dh_secret_free - free the secret key, * tr_dh_align_key - align some DH key in the buffer allocated for it. Make DH secret key not accessible in plain form outside the crypto backend. This allows for implementations where the key is managed by the underlying library and is not even exposed to our backend.
77 lines
1.9 KiB
C
77 lines
1.9 KiB
C
/*
|
|
* This file Copyright (C) Mnemosyne LLC
|
|
*
|
|
* It may be used under the GNU GPL versions 2 or 3
|
|
* or any future license endorsed by Mnemosyne LLC.
|
|
*
|
|
* $Id$
|
|
*/
|
|
|
|
/* This file is designed specifically to be included by other source files to
|
|
implement missing (or duplicate) functionality without exposing internal
|
|
details in header files. */
|
|
|
|
#include <assert.h>
|
|
|
|
#include "transmission.h"
|
|
#include "crypto-utils.h"
|
|
#include "utils.h"
|
|
|
|
/***
|
|
****
|
|
***/
|
|
|
|
#ifdef TR_CRYPTO_DH_SECRET_FALLBACK
|
|
|
|
/* Most Diffie-Hellman backends handle secret key in the very same way: by
|
|
manually allocating memory for it and storing the value in plain form. */
|
|
|
|
struct tr_dh_secret
|
|
{
|
|
size_t key_length;
|
|
uint8_t key[];
|
|
};
|
|
|
|
static struct tr_dh_secret *
|
|
tr_dh_secret_new (size_t key_length)
|
|
{
|
|
struct tr_dh_secret * handle = tr_malloc (sizeof (struct tr_dh_secret) + key_length);
|
|
handle->key_length = key_length;
|
|
return handle;
|
|
}
|
|
|
|
static void
|
|
tr_dh_secret_align (struct tr_dh_secret * handle,
|
|
size_t current_key_length)
|
|
{
|
|
tr_dh_align_key (handle->key, current_key_length, handle->key_length);
|
|
}
|
|
|
|
bool
|
|
tr_dh_secret_derive (tr_dh_secret_t raw_handle,
|
|
const void * prepend_data,
|
|
size_t prepend_data_size,
|
|
const void * append_data,
|
|
size_t append_data_size,
|
|
uint8_t * hash)
|
|
{
|
|
struct tr_dh_secret * handle = raw_handle;
|
|
|
|
assert (handle != NULL);
|
|
assert (hash != NULL);
|
|
|
|
return tr_sha1 (hash,
|
|
prepend_data == NULL ? "" : prepend_data,
|
|
prepend_data == NULL ? 0 : (int) prepend_data_size,
|
|
handle->key, (int) handle->key_length,
|
|
append_data, append_data == NULL ? 0 : (int) append_data_size,
|
|
NULL);
|
|
}
|
|
|
|
void
|
|
tr_dh_secret_free (tr_dh_secret_t handle)
|
|
{
|
|
tr_free (handle);
|
|
}
|
|
|
|
#endif /* TR_CRYPTO_DH_SECRET_FALLBACK */
|