1d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen// Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org)
2d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
3d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpackage org.xbill.DNS;
4d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
5d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.io.*;
6d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
7d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/**
8d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Next SECure name - this record contains the following name in an
9d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * ordered list of names in the zone, and a set of types for which
10d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * records exist for this name.  The presence of this record in a response
11d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * signifies a negative response from a DNSSEC-signed zone.
12d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
13d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * This replaces the NXT record.
14d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
15d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @author Brian Wellington
16d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @author David Blacka
17d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */
18d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
19d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic class NSECRecord extends Record {
20d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
21d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenprivate static final long serialVersionUID = -5165065768816265385L;
22d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
23d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenprivate Name next;
24d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenprivate TypeBitmap types;
25d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
26d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenNSECRecord() {}
27d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
28d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenRecord
29d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChengetObject() {
30d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	return new NSECRecord();
31d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
32d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
33d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/**
34d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Creates an NSEC Record from the given data.
35d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param next The following name in an ordered list of the zone
36d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param types An array containing the types present.
37d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */
38d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic
39d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenNSECRecord(Name name, int dclass, long ttl, Name next, int [] types) {
40d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	super(name, Type.NSEC, dclass, ttl);
41d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	this.next = checkName("next", next);
42d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	for (int i = 0; i < types.length; i++) {
43d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		Type.check(types[i]);
44d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	}
45d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	this.types = new TypeBitmap(types);
46d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
47d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
48d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenvoid
49d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenrrFromWire(DNSInput in) throws IOException {
50d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	next = new Name(in);
51d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	types = new TypeBitmap(in);
52d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
53d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
54d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenvoid
55d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenrrToWire(DNSOutput out, Compression c, boolean canonical) {
56d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	// Note: The next name is not lowercased.
57d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	next.toWire(out, null, false);
58d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	types.toWire(out);
59d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
60d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
61d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenvoid
62d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenrdataFromString(Tokenizer st, Name origin) throws IOException {
63d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	next = st.getName(origin);
64d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	types = new TypeBitmap(st);
65d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
66d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
67d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** Converts rdata to a String */
68d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenString
69d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenrrToString()
70d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen{
71d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	StringBuffer sb = new StringBuffer();
72d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	sb.append(next);
73d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	if (!types.empty()) {
74d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		sb.append(' ');
75d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		sb.append(types.toString());
76d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	}
77d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	return sb.toString();
78d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
79d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
80d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** Returns the next name */
81d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic Name
82d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChengetNext() {
83d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	return next;
84d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
85d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
86d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** Returns the set of types defined for this name */
87d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic int []
88d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChengetTypes() {
89d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	return types.toArray();
90d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
91d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
92d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** Returns whether a specific type is in the set of types. */
93d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic boolean
94d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenhasType(int type) {
95d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	return types.contains(type);
96d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
97d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
98d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
99