⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dst_api.c

📁 bind 9.3结合mysql数据库
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * Portions Copyright (C) 2004  Internet Systems Consortium, Inc. ("ISC") * Portions Copyright (C) 1999-2003  Internet Software Consortium. * Portions Copyright (C) 1995-2000 by Network Associates, Inc. * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC AND NETWORK ASSOCIATES DISCLAIMS * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE * FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. *//* * Principal Author: Brian Wellington * $Id: dst_api.c,v 1.88.2.3.2.15 2004/06/16 01:05:01 marka Exp $ */#include <config.h>#include <stdlib.h>#include <isc/buffer.h>#include <isc/dir.h>#include <isc/entropy.h>#include <isc/fsaccess.h>#include <isc/lex.h>#include <isc/mem.h>#include <isc/once.h>#include <isc/print.h>#include <isc/random.h>#include <isc/string.h>#include <isc/time.h>#include <isc/util.h>#include <dns/fixedname.h>#include <dns/keyvalues.h>#include <dns/name.h>#include <dns/rdata.h>#include <dns/rdataclass.h>#include <dns/ttl.h>#include <dns/types.h>#include <dst/result.h>#include "dst_internal.h"#define DST_AS_STR(t) ((t).value.as_textregion.base)static dst_func_t *dst_t_func[DST_MAX_ALGS];static isc_entropy_t *dst_entropy_pool = NULL;static unsigned int dst_entropy_flags = 0;static isc_boolean_t dst_initialized = ISC_FALSE;isc_mem_t *dst__memory_pool = NULL;/* * Static functions. */static dst_key_t *	get_key_struct(dns_name_t *name,				       unsigned int alg,				       unsigned int flags,				       unsigned int protocol,				       unsigned int bits,				       dns_rdataclass_t rdclass,				       isc_mem_t *mctx);static isc_result_t	read_public_key(const char *filename,					int type,					isc_mem_t *mctx,					dst_key_t **keyp);static isc_result_t	write_public_key(const dst_key_t *key, int type,					 const char *directory);static isc_result_t	buildfilename(dns_name_t *name,				      dns_keytag_t id,				      unsigned int alg,				      unsigned int type,				      const char *directory,				      isc_buffer_t *out);static isc_result_t	computeid(dst_key_t *key);static isc_result_t	frombuffer(dns_name_t *name,				   unsigned int alg,				   unsigned int flags,				   unsigned int protocol,				   dns_rdataclass_t rdclass,				   isc_buffer_t *source,				   isc_mem_t *mctx,				   dst_key_t **keyp);static isc_result_t	algorithm_status(unsigned int alg);static isc_result_t	addsuffix(char *filename, unsigned int len,				  const char *ofilename, const char *suffix);#define RETERR(x) 				\	do {					\		result = (x);			\		if (result != ISC_R_SUCCESS)	\			goto out;		\	} while (0)#define CHECKALG(alg)				\	do {					\		isc_result_t _r;		\		_r = algorithm_status(alg);	\		if (_r != ISC_R_SUCCESS)	\			return (_r);		\	} while (0);				\isc_result_tdst_lib_init(isc_mem_t *mctx, isc_entropy_t *ectx, unsigned int eflags) {	isc_result_t result;	REQUIRE(mctx != NULL && ectx != NULL);	REQUIRE(dst_initialized == ISC_FALSE);	dst__memory_pool = NULL;#ifdef OPENSSL	UNUSED(mctx);	/*	 * When using --with-openssl, there seems to be no good way of not	 * leaking memory due to the openssl error handling mechanism.	 * Avoid assertions by using a local memory context and not checking	 * for leaks on exit.	 */	result = isc_mem_create(0, 0, &dst__memory_pool);	if (result != ISC_R_SUCCESS)		return (result);	isc_mem_setdestroycheck(dst__memory_pool, ISC_FALSE);#else	isc_mem_attach(mctx, &dst__memory_pool);#endif	isc_entropy_attach(ectx, &dst_entropy_pool);	dst_entropy_flags = eflags;	dst_result_register();	memset(dst_t_func, 0, sizeof(dst_t_func));	RETERR(dst__hmacmd5_init(&dst_t_func[DST_ALG_HMACMD5]));#ifdef OPENSSL	RETERR(dst__openssl_init());	RETERR(dst__opensslrsa_init(&dst_t_func[DST_ALG_RSAMD5]));	RETERR(dst__opensslrsa_init(&dst_t_func[DST_ALG_RSASHA1]));#ifdef HAVE_OPENSSL_DSA	RETERR(dst__openssldsa_init(&dst_t_func[DST_ALG_DSA]));#endif	RETERR(dst__openssldh_init(&dst_t_func[DST_ALG_DH]));#endif /* OPENSSL */#ifdef GSSAPI	RETERR(dst__gssapi_init(&dst_t_func[DST_ALG_GSSAPI]));#endif	dst_initialized = ISC_TRUE;	return (ISC_R_SUCCESS); out:	dst_lib_destroy();	return (result);}voiddst_lib_destroy(void) {	int i;	RUNTIME_CHECK(dst_initialized == ISC_TRUE);	dst_initialized = ISC_FALSE;	for (i = 0; i < DST_MAX_ALGS; i++)		if (dst_t_func[i] != NULL && dst_t_func[i]->cleanup != NULL)			dst_t_func[i]->cleanup();#ifdef OPENSSL	dst__openssl_destroy();#endif	if (dst__memory_pool != NULL)		isc_mem_detach(&dst__memory_pool);	if (dst_entropy_pool != NULL)		isc_entropy_detach(&dst_entropy_pool);}isc_boolean_tdst_algorithm_supported(unsigned int alg) {	REQUIRE(dst_initialized == ISC_TRUE);	if (alg >= DST_MAX_ALGS || dst_t_func[alg] == NULL)		return (ISC_FALSE);	return (ISC_TRUE);}isc_result_tdst_context_create(dst_key_t *key, isc_mem_t *mctx, dst_context_t **dctxp) {	dst_context_t *dctx;	isc_result_t result;	REQUIRE(dst_initialized == ISC_TRUE);	REQUIRE(VALID_KEY(key));	REQUIRE(mctx != NULL);	REQUIRE(dctxp != NULL && *dctxp == NULL);	if (key->func->createctx == NULL)		return (DST_R_UNSUPPORTEDALG);	if (key->opaque == NULL)		return (DST_R_NULLKEY);	dctx = isc_mem_get(mctx, sizeof(dst_context_t));	if (dctx == NULL)		return (ISC_R_NOMEMORY);	dctx->key = key;	dctx->mctx = mctx;	result = key->func->createctx(key, dctx);	if (result != ISC_R_SUCCESS) {		isc_mem_put(mctx, dctx, sizeof(dst_context_t));		return (result);	}	dctx->magic = CTX_MAGIC;	*dctxp = dctx;	return (ISC_R_SUCCESS);}voiddst_context_destroy(dst_context_t **dctxp) {	dst_context_t *dctx;	REQUIRE(dctxp != NULL && VALID_CTX(*dctxp));	dctx = *dctxp;	INSIST(dctx->key->func->destroyctx != NULL);	dctx->key->func->destroyctx(dctx);	dctx->magic = 0;	isc_mem_put(dctx->mctx, dctx, sizeof(dst_context_t));	*dctxp = NULL;}isc_result_tdst_context_adddata(dst_context_t *dctx, const isc_region_t *data) {	REQUIRE(VALID_CTX(dctx));	REQUIRE(data != NULL);	INSIST(dctx->key->func->adddata != NULL);	return (dctx->key->func->adddata(dctx, data));}isc_result_tdst_context_sign(dst_context_t *dctx, isc_buffer_t *sig) {	dst_key_t *key;	REQUIRE(VALID_CTX(dctx));	REQUIRE(sig != NULL);	key = dctx->key;	CHECKALG(key->key_alg);	if (key->opaque == NULL)		return (DST_R_NULLKEY);	if (key->func->sign == NULL)		return (DST_R_NOTPRIVATEKEY);	if (key->func->isprivate == NULL ||	    key->func->isprivate(key) == ISC_FALSE)		return (DST_R_NOTPRIVATEKEY);	return (key->func->sign(dctx, sig));}isc_result_tdst_context_verify(dst_context_t *dctx, isc_region_t *sig) {	REQUIRE(VALID_CTX(dctx));	REQUIRE(sig != NULL);	CHECKALG(dctx->key->key_alg);	if (dctx->key->opaque == NULL)		return (DST_R_NULLKEY);	if (dctx->key->func->verify == NULL)		return (DST_R_NOTPUBLICKEY);	return (dctx->key->func->verify(dctx, sig));}isc_result_tdst_key_computesecret(const dst_key_t *pub, const dst_key_t *priv,		      isc_buffer_t *secret){	REQUIRE(dst_initialized == ISC_TRUE);	REQUIRE(VALID_KEY(pub) && VALID_KEY(priv));	REQUIRE(secret != NULL);	CHECKALG(pub->key_alg);	CHECKALG(priv->key_alg);	if (pub->opaque == NULL || priv->opaque == NULL)		return (DST_R_NULLKEY);	if (pub->key_alg != priv->key_alg ||	    pub->func->computesecret == NULL ||	    priv->func->computesecret == NULL)		return (DST_R_KEYCANNOTCOMPUTESECRET);	if (dst_key_isprivate(priv) == ISC_FALSE)		return (DST_R_NOTPRIVATEKEY);	return (pub->func->computesecret(pub, priv, secret));}isc_result_tdst_key_tofile(const dst_key_t *key, int type, const char *directory) {	isc_result_t ret = ISC_R_SUCCESS;	REQUIRE(dst_initialized == ISC_TRUE);	REQUIRE(VALID_KEY(key));	REQUIRE((type & (DST_TYPE_PRIVATE | DST_TYPE_PUBLIC)) != 0);	CHECKALG(key->key_alg);	if (key->func->tofile == NULL)		return (DST_R_UNSUPPORTEDALG);	if (type & DST_TYPE_PUBLIC) {		ret = write_public_key(key, type, directory);		if (ret != ISC_R_SUCCESS)			return (ret);	}	if ((type & DST_TYPE_PRIVATE) &&	    (key->key_flags & DNS_KEYFLAG_TYPEMASK) != DNS_KEYTYPE_NOKEY)		return (key->func->tofile(key, directory));	else		return (ISC_R_SUCCESS);}isc_result_tdst_key_fromfile(dns_name_t *name, dns_keytag_t id,		 unsigned int alg, int type, const char *directory,		 isc_mem_t *mctx, dst_key_t **keyp){	char filename[ISC_DIR_NAMEMAX];	isc_buffer_t b;	dst_key_t *key;	isc_result_t result;	REQUIRE(dst_initialized == ISC_TRUE);	REQUIRE(dns_name_isabsolute(name));	REQUIRE((type & (DST_TYPE_PRIVATE | DST_TYPE_PUBLIC)) != 0);	REQUIRE(mctx != NULL);	REQUIRE(keyp != NULL && *keyp == NULL);	CHECKALG(alg);	isc_buffer_init(&b, filename, sizeof(filename));	result = buildfilename(name, id, alg, type, directory, &b);	if (result != ISC_R_SUCCESS)		return (result);	key = NULL;	result = dst_key_fromnamedfile(filename, type, mctx, &key);	if (result != ISC_R_SUCCESS)		return (result);	result = computeid(key);	if (result != ISC_R_SUCCESS) {		dst_key_free(&key);		return (result);	}	if (!dns_name_equal(name, key->key_name) ||	    id != key->key_id ||	    alg != key->key_alg)	{		dst_key_free(&key);		return (DST_R_INVALIDPRIVATEKEY);	}	key->key_id = id;	*keyp = key;	return (ISC_R_SUCCESS);}isc_result_tdst_key_fromnamedfile(const char *filename, int type, isc_mem_t *mctx,		      dst_key_t **keyp){	isc_result_t result;	dst_key_t *pubkey = NULL, *key = NULL;	dns_keytag_t id;	char *newfilename = NULL;	int newfilenamelen = 0;	isc_lex_t *lex = NULL;	REQUIRE(dst_initialized == ISC_TRUE);	REQUIRE(filename != NULL);	REQUIRE((type & (DST_TYPE_PRIVATE | DST_TYPE_PUBLIC)) != 0);	REQUIRE(mctx != NULL);	REQUIRE(keyp != NULL && *keyp == NULL);	result = read_public_key(filename, type, mctx, &pubkey);	if (result != ISC_R_SUCCESS)		return (result);	if (type == DST_TYPE_PUBLIC ||	    (pubkey->key_flags & DNS_KEYFLAG_TYPEMASK) == DNS_KEYTYPE_NOKEY)	{		result = computeid(pubkey);		if (result != ISC_R_SUCCESS) {			dst_key_free(&pubkey);			return (result);		}		*keyp = pubkey;		return (ISC_R_SUCCESS);	}	result = algorithm_status(pubkey->key_alg);	if (result != ISC_R_SUCCESS) {		dst_key_free(&pubkey);		return (result);	}	key = get_key_struct(pubkey->key_name, pubkey->key_alg,			     pubkey->key_flags, pubkey->key_proto, 0,			     pubkey->key_class, mctx);	id = pubkey->key_id;	dst_key_free(&pubkey);	if (key == NULL)		return (ISC_R_NOMEMORY);	if (key->func->parse == NULL)		RETERR(DST_R_UNSUPPORTEDALG);	newfilenamelen = strlen(filename) + 9;	newfilename = isc_mem_get(mctx, newfilenamelen);	if (newfilename == NULL)		RETERR(ISC_R_NOMEMORY);	result = addsuffix(newfilename, newfilenamelen, filename, ".private");	INSIST(result == ISC_R_SUCCESS);	RETERR(isc_lex_create(mctx, 1500, &lex));	RETERR(isc_lex_openfile(lex, newfilename));	isc_mem_put(mctx, newfilename, newfilenamelen);	RETERR(key->func->parse(key, lex));	isc_lex_destroy(&lex);	RETERR(computeid(key));	if (id != key->key_id)		RETERR(DST_R_INVALIDPRIVATEKEY);	*keyp = key;	return (ISC_R_SUCCESS); out:	if (newfilename != NULL)		isc_mem_put(mctx, newfilename, newfilenamelen);	if (lex != NULL)		isc_lex_destroy(&lex);	dst_key_free(&key);	return (result);}isc_result_tdst_key_todns(const dst_key_t *key, isc_buffer_t *target) {	REQUIRE(dst_initialized == ISC_TRUE);	REQUIRE(VALID_KEY(key));	REQUIRE(target != NULL);	CHECKALG(key->key_alg);	if (key->func->todns == NULL)		return (DST_R_UNSUPPORTEDALG);	if (isc_buffer_availablelength(target) < 4)		return (ISC_R_NOSPACE);	isc_buffer_putuint16(target, (isc_uint16_t)(key->key_flags & 0xffff));	isc_buffer_putuint8(target, (isc_uint8_t)key->key_proto);	isc_buffer_putuint8(target, (isc_uint8_t)key->key_alg);	if (key->key_flags & DNS_KEYFLAG_EXTENDED) {		if (isc_buffer_availablelength(target) < 2)			return (ISC_R_NOSPACE);		isc_buffer_putuint16(target,				     (isc_uint16_t)((key->key_flags >> 16)						    & 0xffff));	}	if (key->opaque == NULL) /* NULL KEY */		return (ISC_R_SUCCESS);	return (key->func->todns(key, target));}isc_result_tdst_key_fromdns(dns_name_t *name, dns_rdataclass_t rdclass,		isc_buffer_t *source, isc_mem_t *mctx, dst_key_t **keyp){	isc_uint8_t alg, proto;	isc_uint32_t flags, extflags;	dst_key_t *key = NULL;	dns_keytag_t id;	isc_region_t r;	isc_result_t result;	REQUIRE(dst_initialized);	isc_buffer_remainingregion(source, &r);	if (isc_buffer_remaininglength(source) < 4)		return (DST_R_INVALIDPUBLICKEY);	flags = isc_buffer_getuint16(source);	proto = isc_buffer_getuint8(source);	alg = isc_buffer_getuint8(source);	id = dst_region_computeid(&r, alg);	if (flags & DNS_KEYFLAG_EXTENDED) {		if (isc_buffer_remaininglength(source) < 2)			return (DST_R_INVALIDPUBLICKEY);		extflags = isc_buffer_getuint16(source);		flags |= (extflags << 16);	}	result = frombuffer(name, alg, flags, proto, rdclass, source,			    mctx, &key);	if (result != ISC_R_SUCCESS)		return (result);	key->key_id = id;	*keyp = key;	return (ISC_R_SUCCESS);}isc_result_tdst_key_frombuffer(dns_name_t *name, unsigned int alg,		   unsigned int flags, unsigned int protocol,		   dns_rdataclass_t rdclass,		   isc_buffer_t *source, isc_mem_t *mctx, dst_key_t **keyp){	dst_key_t *key = NULL;	isc_result_t result;	REQUIRE(dst_initialized);	result = frombuffer(name, alg, flags, protocol, rdclass, source,			    mctx, &key);	if (result != ISC_R_SUCCESS)		return (result);	result = computeid(key);	if (result != ISC_R_SUCCESS) {		dst_key_free(&key);		return (result);	}	*keyp = key;	return (ISC_R_SUCCESS);}isc_result_tdst_key_tobuffer(const dst_key_t *key, isc_buffer_t *target) {	REQUIRE(dst_initialized == ISC_TRUE);	REQUIRE(VALID_KEY(key));	REQUIRE(target != NULL);	CHECKALG(key->key_alg);	if (key->func->todns == NULL)		return (DST_R_UNSUPPORTEDALG);	return (key->func->todns(key, target));}isc_result_tdst_key_privatefrombuffer(dst_key_t *key, isc_buffer_t *buffer) {	isc_lex_t *lex = NULL;	isc_result_t result = ISC_R_SUCCESS;	REQUIRE(dst_initialized == ISC_TRUE);	REQUIRE(VALID_KEY(key));	REQUIRE(!dst_key_isprivate(key));	REQUIRE(buffer != NULL);	if (key->func->parse == NULL)		RETERR(DST_R_UNSUPPORTEDALG);	RETERR(isc_lex_create(key->mctx, 1500, &lex));	RETERR(isc_lex_openbuffer(lex, buffer));	RETERR(key->func->parse(key, lex)); out:	if (lex != NULL)		isc_lex_destroy(&lex);	return (result);}isc_result_t

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -