Add pool of certificates to help certificate path building for clients
sending incomplete path in the signedData. git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@16854 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
13
kdc/pkinit.c
13
kdc/pkinit.c
@@ -51,7 +51,7 @@ struct krb5_pk_identity {
|
|||||||
hx509_verify_ctx verify_ctx;
|
hx509_verify_ctx verify_ctx;
|
||||||
hx509_certs certs;
|
hx509_certs certs;
|
||||||
hx509_certs anchors;
|
hx509_certs anchors;
|
||||||
hx509_certs chain;
|
hx509_certs certpool;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum pkinit_type {
|
enum pkinit_type {
|
||||||
@@ -566,12 +566,15 @@ _kdc_pk_rd_padata(krb5_context context,
|
|||||||
kdc_identity->verify_ctx,
|
kdc_identity->verify_ctx,
|
||||||
signed_content.data,
|
signed_content.data,
|
||||||
signed_content.length,
|
signed_content.length,
|
||||||
kdc_identity->certs,
|
kdc_identity->certpool,
|
||||||
&eContentType,
|
&eContentType,
|
||||||
&eContent,
|
&eContent,
|
||||||
&signer_certs);
|
&signer_certs);
|
||||||
if (ret)
|
if (ret) {
|
||||||
|
kdc_log(context, config, 0,
|
||||||
|
"PK-INIT failed to verify signature %d", ret);
|
||||||
goto out;
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
ret = hx509_get_one_cert(kdc_identity->hx509ctx, signer_certs,
|
ret = hx509_get_one_cert(kdc_identity->hx509ctx, signer_certs,
|
||||||
&client_params->cert);
|
&client_params->cert);
|
||||||
@@ -1235,7 +1238,7 @@ _kdc_pk_initialize(krb5_context context,
|
|||||||
krb5_kdc_configuration *config,
|
krb5_kdc_configuration *config,
|
||||||
const char *user_id,
|
const char *user_id,
|
||||||
const char *anchors,
|
const char *anchors,
|
||||||
char **chain)
|
char **pool)
|
||||||
{
|
{
|
||||||
const char *file;
|
const char *file;
|
||||||
krb5_error_code ret;
|
krb5_error_code ret;
|
||||||
@@ -1257,7 +1260,7 @@ _kdc_pk_initialize(krb5_context context,
|
|||||||
&kdc_identity,
|
&kdc_identity,
|
||||||
user_id,
|
user_id,
|
||||||
anchors,
|
anchors,
|
||||||
chain,
|
pool,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
NULL);
|
NULL);
|
||||||
|
@@ -68,7 +68,7 @@ struct krb5_pk_identity {
|
|||||||
hx509_verify_ctx verify_ctx;
|
hx509_verify_ctx verify_ctx;
|
||||||
hx509_certs certs;
|
hx509_certs certs;
|
||||||
hx509_certs anchors;
|
hx509_certs anchors;
|
||||||
hx509_certs chain;
|
hx509_certs certpool;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct krb5_pk_cert {
|
struct krb5_pk_cert {
|
||||||
@@ -523,7 +523,7 @@ _krb5_pk_verify_sign(krb5_context context,
|
|||||||
id->verify_ctx,
|
id->verify_ctx,
|
||||||
data,
|
data,
|
||||||
length,
|
length,
|
||||||
id->certs,
|
id->certpool,
|
||||||
contentType,
|
contentType,
|
||||||
content,
|
content,
|
||||||
&signer_certs);
|
&signer_certs);
|
||||||
@@ -1207,12 +1207,12 @@ _krb5_pk_load_openssl_id(krb5_context context,
|
|||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
ret = hx509_certs_init(id->hx509ctx, "MEMORY:pkinit-cert-chain",
|
ret = hx509_certs_init(id->hx509ctx, "MEMORY:pkinit-cert-chain",
|
||||||
0, NULL, &id->chain);
|
0, NULL, &id->certpool);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
while (chain && *chain) {
|
while (chain && *chain) {
|
||||||
ret = hx509_certs_append(id->hx509ctx, id->chain, NULL, *chain);
|
ret = hx509_certs_append(id->hx509ctx, id->certpool, NULL, *chain);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
krb5_set_error_string(context,
|
krb5_set_error_string(context,
|
||||||
"pkinit failed to load chain %s",
|
"pkinit failed to load chain %s",
|
||||||
@@ -1233,7 +1233,7 @@ out:
|
|||||||
hx509_verify_destroy_ctx(id->verify_ctx);
|
hx509_verify_destroy_ctx(id->verify_ctx);
|
||||||
hx509_certs_free(&id->certs);
|
hx509_certs_free(&id->certs);
|
||||||
hx509_certs_free(&id->anchors);
|
hx509_certs_free(&id->anchors);
|
||||||
hx509_certs_free(&id->chain);
|
hx509_certs_free(&id->certpool);
|
||||||
hx509_context_free(&id->hx509ctx);
|
hx509_context_free(&id->hx509ctx);
|
||||||
free(id);
|
free(id);
|
||||||
} else
|
} else
|
||||||
@@ -1518,7 +1518,7 @@ _krb5_get_init_creds_opt_free_pkinit(krb5_get_init_creds_opt *opt)
|
|||||||
hx509_verify_destroy_ctx(ctx->id->verify_ctx);
|
hx509_verify_destroy_ctx(ctx->id->verify_ctx);
|
||||||
hx509_certs_free(&ctx->id->certs);
|
hx509_certs_free(&ctx->id->certs);
|
||||||
hx509_certs_free(&ctx->id->anchors);
|
hx509_certs_free(&ctx->id->anchors);
|
||||||
hx509_certs_free(&ctx->id->chain);
|
hx509_certs_free(&ctx->id->certpool);
|
||||||
hx509_context_free(&ctx->id->hx509ctx);
|
hx509_context_free(&ctx->id->hx509ctx);
|
||||||
|
|
||||||
if (ctx->clientDHNonce) {
|
if (ctx->clientDHNonce) {
|
||||||
@@ -1540,6 +1540,7 @@ krb5_get_init_creds_opt_set_pkinit(krb5_context context,
|
|||||||
krb5_principal principal,
|
krb5_principal principal,
|
||||||
const char *user_id,
|
const char *user_id,
|
||||||
const char *x509_anchors,
|
const char *x509_anchors,
|
||||||
|
const char **chain,
|
||||||
int flags,
|
int flags,
|
||||||
krb5_prompter_fct prompter,
|
krb5_prompter_fct prompter,
|
||||||
void *prompter_data,
|
void *prompter_data,
|
||||||
@@ -1568,7 +1569,7 @@ krb5_get_init_creds_opt_set_pkinit(krb5_context context,
|
|||||||
&opt->opt_private->pk_init_ctx->id,
|
&opt->opt_private->pk_init_ctx->id,
|
||||||
user_id,
|
user_id,
|
||||||
x509_anchors,
|
x509_anchors,
|
||||||
NULL,
|
chain,
|
||||||
prompter,
|
prompter,
|
||||||
prompter_data,
|
prompter_data,
|
||||||
password);
|
password);
|
||||||
|
Reference in New Issue
Block a user