1d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen// Copyright (c) 2004 Brian Wellington (bwelling@xbill.org) 2d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 3d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpackage org.xbill.DNS; 4d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 5d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.io.*; 6d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.net.*; 7d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.xbill.DNS.utils.*; 8d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 9d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** 10d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * IPsec Keying Material (RFC 4025) 11d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 12d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @author Brian Wellington 13d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 14d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 15d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic class IPSECKEYRecord extends Record { 16d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 17d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenprivate static final long serialVersionUID = 3050449702765909687L; 18d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 19d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic static class Algorithm { 20d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen private Algorithm() {} 21d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 22d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public static final int DSA = 1; 23d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public static final int RSA = 2; 24d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 25d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 26d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic static class Gateway { 27d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen private Gateway() {} 28d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 29d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public static final int None = 0; 30d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public static final int IPv4 = 1; 31d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public static final int IPv6 = 2; 32d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public static final int Name = 3; 33d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 34d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 35d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenprivate int precedence; 36d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenprivate int gatewayType; 37d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenprivate int algorithmType; 38d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenprivate Object gateway; 39d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenprivate byte [] key; 40d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 41d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenIPSECKEYRecord() {} 42d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 43d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenRecord 44d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChengetObject() { 45d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return new IPSECKEYRecord(); 46d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 47d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 48d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** 49d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Creates an IPSECKEY Record from the given data. 50d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param precedence The record's precedence. 51d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param gatewayType The record's gateway type. 52d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param algorithmType The record's algorithm type. 53d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param gateway The record's gateway. 54d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param key The record's public key. 55d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 56d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic 57d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenIPSECKEYRecord(Name name, int dclass, long ttl, int precedence, 58d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen int gatewayType, int algorithmType, Object gateway, 59d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen byte [] key) 60d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen{ 61d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen super(name, Type.IPSECKEY, dclass, ttl); 62d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.precedence = checkU8("precedence", precedence); 63d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.gatewayType = checkU8("gatewayType", gatewayType); 64d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.algorithmType = checkU8("algorithmType", algorithmType); 65d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen switch (gatewayType) { 66d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen case Gateway.None: 67d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.gateway = null; 68d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen break; 69d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen case Gateway.IPv4: 70d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (!(gateway instanceof InetAddress)) 71d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen throw new IllegalArgumentException("\"gateway\" " + 72d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen "must be an IPv4 " + 73d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen "address"); 74d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.gateway = gateway; 75d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen break; 76d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen case Gateway.IPv6: 77d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (!(gateway instanceof Inet6Address)) 78d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen throw new IllegalArgumentException("\"gateway\" " + 79d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen "must be an IPv6 " + 80d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen "address"); 81d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.gateway = gateway; 82d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen break; 83d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen case Gateway.Name: 84d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (!(gateway instanceof Name)) 85d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen throw new IllegalArgumentException("\"gateway\" " + 86d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen "must be a DNS " + 87d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen "name"); 88d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.gateway = checkName("gateway", (Name) gateway); 89d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen break; 90d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen default: 91d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen throw new IllegalArgumentException("\"gatewayType\" " + 92d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen "must be between 0 and 3"); 93d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 94d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 95d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.key = key; 96d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 97d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 98d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenvoid 99d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenrrFromWire(DNSInput in) throws IOException { 100d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen precedence = in.readU8(); 101d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen gatewayType = in.readU8(); 102d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen algorithmType = in.readU8(); 103d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen switch (gatewayType) { 104d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen case Gateway.None: 105d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen gateway = null; 106d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen break; 107d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen case Gateway.IPv4: 108d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen gateway = InetAddress.getByAddress(in.readByteArray(4)); 109d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen break; 110d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen case Gateway.IPv6: 111d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen gateway = InetAddress.getByAddress(in.readByteArray(16)); 112d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen break; 113d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen case Gateway.Name: 114d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen gateway = new Name(in); 115d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen break; 116d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen default: 117d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen throw new WireParseException("invalid gateway type"); 118d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 119d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (in.remaining() > 0) 120d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen key = in.readByteArray(); 121d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 122d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 123d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenvoid 124d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenrdataFromString(Tokenizer st, Name origin) throws IOException { 125d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen precedence = st.getUInt8(); 126d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen gatewayType = st.getUInt8(); 127d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen algorithmType = st.getUInt8(); 128d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen switch (gatewayType) { 129d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen case Gateway.None: 130d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen String s = st.getString(); 131d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (!s.equals(".")) 132d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen throw new TextParseException("invalid gateway format"); 133d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen gateway = null; 134d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen break; 135d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen case Gateway.IPv4: 136d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen gateway = st.getAddress(Address.IPv4); 137d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen break; 138d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen case Gateway.IPv6: 139d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen gateway = st.getAddress(Address.IPv6); 140d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen break; 141d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen case Gateway.Name: 142d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen gateway = st.getName(origin); 143d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen break; 144d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen default: 145d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen throw new WireParseException("invalid gateway type"); 146d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 147d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen key = st.getBase64(false); 148d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 149d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 150d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenString 151d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenrrToString() { 152d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen StringBuffer sb = new StringBuffer(); 153d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen sb.append(precedence); 154d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen sb.append(" "); 155d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen sb.append(gatewayType); 156d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen sb.append(" "); 157d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen sb.append(algorithmType); 158d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen sb.append(" "); 159d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen switch (gatewayType) { 160d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen case Gateway.None: 161d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen sb.append("."); 162d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen break; 163d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen case Gateway.IPv4: 164d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen case Gateway.IPv6: 165d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen InetAddress gatewayAddr = (InetAddress) gateway; 166d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen sb.append(gatewayAddr.getHostAddress()); 167d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen break; 168d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen case Gateway.Name: 169d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen sb.append(gateway); 170d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen break; 171d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 172d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (key != null) { 173d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen sb.append(" "); 174d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen sb.append(base64.toString(key)); 175d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 176d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return sb.toString(); 177d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 178d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 179d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** Returns the record's precedence. */ 180d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic int 181d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChengetPrecedence() { 182d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return precedence; 183d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 184d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 185d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** Returns the record's gateway type. */ 186d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic int 187d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChengetGatewayType() { 188d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return gatewayType; 189d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 190d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 191d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** Returns the record's algorithm type. */ 192d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic int 193d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChengetAlgorithmType() { 194d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return algorithmType; 195d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 196d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 197d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** Returns the record's gateway. */ 198d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic Object 199d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChengetGateway() { 200d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return gateway; 201d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 202d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 203d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** Returns the record's public key */ 204d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic byte [] 205d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChengetKey() { 206d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return key; 207d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 208d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 209d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenvoid 210d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenrrToWire(DNSOutput out, Compression c, boolean canonical) { 211d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen out.writeU8(precedence); 212d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen out.writeU8(gatewayType); 213d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen out.writeU8(algorithmType); 214d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen switch (gatewayType) { 215d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen case Gateway.None: 216d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen break; 217d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen case Gateway.IPv4: 218d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen case Gateway.IPv6: 219d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen InetAddress gatewayAddr = (InetAddress) gateway; 220d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen out.writeByteArray(gatewayAddr.getAddress()); 221d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen break; 222d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen case Gateway.Name: 223d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen Name gatewayName = (Name) gateway; 224d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen gatewayName.toWire(out, null, canonical); 225d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen break; 226d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 227d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (key != null) 228d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen out.writeByteArray(key); 229d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 230d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 231d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 232