From 7644e834c6c1afcd7ce0ff91078144196a009a69 Mon Sep 17 00:00:00 2001 From: nganhkhoa Date: Mon, 6 Mar 2023 17:19:09 +0700 Subject: [PATCH] clean up logging to info and verbose --- app/src/main/cpp/api.cpp | 46 ++++++++++------------------------------ app/src/main/cpp/des.cpp | 9 -------- app/src/main/cpp/utils.h | 46 ++++++++++++++++++++++++---------------- 3 files changed, 39 insertions(+), 62 deletions(-) diff --git a/app/src/main/cpp/api.cpp b/app/src/main/cpp/api.cpp index 31a92fc..2512a84 100644 --- a/app/src/main/cpp/api.cpp +++ b/app/src/main/cpp/api.cpp @@ -50,6 +50,7 @@ bytes Connector::finalizeAPDU(int cla, int ins, int p1, int p2, int ne, bytes& d } Connector::Response Connector::sendICC(int cla, int ins, int p1, int p2, int ne, bytes& data) { +#define VERBOSE_LOGGING VERBOSE_LOGGING_ON LOGI("========================================"); LOGI("send %02x%02x%02x%02x", cla, ins, p1, p2); logBytes(" send data %s", data); @@ -76,20 +77,14 @@ Connector::Response Connector::sendICC(int cla, int ins, int p1, int p2, int ne, iso9797_pad(M); M.insert(M.end(), dataDO.begin(), dataDO.end()); M.insert(M.end(), do97.begin(), do97.end()); - logBytes("M %s", M); bytes N = sm->next_ssc(); N.insert(N.end(), M.begin(), M.end()); iso9797_pad(N); - logBytes("N %s", N); - bytes CC = sm->mac(N); bytes do8e = sm->do8e(CC); - logBytes("CC %s", CC); - logBytes("do8e %s", do8e); - data.clear(); data.insert(data.end(), dataDO.begin(), dataDO.end()); data.insert(data.end(), do97.begin(), do97.end()); @@ -124,16 +119,11 @@ Connector::Response Connector::sendICC(int cla, int ins, int p1, int p2, int ne, auto do99 = sm->parseDO99(response.data, DO->size); // this can be null auto do8e = sm->parseDO8E(response.data, DO->size + do99->size); - logBytes("do %s", DO->value); - logBytes("do99 %s", do99->value); - logBytes("do8e %s", do8e->value); - bytes K = sm->next_ssc(); K.insert(K.end(), response.data.begin(), response.data.begin() + DO->size + do99->size); iso9797_pad(K); uint64_t CC = bytes2num(sm->mac(K)); - LOGI("mac check %llx", CC); if (CC != bytes2num(do8e->value)) { throw "Decoding message failure: different mac"; @@ -153,7 +143,6 @@ Connector::Response Connector::sendICC(int cla, int ins, int p1, int p2, int ne, if (isPadded) { iso9797_unpad(response.data); } - logBytes("decrypted %s", response.data); response.success = true; response.code = (do99->value[0] << 8) | do99->value[1]; } @@ -161,6 +150,7 @@ Connector::Response Connector::sendICC(int cla, int ins, int p1, int p2, int ne, logBytes(" decrypted raw %s", raw_response); logBytes(" decrypted decoded %s", response.data); return response; +#define VERBOSE_LOGGING VERBOSE_LOGGING_OFF } Connector::Response Connector::decodeResponse(bytes& response) { @@ -358,6 +348,7 @@ bytes Connector::readFileBySFI(int sfi) { } bytes Connector::readBinary(size_t offset, size_t length) { +#define VERBOSE_LOGGING VERBOSE_LOGGING_ON bytes r; const size_t maxToRead = 256; @@ -383,6 +374,7 @@ bytes Connector::readBinary(size_t offset, size_t length) { length -= s; } return r; +#define VERBOSE_LOGGING VERBOSE_LOGGING_OFF } void Connector::readEFCOM() { @@ -429,6 +421,9 @@ void Connector::readEFDG15() { LOGI("FILE DG15 size %d", content.size()); logBytes("FILE DG15 sha256 %s", digest); calculatedDigests[15] = digest; + + // skip 4 dummy bytes + dg15 = bytes(content.begin() + 4, content.end()); } typedef struct DigestItem { @@ -457,25 +452,6 @@ ASN1_SEQUENCE(EncapsulatedContent) = { } ASN1_SEQUENCE_END(EncapsulatedContent) IMPLEMENT_ASN1_FUNCTIONS(EncapsulatedContent) -#include - -#if OPENSSL_VERSION_NUMBER >= 0x10100000L -typedef struct ECDSA_SIG_st { - BIGNUM *r; - BIGNUM *s; -} ECDSA_SIG; - -typedef struct bignum_st -{ -BN_ULONG *d; /* Pointer to an array of 'BN_BITS2' bit chunks. */ -int top; /* Index of last used d +1. */ -/* The next are internal book keeping for bn_expand. */ -int dmax; /* Size of the d array. */ -int neg; /* one if the number is negative */ -int flags; -}; -#endif - void Connector::readEFSOD() { auto content = readFileBySFI(EFSOD_SFI); bytes digest(256 / 8); @@ -531,11 +507,10 @@ void Connector::readEFSOD() { auto attr = (X509_ATTRIBUTE*)sk_value(attrs, i); auto x = X509_ATTRIBUTE_get0_type(attr, 0); -// LOGI("%d", ASN1_TYPE_get(x)); - if (ASN1_TYPE_get(x) == 4) { + if (ASN1_TYPE_get(x) == V_ASN1_OCTET_STRING) { auto p = x->value.octet_string; auto pp = bytes(p->data, p->data + p->length); - logBytes("sod stored message digest %s", pp); + logBytes("SOD stored message digest %s", pp); if (pp != encapsulatedDigest) { throw "Encapsulated digest check with attribute data wrong"; @@ -572,6 +547,7 @@ void Connector::readEFSOD() { BN_bn2hex(ECDSA_SIG_get0_r(cert_sig)), BN_bn2hex(ECDSA_SIG_get0_s(cert_sig))); + // tested personally, <1000 bytes, uncertain bytes tbs(1000); unsigned char* tbsPtr = tbs.data(); int tbsSize = i2d_re_X509_tbs(cert, &tbsPtr); @@ -596,7 +572,7 @@ void Connector::readEFSOD() { EC_KEY_set_public_key_affine_coordinates(ca, ca_x, ca_y); bool ca_verify = ECDSA_do_verify(tbsDigest.data(), tbsDigest.size(), cert_sig, ca); - LOGI("ca verified status %d\n", ca_verify); + LOGI("CA verified status %d\n", ca_verify); if (ca_verify != 1) { throw "verification with CA returns false"; diff --git a/app/src/main/cpp/des.cpp b/app/src/main/cpp/des.cpp index ccc6fe9..0afdf93 100644 --- a/app/src/main/cpp/des.cpp +++ b/app/src/main/cpp/des.cpp @@ -178,9 +178,6 @@ bytes des_encrypt(bytes data, uint64_t key) { r.insert(r.end(), x.begin(), x.end()); cbc = input; } - LOGI("des encrypt: %llx", key); - logBytes(" input %s", data); - logBytes(" output %s", r); return r; } @@ -204,9 +201,6 @@ bytes tripledes_cbc_encrypt(bytes data, uint64_t key1, uint64_t key2, uint64_t k } cbc = input; } - LOGI("3des encrypt: %llx %llx %llx", key1, key2, key3); - logBytes(" input %s", data); - logBytes(" output %s", r); return r; } @@ -231,9 +225,6 @@ bytes tripledes_cbc_decrypt(bytes data, uint64_t key1, uint64_t key2, uint64_t k } cbc = before_transform; } - LOGI("3des decrypt: %llx %llx %llx", key1, key2, key3); - logBytes(" input %s", data); - logBytes(" output %s", r); return r; } diff --git a/app/src/main/cpp/utils.h b/app/src/main/cpp/utils.h index 46f66ec..52e332e 100644 --- a/app/src/main/cpp/utils.h +++ b/app/src/main/cpp/utils.h @@ -15,8 +15,33 @@ #include #include -#define LOGTAG "CCCC_LOGGER" -#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOGTAG, __VA_ARGS__) +#define VERBOSE_LOGGING_ON 1 +#define VERBOSE_LOGGING_OFF 0 + +#define VERBOSE_LOGGING VERBOSE_LOGGING_OFF + +#define LOGTAG_LOGGER "CCCC_LOGGER" +#define LOGTAG_PROTOCOL "CCCC_PROTOCOL" + +#define LOGI(...) \ +do {\ +if (VERBOSE_LOGGING == VERBOSE_LOGGING_ON) \ + __android_log_print(ANDROID_LOG_VERBOSE, LOGTAG_PROTOCOL, __VA_ARGS__); \ +else \ + __android_log_print(ANDROID_LOG_INFO, LOGTAG_LOGGER, __VA_ARGS__); \ +} while (0) + +#define logBytes(msg, data) \ +do { \ +unsigned char charmap[] = {'0', '1', '2', '3', '4', '5', '6', '7', \ + '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; \ +std::string stream; \ +for (size_t i = 0; i < (data).size(); i++) { \ +stream += charmap[((data)[i] >> 4)]; \ +stream += charmap[(data)[i] & 0x0f]; \ +} \ +LOGI((msg), stream.c_str()); \ +} while (0) typedef std::vector bytes; @@ -29,26 +54,11 @@ inline bytes randomBytes(size_t length) { std::numeric_limits::max()); static std::default_random_engine generator; - std::vector data(length); + bytes data(length); std::generate(data.begin(), data.end(), []() { return distribution(generator); }); return data; } -inline void logBytes(const char* msg, const bytes& data) { - unsigned char charmap[] = { - '0', '1', '2', '3', - '4', '5', '6', '7', - '8', '9', 'A', 'B', - 'C', 'D', 'E', 'F' - }; - std::string stream; - for (size_t i = 0; i < data.size(); i++) { - stream += charmap[(data[i] >> 4)]; - stream += charmap[data[i] & 0x0f]; - } - LOGI(msg, stream.c_str()); -} - inline uint64_t bytes2num(bytes data) { uint64_t num = 0; num = std::accumulate(data.begin(), data.end(), num,