| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175 | /********************************* (C) РОТЕК *********************************** * @module  cert_req * @file    cert_req.c * @version 1.0.0 * @date    XX.XX.XXXX ******************************************************************************* * @history     Version  Author         Comment * XX.XX.XXXX   1.0.0    Telenkov D.A.  First release. ******************************************************************************* */#include "cert_req.h"#if !defined(MBEDTLS_CONFIG_FILE)#include "mbedtls/config.h"#else#include MBEDTLS_CONFIG_FILE#endif#include "mbedtls/platform.h"#include "mbedtls/x509_csr.h"#include "mbedtls/entropy.h"#include "mbedtls/ctr_drbg.h"#include "mbedtls/error.h"#include "mbedtls/certs.h"#include "settings_api.h"#ifdef PRINTF_STDLIB#include <stdio.h>#endif#ifdef PRINTF_CUSTOM#include "tinystdio.h"#endif#include <stdlib.h>#include <string.h>#define DFL_FILENAME            0 //"keyfile.key"#define DFL_DEBUG_LEVEL         0#define DFL_OUTPUT_FILENAME     0 //"cert.req"#define DFL_SUBJECT_NAME        0 //"CN=Cert,O=mbed TLS,C=UK" // Надо CN - ip, O - VimpelCom, C=RU#define DFL_KEY_USAGE           0#define DFL_NS_CERT_TYPE        0extern SETTINGS_t sSettings;struct options{    const char *filename;       /* filename of the key file             */    int debug_level;            /* level of debugging                   */    const char *output_file;    /* where to store the constructed key file  */    const char *subject_name;   /* subject name for certificate request */    unsigned char key_usage;    /* key usage flags                      */    unsigned char ns_cert_type; /* NS cert type                         */} opt;unsigned char req_cert[500];void SSL_CreateReqCert(){    int ret = 0;    mbedtls_pk_context key;    mbedtls_x509write_csr req;    mbedtls_entropy_context entropy;    mbedtls_ctr_drbg_context ctr_drbg;    const char *pers = "csr example app";    char subject_name[40];     // Set to sane values    mbedtls_x509write_csr_init( &req );    mbedtls_x509write_csr_set_md_alg( &req, MBEDTLS_MD_SHA256 );    mbedtls_pk_init( &key );    mbedtls_ctr_drbg_init( &ctr_drbg );        // default    opt.filename            = DFL_FILENAME;    opt.debug_level         = DFL_DEBUG_LEVEL;    opt.output_file         = DFL_OUTPUT_FILENAME;    opt.subject_name        = DFL_SUBJECT_NAME;    opt.key_usage           = DFL_KEY_USAGE;    opt.ns_cert_type        = DFL_NS_CERT_TYPE;        // user    memset(subject_name, 0, 40);    strcpy(subject_name, "CN=");    strcat(subject_name, sSettings.sWebParams.ip);    strcat(subject_name, ",O=VimpelCom,C=RU");        opt.subject_name = subject_name;    //opt.key_usage |= MBEDTLS_X509_KU_KEY_AGREEMENT;    //opt.ns_cert_type |= MBEDTLS_X509_NS_CERT_TYPE_SSL_SERVER;        if( opt.key_usage )        mbedtls_x509write_csr_set_key_usage( &req, opt.key_usage );    if( opt.ns_cert_type )        mbedtls_x509write_csr_set_ns_cert_type( &req, opt.ns_cert_type );        // 0. Seed the PRNG    mbedtls_printf( "  . Seeding the random number generator..." );   // fflush( stdout );    mbedtls_entropy_init( &entropy );    if( ( ret = mbedtls_ctr_drbg_seed( &ctr_drbg, mbedtls_entropy_func, &entropy,                               (const unsigned char *) pers,                               strlen( pers ) ) ) != 0 )    {        mbedtls_printf( " failed\r\n  !  mbedtls_ctr_drbg_seed returned %d", ret );        goto exit;    }    mbedtls_printf( " ok\r\n" );        // 1.0. Check the subject name for validity    mbedtls_printf( "  . Checking subject name..." );   // fflush( stdout );    if( ( ret = mbedtls_x509write_csr_set_subject_name( &req, opt.subject_name ) ) != 0 )    {        mbedtls_printf( " failed\r\n  !  mbedtls_x509write_csr_set_subject_name returned %d", ret );        goto exit;    }    mbedtls_printf( " ok\r\n" );        // 1.1. Load the key    mbedtls_printf( "  . Loading the private key ..." );//    fflush( stdout );    ret =  mbedtls_pk_parse_key( &key, (const unsigned char *) mbedtls_test_srv_key, mbedtls_test_srv_key_len, NULL, 0 );                if( ret != 0 )    {        mbedtls_printf( " failed\r\n  !  mbedtls_pk_parse_keyfile returned %d", ret );        goto exit;    }    mbedtls_x509write_csr_set_key( &req, &key );    mbedtls_printf( " ok\r\n" );            // 1.2. Writing the request    mbedtls_printf( "  . Writing the certificate request ..." );       ret = mbedtls_x509write_csr_pem( &req, req_cert, 4096, mbedtls_ctr_drbg_random, &ctr_drbg );    if (ret != 0)    {        mbedtls_printf( " failed\r\n  !  write_certifcate_request %d", ret );        goto exit;    }    mbedtls_printf( " ok\r\n" );        //mbedtls_printf(req_cert);    mbedtls_printf("\r\n");    exit:    if( ret != 0 && ret != 1)    {        mbedtls_printf("\r\n");    }    mbedtls_x509write_csr_free( &req );    mbedtls_pk_free( &key );    mbedtls_ctr_drbg_free( &ctr_drbg );    mbedtls_entropy_free( &entropy );    }/********************************* (C) РОТЕК **********************************/
 |