]> granicus.if.org Git - transmission/commitdiff
#4400, #5462: Move SHA1/HEX helpers to crypto-utils
authorMike Gelfand <mikedld@mikedld.com>
Thu, 4 Dec 2014 20:53:56 +0000 (20:53 +0000)
committerMike Gelfand <mikedld@mikedld.com>
Thu, 4 Dec 2014 20:53:56 +0000 (20:53 +0000)
On a way to factoring out OpenSSL support to a standalone file to ease
addition of other crypto libraries support in the future, move helpers
providing SHA1/HEX conversion to crypto-utils.{c,h}.

Rename functions:
* tr_sha1_to_hex -> tr_binary_to_hex (add length argument),
* tr_hex_to_sha1 -> tr_hex_to_binary (add length argument).

Make tr_sha1_to_hex and tr_hex_to_sha1 wrappers around above functions.

libtransmission/crypto-utils.h
libtransmission/magnet.c
libtransmission/utils-test.c
libtransmission/utils.c
libtransmission/utils.h

index f6bc0a98819ec1765b2baca6c1e18f4420faed8e..7078da3f4c412175a2a9233c2f2e1929f9f7c147 100644 (file)
@@ -13,6 +13,7 @@
 #include <inttypes.h>
 #include <stddef.h>
 
+#include "transmission.h" /* SHA_DIGEST_LENGTH */
 #include "utils.h" /* TR_GNUC_MALLOC, TR_GNUC_NULL_TERMINATED */
 
 #ifdef __cplusplus
@@ -211,6 +212,26 @@ void           * tr_base64_decode_impl (const void     * input,
                                         size_t           input_length,
                                         size_t         * output_length) TR_GNUC_MALLOC;
 
+/**
+ * @brief Wrapper around tr_binary_to_hex () for SHA_DIGEST_LENGTH.
+ */
+static inline void
+tr_sha1_to_hex (char          * hex,
+                const uint8_t * sha1)
+{
+  tr_binary_to_hex (sha1, hex, SHA_DIGEST_LENGTH);
+}
+
+/**
+ * @brief Wrapper around tr_hex_to_binary () for SHA_DIGEST_LENGTH.
+ */
+static inline void
+tr_hex_to_sha1 (uint8_t    * sha1,
+                const char * hex)
+{
+  tr_hex_to_binary (hex, sha1, SHA_DIGEST_LENGTH);
+}
+
 /** @} */
 
 #ifdef __cplusplus
index f5d2bb99440861de2ee460766be4141743f5b203..8a95bed359d75cefc295d8ba97a3c85b2a2a2062 100644 (file)
@@ -12,8 +12,8 @@
 #include <stdio.h> /* sscanf () */
 
 #include "transmission.h"
+#include "crypto-utils.h" /* tr_hex_to_sha1 () */
 #include "magnet.h"
-#include "utils.h"
 #include "variant.h"
 #include "web.h"
 
index d9fb9309157b7af279d82c501bc00a773ee54781..64cfde18735126613a9a839cf0c4c7e3a7dcd7fc 100644 (file)
@@ -277,11 +277,11 @@ test_hex (void)
 {
   char hex1[41];
   char hex2[41];
-  uint8_t sha1[20];
+  uint8_t binary[20];
 
   memcpy (hex1, "fb5ef5507427b17e04b69cef31fa3379b456735a", 41);
-  tr_hex_to_sha1 (sha1, hex1);
-  tr_sha1_to_hex (hex2, sha1);
+  tr_hex_to_binary (hex1, binary, 20);
+  tr_binary_to_hex (binary, hex2, 20);
   check_streq (hex1, hex2);
 
   return 0;
index d1f98729a2d389e05d69d85b083f442e47b2c7c4..7e0f0f70736dcf25f2a3bd45eba9def283aa4155 100644 (file)
@@ -18,7 +18,7 @@
 #endif
 
 #include <assert.h>
-#include <ctype.h> /* isdigit (), isalpha (), tolower () */
+#include <ctype.h> /* isdigit (), tolower () */
 #include <errno.h>
 #include <float.h> /* DBL_EPSILON */
 #include <locale.h> /* localeconv () */
@@ -629,32 +629,38 @@ tr_getRatio (uint64_t numerator, uint64_t denominator)
 }
 
 void
-tr_sha1_to_hex (char * out, const uint8_t * sha1)
+tr_binary_to_hex (const void * input,
+                  char       * output,
+                  size_t       byte_length)
 {
-  int i;
   static const char hex[] = "0123456789abcdef";
+  const uint8_t * input_octets = input;
+  size_t i;
 
-  for (i=0; i<20; ++i)
+  for (i = 0; i < byte_length; ++i)
     {
-      const unsigned int val = *sha1++;
-      *out++ = hex[val >> 4];
-      *out++ = hex[val & 0xf];
+      const unsigned int val = *input_octets++;
+      *output++ = hex[val >> 4];
+      *output++ = hex[val & 0xf];
     }
 
-  *out = '\0';
+  *output = '\0';
 }
 
 void
-tr_hex_to_sha1 (uint8_t * out, const char * in)
+tr_hex_to_binary (const char * input,
+                  void       * output,
+                  size_t       byte_length)
 {
-  int i;
   static const char hex[] = "0123456789abcdef";
+  uint8_t * output_octets = output;
+  size_t i;
 
-  for (i=0; i<20; ++i)
+  for (i = 0; i < byte_length; ++i)
     {
-      const int hi = strchr (hex, tolower (*in++)) - hex;
-      const int lo = strchr (hex, tolower (*in++)) - hex;
-      *out++ = (uint8_t)((hi<<4) | lo);
+      const int hi = strchr (hex, tolower (*input++)) - hex;
+      const int lo = strchr (hex, tolower (*input++)) - hex;
+      *output_octets++ = (uint8_t) ((hi << 4) | lo);
     }
 }
 
index 3e6f2d88f2b0654a10f0029abf0cde34e312de45..f32d568b46f04a75d414151a5899322ddc59db0d 100644 (file)
@@ -319,9 +319,8 @@ char* tr_strsep (char ** str, const char * delim);
 
 int compareInt (const void * va, const void * vb);
 
-void tr_sha1_to_hex (char * out, const uint8_t * sha1) TR_GNUC_NONNULL (1,2);
-
-void tr_hex_to_sha1 (uint8_t * out, const char * hex) TR_GNUC_NONNULL (1,2);
+void tr_binary_to_hex (const void * input, char * output, size_t byte_length) TR_GNUC_NONNULL (1,2);
+void tr_hex_to_binary (const char * input, void * output, size_t byte_length) TR_GNUC_NONNULL (1,2);
 
 /** @brief convenience function to determine if an address is an IP address (IPv4 or IPv6) */
 bool tr_addressIsIP (const char * address);