Implemented UUID generation (RFC4122)
This patch adds new API: * xmpp_uuid_gen()
This commit is contained in:
70
src/uuid.c
Normal file
70
src/uuid.c
Normal file
@@ -0,0 +1,70 @@
|
||||
/* uuid.c
|
||||
* strophe XMPP client library -- UUID generation
|
||||
*
|
||||
* Copyright (C) 2015 Dmitry Podgorny <pasis.ua@gmail.com>
|
||||
*
|
||||
* This software is provided AS-IS with no warranty, either express
|
||||
* or implied.
|
||||
*
|
||||
* This program is dual licensed under the MIT and GPLv3 licenses.
|
||||
*/
|
||||
|
||||
/** @file
|
||||
* Generation of UUID version 4 according to RFC4122.
|
||||
*/
|
||||
|
||||
#include "strophe.h"
|
||||
#include "common.h"
|
||||
#include "rand.h"
|
||||
|
||||
/** @def XMPP_UUID_LEN
|
||||
* UUID length in string representation excluding '\0'.
|
||||
*/
|
||||
#define XMPP_UUID_LEN 36
|
||||
|
||||
/** Generate UUID version 4 in pre-allocated buffer.
|
||||
*
|
||||
* @param uuid pre-allocated buffer of size (XMPP_UUID_LEN + 1)
|
||||
*/
|
||||
static void crypto_uuid_gen(xmpp_ctx_t *ctx, char *uuid)
|
||||
{
|
||||
uint8_t buf[16];
|
||||
int i = 0; /* uuid iterator */
|
||||
int j = 0; /* buf iterator */
|
||||
|
||||
static const char hex[] = {'0', '1', '2', '3', '4', '5', '6', '7',
|
||||
'8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
|
||||
|
||||
xmpp_rand_bytes(ctx, buf, sizeof(buf));
|
||||
buf[8] &= 0x3f;
|
||||
buf[8] |= 0x80;
|
||||
buf[6] &= 0x0f;
|
||||
buf[6] |= 0x40;
|
||||
while (i < XMPP_UUID_LEN) {
|
||||
if (i == 8 || i == 13 || i == 18 || i == 23)
|
||||
uuid[i++] = '-';
|
||||
else {
|
||||
uuid[i++] = hex[buf[j] >> 4];
|
||||
uuid[i++] = hex[buf[j] & 0x0f];
|
||||
++j;
|
||||
}
|
||||
}
|
||||
uuid[XMPP_UUID_LEN] = '\0';
|
||||
}
|
||||
|
||||
/** Generate UUID version 4.
|
||||
* This function allocates memory for the resulting string and must be freed
|
||||
* with xmpp_free().
|
||||
*
|
||||
* @return ASCIIZ string
|
||||
*/
|
||||
char *xmpp_uuid_gen(xmpp_ctx_t *ctx)
|
||||
{
|
||||
char *uuid;
|
||||
|
||||
uuid = xmpp_alloc(ctx, XMPP_UUID_LEN + 1);
|
||||
if (uuid != NULL) {
|
||||
crypto_uuid_gen(ctx, uuid);
|
||||
}
|
||||
return uuid;
|
||||
}
|
||||
Reference in New Issue
Block a user