00001
00002
00003
00004
00005
00006
00007
00008
00009 #include <ccid.h>
00010
00011 #include "ccid-internal.h"
00012
00013 #define MIN_RESP_LEN 2U
00014
00015 struct _xfr *_xfr_do_alloc(size_t txbuf, size_t rxbuf)
00016 {
00017 uint8_t *ptr;
00018 struct _xfr *xfr;
00019 size_t tot_len;
00020
00021 tot_len = sizeof(*xfr) + txbuf + rxbuf + sizeof(*xfr->x_txhdr) * 2;
00022 ptr = calloc(1, tot_len);
00023 if ( NULL == ptr )
00024 return NULL;
00025
00026 xfr = (struct _xfr *)ptr;
00027 ptr += sizeof(*xfr);
00028
00029 xfr->x_txmax = txbuf;
00030 xfr->x_rxmax = txbuf;
00031
00032 xfr->x_txhdr = (struct ccid_msg *)ptr;
00033 ptr += sizeof(*xfr->x_txhdr);
00034
00035 xfr->x_txbuf = ptr;
00036 ptr += txbuf;
00037
00038 xfr->x_rxhdr = (struct ccid_msg *)ptr;
00039 ptr += sizeof(*xfr->x_rxhdr);
00040
00041 xfr->x_rxbuf = ptr;
00042
00043 return xfr;
00044 }
00045
00053 xfr_t xfr_alloc(size_t txbuf, size_t rxbuf)
00054 {
00055 return _xfr_do_alloc(txbuf, rxbuf);
00056 }
00057
00064 void xfr_reset(xfr_t xfr)
00065 {
00066 xfr->x_txlen = xfr->x_rxlen = 0;
00067 }
00068
00075 int xfr_tx_byte(xfr_t xfr, uint8_t byte)
00076 {
00077 if ( xfr->x_txlen >= xfr->x_txmax )
00078 return 0;
00079
00080 xfr->x_txbuf[xfr->x_txlen] = byte;
00081 xfr->x_txlen++;
00082
00083 return 1;
00084 }
00085
00097 int xfr_tx_buf(xfr_t xfr, const uint8_t *ptr, size_t len)
00098 {
00099 if ( xfr->x_txlen + len > xfr->x_txmax )
00100 return 0;
00101
00102 memcpy(xfr->x_txbuf + xfr->x_txlen, ptr, len);
00103 xfr->x_txlen += len;
00104
00105 return 1;
00106 }
00107
00114 uint8_t xfr_rx_sw1(xfr_t xfr)
00115 {
00116 uint8_t *end;
00117 assert(xfr->x_rxlen >= MIN_RESP_LEN);
00118 end = xfr->x_rxbuf + xfr->x_rxlen;
00119 return end[-2];
00120 }
00121
00128 uint8_t xfr_rx_sw2(xfr_t xfr)
00129 {
00130 uint8_t *end;
00131 assert(xfr->x_rxlen >= MIN_RESP_LEN);
00132 end = xfr->x_rxbuf + xfr->x_rxlen;
00133 return end[-1];
00134 }
00135
00147 const uint8_t *xfr_rx_data(xfr_t xfr, size_t *len)
00148 {
00149 if ( xfr->x_rxlen < MIN_RESP_LEN )
00150 return NULL;
00151 *len = xfr->x_rxlen - MIN_RESP_LEN;
00152 return xfr->x_rxbuf;
00153 }
00154
00155 void _xfr_do_free(struct _xfr *xfr)
00156 {
00157 free(xfr);
00158 }
00159
00165 void xfr_free(xfr_t xfr)
00166 {
00167 _xfr_do_free(xfr);
00168 }