From 12e0ed9115b2075092e722489775028b97ad4bc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20P=C3=A9gouri=C3=A9-Gonnard?= Date: Thu, 4 Jul 2013 13:31:32 +0200 Subject: [PATCH] Add pk_context and associated functions --- include/polarssl/pk.h | 31 +++++++++++++- library/CMakeLists.txt | 1 + library/Makefile | 1 + library/pk.c | 93 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 125 insertions(+), 1 deletion(-) create mode 100644 library/pk.c diff --git a/include/polarssl/pk.h b/include/polarssl/pk.h index 169753de4..16aac4349 100644 --- a/include/polarssl/pk.h +++ b/include/polarssl/pk.h @@ -37,11 +37,40 @@ extern "C" { typedef enum { POLARSSL_PK_NONE=0, POLARSSL_PK_RSA, - POLARSSL_PK_ECDSA, POLARSSL_PK_ECKEY, POLARSSL_PK_ECKEY_DH, } pk_type_t; +/** + * \brief Public key container + */ +typedef struct +{ + pk_type_t type; /**< Public key type */ + void * data; /**< Public key data */ +} pk_context; + +/** + * \brief Initialize a pk_context (as NONE) + */ +void pk_init( pk_context *ctx ); + +/** + * \brief Free a pk_context + */ +void pk_free( pk_context *ctx ); + +/** + * \brief Set a pk_context to a given type + * + * \param ctx Context to initialize + * \param type Type of key + * + * \return O on success, -1 on memory allocation error + * TODO: use appropriate error constant + */ +int pk_set_type( pk_context *ctx, pk_type_t type ); + #ifdef __cplusplus } #endif diff --git a/library/CMakeLists.txt b/library/CMakeLists.txt index 948737d81..3fa76a972 100644 --- a/library/CMakeLists.txt +++ b/library/CMakeLists.txt @@ -39,6 +39,7 @@ set(src pkcs5.c pkcs11.c pkcs12.c + pk.c rsa.c sha1.c sha256.c diff --git a/library/Makefile b/library/Makefile index f670dcc47..48c3bdcbb 100644 --- a/library/Makefile +++ b/library/Makefile @@ -49,6 +49,7 @@ OBJS= aes.o arc4.o asn1parse.o \ oid.o \ padlock.o pbkdf2.o pem.o \ pkcs5.o pkcs11.o pkcs12.o \ + pk.o \ rsa.o sha1.o sha256.o \ sha512.o ssl_cache.o ssl_cli.o \ ssl_srv.o ssl_ciphersuites.o \ diff --git a/library/pk.c b/library/pk.c new file mode 100644 index 000000000..a5f8d6b9b --- /dev/null +++ b/library/pk.c @@ -0,0 +1,93 @@ +/* + * Public Key abstraction layer + * + * Copyright (C) 2006-2013, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * 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/rsa.h" +#include "polarssl/ecp.h" +#include "polarssl/pk.h" + +#include + +/* + * Initialise a pk_context + */ +void pk_init( pk_context *ctx ) +{ + if( ctx == NULL ) + return; + + ctx->type = POLARSSL_PK_NONE; + ctx->data = NULL; +} + +/* + * Free (the components of) a pk_context + */ +void pk_free( pk_context *ctx ) +{ + if( ctx == NULL ) + return; + + switch( ctx->type ) + { + case POLARSSL_PK_NONE: + break; + + case POLARSSL_PK_RSA: + rsa_free( ctx->data ); + break; + + case POLARSSL_PK_ECKEY: + case POLARSSL_PK_ECKEY_DH: + ecp_keypair_free( ctx->data ); + break; + } + + ctx->type = POLARSSL_PK_NONE; + ctx->data = NULL; +} + +/* + * Set a pk_context to a given type + */ +int pk_set_type( pk_context *ctx, pk_type_t type ) +{ + size_t size = type == POLARSSL_PK_RSA ? sizeof( rsa_context ) + : type == POLARSSL_PK_ECKEY ? sizeof( ecp_keypair ) + : type == POLARSSL_PK_ECKEY_DH ? sizeof( ecp_keypair ) + : 0; + + if( size == 0 ) + return( 0 ); + + if( ( ctx->data = malloc( size ) ) == NULL ) + return( -1 ); + + memset( ctx->data, 0, size ); + ctx->type = type; + + return( 0 ); +}