diff --git a/lib/ykpiv.c b/lib/ykpiv.c index 1322a9e..3921f48 100644 --- a/lib/ykpiv.c +++ b/lib/ykpiv.c @@ -602,3 +602,27 @@ ykpiv_rc ykpiv_verify(ykpiv_state *state, const char *pin, int *tries) { return YKPIV_GENERIC_ERROR; } } + +ykpiv_rc ykpiv_fetch_object(ykpiv_state *state, int object_id, + unsigned char *data, unsigned long *len) { + int sw; + unsigned char indata[5]; + unsigned char templ[] = {0, YKPIV_INS_GET_DATA, 0x3b, 0xff}; + long inlen = 5; + + indata[0] = 0x5c; + if(object_id == YKPIV_OBJ_DISCOVERY) { + indata[1] = 1; + indata[2] = YKPIV_OBJ_DISCOVERY; + inlen = 3; + } else if(object_id > 0xffff && object_id <= 0xffffff) { + indata[1] = 3; + indata[2] = (object_id >> 16) & 0xff; + indata[3] = (object_id >> 8) & 0xff; + indata[4] = object_id & 0xff; + } else { + return YKPIV_INVALID_OBJECT; + } + + return ykpiv_transfer_data(state, templ, indata, inlen, data, len, &sw); +} diff --git a/lib/ykpiv.h b/lib/ykpiv.h index ebdca28..6c4dc54 100644 --- a/lib/ykpiv.h +++ b/lib/ykpiv.h @@ -54,6 +54,7 @@ extern "C" YKPIV_KEY_ERROR = -8, YKPIV_PARSE_ERROR = -9, YKPIV_WRONG_PIN = -10, + YKPIV_INVALID_OBJECT = -11, } ykpiv_rc; const char *ykpiv_strerror(ykpiv_rc err); @@ -77,6 +78,8 @@ extern "C" unsigned char algorithm, unsigned char key); ykpiv_rc ykpiv_get_version(ykpiv_state *state, char *version, size_t len); ykpiv_rc ykpiv_verify(ykpiv_state *state, const char *pin, int *tries); + ykpiv_rc ykpiv_fetch_object(ykpiv_state *state, int object_id, + unsigned char *data, unsigned long *len); #define YKPIV_ALGO_3DES 0x03 #define YKPIV_ALGO_RSA1024 0x06 diff --git a/lib/ykpiv.map b/lib/ykpiv.map index 1e156ac..532439e 100644 --- a/lib/ykpiv.map +++ b/lib/ykpiv.map @@ -42,6 +42,7 @@ global: ykpiv_sign_data; ykpiv_get_version; ykpiv_verify; + ykpiv_fetch_object; local: *;