diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/sha1.c | 31 | ||||
| -rw-r--r-- | lib/sha1.h | 1 | 
2 files changed, 32 insertions, 0 deletions
| @@ -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; +} @@ -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 | 
