Home | History | Annotate | Line # | Download | only in crypto
      1 #include "internal/quic_vlint.h"
      2 #include "internal/e_os.h"
      3 
      4 #ifndef OPENSSL_NO_QUIC
      5 
      6 void ossl_quic_vlint_encode_n(uint8_t *buf, uint64_t v, int n)
      7 {
      8     if (n == 1) {
      9         buf[0] = (uint8_t)v;
     10     } else if (n == 2) {
     11         buf[0] = (uint8_t)(0x40 | ((v >> 8) & 0x3F));
     12         buf[1] = (uint8_t)v;
     13     } else if (n == 4) {
     14         buf[0] = (uint8_t)(0x80 | ((v >> 24) & 0x3F));
     15         buf[1] = (uint8_t)(v >> 16);
     16         buf[2] = (uint8_t)(v >> 8);
     17         buf[3] = (uint8_t)v;
     18     } else {
     19         buf[0] = (uint8_t)(0xC0 | ((v >> 56) & 0x3F));
     20         buf[1] = (uint8_t)(v >> 48);
     21         buf[2] = (uint8_t)(v >> 40);
     22         buf[3] = (uint8_t)(v >> 32);
     23         buf[4] = (uint8_t)(v >> 24);
     24         buf[5] = (uint8_t)(v >> 16);
     25         buf[6] = (uint8_t)(v >> 8);
     26         buf[7] = (uint8_t)v;
     27     }
     28 }
     29 
     30 void ossl_quic_vlint_encode(uint8_t *buf, uint64_t v)
     31 {
     32     ossl_quic_vlint_encode_n(buf, v, ossl_quic_vlint_encode_len(v));
     33 }
     34 
     35 uint64_t ossl_quic_vlint_decode_unchecked(const unsigned char *buf)
     36 {
     37     uint8_t first_byte = buf[0];
     38     size_t sz = ossl_quic_vlint_decode_len(first_byte);
     39 
     40     if (sz == 1)
     41         return first_byte & 0x3F;
     42 
     43     if (sz == 2)
     44         return ((uint64_t)(first_byte & 0x3F) << 8)
     45             | buf[1];
     46 
     47     if (sz == 4)
     48         return ((uint64_t)(first_byte & 0x3F) << 24)
     49             | ((uint64_t)buf[1] << 16)
     50             | ((uint64_t)buf[2] << 8)
     51             | buf[3];
     52 
     53     return ((uint64_t)(first_byte & 0x3F) << 56)
     54         | ((uint64_t)buf[1] << 48)
     55         | ((uint64_t)buf[2] << 40)
     56         | ((uint64_t)buf[3] << 32)
     57         | ((uint64_t)buf[4] << 24)
     58         | ((uint64_t)buf[5] << 16)
     59         | ((uint64_t)buf[6] << 8)
     60         | buf[7];
     61 }
     62 
     63 int ossl_quic_vlint_decode(const unsigned char *buf, size_t buf_len, uint64_t *v)
     64 {
     65     size_t dec_len;
     66     uint64_t x;
     67 
     68     if (buf_len < 1)
     69         return 0;
     70 
     71     dec_len = ossl_quic_vlint_decode_len(buf[0]);
     72     if (buf_len < dec_len)
     73         return 0;
     74 
     75     x = ossl_quic_vlint_decode_unchecked(buf);
     76 
     77     *v = x;
     78     return dec_len;
     79 }
     80 
     81 #endif
     82