Line | Count | Source |
1 | | /* |
2 | | * Copyright (c) 2018 Yubico AB. All rights reserved. |
3 | | * Use of this source code is governed by a BSD-style |
4 | | * license that can be found in the LICENSE file. |
5 | | * SPDX-License-Identifier: BSD-2-Clause |
6 | | */ |
7 | | |
8 | | #include "fido.h" |
9 | | |
10 | | fido_blob_t * |
11 | | fido_blob_new(void) |
12 | 153k | { |
13 | 153k | return calloc(1, sizeof(fido_blob_t)); |
14 | 153k | } |
15 | | |
16 | | void |
17 | | fido_blob_reset(fido_blob_t *b) |
18 | 9.98M | { |
19 | 9.98M | freezero(b->ptr, b->len); |
20 | 9.98M | explicit_bzero(b, sizeof(*b)); |
21 | 9.98M | } |
22 | | |
23 | | int |
24 | | fido_blob_set(fido_blob_t *b, const u_char *ptr, size_t len) |
25 | 1.92M | { |
26 | 1.92M | fido_blob_reset(b); |
27 | | |
28 | 1.92M | if (ptr == NULL || len == 0) { |
29 | 109k | fido_log_debug("%s: ptr=%p, len=%zu", __func__, |
30 | 109k | (const void *)ptr, len); |
31 | 109k | return -1; |
32 | 109k | } |
33 | | |
34 | 1.82M | if ((b->ptr = malloc(len)) == NULL) { |
35 | 4.92k | fido_log_debug("%s: malloc", __func__); |
36 | 4.92k | return -1; |
37 | 4.92k | } |
38 | | |
39 | 1.81M | memcpy(b->ptr, ptr, len); |
40 | 1.81M | b->len = len; |
41 | | |
42 | 1.81M | return 0; |
43 | 1.82M | } |
44 | | |
45 | | int |
46 | | fido_blob_append(fido_blob_t *b, const u_char *ptr, size_t len) |
47 | 2.85k | { |
48 | 2.85k | u_char *tmp; |
49 | | |
50 | 2.85k | if (ptr == NULL || len == 0) { |
51 | 45 | fido_log_debug("%s: ptr=%p, len=%zu", __func__, |
52 | 45 | (const void *)ptr, len); |
53 | 45 | return -1; |
54 | 45 | } |
55 | 2.81k | if (SIZE_MAX - b->len < len) { |
56 | 0 | fido_log_debug("%s: overflow", __func__); |
57 | 0 | return -1; |
58 | 0 | } |
59 | 2.81k | if ((tmp = realloc(b->ptr, b->len + len)) == NULL) { |
60 | 11 | fido_log_debug("%s: realloc", __func__); |
61 | 11 | return -1; |
62 | 11 | } |
63 | 2.79k | b->ptr = tmp; |
64 | 2.79k | memcpy(&b->ptr[b->len], ptr, len); |
65 | 2.79k | b->len += len; |
66 | | |
67 | 2.79k | return 0; |
68 | 2.81k | } |
69 | | |
70 | | void |
71 | | fido_blob_free(fido_blob_t **bp) |
72 | 274k | { |
73 | 274k | fido_blob_t *b; |
74 | | |
75 | 274k | if (bp == NULL || (b = *bp) == NULL) |
76 | 121k | return; |
77 | | |
78 | 153k | fido_blob_reset(b); |
79 | 153k | free(b); |
80 | 153k | *bp = NULL; |
81 | 153k | } |
82 | | |
83 | | void |
84 | | fido_free_blob_array(fido_blob_array_t *array) |
85 | 650k | { |
86 | 650k | if (array->ptr == NULL) |
87 | 614k | return; |
88 | | |
89 | 1.36M | for (size_t i = 0; i < array->len; i++) { |
90 | 1.33M | fido_blob_t *b = &array->ptr[i]; |
91 | 1.33M | freezero(b->ptr, b->len); |
92 | 1.33M | b->ptr = NULL; |
93 | 1.33M | } |
94 | | |
95 | 36.0k | free(array->ptr); |
96 | 36.0k | array->ptr = NULL; |
97 | 36.0k | array->len = 0; |
98 | 36.0k | } |
99 | | |
100 | | cbor_item_t * |
101 | | fido_blob_encode(const fido_blob_t *b) |
102 | 45.7k | { |
103 | 45.7k | if (b == NULL || b->ptr == NULL) |
104 | 94 | return NULL; |
105 | | |
106 | 45.7k | return cbor_build_bytestring(b->ptr, b->len); |
107 | 45.7k | } |
108 | | |
109 | | int |
110 | | fido_blob_decode(const cbor_item_t *item, fido_blob_t *b) |
111 | 112k | { |
112 | 112k | return cbor_bytestring_copy(item, &b->ptr, &b->len); |
113 | 112k | } |
114 | | |
115 | | int |
116 | | fido_blob_is_empty(const fido_blob_t *b) |
117 | 372k | { |
118 | 372k | return b->ptr == NULL || b->len == 0; |
119 | 372k | } |
120 | | |
121 | | int |
122 | | fido_blob_serialise(fido_blob_t *b, const cbor_item_t *item) |
123 | 5.10k | { |
124 | 5.10k | size_t alloc; |
125 | | |
126 | 5.10k | if (!fido_blob_is_empty(b)) |
127 | 0 | return -1; |
128 | 5.10k | if ((b->len = cbor_serialize_alloc(item, &b->ptr, &alloc)) == 0) { |
129 | 18 | b->ptr = NULL; |
130 | 18 | return -1; |
131 | 18 | } |
132 | | |
133 | 5.08k | return 0; |
134 | 5.10k | } |