Ignore:
Timestamp:
Nov 27, 2012, 4:43:17 PM (13 years ago)
Author:
Silvan Scherrer
Message:

Samba Server: updated trunk to 3.6.0

Location:
trunk/server
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/server

  • trunk/server/source4/heimdal/kdc/pkinit.c

    r414 r745  
    33 * (Royal Institute of Technology, Stockholm, Sweden).
    44 * All rights reserved.
     5 *
     6 * Portions Copyright (c) 2009 Apple Inc. All rights reserved.
    57 *
    68 * Redistribution and use in source and binary forms, with or without
     
    3436#include "kdc_locl.h"
    3537
    36 RCSID("$Id$");
    37 
    3838#ifdef PKINIT
    3939
     
    228228        }
    229229
    230         dh_gen_keylen = DH_size(client_params->u.dh.key);
    231         size = BN_num_bytes(client_params->u.dh.key->p);
    232         if (size < dh_gen_keylen)
    233             size = dh_gen_keylen;
     230        size = DH_size(client_params->u.dh.key);
    234231
    235232        dh_gen_key = malloc(size);
     
    239236            goto out;
    240237        }
    241         memset(dh_gen_key, 0, size - dh_gen_keylen);
    242 
    243         dh_gen_keylen = DH_compute_key(dh_gen_key + (size - dh_gen_keylen),
    244                                        client_params->u.dh.public_key,
    245                                        client_params->u.dh.key);
     238
     239        dh_gen_keylen = DH_compute_key(dh_gen_key,client_params->u.dh.public_key, client_params->u.dh.key);
    246240        if (dh_gen_keylen == -1) {
    247241            ret = KRB5KRB_ERR_GENERIC;
     
    250244            goto out;
    251245        }
     246        if (dh_gen_keylen < size) {
     247            size -= dh_gen_keylen;
     248            memmove(dh_gen_key + size, dh_gen_key, dh_gen_keylen);
     249            memset(dh_gen_key, 0, size);
     250        }
     251
    252252        ret = 0;
    253253#ifdef HAVE_OPENSSL
     
    518518    }
    519519
    520     ret = hx509_certs_init(kdc_identity->hx509ctx,
     520    ret = hx509_certs_init(context->hx509ctx,
    521521                           "MEMORY:trust-anchors",
    522522                           0, NULL, &trust_anchors);
     
    526526    }
    527527
    528     ret = hx509_certs_merge(kdc_identity->hx509ctx, trust_anchors,
     528    ret = hx509_certs_merge(context->hx509ctx, trust_anchors,
    529529                            kdc_identity->anchors);
    530530    if (ret) {
     
    541541       
    542542        for (i = 0; i < pc->len; i++) {
    543             ret = hx509_cert_init_data(kdc_identity->hx509ctx,
     543            ret = hx509_cert_init_data(context->hx509ctx,
    544544                                       pc->val[i].cert.data,
    545545                                       pc->val[i].cert.length,
     
    547547            if (ret)
    548548                continue;
    549             hx509_certs_add(kdc_identity->hx509ctx, trust_anchors, cert);
     549            hx509_certs_add(context->hx509ctx, trust_anchors, cert);
    550550            hx509_cert_free(cert);
    551551        }
    552552    }
    553553
    554     ret = hx509_verify_init_ctx(kdc_identity->hx509ctx, &cp->verify_ctx);
     554    ret = hx509_verify_init_ctx(context->hx509ctx, &cp->verify_ctx);
    555555    if (ret) {
    556556        hx509_certs_free(&trust_anchors);
     
    619619            unsigned int i, maxedi;
    620620
    621             ret = hx509_certs_init(kdc_identity->hx509ctx,
     621            ret = hx509_certs_init(context->hx509ctx,
    622622                                   "MEMORY:client-anchors",
    623623                                   0, NULL,
     
    646646                    continue;
    647647
    648                 ret = hx509_query_alloc(kdc_identity->hx509ctx, &q);
     648                ret = hx509_query_alloc(context->hx509ctx, &q);
    649649                if (ret) {
    650650                    krb5_set_error_message(context, ret,
     
    658658                                                   &size);
    659659                if (ret) {
    660                     hx509_query_free(kdc_identity->hx509ctx, q);
     660                    hx509_query_free(context->hx509ctx, q);
    661661                    continue;
    662662                }
     
    664664                free_IssuerAndSerialNumber(&iasn);
    665665                if (ret) {
    666                     hx509_query_free(kdc_identity->hx509ctx, q);
     666                    hx509_query_free(context->hx509ctx, q);
    667667                    continue;
    668668                }
    669669
    670                 ret = hx509_certs_find(kdc_identity->hx509ctx,
     670                ret = hx509_certs_find(context->hx509ctx,
    671671                                       kdc_identity->certs,
    672672                                       q,
    673673                                       &cert);
    674                 hx509_query_free(kdc_identity->hx509ctx, q);
     674                hx509_query_free(context->hx509ctx, q);
    675675                if (ret)
    676676                    continue;
    677                 hx509_certs_add(kdc_identity->hx509ctx,
     677                hx509_certs_add(context->hx509ctx,
    678678                                cp->client_anchors, cert);
    679679                hx509_cert_free(cert);
     
    720720            flags |= HX509_CMS_VS_ALLOW_ZERO_SIGNER;
    721721
    722         ret = hx509_cms_verify_signed(kdc_identity->hx509ctx,
     722        ret = hx509_cms_verify_signed(context->hx509ctx,
    723723                                      cp->verify_ctx,
    724724                                      flags,
     
    731731                                      &signer_certs);
    732732        if (ret) {
    733             char *s = hx509_get_error_string(kdc_identity->hx509ctx, ret);
     733            char *s = hx509_get_error_string(context->hx509ctx, ret);
    734734            krb5_warnx(context, "PKINIT: failed to verify signature: %s: %d",
    735735                       s, ret);
     
    739739
    740740        if (signer_certs) {
    741             ret = hx509_get_one_cert(kdc_identity->hx509ctx, signer_certs,
     741            ret = hx509_get_one_cert(context->hx509ctx, signer_certs,
    742742                                     &cp->cert);
    743743            hx509_certs_free(&signer_certs);
     
    844844            cp->keyex = USE_RSA;
    845845
    846         ret = hx509_peer_info_alloc(kdc_identity->hx509ctx,
     846        ret = hx509_peer_info_alloc(context->hx509ctx,
    847847                                        &cp->peer);
    848848        if (ret) {
     
    852852       
    853853        if (ap.supportedCMSTypes) {
    854             ret = hx509_peer_info_set_cms_algs(kdc_identity->hx509ctx,
     854            ret = hx509_peer_info_set_cms_algs(context->hx509ctx,
    855855                                               cp->peer,
    856856                                               ap.supportedCMSTypes->val,
     
    862862        } else {
    863863            /* assume old client */
    864             hx509_peer_info_add_cms_alg(kdc_identity->hx509ctx, cp->peer,
     864            hx509_peer_info_add_cms_alg(context->hx509ctx, cp->peer,
    865865                                        hx509_crypto_des_rsdi_ede3_cbc());
    866             hx509_peer_info_add_cms_alg(kdc_identity->hx509ctx, cp->peer,
     866            hx509_peer_info_add_cms_alg(context->hx509ctx, cp->peer,
    867867                                        hx509_signature_rsa_with_sha1());
    868             hx509_peer_info_add_cms_alg(kdc_identity->hx509ctx, cp->peer,
     868            hx509_peer_info_add_cms_alg(context->hx509ctx, cp->peer,
    869869                                        hx509_signature_sha1());
    870870        }
     
    10171017        hx509_cert cert;
    10181018       
    1019         ret = hx509_query_alloc(kdc_identity->hx509ctx, &q);
     1019        ret = hx509_query_alloc(context->hx509ctx, &q);
    10201020        if (ret)
    10211021            goto out;
     
    10251025            hx509_query_match_friendly_name(q, config->pkinit_kdc_friendly_name);
    10261026       
    1027         ret = hx509_certs_find(kdc_identity->hx509ctx,
     1027        ret = hx509_certs_find(context->hx509ctx,
    10281028                               kdc_identity->certs,
    10291029                               q,
    10301030                               &cert);
    1031         hx509_query_free(kdc_identity->hx509ctx, q);
     1031        hx509_query_free(context->hx509ctx, q);
    10321032        if (ret)
    10331033            goto out;
    10341034       
    1035         ret = hx509_cms_create_signed_1(kdc_identity->hx509ctx,
     1035        ret = hx509_cms_create_signed_1(context->hx509ctx,
    10361036                                        0,
    10371037                                        sdAlg,
     
    10611061    }
    10621062
    1063     ret = hx509_cms_envelope_1(kdc_identity->hx509ctx,
     1063    ret = hx509_cms_envelope_1(context->hx509ctx,
    10641064                               HX509_CMS_EV_NO_KU_CHECK,
    10651065                               cp->cert,
     
    11731173     */
    11741174
    1175     ret = hx509_query_alloc(kdc_identity->hx509ctx, &q);
     1175    ret = hx509_query_alloc(context->hx509ctx, &q);
    11761176    if (ret)
    11771177        goto out;
     
    11811181        hx509_query_match_friendly_name(q, config->pkinit_kdc_friendly_name);
    11821182   
    1183     ret = hx509_certs_find(kdc_identity->hx509ctx,
     1183    ret = hx509_certs_find(context->hx509ctx,
    11841184                           kdc_identity->certs,
    11851185                           q,
    11861186                           &cert);
    1187     hx509_query_free(kdc_identity->hx509ctx, q);
     1187    hx509_query_free(context->hx509ctx, q);
    11881188    if (ret)
    11891189        goto out;
    11901190   
    1191     ret = hx509_cms_create_signed_1(kdc_identity->hx509ctx,
     1191    ret = hx509_cms_create_signed_1(context->hx509ctx,
    11921192                                    0,
    11931193                                    &asn1_oid_id_pkdhkeydata,
     
    13801380        }
    13811381
    1382         ASN1_MALLOC_ENCODE(PA_PK_AS_REP, buf, len, &rep, &size, ret);
     1382#define use_btmm_with_enckey 0
     1383        if (use_btmm_with_enckey && rep.element == choice_PA_PK_AS_REP_encKeyPack) {
     1384            PA_PK_AS_REP_BTMM btmm;
     1385            heim_any any;
     1386
     1387            any.data = rep.u.encKeyPack.data;
     1388            any.length = rep.u.encKeyPack.length;
     1389
     1390            btmm.dhSignedData = NULL;
     1391            btmm.encKeyPack = &any;
     1392
     1393            ASN1_MALLOC_ENCODE(PA_PK_AS_REP_BTMM, buf, len, &btmm, &size, ret);
     1394        } else {
     1395            ASN1_MALLOC_ENCODE(PA_PK_AS_REP, buf, len, &rep, &size, ret);
     1396        }
     1397
    13831398        free_PA_PK_AS_REP(&rep);
    13841399        if (ret) {
     
    15101525            }
    15111526
    1512             ret = hx509_ocsp_verify(kdc_identity->hx509ctx,
     1527            ret = hx509_ocsp_verify(context->hx509ctx,
    15131528                                    kdc_time,
    15141529                                    kdc_cert,
     
    15811596                                       &kn, &size);
    15821597        if (ret) {
     1598            const char *msg = krb5_get_error_message(context, ret);
    15831599            kdc_log(context, config, 0,
    1584                     "Decoding kerberos name in certificate failed: %s",
    1585                     krb5_get_err_text(context, ret));
     1600                    "Decoding kerberos name in certificate failed: %s", msg);
     1601            krb5_free_error_message(context, msg);
    15861602            break;
    15871603        }
     
    16451661        goto out;
    16461662    }
     1663    if (size != list.val[0].length) {
     1664        free_MS_UPN_SAN(&upn);
     1665        kdc_log(context, config, 0, "Trailing data in ");
     1666        ret = KRB5_KDC_ERR_CLIENT_NAME_MISMATCH;
     1667        goto out;
     1668    }
    16471669
    16481670    kdc_log(context, config, 0, "found MS UPN SAN: %s", upn);
     
    16981720    }
    16991721
    1700     ret = hx509_cert_get_base_subject(kdc_identity->hx509ctx,
     1722    ret = hx509_cert_get_base_subject(context->hx509ctx,
    17011723                                      cp->cert,
    17021724                                      &name);
     
    17191741       
    17201742        for (i = 0; i < pc->len; i++) {
    1721             ret = hx509_cert_init_data(kdc_identity->hx509ctx,
     1743            ret = hx509_cert_init_data(context->hx509ctx,
    17221744                                       pc->val[i].cert.data,
    17231745                                       pc->val[i].cert.length,
     
    17381760    if (config->pkinit_princ_in_cert) {
    17391761        ret = match_rfc_san(context, config,
    1740                             kdc_identity->hx509ctx,
     1762                            context->hx509ctx,
    17411763                            cp->cert,
    17421764                            client->entry.principal);
     
    17471769        }
    17481770        ret = match_ms_upn_san(context, config,
    1749                                kdc_identity->hx509ctx,
     1771                               context->hx509ctx,
    17501772                               cp->cert,
    17511773                               clientdb,
     
    19221944
    19231945krb5_error_code
    1924 _kdc_pk_initialize(krb5_context context,
    1925                    krb5_kdc_configuration *config,
    1926                    const char *user_id,
    1927                    const char *anchors,
    1928                    char **pool,
    1929                    char **revoke_list)
     1946krb5_kdc_pk_initialize(krb5_context context,
     1947                       krb5_kdc_configuration *config,
     1948                       const char *user_id,
     1949                       const char *anchors,
     1950                       char **pool,
     1951                       char **revoke_list)
    19301952{
    19311953    const char *file;
     
    19451967    ret = _krb5_pk_load_id(context,
    19461968                           &kdc_identity,
    1947                            0,
    19481969                           user_id,
    19491970                           anchors,
     
    19631984        hx509_cert cert;
    19641985       
    1965         ret = hx509_query_alloc(kdc_identity->hx509ctx, &q);
     1986        ret = hx509_query_alloc(context->hx509ctx, &q);
    19661987        if (ret) {
    19671988            krb5_warnx(context, "PKINIT: out of memory");
     
    19731994            hx509_query_match_friendly_name(q, config->pkinit_kdc_friendly_name);
    19741995       
    1975         ret = hx509_certs_find(kdc_identity->hx509ctx,
     1996        ret = hx509_certs_find(context->hx509ctx,
    19761997                               kdc_identity->certs,
    19771998                               q,
    19781999                               &cert);
    1979         hx509_query_free(kdc_identity->hx509ctx, q);
     2000        hx509_query_free(context->hx509ctx, q);
    19802001        if (ret == 0) {
    1981             if (hx509_cert_check_eku(kdc_identity->hx509ctx, cert,
     2002            if (hx509_cert_check_eku(context->hx509ctx, cert,
    19822003                                     &asn1_oid_id_pkkdcekuoid, 0)) {
    19832004                hx509_name name;
Note: See TracChangeset for help on using the changeset viewer.