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

📄 tsig.c

📁 bind 9.3结合mysql数据库
💻 C
📖 第 1 页 / 共 3 页
字号:
		 */		dns_name_toregion(&tsigkey->name, &r);		ret = dst_context_adddata(ctx, &r);		if (ret != ISC_R_SUCCESS)			goto cleanup_context;		isc_buffer_init(&databuf, data, sizeof(data));		isc_buffer_putuint16(&databuf, tsig.common.rdclass);		isc_buffer_putuint32(&databuf, msg->tsig->ttl);		isc_buffer_usedregion(&databuf, &r);		ret = dst_context_adddata(ctx, &r);		if (ret != ISC_R_SUCCESS)			goto cleanup_context;		/*		 * Digest the key algorithm.		 */		dns_name_toregion(tsigkey->algorithm, &r);		ret = dst_context_adddata(ctx, &r);		if (ret != ISC_R_SUCCESS)			goto cleanup_context;		isc_buffer_clear(&databuf);		buffer_putuint48(&databuf, tsig.timesigned);		isc_buffer_putuint16(&databuf, tsig.fudge);		isc_buffer_putuint16(&databuf, tsig.error);		isc_buffer_putuint16(&databuf, tsig.otherlen);		isc_buffer_usedregion(&databuf, &r);		ret = dst_context_adddata(ctx, &r);		if (ret != ISC_R_SUCCESS)			goto cleanup_context;		if (tsig.otherlen > 0) {			r.base = tsig.other;			r.length = tsig.otherlen;			ret = dst_context_adddata(ctx, &r);			if (ret != ISC_R_SUCCESS)				goto cleanup_context;		}		ret = dst_context_verify(ctx, &sig_r);		if (ret == DST_R_VERIFYFAILURE) {			msg->tsigstatus = dns_tsigerror_badsig;			ret = DNS_R_TSIGVERIFYFAILURE;			tsig_log(msg->tsigkey, 2,				 "signature failed to verify");			goto cleanup_context;		} else if (ret != ISC_R_SUCCESS)			goto cleanup_context;		dst_context_destroy(&ctx);	} else if (tsig.error != dns_tsigerror_badsig &&		   tsig.error != dns_tsigerror_badkey)	{		msg->tsigstatus = dns_tsigerror_badsig;		tsig_log(msg->tsigkey, 2, "signature was empty");		return (DNS_R_TSIGVERIFYFAILURE);	}	msg->tsigstatus = dns_rcode_noerror;	if (tsig.error != dns_rcode_noerror) {		if (tsig.error == dns_tsigerror_badtime)			return (DNS_R_CLOCKSKEW);		else			return (DNS_R_TSIGERRORSET);	}	msg->verified_sig = 1;	return (ISC_R_SUCCESS);cleanup_context:	if (ctx != NULL)		dst_context_destroy(&ctx);	return (ret);}static isc_result_ttsig_verify_tcp(isc_buffer_t *source, dns_message_t *msg) {	dns_rdata_any_tsig_t tsig, querytsig;	isc_region_t r, source_r, header_r, sig_r;	isc_buffer_t databuf;	unsigned char data[32];	dns_name_t *keyname;	dns_rdata_t rdata = DNS_RDATA_INIT;	isc_stdtime_t now;	isc_result_t ret;	dns_tsigkey_t *tsigkey;	dst_key_t *key = NULL;	unsigned char header[DNS_MESSAGE_HEADERLEN];	isc_uint16_t addcount, id;	isc_boolean_t has_tsig = ISC_FALSE;	isc_mem_t *mctx;	REQUIRE(source != NULL);	REQUIRE(msg != NULL);	REQUIRE(dns_message_gettsigkey(msg) != NULL);	REQUIRE(msg->tcp_continuation == 1);	REQUIRE(msg->querytsig != NULL);	if (!is_response(msg))		return (DNS_R_EXPECTEDRESPONSE);	mctx = msg->mctx;	tsigkey = dns_message_gettsigkey(msg);	/*	 * Extract and parse the previous TSIG	 */	ret = dns_rdataset_first(msg->querytsig);	if (ret != ISC_R_SUCCESS)		return (ret);	dns_rdataset_current(msg->querytsig, &rdata);	ret = dns_rdata_tostruct(&rdata, &querytsig, NULL);	if (ret != ISC_R_SUCCESS)		return (ret);	dns_rdata_reset(&rdata);	/*	 * If there is a TSIG in this message, do some checks.	 */	if (msg->tsig != NULL) {		has_tsig = ISC_TRUE;		keyname = msg->tsigname;		ret = dns_rdataset_first(msg->tsig);		if (ret != ISC_R_SUCCESS)			goto cleanup_querystruct;		dns_rdataset_current(msg->tsig, &rdata);		ret = dns_rdata_tostruct(&rdata, &tsig, NULL);		if (ret != ISC_R_SUCCESS)			goto cleanup_querystruct;		/*		 * Do the key name and algorithm match that of the query?		 */		if (!dns_name_equal(keyname, &tsigkey->name) ||		    !dns_name_equal(&tsig.algorithm, &querytsig.algorithm))		{			msg->tsigstatus = dns_tsigerror_badkey;			ret = DNS_R_TSIGVERIFYFAILURE;			tsig_log(msg->tsigkey, 2,				 "key name and algorithm do not match");			goto cleanup_querystruct;		}		/*		 * Is the time ok?		 */		isc_stdtime_get(&now);		if (now + msg->timeadjust > tsig.timesigned + tsig.fudge) {			msg->tsigstatus = dns_tsigerror_badtime;			tsig_log(msg->tsigkey, 2, "signature has expired");			ret = DNS_R_CLOCKSKEW;			goto cleanup_querystruct;		} else if (now + msg->timeadjust <			   tsig.timesigned - tsig.fudge)		{			msg->tsigstatus = dns_tsigerror_badtime;			tsig_log(msg->tsigkey, 2,				 "signature is in the future");			ret = DNS_R_CLOCKSKEW;			goto cleanup_querystruct;		}	}	key = tsigkey->key;	if (msg->tsigctx == NULL) {		ret = dst_context_create(key, mctx, &msg->tsigctx);		if (ret != ISC_R_SUCCESS)			goto cleanup_querystruct;		/*		 * Digest the length of the query signature		 */		isc_buffer_init(&databuf, data, sizeof(data));		isc_buffer_putuint16(&databuf, querytsig.siglen);		isc_buffer_usedregion(&databuf, &r);		ret = dst_context_adddata(msg->tsigctx, &r);		if (ret != ISC_R_SUCCESS)			goto cleanup_context;		/*		 * Digest the data of the query signature		 */		if (querytsig.siglen > 0) {			r.length = querytsig.siglen;			r.base = querytsig.signature;			ret = dst_context_adddata(msg->tsigctx, &r);			if (ret != ISC_R_SUCCESS)				goto cleanup_context;		}	}	/*	 * Extract the header.	 */	isc_buffer_usedregion(source, &r);	memcpy(header, r.base, DNS_MESSAGE_HEADERLEN);	isc_region_consume(&r, DNS_MESSAGE_HEADERLEN);	/*	 * Decrement the additional field counter if necessary.	 */	if (has_tsig) {		memcpy(&addcount, &header[DNS_MESSAGE_HEADERLEN - 2], 2);		addcount = htons((isc_uint16_t)(ntohs(addcount) - 1));		memcpy(&header[DNS_MESSAGE_HEADERLEN - 2], &addcount, 2);	}	/*	 * Put in the original id.	 */	/* XXX Can TCP transfers be forwarded?  How would that work? */	if (has_tsig) {		id = htons(tsig.originalid);		memcpy(&header[0], &id, 2);	}	/*	 * Digest the modified header.	 */	header_r.base = (unsigned char *) header;	header_r.length = DNS_MESSAGE_HEADERLEN;	ret = dst_context_adddata(msg->tsigctx, &header_r);	if (ret != ISC_R_SUCCESS)		goto cleanup_context;	/*	 * Digest all non-TSIG records.	 */	isc_buffer_usedregion(source, &source_r);	r.base = source_r.base + DNS_MESSAGE_HEADERLEN;	if (has_tsig)		r.length = msg->sigstart - DNS_MESSAGE_HEADERLEN;	else		r.length = source_r.length - DNS_MESSAGE_HEADERLEN;	ret = dst_context_adddata(msg->tsigctx, &r);	if (ret != ISC_R_SUCCESS)		goto cleanup_context;	/*	 * Digest the time signed and fudge.	 */	if (has_tsig) {		isc_buffer_init(&databuf, data, sizeof(data));		buffer_putuint48(&databuf, tsig.timesigned);		isc_buffer_putuint16(&databuf, tsig.fudge);		isc_buffer_usedregion(&databuf, &r);		ret = dst_context_adddata(msg->tsigctx, &r);		if (ret != ISC_R_SUCCESS)			goto cleanup_context;		sig_r.base = tsig.signature;		sig_r.length = tsig.siglen;		if (tsig.siglen == 0) {			if (tsig.error != dns_rcode_noerror) {				if (tsig.error == dns_tsigerror_badtime)					ret = DNS_R_CLOCKSKEW;				else					ret = DNS_R_TSIGERRORSET;			} else {				tsig_log(msg->tsigkey, 2,					 "signature is empty");				ret = DNS_R_TSIGVERIFYFAILURE;			}			goto cleanup_context;		}		ret = dst_context_verify(msg->tsigctx, &sig_r);		if (ret == DST_R_VERIFYFAILURE) {			msg->tsigstatus = dns_tsigerror_badsig;			tsig_log(msg->tsigkey, 2,				 "signature failed to verify");			ret = DNS_R_TSIGVERIFYFAILURE;			goto cleanup_context;		}		else if (ret != ISC_R_SUCCESS)			goto cleanup_context;		dst_context_destroy(&msg->tsigctx);	}	msg->tsigstatus = dns_rcode_noerror;	return (ISC_R_SUCCESS); cleanup_context:	dst_context_destroy(&msg->tsigctx); cleanup_querystruct:	dns_rdata_freestruct(&querytsig);	return (ret);}isc_result_tdns_tsigkey_find(dns_tsigkey_t **tsigkey, dns_name_t *name,		 dns_name_t *algorithm, dns_tsig_keyring_t *ring){	dns_tsigkey_t *key;	isc_stdtime_t now;	isc_result_t result;	REQUIRE(tsigkey != NULL);	REQUIRE(*tsigkey == NULL);	REQUIRE(name != NULL);	REQUIRE(ring != NULL);	isc_stdtime_get(&now);	RWLOCK(&ring->lock, isc_rwlocktype_read);	key = NULL;	result = dns_rbt_findname(ring->keys, name, 0, NULL, (void *)&key);	if (result == DNS_R_PARTIALMATCH || result == ISC_R_NOTFOUND) {		RWUNLOCK(&ring->lock, isc_rwlocktype_read);		return (ISC_R_NOTFOUND);	}	if (algorithm != NULL && !dns_name_equal(key->algorithm, algorithm)) {		RWUNLOCK(&ring->lock, isc_rwlocktype_read);		return (ISC_R_NOTFOUND);	}	if (key->inception != key->expire && key->expire < now) {		/*		 * The key has expired.		 */		RWUNLOCK(&ring->lock, isc_rwlocktype_read);		RWLOCK(&ring->lock, isc_rwlocktype_write);		(void) dns_rbt_deletename(ring->keys, name, ISC_FALSE);		RWUNLOCK(&ring->lock, isc_rwlocktype_write);		return (ISC_R_NOTFOUND);	}	isc_refcount_increment(&key->refs, NULL);	RWUNLOCK(&ring->lock, isc_rwlocktype_read);	*tsigkey = key;	return (ISC_R_SUCCESS);}static voidfree_tsignode(void *node, void *_unused) {	dns_tsigkey_t *key;	UNUSED(_unused);	REQUIRE(node != NULL);	key = node;	dns_tsigkey_detach(&key);}isc_result_tdns_tsigkeyring_create(isc_mem_t *mctx, dns_tsig_keyring_t **ringp) {	isc_result_t result;	dns_tsig_keyring_t *ring;	REQUIRE(mctx != NULL);	REQUIRE(ringp != NULL);	REQUIRE(*ringp == NULL);	ring = isc_mem_get(mctx, sizeof(dns_tsig_keyring_t));	if (ring == NULL)		return (ISC_R_NOMEMORY);	result = isc_rwlock_init(&ring->lock, 0, 0);	if (result != ISC_R_SUCCESS) {		UNEXPECTED_ERROR(__FILE__, __LINE__,				 "isc_rwlock_init() failed: %s",				 isc_result_totext(result));		return (ISC_R_UNEXPECTED);	}	ring->keys = NULL;	result = dns_rbt_create(mctx, free_tsignode, NULL, &ring->keys);	if (result != ISC_R_SUCCESS) {		isc_rwlock_destroy(&ring->lock);		isc_mem_put(mctx, ring, sizeof(dns_tsig_keyring_t));		return (result);	}	ring->mctx = mctx;	*ringp = ring;	return (ISC_R_SUCCESS);}voiddns_tsigkeyring_destroy(dns_tsig_keyring_t **ringp) {	dns_tsig_keyring_t *ring;	REQUIRE(ringp != NULL);	REQUIRE(*ringp != NULL);	ring = *ringp;	*ringp = NULL;	dns_rbt_destroy(&ring->keys);	isc_rwlock_destroy(&ring->lock);	isc_mem_put(ring->mctx, ring, sizeof(dns_tsig_keyring_t));}

⌨️ 快捷键说明

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