pk_wrap.c 3.83 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
/*
 *  Public Key abstraction layer: wrapper functions
 *
 *  Copyright (C) 2006-2013, Brainspark B.V.
 *
 *  This file is part of PolarSSL (http://www.polarssl.org)
 *  Lead Maintainer: Paul Bakker <polarssl_maintainer at polarssl.org>
 *
 *  All rights reserved.
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License along
 *  with this program; if not, write to the Free Software Foundation, Inc.,
 *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */

#include "polarssl/config.h"

#include "polarssl/pk_wrap.h"

#if defined(POLARSSL_RSA_C)
#include "polarssl/rsa.h"
#endif

#if defined(POLARSSL_ECP_C)
#include "polarssl/ecp.h"
#endif

#if defined(POLARSSL_ECDSA_C)
#include "polarssl/ecdsa.h"
#endif

#if defined(POLARSSL_RSA_C)
43 44 45 46 47
static int rsa_can_do( pk_type_t type )
{
    return( type == POLARSSL_PK_RSA );
}

48 49 50 51 52 53 54 55 56 57 58 59
static int rsa_verify_wrap( void *ctx,
                   const unsigned char *hash, const md_info_t *md_info,
                   const unsigned char *sig, size_t sig_len )
{
    ((void) sig_len);

    return( rsa_pkcs1_verify( (rsa_context *) ctx,
                RSA_PUBLIC, md_info->type, 0, hash, sig ) );
}

const pk_info_t rsa_info = {
    POLARSSL_PK_RSA,
60
    rsa_can_do,
61 62 63 64 65
    rsa_verify_wrap,
};
#endif /* POLARSSL_RSA_C */

#if defined(POLARSSL_ECDSA_C)
66 67 68 69 70
int ecdsa_can_do( pk_type_t type )
{
    return( type == POLARSSL_PK_ECDSA );
}

71 72 73 74 75 76 77 78 79 80
int ecdsa_verify_wrap( void *ctx,
                       const unsigned char *hash, const md_info_t *md_info,
                       const unsigned char *sig, size_t sig_len )
{
    return( ecdsa_read_signature( (ecdsa_context *) ctx,
                hash, md_info->size, sig, sig_len ) );
}

const pk_info_t ecdsa_info = {
    POLARSSL_PK_ECDSA,
81
    ecdsa_can_do,
82 83 84 85 86
    ecdsa_verify_wrap,
};
#endif /* POLARSSL_ECDSA_C */

#if defined(POLARSSL_ECP_C)
87 88 89
/*
 * Generic EC key
 */
90 91 92 93 94 95 96
static int eckey_can_do( pk_type_t type )
{
    return( type == POLARSSL_PK_ECKEY ||
            type == POLARSSL_PK_ECKEY_DH ||
            type == POLARSSL_PK_ECDSA );
}

97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
static int eckey_verify_wrap( void *ctx,
                       const unsigned char *hash, const md_info_t *md_info,
                       const unsigned char *sig, size_t sig_len )
{
#if !defined(POLARSSL_ECDSA_C)
    ((void) ctx);
    ((void) hash);
    ((void) md_info);
    ((void) sig);
    ((void) sig_len);

    return( POLARSSL_ERR_PK_TYPE_MISMATCH );
#else
    int ret;
    ecdsa_context ecdsa;

    ecdsa_init( &ecdsa );

    ret = ecdsa_from_keypair( &ecdsa, ctx ) ||
          ecdsa_verify_wrap( &ecdsa, hash, md_info, sig, sig_len );

    ecdsa_free( &ecdsa );

    return( ret );
#endif /* POLARSSL_ECDSA_C */
}

const pk_info_t eckey_info = {
    POLARSSL_PK_ECKEY,
126
    eckey_can_do,
127 128
    eckey_verify_wrap,
};
129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156

/*
 * EC key resticted to ECDH
 */
static int eckeydh_can_do( pk_type_t type )
{
    return( type == POLARSSL_PK_ECKEY ||
            type == POLARSSL_PK_ECKEY_DH );
}

static int eckeydh_verify_wrap( void *ctx,
                       const unsigned char *hash, const md_info_t *md_info,
                       const unsigned char *sig, size_t sig_len )
{
    ((void) ctx);
    ((void) hash);
    ((void) md_info);
    ((void) sig);
    ((void) sig_len);

    return( POLARSSL_ERR_PK_TYPE_MISMATCH );
}

const pk_info_t eckeydh_info = {
    POLARSSL_PK_ECKEY_DH,
    eckeydh_can_do,
    eckeydh_verify_wrap,
};
157
#endif /* POLARSSL_ECP_C */