| 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 |  | iso7816_apdu_t * | 
| 11 |  | iso7816_new(uint8_t cla, uint8_t ins, uint8_t p1, uint16_t payload_len) | 
| 12 | 44.6k | { | 
| 13 | 44.6k |         iso7816_apdu_t *apdu; | 
| 14 | 44.6k |         size_t alloc_len; | 
| 15 |  |  | 
| 16 | 44.6k |         alloc_len = sizeof(iso7816_apdu_t) + payload_len + 2; /* le1 le2 */ | 
| 17 | 44.6k |         if ((apdu = calloc(1, alloc_len)) == NULL) | 
| 18 | 626 |                 return NULL; | 
| 19 | 43.9k |         apdu->alloc_len = alloc_len; | 
| 20 | 43.9k |         apdu->payload_len = payload_len; | 
| 21 | 43.9k |         apdu->payload_ptr = apdu->payload; | 
| 22 | 43.9k |         apdu->header.cla = cla; | 
| 23 | 43.9k |         apdu->header.ins = ins; | 
| 24 | 43.9k |         apdu->header.p1 = p1; | 
| 25 | 43.9k |         apdu->header.lc2 = (uint8_t)((payload_len >> 8) & 0xff); | 
| 26 | 43.9k |         apdu->header.lc3 = (uint8_t)(payload_len & 0xff); | 
| 27 |  |  | 
| 28 | 43.9k |         return apdu; | 
| 29 | 44.6k | } | 
| 30 |  |  | 
| 31 |  | void | 
| 32 |  | iso7816_free(iso7816_apdu_t **apdu_p) | 
| 33 | 48.1k | { | 
| 34 | 48.1k |         iso7816_apdu_t *apdu; | 
| 35 |  |  | 
| 36 | 48.1k |         if (apdu_p == NULL || (apdu = *apdu_p) == NULL) | 
| 37 | 4.11k |                 return; | 
| 38 | 43.9k |         freezero(apdu, apdu->alloc_len); | 
| 39 | 43.9k |         *apdu_p = NULL; | 
| 40 | 43.9k | } | 
| 41 |  |  | 
| 42 |  | int | 
| 43 |  | iso7816_add(iso7816_apdu_t *apdu, const void *buf, size_t cnt) | 
| 44 | 80.4k | { | 
| 45 | 80.4k |         if (cnt > apdu->payload_len || cnt > UINT16_MAX) | 
| 46 | 0 |                 return -1; | 
| 47 | 80.4k |         memcpy(apdu->payload_ptr, buf, cnt); | 
| 48 | 80.4k |         apdu->payload_ptr += cnt; | 
| 49 | 80.4k |         apdu->payload_len = (uint16_t)(apdu->payload_len - cnt); | 
| 50 |  |  | 
| 51 | 80.4k |         return 0; | 
| 52 | 80.4k | } | 
| 53 |  |  | 
| 54 |  | const unsigned char * | 
| 55 |  | iso7816_ptr(const iso7816_apdu_t *apdu) | 
| 56 | 47.2k | { | 
| 57 | 47.2k |         return (const unsigned char *)&apdu->header; | 
| 58 | 47.2k | } | 
| 59 |  |  | 
| 60 |  | size_t | 
| 61 |  | iso7816_len(const iso7816_apdu_t *apdu) | 
| 62 | 47.2k | { | 
| 63 | 47.2k |         return apdu->alloc_len - offsetof(iso7816_apdu_t, header) - | 
| 64 |  |             (sizeof(iso7816_apdu_t) - offsetof(iso7816_apdu_t, payload)); | 
| 65 | 47.2k | } |