print certificate description
git-svn-id: https://vsmartcard.svn.sourceforge.net/svnroot/vsmartcard@281 96b47cad-a561-4643-ad3b-153ac7d7599c
This commit is contained in:
@@ -247,7 +247,7 @@ err:
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int pace_mse_set_at(const struct sm_ctx *oldpacectx, sc_card_t *card,
|
static int pace_mse_set_at(struct sm_ctx *oldpacectx, sc_card_t *card,
|
||||||
int protocol, int secret_key, const u8 *chat,
|
int protocol, int secret_key, const u8 *chat,
|
||||||
size_t length_chat, u8 *sw1, u8 *sw2)
|
size_t length_chat, u8 *sw1, u8 *sw2)
|
||||||
{
|
{
|
||||||
@@ -375,7 +375,7 @@ err:
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int pace_gen_auth_1_encrypted_nonce(const struct sm_ctx *oldpacectx,
|
static int pace_gen_auth_1_encrypted_nonce(struct sm_ctx *oldpacectx,
|
||||||
sc_card_t *card, u8 **enc_nonce, size_t *enc_nonce_len)
|
sc_card_t *card, u8 **enc_nonce, size_t *enc_nonce_len)
|
||||||
{
|
{
|
||||||
sc_apdu_t apdu;
|
sc_apdu_t apdu;
|
||||||
@@ -481,7 +481,7 @@ err:
|
|||||||
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
static int pace_gen_auth_2_map_nonce(const struct sm_ctx *oldpacectx,
|
static int pace_gen_auth_2_map_nonce(struct sm_ctx *oldpacectx,
|
||||||
sc_card_t *card, const u8 *in, size_t in_len, u8 **map_data_out,
|
sc_card_t *card, const u8 *in, size_t in_len, u8 **map_data_out,
|
||||||
size_t *map_data_out_len)
|
size_t *map_data_out_len)
|
||||||
{
|
{
|
||||||
@@ -596,7 +596,7 @@ err:
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
static int pace_gen_auth_3_perform_key_agreement(
|
static int pace_gen_auth_3_perform_key_agreement(
|
||||||
const struct sm_ctx *oldpacectx, sc_card_t *card,
|
struct sm_ctx *oldpacectx, sc_card_t *card,
|
||||||
const u8 *in, size_t in_len, u8 **eph_pub_key_out, size_t *eph_pub_key_out_len)
|
const u8 *in, size_t in_len, u8 **eph_pub_key_out, size_t *eph_pub_key_out_len)
|
||||||
{
|
{
|
||||||
sc_apdu_t apdu;
|
sc_apdu_t apdu;
|
||||||
@@ -710,7 +710,7 @@ err:
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
static int pace_gen_auth_4_mutual_authentication(
|
static int pace_gen_auth_4_mutual_authentication(
|
||||||
const struct sm_ctx *oldpacectx, sc_card_t *card,
|
struct sm_ctx *oldpacectx, sc_card_t *card,
|
||||||
const u8 *in, size_t in_len, u8 **auth_token_out,
|
const u8 *in, size_t in_len, u8 **auth_token_out,
|
||||||
size_t *auth_token_out_len, u8 **recent_car, size_t *recent_car_len,
|
size_t *auth_token_out_len, u8 **recent_car, size_t *recent_car_len,
|
||||||
u8 **prev_car, size_t *prev_car_len)
|
u8 **prev_car, size_t *prev_car_len)
|
||||||
@@ -950,7 +950,7 @@ void ssl_error(sc_context_t *ctx) {
|
|||||||
ERR_free_strings();
|
ERR_free_strings();
|
||||||
}
|
}
|
||||||
|
|
||||||
int EstablishPACEChannel(const struct sm_ctx *oldpacectx, sc_card_t *card,
|
int EstablishPACEChannel(struct sm_ctx *oldpacectx, sc_card_t *card,
|
||||||
struct establish_pace_channel_input pace_input,
|
struct establish_pace_channel_input pace_input,
|
||||||
struct establish_pace_channel_output *pace_output,
|
struct establish_pace_channel_output *pace_output,
|
||||||
struct sm_ctx *sctx)
|
struct sm_ctx *sctx)
|
||||||
@@ -961,10 +961,10 @@ int EstablishPACEChannel(const struct sm_ctx *oldpacectx, sc_card_t *card,
|
|||||||
BUF_MEM *enc_nonce = NULL, *nonce = NULL, *mdata = NULL, *mdata_opp = NULL,
|
BUF_MEM *enc_nonce = NULL, *nonce = NULL, *mdata = NULL, *mdata_opp = NULL,
|
||||||
*k_enc = NULL, *k_mac = NULL, *token_opp = NULL,
|
*k_enc = NULL, *k_mac = NULL, *token_opp = NULL,
|
||||||
*token = NULL, *pub = NULL, *pub_opp = NULL, *key = NULL,
|
*token = NULL, *pub = NULL, *pub_opp = NULL, *key = NULL,
|
||||||
*comp_pub = NULL, *comp_pub_opp = NULL;
|
*comp_pub = NULL, *comp_pub_opp = NULL, *hash_cert_desc = NULL;
|
||||||
PACE_SEC *sec = NULL;
|
PACE_SEC *sec = NULL;
|
||||||
PACE_CTX *pctx = NULL;
|
PACE_CTX *pctx = NULL;
|
||||||
CVC_CERTIFICATE_DESCRIPTION *cert_desc = NULL;
|
BIO *bio_stdout = NULL;
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
if (!card)
|
if (!card)
|
||||||
@@ -977,9 +977,53 @@ int EstablishPACEChannel(const struct sm_ctx *oldpacectx, sc_card_t *card,
|
|||||||
if (pace_input.certificate_description_length &&
|
if (pace_input.certificate_description_length &&
|
||||||
pace_input.certificate_description) {
|
pace_input.certificate_description) {
|
||||||
|
|
||||||
cert_desc = d2i_CVC_CERTIFICATE_DESCRIPTION(NULL, &cert_desc_in, len);
|
bio_stdout = BIO_new_fp(stdout, BIO_NOCLOSE);
|
||||||
|
|
||||||
/* XXX get hash of certificate description */
|
switch(certificate_description_print(bio_stdout,
|
||||||
|
pace_input.certificate_description,
|
||||||
|
pace_input.certificate_description_length, "")) {
|
||||||
|
case -1:
|
||||||
|
sc_error(card->ctx, "Could not print certificate description.");
|
||||||
|
ssl_error(card->ctx);
|
||||||
|
r = SC_ERROR_INTERNAL;
|
||||||
|
goto err;
|
||||||
|
case 0:
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
sc_error(card->ctx, "Certificate description in "
|
||||||
|
"HTML format can not (yet) be handled.");
|
||||||
|
r = SC_ERROR_NOT_SUPPORTED;
|
||||||
|
goto err;
|
||||||
|
case 2:
|
||||||
|
sc_error(card->ctx, "Certificate description in "
|
||||||
|
"PDF format can not (yet) be handled.");
|
||||||
|
r = SC_ERROR_NOT_SUPPORTED;
|
||||||
|
goto err;
|
||||||
|
default:
|
||||||
|
sc_error(card->ctx, "Certificate description in "
|
||||||
|
"unknown format can not (yet) be handled.");
|
||||||
|
r = SC_ERROR_NOT_SUPPORTED;
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
hash_cert_desc = PACE_hash_certificate_description(
|
||||||
|
pace_input.certificate_description,
|
||||||
|
pace_input.certificate_description_length);
|
||||||
|
if (!hash_cert_desc) {
|
||||||
|
sc_error(card->ctx, "Could not hash certificate description.");
|
||||||
|
ssl_error(card->ctx);
|
||||||
|
r = SC_ERROR_INTERNAL;
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
p = realloc(pace_output->hash_cert_desc, hash_cert_desc->length);
|
||||||
|
if (!p) {
|
||||||
|
sc_error(card->ctx, "Not enough memory for hash of certificate description.\n");
|
||||||
|
r = SC_ERROR_OUT_OF_MEMORY;
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
pace_output->hash_cert_desc = p;
|
||||||
|
pace_output->hash_cert_desc_len = hash_cert_desc->length;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* XXX parse CHAT to check role of terminal */
|
/* XXX parse CHAT to check role of terminal */
|
||||||
@@ -1205,12 +1249,16 @@ err:
|
|||||||
BUF_MEM_free(comp_pub_opp);
|
BUF_MEM_free(comp_pub_opp);
|
||||||
if (comp_pub)
|
if (comp_pub)
|
||||||
BUF_MEM_free(comp_pub);
|
BUF_MEM_free(comp_pub);
|
||||||
|
if (hash_cert_desc)
|
||||||
|
BUF_MEM_free(hash_cert_desc);
|
||||||
if (key) {
|
if (key) {
|
||||||
OPENSSL_cleanse(key->data, key->length);
|
OPENSSL_cleanse(key->data, key->length);
|
||||||
BUF_MEM_free(key);
|
BUF_MEM_free(key);
|
||||||
}
|
}
|
||||||
if (sec)
|
if (sec)
|
||||||
PACE_SEC_clean_free(sec);
|
PACE_SEC_clean_free(sec);
|
||||||
|
if (bio_stdout)
|
||||||
|
BIO_free_all(bio_stdout);
|
||||||
|
|
||||||
if (r < 0) {
|
if (r < 0) {
|
||||||
if (k_enc) {
|
if (k_enc) {
|
||||||
|
|||||||
@@ -95,7 +95,7 @@ int get_ef_card_access(sc_card_t *card,
|
|||||||
|
|
||||||
int GetReadersPACECapabilities(u8 *bitmap);
|
int GetReadersPACECapabilities(u8 *bitmap);
|
||||||
|
|
||||||
int EstablishPACEChannel(const struct sm_ctx *oldpacectx, sc_card_t *card,
|
int EstablishPACEChannel(struct sm_ctx *oldpacectx, sc_card_t *card,
|
||||||
struct establish_pace_channel_input pace_input,
|
struct establish_pace_channel_input pace_input,
|
||||||
struct establish_pace_channel_output *pace_output,
|
struct establish_pace_channel_output *pace_output,
|
||||||
struct sm_ctx *sctx);
|
struct sm_ctx *sctx);
|
||||||
|
|||||||
Reference in New Issue
Block a user