mirror of https://github.com/openssl/openssl.git
				
				
				
			
		
			
				
	
	
		
			82 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			82 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			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
 |