|
@@ -0,0 +1,46 @@
|
|
|
+/* Copyright (c) 2012-2013, The Tor Project, Inc. */
|
|
|
+/* See LICENSE for licensing information */
|
|
|
+
|
|
|
+/* Formatting and parsing code for crypto-related data structures. */
|
|
|
+
|
|
|
+#define CRYPTO_CURVE25519_PRIVATE
|
|
|
+#include "orconfig.h"
|
|
|
+#ifdef HAVE_SYS_STAT_H
|
|
|
+#include <sys/stat.h>
|
|
|
+#endif
|
|
|
+#include "crypto.h"
|
|
|
+#include "crypto_curve25519.h"
|
|
|
+#include "util.h"
|
|
|
+#include "torlog.h"
|
|
|
+
|
|
|
+int
|
|
|
+curve25519_public_to_base64(char *output,
|
|
|
+ const curve25519_public_key_t *pkey)
|
|
|
+{
|
|
|
+ char buf[128];
|
|
|
+ base64_encode(buf, sizeof(buf),
|
|
|
+ (const char*)pkey->public_key, CURVE25519_PUBKEY_LEN);
|
|
|
+ buf[CURVE25519_BASE64_PADDED_LEN] = '\0';
|
|
|
+ memcpy(output, buf, CURVE25519_BASE64_PADDED_LEN+1);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+int
|
|
|
+curve25519_public_from_base64(curve25519_public_key_t *pkey,
|
|
|
+ const char *input)
|
|
|
+{
|
|
|
+ size_t len = strlen(input);
|
|
|
+ if (len == CURVE25519_BASE64_PADDED_LEN - 1) {
|
|
|
+ /* not padded */
|
|
|
+ return digest256_from_base64((char*)pkey->public_key, input);
|
|
|
+ } else if (len == CURVE25519_BASE64_PADDED_LEN) {
|
|
|
+ char buf[128];
|
|
|
+ if (base64_decode(buf, sizeof(buf), input, len) != CURVE25519_PUBKEY_LEN)
|
|
|
+ return -1;
|
|
|
+ memcpy(pkey->public_key, buf, CURVE25519_PUBKEY_LEN);
|
|
|
+ return 0;
|
|
|
+ } else {
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|