blob: 7eb29560518a15688d90fd111bfcc3e439136cbd [file] [log] [blame]
// 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);
}
}