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 */
 |