early-access version 2698
This commit is contained in:
119
externals/libressl/ssl/bs_cbs.c
vendored
119
externals/libressl/ssl/bs_cbs.c
vendored
@@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: bs_cbs.c,v 1.18 2019/01/23 22:20:40 beck Exp $ */
|
||||
/* $OpenBSD: bs_cbs.c,v 1.24 2021/12/15 17:36:49 jsing Exp $ */
|
||||
/*
|
||||
* Copyright (c) 2014, Google Inc.
|
||||
*
|
||||
@@ -12,15 +12,12 @@
|
||||
* SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
|
||||
* OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
|
||||
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
|
||||
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <openssl/opensslconf.h>
|
||||
#include <openssl/buffer.h>
|
||||
#include <openssl/crypto.h>
|
||||
|
||||
#include "bytestring.h"
|
||||
|
||||
void
|
||||
@@ -50,6 +47,16 @@ cbs_get(CBS *cbs, const uint8_t **p, size_t n)
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int
|
||||
cbs_peek(CBS *cbs, const uint8_t **p, size_t n)
|
||||
{
|
||||
if (cbs->len < n)
|
||||
return 0;
|
||||
|
||||
*p = cbs->data;
|
||||
return 1;
|
||||
}
|
||||
|
||||
size_t
|
||||
CBS_offset(const CBS *cbs)
|
||||
{
|
||||
@@ -98,6 +105,11 @@ int
|
||||
CBS_strdup(const CBS *cbs, char **out_ptr)
|
||||
{
|
||||
free(*out_ptr);
|
||||
*out_ptr = NULL;
|
||||
|
||||
if (CBS_contains_zero_byte(cbs))
|
||||
return 0;
|
||||
|
||||
*out_ptr = strndup((const char *)cbs->data, cbs->len);
|
||||
return (*out_ptr != NULL);
|
||||
}
|
||||
@@ -188,6 +200,34 @@ CBS_get_u32(CBS *cbs, uint32_t *out)
|
||||
return cbs_get_u(cbs, out, 4);
|
||||
}
|
||||
|
||||
int
|
||||
CBS_get_u64(CBS *cbs, uint64_t *out)
|
||||
{
|
||||
uint32_t a, b;
|
||||
|
||||
if (cbs->len < 8)
|
||||
return 0;
|
||||
|
||||
if (!CBS_get_u32(cbs, &a))
|
||||
return 0;
|
||||
if (!CBS_get_u32(cbs, &b))
|
||||
return 0;
|
||||
|
||||
*out = (uint64_t)a << 32 | b;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int
|
||||
CBS_get_last_u8(CBS *cbs, uint8_t *out)
|
||||
{
|
||||
if (cbs->len == 0)
|
||||
return 0;
|
||||
|
||||
*out = cbs->data[cbs->len - 1];
|
||||
cbs->len--;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int
|
||||
CBS_get_bytes(CBS *cbs, CBS *out, size_t len)
|
||||
{
|
||||
@@ -229,6 +269,73 @@ CBS_get_u24_length_prefixed(CBS *cbs, CBS *out)
|
||||
return cbs_get_length_prefixed(cbs, out, 3);
|
||||
}
|
||||
|
||||
static int
|
||||
cbs_peek_u(CBS *cbs, uint32_t *out, size_t len)
|
||||
{
|
||||
uint32_t result = 0;
|
||||
size_t i;
|
||||
const uint8_t *data;
|
||||
|
||||
if (len < 1 || len > 4)
|
||||
return 0;
|
||||
|
||||
if (!cbs_peek(cbs, &data, len))
|
||||
return 0;
|
||||
|
||||
for (i = 0; i < len; i++) {
|
||||
result <<= 8;
|
||||
result |= data[i];
|
||||
}
|
||||
*out = result;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int
|
||||
CBS_peek_u8(CBS *cbs, uint8_t *out)
|
||||
{
|
||||
const uint8_t *v;
|
||||
|
||||
if (!cbs_peek(cbs, &v, 1))
|
||||
return 0;
|
||||
|
||||
*out = *v;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int
|
||||
CBS_peek_u16(CBS *cbs, uint16_t *out)
|
||||
{
|
||||
uint32_t v;
|
||||
|
||||
if (!cbs_peek_u(cbs, &v, 2))
|
||||
return 0;
|
||||
|
||||
*out = v;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int
|
||||
CBS_peek_u24(CBS *cbs, uint32_t *out)
|
||||
{
|
||||
return cbs_peek_u(cbs, out, 3);
|
||||
}
|
||||
|
||||
int
|
||||
CBS_peek_u32(CBS *cbs, uint32_t *out)
|
||||
{
|
||||
return cbs_peek_u(cbs, out, 4);
|
||||
}
|
||||
|
||||
int
|
||||
CBS_peek_last_u8(CBS *cbs, uint8_t *out)
|
||||
{
|
||||
if (cbs->len == 0)
|
||||
return 0;
|
||||
|
||||
*out = cbs->data[cbs->len - 1];
|
||||
return 1;
|
||||
}
|
||||
|
||||
int
|
||||
CBS_get_any_asn1_element(CBS *cbs, CBS *out, unsigned int *out_tag,
|
||||
size_t *out_header_len)
|
||||
|
Reference in New Issue
Block a user