From 485397c48d5157d9d31cd81562fb557654335d40 Mon Sep 17 00:00:00 2001 From: Damien Miller Date: Wed, 4 Jun 2003 19:15:10 +1000 Subject: - (djm) Bug #577 - wrong flag in scard-opensc.c sc_private_decrypt. ok markus@ --- scard-opensc.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'scard-opensc.c') diff --git a/scard-opensc.c b/scard-opensc.c index e91bc25ba..312251829 100644 --- a/scard-opensc.c +++ b/scard-opensc.c @@ -173,7 +173,8 @@ sc_private_decrypt(int flen, u_char *from, u_char *to, RSA *rsa, r = sc_prkey_op_init(rsa, &key_obj); if (r) return -1; - r = sc_pkcs15_decipher(p15card, key_obj, 0, from, flen, to, flen); + r = sc_pkcs15_decipher(p15card, key_obj, SC_ALGORITHM_RSA_PAD_PKCS1, + from, flen, to, flen); sc_unlock(card); if (r < 0) { error("sc_pkcs15_decipher() failed: %s", sc_strerror(r)); -- cgit v1.2.3 From 2527f5755a76a51093ce212c98003f379a9479aa Mon Sep 17 00:00:00 2001 From: Damien Miller Date: Wed, 4 Jun 2003 19:22:06 +1000 Subject: - (djm) Bug #584: scard-opensc.c doesn't work without PIN. Patch from larsch@trustcenter.de; ok markus@ --- ChangeLog | 6 ++++-- scard-opensc.c | 6 +++++- 2 files changed, 9 insertions(+), 3 deletions(-) (limited to 'scard-opensc.c') diff --git a/ChangeLog b/ChangeLog index b8a2467ed..ee5624fec 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2,7 +2,9 @@ - (djm) Bug #573 - Remove unneeded Krb headers and compat goop. Patch from simon@sxw.org.uk (Also matches a change in OpenBSD a while ago) - (djm) Bug #577 - wrong flag in scard-opensc.c sc_private_decrypt. - ok markus@ + Patch from larsch@trustcenter.de; ok markus@ + - (djm) Bug #584: scard-opensc.c doesn't work without PIN. Patch from + larsch@trustcenter.de; ok markus@ 20030603 - (djm) Replace setproctitle replacement with code derived from @@ -431,4 +433,4 @@ - Fix sshd BindAddress and -b options for systems using fake-getaddrinfo. Report from murple@murple.net, diagnosis from dtucker@zip.com.au -$Id: ChangeLog,v 1.2772 2003/06/04 09:15:10 djm Exp $ +$Id: ChangeLog,v 1.2773 2003/06/04 09:22:06 djm Exp $ diff --git a/scard-opensc.c b/scard-opensc.c index 312251829..2055ee22a 100644 --- a/scard-opensc.c +++ b/scard-opensc.c @@ -133,7 +133,11 @@ sc_prkey_op_init(RSA *rsa, struct sc_pkcs15_object **key_obj_out) key = key_obj->data; r = sc_pkcs15_find_pin_by_auth_id(p15card, &key_obj->auth_id, &pin_obj); - if (r) { + if (r == SC_ERROR_OBJECT_NOT_FOUND) { + /* no pin required */ + *key_obj_out = key_obj; + return 0; + } else if (r) { error("Unable to find PIN object from SmartCard: %s", sc_strerror(r)); goto err; -- cgit v1.2.3 From 4c322482bbf1a7465c5ef1b1e280c09d39c8bb2e Mon Sep 17 00:00:00 2001 From: Damien Miller Date: Wed, 4 Jun 2003 22:12:17 +1000 Subject: - (djm) Update to fix of bug #584: lock card before return. From larsch@trustcenter.de --- ChangeLog | 4 +++- scard-opensc.c | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) (limited to 'scard-opensc.c') diff --git a/ChangeLog b/ChangeLog index b46c2feaa..c455a861e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -14,6 +14,8 @@ - djm@cvs.openbsd.org 2003/06/04 10:23:48 [sshd.c] remove duplicated group-dropping code; ok markus@ + - (djm) Update to fix of bug #584: lock card before return. + From larsch@trustcenter.de 20030603 - (djm) Replace setproctitle replacement with code derived from @@ -442,4 +444,4 @@ - Fix sshd BindAddress and -b options for systems using fake-getaddrinfo. Report from murple@murple.net, diagnosis from dtucker@zip.com.au -$Id: ChangeLog,v 1.2775 2003/06/04 10:32:12 djm Exp $ +$Id: ChangeLog,v 1.2776 2003/06/04 12:12:17 djm Exp $ diff --git a/scard-opensc.c b/scard-opensc.c index 2055ee22a..c670428a1 100644 --- a/scard-opensc.c +++ b/scard-opensc.c @@ -135,6 +135,7 @@ sc_prkey_op_init(RSA *rsa, struct sc_pkcs15_object **key_obj_out) &pin_obj); if (r == SC_ERROR_OBJECT_NOT_FOUND) { /* no pin required */ + sc_lock(card); *key_obj_out = key_obj; return 0; } else if (r) { -- cgit v1.2.3 From 76b5c8a83acab596c45624a5353b0ad5930321b3 Mon Sep 17 00:00:00 2001 From: Damien Miller Date: Thu, 5 Jun 2003 19:19:35 +1000 Subject: - (djm) Bug #589 - scard-opensc: load only keys with a private keys Patch from larsch@trustcenter.de --- ChangeLog | 4 +++- scard-opensc.c | 13 +++++++++++-- 2 files changed, 14 insertions(+), 3 deletions(-) (limited to 'scard-opensc.c') diff --git a/ChangeLog b/ChangeLog index 3fa476dc3..47891b52d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -8,6 +8,8 @@ - (djm) Merge all the openbsd/fake-* into fake-rfc2553.[ch] - (djm) Bug #588 - Add scard-opensc.o back to Makefile.in Patch from larsch@trustcenter.de + - (djm) Bug #589 - scard-opensc: load only keys with a private keys + Patch from larsch@trustcenter.de 20030604 - (djm) Bug #573 - Remove unneeded Krb headers and compat goop. Patch from @@ -469,4 +471,4 @@ - Fix sshd BindAddress and -b options for systems using fake-getaddrinfo. Report from murple@murple.net, diagnosis from dtucker@zip.com.au -$Id: ChangeLog,v 1.2786 2003/06/05 08:53:42 djm Exp $ +$Id: ChangeLog,v 1.2787 2003/06/05 09:19:35 djm Exp $ diff --git a/scard-opensc.c b/scard-opensc.c index c670428a1..9766d46cc 100644 --- a/scard-opensc.c +++ b/scard-opensc.c @@ -135,7 +135,11 @@ sc_prkey_op_init(RSA *rsa, struct sc_pkcs15_object **key_obj_out) &pin_obj); if (r == SC_ERROR_OBJECT_NOT_FOUND) { /* no pin required */ - sc_lock(card); + r = sc_lock(card); + if (r) { + error("Unable to lock smartcard: %s", sc_strerror(r)); + goto err; + } *key_obj_out = key_obj; return 0; } else if (r) { @@ -429,9 +433,14 @@ sc_get_keys(const char *id, const char *pin) } key_count = r; } - /* FIXME: only keep entries with a corresponding private key */ keys = xmalloc(sizeof(Key *) * (key_count*2+1)); for (i = 0; i < key_count; i++) { + sc_pkcs15_object_t *tmp_obj = NULL; + cert_id = ((sc_pkcs15_cert_info_t *)(certs[i]->data))->id; + if (sc_pkcs15_find_prkey_by_id(p15card, &cert_id, &tmp_obj)) + /* skip the public key (certificate) if no + * corresponding private key is present */ + continue; k = key_new(KEY_RSA); if (k == NULL) break; -- cgit v1.2.3 From 4a8e2848556682541799118528fe3b56b901c5f7 Mon Sep 17 00:00:00 2001 From: Damien Miller Date: Sat, 28 Jun 2003 18:02:47 +1000 Subject: - (djm) Bug #591: use PKCS#15 private key label as a comment in case of OpenSC. Report and patch from larsch@trustcenter.de --- ChangeLog | 6 +++++- scard-opensc.c | 26 ++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) (limited to 'scard-opensc.c') diff --git a/ChangeLog b/ChangeLog index 4b4bcf2cd..085b2b5bc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +20030628 + - (djm) Bug #591: use PKCS#15 private key label as a comment in case + of OpenSC. Report and patch from larsch@trustcenter.de + 20030628 - (dtucker) OpenBSD CVS Sync - markus@cvs.openbsd.org 2003/06/23 09:02:44 @@ -603,4 +607,4 @@ - Fix sshd BindAddress and -b options for systems using fake-getaddrinfo. Report from murple@murple.net, diagnosis from dtucker@zip.com.au -$Id: ChangeLog,v 1.2829 2003/06/28 02:54:33 dtucker Exp $ +$Id: ChangeLog,v 1.2830 2003/06/28 08:02:47 djm Exp $ diff --git a/scard-opensc.c b/scard-opensc.c index 9766d46cc..e8e12dd85 100644 --- a/scard-opensc.c +++ b/scard-opensc.c @@ -474,4 +474,30 @@ sc_put_key(Key *prv, const char *id) return -1; } +char * +sc_get_key_label(Key *key) +{ + int r; + const struct sc_priv_data *priv; + struct sc_pkcs15_object *key_obj; + + priv = (const struct sc_priv_data *) RSA_get_app_data(key->rsa); + if (priv == NULL || p15card == NULL) { + logit("SmartCard key not loaded"); + /* internal error => return default label */ + return xstrdup("smartcard key"); + } + r = sc_pkcs15_find_prkey_by_id(p15card, &priv->cert_id, &key_obj); + if (r) { + logit("Unable to find private key from SmartCard: %s", + sc_strerror(r)); + return xstrdup("smartcard key"); + } + if (key_obj == NULL || key_obj->label == NULL) + /* the optional PKCS#15 label does not exists + * => return the default label */ + return xstrdup("smartcard key"); + return xstrdup(key_obj->label); +} + #endif /* SMARTCARD */ -- cgit v1.2.3 From 723569b257c8b1f48836ea777886c10bfa844692 Mon Sep 17 00:00:00 2001 From: Damien Miller Date: Sat, 28 Jun 2003 18:08:16 +1000 Subject: - (djm) Bug #593: Sanity check OpenSC card reader number; patch from aj@dungeon.inka.de --- ChangeLog | 4 +++- scard-opensc.c | 6 ++++++ 2 files changed, 9 insertions(+), 1 deletion(-) (limited to 'scard-opensc.c') diff --git a/ChangeLog b/ChangeLog index 085b2b5bc..1e0509db0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,8 @@ 20030628 - (djm) Bug #591: use PKCS#15 private key label as a comment in case of OpenSC. Report and patch from larsch@trustcenter.de + - (djm) Bug #593: Sanity check OpenSC card reader number; patch from + aj@dungeon.inka.de 20030628 - (dtucker) OpenBSD CVS Sync @@ -607,4 +609,4 @@ - Fix sshd BindAddress and -b options for systems using fake-getaddrinfo. Report from murple@murple.net, diagnosis from dtucker@zip.com.au -$Id: ChangeLog,v 1.2830 2003/06/28 08:02:47 djm Exp $ +$Id: ChangeLog,v 1.2831 2003/06/28 08:08:16 djm Exp $ diff --git a/scard-opensc.c b/scard-opensc.c index e8e12dd85..4ab87ea8a 100644 --- a/scard-opensc.c +++ b/scard-opensc.c @@ -89,6 +89,12 @@ sc_init(void) r = sc_establish_context(&ctx, "openssh"); if (r) goto err; + if (sc_reader_id >= ctx->reader_count) { + r = SC_ERROR_NO_READERS_FOUND; + error("Illegal reader number %d (max %d)", sc_reader_id, + ctx->reader_count -1); + goto err; + } r = sc_connect_card(ctx->reader[sc_reader_id], 0, &card); if (r) goto err; -- cgit v1.2.3 From 331b6af8fa96417cf126383de7e2ed024b7c7e2c Mon Sep 17 00:00:00 2001 From: Damien Miller Date: Mon, 25 Aug 2003 10:58:26 +1000 Subject: - (djm) Bug #621: Select OpenSC keys by usage attributes. Patch from larsch@trustcenter.de --- ChangeLog | 6 +++++- scard-opensc.c | 24 ++++++++++++++++++++---- 2 files changed, 25 insertions(+), 5 deletions(-) (limited to 'scard-opensc.c') diff --git a/ChangeLog b/ChangeLog index 1303acc45..b7fe1fc40 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +20030825 + - (djm) Bug #621: Select OpenSC keys by usage attributes. Patch from + larsch@trustcenter.de + 20030822 - (djm) s/get_progname/ssh_get_progname/g to avoid conflict with Heimdal -lbroken; ok dtucker @@ -851,4 +855,4 @@ - Fix sshd BindAddress and -b options for systems using fake-getaddrinfo. Report from murple@murple.net, diagnosis from dtucker@zip.com.au -$Id: ChangeLog,v 1.2898 2003/08/22 08:43:48 dtucker Exp $ +$Id: ChangeLog,v 1.2899 2003/08/25 00:58:26 djm Exp $ diff --git a/scard-opensc.c b/scard-opensc.c index 4ab87ea8a..2489fec45 100644 --- a/scard-opensc.c +++ b/scard-opensc.c @@ -110,7 +110,8 @@ err: /* private key operations */ static int -sc_prkey_op_init(RSA *rsa, struct sc_pkcs15_object **key_obj_out) +sc_prkey_op_init(RSA *rsa, struct sc_pkcs15_object **key_obj_out, + unsigned int usage) { int r; struct sc_priv_data *priv; @@ -130,7 +131,8 @@ sc_prkey_op_init(RSA *rsa, struct sc_pkcs15_object **key_obj_out) goto err; } } - r = sc_pkcs15_find_prkey_by_id(p15card, &priv->cert_id, &key_obj); + r = sc_pkcs15_find_prkey_by_id_usage(p15card, &priv->cert_id, + usage, &key_obj); if (r) { error("Unable to find private key from SmartCard: %s", sc_strerror(r)); @@ -176,6 +178,9 @@ err: return -1; } +#define SC_USAGE_DECRYPT SC_PKCS15_PRKEY_USAGE_DECRYPT | \ + SC_PKCS15_PRKEY_USAGE_UNWRAP + static int sc_private_decrypt(int flen, u_char *from, u_char *to, RSA *rsa, int padding) @@ -185,7 +190,7 @@ sc_private_decrypt(int flen, u_char *from, u_char *to, RSA *rsa, if (padding != RSA_PKCS1_PADDING) return -1; - r = sc_prkey_op_init(rsa, &key_obj); + r = sc_prkey_op_init(rsa, &key_obj, SC_USAGE_DECRYPT); if (r) return -1; r = sc_pkcs15_decipher(p15card, key_obj, SC_ALGORITHM_RSA_PAD_PKCS1, @@ -201,6 +206,9 @@ err: return -1; } +#define SC_USAGE_SIGN SC_PKCS15_PRKEY_USAGE_SIGN | \ + SC_PKCS15_PRKEY_USAGE_SIGNRECOVER + static int sc_sign(int type, u_char *m, unsigned int m_len, unsigned char *sigret, unsigned int *siglen, RSA *rsa) @@ -209,7 +217,15 @@ sc_sign(int type, u_char *m, unsigned int m_len, int r; unsigned long flags = 0; - r = sc_prkey_op_init(rsa, &key_obj); + /* XXX: sc_prkey_op_init will search for a pkcs15 private + * key object with the sign or signrecover usage flag set. + * If the signing key has only the non-repudiation flag set + * the key will be rejected as using a non-repudiation key + * for authentication is not recommended. Note: This does not + * prevent the use of a non-repudiation key for authentication + * if the sign or signrecover flag is set as well. + */ + r = sc_prkey_op_init(rsa, &key_obj, SC_USAGE_SIGN); if (r) return -1; /* FIXME: length of sigret correct? */ -- cgit v1.2.3