aboutsummaryrefslogtreecommitdiff
path: root/src/org/xbill/DNS/IPSECKEYRecord.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/org/xbill/DNS/IPSECKEYRecord.java')
-rw-r--r--src/org/xbill/DNS/IPSECKEYRecord.java231
1 files changed, 231 insertions, 0 deletions
diff --git a/src/org/xbill/DNS/IPSECKEYRecord.java b/src/org/xbill/DNS/IPSECKEYRecord.java
new file mode 100644
index 0000000..7eb2956
--- /dev/null
+++ b/src/org/xbill/DNS/IPSECKEYRecord.java
@@ -0,0 +1,231 @@
+// Copyright (c) 2004 Brian Wellington (bwelling@xbill.org)
+
+package org.xbill.DNS;
+
+import java.io.*;
+import java.net.*;
+import org.xbill.DNS.utils.*;
+
+/**
+ * IPsec Keying Material (RFC 4025)
+ *
+ * @author Brian Wellington
+ */
+
+public class IPSECKEYRecord extends Record {
+
+private static final long serialVersionUID = 3050449702765909687L;
+
+public static class Algorithm {
+ private Algorithm() {}
+
+ public static final int DSA = 1;
+ public static final int RSA = 2;
+}
+
+public static class Gateway {
+ private Gateway() {}
+
+ public static final int None = 0;
+ public static final int IPv4 = 1;
+ public static final int IPv6 = 2;
+ public static final int Name = 3;
+}
+
+private int precedence;
+private int gatewayType;
+private int algorithmType;
+private Object gateway;
+private byte [] key;
+
+IPSECKEYRecord() {}
+
+Record
+getObject() {
+ return new IPSECKEYRecord();
+}
+
+/**
+ * Creates an IPSECKEY Record from the given data.
+ * @param precedence The record's precedence.
+ * @param gatewayType The record's gateway type.
+ * @param algorithmType The record's algorithm type.
+ * @param gateway The record's gateway.
+ * @param key The record's public key.
+ */
+public
+IPSECKEYRecord(Name name, int dclass, long ttl, int precedence,
+ int gatewayType, int algorithmType, Object gateway,
+ byte [] key)
+{
+ super(name, Type.IPSECKEY, dclass, ttl);
+ this.precedence = checkU8("precedence", precedence);
+ this.gatewayType = checkU8("gatewayType", gatewayType);
+ this.algorithmType = checkU8("algorithmType", algorithmType);
+ switch (gatewayType) {
+ case Gateway.None:
+ this.gateway = null;
+ break;
+ case Gateway.IPv4:
+ if (!(gateway instanceof InetAddress))
+ throw new IllegalArgumentException("\"gateway\" " +
+ "must be an IPv4 " +
+ "address");
+ this.gateway = gateway;
+ break;
+ case Gateway.IPv6:
+ if (!(gateway instanceof Inet6Address))
+ throw new IllegalArgumentException("\"gateway\" " +
+ "must be an IPv6 " +
+ "address");
+ this.gateway = gateway;
+ break;
+ case Gateway.Name:
+ if (!(gateway instanceof Name))
+ throw new IllegalArgumentException("\"gateway\" " +
+ "must be a DNS " +
+ "name");
+ this.gateway = checkName("gateway", (Name) gateway);
+ break;
+ default:
+ throw new IllegalArgumentException("\"gatewayType\" " +
+ "must be between 0 and 3");
+ }
+
+ this.key = key;
+}
+
+void
+rrFromWire(DNSInput in) throws IOException {
+ precedence = in.readU8();
+ gatewayType = in.readU8();
+ algorithmType = in.readU8();
+ switch (gatewayType) {
+ case Gateway.None:
+ gateway = null;
+ break;
+ case Gateway.IPv4:
+ gateway = InetAddress.getByAddress(in.readByteArray(4));
+ break;
+ case Gateway.IPv6:
+ gateway = InetAddress.getByAddress(in.readByteArray(16));
+ break;
+ case Gateway.Name:
+ gateway = new Name(in);
+ break;
+ default:
+ throw new WireParseException("invalid gateway type");
+ }
+ if (in.remaining() > 0)
+ key = in.readByteArray();
+}
+
+void
+rdataFromString(Tokenizer st, Name origin) throws IOException {
+ precedence = st.getUInt8();
+ gatewayType = st.getUInt8();
+ algorithmType = st.getUInt8();
+ switch (gatewayType) {
+ case Gateway.None:
+ String s = st.getString();
+ if (!s.equals("."))
+ throw new TextParseException("invalid gateway format");
+ gateway = null;
+ break;
+ case Gateway.IPv4:
+ gateway = st.getAddress(Address.IPv4);
+ break;
+ case Gateway.IPv6:
+ gateway = st.getAddress(Address.IPv6);
+ break;
+ case Gateway.Name:
+ gateway = st.getName(origin);
+ break;
+ default:
+ throw new WireParseException("invalid gateway type");
+ }
+ key = st.getBase64(false);
+}
+
+String
+rrToString() {
+ StringBuffer sb = new StringBuffer();
+ sb.append(precedence);
+ sb.append(" ");
+ sb.append(gatewayType);
+ sb.append(" ");
+ sb.append(algorithmType);
+ sb.append(" ");
+ switch (gatewayType) {
+ case Gateway.None:
+ sb.append(".");
+ break;
+ case Gateway.IPv4:
+ case Gateway.IPv6:
+ InetAddress gatewayAddr = (InetAddress) gateway;
+ sb.append(gatewayAddr.getHostAddress());
+ break;
+ case Gateway.Name:
+ sb.append(gateway);
+ break;
+ }
+ if (key != null) {
+ sb.append(" ");
+ sb.append(base64.toString(key));
+ }
+ return sb.toString();
+}
+
+/** Returns the record's precedence. */
+public int
+getPrecedence() {
+ return precedence;
+}
+
+/** Returns the record's gateway type. */
+public int
+getGatewayType() {
+ return gatewayType;
+}
+
+/** Returns the record's algorithm type. */
+public int
+getAlgorithmType() {
+ return algorithmType;
+}
+
+/** Returns the record's gateway. */
+public Object
+getGateway() {
+ return gateway;
+}
+
+/** Returns the record's public key */
+public byte []
+getKey() {
+ return key;
+}
+
+void
+rrToWire(DNSOutput out, Compression c, boolean canonical) {
+ out.writeU8(precedence);
+ out.writeU8(gatewayType);
+ out.writeU8(algorithmType);
+ switch (gatewayType) {
+ case Gateway.None:
+ break;
+ case Gateway.IPv4:
+ case Gateway.IPv6:
+ InetAddress gatewayAddr = (InetAddress) gateway;
+ out.writeByteArray(gatewayAddr.getAddress());
+ break;
+ case Gateway.Name:
+ Name gatewayName = (Name) gateway;
+ gatewayName.toWire(out, null, canonical);
+ break;
+ }
+ if (key != null)
+ out.writeByteArray(key);
+}
+
+}