Home | History | Annotate | Download | only in DNS
      1 // Copyright (c) 1999-2004 Brian Wellington (bwelling (at) xbill.org)
      2 
      3 package org.xbill.DNS;
      4 
      5 import java.io.*;
      6 import org.xbill.DNS.utils.*;
      7 
      8 /**
      9  * Transport Layer Security Authentication
     10  *
     11  * @author Brian Wellington
     12  */
     13 
     14 public class TLSARecord extends Record {
     15 
     16 private static final long serialVersionUID = 356494267028580169L;
     17 
     18 public static class CertificateUsage {
     19 	private CertificateUsage() {}
     20 
     21 	public static final int CA_CONSTRAINT = 0;
     22 	public static final int SERVICE_CERTIFICATE_CONSTRAINT = 1;
     23 	public static final int TRUST_ANCHOR_ASSERTION = 2;
     24 	public static final int DOMAIN_ISSUED_CERTIFICATE = 3;
     25 }
     26 
     27 public static class Selector {
     28 	private Selector() {}
     29 
     30 	/**
     31 	 * Full certificate; the Certificate binary structure defined in
     32 	 * [RFC5280]
     33 	 */
     34 	public static final int FULL_CERTIFICATE = 0;
     35 
     36 	/**
     37 	 * SubjectPublicKeyInfo; DER-encoded binary structure defined in
     38 	 * [RFC5280]
     39 	 */
     40 	public static final int SUBJECT_PUBLIC_KEY_INFO = 1;
     41 }
     42 
     43 public static class MatchingType {
     44 	private MatchingType() {}
     45 
     46 	/** Exact match on selected content */
     47 	public static final int EXACT = 0;
     48 
     49 	/** SHA-256 hash of selected content [RFC6234] */
     50 	public static final int SHA256 = 1;
     51 
     52 	/** SHA-512 hash of selected content [RFC6234] */
     53 	public static final int SHA512 = 2;
     54 }
     55 
     56 private int certificateUsage;
     57 private int selector;
     58 private int matchingType;
     59 private byte [] certificateAssociationData;
     60 
     61 TLSARecord() {}
     62 
     63 Record
     64 getObject() {
     65 	return new TLSARecord();
     66 }
     67 
     68 /**
     69  * Creates an TLSA Record from the given data
     70  * @param certificateUsage The provided association that will be used to
     71  * match the certificate presented in the TLS handshake.
     72  * @param selector The part of the TLS certificate presented by the server
     73  * that will be matched against the association data.
     74  * @param matchingType How the certificate association is presented.
     75  * @param certificateAssociationData The "certificate association data" to be
     76  * matched.
     77  */
     78 public
     79 TLSARecord(Name name, int dclass, long ttl,
     80 	   int certificateUsage, int selector, int matchingType,
     81 	   byte [] certificateAssociationData)
     82 {
     83 	super(name, Type.TLSA, dclass, ttl);
     84 	this.certificateUsage = checkU8("certificateUsage", certificateUsage);
     85 	this.selector = checkU8("selector", selector);
     86 	this.matchingType = checkU8("matchingType", matchingType);
     87 	this.certificateAssociationData = checkByteArrayLength(
     88 						"certificateAssociationData",
     89 						certificateAssociationData,
     90 						0xFFFF);
     91 }
     92 
     93 void
     94 rrFromWire(DNSInput in) throws IOException {
     95 	certificateUsage = in.readU8();
     96 	selector = in.readU8();
     97 	matchingType = in.readU8();
     98 	certificateAssociationData = in.readByteArray();
     99 }
    100 
    101 void
    102 rdataFromString(Tokenizer st, Name origin) throws IOException {
    103 	certificateUsage = st.getUInt8();
    104 	selector = st.getUInt8();
    105 	matchingType = st.getUInt8();
    106 	certificateAssociationData = st.getHex();
    107 }
    108 
    109 /** Converts rdata to a String */
    110 String
    111 rrToString() {
    112 	StringBuffer sb = new StringBuffer();
    113 	sb.append(certificateUsage);
    114 	sb.append(" ");
    115 	sb.append(selector);
    116 	sb.append(" ");
    117 	sb.append(matchingType);
    118 	sb.append(" ");
    119 	sb.append(base16.toString(certificateAssociationData));
    120 
    121 	return sb.toString();
    122 }
    123 
    124 void
    125 rrToWire(DNSOutput out, Compression c, boolean canonical) {
    126 	out.writeU8(certificateUsage);
    127 	out.writeU8(selector);
    128 	out.writeU8(matchingType);
    129 	out.writeByteArray(certificateAssociationData);
    130 }
    131 
    132 /** Returns the certificate usage of the TLSA record */
    133 public int
    134 getCertificateUsage() {
    135 	return certificateUsage;
    136 }
    137 
    138 /** Returns the selector of the TLSA record */
    139 public int
    140 getSelector() {
    141 	return selector;
    142 }
    143 
    144 /** Returns the matching type of the TLSA record */
    145 public int
    146 getMatchingType() {
    147 	return matchingType;
    148 }
    149 
    150 /** Returns the certificate associate data of this TLSA record */
    151 public final byte []
    152 getCertificateAssociationData() {
    153 	return certificateAssociationData;
    154 }
    155 
    156 }
    157