gnutls-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[SCM] GNU gnutls branch, master, updated. gnutls_3_1_0-31-gfb39830


From: Nikos Mavrogiannopoulos
Subject: [SCM] GNU gnutls branch, master, updated. gnutls_3_1_0-31-gfb39830
Date: Mon, 27 Aug 2012 16:38:15 +0000

This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU gnutls".

http://git.savannah.gnu.org/cgit/gnutls.git/commit/?id=fb39830546a65c757f3aa473357098f9877dba87

The branch, master has been updated
       via  fb39830546a65c757f3aa473357098f9877dba87 (commit)
       via  e62907fde541e88ed7badd791629ccaf0353bd46 (commit)
      from  ee7f87ef596232c7097a48a7cff2fe16b5bc79da (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit fb39830546a65c757f3aa473357098f9877dba87
Author: Nikos Mavrogiannopoulos <address@hidden>
Date:   Mon Aug 27 18:38:01 2012 +0200

    simplified ECDSA/DSA signature generation in tokens.

commit e62907fde541e88ed7badd791629ccaf0353bd46
Author: Nikos Mavrogiannopoulos <address@hidden>
Date:   Sun Aug 26 23:26:29 2012 +0200

    documented fix

-----------------------------------------------------------------------

Summary of changes:
 NEWS                 |    4 +++
 lib/gnutls_pk.c      |   48 +++++++++++++++++++++++++++++++++++++++----
 lib/gnutls_pk.h      |    4 +++
 lib/pkcs11_privkey.c |   55 ++++++++++++++++++++------------------------------
 4 files changed, 73 insertions(+), 38 deletions(-)

diff --git a/NEWS b/NEWS
index 2707899..e36b2a0 100644
--- a/NEWS
+++ b/NEWS
@@ -11,6 +11,10 @@ assume the PKCS #8 file format, instead of ignoring the 
password.
 
 ** tpmtool: No longer asks for key password in registered keys.
 
+** libgnutls: Fixed DSA and ECDSA signature generation in smart
+cards. Thanks to Andreas Schwier from cardcontact.de for providing
+me with ECDSA capable smart cards.
+
 ** API and ABI modifications:
 gnutls_sign_algorithm_get: Added
 gnutls_sign_get_hash_algorithm: Added
diff --git a/lib/gnutls_pk.c b/lib/gnutls_pk.c
index 8c3b9d3..f65b7da 100644
--- a/lib/gnutls_pk.c
+++ b/lib/gnutls_pk.c
@@ -39,6 +39,48 @@
 /* encodes the Dss-Sig-Value structure
  */
 int
+_gnutls_encode_ber_rs_raw (gnutls_datum_t * sig_value, 
+                           const gnutls_datum_t *r, 
+                           const gnutls_datum_t *s)
+{
+  ASN1_TYPE sig;
+  int result;
+
+  if ((result =
+       asn1_create_element (_gnutls_get_gnutls_asn (),
+                            "GNUTLS.DSASignatureValue",
+                            &sig)) != ASN1_SUCCESS)
+    {
+      gnutls_assert ();
+      return _gnutls_asn2err (result);
+    }
+
+  result = asn1_write_value( sig, "r", r->data, r->size);
+  if (result != ASN1_SUCCESS)
+    {
+      gnutls_assert ();
+      asn1_delete_structure (&sig);
+      return _gnutls_asn2err(result);
+    }
+
+  result = asn1_write_value( sig, "s", s->data, s->size);
+  if (result != ASN1_SUCCESS)
+    {
+      gnutls_assert ();
+      asn1_delete_structure (&sig);
+      return _gnutls_asn2err(result);
+    }
+
+  result = _gnutls_x509_der_encode (sig, "", sig_value, 0);
+  asn1_delete_structure (&sig);
+
+  if (result < 0)
+    return gnutls_assert_val(result);
+
+  return 0;
+}
+
+int
 _gnutls_encode_ber_rs (gnutls_datum_t * sig_value, bigint_t r, bigint_t s)
 {
   ASN1_TYPE sig;
@@ -70,14 +112,10 @@ _gnutls_encode_ber_rs (gnutls_datum_t * sig_value, 
bigint_t r, bigint_t s)
     }
 
   result = _gnutls_x509_der_encode (sig, "", sig_value, 0);
-
   asn1_delete_structure (&sig);
 
   if (result < 0)
-    {
-      gnutls_assert ();
-      return result;
-    }
+    return gnutls_assert_val(result);
 
   return 0;
 }
