Hi,
For container's GUID I propose to adopt the classic serialized form
(ex.{3F2504E0-4F89-11D3-9A0C-0305E82C3301})
used by Windows containers.
In this patch there is also little simplification of the key research, and some
minor remarks.
Kind wishes,
Viktor.
--
Viktor Tarasov <[email protected]>
Index: src/cardmod/cardmod.c
===================================================================
--- src/cardmod/cardmod.c (révision 5226)
+++ src/cardmod/cardmod.c (copie de travail)
@@ -58,6 +58,10 @@
#define SCARD_F_UNKNOWN_ERROR 0x80100014L
#endif
+/*
+#define NO_HASH_IN_CARDSIGNDATA
+*/
+
typedef struct _VENDOR_SPECIFIC
{
char *pin;
@@ -248,6 +252,34 @@
return bits;
}
+
+/*
+ * Serialize GUID
+ * Ex. {3F2504E0-4F89-11D3-9A0C-0305E82C3301}
+ */
+static int serialize_guid(unsigned char *in, char *out, size_t out_len)
+{
+ int ii, jj, in_offs = 0, out_offs = 0;
+
+ if (out_len < 39) /* In cardmod.h MAX_CONTAINER_NAME_LEN defined
as 39 */
+ return SCARD_E_INSUFFICIENT_BUFFER;
+
+ strcpy(out, "{");
+ for (ii=0; ii<4; ii++)
+ sprintf(out + strlen(out), "%02X", *(in + in_offs++));
+ for (jj=0; jj<3; jj++) {
+ strcat(out, "-");
+ for (ii=0; ii<2; ii++)
+ sprintf(out + strlen(out), "%02X", *(in + in_offs++));
+ }
+ strcat(out, "-");
+ for (ii=0; ii<6; ii++)
+ sprintf(out + strlen(out), "%02X", *(in + in_offs++));
+ strcat(out, "}");
+ return SCARD_S_SUCCESS;
+}
+
+
DWORD WINAPI CardDeleteContext(__inout PCARD_DATA pCardData)
{
int i;
@@ -693,11 +725,10 @@
for(i = 0, p = (PCONTAINER_MAP_RECORD)*ppbData; \
i < vs->cert_count; i++,p++)
{
+ struct sc_pkcs15_cert_info *cert_info =
(sc_pkcs15_cert_info_t *)vs->cert_objs[i]->data;
sc_pkcs15_cert_t *cert = NULL;
- r = sc_pkcs15_read_certificate(vs->p15card, \
- (struct sc_pkcs15_cert_info
*)(vs->cert_objs[i]->data), \
- &cert);
+ r = sc_pkcs15_read_certificate(vs->p15card,
cert_info, &cert);
logprintf(pCardData, 2,
"sc_pkcs15_read_certificate return %d\n", r);
if(r)
{
@@ -706,55 +737,25 @@
pubkey = cert->key;
if(pubkey->algorithm == SC_ALGORITHM_RSA)
{
- char guid[MAX_CONTAINER_NAME_LEN + 1];
- char *g;
- char *sn;
- size_t snlen;
- size_t idlen;
- u8 * id;
- int si;
-
- /* We need unique number here, so
- * Use card serial number +
sc_pkcs15_id of the cert.
- * the wszGuid is 39 characters,
- * The sc_pkcs15_id can be 255 and is
binary an must be converted
- * serial is large and character
- * So will use as much of the id as
posible.
- * converting to a string.
- * Will do this in ingle byte char then
convert to wchar
+ struct sc_card *card =
vs->p15card->card;
+ unsigned char
guid_bin[SC_PKCS15_MAX_ID_SIZE + SC_MAX_SERIALNR];
+ char guid[MAX_CONTAINER_NAME_LEN + 1];
+
+ /* The globally unique identifier
derived from the PKCS#15 object
+ * identifier concatenated with the
card's serial number.
+ * So that, the object's id will be
used as much as possible.
+ * Will do this firstly in single byte
char then convert to wchar.
*/
- id = (u8 *)((sc_pkcs15_cert_info_t
*)vs->cert_objs[i]->data)->id.value;
- idlen = ((sc_pkcs15_cert_info_t
*)vs->cert_objs[i]->data)->id.len;
-
- if (idlen > MAX_CONTAINER_NAME_LEN/2) {
- id += idlen -
MAX_CONTAINER_NAME_LEN/2;
- idlen =
MAX_CONTAINER_NAME_LEN/2;
+ memset(guid_bin, 0, sizeof(guid_bin));
+ memcpy(guid_bin, cert_info->id.value,
cert_info->id.len);
+ memcpy(guid_bin + cert_info->id.len,
card->serialnr.value, card->serialnr.len);
+ r = serialize_guid(guid_bin, guid,
sizeof(guid));
+ if(r)
+ {
+ return r;
}
-
- g = guid;
- /* if id (convereted to printable) is
less then MAX_CONTAINER_NAME_LEN */
- /* use last part of serial number. */
- logprintf(pCardData, 7, "DEE id=%p:%d
g=%p\n", id, idlen, g);
- if (idlen * 2 < MAX_CONTAINER_NAME_LEN)
{
- si = MAX_CONTAINER_NAME_LEN -
idlen * 2;
- sn =
vs->p15card->tokeninfo->serial_number;
- snlen=
strlen(vs->p15card->tokeninfo->serial_number);
- logprintf(pCardData, 7, "DEE
si=%d sn=%d\n", si, sn);
- if (snlen > si) {
- sn += snlen - si;
- snlen = si;
- }
- logprintf(pCardData, 7, "DEE
si=%d g=%p sn=%p:%d\n", si,g, sn, snlen);
- memcpy(g, sn, snlen);
- g += snlen;
-
- }
- for (si = 0; si < idlen; si++) {
- sprintf(g, "%02X", id[si]);
- g +=2;
- }
- *g = '\0';
+
logprintf(pCardData, 7, "Guid=%s\n",
guid);
mbstowcs(p->wszGuid, guid,
MAX_CONTAINER_NAME_LEN + 1);
@@ -1061,9 +1062,9 @@
__in PCARD_SIGNING_INFO pInfo)
{
int r;
- int i, opt_crypt_flags = 0;
+ int i, opt_crypt_flags;
VENDOR_SPECIFIC *vs;
- ALG_ID hashAlg = pInfo->aiHashAlg;
+ ALG_ID hashAlg;
sc_pkcs15_cert_info_t *cert_info;
sc_pkcs15_prkey_info_t *prkey_info;
@@ -1078,8 +1079,12 @@
pInfo->dwVersion,pInfo->bContainerIndex ,pInfo->dwKeySpec, \
pInfo->dwSigningFlags, pInfo->aiHashAlg, pInfo->cbData);
+ hashAlg = pInfo->aiHashAlg;
+
vs = (VENDOR_SPECIFIC*)(pCardData->pvVendorSpecific);
+ opt_crypt_flags = SC_ALGORITHM_RSA_PAD_PKCS1;
+
check_reader_status(pCardData);
vs->pkey = NULL;
@@ -1094,7 +1099,6 @@
logprintf(pCardData, 0, "unsupported paddingtype\n");
return SCARD_E_UNSUPPORTED_FEATURE;
}
- opt_crypt_flags += SC_ALGORITHM_RSA_PAD_PKCS1;
if (!pinf->pszAlgId)
{
/* hashAlg = CALG_SSL3_SHAMD5; */
@@ -1115,8 +1119,6 @@
{
logprintf(pCardData, 3, "CARD_PADDING_INFO_PRESENT not set\n");
- opt_crypt_flags = SC_ALGORITHM_RSA_PAD_PKCS1;
-
if (GET_ALG_CLASS(hashAlg) != ALG_CLASS_HASH)
{
logprintf(pCardData, 0, "bogus aiHashAlg\n");
@@ -1129,12 +1131,14 @@
return SCARD_E_UNSUPPORTED_FEATURE;
}
+#ifndef NO_HASH_IN_CARDSIGNDATA
if (hashAlg == CALG_MD5)
opt_crypt_flags += SC_ALGORITHM_RSA_HASH_MD5;
if (hashAlg == CALG_SHA1)
opt_crypt_flags += SC_ALGORITHM_RSA_HASH_SHA1;
if (hashAlg == CALG_SSL3_SHAMD5)
opt_crypt_flags += SC_ALGORITHM_RSA_HASH_MD5_SHA1;
+#endif
}
logprintf(pCardData, 2, "pInfo->pbSignedData = %p, opt_crypt_flags =
0x%08X\n", \
@@ -1147,32 +1151,21 @@
cert_info = (struct sc_pkcs15_cert_info *) \
(vs->cert_objs[pInfo->bContainerIndex]->data);
-
- for(i = 0; i < vs->prkey_count; i++)
- {
- sc_pkcs15_object_t *obj = (sc_pkcs15_object_t
*)vs->prkey_objs[i];
- if(sc_pkcs15_compare_id(&((struct sc_pkcs15_prkey_info *)
obj->data)->id, &(cert_info->id)))
- {
- vs->pkey = vs->prkey_objs[i];
- break;
- }
- }
-
- if(vs->pkey == NULL)
- {
+
+ r = sc_pkcs15_find_prkey_by_id(vs->p15card, &cert_info->id, &vs->pkey);
+ if (r)
return SCARD_E_INVALID_PARAMETER;
- }
-
+
prkey_info = (sc_pkcs15_prkey_info_t*)(vs->pkey->data);
-
+
pInfo->cbSignedData = prkey_info->modulus_length / 8;
logprintf(pCardData, 3, "pInfo->cbSignedData = %d\n",
pInfo->cbSignedData);
if(!(pInfo->dwSigningFlags&CARD_BUFFER_SIZE_ONLY))
{
int r,i;
- BYTE *pbuf = NULL, *pbuf2 = NULL;
- DWORD lg, lg2;
+ BYTE *pbuf = NULL;
+ DWORD lg;
lg = pInfo->cbSignedData;
logprintf(pCardData, 3, "lg = %d\n", lg);
@@ -1182,30 +1175,13 @@
return SCARD_E_NO_MEMORY;
}
- lg2 = pInfo->cbData;
- pbuf2 = pCardData->pfnCspAlloc(lg2);
- if (!pbuf2)
- {
- pCardData->pfnCspFree(pbuf);
- return SCARD_E_NO_MEMORY;
- }
-
logprintf(pCardData, 7, "pInfo->pbData ");
loghex(pCardData, 7, pInfo->pbData, pInfo->cbData);
-
- /*inversion donnees*/
- for(i = 0; i < lg2; i++) pbuf2[i] = pInfo->pbData[lg2-i-1];
-
- logprintf(pCardData, 7, "pbuf2 ");
- loghex(pCardData, 7, pbuf2, lg2);
-
-
pInfo->pbSignedData =
pCardData->pfnCspAlloc(pInfo->cbSignedData);
if (!pInfo->pbSignedData)
{
pCardData->pfnCspFree(pbuf);
- pCardData->pfnCspFree(pbuf2);
return SCARD_E_NO_MEMORY;
}
@@ -1218,8 +1194,6 @@
sc_strerror(r));
}
- pCardData->pfnCspFree(pbuf2);
-
pInfo->cbSignedData = r;
/*inversion donnees*/
_______________________________________________
opensc-devel mailing list
[email protected]
http://www.opensc-project.org/mailman/listinfo/opensc-devel