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 | | */ |
6 | | |
7 | | #include <string.h> |
8 | | #include "fido.h" |
9 | | |
10 | | fido_blob_t * |
11 | | fido_blob_new(void) |
12 | 19.8k | { |
13 | 19.8k | return (calloc(1, sizeof(fido_blob_t))); |
14 | 19.8k | } |
15 | | |
16 | | int |
17 | | fido_blob_set(fido_blob_t *b, const unsigned char *ptr, size_t len) |
18 | 198k | { |
19 | 198k | if (b->ptr != NULL) { |
20 | 2.87k | explicit_bzero(b->ptr, b->len); |
21 | 2.87k | free(b->ptr); |
22 | 2.87k | b->ptr = NULL; |
23 | 2.87k | } |
24 | 198k | |
25 | 198k | b->len = 0; |
26 | 198k | |
27 | 198k | if (ptr == NULL || len == 0) { |
28 | 440 | fido_log_debug("%s: ptr=%p, len=%zu", __func__, |
29 | 440 | (const void *)ptr, len); |
30 | 440 | return (-1); |
31 | 440 | } |
32 | 197k | |
33 | 197k | if ((b->ptr = malloc(len)) == NULL) { |
34 | 675 | fido_log_debug("%s: malloc", __func__); |
35 | 675 | return (-1); |
36 | 675 | } |
37 | 197k | |
38 | 197k | memcpy(b->ptr, ptr, len); |
39 | 197k | b->len = len; |
40 | 197k | |
41 | 197k | return (0); |
42 | 197k | } |
43 | | |
44 | | void |
45 | | fido_blob_free(fido_blob_t **bp) |
46 | 26.6k | { |
47 | 26.6k | fido_blob_t *b; |
48 | 26.6k | |
49 | 26.6k | if (bp == NULL || (b = *bp) == NULL) |
50 | 26.6k | return; |
51 | 19.8k | |
52 | 19.8k | if (b->ptr) { |
53 | 17.5k | explicit_bzero(b->ptr, b->len); |
54 | 17.5k | free(b->ptr); |
55 | 17.5k | } |
56 | 19.8k | |
57 | 19.8k | explicit_bzero(b, sizeof(*b)); |
58 | 19.8k | free(b); |
59 | 19.8k | |
60 | 19.8k | *bp = NULL; |
61 | 19.8k | } |
62 | | |
63 | | void |
64 | | fido_free_blob_array(fido_blob_array_t *array) |
65 | 51.7k | { |
66 | 51.7k | if (array->ptr == NULL) |
67 | 51.7k | return; |
68 | 2.10k | |
69 | 146k | for (size_t i = 0; i < array->len; i++) { |
70 | 144k | fido_blob_t *b = &array->ptr[i]; |
71 | 144k | if (b->ptr != NULL) { |
72 | 144k | explicit_bzero(b->ptr, b->len); |
73 | 144k | free(b->ptr); |
74 | 144k | b->ptr = NULL; |
75 | 144k | } |
76 | 144k | } |
77 | 2.10k | |
78 | 2.10k | free(array->ptr); |
79 | 2.10k | array->ptr = NULL; |
80 | 2.10k | array->len = 0; |
81 | 2.10k | } |
82 | | |
83 | | cbor_item_t * |
84 | | fido_blob_encode(const fido_blob_t *b) |
85 | 3.06k | { |
86 | 3.06k | if (b == NULL || b->ptr == NULL) |
87 | 3.06k | return (NULL); |
88 | 2.99k | |
89 | 2.99k | return (cbor_build_bytestring(b->ptr, b->len)); |
90 | 2.99k | } |
91 | | |
92 | | int |
93 | | fido_blob_decode(const cbor_item_t *item, fido_blob_t *b) |
94 | 2.21k | { |
95 | 2.21k | return (cbor_bytestring_copy(item, &b->ptr, &b->len)); |
96 | 2.21k | } |
97 | | |
98 | | int |
99 | | fido_blob_is_empty(const fido_blob_t *b) |
100 | 386 | { |
101 | 386 | return (b->ptr == NULL || b->len == 0); |
102 | 386 | } |