diff options
Diffstat (limited to 'src/org/xbill/DNS/TKEYRecord.java')
-rw-r--r-- | src/org/xbill/DNS/TKEYRecord.java | 225 |
1 files changed, 225 insertions, 0 deletions
diff --git a/src/org/xbill/DNS/TKEYRecord.java b/src/org/xbill/DNS/TKEYRecord.java new file mode 100644 index 0000000..4dcbb5c --- /dev/null +++ b/src/org/xbill/DNS/TKEYRecord.java @@ -0,0 +1,225 @@ +// Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) + +package org.xbill.DNS; + +import java.io.*; +import java.util.*; +import org.xbill.DNS.utils.*; + +/** + * Transaction Key - used to compute and/or securely transport a shared + * secret to be used with TSIG. + * @see TSIG + * + * @author Brian Wellington + */ + +public class TKEYRecord extends Record { + +private static final long serialVersionUID = 8828458121926391756L; + +private Name alg; +private Date timeInception; +private Date timeExpire; +private int mode, error; +private byte [] key; +private byte [] other; + +/** The key is assigned by the server (unimplemented) */ +public static final int SERVERASSIGNED = 1; + +/** The key is computed using a Diffie-Hellman key exchange */ +public static final int DIFFIEHELLMAN = 2; + +/** The key is computed using GSS_API (unimplemented) */ +public static final int GSSAPI = 3; + +/** The key is assigned by the resolver (unimplemented) */ +public static final int RESOLVERASSIGNED = 4; + +/** The key should be deleted */ +public static final int DELETE = 5; + +TKEYRecord() {} + +Record +getObject() { + return new TKEYRecord(); +} + +/** + * Creates a TKEY Record from the given data. + * @param alg The shared key's algorithm + * @param timeInception The beginning of the validity period of the shared + * secret or keying material + * @param timeExpire The end of the validity period of the shared + * secret or keying material + * @param mode The mode of key agreement + * @param error The extended error field. Should be 0 in queries + * @param key The shared secret + * @param other The other data field. Currently unused + * responses. + */ +public +TKEYRecord(Name name, int dclass, long ttl, Name alg, + Date timeInception, Date timeExpire, int mode, int error, + byte [] key, byte other[]) +{ + super(name, Type.TKEY, dclass, ttl); + this.alg = checkName("alg", alg); + this.timeInception = timeInception; + this.timeExpire = timeExpire; + this.mode = checkU16("mode", mode); + this.error = checkU16("error", error); + this.key = key; + this.other = other; +} + +void +rrFromWire(DNSInput in) throws IOException { + alg = new Name(in); + timeInception = new Date(1000 * in.readU32()); + timeExpire = new Date(1000 * in.readU32()); + mode = in.readU16(); + error = in.readU16(); + + int keylen = in.readU16(); + if (keylen > 0) + key = in.readByteArray(keylen); + else + key = null; + + int otherlen = in.readU16(); + if (otherlen > 0) + other = in.readByteArray(otherlen); + else + other = null; +} + +void +rdataFromString(Tokenizer st, Name origin) throws IOException { + throw st.exception("no text format defined for TKEY"); +} + +protected String +modeString() { + switch (mode) { + case SERVERASSIGNED: return "SERVERASSIGNED"; + case DIFFIEHELLMAN: return "DIFFIEHELLMAN"; + case GSSAPI: return "GSSAPI"; + case RESOLVERASSIGNED: return "RESOLVERASSIGNED"; + case DELETE: return "DELETE"; + default: return Integer.toString(mode); + } +} + +/** Converts rdata to a String */ +String +rrToString() { + StringBuffer sb = new StringBuffer(); + sb.append(alg); + sb.append(" "); + if (Options.check("multiline")) + sb.append("(\n\t"); + sb.append(FormattedTime.format(timeInception)); + sb.append(" "); + sb.append(FormattedTime.format(timeExpire)); + sb.append(" "); + sb.append(modeString()); + sb.append(" "); + sb.append(Rcode.TSIGstring(error)); + if (Options.check("multiline")) { + sb.append("\n"); + if (key != null) { + sb.append(base64.formatString(key, 64, "\t", false)); + sb.append("\n"); + } + if (other != null) + sb.append(base64.formatString(other, 64, "\t", false)); + sb.append(" )"); + } else { + sb.append(" "); + if (key != null) { + sb.append(base64.toString(key)); + sb.append(" "); + } + if (other != null) + sb.append(base64.toString(other)); + } + return sb.toString(); +} + +/** Returns the shared key's algorithm */ +public Name +getAlgorithm() { + return alg; +} + +/** + * Returns the beginning of the validity period of the shared secret or + * keying material + */ +public Date +getTimeInception() { + return timeInception; +} + +/** + * Returns the end of the validity period of the shared secret or + * keying material + */ +public Date +getTimeExpire() { + return timeExpire; +} + +/** Returns the key agreement mode */ +public int +getMode() { + return mode; +} + +/** Returns the extended error */ +public int +getError() { + return error; +} + +/** Returns the shared secret or keying material */ +public byte [] +getKey() { + return key; +} + +/** Returns the other data */ +public byte [] +getOther() { + return other; +} + +void +rrToWire(DNSOutput out, Compression c, boolean canonical) { + alg.toWire(out, null, canonical); + + out.writeU32(timeInception.getTime() / 1000); + out.writeU32(timeExpire.getTime() / 1000); + + out.writeU16(mode); + out.writeU16(error); + + if (key != null) { + out.writeU16(key.length); + out.writeByteArray(key); + } + else + out.writeU16(0); + + if (other != null) { + out.writeU16(other.length); + out.writeByteArray(other); + } + else + out.writeU16(0); +} + +} |