Skip to main content
  • Home
  • login
  • Browse the archive

    swh mirror partner logo
swh logo
SoftwareHeritage
Software
Heritage
Mirror
Features
  • Search

  • Downloads

  • Save code now

  • Add forge now

  • Help

  • 796efcf
  • /
  • crypto
  • /
  • quic_vlint.c
Raw File
Permalinks

To reference or cite the objects present in the Software Heritage archive, permalinks based on SoftWare Hash IDentifiers (SWHIDs) must be used.
Select below a type of object currently browsed in order to display its associated SWHID and permalink.

  • content
  • directory
content badge Iframe embedding
swh:1:cnt:0238985963195184f311c23e853b4b95f5a16af4
directory badge Iframe embedding
swh:1:dir:f3cd18c5356e3655ce6da0bdfffb8cc6c508c80d
quic_vlint.c
#include "internal/quic_vlint.h"
#include "internal/e_os.h"

#ifndef OPENSSL_NO_QUIC

void ossl_quic_vlint_encode_n(uint8_t *buf, uint64_t v, int n)
{
    if (n == 1) {
        buf[0] = (uint8_t)v;
    } else if (n == 2) {
        buf[0] = (uint8_t)(0x40 | ((v >> 8) & 0x3F));
        buf[1] = (uint8_t)v;
    } else if (n == 4) {
        buf[0] = (uint8_t)(0x80 | ((v >> 24) & 0x3F));
        buf[1] = (uint8_t)(v >> 16);
        buf[2] = (uint8_t)(v >>  8);
        buf[3] = (uint8_t)v;
    } else {
        buf[0] = (uint8_t)(0xC0 | ((v >> 56) & 0x3F));
        buf[1] = (uint8_t)(v >> 48);
        buf[2] = (uint8_t)(v >> 40);
        buf[3] = (uint8_t)(v >> 32);
        buf[4] = (uint8_t)(v >> 24);
        buf[5] = (uint8_t)(v >> 16);
        buf[6] = (uint8_t)(v >>  8);
        buf[7] = (uint8_t)v;
    }
}

void ossl_quic_vlint_encode(uint8_t *buf, uint64_t v)
{
    ossl_quic_vlint_encode_n(buf, v, ossl_quic_vlint_encode_len(v));
}

uint64_t ossl_quic_vlint_decode_unchecked(const unsigned char *buf)
{
    uint8_t first_byte = buf[0];
    size_t sz = ossl_quic_vlint_decode_len(first_byte);

    if (sz == 1)
        return first_byte & 0x3F;

    if (sz == 2)
        return ((uint64_t)(first_byte & 0x3F) << 8)
             | buf[1];

    if (sz == 4)
        return ((uint64_t)(first_byte & 0x3F) << 24)
             | ((uint64_t)buf[1] << 16)
             | ((uint64_t)buf[2] <<  8)
             |  buf[3];

    return ((uint64_t)(first_byte & 0x3F) << 56)
         | ((uint64_t)buf[1] << 48)
         | ((uint64_t)buf[2] << 40)
         | ((uint64_t)buf[3] << 32)
         | ((uint64_t)buf[4] << 24)
         | ((uint64_t)buf[5] << 16)
         | ((uint64_t)buf[6] <<  8)
         |  buf[7];
}

int ossl_quic_vlint_decode(const unsigned char *buf, size_t buf_len, uint64_t *v)
{
    size_t dec_len;
    uint64_t x;

    if (buf_len < 1)
        return 0;

    dec_len = ossl_quic_vlint_decode_len(buf[0]);
    if (buf_len < dec_len)
        return 0;

    x = ossl_quic_vlint_decode_unchecked(buf);

    *v = x;
    return dec_len;
}

#endif

ENEA — Copyright (C), ENEA. License: GNU AGPLv3+.
Legal notes  ::  JavaScript license information ::  Web API

back to top