70 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			70 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| (function (exports) {
 | |
| 'use strict';
 | |
| 
 | |
| // RFC 6844
 | |
| // Explanation: https://tools.ietf.org/html/rfc6844#section-3
 | |
| // Binary Format: https://tools.ietf.org/html/rfc6844#section-5
 | |
| // Real-world Usage: https://support.dnsimple.com/articles/caa-record/
 | |
| 
 | |
| // A Certification Authority Authorization (CAA) record is used to specify which
 | |
| // certificate authorities (CAs) are allowed to issue certificates for a domain.
 | |
| 
 | |
| // Value    Meaning/Use
 | |
| //
 | |
| // Flag     An unsigned integer between 0-255.
 | |
| //          It is currently used to represent the critical flag, that has a
 | |
| //          specific meaning per RFC 6844
 | |
| // Tag      An ASCII string that represents the identifier of the property
 | |
| //          represented by the record.
 | |
| // Value    The value associated with the tag.
 | |
| 
 | |
| // The RFC currently defines 3 available tags:
 | |
| //
 | |
| // - issue:     explicity authorizes a single certificate authority to issue a
 | |
| //              certificate (any type) for the hostname.
 | |
| // - issuewild: explicity authorizes a single certificate authority to issue a
 | |
| //              wildcard certificate (and only wildcard) for the hostname.
 | |
| // - iodef:     specifies an URL to which a certificate authority may report
 | |
| //              policy violations.
 | |
| 
 | |
| exports.DNS_PACKER_TYPE_CAA = function (ab, dv, total, record) {
 | |
|   if ('number' !== typeof record.flag || isNaN(record.flag) || record.flag < 0 || record.flag > 255) {
 | |
|     console.log(record);
 | |
|     throw new Error("bad CAA flag:", record.flag);
 | |
|   }
 | |
|   if ('string' !== typeof record.tag || !record.tag || record.tag.length > 255) {
 | |
|     throw new Error("bad CAA tag:", record.tag);
 | |
|   }
 | |
|   if ('string' !== typeof record.value || !record.value) {
 | |
|     throw new Error("bad CAA value:", record.value);
 | |
|   }
 | |
| 
 | |
|   // RDLEN = flag (1 byte) + taglen (1 byte) + tagstr (taglen bytes) + valuestr (valuelen bytes)
 | |
|   dv.setUint16(total, 1 + 1 + record.tag.length + record.value.length, false);
 | |
|   total += 2;
 | |
| 
 | |
|   // FLAG
 | |
|   dv.setUint8(total, record.flag, false);
 | |
|   total += 1;
 | |
| 
 | |
|   // TAG LENGTH
 | |
|   dv.setUint8(total, record.tag.length, false);
 | |
|   total += 1;
 | |
| 
 | |
|   // TAG
 | |
|   record.tag.split('').forEach(function (ch) {
 | |
|     dv.setUint8(total, ch.charCodeAt(0), false);
 | |
|     total += 1;
 | |
|   });
 | |
| 
 | |
|   // VALUE
 | |
|   record.value.split('').forEach(function (ch) {
 | |
|     dv.setUint8(total, ch.charCodeAt(0), false);
 | |
|     total += 1;
 | |
|   });
 | |
| 
 | |
|   return total;
 | |
| };
 | |
| 
 | |
| }('undefined' !== typeof window ? window : exports));
 |