// Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org)
package org.xbill.DNS;
import java.io.*;
import java.util.*;
import org.xbill.DNS.utils.*;
/**
* The base class for SIG/RRSIG records, which have identical formats
*
* @author Brian Wellington
*/
abstract class SIGBase extends Record {
private static final long serialVersionUID = -3738444391533812369L;
protected int covered;
protected int alg, labels;
protected long origttl;
protected Date expire, timeSigned;
protected int footprint;
protected Name signer;
protected byte [] signature;
protected
SIGBase() {}
public
SIGBase(Name name, int type, int dclass, long ttl, int covered, int alg,
long origttl, Date expire, Date timeSigned, int footprint, Name signer,
byte [] signature)
{
super(name, type, dclass, ttl);
Type.check(covered);
TTL.check(origttl);
this.covered = covered;
this.alg = checkU8("alg", alg);
this.labels = name.labels() - 1;
if (name.isWild())
this.labels--;
this.origttl = origttl;
this.expire = expire;
this.timeSigned = timeSigned;
this.footprint = checkU16("footprint", footprint);
this.signer = checkName("signer", signer);
this.signature = signature;
}
void
rrFromWire(DNSInput in) throws IOException {
covered = in.readU16();
alg = in.readU8();
labels = in.readU8();
origttl = in.readU32();
expire = new Date(1000 * in.readU32());
timeSigned = new Date(1000 * in.readU32());
footprint = in.readU16();
signer = new Name(in);
signature = in.readByteArray();
}
void
rdataFromString(Tokenizer st, Name origin) throws IOException {
String typeString = st.getString();
covered = Type.value(typeString);
if (covered < 0)
throw st.exception("Invalid type: " + typeString);
String algString = st.getString();
alg = DNSSEC.Algorithm.value(algString);
if (alg < 0)
throw st.exception("Invalid algorithm: " + algString);
labels = st.getUInt8();
origttl = st.getTTL();
expire = FormattedTime.parse(st.getString());
timeSigned = FormattedTime.parse(st.getString());
footprint = st.getUInt16();
signer = st.getName(origin);
signature = st.getBase64();
}
/** Converts the RRSIG/SIG Record to a String */
String
rrToString() {
StringBuffer sb = new StringBuffer();
sb.append (Type.string(covered));
sb.append (" ");
sb.append (alg);
sb.append (" ");
sb.append (labels);
sb.append (" ");
sb.append (origttl);
sb.append (" ");
if (Options.check("multiline"))
sb.append ("(\n\t");
sb.append (FormattedTime.format(expire));
sb.append (" ");
sb.append (FormattedTime.format(timeSigned));
sb.append (" ");
sb.append (footprint);
sb.append (" ");
sb.append (signer);
if (Options.check("multiline")) {
sb.append("\n");
sb.append(base64.formatString(signature, 64, "\t",
true));
} else {
sb.append (" ");
sb.append(base64.toString(signature));
}
return sb.toString();
}
/** Returns the RRset type covered by this signature */
public int
getTypeCovered() {
return covered;
}
/**
* Returns the cryptographic algorithm of the key that generated the signature
*/
public int
getAlgorithm() {
return alg;
}
/**
* Returns the number of labels in the signed domain name. This may be
* different than the record's domain name if the record is a wildcard
* record.
*/
public int
getLabels() {
return labels;
}
/** Returns the original TTL of the RRset */
public long
getOrigTTL() {
return origttl;
}
/** Returns the time at which the signature expires */
public Date
getExpire() {
return expire;
}
/** Returns the time at which this signature was generated */
public Date
getTimeSigned() {
return timeSigned;
}
/** Returns The footprint/key id of the signing key. */
public int
getFootprint() {
return footprint;
}
/** Returns the owner of the signing key */
public Name
getSigner() {
return signer;
}
/** Returns the binary data representing the signature */
public byte []
getSignature() {
return signature;
}
void
setSignature(byte [] signature) {
this.signature = signature;
}
void
rrToWire(DNSOutput out, Compression c, boolean canonical) {
out.writeU16(covered);
out.writeU8(alg);
out.writeU8(labels);
out.writeU32(origttl);
out.writeU32(expire.getTime() / 1000);
out.writeU32(timeSigned.getTime() / 1000);
out.writeU16(footprint);
signer.toWire(out, null, canonical);
out.writeByteArray(signature);
}
}