blob: 4c1ebce74947bc54f08f2312868e4275b1a17e02 [file] [log] [blame]
// Copyright (c) 2002-2004 Brian Wellington (bwelling@xbill.org)
package org.xbill.DNS;
import java.io.*;
import org.xbill.DNS.utils.*;
/**
* DS - contains a Delegation Signer record, which acts as a
* placeholder for KEY records in the parent zone.
* @see DNSSEC
*
* @author David Blacka
* @author Brian Wellington
*/
public class DSRecord extends Record {
public static class Digest {
private Digest() {}
/** SHA-1 */
public static final int SHA1 = 1;
/** SHA-256 */
public static final int SHA256 = 2;
/** SHA-384 */
public static final int SHA384 = 4;
}
public static final int SHA1_DIGEST_ID = Digest.SHA1;
public static final int SHA256_DIGEST_ID = Digest.SHA256;
public static final int SHA384_DIGEST_ID = Digest.SHA384;
private static final long serialVersionUID = -9001819329700081493L;
private int footprint;
private int alg;
private int digestid;
private byte [] digest;
DSRecord() {}
Record
getObject() {
return new DSRecord();
}
/**
* Creates a DS Record from the given data
* @param footprint The original KEY record's footprint (keyid).
* @param alg The original key algorithm.
* @param digestid The digest id code.
* @param digest A hash of the original key.
*/
public
DSRecord(Name name, int dclass, long ttl, int footprint, int alg,
int digestid, byte [] digest)
{
super(name, Type.DS, dclass, ttl);
this.footprint = checkU16("footprint", footprint);
this.alg = checkU8("alg", alg);
this.digestid = checkU8("digestid", digestid);
this.digest = digest;
}
/**
* Creates a DS Record from the given data
* @param digestid The digest id code.
* @param key The key to digest
*/
public
DSRecord(Name name, int dclass, long ttl, int digestid, DNSKEYRecord key)
{
this(name, dclass, ttl, key.getFootprint(), key.getAlgorithm(),
digestid, DNSSEC.generateDSDigest(key, digestid));
}
void
rrFromWire(DNSInput in) throws IOException {
footprint = in.readU16();
alg = in.readU8();
digestid = in.readU8();
digest = in.readByteArray();
}
void
rdataFromString(Tokenizer st, Name origin) throws IOException {
footprint = st.getUInt16();
alg = st.getUInt8();
digestid = st.getUInt8();
digest = st.getHex();
}
/**
* Converts rdata to a String
*/
String
rrToString() {
StringBuffer sb = new StringBuffer();
sb.append(footprint);
sb.append(" ");
sb.append(alg);
sb.append(" ");
sb.append(digestid);
if (digest != null) {
sb.append(" ");
sb.append(base16.toString(digest));
}
return sb.toString();
}
/**
* Returns the key's algorithm.
*/
public int
getAlgorithm() {
return alg;
}
/**
* Returns the key's Digest ID.
*/
public int
getDigestID()
{
return digestid;
}
/**
* Returns the binary hash of the key.
*/
public byte []
getDigest() {
return digest;
}
/**
* Returns the key's footprint.
*/
public int
getFootprint() {
return footprint;
}
void
rrToWire(DNSOutput out, Compression c, boolean canonical) {
out.writeU16(footprint);
out.writeU8(alg);
out.writeU8(digestid);
if (digest != null)
out.writeByteArray(digest);
}
}