blob: 8f61500252bab744b4ef0c76168003048338e0ec [file] [log] [blame]
Manuel Pégourié-Gonnardd73b3c12013-08-12 17:06:05 +02001/*
2 * Public Key abstraction layer: wrapper functions
3 *
4 * Copyright (C) 2006-2013, Brainspark B.V.
5 *
6 * This file is part of PolarSSL (http://www.polarssl.org)
7 * Lead Maintainer: Paul Bakker <polarssl_maintainer at polarssl.org>
8 *
9 * All rights reserved.
10 *
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License along
22 * with this program; if not, write to the Free Software Foundation, Inc.,
23 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
24 */
25
26#include "polarssl/config.h"
27
28#include "polarssl/pk_wrap.h"
29
30#if defined(POLARSSL_RSA_C)
31#include "polarssl/rsa.h"
32#endif
33
34#if defined(POLARSSL_ECP_C)
35#include "polarssl/ecp.h"
36#endif
37
38#if defined(POLARSSL_ECDSA_C)
39#include "polarssl/ecdsa.h"
40#endif
41
Manuel Pégourié-Gonnard765db072013-08-14 15:00:27 +020042#if defined(POLARSSL_MEMORY_C)
43#include "polarssl/memory.h"
44#else
45#include <stdlib.h>
46#define polarssl_malloc malloc
47#define polarssl_free free
48#endif
49
Manuel Pégourié-Gonnardd73b3c12013-08-12 17:06:05 +020050#if defined(POLARSSL_RSA_C)
Manuel Pégourié-Gonnardf18c3e02013-08-12 18:41:18 +020051static int rsa_can_do( pk_type_t type )
52{
53 return( type == POLARSSL_PK_RSA );
54}
55
Manuel Pégourié-Gonnardb3d91872013-08-14 15:56:19 +020056static size_t rsa_get_size( const void * ctx )
Manuel Pégourié-Gonnardf8c948a2013-08-12 19:45:32 +020057{
Manuel Pégourié-Gonnardb3d91872013-08-14 15:56:19 +020058 return( 8 * ((rsa_context *) ctx)->len );
Manuel Pégourié-Gonnardf8c948a2013-08-12 19:45:32 +020059}
60
Manuel Pégourié-Gonnardd73b3c12013-08-12 17:06:05 +020061static int rsa_verify_wrap( void *ctx,
62 const unsigned char *hash, const md_info_t *md_info,
63 const unsigned char *sig, size_t sig_len )
64{
Manuel Pégourié-Gonnardac4cd362013-08-14 20:20:41 +020065 if( sig_len != ((rsa_context *) ctx)->len )
66 return( POLARSSL_ERR_RSA_VERIFY_FAILED );
Manuel Pégourié-Gonnardd73b3c12013-08-12 17:06:05 +020067
68 return( rsa_pkcs1_verify( (rsa_context *) ctx,
69 RSA_PUBLIC, md_info->type, 0, hash, sig ) );
70}
71
Manuel Pégourié-Gonnard765db072013-08-14 15:00:27 +020072static void *rsa_alloc_wrap( void )
73{
74 void *ctx = polarssl_malloc( sizeof( rsa_context ) );
75
76 if( ctx != NULL )
77 rsa_init( (rsa_context *) ctx, 0, 0 );
78
79 return ctx;
80}
81
82static void rsa_free_wrap( void *ctx )
83{
84 rsa_free( (rsa_context *) ctx );
85 polarssl_free( ctx );
86}
87
Manuel Pégourié-Gonnardc6ac8872013-08-14 18:04:18 +020088static void rsa_debug( const void *ctx, pk_debug_item *items )
89{
90 items->type = POLARSSL_PK_DEBUG_MPI;
91 items->name = "rsa.N";
92 items->value = &( ((rsa_context *) ctx)->N );
93
94 items++;
95
96 items->type = POLARSSL_PK_DEBUG_MPI;
97 items->name = "rsa.E";
98 items->value = &( ((rsa_context *) ctx)->E );
99}
100
Manuel Pégourié-Gonnardd73b3c12013-08-12 17:06:05 +0200101const pk_info_t rsa_info = {
102 POLARSSL_PK_RSA,
Manuel Pégourié-Gonnardf8c948a2013-08-12 19:45:32 +0200103 "RSA",
104 rsa_get_size,
Manuel Pégourié-Gonnardf18c3e02013-08-12 18:41:18 +0200105 rsa_can_do,
Manuel Pégourié-Gonnardd73b3c12013-08-12 17:06:05 +0200106 rsa_verify_wrap,
Manuel Pégourié-Gonnard765db072013-08-14 15:00:27 +0200107 rsa_alloc_wrap,
108 rsa_free_wrap,
Manuel Pégourié-Gonnardc6ac8872013-08-14 18:04:18 +0200109 rsa_debug,
Manuel Pégourié-Gonnardd73b3c12013-08-12 17:06:05 +0200110};
111#endif /* POLARSSL_RSA_C */
112
Manuel Pégourié-Gonnardd73b3c12013-08-12 17:06:05 +0200113#if defined(POLARSSL_ECP_C)
Manuel Pégourié-Gonnard835eb592013-08-12 18:51:26 +0200114/*
115 * Generic EC key
116 */
Manuel Pégourié-Gonnardf18c3e02013-08-12 18:41:18 +0200117static int eckey_can_do( pk_type_t type )
118{
119 return( type == POLARSSL_PK_ECKEY ||
120 type == POLARSSL_PK_ECKEY_DH ||
121 type == POLARSSL_PK_ECDSA );
122}
123
Manuel Pégourié-Gonnardb3d91872013-08-14 15:56:19 +0200124static size_t eckey_get_size( const void *ctx )
Manuel Pégourié-Gonnardf8c948a2013-08-12 19:45:32 +0200125{
126 return( ((ecp_keypair *) ctx)->grp.pbits );
127}
128
Manuel Pégourié-Gonnard09162dd2013-08-14 18:16:50 +0200129#if defined(POLARSSL_ECDSA_C)
130/* Forward declaration */
131static int ecdsa_verify_wrap( void *ctx,
132 const unsigned char *hash, const md_info_t *md_info,
133 const unsigned char *sig, size_t sig_len );
134#endif
135
Manuel Pégourié-Gonnardd73b3c12013-08-12 17:06:05 +0200136static int eckey_verify_wrap( void *ctx,
137 const unsigned char *hash, const md_info_t *md_info,
138 const unsigned char *sig, size_t sig_len )
139{
140#if !defined(POLARSSL_ECDSA_C)
141 ((void) ctx);
142 ((void) hash);
143 ((void) md_info);
144 ((void) sig);
145 ((void) sig_len);
146
147 return( POLARSSL_ERR_PK_TYPE_MISMATCH );
148#else
149 int ret;
150 ecdsa_context ecdsa;
151
152 ecdsa_init( &ecdsa );
153
154 ret = ecdsa_from_keypair( &ecdsa, ctx ) ||
155 ecdsa_verify_wrap( &ecdsa, hash, md_info, sig, sig_len );
156
157 ecdsa_free( &ecdsa );
158
159 return( ret );
160#endif /* POLARSSL_ECDSA_C */
161}
162
Manuel Pégourié-Gonnard765db072013-08-14 15:00:27 +0200163static void *eckey_alloc_wrap( void )
164{
165 void *ctx = polarssl_malloc( sizeof( ecp_keypair ) );
166
167 if( ctx != NULL )
168 ecp_keypair_init( ctx );
169
170 return( ctx );
171}
172
173static void eckey_free_wrap( void *ctx )
174{
175 ecp_keypair_free( (ecp_keypair *) ctx );
176 polarssl_free( ctx );
177}
178
Manuel Pégourié-Gonnardc6ac8872013-08-14 18:04:18 +0200179static void eckey_debug( const void *ctx, pk_debug_item *items )
180{
181 items->type = POLARSSL_PK_DEBUG_ECP;
182 items->name = "eckey.Q";
183 items->value = &( ((ecp_keypair *) ctx)->Q );
184}
185
Manuel Pégourié-Gonnardd73b3c12013-08-12 17:06:05 +0200186const pk_info_t eckey_info = {
187 POLARSSL_PK_ECKEY,
Manuel Pégourié-Gonnardf8c948a2013-08-12 19:45:32 +0200188 "EC",
189 eckey_get_size,
Manuel Pégourié-Gonnardf18c3e02013-08-12 18:41:18 +0200190 eckey_can_do,
Manuel Pégourié-Gonnardd73b3c12013-08-12 17:06:05 +0200191 eckey_verify_wrap,
Manuel Pégourié-Gonnard765db072013-08-14 15:00:27 +0200192 eckey_alloc_wrap,
193 eckey_free_wrap,
Manuel Pégourié-Gonnardc6ac8872013-08-14 18:04:18 +0200194 eckey_debug,
Manuel Pégourié-Gonnardd73b3c12013-08-12 17:06:05 +0200195};
Manuel Pégourié-Gonnard835eb592013-08-12 18:51:26 +0200196
197/*
198 * EC key resticted to ECDH
199 */
200static int eckeydh_can_do( pk_type_t type )
201{
202 return( type == POLARSSL_PK_ECKEY ||
203 type == POLARSSL_PK_ECKEY_DH );
204}
205
206static int eckeydh_verify_wrap( void *ctx,
207 const unsigned char *hash, const md_info_t *md_info,
208 const unsigned char *sig, size_t sig_len )
209{
210 ((void) ctx);
211 ((void) hash);
212 ((void) md_info);
213 ((void) sig);
214 ((void) sig_len);
215
216 return( POLARSSL_ERR_PK_TYPE_MISMATCH );
217}
218
219const pk_info_t eckeydh_info = {
220 POLARSSL_PK_ECKEY_DH,
Manuel Pégourié-Gonnardf8c948a2013-08-12 19:45:32 +0200221 "EC_DH",
222 eckey_get_size, /* Same underlying key structure */
Manuel Pégourié-Gonnard835eb592013-08-12 18:51:26 +0200223 eckeydh_can_do,
224 eckeydh_verify_wrap,
Manuel Pégourié-Gonnard765db072013-08-14 15:00:27 +0200225 eckey_alloc_wrap, /* Same underlying key structure */
226 eckey_free_wrap, /* Same underlying key structure */
Manuel Pégourié-Gonnard09162dd2013-08-14 18:16:50 +0200227 eckey_debug, /* Same underlying key structure */
Manuel Pégourié-Gonnard835eb592013-08-12 18:51:26 +0200228};
Manuel Pégourié-Gonnardd73b3c12013-08-12 17:06:05 +0200229#endif /* POLARSSL_ECP_C */
Manuel Pégourié-Gonnard09162dd2013-08-14 18:16:50 +0200230
231#if defined(POLARSSL_ECDSA_C)
232static int ecdsa_can_do( pk_type_t type )
233{
234 return( type == POLARSSL_PK_ECDSA );
235}
236
237static int ecdsa_verify_wrap( void *ctx,
238 const unsigned char *hash, const md_info_t *md_info,
239 const unsigned char *sig, size_t sig_len )
240{
241 return( ecdsa_read_signature( (ecdsa_context *) ctx,
242 hash, md_info->size, sig, sig_len ) );
243}
244
245static void *ecdsa_alloc_wrap( void )
246{
247 void *ctx = polarssl_malloc( sizeof( ecdsa_context ) );
248
249 if( ctx != NULL )
250 ecdsa_init( (ecdsa_context *) ctx );
251
252 return( ctx );
253}
254
255static void ecdsa_free_wrap( void *ctx )
256{
257 ecdsa_free( (ecdsa_context *) ctx );
258 polarssl_free( ctx );
259}
260
261const pk_info_t ecdsa_info = {
262 POLARSSL_PK_ECDSA,
263 "ECDSA",
264 eckey_get_size, /* Compatible key structures */
265 ecdsa_can_do,
266 ecdsa_verify_wrap,
267 ecdsa_alloc_wrap,
268 ecdsa_free_wrap,
269 eckey_debug, /* Compatible key structures */
270};
271#endif /* POLARSSL_ECDSA_C */