2105. [func] GSS-TSIG support (RFC 3645).
This commit is contained in:
@@ -15,7 +15,7 @@
|
||||
* PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Id: name.h,v 1.122 2006/03/02 00:37:23 marka Exp $ */
|
||||
/* $Id: name.h,v 1.123 2006/12/04 01:52:46 marka Exp $ */
|
||||
|
||||
#ifndef DNS_NAME_H
|
||||
#define DNS_NAME_H 1
|
||||
@@ -131,6 +131,7 @@ struct dns_name {
|
||||
#define DNS_NAMEATTR_READONLY 0x0002
|
||||
#define DNS_NAMEATTR_DYNAMIC 0x0004
|
||||
#define DNS_NAMEATTR_DYNOFFSETS 0x0008
|
||||
#define DNS_NAMEATTR_NOCOMPRESS 0x0010
|
||||
/*
|
||||
* Attributes below 0x0100 reserved for name.c usage.
|
||||
*/
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
* PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Id: ssu.h,v 1.17 2006/02/16 23:51:33 marka Exp $ */
|
||||
/* $Id: ssu.h,v 1.18 2006/12/04 01:52:46 marka Exp $ */
|
||||
|
||||
#ifndef DNS_SSU_H
|
||||
#define DNS_SSU_H 1
|
||||
@@ -28,14 +28,17 @@
|
||||
|
||||
ISC_LANG_BEGINDECLS
|
||||
|
||||
#define DNS_SSUMATCHTYPE_NAME 0
|
||||
#define DNS_SSUMATCHTYPE_SUBDOMAIN 1
|
||||
#define DNS_SSUMATCHTYPE_WILDCARD 2
|
||||
#define DNS_SSUMATCHTYPE_SELF 3
|
||||
#define DNS_SSUMATCHTYPE_SELFSUB 4
|
||||
#define DNS_SSUMATCHTYPE_SELFWILD 5
|
||||
#define DNS_SSUMATCHTYPE_MAX 5 /* maximum defined value */
|
||||
|
||||
#define DNS_SSUMATCHTYPE_NAME 0
|
||||
#define DNS_SSUMATCHTYPE_SUBDOMAIN 1
|
||||
#define DNS_SSUMATCHTYPE_WILDCARD 2
|
||||
#define DNS_SSUMATCHTYPE_SELF 3
|
||||
#define DNS_SSUMATCHTYPE_SELFSUB 4
|
||||
#define DNS_SSUMATCHTYPE_SELFWILD 5
|
||||
#define DNS_SSUMATCHTYPE_SELFKRB5 6
|
||||
#define DNS_SSUMATCHTYPE_SELFMS 7
|
||||
#define DNS_SSUMATCHTYPE_SUBDOMAINMS 8
|
||||
#define DNS_SSUMATCHTYPE_SUBDOMAINKRB5 9
|
||||
#define DNS_SSUMATCHTYPE_MAX 9 /* max value */
|
||||
|
||||
isc_result_t
|
||||
dns_ssutable_create(isc_mem_t *mctx, dns_ssutable_t **table);
|
||||
@@ -91,8 +94,8 @@ dns_ssutable_addrule(dns_ssutable_t *table, isc_boolean_t grant,
|
||||
* at that name.
|
||||
*
|
||||
* Notes:
|
||||
*\li If 'matchtype' is SELF, this rule only matches if the name
|
||||
* to be updated matches the signing identity.
|
||||
*\li If 'matchtype' is of SELF type, this rule only matches if the
|
||||
* name to be updated matches the signing identity.
|
||||
*
|
||||
*\li If 'ntypes' is 0, this rule applies to all types except
|
||||
* NS, SOA, RRSIG, and NSEC.
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
* PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Id: tkey.h,v 1.21 2005/04/29 00:23:05 marka Exp $ */
|
||||
/* $Id: tkey.h,v 1.22 2006/12/04 01:52:46 marka Exp $ */
|
||||
|
||||
#ifndef DNS_TKEY_H
|
||||
#define DNS_TKEY_H 1
|
||||
@@ -27,6 +27,7 @@
|
||||
#include <dns/types.h>
|
||||
|
||||
#include <dst/dst.h>
|
||||
#include <dst/gssapi.h>
|
||||
|
||||
ISC_LANG_BEGINDECLS
|
||||
|
||||
@@ -40,13 +41,14 @@ ISC_LANG_BEGINDECLS
|
||||
struct dns_tkeyctx {
|
||||
dst_key_t *dhkey;
|
||||
dns_name_t *domain;
|
||||
void *gsscred;
|
||||
gss_cred_id_t gsscred;
|
||||
isc_mem_t *mctx;
|
||||
isc_entropy_t *ectx;
|
||||
};
|
||||
|
||||
isc_result_t
|
||||
dns_tkeyctx_create(isc_mem_t *mctx, isc_entropy_t *ectx, dns_tkeyctx_t **tctxp);
|
||||
dns_tkeyctx_create(isc_mem_t *mctx, isc_entropy_t *ectx,
|
||||
dns_tkeyctx_t **tctxp);
|
||||
/*%<
|
||||
* Create an empty TKEY context.
|
||||
*
|
||||
@@ -119,13 +121,29 @@ dns_tkey_builddhquery(dns_message_t *msg, dst_key_t *key, dns_name_t *name,
|
||||
*/
|
||||
|
||||
isc_result_t
|
||||
dns_tkey_buildgssquery(dns_message_t *msg, dns_name_t *name,
|
||||
dns_name_t *gname, void *cred,
|
||||
isc_uint32_t lifetime, void **context);
|
||||
dns_tkey_buildgssquery(dns_message_t *msg, dns_name_t *name, dns_name_t *gname,
|
||||
isc_buffer_t *intoken, isc_uint32_t lifetime,
|
||||
gss_ctx_id_t *context, isc_boolean_t win2k);
|
||||
/*%<
|
||||
* XXX
|
||||
* Builds a query containing a TKEY that will generate a GSSAPI context.
|
||||
* The key is requested to have the specified lifetime (in seconds).
|
||||
*
|
||||
* Requires:
|
||||
*\li 'msg' is a valid message
|
||||
*\li 'name' is a valid name
|
||||
*\li 'gname' is a valid name
|
||||
*\li 'context' is a pointer to a valid gss_ctx_id_t
|
||||
* (which may have the value GSS_C_NO_CONTEXT)
|
||||
*\li 'win2k' when true says to turn on some hacks to work
|
||||
* with the non-standard GSS-TSIG of Windows 2000
|
||||
*
|
||||
* Returns:
|
||||
*\li ISC_R_SUCCESS msg was successfully updated to include the
|
||||
* query to be sent
|
||||
*\li other an error occurred while building the message
|
||||
*/
|
||||
|
||||
|
||||
isc_result_t
|
||||
dns_tkey_builddeletequery(dns_message_t *msg, dns_tsigkey_t *key);
|
||||
/*%<
|
||||
@@ -167,8 +185,9 @@ dns_tkey_processdhresponse(dns_message_t *qmsg, dns_message_t *rmsg,
|
||||
|
||||
isc_result_t
|
||||
dns_tkey_processgssresponse(dns_message_t *qmsg, dns_message_t *rmsg,
|
||||
dns_name_t *gname, void *cred, void **context,
|
||||
dns_tsigkey_t **outkey, dns_tsig_keyring_t *ring);
|
||||
dns_name_t *gname, gss_ctx_id_t *context,
|
||||
isc_buffer_t *outtoken, dns_tsigkey_t **outkey,
|
||||
dns_tsig_keyring_t *ring);
|
||||
/*%<
|
||||
* XXX
|
||||
*/
|
||||
@@ -193,6 +212,39 @@ dns_tkey_processdeleteresponse(dns_message_t *qmsg, dns_message_t *rmsg,
|
||||
*/
|
||||
|
||||
|
||||
isc_result_t
|
||||
dns_tkey_gssnegotiate(dns_message_t *qmsg, dns_message_t *rmsg,
|
||||
dns_name_t *server, gss_ctx_id_t *context,
|
||||
dns_tsigkey_t **outkey, dns_tsig_keyring_t *ring,
|
||||
isc_boolean_t win2k);
|
||||
|
||||
/*
|
||||
* Client side negotiation of GSS-TSIG. Process the respsonse
|
||||
* to a TKEY, and establish a TSIG key if negotiation was successful.
|
||||
* Build a response to the input TKEY message. Can take multiple
|
||||
* calls to successfully establish the context.
|
||||
*
|
||||
* Requires:
|
||||
* 'qmsg' is a valid message, the original TKEY request;
|
||||
* it will be filled with the new message to send
|
||||
* 'rmsg' is a valid message, the incoming TKEY message
|
||||
* 'server' is the server name
|
||||
* 'context' is the input context handle
|
||||
* 'outkey' receives the established key, if non-NULL;
|
||||
* if non-NULL must point to NULL
|
||||
* 'ring' is the keyring in which to establish the key,
|
||||
* or NULL
|
||||
* 'win2k' when true says to turn on some hacks to work
|
||||
* with the non-standard GSS-TSIG of Windows 2000
|
||||
*
|
||||
* Returns:
|
||||
* ISC_R_SUCCESS context was successfully established
|
||||
* ISC_R_NOTFOUND couldn't find a needed part of the query
|
||||
* or response
|
||||
* DNS_R_CONTINUE additional context negotiation is required;
|
||||
* send the new qmsg to the server
|
||||
*/
|
||||
|
||||
ISC_LANG_ENDDECLS
|
||||
|
||||
#endif /* DNS_TKEY_H */
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
* PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Id: tsig.h,v 1.47 2006/01/27 23:57:46 marka Exp $ */
|
||||
/* $Id: tsig.h,v 1.48 2006/12/04 01:52:46 marka Exp $ */
|
||||
|
||||
#ifndef DNS_TSIG_H
|
||||
#define DNS_TSIG_H 1
|
||||
@@ -59,6 +59,7 @@ LIBDNS_EXTERNAL_DATA extern dns_name_t *dns_tsig_hmacsha512_name;
|
||||
|
||||
struct dns_tsig_keyring {
|
||||
dns_rbt_t *keys;
|
||||
unsigned int writecount;
|
||||
isc_rwlock_t lock;
|
||||
isc_mem_t *mctx;
|
||||
};
|
||||
@@ -79,7 +80,9 @@ struct dns_tsigkey {
|
||||
};
|
||||
|
||||
#define dns_tsigkey_identity(tsigkey) \
|
||||
((tsigkey)->generated ? ((tsigkey)->creator) : (&((tsigkey)->name)))
|
||||
((tsigkey) == NULL ? NULL : \
|
||||
(tsigkey)->generated ? ((tsigkey)->creator) : \
|
||||
(&((tsigkey)->name)))
|
||||
|
||||
ISC_LANG_BEGINDECLS
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
* PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Id: types.h,v 1.121 2006/05/02 13:04:54 shane Exp $ */
|
||||
/* $Id: types.h,v 1.122 2006/12/04 01:52:46 marka Exp $ */
|
||||
|
||||
#ifndef DNS_TYPES_H
|
||||
#define DNS_TYPES_H 1
|
||||
@@ -118,6 +118,15 @@ typedef ISC_LIST(dns_zone_t) dns_zonelist_t;
|
||||
typedef struct dns_zonemgr dns_zonemgr_t;
|
||||
typedef struct dns_zt dns_zt_t;
|
||||
|
||||
/*
|
||||
* If we are not using GSSAPI, define the types we use as opaque types here.
|
||||
*/
|
||||
#ifndef GSSAPI
|
||||
typedef struct not_defined_gss_cred_id *gss_cred_id_t;
|
||||
typedef struct not_defined_gss_ctx *gss_ctx_id_t;
|
||||
#endif
|
||||
typedef struct dst_gssapi_signverifyctx dst_gssapi_signverifyctx_t;
|
||||
|
||||
typedef enum {
|
||||
dns_fwdpolicy_none = 0,
|
||||
dns_fwdpolicy_first = 1,
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
* PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Id: dst.h,v 1.5 2006/01/27 23:57:46 marka Exp $ */
|
||||
/* $Id: dst.h,v 1.6 2006/12/04 01:52:46 marka Exp $ */
|
||||
|
||||
#ifndef DST_DST_H
|
||||
#define DST_DST_H 1
|
||||
@@ -26,6 +26,8 @@
|
||||
|
||||
#include <dns/types.h>
|
||||
|
||||
#include <dst/gssapi.h>
|
||||
|
||||
ISC_LANG_BEGINDECLS
|
||||
|
||||
/***
|
||||
@@ -398,16 +400,28 @@ dst_key_privatefrombuffer(dst_key_t *key, isc_buffer_t *buffer);
|
||||
*\li If successful, key will contain a valid private key.
|
||||
*/
|
||||
|
||||
gss_ctx_id_t
|
||||
dst_key_getgssctx(const dst_key_t *key);
|
||||
/*%<
|
||||
* Returns the opaque key data.
|
||||
* Be cautions when using this value unless you know what you are doing.
|
||||
*
|
||||
* Requires:
|
||||
*\li "key" is not NULL.
|
||||
*
|
||||
* Returns:
|
||||
*\li gssctx key data, possibly NULL.
|
||||
*/
|
||||
|
||||
isc_result_t
|
||||
dst_key_fromgssapi(dns_name_t *name, void *opaque, isc_mem_t *mctx,
|
||||
dst_key_t **keyp);
|
||||
dst_key_fromgssapi(dns_name_t *name, gss_ctx_id_t gssctx, isc_mem_t *mctx,
|
||||
dst_key_t **keyp);
|
||||
/*%<
|
||||
* Converts a GSSAPI opaque context id into a DST key.
|
||||
*
|
||||
* Requires:
|
||||
*\li "name" is a valid absolute dns name.
|
||||
*\li "opaque" is a GSSAPI context id.
|
||||
*\li "gssctx" is a GSSAPI context id.
|
||||
*\li "mctx" is a valid memory context.
|
||||
*\li "keyp" is not NULL and "*keyp" is NULL.
|
||||
*
|
||||
|
||||
@@ -15,16 +15,32 @@
|
||||
* PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Id: gssapi.h,v 1.3 2005/04/29 00:23:06 marka Exp $ */
|
||||
/* $Id: gssapi.h,v 1.4 2006/12/04 01:52:46 marka Exp $ */
|
||||
|
||||
#ifndef DST_GSSAPI_H
|
||||
#define DST_GSSAPI_H 1
|
||||
|
||||
/*! \file */
|
||||
|
||||
#include <isc/formatcheck.h>
|
||||
#include <isc/lang.h>
|
||||
|
||||
#include <isc/platform.h>
|
||||
#include <isc/types.h>
|
||||
#include <dns/types.h>
|
||||
|
||||
#ifdef GSSAPI
|
||||
#ifdef _WINDOWS
|
||||
/*
|
||||
* MSVC does not like macros in #include lines.
|
||||
*/
|
||||
#include <gssapi/gssapi.h>
|
||||
#else
|
||||
#include ISC_PLATFORM_GSSAPIHEADER
|
||||
#endif
|
||||
#ifndef GSS_SPNEGO_MECHANISM
|
||||
#define GSS_SPNEGO_MECHANISM ((void*)0)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
ISC_LANG_BEGINDECLS
|
||||
|
||||
@@ -37,20 +53,149 @@ ISC_LANG_BEGINDECLS
|
||||
***/
|
||||
|
||||
isc_result_t
|
||||
dst_gssapi_acquirecred(dns_name_t *name, isc_boolean_t initiate, void **cred);
|
||||
|
||||
isc_result_t
|
||||
dst_gssapi_initctx(dns_name_t *name, void *cred,
|
||||
isc_region_t *intoken, isc_buffer_t *outtoken,
|
||||
void **context);
|
||||
|
||||
isc_result_t
|
||||
dst_gssapi_acceptctx(dns_name_t *name, void *cred,
|
||||
isc_region_t *intoken, isc_buffer_t *outtoken,
|
||||
void **context);
|
||||
|
||||
dst_gssapi_acquirecred(dns_name_t *name, isc_boolean_t initiate,
|
||||
gss_cred_id_t *cred);
|
||||
/*
|
||||
* XXX
|
||||
* Acquires GSS credentials.
|
||||
*
|
||||
* Requires:
|
||||
* 'name' is a valid name, preferably one known by the GSS provider
|
||||
* 'initiate' indicates whether the credentials are for initiating or
|
||||
* accepting contexts
|
||||
* 'cred' is a pointer to NULL, which will be allocated with the
|
||||
* credential handle. Call dst_gssapi_releasecred to free
|
||||
* the memory.
|
||||
*
|
||||
* Returns:
|
||||
* ISC_R_SUCCESS msg was successfully updated to include the
|
||||
* query to be sent
|
||||
* other an error occurred while building the message
|
||||
*/
|
||||
|
||||
isc_result_t
|
||||
dst_gssapi_releasecred(gss_cred_id_t *cred);
|
||||
/*
|
||||
* Releases GSS credentials. Calling this function does release the
|
||||
* memory allocated for the credential in dst_gssapi_acquirecred()
|
||||
*
|
||||
* Requires:
|
||||
* 'mctx' is a valid memory context
|
||||
* 'cred' is a pointer to the credential to be released
|
||||
*
|
||||
* Returns:
|
||||
* ISC_R_SUCCESS credential was released successfully
|
||||
* other an error occurred while releaseing
|
||||
* the credential
|
||||
*/
|
||||
|
||||
isc_result_t
|
||||
dst_gssapi_initctx(dns_name_t *name, isc_buffer_t *intoken,
|
||||
isc_buffer_t *outtoken, gss_ctx_id_t *gssctx);
|
||||
/*
|
||||
* Initiates a GSS context.
|
||||
*
|
||||
* Requires:
|
||||
* 'name' is a valid name, preferably one known by the GSS
|
||||
* provider
|
||||
* 'intoken' is a token received from the acceptor, or NULL if
|
||||
* there isn't one
|
||||
* 'outtoken' is a buffer to receive the token generated by
|
||||
* gss_init_sec_context() to be sent to the acceptor
|
||||
* 'context' is a pointer to a valid gss_ctx_id_t
|
||||
* (which may have the value GSS_C_NO_CONTEXT)
|
||||
*
|
||||
* Returns:
|
||||
* ISC_R_SUCCESS msg was successfully updated to include the
|
||||
* query to be sent
|
||||
* other an error occurred while building the message
|
||||
*/
|
||||
|
||||
isc_result_t
|
||||
dst_gssapi_acceptctx(gss_cred_id_t cred,
|
||||
isc_region_t *intoken, isc_buffer_t *outtoken,
|
||||
gss_ctx_id_t *context, dns_name_t *principal,
|
||||
isc_mem_t *mctx);
|
||||
/*
|
||||
* Accepts a GSS context.
|
||||
*
|
||||
* Requires:
|
||||
* 'mctx' is a valid memory context
|
||||
* 'cred' is the acceptor's valid GSS credential handle
|
||||
* 'intoken' is a token received from the initiator
|
||||
* 'outtoken' is a buffer to receive the token generated by
|
||||
* gss_accept_sec_context() to be sent to the initiator
|
||||
* 'context' is a valid pointer to receive the generated context handle.
|
||||
* On the initial call, it should be a pointer to NULL, which
|
||||
* will be allocated as a gss_ctx_id_t. Subsequent calls
|
||||
* should pass in the handle generated on the first call.
|
||||
* Call dst_gssapi_releasecred to delete the context and free
|
||||
* the memory.
|
||||
*
|
||||
* Returns:
|
||||
* ISC_R_SUCCESS msg was successfully updated to include the
|
||||
* query to be sent
|
||||
* other an error occurred while building the message
|
||||
*/
|
||||
|
||||
isc_result_t
|
||||
dst_gssapi_deletectx(isc_mem_t *mctx, gss_ctx_id_t *gssctx);
|
||||
/*
|
||||
* Destroys a GSS context. This function deletes the context from the GSS
|
||||
* provider and then frees the memory used by the context pointer.
|
||||
*
|
||||
* Requires:
|
||||
* 'mctx' is a valid memory context
|
||||
* 'context' is a valid GSS context
|
||||
*
|
||||
* Returns:
|
||||
* ISC_R_SUCCESS
|
||||
*/
|
||||
|
||||
|
||||
void
|
||||
gss_log(int level, const char *fmt, ...)
|
||||
ISC_FORMAT_PRINTF(2, 3);
|
||||
/*
|
||||
* Loging function for GSS.
|
||||
*
|
||||
* Requires
|
||||
* 'level' is the log level to be used, as an integer
|
||||
* 'fmt' is a printf format specifier
|
||||
*/
|
||||
|
||||
char *
|
||||
gss_error_tostring(isc_uint32_t major, isc_uint32_t minor,
|
||||
char *buf, size_t buflen);
|
||||
/*
|
||||
* Render a GSS major status/minor status pair into a string
|
||||
*
|
||||
* Requires:
|
||||
* 'major' is a GSS major status code
|
||||
* 'minor' is a GSS minor status code
|
||||
*
|
||||
* Returns:
|
||||
* A string containing the text representation of the error codes.
|
||||
* Users should copy the string if they wish to keep it.
|
||||
*/
|
||||
|
||||
isc_boolean_t
|
||||
dst_gssapi_identitymatchesrealmkrb5(dns_name_t *signer, dns_name_t *name,
|
||||
dns_name_t *realm);
|
||||
/*
|
||||
* Compare a "signer" (in the format of a Kerberos-format Kerberos5
|
||||
* printipal: host/example.com@EXAMPLE.COM) to the realm name stored
|
||||
* in "name" (which represents the realm name).
|
||||
*
|
||||
*/
|
||||
|
||||
isc_boolean_t
|
||||
dst_gssapi_identitymatchesrealmms(dns_name_t *signer, dns_name_t *name,
|
||||
dns_name_t *realm);
|
||||
/*
|
||||
* Compare a "signer" (in the format of a Kerberos-format Kerberos5
|
||||
* printipal: host/example.com@EXAMPLE.COM) to the realm name stored
|
||||
* in "name" (which represents the realm name).
|
||||
*
|
||||
*/
|
||||
|
||||
ISC_LANG_ENDDECLS
|
||||
|
||||
Reference in New Issue
Block a user