Better support unsigned time_t
[gnupg.git] / g10 / seskey.c
index 6ac83b0..ee5584c 100644 (file)
@@ -1,12 +1,12 @@
 /* seskey.c -  make sesssion keys etc.
  * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004,
- *               2006 Free Software Foundation, Inc.
+ *               2006, 2009 Free Software Foundation, Inc.
  *
  * This file is part of GnuPG.
  *
  * GnuPG is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
+ * the Free Software Foundation; either version 3 of the License, or
  * (at your option) any later version.
  *
  * GnuPG is distributed in the hope that it will be useful,
@@ -15,9 +15,7 @@
  * GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
- * USA.
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
  */
 
 #include <config.h>
@@ -42,12 +40,12 @@ make_session_key( DEK *dek )
     gcry_cipher_hd_t chd;
     int i, rc;
 
-    dek->keylen = gcry_cipher_get_algo_keylen (dek->algo);
+    dek->keylen = openpgp_cipher_get_algo_keylen (dek->algo);
 
-    if (gcry_cipher_open (&chd, dek->algo, GCRY_CIPHER_MODE_CFB,
-                          (GCRY_CIPHER_SECURE
-                           | (dek->algo >= 100 ?
-                              0 : GCRY_CIPHER_ENABLE_SYNC))) )
+    if (openpgp_cipher_open (&chd, dek->algo, GCRY_CIPHER_MODE_CFB,
+                            (GCRY_CIPHER_SECURE
+                             | (dek->algo >= 100 ?
+                                0 : GCRY_CIPHER_ENABLE_SYNC))) )
       BUG();
     gcry_randomize (dek->key, dek->keylen, GCRY_STRONG_RANDOM );
     for (i=0; i < 16; i++ ) 
@@ -208,19 +206,18 @@ do_encode_md( gcry_md_hd_t md, int algo, size_t len, unsigned nbits,
  * bits.
  */
 gcry_mpi_t
-encode_md_value (PKT_public_key *pk, PKT_secret_key *sk,
-                gcry_md_hd_t md, int hash_algo)
+encode_md_value (PKT_public_key *pk, gcry_md_hd_t md, int hash_algo)
 {
   gcry_mpi_t frame;
 
-  assert(hash_algo);
-  assert(pk || sk);
+  assert (hash_algo);
+  assert (pk);
 
-  if((pk?pk->pubkey_algo:sk->pubkey_algo) == GCRY_PK_DSA)
+  if (pk->pubkey_algo == GCRY_PK_DSA)
     {
       /* It's a DSA signature, so find out the size of q. */
 
-      size_t qbytes = gcry_mpi_get_nbits (pk?pk->pkey[1]:sk->skey[1]);
+      size_t qbytes = gcry_mpi_get_nbits (pk->pkey[1]);
 
       /* Make sure it is a multiple of 8 bits. */
 
@@ -239,21 +236,19 @@ encode_md_value (PKT_public_key *pk, PKT_secret_key *sk,
         DSA. ;) */
       if (qbytes < 160)
        {
-         log_error (_("DSA key %s uses an unsafe (%u bit) hash\n"),
-                     pk?keystr_from_pk(pk):keystr_from_sk(sk),
-                     (unsigned int)qbytes);
+         log_error (_("DSA key %s uses an unsafe (%zu bit) hash\n"),
+                     keystr_from_pk (pk), qbytes);
          return NULL;
        }
 
-      qbytes/=8;
+      qbytes /= 8;
 
       /* Check if we're too short.  Too long is safe as we'll
         automatically left-truncate. */
       if (gcry_md_get_algo_dlen (hash_algo) < qbytes)
        {
-         log_error (_("DSA key %s requires a %u bit or larger hash\n"),
-                     pk?keystr_from_pk(pk):keystr_from_sk(sk),
-                     (unsigned int)(qbytes*8));
+         log_error (_("DSA key %s requires a %zu bit or larger hash\n"),
+                     keystr_from_pk(pk), qbytes*8);
          return NULL;
        }
 
@@ -267,18 +262,17 @@ encode_md_value (PKT_public_key *pk, PKT_secret_key *sk,
       byte *asn;
       size_t asnlen;
 
-      rc = gcry_md_test_algo (hash_algo);
-      if (!rc)
-        rc = gcry_md_algo_info (hash_algo, GCRYCTL_GET_ASNOID, NULL, &asnlen);
+      rc = gcry_md_algo_info (hash_algo, GCRYCTL_GET_ASNOID, NULL, &asnlen);
       if (rc)
-        log_fatal ("can't get OID of algo %d: %s\n",
+        log_fatal ("can't get OID of digest algorithm %d: %s\n",
                    hash_algo, gpg_strerror (rc));
-      asn = xmalloc (asnlen);
+      asn = xtrymalloc (asnlen);
+      if (!asn)
+        return NULL;
       if ( gcry_md_algo_info (hash_algo, GCRYCTL_GET_ASNOID, asn, &asnlen) )
         BUG();
       frame = do_encode_md (md, hash_algo, gcry_md_get_algo_dlen (hash_algo),
-                            gcry_mpi_get_nbits (pk?pk->pkey[0]:sk->skey[0]),
-                            asn, asnlen);
+                            gcry_mpi_get_nbits (pk->pkey[0]), asn, asnlen);
       xfree (asn);
     }