diff --git a/seader_worker.c b/seader_worker.c index 4312eab..9f81e62 100644 --- a/seader_worker.c +++ b/seader_worker.c @@ -338,7 +338,7 @@ void sendCardDetected(SeaderUartBridge* seader_uart, CardDetails_t* cardDetails) ASN_STRUCT_FREE(asn_DEF_Payload, payload); } -bool unpack_pacs(SeaderCredential* seader_credential, uint8_t* buf, size_t size) { +bool unpack_pacs(SeaderWorker* seader_worker, SeaderCredential* seader_credential, uint8_t* buf, size_t size) { PAC_t* pac = 0; pac = calloc(1, sizeof *pac); assert(pac); @@ -354,14 +354,19 @@ bool unpack_pacs(SeaderCredential* seader_credential, uint8_t* buf, size_t size) } if(pac->size <= sizeof(seader_credential->credential)) { + // TODO: make credential into a 12 byte array seader_credential->bit_length = pac->size * 8 - pac->bits_unused; memcpy(&seader_credential->credential, pac->buf, pac->size); seader_credential->credential = __builtin_bswap64(seader_credential->credential); seader_credential->credential = seader_credential->credential >> (64 - seader_credential->bit_length); rtn = true; + } else { + // PACS too big (probably bad data) + if(seader_worker->callback) { + seader_worker->callback(SeaderWorkerEventFail, seader_worker->context); + } } - // TODO: make credential into a 12 byte array } ASN_STRUCT_FREE(asn_DEF_PAC, pac); @@ -383,7 +388,7 @@ bool parseSamResponse(SeaderWorker* seader_worker, SamResponse_t* samResponse) { seader_worker->callback(SeaderWorkerEventFail, seader_worker->context); } } - } else if(unpack_pacs(credential, samResponse->buf, samResponse->size)) { + } else if(unpack_pacs(seader_worker, credential, samResponse->buf, samResponse->size)) { if(seader_worker->callback) { seader_worker->callback(SeaderWorkerEventSuccess, seader_worker->context); }