summaryrefslogtreecommitdiff
path: root/src/exchangedb
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2016-05-06 18:33:02 +0200
committerChristian Grothoff <christian@grothoff.org>2016-05-06 18:33:02 +0200
commit3526c44a38195aaea2ab48a220728df175ab9429 (patch)
treea2aaf925bb0a73658febb175720c4996ea6e1571 /src/exchangedb
parentc334ba61f4b371755cc3e4e5afd22fc4054c0836 (diff)
downloadexchange-3526c44a38195aaea2ab48a220728df175ab9429.tar.gz
exchange-3526c44a38195aaea2ab48a220728df175ab9429.tar.bz2
exchange-3526c44a38195aaea2ab48a220728df175ab9429.zip
refactor code to write signing keys in same module where we read them
Diffstat (limited to 'src/exchangedb')
-rw-r--r--src/exchangedb/exchangedb_keyio.c57
-rw-r--r--src/exchangedb/test_exchangedb_keyio.c59
2 files changed, 112 insertions, 4 deletions
diff --git a/src/exchangedb/exchangedb_keyio.c b/src/exchangedb/exchangedb_keyio.c
index 5f29cb0d8..773fc9284 100644
--- a/src/exchangedb/exchangedb_keyio.c
+++ b/src/exchangedb/exchangedb_keyio.c
@@ -114,6 +114,63 @@ TALER_EXCHANGEDB_signing_keys_iterate (const char *exchange_base_dir,
/**
+ * Obtain the name of the directory we use to store signing
+ * keys created at time @a start.
+ *
+ * @param start time at which we create the signing key
+ * @return name of the directory we should use, basically "$EXCHANGEDIR/$TIME/";
+ * (valid until next call to this function)
+ */
+static char *
+get_signkey_file (const char *exchange_directory,
+ struct GNUNET_TIME_Absolute start)
+{
+ char *dir;
+
+ GNUNET_asprintf (&dir,
+ "%s" DIR_SEPARATOR_STR TALER_EXCHANGEDB_DIR_SIGNING_KEYS DIR_SEPARATOR_STR "%llu",
+ exchange_directory,
+ (unsigned long long) start.abs_value_us);
+ return dir;
+}
+
+
+/**
+ * Exports a signing key to the given file.
+ *
+ * @param exchange_base_dir base directory for the keys
+ * @param start start time of the validity for the key
+ * @param ski the signing key
+ * @return #GNUNET_OK upon success; #GNUNET_SYSERR upon failure.
+ */
+int
+TALER_EXCHANGEDB_signing_key_write (const char *exchange_base_dir,
+ struct GNUNET_TIME_Absolute start,
+ const struct TALER_EXCHANGEDB_PrivateSigningKeyInformationP *ski)
+{
+ char *skf;
+ ssize_t nwrite;
+
+ skf = get_signkey_file (exchange_base_dir,
+ start);
+ nwrite = GNUNET_DISK_fn_write (skf,
+ ski,
+ sizeof (struct TALER_EXCHANGEDB_PrivateSigningKeyInformationP),
+ GNUNET_DISK_PERM_USER_WRITE | GNUNET_DISK_PERM_USER_READ);
+ if (sizeof (struct TALER_EXCHANGEDB_PrivateSigningKeyInformationP) != nwrite)
+ {
+ GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_ERROR,
+ "write",
+ skf);
+ GNUNET_free (skf);
+ return GNUNET_SYSERR;
+ }
+ GNUNET_free (skf);
+ return GNUNET_OK;
+}
+
+
+/**
* Import a denomination key from the given file.
*
* @param filename the file to import the key from
diff --git a/src/exchangedb/test_exchangedb_keyio.c b/src/exchangedb/test_exchangedb_keyio.c
index 2485da8ae..ab68f9cc2 100644
--- a/src/exchangedb/test_exchangedb_keyio.c
+++ b/src/exchangedb/test_exchangedb_keyio.c
@@ -14,8 +14,8 @@
TALER; see the file COPYING. If not, If not, see <http://www.gnu.org/licenses/>
*/
/**
- * @file exchange/test_exchange_common.c
- * @brief test cases for some functions in exchange/exchange_common.c
+ * @file exchangedb/test_exchangedb_keyio.c
+ * @brief test cases for some functions in exchangedb/exchangedb_keyio.c
* @author Sree Harsha Totakura <sreeharsha@totakura.in>
*/
#include "platform.h"
@@ -31,6 +31,47 @@
if (cond) { GNUNET_break (0); goto EXITIF_exit; } \
} while (0)
+/**
+ * @brief Iterator called on denomination key.
+ *
+ * @param cls closure with expected DKI
+ * @param dki the denomination key
+ * @param alias coin alias
+ * @return #GNUNET_OK to continue to iterate,
+ * #GNUNET_NO to stop iteration with no error,
+ * #GNUNET_SYSERR to abort iteration with error!
+ */
+static int
+dki_iter (void *cls,
+ const char *alias,
+ const struct TALER_EXCHANGEDB_DenominationKeyIssueInformation *dki)
+{
+ const struct TALER_EXCHANGEDB_DenominationKeyIssueInformation *exp = cls;
+
+ if (0 != memcmp (&exp->issue,
+ &dki->issue,
+ sizeof (struct TALER_EXCHANGEDB_DenominationKeyInformationP)))
+ {
+ GNUNET_break (0);
+ return GNUNET_SYSERR;
+ }
+ if (0 !=
+ GNUNET_CRYPTO_rsa_private_key_cmp (exp->denom_priv.rsa_private_key,
+ dki->denom_priv.rsa_private_key))
+ {
+ GNUNET_break (0);
+ return GNUNET_SYSERR;
+ }
+ if (0 !=
+ GNUNET_CRYPTO_rsa_public_key_cmp (exp->denom_pub.rsa_public_key,
+ dki->denom_pub.rsa_public_key))
+ {
+ GNUNET_break (0);
+ return GNUNET_SYSERR;
+ }
+ return GNUNET_OK;
+}
+
int
main (int argc,
@@ -59,8 +100,18 @@ main (int argc,
enc_size = GNUNET_CRYPTO_rsa_private_key_encode (dki.denom_priv.rsa_private_key,
&enc);
EXITIF (NULL == (tmpfile = GNUNET_DISK_mktemp ("test_exchange_common")));
- EXITIF (GNUNET_OK != TALER_EXCHANGEDB_denomination_key_write (tmpfile, &dki));
- EXITIF (GNUNET_OK != TALER_EXCHANGEDB_denomination_key_read (tmpfile, &dki_read));
+ EXITIF (GNUNET_OK !=
+ TALER_EXCHANGEDB_denomination_key_write (tmpfile,
+ &dki));
+ EXITIF (GNUNET_OK !=
+ TALER_EXCHANGEDB_denomination_key_read (tmpfile,
+ &dki_read));
+ EXITIF (1 !=
+ TALER_EXCHANGEDB_denomination_keys_iterate (tmpfile,
+ &dki_iter,
+ &dki));
+
+
enc_read_size = GNUNET_CRYPTO_rsa_private_key_encode (dki_read.denom_priv.rsa_private_key,
&enc_read);
EXITIF (enc_size != enc_read_size);