Skip to content

Commit

Permalink
Don't ask empty responder questions in PKINIT
Browse files Browse the repository at this point in the history
When putting together the set of identity prompts for a responder
challenge, if we don't need a PIN or password of some kind, don't ask
an empty question.

[ghudson@mit.edu: squashed commits, modified commit message, merged
PKCS11 test with current Python script]
  • Loading branch information
nalind authored and greghudson committed Jul 22, 2013
1 parent 744d6f8 commit b37a0be
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 9 deletions.
7 changes: 7 additions & 0 deletions src/plugins/preauth/pkinit/pkinit_clnt.c
Original file line number Diff line number Diff line change
Expand Up @@ -1126,6 +1126,13 @@ pkinit_client_prep_questions(krb5_context context,
continue;
n = i;

/* Make sure we don't just return an empty challenge. */
if (n == 0) {
pkiDebug("%s: no questions to ask\n", __FUNCTION__);
retval = 0;
goto cleanup;
}

/* Create the top-level object. */
retval = k5_json_object_create(&jval);
if (retval != 0)
Expand Down
8 changes: 4 additions & 4 deletions src/tests/responder.c
Original file line number Diff line number Diff line change
Expand Up @@ -100,11 +100,11 @@ responder(krb5_context ctx, void *rawdata, krb5_responder_context rctx)
*value++ = '\0';
/* Read the challenge. */
challenge = krb5_responder_get_challenge(ctx, rctx, key);
if (challenge == NULL)
challenge = "";
/* See if the expected challenge looks like JSON-encoded data. */
err = k5_json_decode(value, &decoded1);
if (err != 0) {
/* Check for "no challenge". */
if (challenge == NULL && *value == '\0') {
fprintf(stderr, "OK: (no challenge) == (no challenge)\n");
} else if (err != 0) {
/* It's not JSON, so assume we're just after a string compare. */
if (strcmp(challenge, value) == 0) {
fprintf(stderr, "OK: \"%s\" == \"%s\"\n", challenge, value);
Expand Down
28 changes: 23 additions & 5 deletions src/tests/t_pkinit.py
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@
# Run the basic test - PKINIT with FILE: identity, with no password on the key.
realm.run(['./responder',
'-x',
'pkinit={}',
'pkinit=',
'-X',
'X509_user_identity=%s' % file_identity,
'user@%s' % realm.realm])
Expand Down Expand Up @@ -144,7 +144,7 @@
shutil.copy(user_pem, os.path.join(path_enc, 'user.crt'))
realm.run(['./responder',
'-x',
'pkinit={}',
'pkinit=',
'-X',
'X509_user_identity=%s' % dir_identity,
'user@%s' % realm.realm])
Expand Down Expand Up @@ -195,7 +195,7 @@
# PKINIT with PKCS12: identity, with no password on the bundle.
realm.run(['./responder',
'-x',
'pkinit={}',
'pkinit=',
'-X',
'X509_user_identity=%s' % p12_identity,
'user@%s' % realm.realm])
Expand Down Expand Up @@ -243,13 +243,31 @@

if have_soft_pkcs11:
softpkcs11rc = os.path.join(os.getcwd(), 'testdir', 'soft-pkcs11.rc')
realm.env['SOFTPKCS11RC'] = softpkcs11rc

# PKINIT with PKCS11: identity, with no need for a PIN.
conf = open(softpkcs11rc, 'w')
conf.write("%s\t%s\t%s\t%s\n" % ('user', 'user token', user_pem,
privkey_enc_pem))
privkey_pem))
conf.close()
realm.env['SOFTPKCS11RC'] = softpkcs11rc
# Expect to succeed without having to supply any more information.
realm.run(['./responder',
'-x',
'pkinit=',
'-X',
'X509_user_identity=%s' % p11_identity,
'user@%s' % realm.realm])
realm.kinit('user@%s' % realm.realm,
flags=['-X', 'X509_user_identity=%s' % p11_identity])
realm.klist('user@%s' % realm.realm)
realm.run([kvno, realm.host_princ])

# PKINIT with PKCS11: identity, with a PIN supplied by the prompter.
os.remove(softpkcs11rc)
conf = open(softpkcs11rc, 'w')
conf.write("%s\t%s\t%s\t%s\n" % ('user', 'user token', user_pem,
privkey_enc_pem))
conf.close()
# Expect failure if the responder does nothing, and there's no prompter
realm.run(['./responder',
'-x',
Expand Down

0 comments on commit b37a0be

Please sign in to comment.