| // 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); |
| } |
| |
| } |