From a2032f5e83837488c374a5e0c207420fc263ac87 Mon Sep 17 00:00:00 2001 From: aj Date: Sun, 28 Jun 2009 07:25:47 +0000 Subject: [PATCH] Aktiv Co. / Aleksey Samsonov: use generic set_security_env code, remove duplicate code. git-svn-id: https://www.opensc-project.org/svnp/opensc/trunk@3705 c6295689-39f2-0310-b995-f0e70906c6a9 --- src/libopensc/card-gemsafeV1.c | 62 +++++++--------------------------- 1 file changed, 13 insertions(+), 49 deletions(-) diff --git a/src/libopensc/card-gemsafeV1.c b/src/libopensc/card-gemsafeV1.c index 60ec8bb1..d80cd0fe 100644 --- a/src/libopensc/card-gemsafeV1.c +++ b/src/libopensc/card-gemsafeV1.c @@ -380,61 +380,25 @@ static int gemsafe_set_security_env(struct sc_card *card, const struct sc_security_env *env, int se_num) { - int r; - struct sc_apdu apdu; - u8 sbuf[SC_MAX_APDU_BUFFER_SIZE], *p = sbuf; - u8 alg_ref = 0; + u8 alg_ref; + struct sc_security_env se_env = *env; struct sc_context *ctx = card->ctx; SC_FUNC_CALLED(ctx, 1); - sc_format_apdu(card, &apdu, SC_APDU_CASE_3_SHORT, 0x22, 0x41, 0); - switch (env->operation) { - case SC_SEC_OPERATION_DECIPHER: - apdu.p2 = 0xB8; - break; - case SC_SEC_OPERATION_SIGN: - apdu.p2 = 0xB6; - break; - default: - return SC_ERROR_INVALID_ARGUMENTS; + if (!(se_env.flags & SC_SEC_ENV_ALG_REF_PRESENT)) { + /* set the algorithm reference */ + alg_ref = gemsafe_flags2algref(&se_env); + if (alg_ref) { + se_env.algorithm_ref = alg_ref; + se_env.flags |= SC_SEC_ENV_ALG_REF_PRESENT; + } } - apdu.le = 0; + if (!(se_env.flags & SC_SEC_ENV_ALG_REF_PRESENT)) + sc_debug(ctx, "unknown algorithm flags '%x'\n", se_env.algorithm_flags); - /* first step: set the algorithm reference */ - if (env->flags & SC_SEC_ENV_ALG_REF_PRESENT) - alg_ref = env->algorithm_ref & 0xFF; - else - alg_ref = gemsafe_flags2algref(env); - if (alg_ref) { - /* set the algorithm reference */ - *p++ = 0x80; - *p++ = 0x01; - *p++ = alg_ref; - } else - sc_debug(ctx, "unknown algorithm flags '%x'\n", env->algorithm_flags); - /* second step: set the key reference */ - if (env->flags & SC_SEC_ENV_KEY_REF_PRESENT) { - /* set the key reference */ - if (env->flags & SC_SEC_ENV_KEY_REF_ASYMMETRIC) - *p++ = 0x83; - else - *p++ = 0x84; - *p++ = env->key_ref_len; - memcpy(p, env->key_ref, env->key_ref_len); - p += env->key_ref_len; - } - - - r = p - sbuf; - apdu.lc = r; - apdu.datalen = r; - apdu.data = sbuf; - apdu.resplen = 0; - - r = sc_transmit_apdu(card, &apdu); - SC_TEST_RET(card->ctx, r, "APDU transmit failed"); - return sc_check_sw(card, apdu.sw1, apdu.sw2); + se_env.flags &= ~SC_SEC_ENV_FILE_REF_PRESENT; + return iso_ops->set_security_env(card, &se_env, se_num); } static int gemsafe_compute_signature(struct sc_card *card, const u8 * data,