aboutsummaryrefslogtreecommitdiff
path: root/src/org/xbill/DNS/TKEYRecord.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/org/xbill/DNS/TKEYRecord.java')
-rw-r--r--src/org/xbill/DNS/TKEYRecord.java225
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);
+}
+
+}