| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236 |
- <?php
- /*
- * License Information:
- *
- * Net_DNS: A resolver library for PHP
- * Copyright (c) 2002-2003 Eric Kilfoil eric@ypass.net
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
- define('NET_DNS_DEFAULT_ALGORITHM', 'hmac-md5.sig-alg.reg.int');
- define('NET_DNS_DEFAULT_FUDGE', 300);
- /* Net_DNS_RR_TSIG definition {{{ */
- /**
- * A representation of a resource record of type <b>TSIG</b>
- *
- * @package Net_DNS
- */
- class Net_DNS_RR_TSIG extends Net_DNS_RR
- {
- /* class variable definitions {{{ */
- var $name;
- var $type;
- var $class;
- var $ttl;
- var $rdlength;
- var $rdata;
- var $time_signed;
- var $fudge;
- var $mac_size;
- var $mac;
- var $original_id;
- var $error;
- var $other_len;
- var $other_data;
- var $key;
- /* }}} */
- /* class constructor - RR(&$rro, $data, $offset = '') {{{ */
- function Net_DNS_RR_TSIG(&$rro, $data, $offset = '')
- {
- $this->name = $rro->name;
- $this->type = $rro->type;
- $this->class = $rro->class;
- $this->ttl = $rro->ttl;
- $this->rdlength = $rro->rdlength;
- $this->rdata = $rro->rdata;
- if ($offset) {
- if ($this->rdlength > 0) {
- list($alg, $offset) = Net_DNS_Packet::dn_expand($data, $offset);
- $this->algorithm = $alg;
- $d = unpack("\@$offset/nth/Ntl/nfudge/nmac_size", $data);
- $time_high = $d['th'];
- $time_low = $d['tl'];
- $this->time_signed = $time_low;
- $this->fudge = $d['fudge'];
- $this->mac_size = $d['mac_size'];
- $offset += 10;
- $this->mac = substr($data, $offset, $this->mac_size);
- $offset += $this->mac_size;
- $d = unpack("@$offset/noid/nerror/nolen", $data);
- $this->original_id = $d['oid'];
- $this->error = $d['error'];
- $this->other_len = $d['olen'];
- $offset += 6;
- $odata = substr($data, $offset, $this->other_len);
- $d = unpack('nodata_high/Nodata_low', $odata);
- $this->other_data = $d['odata_low'];
- }
- } else {
- if (strlen($data) && preg_match('/^(.*)$/', $data, $regs)) {
- $this->key = $regs[1];
- }
- $this->algorithm = NET_DNS_DEFAULT_ALGORITHM;
- $this->time_signed = time();
- $this->fudge = NET_DNS_DEFAULT_FUDGE;
- $this->mac_size = 0;
- $this->mac = '';
- $this->original_id = 0;
- $this->error = 0;
- $this->other_len = 0;
- $this->other_data = '';
- // RFC 2845 Section 2.3
- $this->class = 'ANY';
- }
- }
- /* }}} */
- /* Net_DNS_RR_TSIG::rdatastr() {{{ */
- function rdatastr()
- {
- $error = $this->error;
- if (! $error) {
- $error = 'UNDEFINED';
- }
- if (strlen($this->algorithm)) {
- $rdatastr = $this->algorithm . '. ' . $this->time_signed . ' ' .
- $this->fudge . ' ';
- if ($this->mac_size && strlen($this->mac)) {
- $rdatastr .= ' ' . $this->mac_size . ' ' . base64_encode($this->mac);
- } else {
- $rdatastr .= ' 0 ';
- }
- $rdatastr .= ' ' . $this->original_id . ' ' . $error;
- if ($this->other_len && strlen($this->other_data)) {
- $rdatastr .= ' ' . $this->other_data;
- } else {
- $rdatastr .= ' 0 ';
- }
- } else {
- $rdatastr = '; no data';
- }
- return($rdatastr);
- }
- /* }}} */
- /* Net_DNS_RR_TSIG::rr_rdata($packet, $offset) {{{ */
- function rr_rdata($packet, $offset)
- {
- $rdata = '';
- $sigdata = '';
- if (strlen($this->key)) {
- $key = $this->key;
- $key = ereg_replace(' ', '', $key);
- $key = base64_decode($key);
- $newpacket = $packet;
- $newoffset = $offset;
- array_pop($newpacket->additional);
- $newpacket->header->arcount--;
- $newpacket->compnames = array();
- /*
- * Add the request MAC if present (used to validate responses).
- */
- if (isset($this->request_mac)) {
- $sigdata .= pack('H*', $this->request_mac);
- }
- $sigdata .= $newpacket->data();
- /*
- * Don't compress the record (key) name.
- */
- $tmppacket = new Net_DNS_Packet;
- $sigdata .= $tmppacket->dn_comp(strtolower($this->name), 0);
- $sigdata .= pack('n', Net_DNS::classesbyname(strtoupper($this->class)));
- $sigdata .= pack('N', $this->ttl);
- /*
- * Don't compress the algorithm name.
- */
- $tmppacket->compnames = array();
- $sigdata .= $tmppacket->dn_comp(strtolower($this->algorithm), 0);
- $sigdata .= pack('nN', 0, $this->time_signed);
- $sigdata .= pack('n', $this->fudge);
- $sigdata .= pack('nn', $this->error, $this->other_len);
- if (strlen($this->other_data)) {
- $sigdata .= pack('nN', 0, $this->other_data);
- }
- $this->mac = mhash(MHASH_MD5, $sigdata, $key);
- $this->mac_size = strlen($this->mac);
- /*
- * Don't compress the algorithm name.
- */
- unset($tmppacket);
- $tmppacket = new Net_DNS_Packet;
- $rdata .= $tmppacket->dn_comp(strtolower($this->algorithm), 0);
- $rdata .= pack('nN', 0, $this->time_signed);
- $rdata .= pack('nn', $this->fudge, $this->mac_size);
- $rdata .= $this->mac;
- $rdata .= pack('nnn',$packet->header->id,
- $this->error,
- $this->other_len);
- if ($this->other_data) {
- $rdata .= pack('nN', 0, $this->other_data);
- }
- }
- return($rdata);
- }
- /* }}} */
- /* Net_DNS_RR_TSIG::error() {{{ */
- function error()
- {
- if ($this->error != 0) {
- $rcode = Net_DNS::rcodesbyval($error);
- }
- return $rcode;
- }
- /* }}} */
- }
- /* }}} */
- /* VIM settings {{{
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * soft-stop-width: 4
- * c indent on
- * expandtab on
- * End:
- * vim600: sw=4 ts=4 sts=4 cindent fdm=marker et
- * vim<600: sw=4 ts=4
- * }}} */
- ?>
|