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