mirror of
https://github.com/yuzu-emu/mbedtls.git
synced 2024-11-29 08:14:27 +01:00
3b0c430638
This is done to account for platforms, for which we want custom behavior upon the program termination, hence we call `mbedtls_exit()` instead of returning from `main()`. For the sake of consistency, introduces the modifications have been made to the test and utility examples as well. These, while less likely to be used in the low level environments, won't suffer from such a change.
183 lines
5.2 KiB
C
183 lines
5.2 KiB
C
/*
|
|
* RSASSA-PSS/SHA-256 signature creation program
|
|
*
|
|
* Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*
|
|
* 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.
|
|
*
|
|
* This file is part of mbed TLS (https://tls.mbed.org)
|
|
*/
|
|
|
|
#if !defined(MBEDTLS_CONFIG_FILE)
|
|
#include "mbedtls/config.h"
|
|
#else
|
|
#include MBEDTLS_CONFIG_FILE
|
|
#endif
|
|
|
|
#if defined(MBEDTLS_PLATFORM_C)
|
|
#include "mbedtls/platform.h"
|
|
#else
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#define mbedtls_snprintf snprintf
|
|
#define mbedtls_printf printf
|
|
#define mbedtls_exit exit
|
|
#define MBEDTLS_EXIT_SUCCESS EXIT_SUCCESS
|
|
#define MBEDTLS_EXIT_FAILURE EXIT_FAILURE
|
|
#endif /* MBEDTLS_PLATFORM_C */
|
|
|
|
#if !defined(MBEDTLS_MD_C) || !defined(MBEDTLS_ENTROPY_C) || \
|
|
!defined(MBEDTLS_RSA_C) || !defined(MBEDTLS_SHA256_C) || \
|
|
!defined(MBEDTLS_PK_PARSE_C) || !defined(MBEDTLS_FS_IO) || \
|
|
!defined(MBEDTLS_CTR_DRBG_C)
|
|
int main( void )
|
|
{
|
|
mbedtls_printf("MBEDTLS_MD_C and/or MBEDTLS_ENTROPY_C and/or "
|
|
"MBEDTLS_RSA_C and/or MBEDTLS_SHA256_C and/or "
|
|
"MBEDTLS_PK_PARSE_C and/or MBEDTLS_FS_IO and/or "
|
|
"MBEDTLS_CTR_DRBG_C not defined.\n");
|
|
mbedtls_exit( 0 );
|
|
}
|
|
#else
|
|
|
|
#include "mbedtls/entropy.h"
|
|
#include "mbedtls/ctr_drbg.h"
|
|
#include "mbedtls/md.h"
|
|
#include "mbedtls/rsa.h"
|
|
#include "mbedtls/x509.h"
|
|
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
|
|
|
|
int main( int argc, char *argv[] )
|
|
{
|
|
FILE *f;
|
|
int ret = 1;
|
|
int exit_code = MBEDTLS_EXIT_FAILURE;
|
|
mbedtls_pk_context pk;
|
|
mbedtls_entropy_context entropy;
|
|
mbedtls_ctr_drbg_context ctr_drbg;
|
|
unsigned char hash[32];
|
|
unsigned char buf[MBEDTLS_MPI_MAX_SIZE];
|
|
char filename[512];
|
|
const char *pers = "rsa_sign_pss";
|
|
size_t olen = 0;
|
|
|
|
mbedtls_entropy_init( &entropy );
|
|
mbedtls_pk_init( &pk );
|
|
mbedtls_ctr_drbg_init( &ctr_drbg );
|
|
|
|
if( argc != 3 )
|
|
{
|
|
mbedtls_printf( "usage: rsa_sign_pss <key_file> <filename>\n" );
|
|
|
|
#if defined(_WIN32)
|
|
mbedtls_printf( "\n" );
|
|
#endif
|
|
|
|
goto exit;
|
|
}
|
|
|
|
mbedtls_printf( "\n . Seeding the random number generator..." );
|
|
fflush( stdout );
|
|
|
|
if( ( ret = mbedtls_ctr_drbg_seed( &ctr_drbg, mbedtls_entropy_func, &entropy,
|
|
(const unsigned char *) pers,
|
|
strlen( pers ) ) ) != 0 )
|
|
{
|
|
mbedtls_printf( " failed\n ! mbedtls_ctr_drbg_seed returned %d\n", ret );
|
|
goto exit;
|
|
}
|
|
|
|
mbedtls_printf( "\n . Reading private key from '%s'", argv[1] );
|
|
fflush( stdout );
|
|
|
|
if( ( ret = mbedtls_pk_parse_keyfile( &pk, argv[1], "" ) ) != 0 )
|
|
{
|
|
mbedtls_printf( " failed\n ! Could not read key from '%s'\n", argv[1] );
|
|
mbedtls_printf( " ! mbedtls_pk_parse_public_keyfile returned %d\n\n", ret );
|
|
goto exit;
|
|
}
|
|
|
|
if( !mbedtls_pk_can_do( &pk, MBEDTLS_PK_RSA ) )
|
|
{
|
|
mbedtls_printf( " failed\n ! Key is not an RSA key\n" );
|
|
goto exit;
|
|
}
|
|
|
|
mbedtls_rsa_set_padding( mbedtls_pk_rsa( pk ), MBEDTLS_RSA_PKCS_V21, MBEDTLS_MD_SHA256 );
|
|
|
|
/*
|
|
* Compute the SHA-256 hash of the input file,
|
|
* then calculate the RSA signature of the hash.
|
|
*/
|
|
mbedtls_printf( "\n . Generating the RSA/SHA-256 signature" );
|
|
fflush( stdout );
|
|
|
|
if( ( ret = mbedtls_md_file(
|
|
mbedtls_md_info_from_type( MBEDTLS_MD_SHA256 ),
|
|
argv[2], hash ) ) != 0 )
|
|
{
|
|
mbedtls_printf( " failed\n ! Could not open or read %s\n\n", argv[2] );
|
|
goto exit;
|
|
}
|
|
|
|
if( ( ret = mbedtls_pk_sign( &pk, MBEDTLS_MD_SHA256, hash, 0, buf, &olen,
|
|
mbedtls_ctr_drbg_random, &ctr_drbg ) ) != 0 )
|
|
{
|
|
mbedtls_printf( " failed\n ! mbedtls_pk_sign returned %d\n\n", ret );
|
|
goto exit;
|
|
}
|
|
|
|
/*
|
|
* Write the signature into <filename>.sig
|
|
*/
|
|
mbedtls_snprintf( filename, 512, "%s.sig", argv[2] );
|
|
|
|
if( ( f = fopen( filename, "wb+" ) ) == NULL )
|
|
{
|
|
mbedtls_printf( " failed\n ! Could not create %s\n\n", filename );
|
|
goto exit;
|
|
}
|
|
|
|
if( fwrite( buf, 1, olen, f ) != olen )
|
|
{
|
|
mbedtls_printf( "failed\n ! fwrite failed\n\n" );
|
|
fclose( f );
|
|
goto exit;
|
|
}
|
|
|
|
fclose( f );
|
|
|
|
mbedtls_printf( "\n . Done (created \"%s\")\n\n", filename );
|
|
|
|
exit_code = MBEDTLS_EXIT_SUCCESS;
|
|
|
|
exit:
|
|
mbedtls_pk_free( &pk );
|
|
mbedtls_ctr_drbg_free( &ctr_drbg );
|
|
mbedtls_entropy_free( &entropy );
|
|
|
|
#if defined(_WIN32)
|
|
mbedtls_printf( " + Press Enter to exit this program.\n" );
|
|
fflush( stdout ); getchar();
|
|
#endif
|
|
|
|
mbedtls_exit( exit_code );
|
|
}
|
|
#endif /* MBEDTLS_BIGNUM_C && MBEDTLS_ENTROPY_C && MBEDTLS_RSA_C &&
|
|
MBEDTLS_SHA256_C && MBEDTLS_PK_PARSE_C && MBEDTLS_FS_IO &&
|
|
MBEDTLS_CTR_DRBG_C */
|