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