summaryrefslogtreecommitdiffstats
path: root/src/plugins
diff options
context:
space:
mode:
authorGreg Hudson <ghudson@mit.edu>2014-05-22 22:31:26 -0400
committerGreg Hudson <ghudson@mit.edu>2014-05-24 22:28:54 -0400
commitf8b42ef541a463f56720ec9358dd07716b04c5e2 (patch)
tree2eee874c5046b75ed2fc74f9784e0e416371fe6c /src/plugins
parentac406bac3d73a7e4efcc74adbb90c722457da969 (diff)
downloadkrb5-f8b42ef541a463f56720ec9358dd07716b04c5e2.tar.gz
krb5-f8b42ef541a463f56720ec9358dd07716b04c5e2.tar.xz
krb5-f8b42ef541a463f56720ec9358dd07716b04c5e2.zip
Properly handle PKCS11 label in PKINIT
The CK_TOKEN_INFO label field is defined to be zero-filled, but it may not be zero-terminated if all bytes of the field are used. Use only length-counted operations to process it. Also avoid underrunning the buffer pointer if the label is empty or contains only whitespace. ticket: 7917 target_version: 1.12.2 tags: pullup
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/preauth/pkinit/pkinit_crypto_openssl.c28
1 files changed, 18 insertions, 10 deletions
diff --git a/src/plugins/preauth/pkinit/pkinit_crypto_openssl.c b/src/plugins/preauth/pkinit/pkinit_crypto_openssl.c
index 109de23f9..1d6b0cd7a 100644
--- a/src/plugins/preauth/pkinit/pkinit_crypto_openssl.c
+++ b/src/plugins/preauth/pkinit/pkinit_crypto_openssl.c
@@ -3738,6 +3738,7 @@ pkinit_open_session(krb5_context context,
{
CK_ULONG i, r;
unsigned char *cp;
+ size_t label_len;
CK_ULONG count = 0;
CK_SLOT_ID_PTR slotlist;
CK_TOKEN_INFO tinfo;
@@ -3788,13 +3789,20 @@ pkinit_open_session(krb5_context context,
pkiDebug("C_GetTokenInfo: %s\n", pkinit_pkcs11_code_to_text(r));
return KRB5KDC_ERR_PREAUTH_FAILED;
}
- for (cp = tinfo.label + sizeof (tinfo.label) - 1;
- *cp == '\0' || *cp == ' '; cp--)
- *cp = '\0';
- pkiDebug("open_session: slotid %d token \"%s\"\n",
- (int) slotlist[i], tinfo.label);
+
+ /* tinfo.label is zero-filled but not necessarily zero-terminated.
+ * Find the length, ignoring any trailing spaces. */
+ for (cp = tinfo.label + sizeof(tinfo.label); cp > tinfo.label; cp--) {
+ if (cp[-1] != '\0' && cp[-1] != ' ')
+ break;
+ }
+ label_len = cp - tinfo.label;
+
+ pkiDebug("open_session: slotid %d token \"%.*s\"\n",
+ (int)slotlist[i], (int)label_len, tinfo.label);
if (cctx->token_label == NULL ||
- !strcmp((char *) cctx->token_label, (char *) tinfo.label))
+ (strlen(cctx->token_label) == label_len &&
+ memcmp(cctx->token_label, tinfo.label, label_len) == 0))
break;
cctx->p11->C_CloseSession(cctx->session);
}
@@ -3813,15 +3821,15 @@ pkinit_open_session(krb5_context context,
if (cctx->p11_module_name != NULL) {
if (cctx->slotid != PK_NOSLOT) {
if (asprintf(&p11name,
- "PKCS11:module_name=%s:slotid=%ld:token=%s",
+ "PKCS11:module_name=%s:slotid=%ld:token=%.*s",
cctx->p11_module_name, (long)cctx->slotid,
- tinfo.label) < 0)
+ (int)label_len, tinfo.label) < 0)
p11name = NULL;
} else {
if (asprintf(&p11name,
- "PKCS11:module_name=%s,token=%s",
+ "PKCS11:module_name=%s,token=%.*s",
cctx->p11_module_name,
- tinfo.label) < 0)
+ (int)label_len, tinfo.label) < 0)
p11name = NULL;
}
} else {