indent fixes and cleanup by Martin Paljak

git-svn-id: https://www.opensc-project.org/svnp/opensc/trunk@2126 c6295689-39f2-0310-b995-f0e70906c6a9
This commit is contained in:
nils 2005-02-03 22:44:19 +00:00
parent a0aa5dd05e
commit 54f8794267
5 changed files with 176 additions and 204 deletions

View File

@ -57,11 +57,11 @@ enum {
SC_CARDCTL_MIOCOS_BASE = _CTL_PREFIX('M', 'I', 'O'),
SC_CARDCTL_MIOCOS_CREATE_AC,
/*
* TCOS specific calls
*/
SC_CARDCTL_TCOS_BASE = _CTL_PREFIX('T','C','S'),
SC_CARDCTL_TCOS_SETPERM,
/*
* TCOS specific calls
*/
SC_CARDCTL_TCOS_BASE = _CTL_PREFIX('T','C','S'),
SC_CARDCTL_TCOS_SETPERM,
/*
* eToken specific calls

View File

@ -1,31 +1,32 @@
#ifndef _OPENSC_ESTEID_H
#define _OPENSC_ESTEID_H
#define SC_ESTEID_AUTH 1
#define SC_ESTEID_SIGN 2
/* personal data file record numbers */
#define SC_ESTEID_PD_SURNAME 1
#define SC_ESTEID_PD_GIVEN_NAMES1 2
#define SC_ESTEID_PD_GIVEN_NAMES2 3
#define SC_ESTEID_PD_SEX 4
#define SC_ESTEID_PD_CITIZENSHIP 5
#define SC_ESTEID_PD_DATE_OF_BIRTH 6
#define SC_ESTEID_PD_PERSONAL_ID 7
#define SC_ESTEID_PD_DOCUMENT_NR 8
#define SC_ESTEID_PD_EXPIRY_DATE 9
#define SC_ESTEID_PD_PLACE_OF_BIRTH 10
#define SC_ESTEID_PD_ISSUING_DATE 11
#define SC_ESTEID_PD_PERMIT_TYPE 12
#define SC_ESTEID_PD_REMARK1 13
#define SC_ESTEID_PD_REMARK2 14
#define SC_ESTEID_PD_REMARK3 15
#define SC_ESTEID_PD_REMARK4 16
enum {
SC_ESTEID_PD_SURNAME = 1,
SC_ESTEID_PD_GIVEN_NAMES1,
SC_ESTEID_PD_GIVEN_NAMES2,
SC_ESTEID_PD_SEX,
SC_ESTEID_PD_CITIZENSHIP,
SC_ESTEID_PD_DATE_OF_BIRTH,
SC_ESTEID_PD_PERSONAL_ID,
SC_ESTEID_PD_DOCUMENT_NR,
SC_ESTEID_PD_EXPIRY_DATE,
SC_ESTEID_PD_PLACE_OF_BIRTH,
SC_ESTEID_PD_ISSUING_DATE,
SC_ESTEID_PD_PERMIT_TYPE,
SC_ESTEID_PD_REMARK1,
SC_ESTEID_PD_REMARK2,
SC_ESTEID_PD_REMARK3,
SC_ESTEID_PD_REMARK4
};
enum {
SC_ESTEID_AUTH = 1,
SC_ESTEID_SIGN
};
/* i love constants */
#define SC_ESTEID_KEYREF_FILE_RECLEN 21
#define SC_ESTEID_KEYREF_FILE_RECLEN 21
int select_esteid_df(sc_card_t * card);
#endif

View File

@ -5,8 +5,6 @@
* CCID compatible pinpad readers.
* Currently known to work only with libccid under unices via SCardControl().
*
* Tested with: SPR532 with firmware 5.04, ccid-0.9.2mp1, EstEID, opensc-0.9.4mp3 (CVS)
*
* (C) 2004 Martin Paljak <martin@paljak.pri.ee>
*/
#include "internal.h"
@ -44,7 +42,7 @@ static int ccid_build_verify_pin_block(u8 * buf, size_t * size, struct sc_pin_cm
buf[count++] = 0x00; /* bmPINLengthFormat */
if (!data->pin1.min_length || !data->pin1.max_length)
return SC_ERROR_INVALID_PIN_LENGTH;
return SC_ERROR_INVALID_ARGUMENTS;
buf[count++] = data->pin1.max_length; /* wPINMaxExtraDigit: max */
buf[count++] = data->pin1.min_length; /* wPINMaxExtraDigit: min */
@ -93,7 +91,7 @@ ccid_pin_cmd(struct sc_reader *reader, sc_slot_info_t * slot,
u8 rbuf[SC_MAX_APDU_BUFFER_SIZE], sbuf[SC_MAX_APDU_BUFFER_SIZE];
size_t rcount = sizeof(rbuf), scount = 0;
int r;
unsigned long code;
unsigned long code = 0;
sc_apdu_t *apdu;
SC_FUNC_CALLED(reader->ctx, 3);

View File

@ -23,11 +23,9 @@
#include "internal.h"
#include "pkcs15.h"
#include "asn1.h"
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <assert.h>
#include "esteid.h"
@ -36,193 +34,168 @@ int sc_pkcs15emu_esteid_init_ex(sc_pkcs15_card_t *, sc_pkcs15emu_opt_t *);
static void
set_string (char **strp, const char *value)
{
if (*strp)
free (strp);
*strp = value ? strdup (value) : NULL;
if (*strp)
free (strp);
*strp = value ? strdup (value) : NULL;
}
int
select_esteid_df (sc_card_t * card)
{
int r;
sc_path_t tmppath;
sc_format_path ("3F00EEEE", &tmppath);
tmppath.type = SC_PATH_TYPE_PATH;
r = sc_select_file (card, &tmppath, NULL);
SC_TEST_RET (card->ctx, r, "esteid select DF failed");
return r;
int r;
sc_path_t tmppath;
sc_format_path ("3f00eeee", &tmppath);
tmppath.type = SC_PATH_TYPE_PATH;
r = sc_select_file (card, &tmppath, NULL);
SC_TEST_RET (card->ctx, r, "esteid select DF failed");
return r;
}
static int
sc_pkcs15emu_esteid_init (sc_pkcs15_card_t * p15card)
{
sc_card_t *card = p15card->card;
unsigned char buff[256];
int r, i, flags;
sc_path_t tmppath;
sc_card_t *card = p15card->card;
unsigned char buff[256];
int r, i, flags;
sc_path_t tmppath;
set_string (&p15card->label, "EstEID isikutunnistus");
set_string (&p15card->manufacturer_id, "AS Sertifitseerimiskeskus");
set_string (&p15card->label, "EstEID isikutunnistus");
set_string (&p15card->manufacturer_id, "AS Sertifitseerimiskeskus");
select_esteid_df (card);
select_esteid_df (card);
/* read the serial (document number) */
sc_format_path ("5044", &tmppath);
tmppath.type = SC_PATH_TYPE_PATH;
r = sc_select_file (card, &tmppath, NULL);
SC_TEST_RET (card->ctx, r, "select esteid PD failed");
r = sc_read_record (card, SC_ESTEID_PD_DOCUMENT_NR, buff, 8,
SC_RECORD_BY_REC_NR);
SC_TEST_RET (card->ctx, r, "read document number failed");
buff[r] = '\0';
set_string (&p15card->serial_number, (const char *) buff);
/* read the serial (document number) */
sc_format_path ("5044", &tmppath);
tmppath.type = SC_PATH_TYPE_PATH;
r = sc_select_file (card, &tmppath, NULL);
SC_TEST_RET (card->ctx, r, "select esteid PD failed");
r = sc_read_record (card, SC_ESTEID_PD_DOCUMENT_NR, buff, 8,
SC_RECORD_BY_REC_NR);
SC_TEST_RET (card->ctx, r, "read document number failed");
buff[r] = '\0';
set_string (&p15card->serial_number, (const char *) buff);
p15card->flags =
SC_PKCS15_CARD_FLAG_PRN_GENERATION |
SC_PKCS15_CARD_FLAG_EID_COMPLIANT | SC_PKCS15_CARD_FLAG_READONLY;
p15card->flags = SC_PKCS15_CARD_FLAG_PRN_GENERATION
| SC_PKCS15_CARD_FLAG_EID_COMPLIANT
| SC_PKCS15_CARD_FLAG_READONLY;
/* EstEEID uses 1024b RSA */
card->algorithm_count = 0;
flags = SC_ALGORITHM_RSA_PAD_PKCS1;
_sc_card_add_rsa_alg (card, 1024, flags, 0);
/* EstEEID uses 1024b RSA */
card->algorithm_count = 0;
flags = SC_ALGORITHM_RSA_PAD_PKCS1;
_sc_card_add_rsa_alg (card, 1024, flags, 0);
/* add certificates */
for (i = 0; i < 2; i++)
{
static const char *esteid_cert_names[2] = {
"Isikutuvastus",
"Allkirjastamine"
};
static char const *esteid_cert_paths[2] = {
"3f00eeeeaace",
"3f00eeeeddce"
};
static int esteid_cert_ids[2] = {
SC_ESTEID_AUTH,
SC_ESTEID_SIGN
};
/* add certificates */
for (i = 0; i < 2; i++) {
static const char *esteid_cert_names[2] = {
"Isikutuvastus",
"Allkirjastamine"};
static char const *esteid_cert_paths[2] = {
"3f00eeeeaace",
"3f00eeeeddce"};
static int esteid_cert_ids[2] = {1, 2};
struct sc_pkcs15_cert_info cert_info;
struct sc_pkcs15_object cert_obj;
memset(&cert_info, 0, sizeof(cert_info));
memset(&cert_obj, 0, sizeof(cert_obj));
cert_info.id.value[0] = esteid_cert_ids[i];
cert_info.id.len = 1;
sc_format_path(esteid_cert_paths[i], &cert_info.path);
snprintf(cert_obj.label, SC_PKCS15_MAX_LABEL_SIZE, "%s", esteid_cert_names[i]);
r = sc_pkcs15emu_add_x509_cert(p15card, &cert_obj, &cert_info);
if (r < 0)
return SC_ERROR_INTERNAL;
}
struct sc_pkcs15_cert_info cert_info;
struct sc_pkcs15_object cert_obj;
/* the file with key pin info (tries left) */
sc_format_path ("3f000016", &tmppath);
sc_select_file (card, &tmppath, NULL);
memset(&cert_info, 0, sizeof(cert_info));
memset(&cert_obj, 0, sizeof(cert_obj));
/* add pins */
for (i = 0; i < 3; i++) {
unsigned char tries_left;
static const char *esteid_pin_names[3] = {
"PIN1 - Isikutuvastus",
"PIN2 - Allkirjastamine",
"PUK" };
static const int esteid_pin_min[3] = {4, 5, 8};
static const int esteid_pin_ref[3] = {1, 2, 0};
static const int esteid_pin_flags[3] = {0, 0, SC_PKCS15_PIN_FLAG_UNBLOCKING_PIN};
struct sc_pkcs15_pin_info pin_info;
struct sc_pkcs15_object pin_obj;
cert_info.id.value[0] = esteid_cert_ids[i];
cert_info.id.len = 1;
sc_format_path(esteid_cert_paths[i], &cert_info.path);
snprintf(cert_obj.label, SC_PKCS15_MAX_LABEL_SIZE, "%s",
esteid_cert_names[i]);
memset(&pin_info, 0, sizeof(pin_info));
memset(&pin_obj, 0, sizeof(pin_obj));
/* read the number of tries left for the PIN */
r = sc_read_record (card, i + 1, buff, 128, SC_RECORD_BY_REC_NR);
if (r < 0)
return SC_ERROR_INTERNAL;
tries_left = buff[5];
pin_info.auth_id.len = 1;
pin_info.auth_id.value[0] = i + 1;
pin_info.reference = esteid_pin_ref[i];
pin_info.flags = esteid_pin_flags[i];
pin_info.type = SC_PKCS15_PIN_TYPE_ASCII_NUMERIC;
pin_info.min_length = esteid_pin_min[i];
pin_info.stored_length = 12;
pin_info.max_length = 12;
pin_info.pad_char = '\0';
pin_info.tries_left = (int)tries_left;
r = sc_pkcs15emu_add_x509_cert(p15card, &cert_obj, &cert_info);
if (r < 0)
return SC_ERROR_INTERNAL;
}
snprintf(pin_obj.label, SC_PKCS15_MAX_LABEL_SIZE, "%s", esteid_pin_names[i]);
pin_obj.flags = esteid_pin_flags[i];
/* the file with key pin info (tries left) */
sc_format_path ("3f000016", &tmppath);
sc_select_file (card, &tmppath, NULL);
r = sc_pkcs15emu_add_pin_obj(p15card, &pin_obj, &pin_info);
if (r < 0)
return SC_ERROR_INTERNAL;
}
/* add private keys */
for (i = 0; i < 2; i++) {
static int prkey_pin[2] = {1, 2};
static int prkey_usage[2] = {
SC_PKCS15_PRKEY_USAGE_ENCRYPT
| SC_PKCS15_PRKEY_USAGE_DECRYPT
| SC_PKCS15_PRKEY_USAGE_SIGN
| SC_PKCS15_PRKEY_USAGE_SIGNRECOVER
| SC_PKCS15_PRKEY_USAGE_WRAP
| SC_PKCS15_PRKEY_USAGE_UNWRAP,
SC_PKCS15_PRKEY_USAGE_NONREPUDIATION};
static const char *prkey_name[2] = {
"Isikutuvastus",
"Allkirjastamine"};
/* add pins */
for (i = 0; i < 3; i++)
{
unsigned char tries_left;
static const char *esteid_pin_names[3] = {
"PIN1 - Isikutuvastus",
"PIN2 - Allkirjastamine",
"PUK"
};
struct sc_pkcs15_prkey_info prkey_info;
struct sc_pkcs15_object prkey_obj;
static const int esteid_pin_min[3] = {
4,
5,
8
};
memset(&prkey_info, 0, sizeof(prkey_info));
memset(&prkey_obj, 0, sizeof(prkey_obj));
prkey_info.id.len = 1;
prkey_info.id.value[0] = prkey_pin[i];
prkey_info.usage = prkey_usage[i];
prkey_info.native = 1;
prkey_info.key_reference = i + 1;
prkey_info.modulus_length= 1024;
static const int esteid_pin_ref[3] = {
1,
2,
0
};
snprintf(prkey_obj.label, SC_PKCS15_MAX_LABEL_SIZE, "%s", prkey_name[i]);
prkey_obj.auth_id.len = 1;
prkey_obj.auth_id.value[0] = prkey_pin[i];
prkey_obj.user_consent = (i == 1) ? 1 : 0;
static const int esteid_pin_flags[3] = {
0,
0,
SC_PKCS15_PIN_FLAG_UNBLOCKING_PIN
};
struct sc_pkcs15_pin_info pin_info;
struct sc_pkcs15_object pin_obj;
memset(&pin_info, 0, sizeof(pin_info));
memset(&pin_obj, 0, sizeof(pin_obj));
r = sc_read_record (card, i + 1, buff, 128, SC_RECORD_BY_REC_NR);
if (r < 0)
return SC_ERROR_INTERNAL;
tries_left = buff[5];
pin_info.auth_id.len = 1;
pin_info.auth_id.value[0] = i + 1;
pin_info.reference = esteid_pin_ref[i];
pin_info.flags = esteid_pin_flags[i];
pin_info.type = SC_PKCS15_PIN_TYPE_ASCII_NUMERIC;
pin_info.min_length = esteid_pin_min[i];
pin_info.stored_length = 12;
pin_info.max_length = 12;
pin_info.pad_char = '\0';
pin_info.tries_left = (int)tries_left;
snprintf(pin_obj.label, SC_PKCS15_MAX_LABEL_SIZE, "%s", esteid_pin_names[i]);
pin_obj.flags = esteid_pin_flags[i];
r = sc_pkcs15emu_add_pin_obj(p15card, &pin_obj, &pin_info);
if (r < 0)
return SC_ERROR_INTERNAL;
}
/* add private keys */
for (i = 0; i < 2; i++)
{
static int prkey_pin[2] = { SC_ESTEID_AUTH, SC_ESTEID_SIGN };
static int prkey_usage[2] = {
SC_PKCS15_PRKEY_USAGE_ENCRYPT |
SC_PKCS15_PRKEY_USAGE_DECRYPT |
SC_PKCS15_PRKEY_USAGE_SIGN |
SC_PKCS15_PRKEY_USAGE_SIGNRECOVER |
SC_PKCS15_PRKEY_USAGE_WRAP | SC_PKCS15_PRKEY_USAGE_UNWRAP,
SC_PKCS15_PRKEY_USAGE_NONREPUDIATION
};
static const char *prkey_name[2] = {
"Isikutuvastus",
"Allkirjastamine"
};
struct sc_pkcs15_prkey_info prkey_info;
struct sc_pkcs15_object prkey_obj;
memset(&prkey_info, 0, sizeof(prkey_info));
memset(&prkey_obj, 0, sizeof(prkey_obj));
prkey_info.id.len = 1;
prkey_info.id.value[0] = prkey_pin[i];
prkey_info.usage = prkey_usage[i];
prkey_info.native = 1;
prkey_info.key_reference = i + 1;
prkey_info.modulus_length= 1024;
snprintf(prkey_obj.label, SC_PKCS15_MAX_LABEL_SIZE, "%s", prkey_name[i]);
prkey_obj.auth_id.len = 1;
prkey_obj.auth_id.value[0] = prkey_pin[i];
prkey_obj.user_consent = (i == 1) ? 1 : 0;
r = sc_pkcs15emu_add_rsa_prkey(p15card, &prkey_obj, &prkey_info);
if (r < 0)
return SC_ERROR_INTERNAL;
}
return 0;
r = sc_pkcs15emu_add_rsa_prkey(p15card, &prkey_obj, &prkey_info);
if (r < 0)
return SC_ERROR_INTERNAL;
}
return 0;
}
static const char *atr1 = "3B:FE:94:00:FF:80:B1:FA:45:1F:03:45:73:74:45:49:44:20:76:65:72:20:31:2E:30:43";
@ -230,8 +203,8 @@ static const char *atr2 = "3B:6E:00:FF:45:73:74:45:49:44:20:76:65:72:20:31:2E:30
static int esteid_detect_card(sc_pkcs15_card_t *p15card)
{
u8 buf[SC_MAX_ATR_SIZE];
size_t len = sizeof(buf);
u8 buf[SC_MAX_ATR_SIZE];
size_t len = sizeof(buf);
sc_card_t *card = p15card->card;
/* XXX: save type of the micardo card in the card structure */

View File

@ -1665,7 +1665,7 @@ static CK_RV pkcs15_prkey_get_attribute(struct sc_pkcs11_session *session,
case CKA_CLASS:
check_attribute_buffer(attr, sizeof(CK_OBJECT_CLASS));
*(CK_OBJECT_CLASS*)attr->pValue = CKO_PRIVATE_KEY;
break;
break;
case CKA_TOKEN:
case CKA_LOCAL:
case CKA_SENSITIVE:
@ -1674,28 +1674,28 @@ static CK_RV pkcs15_prkey_get_attribute(struct sc_pkcs11_session *session,
case CKA_PRIVATE:
check_attribute_buffer(attr, sizeof(CK_BBOOL));
*(CK_BBOOL*)attr->pValue = TRUE;
break;
break;
case CKA_MODIFIABLE:
case CKA_EXTRACTABLE:
check_attribute_buffer(attr, sizeof(CK_BBOOL));
*(CK_BBOOL*)attr->pValue = FALSE;
break;
break;
case CKA_LABEL:
len = strlen(prkey->prv_p15obj->label);
check_attribute_buffer(attr, len);
memcpy(attr->pValue, prkey->prv_p15obj->label, len);
memcpy(attr->pValue, prkey->prv_p15obj->label, len);
break;
case CKA_KEY_TYPE:
check_attribute_buffer(attr, sizeof(CK_KEY_TYPE));
*(CK_KEY_TYPE*)attr->pValue = CKK_RSA;
break;
*(CK_KEY_TYPE*)attr->pValue = CKK_RSA;
break;
case CKA_ID:
check_attribute_buffer(attr, prkey->prv_info->id.len);
memcpy(attr->pValue, prkey->prv_info->id.value, prkey->prv_info->id.len);
break;
break;
case CKA_KEY_GEN_MECHANISM:
check_attribute_buffer(attr, sizeof(CK_MECHANISM_TYPE));
*(CK_MECHANISM_TYPE*)attr->pValue = CK_UNAVAILABLE_INFORMATION;
*(CK_MECHANISM_TYPE*)attr->pValue = CK_UNAVAILABLE_INFORMATION;
break;
case CKA_ENCRYPT:
case CKA_DECRYPT: