Move pk_encrypt into pkglue.c.
authorNIIBE Yutaka <gniibe@fsij.org>
Wed, 18 Jan 2017 02:11:19 +0000 (11:11 +0900)
committerNIIBE Yutaka <gniibe@fsij.org>
Wed, 18 Jan 2017 02:11:19 +0000 (11:11 +0900)
* src/x509.c (_ntbtls_x509_pk_encrypt): Renaming and move to...
* src/pkglue.c (_ntbtls_pk_encrypt): Here.  Use _ntbtls_x509_get_pk.
* src/protocol-cli.c (write_encrypted_pms): Follow the rename.

Signed-off-by: NIIBE Yutaka <gniibe@fsij.org>
src/ntbtls-int.h
src/pkglue.c
src/protocol-cli.c
src/x509.c

index eb5db10..21b28f9 100644 (file)
@@ -342,6 +342,9 @@ gpg_error_t _ntbtls_pk_verify (x509_cert_t chain,
                                const unsigned char *hash, size_t hashlen,
                                const unsigned char *sig, size_t siglen);
 
+gpg_error_t _ntbtls_pk_encrypt (x509_cert_t chain, const unsigned char *input,
+                                size_t ilen, unsigned char *output,
+                                size_t *olen, size_t osize);
 
 /*-- x509.c --*/
 
@@ -376,10 +379,6 @@ gpg_error_t _ntbtls_x509_verify (x509_cert_t cert, x509_cert_t trust_ca,
 
 int _ntbtls_x509_can_do (x509_privkey_t privkey, pk_algo_t pkalgo);
 
-gpg_error_t _ntbtls_x509_pk_encrypt (x509_cert_t cert,
-                                     const unsigned char *input, size_t ilen,
-                                     unsigned char *output, size_t *olen,
-                                     size_t osize);
 
 /*-- dhm.c --*/
 gpg_error_t _ntbtls_dhm_new (dhm_context_t *r_dhm);
index a6910db..45f388b 100644 (file)
@@ -158,3 +158,53 @@ _ntbtls_pk_verify (x509_cert_t chain, pk_algo_t pk_alg, md_algo_t md_alg,
   gcry_sexp_release (s_sig);
   return err;
 }
+
+gpg_error_t
+_ntbtls_pk_encrypt (x509_cert_t chain,
+                    const unsigned char *input, size_t ilen,
+                    unsigned char *output, size_t *olen, size_t osize)
+{
+  gpg_error_t err;
+  gcry_sexp_t s_pk = NULL;
+  gcry_sexp_t s_data = NULL;
+  gcry_sexp_t s_ciph = NULL;
+  size_t len;
+  const char *data;
+
+  /* Get the public key from the first certificate.  */
+  err = _ntbtls_x509_get_pk (chain, 0, &s_pk);
+  if (err)
+    return err;
+
+  err = gcry_sexp_build (&s_data, NULL, "(data (flags pkcs1) (value %b))",
+                         (int)ilen, input);
+  if (err)
+    {
+      gcry_sexp_release (s_pk);
+      return err;
+    }
+
+  err = gcry_pk_encrypt (&s_ciph, s_data, s_pk);
+  gcry_sexp_release (s_data);
+  s_data = NULL;
+  gcry_sexp_release (s_pk);
+  s_pk = NULL;
+  if (err)
+    return err;
+
+  s_data = gcry_sexp_find_token (s_ciph, "a", 0);
+  data = gcry_sexp_nth_data (s_data, 1, &len);
+  if (data == NULL)
+    err = gpg_error (GPG_ERR_BAD_MPI);
+  else if (osize < len)
+    err = gpg_error (GPG_ERR_TOO_SHORT);
+  else
+    {
+      *olen = len;
+      memcpy (output, data, len);
+    }
+
+  gcry_sexp_release (s_data);
+  gcry_sexp_release (s_ciph);
+  return err;
+}
index 7740a5f..787f11f 100644 (file)
@@ -1214,10 +1214,10 @@ write_encrypted_pms (ntbtls_t tls,
   /*     return gpg_error (GPG_ERR_WRONG_PUBKEY_ALGO); */
   /*   } */
 
-  err = _ntbtls_x509_pk_encrypt (tls->session_negotiate->peer_chain,
-                                 p, tls->handshake->pmslen,
-                                 tls->out_msg + offset + len_bytes, olen,
-                                 TLS_MAX_CONTENT_LEN - offset - len_bytes);
+  err = _ntbtls_pk_encrypt (tls->session_negotiate->peer_chain,
+                            p, tls->handshake->pmslen,
+                            tls->out_msg + offset + len_bytes, olen,
+                            TLS_MAX_CONTENT_LEN - offset - len_bytes);
   if (err)
     {
       debug_ret (1, "rsa_pkcs1_encrypt", err);
index 1439a3d..8c497f9 100644 (file)
@@ -209,64 +209,3 @@ _ntbtls_x509_can_do (x509_privkey_t privkey, pk_algo_t pk_alg)
   /* FIXME: Check that PRIVKEY matches PKALGO.  */
   return 1;
 }
-
-gpg_error_t
-_ntbtls_x509_pk_encrypt (x509_cert_t cert,
-                         const unsigned char *input, size_t ilen,
-                         unsigned char *output, size_t *olen, size_t osize)
-{
-  gpg_error_t err;
-  ksba_sexp_t buf;
-  size_t len;
-  gcry_sexp_t s_ciph, s_data, s_pkey;
-  const char *data;
-
-  buf = ksba_cert_get_public_key (cert->crt);
-  if (!buf)
-    return gpg_error (GPG_ERR_NO_PUBKEY);
-
-  len = gcry_sexp_canon_len (buf, 0, NULL, NULL);
-  if (!len)
-    return gpg_error (GPG_ERR_BUG);
-
-  err = gcry_sexp_sscan (&s_pkey, NULL, (char*)buf, len);
-  free (buf);
-  buf = NULL;
-  if (err)
-    return err;
-
-  err = gcry_sexp_build (&s_data, NULL, "(data (flags pkcs1) (value %b))",
-                         (int)ilen, input);
-  if (err)
-    {
-      gcry_sexp_release (s_pkey);
-      return err;
-    }
-
-  err = gcry_pk_encrypt (&s_ciph, s_data, s_pkey);
-  gcry_sexp_release (s_pkey);
-  gcry_sexp_release (s_data);
-  if (err)
-    return err;
-
-  s_data = gcry_sexp_find_token (s_ciph, "a", 0);
-  data = gcry_sexp_nth_data (s_data, 1, &len);
-  if (data == NULL)
-    {
-      gcry_sexp_release (s_data);
-      gcry_sexp_release (s_ciph);
-      return gpg_error (GPG_ERR_BAD_MPI);
-    }
-
-  if (osize < len)
-    {
-      gcry_sexp_release (s_data);
-      gcry_sexp_release (s_ciph);
-      return gpg_error (GPG_ERR_TOO_SHORT);
-    }
-  *olen = len;
-  memcpy (output, data, len);
-  gcry_sexp_release (s_data);
-  gcry_sexp_release (s_ciph);
-  return 0;
-}