1d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen// Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) 2d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 3d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpackage org.xbill.DNS; 4d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 5d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.io.*; 6d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.util.*; 7d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.xbill.DNS.utils.*; 8d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 9d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** 10d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Transaction Key - used to compute and/or securely transport a shared 11d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * secret to be used with TSIG. 12d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @see TSIG 13d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 14d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @author Brian Wellington 15d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 16d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 17d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic class TKEYRecord extends Record { 18d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 19d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenprivate static final long serialVersionUID = 8828458121926391756L; 20d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 21d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenprivate Name alg; 22d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenprivate Date timeInception; 23d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenprivate Date timeExpire; 24d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenprivate int mode, error; 25d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenprivate byte [] key; 26d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenprivate byte [] other; 27d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 28d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** The key is assigned by the server (unimplemented) */ 29d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic static final int SERVERASSIGNED = 1; 30d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 31d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** The key is computed using a Diffie-Hellman key exchange */ 32d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic static final int DIFFIEHELLMAN = 2; 33d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 34d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** The key is computed using GSS_API (unimplemented) */ 35d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic static final int GSSAPI = 3; 36d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 37d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** The key is assigned by the resolver (unimplemented) */ 38d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic static final int RESOLVERASSIGNED = 4; 39d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 40d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** The key should be deleted */ 41d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic static final int DELETE = 5; 42d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 43d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenTKEYRecord() {} 44d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 45d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenRecord 46d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChengetObject() { 47d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return new TKEYRecord(); 48d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 49d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 50d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** 51d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Creates a TKEY Record from the given data. 52d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param alg The shared key's algorithm 53d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param timeInception The beginning of the validity period of the shared 54d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * secret or keying material 55d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param timeExpire The end of the validity period of the shared 56d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * secret or keying material 57d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param mode The mode of key agreement 58d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param error The extended error field. Should be 0 in queries 59d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param key The shared secret 60d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param other The other data field. Currently unused 61d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * responses. 62d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 63d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic 64d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenTKEYRecord(Name name, int dclass, long ttl, Name alg, 65d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen Date timeInception, Date timeExpire, int mode, int error, 66d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen byte [] key, byte other[]) 67d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen{ 68d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen super(name, Type.TKEY, dclass, ttl); 69d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.alg = checkName("alg", alg); 70d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.timeInception = timeInception; 71d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.timeExpire = timeExpire; 72d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.mode = checkU16("mode", mode); 73d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.error = checkU16("error", error); 74d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.key = key; 75d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.other = other; 76d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 77d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 78d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenvoid 79d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenrrFromWire(DNSInput in) throws IOException { 80d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen alg = new Name(in); 81d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen timeInception = new Date(1000 * in.readU32()); 82d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen timeExpire = new Date(1000 * in.readU32()); 83d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen mode = in.readU16(); 84d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen error = in.readU16(); 85d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 86d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen int keylen = in.readU16(); 87d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (keylen > 0) 88d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen key = in.readByteArray(keylen); 89d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen else 90d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen key = null; 91d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 92d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen int otherlen = in.readU16(); 93d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (otherlen > 0) 94d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen other = in.readByteArray(otherlen); 95d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen else 96d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen other = null; 97d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 98d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 99d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenvoid 100d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenrdataFromString(Tokenizer st, Name origin) throws IOException { 101d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen throw st.exception("no text format defined for TKEY"); 102d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 103d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 104d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenprotected String 105d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenmodeString() { 106d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen switch (mode) { 107d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen case SERVERASSIGNED: return "SERVERASSIGNED"; 108d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen case DIFFIEHELLMAN: return "DIFFIEHELLMAN"; 109d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen case GSSAPI: return "GSSAPI"; 110d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen case RESOLVERASSIGNED: return "RESOLVERASSIGNED"; 111d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen case DELETE: return "DELETE"; 112d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen default: return Integer.toString(mode); 113d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 114d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 115d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 116d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** Converts rdata to a String */ 117d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenString 118d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenrrToString() { 119d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen StringBuffer sb = new StringBuffer(); 120d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen sb.append(alg); 121d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen sb.append(" "); 122d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (Options.check("multiline")) 123d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen sb.append("(\n\t"); 124d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen sb.append(FormattedTime.format(timeInception)); 125d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen sb.append(" "); 126d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen sb.append(FormattedTime.format(timeExpire)); 127d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen sb.append(" "); 128d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen sb.append(modeString()); 129d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen sb.append(" "); 130d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen sb.append(Rcode.TSIGstring(error)); 131d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (Options.check("multiline")) { 132d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen sb.append("\n"); 133d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (key != null) { 134d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen sb.append(base64.formatString(key, 64, "\t", false)); 135d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen sb.append("\n"); 136d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 137d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (other != null) 138d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen sb.append(base64.formatString(other, 64, "\t", false)); 139d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen sb.append(" )"); 140d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } else { 141d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen sb.append(" "); 142d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (key != null) { 143d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen sb.append(base64.toString(key)); 144d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen sb.append(" "); 145d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 146d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (other != null) 147d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen sb.append(base64.toString(other)); 148d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 149d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return sb.toString(); 150d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 151d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 152d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** Returns the shared key's algorithm */ 153d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic Name 154d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChengetAlgorithm() { 155d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return alg; 156d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 157d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 158d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** 159d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Returns the beginning of the validity period of the shared secret or 160d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * keying material 161d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 162d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic Date 163d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChengetTimeInception() { 164d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return timeInception; 165d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 166d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 167d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** 168d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Returns the end of the validity period of the shared secret or 169d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * keying material 170d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 171d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic Date 172d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChengetTimeExpire() { 173d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return timeExpire; 174d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 175d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 176d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** Returns the key agreement mode */ 177d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic int 178d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChengetMode() { 179d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return mode; 180d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 181d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 182d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** Returns the extended error */ 183d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic int 184d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChengetError() { 185d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return error; 186d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 187d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 188d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** Returns the shared secret or keying material */ 189d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic byte [] 190d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChengetKey() { 191d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return key; 192d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 193d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 194d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** Returns the other data */ 195d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic byte [] 196d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChengetOther() { 197d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return other; 198d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 199d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 200d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenvoid 201d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenrrToWire(DNSOutput out, Compression c, boolean canonical) { 202d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen alg.toWire(out, null, canonical); 203d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 204d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen out.writeU32(timeInception.getTime() / 1000); 205d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen out.writeU32(timeExpire.getTime() / 1000); 206d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 207d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen out.writeU16(mode); 208d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen out.writeU16(error); 209d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 210d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (key != null) { 211d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen out.writeU16(key.length); 212d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen out.writeByteArray(key); 213d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 214d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen else 215d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen out.writeU16(0); 216d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 217d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (other != null) { 218d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen out.writeU16(other.length); 219d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen out.writeByteArray(other); 220d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 221d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen else 222d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen out.writeU16(0); 223d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 224d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 225d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 226