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 org.xbill.DNS.utils.*; 7d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 8d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** 9d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * SSH Fingerprint - stores the fingerprint of an SSH host key. 10d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 11d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @author Brian Wellington 12d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 13d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 14d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic class SSHFPRecord extends Record { 15d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 16d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenprivate static final long serialVersionUID = -8104701402654687025L; 17d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 18d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic static class Algorithm { 19d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen private Algorithm() {} 20d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 21d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public static final int RSA = 1; 22d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public static final int DSS = 2; 23d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 24d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 25d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic static class Digest { 26d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen private Digest() {} 27d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 28d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public static final int SHA1 = 1; 29d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 30d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 31d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenprivate int alg; 32d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenprivate int digestType; 33d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenprivate byte [] fingerprint; 34d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 35d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenSSHFPRecord() {} 36d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 37d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenRecord 38d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChengetObject() { 39d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return new SSHFPRecord(); 40d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 41d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 42d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** 43d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Creates an SSHFP Record from the given data. 44d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param alg The public key's algorithm. 45d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param digestType The public key's digest type. 46d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param fingerprint The public key's fingerprint. 47d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 48d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic 49d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenSSHFPRecord(Name name, int dclass, long ttl, int alg, int digestType, 50d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen byte [] fingerprint) 51d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen{ 52d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen super(name, Type.SSHFP, dclass, ttl); 53d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.alg = checkU8("alg", alg); 54d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.digestType = checkU8("digestType", digestType); 55d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.fingerprint = fingerprint; 56d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 57d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 58d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenvoid 59d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenrrFromWire(DNSInput in) throws IOException { 60d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen alg = in.readU8(); 61d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen digestType = in.readU8(); 62d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen fingerprint = in.readByteArray(); 63d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 64d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 65d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenvoid 66d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenrdataFromString(Tokenizer st, Name origin) throws IOException { 67d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen alg = st.getUInt8(); 68d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen digestType = st.getUInt8(); 69d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen fingerprint = st.getHex(true); 70d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 71d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 72d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenString 73d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenrrToString() { 74d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen StringBuffer sb = new StringBuffer(); 75d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen sb.append(alg); 76d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen sb.append(" "); 77d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen sb.append(digestType); 78d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen sb.append(" "); 79d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen sb.append(base16.toString(fingerprint)); 80d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return sb.toString(); 81d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 82d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 83d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** Returns the public key's algorithm. */ 84d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic int 85d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChengetAlgorithm() { 86d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return alg; 87d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 88d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 89d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** Returns the public key's digest type. */ 90d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic int 91d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChengetDigestType() { 92d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return digestType; 93d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 94d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 95d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** Returns the fingerprint */ 96d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic byte [] 97d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChengetFingerPrint() { 98d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return fingerprint; 99d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 100d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 101d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenvoid 102d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenrrToWire(DNSOutput out, Compression c, boolean canonical) { 103d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen out.writeU8(alg); 104d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen out.writeU8(digestType); 105d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen out.writeByteArray(fingerprint); 106d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 107d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 108d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 109