00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "polarssl/config.h"
00027
00028 #if defined(POLARSSL_PK_C)
00029
00030 #include "polarssl/pk.h"
00031 #include "polarssl/pk_wrap.h"
00032
00033 #if defined(POLARSSL_RSA_C)
00034 #include "polarssl/rsa.h"
00035 #endif
00036 #if defined(POLARSSL_ECP_C)
00037 #include "polarssl/ecp.h"
00038 #endif
00039 #if defined(POLARSSL_ECDSA_C)
00040 #include "polarssl/ecdsa.h"
00041 #endif
00042
00043
00044
00045
00046 void pk_init( pk_context *ctx )
00047 {
00048 if( ctx == NULL )
00049 return;
00050
00051 ctx->pk_info = NULL;
00052 ctx->pk_ctx = NULL;
00053 }
00054
00055
00056
00057
00058 void pk_free( pk_context *ctx )
00059 {
00060 if( ctx == NULL || ctx->pk_info == NULL)
00061 return;
00062
00063 ctx->pk_info->ctx_free_func( ctx->pk_ctx );
00064 ctx->pk_ctx = NULL;
00065
00066 ctx->pk_info = NULL;
00067 }
00068
00069
00070
00071
00072 const pk_info_t * pk_info_from_type( pk_type_t pk_type )
00073 {
00074 switch( pk_type ) {
00075 #if defined(POLARSSL_RSA_C)
00076 case POLARSSL_PK_RSA:
00077 return &rsa_info;
00078 #endif
00079 #if defined(POLARSSL_ECP_C)
00080 case POLARSSL_PK_ECKEY:
00081 return &eckey_info;
00082 case POLARSSL_PK_ECKEY_DH:
00083 return &eckeydh_info;
00084 #endif
00085 #if defined(POLARSSL_ECDSA_C)
00086 case POLARSSL_PK_ECDSA:
00087 return &ecdsa_info;
00088 #endif
00089
00090 default:
00091 return NULL;
00092 }
00093 }
00094
00095
00096
00097
00098 int pk_init_ctx( pk_context *ctx, const pk_info_t *info )
00099 {
00100 if( ctx == NULL || info == NULL || ctx->pk_info != NULL )
00101 return( POLARSSL_ERR_PK_BAD_INPUT_DATA );
00102
00103 if( ( ctx->pk_ctx = info->ctx_alloc_func() ) == NULL )
00104 return( POLARSSL_ERR_PK_MALLOC_FAILED );
00105
00106 ctx->pk_info = info;
00107
00108 return( 0 );
00109 }
00110
00111
00112
00113
00114 int pk_init_ctx_rsa_alt( pk_context *ctx, void * key,
00115 pk_rsa_alt_decrypt_func decrypt_func,
00116 pk_rsa_alt_sign_func sign_func,
00117 pk_rsa_alt_key_len_func key_len_func )
00118 {
00119 rsa_alt_context *rsa_alt;
00120 const pk_info_t *info = &rsa_alt_info;
00121
00122 if( ctx == NULL || ctx->pk_info != NULL )
00123 return( POLARSSL_ERR_PK_BAD_INPUT_DATA );
00124
00125 if( ( ctx->pk_ctx = info->ctx_alloc_func() ) == NULL )
00126 return( POLARSSL_ERR_PK_MALLOC_FAILED );
00127
00128 ctx->pk_info = info;
00129
00130 rsa_alt = (rsa_alt_context *) ctx->pk_ctx;
00131
00132 rsa_alt->key = key;
00133 rsa_alt->decrypt_func = decrypt_func;
00134 rsa_alt->sign_func = sign_func;
00135 rsa_alt->key_len_func = key_len_func;
00136
00137 return( 0 );
00138 }
00139
00140
00141
00142
00143 int pk_can_do( pk_context *ctx, pk_type_t type )
00144 {
00145
00146 if( ctx == NULL || ctx->pk_info == NULL )
00147 return( 0 );
00148
00149 return( ctx->pk_info->can_do( type ) );
00150 }
00151
00152
00153
00154
00155 static inline int pk_hashlen_helper( md_type_t md_alg, size_t *hash_len )
00156 {
00157 const md_info_t *md_info;
00158
00159 if( *hash_len != 0 )
00160 return( 0 );
00161
00162 if( ( md_info = md_info_from_type( md_alg ) ) == NULL )
00163 return( -1 );
00164
00165 *hash_len = md_info->size;
00166 return( 0 );
00167 }
00168
00169
00170
00171
00172 int pk_verify( pk_context *ctx, md_type_t md_alg,
00173 const unsigned char *hash, size_t hash_len,
00174 const unsigned char *sig, size_t sig_len )
00175 {
00176 if( ctx == NULL || ctx->pk_info == NULL ||
00177 pk_hashlen_helper( md_alg, &hash_len ) != 0 )
00178 return( POLARSSL_ERR_PK_BAD_INPUT_DATA );
00179
00180 if( ctx->pk_info->verify_func == NULL )
00181 return( POLARSSL_ERR_PK_TYPE_MISMATCH );
00182
00183 return( ctx->pk_info->verify_func( ctx->pk_ctx, md_alg, hash, hash_len,
00184 sig, sig_len ) );
00185 }
00186
00187
00188
00189
00190 int pk_sign( pk_context *ctx, md_type_t md_alg,
00191 const unsigned char *hash, size_t hash_len,
00192 unsigned char *sig, size_t *sig_len,
00193 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )
00194 {
00195 if( ctx == NULL || ctx->pk_info == NULL ||
00196 pk_hashlen_helper( md_alg, &hash_len ) != 0 )
00197 return( POLARSSL_ERR_PK_BAD_INPUT_DATA );
00198
00199 if( ctx->pk_info->sign_func == NULL )
00200 return( POLARSSL_ERR_PK_TYPE_MISMATCH );
00201
00202 return( ctx->pk_info->sign_func( ctx->pk_ctx, md_alg, hash, hash_len,
00203 sig, sig_len, f_rng, p_rng ) );
00204 }
00205
00206
00207
00208
00209 int pk_decrypt( pk_context *ctx,
00210 const unsigned char *input, size_t ilen,
00211 unsigned char *output, size_t *olen, size_t osize,
00212 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )
00213 {
00214 if( ctx == NULL || ctx->pk_info == NULL )
00215 return( POLARSSL_ERR_PK_BAD_INPUT_DATA );
00216
00217 if( ctx->pk_info->decrypt_func == NULL )
00218 return( POLARSSL_ERR_PK_TYPE_MISMATCH );
00219
00220 return( ctx->pk_info->decrypt_func( ctx->pk_ctx, input, ilen,
00221 output, olen, osize, f_rng, p_rng ) );
00222 }
00223
00224
00225
00226
00227 int pk_encrypt( pk_context *ctx,
00228 const unsigned char *input, size_t ilen,
00229 unsigned char *output, size_t *olen, size_t osize,
00230 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )
00231 {
00232 if( ctx == NULL || ctx->pk_info == NULL )
00233 return( POLARSSL_ERR_PK_BAD_INPUT_DATA );
00234
00235 if( ctx->pk_info->encrypt_func == NULL )
00236 return( POLARSSL_ERR_PK_TYPE_MISMATCH );
00237
00238 return( ctx->pk_info->encrypt_func( ctx->pk_ctx, input, ilen,
00239 output, olen, osize, f_rng, p_rng ) );
00240 }
00241
00242
00243
00244
00245 size_t pk_get_size( const pk_context *ctx )
00246 {
00247 if( ctx == NULL || ctx->pk_info == NULL )
00248 return( 0 );
00249
00250 return( ctx->pk_info->get_size( ctx->pk_ctx ) );
00251 }
00252
00253
00254
00255
00256 int pk_debug( const pk_context *ctx, pk_debug_item *items )
00257 {
00258 if( ctx == NULL || ctx->pk_info == NULL )
00259 return( POLARSSL_ERR_PK_BAD_INPUT_DATA );
00260
00261 ctx->pk_info->debug_func( ctx->pk_ctx, items );
00262 return( 0 );
00263 }
00264
00265
00266
00267
00268 const char * pk_get_name( const pk_context *ctx )
00269 {
00270 if( ctx == NULL || ctx->pk_info == NULL )
00271 return( "invalid PK" );
00272
00273 return( ctx->pk_info->name );
00274 }
00275
00276
00277
00278
00279 pk_type_t pk_get_type( const pk_context *ctx )
00280 {
00281 if( ctx == NULL || ctx->pk_info == NULL )
00282 return( POLARSSL_PK_NONE );
00283
00284 return( ctx->pk_info->type );
00285 }
00286
00287 #endif