LCOV - code coverage report
Current view: top level - src - uuid.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 24 0.0 %
Date: 2024-02-03 11:54:46 Functions: 0 2 0.0 %

          Line data    Source code
       1             : /* SPDX-License-Identifier: MIT OR GPL-3.0-only */
       2             : /* uuid.c
       3             :  * strophe XMPP client library -- UUID generation
       4             :  *
       5             :  * Copyright (C) 2015 Dmitry Podgorny <pasis.ua@gmail.com>
       6             :  *
       7             :  *  This software is provided AS-IS with no warranty, either express
       8             :  *  or implied.
       9             :  *
      10             :  *  This program is dual licensed under the MIT or GPLv3 licenses.
      11             :  */
      12             : 
      13             : /** @file
      14             :  *  Generation of UUID version 4 according to RFC4122.
      15             :  */
      16             : 
      17             : #include "strophe.h"
      18             : #include "common.h"
      19             : 
      20             : /** @def XMPP_UUID_LEN
      21             :  *  UUID length in string representation excluding '\0'.
      22             :  */
      23             : #define XMPP_UUID_LEN 36
      24             : 
      25             : /** Generate UUID version 4 in pre-allocated buffer.
      26             :  *
      27             :  *  @param ctx a Strophe context object
      28             :  *  @param uuid pre-allocated buffer of size (XMPP_UUID_LEN + 1)
      29             :  */
      30           0 : static void crypto_uuid_gen(xmpp_ctx_t *ctx, char *uuid)
      31             : {
      32           0 :     unsigned char buf[16];
      33           0 :     int i = 0; /* uuid iterator */
      34           0 :     int j = 0; /* buf iterator */
      35             : 
      36           0 :     static const char hex[] = {'0', '1', '2', '3', '4', '5', '6', '7',
      37             :                                '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
      38             : 
      39           0 :     xmpp_rand_bytes(ctx->rand, buf, sizeof(buf));
      40           0 :     buf[8] &= 0x3f;
      41           0 :     buf[8] |= 0x80;
      42           0 :     buf[6] &= 0x0f;
      43           0 :     buf[6] |= 0x40;
      44           0 :     while (i < XMPP_UUID_LEN) {
      45           0 :         if (i == 8 || i == 13 || i == 18 || i == 23)
      46           0 :             uuid[i++] = '-';
      47             :         else {
      48           0 :             uuid[i++] = hex[buf[j] >> 4];
      49           0 :             uuid[i++] = hex[buf[j] & 0x0f];
      50           0 :             ++j;
      51             :         }
      52             :     }
      53           0 :     uuid[XMPP_UUID_LEN] = '\0';
      54           0 : }
      55             : 
      56             : /** Generate UUID version 4.
      57             :  *  This function allocates memory for the resulting string and must be freed
      58             :  *  with xmpp_free().
      59             :  *
      60             :  *  @param ctx a Strophe context object
      61             :  *
      62             :  *  @return ASCIIZ string
      63             :  */
      64           0 : char *xmpp_uuid_gen(xmpp_ctx_t *ctx)
      65             : {
      66           0 :     char *uuid;
      67             : 
      68           0 :     uuid = strophe_alloc(ctx, XMPP_UUID_LEN + 1);
      69           0 :     if (uuid != NULL) {
      70           0 :         crypto_uuid_gen(ctx, uuid);
      71             :     }
      72           0 :     return uuid;
      73             : }

Generated by: LCOV version 1.14