Fixed one serious bug, working on another. Still very broken.
[oweals/gnunet.git] / src / util / test_crypto_rsa.c
index e58a0960a0600384d99db5334f044d7cedfd99ad..70b388b8f768990bd17702371a386681e07fec3c 100644 (file)
@@ -1,6 +1,6 @@
 /*
   This file is part of GNUnet
-  (C) 2014 Christian Grothoff (and other contributing authors)
+  Copyright (C) 2014,2015 Christian Grothoff (and other contributing authors)
 
   GNUnet 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
@@ -32,9 +32,12 @@ main (int argc,
 #define RND_BLK_SIZE 4096
   unsigned char rnd_blk[RND_BLK_SIZE];
   struct GNUNET_CRYPTO_rsa_PrivateKey *priv;
+  struct GNUNET_CRYPTO_rsa_PrivateKey *priv_copy;
   struct GNUNET_CRYPTO_rsa_PublicKey *pub;
+  struct GNUNET_CRYPTO_rsa_PublicKey *pub_copy;
   struct GNUNET_CRYPTO_rsa_BlindingKey *bkey;
   struct GNUNET_CRYPTO_rsa_Signature *sig;
+  struct GNUNET_CRYPTO_rsa_Signature *sig_copy;
   struct GNUNET_CRYPTO_rsa_Signature *bsig;
   struct GNUNET_HashCode hash;
   char *blind_buf;
@@ -48,14 +51,37 @@ main (int argc,
                       RND_BLK_SIZE,
                       &hash);
   priv = GNUNET_CRYPTO_rsa_private_key_create (KEY_SIZE);
+  priv_copy = GNUNET_CRYPTO_rsa_private_key_dup (priv);
+  GNUNET_assert (NULL != priv_copy);
+  GNUNET_assert (0 == GNUNET_CRYPTO_rsa_private_key_cmp (priv, priv_copy));
   pub = GNUNET_CRYPTO_rsa_private_key_get_public (priv);
+  /* Encoding */
+  size_t size;
+  char *enc;
+  enc = NULL;
+  size = GNUNET_CRYPTO_rsa_private_key_encode (priv, &enc);
+  /* Decoding */
+  GNUNET_CRYPTO_rsa_private_key_free (priv);
+  priv = NULL;
+  priv = GNUNET_CRYPTO_rsa_private_key_decode (enc, size);
+  GNUNET_assert (NULL != priv);
+  GNUNET_CRYPTO_random_block (GNUNET_CRYPTO_QUALITY_WEAK,
+                              enc, size);
+  GNUNET_assert (NULL == GNUNET_CRYPTO_rsa_private_key_decode (enc, size));
+  (void) fprintf (stderr, "The above warning is expected.\n");
+  GNUNET_free (enc);
+
   /* try ordinary sig first */
   sig = GNUNET_CRYPTO_rsa_sign (priv,
                         &hash,
                         sizeof (hash));
+  sig_copy = GNUNET_CRYPTO_rsa_signature_dup (sig);
+  GNUNET_assert (NULL != sig);
+  GNUNET_assert (0 == GNUNET_CRYPTO_rsa_signature_cmp (sig, sig_copy));
+  pub_copy = GNUNET_CRYPTO_rsa_public_key_dup (pub);
+  GNUNET_assert (NULL != pub_copy);
   GNUNET_assert (GNUNET_OK ==
-                 GNUNET_CRYPTO_rsa_verify (&hash, sig, pub));
-  GNUNET_CRYPTO_rsa_signature_free (sig);
+                 GNUNET_CRYPTO_rsa_verify (&hash, sig, pub_copy));
   /* corrupt our hash and see if the signature is still valid */
   GNUNET_CRYPTO_random_block (GNUNET_CRYPTO_QUALITY_WEAK, &hash,
                               sizeof (struct GNUNET_HashCode));
@@ -63,6 +89,7 @@ main (int argc,
                                                         sig,
                                                         pub));
   (void) fprintf (stderr, "The above warning is expected.\n");
+  GNUNET_CRYPTO_rsa_signature_free (sig);
 
 
   /* test blind signing */
@@ -83,8 +110,11 @@ main (int argc,
   GNUNET_assert (GNUNET_OK ==
                  GNUNET_CRYPTO_rsa_verify (&hash, sig, pub));
   GNUNET_CRYPTO_rsa_signature_free (sig);
+  GNUNET_CRYPTO_rsa_signature_free (sig_copy);
   GNUNET_CRYPTO_rsa_private_key_free (priv);
+  GNUNET_CRYPTO_rsa_private_key_free (priv_copy);
   GNUNET_CRYPTO_rsa_public_key_free (pub);
+  GNUNET_CRYPTO_rsa_public_key_free (pub_copy);
   GNUNET_CRYPTO_rsa_blinding_key_free (bkey);
   return 0;
 }