199 lines
6.8 KiB
C
199 lines
6.8 KiB
C
/**
|
|
* Copyright (C) 2015-2016 Virgil Security Inc.
|
|
*
|
|
* Lead Maintainer: Virgil Security Inc. <support@virgilsecurity.com>
|
|
*
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions are
|
|
* met:
|
|
*
|
|
* (1) Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
*
|
|
* (2) Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in
|
|
* the documentation and/or other materials provided with the
|
|
* distribution.
|
|
*
|
|
* (3) Neither the name of the copyright holder 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 THE AUTHOR ''AS IS'' AND ANY EXPRESS OR
|
|
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
* DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
|
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
|
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
* POSSIBILITY OF SUCH DAMAGE.
|
|
*
|
|
* This file is part of extension to mbed TLS (https://tls.mbed.org)
|
|
*/
|
|
|
|
#if !defined(MBEDTLS_CONFIG_FILE)
|
|
#include "mbedtls/config.h"
|
|
#else
|
|
#include MBEDTLS_CONFIG_FILE
|
|
#endif
|
|
|
|
#if defined(MBEDTLS_FAST_EC_C)
|
|
|
|
#include "mbedtls/fast_ec_internal.h"
|
|
|
|
#if defined(MBEDTLS_ED25519_C)
|
|
#include "mbedtls/ed25519.h"
|
|
#endif
|
|
|
|
|
|
#if defined(MBEDTLS_ED25519_C)
|
|
|
|
static int x25519_gen_key_wrap( unsigned char* public_key, unsigned char* private_key,
|
|
int (*f_rng)(void *, unsigned char *, size_t),
|
|
void *p_rng )
|
|
{
|
|
int ret = 0;
|
|
|
|
if( public_key == NULL || private_key == NULL )
|
|
return( MBEDTLS_ERR_FAST_EC_BAD_INPUT_DATA );
|
|
|
|
if( f_rng == NULL )
|
|
return( MBEDTLS_ERR_FAST_EC_BAD_INPUT_DATA );
|
|
|
|
if( ( ret = f_rng( p_rng, private_key, MBEDTLS_ED25519_KEY_LEN ) ) != 0 )
|
|
return( ret );
|
|
|
|
mbedtls_curve25519_get_pubkey( public_key, private_key );
|
|
|
|
return( 0 );
|
|
}
|
|
|
|
static int x25519_get_pub_wrap( unsigned char* public_key, const unsigned char* private_key )
|
|
{
|
|
if( public_key == NULL || private_key == NULL )
|
|
return( MBEDTLS_ERR_FAST_EC_BAD_INPUT_DATA );
|
|
|
|
mbedtls_curve25519_get_pubkey( public_key, private_key );
|
|
|
|
return( 0 );
|
|
}
|
|
|
|
static int x25519_compute_shared_func( const unsigned char* public_key, const unsigned char* private_key,
|
|
unsigned char* shared, size_t shared_len )
|
|
{
|
|
if( public_key == NULL || private_key == NULL || shared == NULL || shared_len < MBEDTLS_ED25519_DH_LEN)
|
|
return( MBEDTLS_ERR_FAST_EC_BAD_INPUT_DATA );
|
|
|
|
if( mbedtls_curve25519_key_exchange( shared, public_key, private_key ) != 0 )
|
|
return( MBEDTLS_ERR_FAST_EC_SHARED_WEAK_KEY );
|
|
|
|
return( 0 );
|
|
}
|
|
|
|
static int ed25519_gen_key_wrap( unsigned char* public_key, unsigned char* private_key,
|
|
int (*f_rng)(void *, unsigned char *, size_t),
|
|
void *p_rng )
|
|
{
|
|
int ret = 0;
|
|
|
|
if( public_key == NULL || private_key == NULL )
|
|
return( MBEDTLS_ERR_FAST_EC_BAD_INPUT_DATA );
|
|
|
|
if( f_rng == NULL )
|
|
return( MBEDTLS_ERR_FAST_EC_BAD_INPUT_DATA );
|
|
|
|
if( ( ret = f_rng( p_rng, private_key, MBEDTLS_ED25519_KEY_LEN ) ) != 0 )
|
|
return( ret );
|
|
|
|
mbedtls_ed25519_get_pubkey( public_key, private_key );
|
|
|
|
return( 0 );
|
|
}
|
|
|
|
static int ed25519_get_pub_wrap( unsigned char* public_key, const unsigned char* private_key )
|
|
{
|
|
if( public_key == NULL || private_key == NULL )
|
|
return( MBEDTLS_ERR_FAST_EC_BAD_INPUT_DATA );
|
|
|
|
mbedtls_ed25519_get_pubkey( public_key, private_key );
|
|
|
|
return( 0 );
|
|
}
|
|
|
|
static int ed25519_sign_wrap( unsigned char* sig, const unsigned char* private_key,
|
|
const unsigned char* data, size_t data_len )
|
|
{
|
|
if( sig == NULL || private_key == NULL || data == NULL )
|
|
return( MBEDTLS_ERR_FAST_EC_BAD_INPUT_DATA );
|
|
|
|
mbedtls_ed25519_sign( sig, private_key, data, data_len );
|
|
return( 0 );
|
|
}
|
|
|
|
static int ed25519_verify_wrap( const unsigned char* sig, const unsigned char* public_key,
|
|
const unsigned char* data, size_t data_len )
|
|
{
|
|
if( sig == NULL || public_key == NULL || data == NULL )
|
|
return( MBEDTLS_ERR_FAST_EC_BAD_INPUT_DATA );
|
|
|
|
if( mbedtls_ed25519_verify( sig, public_key, data, data_len ) != 0)
|
|
return( MBEDTLS_ERR_FAST_EC_VERIFY_FAILED );
|
|
|
|
return( 0 );
|
|
}
|
|
|
|
static int ed25519_compute_shared_func( const unsigned char* public_key, const unsigned char* private_key,
|
|
unsigned char* shared, size_t shared_len )
|
|
{
|
|
unsigned char x25519_public_key[MBEDTLS_ED25519_KEY_LEN];
|
|
unsigned char x25519_private_key[MBEDTLS_ED25519_KEY_LEN];
|
|
|
|
if( public_key == NULL || private_key == NULL || shared == NULL || shared_len < MBEDTLS_ED25519_DH_LEN)
|
|
return( MBEDTLS_ERR_FAST_EC_BAD_INPUT_DATA );
|
|
|
|
mbedtls_ed25519_pubkey_to_curve25519(x25519_public_key, public_key);
|
|
mbedtls_ed25519_key_to_curve25519(x25519_private_key, private_key);
|
|
|
|
if( mbedtls_curve25519_key_exchange( shared, x25519_public_key, x25519_private_key ) != 0 )
|
|
return( MBEDTLS_ERR_FAST_EC_SHARED_WEAK_KEY );
|
|
|
|
return( 0 );
|
|
}
|
|
|
|
const mbedtls_fast_ec_info_t mbedtls_fast_ec_x25519_info = {
|
|
MBEDTLS_FAST_EC_X25519, // type
|
|
"X25519", // name
|
|
32, // key_len
|
|
254, // key_bitlen
|
|
64, // sig_len
|
|
32, // shared_len
|
|
x25519_gen_key_wrap, // key_gen_func
|
|
x25519_get_pub_wrap, // get_pub_func
|
|
NULL, // sign_func
|
|
NULL, // verify_func
|
|
x25519_compute_shared_func, // compute_shared_func
|
|
};
|
|
|
|
const mbedtls_fast_ec_info_t mbedtls_fast_ec_ed25519_info = {
|
|
MBEDTLS_FAST_EC_ED25519, // type
|
|
"ED25519", // name
|
|
32, // key_len
|
|
254, // key_bitlen
|
|
64, // sig_len
|
|
32, // shared_len
|
|
ed25519_gen_key_wrap, // key_gen_func
|
|
ed25519_get_pub_wrap, // get_pub_func
|
|
ed25519_sign_wrap, // sign_func
|
|
ed25519_verify_wrap, // verify_func
|
|
ed25519_compute_shared_func, // compute_shared_func
|
|
};
|
|
|
|
#endif
|
|
|
|
#endif /* MBEDTLS_FAST_EC_C */
|