aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWilmer van der Gaast <wilmer@google.com>2012-02-10 13:37:08 +0000
committerWilmer van der Gaast <wilmer@google.com>2012-02-10 13:37:08 +0000
commite0a0a4277b51204743ffe7ece003602a50dc358c (patch)
tree3b70e13088bd9fe70fefa68041ee337f4530907f
parent7d27962b17487ec1c783dc9e028859b01a20e6f0 (diff)
Added sha1_random_uuid function, which I will use later to generate random
Jabber roomnames.
-rw-r--r--lib/sha1.c31
-rw-r--r--lib/sha1.h1
2 files changed, 32 insertions, 0 deletions
diff --git a/lib/sha1.c b/lib/sha1.c
index 7ee90640..4153ff1b 100644
--- a/lib/sha1.c
+++ b/lib/sha1.c
@@ -36,6 +36,7 @@
*/
#include <string.h>
+#include <stdio.h>
#include "sha1.h"
/*
@@ -420,3 +421,33 @@ void sha1_hmac(const char *key_, size_t key_len, const char *payload, size_t pay
sha1_append( &sha1, hash, sha1_hash_size );
sha1_finish( &sha1, Message_Digest );
}
+
+/* I think this follows the scheme described on:
+ http://en.wikipedia.org/wiki/Universally_unique_identifier#Version_4_.28random.29
+ My random data comes from a SHA1 generator but hey, it's random enough for
+ me, and RFC 4122 looks way more complicated than I need this to be.
+
+ Returns a value that must be free()d. */
+char *sha1_random_uuid( sha1_state_t * context )
+{
+ uint8_t dig[sha1_hash_size];
+ char *ret = g_new0( char, 40 ); /* 36 chars + \0 */
+ int i, p;
+
+ sha1_finish(context, dig);
+ for( p = i = 0; i < 16; i ++ )
+ {
+ if( i == 4 || i == 6 || i == 8 || i == 10 )
+ ret[p++] = '-';
+ if( i == 6 )
+ dig[i] = ( dig[i] & 0x0f ) | 0x40;
+ if( i == 8 )
+ dig[i] = ( dig[i] & 0x30 ) | 0x80;
+
+ sprintf( ret + p, "%02x", dig[i] );
+ p += 2;
+ }
+ ret[p] = '\0';
+
+ return ret;
+}
diff --git a/lib/sha1.h b/lib/sha1.h
index a87410eb..8c89c0f0 100644
--- a/lib/sha1.h
+++ b/lib/sha1.h
@@ -67,5 +67,6 @@ G_MODULE_EXPORT int sha1_init(sha1_state_t *);
G_MODULE_EXPORT int sha1_append(sha1_state_t *, const uint8_t *, unsigned int);
G_MODULE_EXPORT int sha1_finish(sha1_state_t *, uint8_t Message_Digest[sha1_hash_size]);
G_MODULE_EXPORT void sha1_hmac(const char *key_, size_t key_len, const char *payload, size_t payload_len, uint8_t Message_Digest[sha1_hash_size]);
+G_MODULE_EXPORT char *sha1_random_uuid( sha1_state_t * context );
#endif