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