Allow building westcos without openssl. (François Leblanc)

git-svn-id: https://www.opensc-project.org/svnp/opensc/trunk@3761 c6295689-39f2-0310-b995-f0e70906c6a9
This commit is contained in:
aj 2009-10-06 06:34:05 +00:00
parent 8402c6248a
commit 46b55bb870
2 changed files with 24 additions and 100 deletions

View File

@ -39,10 +39,6 @@
#define min(a,b) (((a)<(b))?(a):(b))
#endif
#ifndef min
#define max(a,b) (((a)>(b))?(a):(b))
#endif
#define DEFAULT_TRANSPORT_KEY "6f:59:b0:ed:6e:62:46:4a:5d:25:37:68:23:a8:a2:2d"
#define JAVACARD (0x01)
@ -50,7 +46,7 @@
#ifdef ENABLE_OPENSSL
#define DEBUG_SSL
#ifdef DEBUG_SSL
static void print_openssl_erreur(void)
static void print_openssl_error(void)
{
static int charge = 0;
long r;
@ -620,7 +616,7 @@ static int westcos_create_file(sc_card_t *card, struct sc_file *file)
sc_debug(card->ctx, "westcos_create_file\n");
memset(buf, 0, sizeof(buf));
/* clef de transport */
/* transport key */
r = sc_card_ctl(card, SC_CARDCTL_WESTCOS_AUT_KEY, NULL);
if (r)
return (r);
@ -642,7 +638,7 @@ static int westcos_create_file(sc_card_t *card, struct sc_file *file)
case SC_FILE_TYPE_WORKING_EF:
switch (file->ef_structure) {
case SC_FILE_EF_TRANSPARENT:
buf[0] |= 0x20; /* pas de support transaction */
buf[0] |= 0x20; /* no transaction support */
buf[1] |= 0;
_convertion_ac_methode(file, HIGH, SC_AC_OP_READ,
&buf[2], &buf[2 + 4]);
@ -656,7 +652,7 @@ static int westcos_create_file(sc_card_t *card, struct sc_file *file)
buf[11] = (u8) ((file->size) % 256);
break;
case SC_FILE_EF_LINEAR_FIXED:
buf[0] |= 0x40; /* pas de support transaction */
buf[0] |= 0x40; /* no transaction support */
buf[1] |= 0;
_convertion_ac_methode(file, HIGH, SC_AC_OP_READ,
&buf[2], &buf[2 + 4]);
@ -668,7 +664,7 @@ static int westcos_create_file(sc_card_t *card, struct sc_file *file)
buf[11] = file->record_length;
break;
case SC_FILE_EF_CYCLIC:
buf[0] |= 0x60; /* pas de support transaction */
buf[0] |= 0x60; /* no transaction support */
buf[1] |= 0;
_convertion_ac_methode(file, HIGH, SC_AC_OP_READ,
&buf[2], &buf[2 + 4]);
@ -769,7 +765,9 @@ static int westcos_get_crypte_challenge(sc_card_t * card, const u8 * key,
u8 * result, size_t * len)
{
int r;
#ifdef ENABLE_OPENSSL
DES_key_schedule ks1, ks2;
#endif
u8 buf[8];
if ((*len) < sizeof(buf))
return SC_ERROR_INVALID_ARGUMENTS;
@ -777,17 +775,21 @@ static int westcos_get_crypte_challenge(sc_card_t * card, const u8 * key,
r = sc_get_challenge(card, buf, *len);
if (r)
return r;
#ifdef ENABLE_OPENSSL
DES_set_key((const_DES_cblock *) & key[0], &ks1);
DES_set_key((const_DES_cblock *) & key[8], &ks2);
DES_ecb2_encrypt((const_DES_cblock *)buf, (DES_cblock*)result, &ks1, &ks2, DES_ENCRYPT);
return 0;
return SC_SUCCESS;
#else
return SC_ERROR_NOT_SUPPORTED;
#endif
}
static int westcos_pin_cmd(sc_card_t * card, struct sc_pin_cmd_data *data,
int *tries_left)
{
int r;
u8 buf[20]; //, result[20];
u8 buf[20];
sc_apdu_t apdu;
size_t len = 0;
int pad = 0, use_pin_pad = 0, ins, p1 = 0;
@ -1177,11 +1179,12 @@ static int westcos_sign_decipher(int mode, sc_card_t *card,
priv_data_t *priv_data = NULL;
int pad;
#ifdef ENABLE_OPENSSL
#ifndef ENABLE_OPENSSL
r = SC_ERROR_NOT_SUPPORTED;
#else
RSA *rsa = NULL;
BIO *mem = BIO_new(BIO_s_mem());
#endif
if (card == NULL)
return SC_ERROR_INVALID_ARGUMENTS;
if (card->ctx->debug >= 1)
@ -1191,10 +1194,6 @@ static int westcos_sign_decipher(int mode, sc_card_t *card,
r = SC_ERROR_OUT_OF_MEMORY;
goto out;
}
#ifndef ENABLE_OPENSSL
r = SC_ERROR_NOT_SUPPORTED;
#else
if ((priv_data->env.flags) & SC_ALGORITHM_RSA_PAD_PKCS1)
pad = RSA_PKCS1_PADDING;
@ -1225,13 +1224,13 @@ static int westcos_sign_decipher(int mode, sc_card_t *card,
BIO_set_mem_eof_return(mem, -1);
if (!d2i_RSAPrivateKey_bio(mem, &rsa)) {
if (card->ctx->debug >= 5)
sc_debug(card->ctx, "RSA clef invalide, %d\n",
sc_debug(card->ctx, "RSA key invalid, %d\n",
ERR_get_error());
r = SC_ERROR_UNKNOWN;
goto out;
}
/* pkcs11 reroute routine cryptage vers la carte */
/* pkcs11 reset openssl functions */
rsa->meth = RSA_PKCS1_SSLeay();
if (RSA_size(rsa) > outlen) {
if (card->ctx->debug >= 5)
@ -1245,7 +1244,7 @@ static int westcos_sign_decipher(int mode, sc_card_t *card,
if (r == -1) {
#ifdef DEBUG_SSL
print_openssl_erreur();
print_openssl_error();
#endif
if (card->ctx->debug >= 5)
@ -1256,13 +1255,13 @@ static int westcos_sign_decipher(int mode, sc_card_t *card,
}
}
else { /* signature */
else { /* sign */
r = RSA_private_encrypt(data_len, data, out, rsa, pad);
if (r == -1) {
#ifdef DEBUG_SSL
print_openssl_erreur();
print_openssl_error();
#endif
if (card->ctx->debug >= 5)
@ -1284,15 +1283,12 @@ static int westcos_sign_decipher(int mode, sc_card_t *card,
r = outlen;
#endif
#endif /* ENABLE_OPENSSL */
out:
#ifdef ENABLE_OPENSSL
out:
if (mem)
BIO_free(mem);
if (rsa)
RSA_free(rsa);
#endif
#endif ENABLE_OPENSSL
if (keyfile)
sc_file_free(keyfile);
return r;

View File

@ -35,50 +35,12 @@
#include <openssl/rsa.h>
#include <openssl/evp.h>
#include <openssl/pem.h>
#include <openssl/err.h>
#include <openssl/bio.h>
#endif
extern int sc_check_sw(sc_card_t *card, unsigned int sw1, unsigned int sw2);
#if 0
/*
* Get private and public key file
*/
static int _westcos_get_keyfiles(sc_profile_t *profile, sc_card_t *card,
const sc_path_t *df_path,
sc_file_t **prkf, sc_file_t **pukf)
{
sc_path_t path = *df_path;
int r;
/* Get the private key file */
r = SC_ERROR_NOT_SUPPORTED; //sc_profile_get_file_by_path(profile, &path, prkf);
if (r < 0) {
char pbuf[SC_MAX_PATH_STRING_SIZE];
r = sc_path_print(pbuf, sizeof(pbuf), &path);
if (r != SC_SUCCESS)
pbuf[0] = '\0';
return r;
}
/* Get the public key file */
path.len -= 2;
sc_append_file_id(&path, 0x1012);
r = SC_ERROR_NOT_SUPPORTED; //sc_profile_get_file_by_path(profile, &path, pukf);
if (r < 0) {
sc_file_free(*prkf);
return r;
}
return 0;
}
#endif /* currently unused */
static int westcos_pkcs15init_init_card(sc_profile_t *profile,
sc_card_t *card)
{
@ -100,7 +62,6 @@ static int westcos_pkcs15init_create_dir(sc_profile_t *profile,
/* Create the application DF */
r = sc_pkcs15init_create_file(profile, card, df);
//if(r) return r;
r = sc_select_file(card, &df->path, NULL);
if(r) return r;
@ -108,19 +69,6 @@ static int westcos_pkcs15init_create_dir(sc_profile_t *profile,
return 0;
}
#if 0
/*
* Create a PIN domain (i.e. a sub-directory holding a user PIN)
*/
static int westcos_pkcs15init_create_domain(sc_profile_t *profile,
sc_card_t *card,
const sc_pkcs15_id_t *id,
sc_file_t **ret)
{
return SC_ERROR_NOT_SUPPORTED; //sc_pkcs15_create_pin_domain(profile, card, id, ret);
}
#endif /* currently unused */
/*
* Select the PIN reference
*/
@ -179,8 +127,6 @@ static int westcos_pkcs15_create_pin(sc_profile_t *profile,
if(r) return (r);
}
//r = sc_pkcs15init_create_file(profile, card, file);
if(file)
sc_file_free(file);
@ -308,24 +254,6 @@ static int westcos_pkcs15init_store_key(sc_profile_t *profile,
sc_pkcs15_prkey_t *key)
{
return SC_ERROR_NOT_SUPPORTED;
#if 0
int r;
sc_file_t *keyfile;
sc_pkcs15_prkey_info_t *key_info = (sc_pkcs15_prkey_info_t *) obj->data;
if (obj->type != SC_PKCS15_TYPE_PRKEY_RSA) {
return SC_ERROR_NOT_SUPPORTED;
}
r = SC_ERROR_NOT_SUPPORTED; //sc_profile_get_file_by_path(profile, &key_info->path, &keyfile);
if (r < 0) return r;
//r = sc_pkcs15init_update_file(profile, card, keyfile, &key->der.data, &key->der.len);
//sc_file_free(keyfile);
return r;
#endif
}
/*
@ -355,7 +283,7 @@ static int westcos_pkcs15init_generate_key(sc_profile_t *profile,
return SC_ERROR_NOT_SUPPORTED;
}
if(/*keyfile == NULL ||*/ rsa == NULL || bn == NULL || mem == NULL)
if(rsa == NULL || bn == NULL || mem == NULL)
{
r = SC_ERROR_OUT_OF_MEMORY;
goto out;