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:
parent
a0aa5dd05e
commit
54f8794267
|
@ -57,11 +57,11 @@ enum {
|
||||||
SC_CARDCTL_MIOCOS_BASE = _CTL_PREFIX('M', 'I', 'O'),
|
SC_CARDCTL_MIOCOS_BASE = _CTL_PREFIX('M', 'I', 'O'),
|
||||||
SC_CARDCTL_MIOCOS_CREATE_AC,
|
SC_CARDCTL_MIOCOS_CREATE_AC,
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* TCOS specific calls
|
* TCOS specific calls
|
||||||
*/
|
*/
|
||||||
SC_CARDCTL_TCOS_BASE = _CTL_PREFIX('T','C','S'),
|
SC_CARDCTL_TCOS_BASE = _CTL_PREFIX('T','C','S'),
|
||||||
SC_CARDCTL_TCOS_SETPERM,
|
SC_CARDCTL_TCOS_SETPERM,
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* eToken specific calls
|
* eToken specific calls
|
||||||
|
|
|
@ -1,31 +1,32 @@
|
||||||
#ifndef _OPENSC_ESTEID_H
|
#ifndef _OPENSC_ESTEID_H
|
||||||
#define _OPENSC_ESTEID_H
|
#define _OPENSC_ESTEID_H
|
||||||
|
|
||||||
#define SC_ESTEID_AUTH 1
|
|
||||||
#define SC_ESTEID_SIGN 2
|
|
||||||
|
|
||||||
|
|
||||||
/* personal data file record numbers */
|
/* personal data file record numbers */
|
||||||
|
enum {
|
||||||
#define SC_ESTEID_PD_SURNAME 1
|
SC_ESTEID_PD_SURNAME = 1,
|
||||||
#define SC_ESTEID_PD_GIVEN_NAMES1 2
|
SC_ESTEID_PD_GIVEN_NAMES1,
|
||||||
#define SC_ESTEID_PD_GIVEN_NAMES2 3
|
SC_ESTEID_PD_GIVEN_NAMES2,
|
||||||
#define SC_ESTEID_PD_SEX 4
|
SC_ESTEID_PD_SEX,
|
||||||
#define SC_ESTEID_PD_CITIZENSHIP 5
|
SC_ESTEID_PD_CITIZENSHIP,
|
||||||
#define SC_ESTEID_PD_DATE_OF_BIRTH 6
|
SC_ESTEID_PD_DATE_OF_BIRTH,
|
||||||
#define SC_ESTEID_PD_PERSONAL_ID 7
|
SC_ESTEID_PD_PERSONAL_ID,
|
||||||
#define SC_ESTEID_PD_DOCUMENT_NR 8
|
SC_ESTEID_PD_DOCUMENT_NR,
|
||||||
#define SC_ESTEID_PD_EXPIRY_DATE 9
|
SC_ESTEID_PD_EXPIRY_DATE,
|
||||||
#define SC_ESTEID_PD_PLACE_OF_BIRTH 10
|
SC_ESTEID_PD_PLACE_OF_BIRTH,
|
||||||
#define SC_ESTEID_PD_ISSUING_DATE 11
|
SC_ESTEID_PD_ISSUING_DATE,
|
||||||
#define SC_ESTEID_PD_PERMIT_TYPE 12
|
SC_ESTEID_PD_PERMIT_TYPE,
|
||||||
#define SC_ESTEID_PD_REMARK1 13
|
SC_ESTEID_PD_REMARK1,
|
||||||
#define SC_ESTEID_PD_REMARK2 14
|
SC_ESTEID_PD_REMARK2,
|
||||||
#define SC_ESTEID_PD_REMARK3 15
|
SC_ESTEID_PD_REMARK3,
|
||||||
#define SC_ESTEID_PD_REMARK4 16
|
SC_ESTEID_PD_REMARK4
|
||||||
|
};
|
||||||
|
enum {
|
||||||
|
SC_ESTEID_AUTH = 1,
|
||||||
|
SC_ESTEID_SIGN
|
||||||
|
};
|
||||||
|
|
||||||
/* i love constants */
|
/* 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);
|
int select_esteid_df(sc_card_t * card);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -5,8 +5,6 @@
|
||||||
* CCID compatible pinpad readers.
|
* CCID compatible pinpad readers.
|
||||||
* Currently known to work only with libccid under unices via SCardControl().
|
* 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>
|
* (C) 2004 Martin Paljak <martin@paljak.pri.ee>
|
||||||
*/
|
*/
|
||||||
#include "internal.h"
|
#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 */
|
buf[count++] = 0x00; /* bmPINLengthFormat */
|
||||||
|
|
||||||
if (!data->pin1.min_length || !data->pin1.max_length)
|
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.max_length; /* wPINMaxExtraDigit: max */
|
||||||
buf[count++] = data->pin1.min_length; /* wPINMaxExtraDigit: min */
|
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];
|
u8 rbuf[SC_MAX_APDU_BUFFER_SIZE], sbuf[SC_MAX_APDU_BUFFER_SIZE];
|
||||||
size_t rcount = sizeof(rbuf), scount = 0;
|
size_t rcount = sizeof(rbuf), scount = 0;
|
||||||
int r;
|
int r;
|
||||||
unsigned long code;
|
unsigned long code = 0;
|
||||||
sc_apdu_t *apdu;
|
sc_apdu_t *apdu;
|
||||||
|
|
||||||
SC_FUNC_CALLED(reader->ctx, 3);
|
SC_FUNC_CALLED(reader->ctx, 3);
|
||||||
|
|
|
@ -23,11 +23,9 @@
|
||||||
|
|
||||||
#include "internal.h"
|
#include "internal.h"
|
||||||
#include "pkcs15.h"
|
#include "pkcs15.h"
|
||||||
#include "asn1.h"
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <assert.h>
|
|
||||||
|
|
||||||
#include "esteid.h"
|
#include "esteid.h"
|
||||||
|
|
||||||
|
@ -36,193 +34,168 @@ int sc_pkcs15emu_esteid_init_ex(sc_pkcs15_card_t *, sc_pkcs15emu_opt_t *);
|
||||||
static void
|
static void
|
||||||
set_string (char **strp, const char *value)
|
set_string (char **strp, const char *value)
|
||||||
{
|
{
|
||||||
if (*strp)
|
if (*strp)
|
||||||
free (strp);
|
free (strp);
|
||||||
*strp = value ? strdup (value) : NULL;
|
*strp = value ? strdup (value) : NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
select_esteid_df (sc_card_t * card)
|
select_esteid_df (sc_card_t * card)
|
||||||
{
|
{
|
||||||
int r;
|
int r;
|
||||||
sc_path_t tmppath;
|
sc_path_t tmppath;
|
||||||
sc_format_path ("3F00EEEE", &tmppath);
|
sc_format_path ("3f00eeee", &tmppath);
|
||||||
tmppath.type = SC_PATH_TYPE_PATH;
|
tmppath.type = SC_PATH_TYPE_PATH;
|
||||||
r = sc_select_file (card, &tmppath, NULL);
|
r = sc_select_file (card, &tmppath, NULL);
|
||||||
SC_TEST_RET (card->ctx, r, "esteid select DF failed");
|
SC_TEST_RET (card->ctx, r, "esteid select DF failed");
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
sc_pkcs15emu_esteid_init (sc_pkcs15_card_t * p15card)
|
sc_pkcs15emu_esteid_init (sc_pkcs15_card_t * p15card)
|
||||||
{
|
{
|
||||||
sc_card_t *card = p15card->card;
|
sc_card_t *card = p15card->card;
|
||||||
unsigned char buff[256];
|
unsigned char buff[256];
|
||||||
int r, i, flags;
|
int r, i, flags;
|
||||||
sc_path_t tmppath;
|
sc_path_t tmppath;
|
||||||
|
|
||||||
set_string (&p15card->label, "EstEID isikutunnistus");
|
set_string (&p15card->label, "EstEID isikutunnistus");
|
||||||
set_string (&p15card->manufacturer_id, "AS Sertifitseerimiskeskus");
|
set_string (&p15card->manufacturer_id, "AS Sertifitseerimiskeskus");
|
||||||
|
|
||||||
select_esteid_df (card);
|
select_esteid_df (card);
|
||||||
|
|
||||||
/* read the serial (document number) */
|
/* read the serial (document number) */
|
||||||
sc_format_path ("5044", &tmppath);
|
sc_format_path ("5044", &tmppath);
|
||||||
tmppath.type = SC_PATH_TYPE_PATH;
|
tmppath.type = SC_PATH_TYPE_PATH;
|
||||||
r = sc_select_file (card, &tmppath, NULL);
|
r = sc_select_file (card, &tmppath, NULL);
|
||||||
SC_TEST_RET (card->ctx, r, "select esteid PD failed");
|
SC_TEST_RET (card->ctx, r, "select esteid PD failed");
|
||||||
r = sc_read_record (card, SC_ESTEID_PD_DOCUMENT_NR, buff, 8,
|
r = sc_read_record (card, SC_ESTEID_PD_DOCUMENT_NR, buff, 8,
|
||||||
SC_RECORD_BY_REC_NR);
|
SC_RECORD_BY_REC_NR);
|
||||||
SC_TEST_RET (card->ctx, r, "read document number failed");
|
SC_TEST_RET (card->ctx, r, "read document number failed");
|
||||||
buff[r] = '\0';
|
buff[r] = '\0';
|
||||||
set_string (&p15card->serial_number, (const char *) buff);
|
set_string (&p15card->serial_number, (const char *) buff);
|
||||||
|
|
||||||
p15card->flags =
|
p15card->flags = SC_PKCS15_CARD_FLAG_PRN_GENERATION
|
||||||
SC_PKCS15_CARD_FLAG_PRN_GENERATION |
|
| SC_PKCS15_CARD_FLAG_EID_COMPLIANT
|
||||||
SC_PKCS15_CARD_FLAG_EID_COMPLIANT | SC_PKCS15_CARD_FLAG_READONLY;
|
| SC_PKCS15_CARD_FLAG_READONLY;
|
||||||
|
|
||||||
/* EstEEID uses 1024b RSA */
|
/* EstEEID uses 1024b RSA */
|
||||||
card->algorithm_count = 0;
|
card->algorithm_count = 0;
|
||||||
flags = SC_ALGORITHM_RSA_PAD_PKCS1;
|
flags = SC_ALGORITHM_RSA_PAD_PKCS1;
|
||||||
_sc_card_add_rsa_alg (card, 1024, flags, 0);
|
_sc_card_add_rsa_alg (card, 1024, flags, 0);
|
||||||
|
|
||||||
/* add certificates */
|
/* add certificates */
|
||||||
for (i = 0; i < 2; i++)
|
for (i = 0; i < 2; i++) {
|
||||||
{
|
static const char *esteid_cert_names[2] = {
|
||||||
static const char *esteid_cert_names[2] = {
|
"Isikutuvastus",
|
||||||
"Isikutuvastus",
|
"Allkirjastamine"};
|
||||||
"Allkirjastamine"
|
static char const *esteid_cert_paths[2] = {
|
||||||
};
|
"3f00eeeeaace",
|
||||||
static char const *esteid_cert_paths[2] = {
|
"3f00eeeeddce"};
|
||||||
"3f00eeeeaace",
|
static int esteid_cert_ids[2] = {1, 2};
|
||||||
"3f00eeeeddce"
|
|
||||||
};
|
struct sc_pkcs15_cert_info cert_info;
|
||||||
static int esteid_cert_ids[2] = {
|
struct sc_pkcs15_object cert_obj;
|
||||||
SC_ESTEID_AUTH,
|
|
||||||
SC_ESTEID_SIGN
|
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;
|
/* the file with key pin info (tries left) */
|
||||||
struct sc_pkcs15_object cert_obj;
|
sc_format_path ("3f000016", &tmppath);
|
||||||
|
sc_select_file (card, &tmppath, NULL);
|
||||||
|
|
||||||
memset(&cert_info, 0, sizeof(cert_info));
|
/* add pins */
|
||||||
memset(&cert_obj, 0, sizeof(cert_obj));
|
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];
|
memset(&pin_info, 0, sizeof(pin_info));
|
||||||
cert_info.id.len = 1;
|
memset(&pin_obj, 0, sizeof(pin_obj));
|
||||||
sc_format_path(esteid_cert_paths[i], &cert_info.path);
|
|
||||||
snprintf(cert_obj.label, SC_PKCS15_MAX_LABEL_SIZE, "%s",
|
/* read the number of tries left for the PIN */
|
||||||
esteid_cert_names[i]);
|
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);
|
snprintf(pin_obj.label, SC_PKCS15_MAX_LABEL_SIZE, "%s", esteid_pin_names[i]);
|
||||||
if (r < 0)
|
pin_obj.flags = esteid_pin_flags[i];
|
||||||
return SC_ERROR_INTERNAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* the file with key pin info (tries left) */
|
r = sc_pkcs15emu_add_pin_obj(p15card, &pin_obj, &pin_info);
|
||||||
sc_format_path ("3f000016", &tmppath);
|
if (r < 0)
|
||||||
sc_select_file (card, &tmppath, NULL);
|
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 */
|
struct sc_pkcs15_prkey_info prkey_info;
|
||||||
for (i = 0; i < 3; i++)
|
struct sc_pkcs15_object prkey_obj;
|
||||||
{
|
|
||||||
unsigned char tries_left;
|
|
||||||
static const char *esteid_pin_names[3] = {
|
|
||||||
"PIN1 - Isikutuvastus",
|
|
||||||
"PIN2 - Allkirjastamine",
|
|
||||||
"PUK"
|
|
||||||
};
|
|
||||||
|
|
||||||
static const int esteid_pin_min[3] = {
|
memset(&prkey_info, 0, sizeof(prkey_info));
|
||||||
4,
|
memset(&prkey_obj, 0, sizeof(prkey_obj));
|
||||||
5,
|
|
||||||
8
|
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] = {
|
snprintf(prkey_obj.label, SC_PKCS15_MAX_LABEL_SIZE, "%s", prkey_name[i]);
|
||||||
1,
|
prkey_obj.auth_id.len = 1;
|
||||||
2,
|
prkey_obj.auth_id.value[0] = prkey_pin[i];
|
||||||
0
|
prkey_obj.user_consent = (i == 1) ? 1 : 0;
|
||||||
};
|
|
||||||
|
|
||||||
static const int esteid_pin_flags[3] = {
|
r = sc_pkcs15emu_add_rsa_prkey(p15card, &prkey_obj, &prkey_info);
|
||||||
0,
|
if (r < 0)
|
||||||
0,
|
return SC_ERROR_INTERNAL;
|
||||||
SC_PKCS15_PIN_FLAG_UNBLOCKING_PIN
|
}
|
||||||
};
|
return 0;
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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";
|
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)
|
static int esteid_detect_card(sc_pkcs15_card_t *p15card)
|
||||||
{
|
{
|
||||||
u8 buf[SC_MAX_ATR_SIZE];
|
u8 buf[SC_MAX_ATR_SIZE];
|
||||||
size_t len = sizeof(buf);
|
size_t len = sizeof(buf);
|
||||||
sc_card_t *card = p15card->card;
|
sc_card_t *card = p15card->card;
|
||||||
|
|
||||||
/* XXX: save type of the micardo card in the card structure */
|
/* XXX: save type of the micardo card in the card structure */
|
||||||
|
|
|
@ -1665,7 +1665,7 @@ static CK_RV pkcs15_prkey_get_attribute(struct sc_pkcs11_session *session,
|
||||||
case CKA_CLASS:
|
case CKA_CLASS:
|
||||||
check_attribute_buffer(attr, sizeof(CK_OBJECT_CLASS));
|
check_attribute_buffer(attr, sizeof(CK_OBJECT_CLASS));
|
||||||
*(CK_OBJECT_CLASS*)attr->pValue = CKO_PRIVATE_KEY;
|
*(CK_OBJECT_CLASS*)attr->pValue = CKO_PRIVATE_KEY;
|
||||||
break;
|
break;
|
||||||
case CKA_TOKEN:
|
case CKA_TOKEN:
|
||||||
case CKA_LOCAL:
|
case CKA_LOCAL:
|
||||||
case CKA_SENSITIVE:
|
case CKA_SENSITIVE:
|
||||||
|
@ -1674,28 +1674,28 @@ static CK_RV pkcs15_prkey_get_attribute(struct sc_pkcs11_session *session,
|
||||||
case CKA_PRIVATE:
|
case CKA_PRIVATE:
|
||||||
check_attribute_buffer(attr, sizeof(CK_BBOOL));
|
check_attribute_buffer(attr, sizeof(CK_BBOOL));
|
||||||
*(CK_BBOOL*)attr->pValue = TRUE;
|
*(CK_BBOOL*)attr->pValue = TRUE;
|
||||||
break;
|
break;
|
||||||
case CKA_MODIFIABLE:
|
case CKA_MODIFIABLE:
|
||||||
case CKA_EXTRACTABLE:
|
case CKA_EXTRACTABLE:
|
||||||
check_attribute_buffer(attr, sizeof(CK_BBOOL));
|
check_attribute_buffer(attr, sizeof(CK_BBOOL));
|
||||||
*(CK_BBOOL*)attr->pValue = FALSE;
|
*(CK_BBOOL*)attr->pValue = FALSE;
|
||||||
break;
|
break;
|
||||||
case CKA_LABEL:
|
case CKA_LABEL:
|
||||||
len = strlen(prkey->prv_p15obj->label);
|
len = strlen(prkey->prv_p15obj->label);
|
||||||
check_attribute_buffer(attr, len);
|
check_attribute_buffer(attr, len);
|
||||||
memcpy(attr->pValue, prkey->prv_p15obj->label, len);
|
memcpy(attr->pValue, prkey->prv_p15obj->label, len);
|
||||||
break;
|
break;
|
||||||
case CKA_KEY_TYPE:
|
case CKA_KEY_TYPE:
|
||||||
check_attribute_buffer(attr, sizeof(CK_KEY_TYPE));
|
check_attribute_buffer(attr, sizeof(CK_KEY_TYPE));
|
||||||
*(CK_KEY_TYPE*)attr->pValue = CKK_RSA;
|
*(CK_KEY_TYPE*)attr->pValue = CKK_RSA;
|
||||||
break;
|
break;
|
||||||
case CKA_ID:
|
case CKA_ID:
|
||||||
check_attribute_buffer(attr, prkey->prv_info->id.len);
|
check_attribute_buffer(attr, prkey->prv_info->id.len);
|
||||||
memcpy(attr->pValue, prkey->prv_info->id.value, 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:
|
case CKA_KEY_GEN_MECHANISM:
|
||||||
check_attribute_buffer(attr, sizeof(CK_MECHANISM_TYPE));
|
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;
|
break;
|
||||||
case CKA_ENCRYPT:
|
case CKA_ENCRYPT:
|
||||||
case CKA_DECRYPT:
|
case CKA_DECRYPT:
|
||||||
|
|
Loading…
Reference in New Issue