dnssec-signzone.c

来自「非常好的dns解析软件」· C语言 代码 · 共 2,334 行 · 第 1/5 页

C
2,334
字号
			dns_db_detachnode(gdb, &nextnode);			break;		}		if (result == ISC_R_NOMORE) {			dns_name_clone(gorigin, nextname);			done = ISC_TRUE;		} else if (result != ISC_R_SUCCESS)			fatal("iterating through the database failed: %s",			      isc_result_totext(result));		result = dns_nsec_build(gdb, gversion, node, nextname,					zonettl);		check_result(result, "dns_nsec_build()");		dns_db_detachnode(gdb, &node);	}	dns_dbiterator_destroy(&dbiter);}/*% * Load the zone file from disk */static voidloadzone(char *file, char *origin, dns_rdataclass_t rdclass, dns_db_t **db) {	isc_buffer_t b;	int len;	dns_fixedname_t fname;	dns_name_t *name;	isc_result_t result;	len = strlen(origin);	isc_buffer_init(&b, origin, len);	isc_buffer_add(&b, len);	dns_fixedname_init(&fname);	name = dns_fixedname_name(&fname);	result = dns_name_fromtext(name, &b, dns_rootname, ISC_FALSE, NULL);	if (result != ISC_R_SUCCESS)		fatal("failed converting name '%s' to dns format: %s",		      origin, isc_result_totext(result));	result = dns_db_create(mctx, "rbt", name, dns_dbtype_zone,			       rdclass, 0, NULL, db);	check_result(result, "dns_db_create()");	result = dns_db_load2(*db, file, inputformat);	if (result != ISC_R_SUCCESS && result != DNS_R_SEENINCLUDE)		fatal("failed loading zone from '%s': %s",		      file, isc_result_totext(result));}/*% * Finds all public zone keys in the zone, and attempts to load the * private keys from disk. */static voidloadzonekeys(dns_db_t *db) {	dns_dbnode_t *node;	dns_dbversion_t *currentversion;	isc_result_t result;	dst_key_t *keys[20];	unsigned int nkeys, i;	currentversion = NULL;	dns_db_currentversion(db, &currentversion);	node = NULL;	result = dns_db_findnode(db, gorigin, ISC_FALSE, &node);	if (result != ISC_R_SUCCESS)		fatal("failed to find the zone's origin: %s",		      isc_result_totext(result));	result = dns_dnssec_findzonekeys(db, currentversion, node, gorigin,					 mctx, 20, keys, &nkeys);	if (result == ISC_R_NOTFOUND)		result = ISC_R_SUCCESS;	if (result != ISC_R_SUCCESS)		fatal("failed to find the zone keys: %s",		      isc_result_totext(result));	for (i = 0; i < nkeys; i++) {		signer_key_t *key;		key = newkeystruct(keys[i], ISC_TRUE);		ISC_LIST_APPEND(keylist, key, link);	}	dns_db_detachnode(db, &node);	dns_db_closeversion(db, &currentversion, ISC_FALSE);}/*% * Finds all public zone keys in the zone. */static voidloadzonepubkeys(dns_db_t *db) {	dns_dbversion_t *currentversion = NULL;	dns_dbnode_t *node = NULL;	dns_rdataset_t rdataset;	dns_rdata_t rdata = DNS_RDATA_INIT;	dst_key_t *pubkey;	signer_key_t *key;	isc_result_t result;	dns_db_currentversion(db, &currentversion);	result = dns_db_findnode(db, gorigin, ISC_FALSE, &node);	if (result != ISC_R_SUCCESS)		fatal("failed to find the zone's origin: %s",		      isc_result_totext(result));	dns_rdataset_init(&rdataset);	result = dns_db_findrdataset(db, node, currentversion,				     dns_rdatatype_dnskey, 0, 0, &rdataset, NULL);	if (result != ISC_R_SUCCESS)		fatal("failed to find keys at the zone apex: %s",		      isc_result_totext(result));	result = dns_rdataset_first(&rdataset);	check_result(result, "dns_rdataset_first");	while (result == ISC_R_SUCCESS) {		pubkey = NULL;		dns_rdata_reset(&rdata);		dns_rdataset_current(&rdataset, &rdata);		result = dns_dnssec_keyfromrdata(gorigin, &rdata, mctx,						 &pubkey);		if (result != ISC_R_SUCCESS)			goto next;		if (!dst_key_iszonekey(pubkey)) {			dst_key_free(&pubkey);			goto next;		}		key = newkeystruct(pubkey, ISC_FALSE);		ISC_LIST_APPEND(keylist, key, link); next:		result = dns_rdataset_next(&rdataset);	}	dns_rdataset_disassociate(&rdataset);	dns_db_detachnode(db, &node);	dns_db_closeversion(db, &currentversion, ISC_FALSE);}static voidwarnifallksk(dns_db_t *db) {	dns_dbversion_t *currentversion = NULL;	dns_dbnode_t *node = NULL;	dns_rdataset_t rdataset;	dns_rdata_t rdata = DNS_RDATA_INIT;	isc_result_t result;	dns_rdata_key_t key;	isc_boolean_t have_non_ksk = ISC_FALSE;	dns_db_currentversion(db, &currentversion);	result = dns_db_findnode(db, gorigin, ISC_FALSE, &node);	if (result != ISC_R_SUCCESS)		fatal("failed to find the zone's origin: %s",		      isc_result_totext(result));	dns_rdataset_init(&rdataset);	result = dns_db_findrdataset(db, node, currentversion,				     dns_rdatatype_dnskey, 0, 0, &rdataset, NULL);	if (result != ISC_R_SUCCESS)		fatal("failed to find keys at the zone apex: %s",		      isc_result_totext(result));	result = dns_rdataset_first(&rdataset);	check_result(result, "dns_rdataset_first");	while (result == ISC_R_SUCCESS) {		dns_rdata_reset(&rdata);		dns_rdataset_current(&rdataset, &rdata);		result = dns_rdata_tostruct(&rdata, &key, NULL);		check_result(result, "dns_rdata_tostruct");		if ((key.flags & DNS_KEYFLAG_KSK) == 0) {			have_non_ksk = ISC_TRUE;			result = ISC_R_NOMORE;		} else			result = dns_rdataset_next(&rdataset);	}	dns_rdataset_disassociate(&rdataset);	dns_db_detachnode(db, &node);	dns_db_closeversion(db, &currentversion, ISC_FALSE);	if (!have_non_ksk && !ignoreksk)		fprintf(stderr, "%s: warning: No non-KSK dnskey found. "			"Supply non-KSK dnskey or use '-z'.\n",			program);}static voidwriteset(const char *prefix, dns_rdatatype_t type) {	char *filename;	char namestr[DNS_NAME_FORMATSIZE];	dns_db_t *db = NULL;	dns_dbversion_t *version = NULL;	dns_diff_t diff;	dns_difftuple_t *tuple = NULL;	dns_fixedname_t fixed;	dns_name_t *name;	dns_rdata_t rdata, ds;	isc_boolean_t have_ksk = ISC_FALSE;	isc_boolean_t have_non_ksk = ISC_FALSE;	isc_buffer_t b;	isc_buffer_t namebuf;	isc_region_t r;	isc_result_t result;	signer_key_t *key;	unsigned char dsbuf[DNS_DS_BUFFERSIZE];	unsigned char keybuf[DST_KEY_MAXSIZE];	unsigned int filenamelen;	const dns_master_style_t *style = 		(type == dns_rdatatype_dnskey) ? masterstyle : dsstyle;	isc_buffer_init(&namebuf, namestr, sizeof(namestr));	result = dns_name_tofilenametext(gorigin, ISC_FALSE, &namebuf);	check_result(result, "dns_name_tofilenametext");	isc_buffer_putuint8(&namebuf, 0);	filenamelen = strlen(prefix) + strlen(namestr);	if (directory != NULL)		filenamelen += strlen(directory) + 1;	filename = isc_mem_get(mctx, filenamelen + 1);	if (filename == NULL)		fatal("out of memory");	if (directory != NULL)		sprintf(filename, "%s/", directory);	else		filename[0] = 0;	strcat(filename, prefix);	strcat(filename, namestr);	dns_diff_init(mctx, &diff);	for (key = ISC_LIST_HEAD(keylist);	     key != NULL;	     key = ISC_LIST_NEXT(key, link))		if (!key->isksk) {			have_non_ksk = ISC_TRUE;			break;		}	for (key = ISC_LIST_HEAD(keylist);	     key != NULL;	     key = ISC_LIST_NEXT(key, link))		if (key->isksk) {			have_ksk = ISC_TRUE;			break;		}	if (type == dns_rdatatype_dlv) {		dns_name_t tname;		unsigned int labels;		dns_name_init(&tname, NULL);		dns_fixedname_init(&fixed);		name = dns_fixedname_name(&fixed);		labels = dns_name_countlabels(gorigin);		dns_name_getlabelsequence(gorigin, 0, labels - 1, &tname);		result = dns_name_concatenate(&tname, dlv, name, NULL);		check_result(result, "dns_name_concatenate");	} else		name = gorigin;	for (key = ISC_LIST_HEAD(keylist);	     key != NULL;	     key = ISC_LIST_NEXT(key, link))	{		if (have_ksk && have_non_ksk && !key->isksk)			continue;		dns_rdata_init(&rdata);		dns_rdata_init(&ds);		isc_buffer_init(&b, keybuf, sizeof(keybuf));		result = dst_key_todns(key->key, &b);		check_result(result, "dst_key_todns");		isc_buffer_usedregion(&b, &r);		dns_rdata_fromregion(&rdata, gclass, dns_rdatatype_dnskey, &r);		if (type != dns_rdatatype_dnskey) {			result = dns_ds_buildrdata(gorigin, &rdata,						   DNS_DSDIGEST_SHA1,						   dsbuf, &ds);			check_result(result, "dns_ds_buildrdata");			if (type == dns_rdatatype_dlv)				ds.type = dns_rdatatype_dlv;			result = dns_difftuple_create(mctx, DNS_DIFFOP_ADD,						      name, 0, &ds, &tuple);			check_result(result, "dns_difftuple_create");			dns_diff_append(&diff, &tuple);			dns_rdata_reset(&ds);			result = dns_ds_buildrdata(gorigin, &rdata,						   DNS_DSDIGEST_SHA256,						   dsbuf, &ds);			check_result(result, "dns_ds_buildrdata");			if (type == dns_rdatatype_dlv)				ds.type = dns_rdatatype_dlv;			result = dns_difftuple_create(mctx, DNS_DIFFOP_ADD,						      name, 0, &ds, &tuple);		} else			result = dns_difftuple_create(mctx, DNS_DIFFOP_ADD,						      gorigin, zonettl,						      &rdata, &tuple);		check_result(result, "dns_difftuple_create");		dns_diff_append(&diff, &tuple);	}	result = dns_db_create(mctx, "rbt", dns_rootname, dns_dbtype_zone,			       gclass, 0, NULL, &db);	check_result(result, "dns_db_create");	result = dns_db_newversion(db, &version);	check_result(result, "dns_db_newversion");	result = dns_diff_apply(&diff, db, version);	check_result(result, "dns_diff_apply");	dns_diff_clear(&diff);	result = dns_master_dump(mctx, db, version, style, filename);	check_result(result, "dns_master_dump");	isc_mem_put(mctx, filename, filenamelen + 1);	dns_db_closeversion(db, &version, ISC_FALSE);	dns_db_detach(&db);}static voidprint_time(FILE *fp) {	time_t currenttime;	if (outputformat != dns_masterformat_text)		return;	currenttime = time(NULL);	fprintf(fp, "; File written on %s", ctime(&currenttime));}static voidprint_version(FILE *fp) {	if (outputformat != dns_masterformat_text)		return;	fprintf(fp, "; dnssec_signzone version " VERSION "\n");}static voidusage(void) {	fprintf(stderr, "Usage:\n");	fprintf(stderr, "\t%s [options] zonefile [keys]\n", program);	fprintf(stderr, "\n");	fprintf(stderr, "Version: %s\n", VERSION);	fprintf(stderr, "Options: (default value in parenthesis) \n");	fprintf(stderr, "\t-c class (IN)\n");	fprintf(stderr, "\t-d directory\n");	fprintf(stderr, "\t\tdirectory to find keyset files (.)\n");	fprintf(stderr, "\t-g:\t");	fprintf(stderr, "generate DS records from keyset files\n");	fprintf(stderr, "\t-s [YYYYMMDDHHMMSS|+offset]:\n");	fprintf(stderr, "\t\tRRSIG start time - absolute|offset (now - 1 hour)\n");	fprintf(stderr, "\t-e [YYYYMMDDHHMMSS|+offset|\"now\"+offset]:\n");	fprintf(stderr, "\t\tRRSIG end time  - absolute|from start|from now "				"(now + 30 days)\n");	fprintf(stderr, "\t-i interval:\n");	fprintf(stderr, "\t\tcycle interval - resign "				"if < interval from end ( (end-start)/4 )\n");	fprintf(stderr, "\t-j jitter:\n");	fprintf(stderr, "\t\trandomize signature end time up to jitter seconds\n");	fprintf(stderr, "\t-v debuglevel (0)\n");	fprintf(stderr, "\t-o origin:\n");	fprintf(stderr, "\t\tzone origin (name of zonefile)\n");	fprintf(stderr, "\t-f outfile:\n");	fprintf(stderr, "\t\tfile the signed zone is written in "				"(zonefile + .signed)\n");	fprintf(stderr, "\t-I format:\n");	fprintf(stderr, "\t\tfile format of input zonefile (text)\n");	fprintf(stderr, "\t-O format:\n");	fprintf(stderr, "\t\tfile format of signed zone file (text)\n");	fprintf(stderr, "\t-N format:\n");	fprintf(stderr, "\t\tsoa serial format of signed zone file (keep)\n");	fprintf(stderr, "\t-r randomdev:\n");	fprintf(stderr,	"\t\ta file containing random data\n");	fprintf(stderr, "\t-a:\t");	fprintf(stderr, "verify generated signatures\n");	fprintf(stderr, "\t-p:\t");	fprintf(stderr, "use pseudorandom data (faster but less secure)\n");	fprintf(stderr, "\t-t:\t");	fprintf(stderr, "print statistics\n");	fprintf(stderr, "\t-n ncpus (number of cpus present)\n");	fprintf(stderr, "\t-k key_signing_key\n");	fprintf(stderr, "\t-l lookasidezone\n");	fprintf(stderr, "\t-z:\t");	fprintf(stderr, "ignore KSK flag in DNSKEYs");	fprintf(stderr, "\n");	fprintf(stderr, "Signing Keys: ");	fprintf(stderr, "(default: all zone keys that have private keys)\n");	fprintf(stderr, "\tkeyfile (Kname+alg+tag)\n");	exit(0);}static voidremovetempfile(void) {	if (removefile)		isc_file_remove(tempfile);}static voidprint_stats(isc_time_t *timer_start, isc_time_t *timer_finish) {	isc_uint64_t runtime_us;   /* Runtime in microseconds */	isc_uint64_t runtime_ms;   /* Runtime in milliseconds */	isc_uint64_t sig_ms;	   /* Signatures per millisecond */	runtime_us = isc_time_microdiff(timer_finish, timer_start);	printf("Signatures generated:               %10d\n", nsigned);	printf("Signatures retained:                %10d\n", nretained);	printf("Signatures dropped:                 %10d\n", ndropped);	printf("Signatures successfully verified:   %10d\n", nverified);	printf("Signatures unsuccessfully verified: %10d\n", nverifyfailed);	runtime_ms = runtime_us / 1000;	printf("Runtime in seconds:                %7u.%03u\n", 	       (unsigned int) (runtime_ms / 1000), 	       (unsigned int) (runtime_ms % 1000));	if (runtime_us > 0) {		sig_ms = ((isc_uint64_t)nsigned * 1000000000) / runtime_us;		printf("Signatures per second:             %7u.%03u\n",		       (unsigned int) sig_ms / 1000, 		       (unsigned int) sig_ms % 1000);	}}intmain(int argc, char *argv[]) {	int i, ch;	char *startstr = NULL, *endstr = NULL, *classname = NULL;	char *origin = NULL, *file = NULL, *output = NULL;	char *inputformatstr = NULL, *outputformatstr = NULL;	char *serialformatstr = NULL;	char *dskeyfile[MAXDSKEYS];	int ndskeys = 0;	char *endp;	isc_time_t timer_start, timer_finish;	signer_key_t *key;	isc_result_t result;	isc_log_t *log = NULL;	isc_boolean_t pseudorandom = ISC_FALSE;	unsigned int eflags;	isc_boolean_t free_output = ISC_FALSE;	int tempfilelen;	dns_rdataclass_t rdclass;	isc_task_t **tasks = NULL;	isc_buffer_t b;	int len;	masterstyle = &dns_master_style_explicitttl;	check_result(isc_app_start(), "isc_app_start");	result = isc_mem_create(0, 0, &mctx);	if (result != ISC_R_SUCCESS)		fatal("out of memory");	dns_result_register();	while ((ch = isc_commandline_parse(argc, argv,					   "ac:d:e:f:ghi:I:j:k:l:n:N:o:O:pr:s:Stv:z"))	       != -1) {		switch (ch) {

⌨️ 快捷键说明

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