Introduce pk_sign() and use it in ssl
diff --git a/library/pk_wrap.c b/library/pk_wrap.c
index 249f7bd..eb91d89 100644
--- a/library/pk_wrap.c
+++ b/library/pk_wrap.c
@@ -69,6 +69,17 @@
RSA_PUBLIC, md_alg, hash_len, hash, sig ) );
}
+static int rsa_sign_wrap( void *ctx, md_type_t md_alg,
+ const unsigned char *hash, size_t hash_len,
+ unsigned char *sig, size_t *sig_len,
+ int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )
+{
+ *sig_len = ((rsa_context *) ctx)->len;
+
+ return( rsa_pkcs1_sign( (rsa_context *) ctx, f_rng, p_rng, RSA_PRIVATE,
+ md_alg, hash_len, hash, sig ) );
+}
+
static void *rsa_alloc_wrap( void )
{
void *ctx = polarssl_malloc( sizeof( rsa_context ) );
@@ -104,6 +115,7 @@
rsa_get_size,
rsa_can_do,
rsa_verify_wrap,
+ rsa_sign_wrap,
rsa_alloc_wrap,
rsa_free_wrap,
rsa_debug,
@@ -127,11 +139,16 @@
}
#if defined(POLARSSL_ECDSA_C)
-/* Forward declaration */
+/* Forward declarations */
static int ecdsa_verify_wrap( void *ctx, md_type_t md_alg,
const unsigned char *hash, size_t hash_len,
const unsigned char *sig, size_t sig_len );
+static int ecdsa_sign_wrap( void *ctx, md_type_t md_alg,
+ const unsigned char *hash, size_t hash_len,
+ unsigned char *sig, size_t *sig_len,
+ int (*f_rng)(void *, unsigned char *, size_t), void *p_rng );
+
static int eckey_verify_wrap( void *ctx, md_type_t md_alg,
const unsigned char *hash, size_t hash_len,
const unsigned char *sig, size_t sig_len )
@@ -148,6 +165,26 @@
return( ret );
}
+
+static int eckey_sign_wrap( void *ctx, md_type_t md_alg,
+ const unsigned char *hash, size_t hash_len,
+ unsigned char *sig, size_t *sig_len,
+ int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )
+{
+ int ret;
+ ecdsa_context ecdsa;
+
+ ecdsa_init( &ecdsa );
+
+ if( ( ret = ecdsa_from_keypair( &ecdsa, ctx ) ) == 0 )
+ ret = ecdsa_sign_wrap( &ecdsa, md_alg, hash, hash_len, sig, sig_len,
+ f_rng, p_rng );
+
+ ecdsa_free( &ecdsa );
+
+ return( ret );
+}
+
#endif /* POLARSSL_ECDSA_C */
static void *eckey_alloc_wrap( void )
@@ -180,8 +217,10 @@
eckey_can_do,
#if defined(POLARSSL_ECDSA_C)
eckey_verify_wrap,
+ eckey_sign_wrap,
#else
NULL,
+ NULL,
#endif
eckey_alloc_wrap,
eckey_free_wrap,
@@ -203,6 +242,7 @@
eckey_get_size, /* Same underlying key structure */
eckeydh_can_do,
NULL,
+ NULL,
eckey_alloc_wrap, /* Same underlying key structure */
eckey_free_wrap, /* Same underlying key structure */
eckey_debug, /* Same underlying key structure */
@@ -225,6 +265,17 @@
hash, hash_len, sig, sig_len ) );
}
+static int ecdsa_sign_wrap( void *ctx, md_type_t md_alg,
+ const unsigned char *hash, size_t hash_len,
+ unsigned char *sig, size_t *sig_len,
+ int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )
+{
+ ((void) md_alg);
+
+ return( ecdsa_write_signature( (ecdsa_context *) ctx,
+ hash, hash_len, sig, sig_len, f_rng, p_rng ) );
+}
+
static void *ecdsa_alloc_wrap( void )
{
void *ctx = polarssl_malloc( sizeof( ecdsa_context ) );
@@ -247,6 +298,7 @@
eckey_get_size, /* Compatible key structures */
ecdsa_can_do,
ecdsa_verify_wrap,
+ ecdsa_sign_wrap,
ecdsa_alloc_wrap,
ecdsa_free_wrap,
eckey_debug, /* Compatible key structures */