tsigkey = NULL;
result = dns_tkey_gssnegotiate(tsigquery, rcvmsg, servname,
&context, &tsigkey, gssring,
- use_win2k_gsstsig,
- &err_message);
+ use_win2k_gsstsig, &err_message);
switch (result) {
case DNS_R_CONTINUE:
+ dns_message_destroy(&rcvmsg);
+ dns_request_destroy(&request);
send_gssrequest(kserver, tsigquery, &request, context);
- break;
+ ddebug("Out of recvgss");
+ return;
case ISC_R_SUCCESS:
/*
break;
default:
- fatal("dns_tkey_negotiategss: %s %s",
+ fatal("dns_tkey_gssnegotiate: %s %s",
isc_result_totext(result),
err_message != NULL ? err_message : "");
}
isc_result_t result = ISC_R_SUCCESS;
dst_key_t *dstkey = NULL;
dns_tsigkey_t *tsigkey = NULL;
- dns_fixedname_t principal;
+ dns_fixedname_t fixed;
+ dns_name_t *principal;
isc_stdtime_t now;
isc_region_t intoken;
isc_buffer_t *outtoken = NULL;
if (result == ISC_R_SUCCESS)
gss_ctx = dst_key_getgssctx(tsigkey->key);
- dns_fixedname_init(&principal);
+ dns_fixedname_init(&fixed);
+ principal = dns_fixedname_name(&fixed);
/*
* Note that tctx->gsscred may be NULL if tctx->gssapi_keytab is set
*/
result = dst_gssapi_acceptctx(tctx->gsscred, tctx->gssapi_keytab,
- &intoken,
- &outtoken, &gss_ctx,
- dns_fixedname_name(&principal),
- tctx->mctx);
+ &intoken, &outtoken, &gss_ctx,
+ principal, tctx->mctx);
if (result == DNS_R_INVALIDTKEY) {
if (tsigkey != NULL)
dns_tsigkey_detach(&tsigkey);
isc_stdtime_get(&now);
- if (tsigkey == NULL) {
+ if (dns_name_countlabels(principal) == 0U) {
+ if (tsigkey != NULL)
+ dns_tsigkey_detach(&tsigkey);
+ } else if (tsigkey == NULL) {
#ifdef GSSAPI
OM_uint32 gret, minor, lifetime;
#endif
expire = now + lifetime;
#endif
RETERR(dns_tsigkey_createfromkey(name, &tkeyin->algorithm,
- dstkey, ISC_TRUE,
- dns_fixedname_name(&principal),
+ dstkey, ISC_TRUE, principal,
now, expire, ring->mctx, ring,
NULL));
dst_key_free(&dstkey);
dst_key_t *dstkey = NULL;
isc_buffer_t intoken;
isc_result_t result;
- unsigned char array[1024];
+ unsigned char array[TEMP_BUFFER_SZ];
REQUIRE(outtoken != NULL);
REQUIRE(qmsg != NULL);
{
dns_rdata_t rtkeyrdata = DNS_RDATA_INIT, qtkeyrdata = DNS_RDATA_INIT;
dns_name_t *tkeyname;
- dns_rdata_tkey_t rtkey, qtkey;
+ dns_rdata_tkey_t rtkey, qtkey, tkey;
isc_buffer_t intoken, outtoken;
dst_key_t *dstkey = NULL;
isc_result_t result;
- unsigned char array[1024];
+ unsigned char array[TEMP_BUFFER_SZ];
isc_boolean_t freertkey = ISC_FALSE;
REQUIRE(qmsg != NULL);
if (result != DNS_R_CONTINUE && result != ISC_R_SUCCESS)
return (result);
+ if (result == DNS_R_CONTINUE) {
+ dns_fixedname_t fixed;
+
+ dns_fixedname_init(&fixed);
+ dns_name_copy(tkeyname, dns_fixedname_name(&fixed), NULL);
+ tkeyname = dns_fixedname_name(&fixed);
+
+ tkey.common.rdclass = dns_rdataclass_any;
+ tkey.common.rdtype = dns_rdatatype_tkey;
+ ISC_LINK_INIT(&tkey.common, link);
+ tkey.mctx = NULL;
+ dns_name_init(&tkey.algorithm, NULL);
+
+ if (win2k)
+ dns_name_clone(DNS_TSIG_GSSAPIMS_NAME, &tkey.algorithm);
+ else
+ dns_name_clone(DNS_TSIG_GSSAPI_NAME, &tkey.algorithm);
+
+ tkey.inception = qtkey.inception;
+ tkey.expire = qtkey.expire;
+ tkey.mode = DNS_TKEYMODE_GSSAPI;
+ tkey.error = 0;
+ tkey.key = isc_buffer_base(&outtoken);
+ tkey.keylen = isc_buffer_usedlength(&outtoken);
+ tkey.other = NULL;
+ tkey.otherlen = 0;
+
+ dns_message_reset(qmsg, DNS_MESSAGE_INTENTRENDER);
+ RETERR(buildquery(qmsg, tkeyname, &tkey, win2k));
+ return (DNS_R_CONTINUE);
+ }
+
RETERR(dst_key_fromgssapi(dns_rootname, *context, rmsg->mctx,
&dstkey, NULL));