Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of Pubnub_c_core by
pubnub_generate_uuid.cpp@1:929314a174af, 2016-11-11 (annotated)
- Committer:
- sveljko
- Date:
- Fri Nov 11 22:44:58 2016 +0000
- Revision:
- 1:929314a174af
Added the UUID module
Who changed what in which revision?
| User | Revision | Line number | New contents of line | 
|---|---|---|---|
| sveljko | 1:929314a174af | 1 | /* -*- c-file-style:"stroustrup"; indent-tabs-mode: nil -*- */ | 
| sveljko | 1:929314a174af | 2 | #include "pubnub_config.h" | 
| sveljko | 1:929314a174af | 3 | #include "pubnub_internal.h" | 
| sveljko | 1:929314a174af | 4 | #include "pubnub_generate_uuid.h" | 
| sveljko | 1:929314a174af | 5 | |
| sveljko | 1:929314a174af | 6 | #include "pubnub_assert.h" | 
| sveljko | 1:929314a174af | 7 | |
| sveljko | 1:929314a174af | 8 | #include <string.h> | 
| sveljko | 1:929314a174af | 9 | #include <stdio.h> | 
| sveljko | 1:929314a174af | 10 | |
| sveljko | 1:929314a174af | 11 | #if PUBNUB_HAVE_MD5 | 
| sveljko | 1:929314a174af | 12 | #include "md5.h" | 
| sveljko | 1:929314a174af | 13 | #endif | 
| sveljko | 1:929314a174af | 14 | |
| sveljko | 1:929314a174af | 15 | #if PUBNUB_HAVE_SHA1 | 
| sveljko | 1:929314a174af | 16 | #include "sha1.h" | 
| sveljko | 1:929314a174af | 17 | #endif | 
| sveljko | 1:929314a174af | 18 | |
| sveljko | 1:929314a174af | 19 | |
| sveljko | 1:929314a174af | 20 | /** Here we provide functions that are not dependent on the platform */ | 
| sveljko | 1:929314a174af | 21 | |
| sveljko | 1:929314a174af | 22 | struct Pubnub_UUID_decomposed { | 
| sveljko | 1:929314a174af | 23 | uint32_t time_low; | 
| sveljko | 1:929314a174af | 24 | uint16_t time_mid; | 
| sveljko | 1:929314a174af | 25 | uint16_t time_hi_and_version; | 
| sveljko | 1:929314a174af | 26 | uint8_t clock_seq_hi_and_reserved; | 
| sveljko | 1:929314a174af | 27 | uint8_t clock_seq_low; | 
| sveljko | 1:929314a174af | 28 | uint8_t node[6]; | 
| sveljko | 1:929314a174af | 29 | }; | 
| sveljko | 1:929314a174af | 30 | |
| sveljko | 1:929314a174af | 31 | |
| sveljko | 1:929314a174af | 32 | int pubnub_generate_uuid_v1_time( | 
| sveljko | 1:929314a174af | 33 | struct Pubnub_UUID *o_uuid, | 
| sveljko | 1:929314a174af | 34 | uint16_t *io_clock_seq, | 
| sveljko | 1:929314a174af | 35 | uint8_t const i_timestamp[8], | 
| sveljko | 1:929314a174af | 36 | uint8_t const i_node[6] | 
| sveljko | 1:929314a174af | 37 | ) | 
| sveljko | 1:929314a174af | 38 | { | 
| sveljko | 1:929314a174af | 39 | static uint8_t s_timestamp[8]; | 
| sveljko | 1:929314a174af | 40 | struct Pubnub_UUID_decomposed *ud = (struct Pubnub_UUID_decomposed *)o_uuid; | 
| sveljko | 1:929314a174af | 41 | |
| sveljko | 1:929314a174af | 42 | if (0 < memcmp(i_timestamp, s_timestamp, sizeof s_timestamp)) { | 
| sveljko | 1:929314a174af | 43 | (*io_clock_seq)++; | 
| sveljko | 1:929314a174af | 44 | } | 
| sveljko | 1:929314a174af | 45 | |
| sveljko | 1:929314a174af | 46 | ud->time_low = *(uint32_t*)i_timestamp; | 
| sveljko | 1:929314a174af | 47 | ud->time_mid = *(uint16_t*)(i_timestamp + 4); | 
| sveljko | 1:929314a174af | 48 | ud->time_hi_and_version = *(uint16_t*)(i_timestamp + 6); | 
| sveljko | 1:929314a174af | 49 | ud->time_hi_and_version |= (1 << 12); | 
| sveljko | 1:929314a174af | 50 | ud->clock_seq_low = *io_clock_seq & 0xFF; | 
| sveljko | 1:929314a174af | 51 | ud->clock_seq_hi_and_reserved = (*io_clock_seq & 0x3F00) >> 8; | 
| sveljko | 1:929314a174af | 52 | ud->clock_seq_hi_and_reserved |= 0x80; | 
| sveljko | 1:929314a174af | 53 | memcpy(&ud->node, &i_node, sizeof ud->node); | 
| sveljko | 1:929314a174af | 54 | |
| sveljko | 1:929314a174af | 55 | memcpy(s_timestamp, i_timestamp, sizeof s_timestamp); | 
| sveljko | 1:929314a174af | 56 | |
| sveljko | 1:929314a174af | 57 | return 0; | 
| sveljko | 1:929314a174af | 58 | } | 
| sveljko | 1:929314a174af | 59 | |
| sveljko | 1:929314a174af | 60 | |
| sveljko | 1:929314a174af | 61 | int pubnub_generate_uuid_v3_name_md5( | 
| sveljko | 1:929314a174af | 62 | struct Pubnub_UUID *uuid, | 
| sveljko | 1:929314a174af | 63 | struct Pubnub_UUID *nsid, | 
| sveljko | 1:929314a174af | 64 | void *name, | 
| sveljko | 1:929314a174af | 65 | unsigned namelen | 
| sveljko | 1:929314a174af | 66 | ) | 
| sveljko | 1:929314a174af | 67 | { | 
| sveljko | 1:929314a174af | 68 | #if PUBNUB_HAVE_MD5 | 
| sveljko | 1:929314a174af | 69 | MD5_CTX ctx; | 
| sveljko | 1:929314a174af | 70 | |
| sveljko | 1:929314a174af | 71 | MD5Init(&ctx); | 
| sveljko | 1:929314a174af | 72 | MD5Update(&ctx, nsid, sizeof *nsid); | 
| sveljko | 1:929314a174af | 73 | MD5Update(&ctx, name, namelen); | 
| sveljko | 1:929314a174af | 74 | MD5Final(uuid, &ctx); | 
| sveljko | 1:929314a174af | 75 | |
| sveljko | 1:929314a174af | 76 | uuid->uuid[6] &= 0x0F; | 
| sveljko | 1:929314a174af | 77 | uuid->uuid[6] |= 0x30; | 
| sveljko | 1:929314a174af | 78 | uuid->uuid[8] &= 0x3F; | 
| sveljko | 1:929314a174af | 79 | uuid->uuid[8] |= 0x80; | 
| sveljko | 1:929314a174af | 80 | |
| sveljko | 1:929314a174af | 81 | return 0; | 
| sveljko | 1:929314a174af | 82 | #else | 
| sveljko | 1:929314a174af | 83 | PUBNUB_UNUSED(uuid); | 
| sveljko | 1:929314a174af | 84 | PUBNUB_UNUSED(nsid); | 
| sveljko | 1:929314a174af | 85 | PUBNUB_UNUSED(name); | 
| sveljko | 1:929314a174af | 86 | PUBNUB_UNUSED(namelen); | 
| sveljko | 1:929314a174af | 87 | |
| sveljko | 1:929314a174af | 88 | return -1; | 
| sveljko | 1:929314a174af | 89 | #endif | 
| sveljko | 1:929314a174af | 90 | } | 
| sveljko | 1:929314a174af | 91 | |
| sveljko | 1:929314a174af | 92 | |
| sveljko | 1:929314a174af | 93 | int pubnub_generate_uuid_v5_name_sha1( | 
| sveljko | 1:929314a174af | 94 | struct Pubnub_UUID *uuid, | 
| sveljko | 1:929314a174af | 95 | struct Pubnub_UUID *nsid, | 
| sveljko | 1:929314a174af | 96 | void *name, | 
| sveljko | 1:929314a174af | 97 | unsigned namelen | 
| sveljko | 1:929314a174af | 98 | ) | 
| sveljko | 1:929314a174af | 99 | { | 
| sveljko | 1:929314a174af | 100 | #if PUBNUB_HAVE_SHA1 | 
| sveljko | 1:929314a174af | 101 | SHA1Context ctx; | 
| sveljko | 1:929314a174af | 102 | |
| sveljko | 1:929314a174af | 103 | SHA1Reset(&ctx); | 
| sveljko | 1:929314a174af | 104 | SHAInput(&ctx, nsid, sizeof *nsid); | 
| sveljko | 1:929314a174af | 105 | SHA1Input(&ctx, name, namelen); | 
| sveljko | 1:929314a174af | 106 | if (0 == SHA1Result(&ctx)) { | 
| sveljko | 1:929314a174af | 107 | return -1; | 
| sveljko | 1:929314a174af | 108 | } | 
| sveljko | 1:929314a174af | 109 | memcpy(uuid->uuid, ctx.Message_Digest, sizeof uuid->uuid); | 
| sveljko | 1:929314a174af | 110 | |
| sveljko | 1:929314a174af | 111 | uuid->uuid[6] &= 0x0F; | 
| sveljko | 1:929314a174af | 112 | uuid->uuid[6] |= 0x50; | 
| sveljko | 1:929314a174af | 113 | uuid->uuid[8] &= 0x3F; | 
| sveljko | 1:929314a174af | 114 | uuid->uuid[8] |= 0x80; | 
| sveljko | 1:929314a174af | 115 | |
| sveljko | 1:929314a174af | 116 | return 0; | 
| sveljko | 1:929314a174af | 117 | #else | 
| sveljko | 1:929314a174af | 118 | PUBNUB_UNUSED(uuid); | 
| sveljko | 1:929314a174af | 119 | PUBNUB_UNUSED(nsid); | 
| sveljko | 1:929314a174af | 120 | PUBNUB_UNUSED(name); | 
| sveljko | 1:929314a174af | 121 | PUBNUB_UNUSED(namelen); | 
| sveljko | 1:929314a174af | 122 | return -1; | 
| sveljko | 1:929314a174af | 123 | #endif | 
| sveljko | 1:929314a174af | 124 | } | 
| sveljko | 1:929314a174af | 125 | |
| sveljko | 1:929314a174af | 126 | |
| sveljko | 1:929314a174af | 127 | struct Pubnub_UUID_String pubnub_uuid_to_string(struct Pubnub_UUID const *uuid) | 
| sveljko | 1:929314a174af | 128 | { | 
| sveljko | 1:929314a174af | 129 | struct Pubnub_UUID_String rslt; | 
| sveljko | 1:929314a174af | 130 | struct Pubnub_UUID_decomposed const*u = (struct Pubnub_UUID_decomposed const*)uuid; | 
| sveljko | 1:929314a174af | 131 | |
| sveljko | 1:929314a174af | 132 | snprintf(rslt.uuid, sizeof rslt.uuid, | 
| sveljko | 1:929314a174af | 133 | "%8.8x-%4.4x-%4.4x-%2.2x%2.2x-%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x", | 
| sveljko | 1:929314a174af | 134 | u->time_low, u->time_mid, u->time_hi_and_version, | 
| sveljko | 1:929314a174af | 135 | u->clock_seq_hi_and_reserved, u->clock_seq_low, | 
| sveljko | 1:929314a174af | 136 | u->node[0], u->node[1], u->node[2], u->node[3], u->node[4], u->node[5] | 
| sveljko | 1:929314a174af | 137 | ); | 
| sveljko | 1:929314a174af | 138 | |
| sveljko | 1:929314a174af | 139 | return rslt; | 
| sveljko | 1:929314a174af | 140 | } | 
| sveljko | 1:929314a174af | 141 | |
| sveljko | 1:929314a174af | 142 | |
| sveljko | 1:929314a174af | 143 | int pubnub_uuid_compare(struct Pubnub_UUID const *left, struct Pubnub_UUID const *right) | 
| sveljko | 1:929314a174af | 144 | { | 
| sveljko | 1:929314a174af | 145 | /* maybe this is not really the greatest way to compare, but it works...*/ | 
| sveljko | 1:929314a174af | 146 | return memcmp(left, right, sizeof *left); | 
| sveljko | 1:929314a174af | 147 | } | 
