diff --git a/src/cardpincheck.c b/src/cardpincheck.c index ae1da9a..ed884e1 100644 --- a/src/cardpincheck.c +++ b/src/cardpincheck.c @@ -1,5 +1,5 @@ /* Cryptographic card PIN check and RSA decryption utility - * Copyright (C) 2015 Timothy Pearson + * Copyright (C) 2015 - 2020 Timothy Pearson * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,6 +16,7 @@ */ #include +#include #include #include #include @@ -138,9 +139,10 @@ char* tde_autopin(X509* x509_cert) { int asn1SeqValueObjectTag; int asn1SeqValueObjectClass; int returnCode; + const uint8_t* asnSeqValueString = ASN1_STRING_get0_data(asnValue->value.sequence); index = 0; // Search for the PIN field - asnSeqValueStack = ASN1_seq_unpack_ASN1_TYPE(ASN1_STRING_data(asnValue->value.sequence), ASN1_STRING_length(asnValue->value.sequence), d2i_ASN1_TYPE, ASN1_TYPE_free); + asnSeqValueStack = d2i_ASN1_SEQUENCE_ANY(NULL, &asnSeqValueString, ASN1_STRING_length(asnValue->value.sequence)); asnSeqValue = sk_ASN1_TYPE_value(asnSeqValueStack, index); if (asnSeqValue) { if (asnSeqValue->value.octet_string->data[0] == ((V_ASN1_CONSTRUCTED | V_ASN1_CONTEXT_SPECIFIC) + index)) { @@ -149,12 +151,13 @@ char* tde_autopin(X509* x509_cert) { if (!(returnCode & 0x80)) { if (returnCode == (V_ASN1_CONSTRUCTED + index)) { if (d2i_ASN1_GENERALSTRING(&asnGeneralString, &asn1SeqValueObjectData, asn1SeqValueObjectLength) != NULL) { - retString = strdup(ASN1_STRING_data(asnGeneralString)); + retString = strdup(ASN1_STRING_get0_data(asnGeneralString)); } } } } } + sk_ASN1_TYPE_pop_free(asnSeqValueStack, ASN1_TYPE_free); } } }