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