diff --git a/lib/gnutls_pk.h b/lib/gnutls_pk.h
index ee2b80b..29af4c4 100644
--- a/lib/gnutls_pk.h
+++ b/lib/gnutls_pk.h
@@ -49,6 +49,10 @@ int _gnutls_pk_params_copy (gnutls_pk_params_st * dst, const 
gnutls_pk_params_st
 /* The internal PK interface */
 int
 _gnutls_encode_ber_rs (gnutls_datum_t * sig_value, bigint_t r, bigint_t s);
+int
+_gnutls_encode_ber_rs_raw (gnutls_datum_t * sig_value, 
+                           const gnutls_datum_t *r, 
+                           const gnutls_datum_t *s);
 
 int
 _gnutls_decode_ber_rs (const gnutls_datum_t * sig_value, bigint_t * r,
diff --git a/lib/pkcs11_privkey.c b/lib/pkcs11_privkey.c
index 43e3877..3a6ce09 100644
--- a/lib/pkcs11_privkey.c
+++ b/lib/pkcs11_privkey.c
@@ -148,22 +148,6 @@ gnutls_pkcs11_privkey_get_info (gnutls_pkcs11_privkey_t 
pkey,
        } while (0);
 
 
-static int read_rs(bigint_t *r, bigint_t *s, uint8_t *data, size_t data_size)
-{
-unsigned int dhalf = data_size/2;
-
-  if (_gnutls_mpi_scan_nz (r, data, dhalf) != 0)
-    return gnutls_assert_val(GNUTLS_E_MPI_SCAN_FAILED);
-
-  if (_gnutls_mpi_scan_nz (s, &data[dhalf], dhalf) != 0)
-    {
-      _gnutls_mpi_release(r);
-      return gnutls_assert_val(GNUTLS_E_MPI_SCAN_FAILED);
-    }
-
-  return 0;
-}
-
 /*-
  * _gnutls_pkcs11_privkey_sign_hash:
  * @key: Holds the key
@@ -185,6 +169,7 @@ _gnutls_pkcs11_privkey_sign_hash (gnutls_pkcs11_privkey_t 
key,
   ck_rv_t rv;
   int ret;
   struct ck_mechanism mech;
+  gnutls_datum_t tmp = {NULL, 0};
   unsigned long siglen;
   struct pkcs11_session_info _sinfo;
   struct pkcs11_session_info *sinfo;
@@ -225,23 +210,22 @@ _gnutls_pkcs11_privkey_sign_hash (gnutls_pkcs11_privkey_t 
key,
       goto cleanup;
     }
 
-  signature->data = gnutls_malloc (siglen);
-  signature->size = siglen;
+  tmp.data = gnutls_malloc (siglen);
+  tmp.size = siglen;
 
-  rv = pkcs11_sign (sinfo->module, sinfo->pks, hash->data, hash->size, 
signature->data, &siglen);
+  rv = pkcs11_sign (sinfo->module, sinfo->pks, hash->data, hash->size, 
tmp.data, &siglen);
   if (rv != CKR_OK)
     {
-      gnutls_free (signature->data);
       gnutls_assert ();
       ret = pkcs11_rv_to_err (rv);
       goto cleanup;
     }
 
-  signature->size = siglen;
   
   if (key->pk_algorithm == GNUTLS_PK_EC || key->pk_algorithm == GNUTLS_PK_DSA)
     {
-      bigint_t r,s;
+      unsigned int hlen = siglen / 2;
+      gnutls_datum_t r, s;
 
       if (siglen % 2 != 0)
         {
@@ -250,23 +234,26 @@ _gnutls_pkcs11_privkey_sign_hash (gnutls_pkcs11_privkey_t 
key,
           goto cleanup;
         }
 
-      ret = read_rs(&r, &s, signature->data, signature->size);
-      if (ret < 0)
-        {
-          gnutls_assert();
-          goto cleanup;
-        }
-      
-      gnutls_free(signature->data);
-      ret = _gnutls_encode_ber_rs (signature, r, s);
-      _gnutls_mpi_release(&r);
-      _gnutls_mpi_release(&s);
+      r.data = tmp.data;
+      r.size = hlen;
+
+      s.data = &tmp.data[hlen];
+      s.size = hlen;
       
+      ret = _gnutls_encode_ber_rs_raw (signature, &r, &s);
       if (ret < 0)
         {
           gnutls_assert();
           goto cleanup;
         }
+
+      gnutls_free(tmp.data);
+      tmp.data = NULL;
+    }
+  else
+    {
+      signature->size = siglen;
+      signature->data = tmp.data;
     }
 
   ret = 0;
@@ -274,6 +261,8 @@ _gnutls_pkcs11_privkey_sign_hash (gnutls_pkcs11_privkey_t 
key,
 cleanup:
   if (sinfo != &key->sinfo)
     pkcs11_close_session (sinfo);
+  if (ret < 0)
+    gnutls_free(tmp.data);
 
   return ret;
 }


hooks/post-receive
-- 
GNU gnutls



reply via email to

[Prev in Thread] Current Thread [Next in Thread]