You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

79 lines
2.5 KiB

From fda9b6dd088e734de372fc85c091f88e8607bc2e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Nguy=E1=BB=85n=20H=E1=BB=93ng=20Qu=C3=A2n?=
<ng.hong.quan@gmail.com>
Date: Tue, 26 Feb 2013 17:37:16 +0700
Subject: [PATCH 04/26] PKCS15-OpenPGP: Declare DATA objects.
Begin to support read/write DATA object for PKCS-OpenPGP binding.
This object is used by TrueCrypt.
---
src/libopensc/pkcs15-openpgp.c | 35 +++++++++++++++++++++++++++++++++++
1 file changed, 35 insertions(+)
Index: opensc-20150513/src/libopensc/pkcs15-openpgp.c
===================================================================
--- opensc-20150513.orig/src/libopensc/pkcs15-openpgp.c
+++ opensc-20150513/src/libopensc/pkcs15-openpgp.c
@@ -34,6 +34,7 @@
#include "log.h"
int sc_pkcs15emu_openpgp_init_ex(sc_pkcs15_card_t *, sc_pkcs15emu_opt_t *);
+static int sc_pkcs15emu_openpgp_add_data(sc_pkcs15_card_t *);
#define PGP_USER_PIN_FLAGS (SC_PKCS15_PIN_FLAG_CASE_SENSITIVE \
@@ -43,6 +44,8 @@ int sc_pkcs15emu_openpgp_init_ex(sc_pkcs
| SC_PKCS15_PIN_FLAG_UNBLOCK_DISABLED \
| SC_PKCS15_PIN_FLAG_SO_PIN)
+#define PGP_NUM_PRIVDO 4
+
typedef struct _pgp_pin_cfg {
const char *label;
int reference;
@@ -357,6 +360,9 @@ sc_pkcs15emu_openpgp_init(sc_pkcs15_card
goto failed;
}
+ /* PKCS#15 DATA object from OpenPGP private DOs */
+ r = sc_pkcs15emu_openpgp_add_data(p15card);
+
return 0;
failed: sc_debug(card->ctx, SC_LOG_DEBUG_NORMAL, "Failed to initialize OpenPGP emulation: %s\n",
@@ -364,6 +370,35 @@ failed: sc_debug(card->ctx, SC_LOG_DEBUG
return r;
}
+static int
+sc_pkcs15emu_openpgp_add_data(sc_pkcs15_card_t *p15card)
+{
+ sc_context_t *ctx = p15card->card->ctx;
+ int i, r;
+
+ LOG_FUNC_CALLED(ctx);
+ /* There is 4 private DO from 0101 to 0104 */
+ for (i = 1; i <= PGP_NUM_PRIVDO; i++) {
+ sc_pkcs15_data_info_t dat_info;
+ sc_pkcs15_object_t dat_obj;
+ char name[8];
+ char path[9];
+ memset(&dat_info, 0, sizeof(dat_info));
+ memset(&dat_obj, 0, sizeof(dat_obj));
+
+ sprintf(name, "PrivDO%d", i);
+ sprintf(path, "3F00010%d", i);
+
+ sc_format_path(path, &dat_info.path);
+ strlcpy(dat_obj.label, name, sizeof(dat_obj.label));
+ strlcpy(dat_info.app_label, name, sizeof(dat_info.app_label));
+
+ sc_log(ctx, "Add %s data object", name);
+ r = sc_pkcs15emu_add_data_object(p15card, &dat_obj, &dat_info);
+ }
+ LOG_FUNC_RETURN(ctx, r);
+}
+
static int openpgp_detect_card(sc_pkcs15_card_t *p15card)
{
if (p15card->card->type == SC_CARD_TYPE_OPENPGP_V1 || p15card->card->type == SC_CARD_TYPE_OPENPGP_V2