Simplify ecdsa_context
diff --git a/library/ecdsa.c b/library/ecdsa.c
index f1a48ff..57f8035 100644
--- a/library/ecdsa.c
+++ b/library/ecdsa.c
@@ -284,7 +284,7 @@
 /*
  * Convert a signature (given by context) to ASN.1
  */
-static int ecdsa_signature_to_asn1( ecdsa_context *ctx,
+static int ecdsa_signature_to_asn1( const mpi *r, const mpi *s,
                                     unsigned char *sig, size_t *slen )
 {
     int ret;
@@ -292,8 +292,8 @@
     unsigned char *p = buf + sizeof( buf );
     size_t len = 0;
 
-    ASN1_CHK_ADD( len, asn1_write_mpi( &p, buf, &ctx->s ) );
-    ASN1_CHK_ADD( len, asn1_write_mpi( &p, buf, &ctx->r ) );
+    ASN1_CHK_ADD( len, asn1_write_mpi( &p, buf, s ) );
+    ASN1_CHK_ADD( len, asn1_write_mpi( &p, buf, r ) );
 
     ASN1_CHK_ADD( len, asn1_write_len( &p, buf, len ) );
     ASN1_CHK_ADD( len, asn1_write_tag( &p, buf,
@@ -315,23 +315,31 @@
                            void *p_rng )
 {
     int ret;
+    mpi r, s;
+
+    mpi_init( &r );
+    mpi_init( &s );
 
 #if defined(POLARSSL_ECDSA_DETERMINISTIC)
     (void) f_rng;
     (void) p_rng;
 
-    ret = ecdsa_sign_det( &ctx->grp, &ctx->r, &ctx->s, &ctx->d,
-                          hash, hlen, md_alg );
+    MPI_CHK( ecdsa_sign_det( &ctx->grp, &r, &s, &ctx->d,
+                             hash, hlen, md_alg ) );
 #else
     (void) md_alg;
 
-    ret = ecdsa_sign( &ctx->grp, &ctx->r, &ctx->s, &ctx->d,
-                      hash, hlen, f_rng, p_rng );
+    MPI_CHK( ecdsa_sign( &ctx->grp, &r, &s, &ctx->d,
+                         hash, hlen, f_rng, p_rng ) );
 #endif
-    if( ret != 0 )
-        return( ret );
 
-    return( ecdsa_signature_to_asn1( ctx, sig, slen ) );
+    MPI_CHK( ecdsa_signature_to_asn1( &r, &s, sig, slen ) );
+
+cleanup:
+    mpi_free( &r );
+    mpi_free( &s );
+
+    return( ret );
 }
 
 #if ! defined(POLARSSL_DEPRECATED_REMOVED)
@@ -340,7 +348,7 @@
                                unsigned char *sig, size_t *slen,
                                md_type_t md_alg )
 {
-    return( ecdsa_write_signature( ctx, md_ald, hash, hlen, sig, siglen,
+    return( ecdsa_write_signature( ctx, md_alg, hash, hlen, sig, slen,
                                    NULL, NULL ) );
 }
 #endif
@@ -356,29 +364,44 @@
     unsigned char *p = (unsigned char *) sig;
     const unsigned char *end = sig + slen;
     size_t len;
+    mpi r, s;
+
+    mpi_init( &r );
+    mpi_init( &s );
 
     if( ( ret = asn1_get_tag( &p, end, &len,
                     ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 )
     {
-        return( POLARSSL_ERR_ECP_BAD_INPUT_DATA + ret );
+        ret += POLARSSL_ERR_ECP_BAD_INPUT_DATA;
+        goto cleanup;
     }
 
     if( p + len != end )
-        return( POLARSSL_ERR_ECP_BAD_INPUT_DATA +
-                POLARSSL_ERR_ASN1_LENGTH_MISMATCH );
+    {
+        ret = POLARSSL_ERR_ECP_BAD_INPUT_DATA +
+              POLARSSL_ERR_ASN1_LENGTH_MISMATCH;
+        goto cleanup;
+    }
 
-    if( ( ret = asn1_get_mpi( &p, end, &ctx->r ) ) != 0 ||
-        ( ret = asn1_get_mpi( &p, end, &ctx->s ) ) != 0 )
-        return( POLARSSL_ERR_ECP_BAD_INPUT_DATA + ret );
+    if( ( ret = asn1_get_mpi( &p, end, &r ) ) != 0 ||
+        ( ret = asn1_get_mpi( &p, end, &s ) ) != 0 )
+    {
+        ret += POLARSSL_ERR_ECP_BAD_INPUT_DATA;
+        goto cleanup;
+    }
 
     if( ( ret = ecdsa_verify( &ctx->grp, hash, hlen,
-                              &ctx->Q, &ctx->r, &ctx->s ) ) != 0 )
-        return( ret );
+                              &ctx->Q, &r, &s ) ) != 0 )
+        goto cleanup;
 
     if( p != end )
-        return( POLARSSL_ERR_ECP_SIG_LEN_MISMATCH );
+        ret = POLARSSL_ERR_ECP_SIG_LEN_MISMATCH;
 
-    return( 0 );
+cleanup:
+    mpi_free( &r );
+    mpi_free( &s );
+
+    return( ret );
 }
 
 /*
@@ -413,11 +436,7 @@
  */
 void ecdsa_init( ecdsa_context *ctx )
 {
-    ecp_group_init( &ctx->grp );
-    mpi_init( &ctx->d );
-    ecp_point_init( &ctx->Q );
-    mpi_init( &ctx->r );
-    mpi_init( &ctx->s );
+    ecp_keypair_init( ctx );
 }
 
 /*
@@ -425,11 +444,7 @@
  */
 void ecdsa_free( ecdsa_context *ctx )
 {
-    ecp_group_free( &ctx->grp );
-    mpi_free( &ctx->d );
-    ecp_point_free( &ctx->Q );
-    mpi_free( &ctx->r );
-    mpi_free( &ctx->s );
+    ecp_keypair_free( ctx );
 }
 
 #endif /* POLARSSL_ECDSA_C */