ÿØÿà JFIF      ÿÛ „ 	 ( %!1!%)+//.383,7(-.+



-%%-////---/-.+/--+------/------/--0+--/-/-----.-----ÿÀ  ¥2" ÿÄ               ÿÄ J  	     ! 1AQ"aq2‘#BR‚¡ÁÑ3br’¢±Âð$CSƒ²á4c“%DsÓñÿÄ              ÿÄ *        !1AQa‘"2q3±ð#b¡ÿÚ   ? ¼QxJQaÍuò¸Zö Úü8,ÐÚú
"SSn<rçù–´âE—^ªBÖ9À\†¸ÔÁT­ÃÛ5
ëd´³Í#Ý;Þ38œî ¶H£M:wÎ3…³…âpÔF&‚FK¸9„â4àGEõªfÿ ‘ñ(ßw­pŽF|È¥ù®häðÍÑ¶¹‘[ÒinÙW¶ùñY˜Q{›K"išÒ[Ú8žë\F¹@-?v"ÔU”,ìöžkÿ {I‡£šÍ?e
ríV
..............................................................................................................................................................................
.............................................................................                                                  
                                                                                                                                                                                     ÿØÿà JFIF      ÿÛ „ 	 ( %!1!%)+//.383,7(-.+



-%%-////---/-.+/--+------/------/--0+--/-/-----.-----ÿÀ  ¥2" ÿÄ               ÿÄ J  	     ! 1AQ"aq2‘#BR‚¡ÁÑ3br’¢±Âð$CSƒ²á4c“%DsÓñÿÄ              ÿÄ *        !1AQa‘"2q3±ð#b¡ÿÚ   ? ¼QxJQaÍuò¸Zö Úü8,ÐÚú
"SSn<rçù–´âE—^ªBÖ9À\†¸ÔÁT­ÃÛ5
ëd´³Í#Ý;Þ38œî ¶H£M:wÎ3…³…âpÔF&‚FK¸9„â4àGEõªfÿ ‘ñ(ßw­pŽF|È¥ù®häðÍÑ¶¹‘[ÒinÙW¶ùñY˜Q{›K"išÒ[Ú8žë\F¹@-?v"ÔU”,ìöžkÿ {I‡£šÍ?e
ríV
..............................................................................................................................................................................
.............................................................................                                                  
                                                                                                                                                                                     3
bW9                 @   sH  d Z ddlmZ ddlZddlZddlZddlZddlZddl	Zddl
ZddlZddlZddlZddlmZ G dd dejjZG dd	 d	ejjZdZd
ZdZdZdZdZdZdZdZdZdZdZdZ dZ!eeeeeeeeeeeee e!dZ"e#dd e"j$ D Z%dd Z&dd Z'dd Z(dDd d!Z)dEd"d#Z*d$d% Z+d&d' Z,d(d) Z-d*d+ Z.d,d- Z/d.d/ Z0d0d1 Z1d2d3 Z2d4d5 Z3d6d7 Z4d8d9 Z5dFd:d;Z6dGd<d=Z7d>d? Z8y(ddl9Z:ddl;Z:ddl<Z:e7Z=e6Z>d@Z?W n" e@k
r   e8Z=e8Z>dAZ?Y nX y8ddlAZAddlBZAddlCZAddlDZAd@ZEG dBdC dCeFZGW n e@k
rB   dAZEY nX dS )Hz.Common DNSSEC-related functions and constants.    )BytesION   )string_typesc               @   s   e Zd ZdZdS )UnsupportedAlgorithmz&The DNSSEC algorithm is not supported.N)__name__
__module____qualname____doc__ r
   r
   /usr/lib/python3.6/dnssec.pyr   !   s   r   c               @   s   e Zd ZdZdS )ValidationFailurez The DNSSEC signature is invalid.N)r   r   r   r	   r
   r
   r
   r   r   &   s   r                        
                  )RSAMD5DHDSAECCRSASHA1DSANSEC3SHA1RSASHA1NSEC3SHA1	RSASHA256	RSASHA512INDIRECTECDSAP256SHA256ECDSAP384SHA384
PRIVATEDNS
PRIVATEOIDc             c   s   | ]\}}||fV  qd S )Nr
   ).0xyr
   r
   r   	<genexpr>N   s    r+   c             C   s"   t j| j }|dkrt| }|S )z:Convert text into a DNSSEC algorithm value
    @rtype: intN)_algorithm_by_textgetupperint)textvaluer
   r
   r   algorithm_from_textQ   s    r2   c             C   s   t j| }|dkrt| }|S )z;Convert a DNSSEC algorithm value to text
    @rtype: stringN)_algorithm_by_valuer-   str)r1   r0   r
   r
   r   algorithm_to_text[   s    
r5   c             C   s   t  }| j||d |j S )N)origin)r   to_wiregetvalue)recordr6   sr
   r
   r   	_to_rdatae   s    r;   c             C   s   t | |}t|}| jtkr0|d d> |d	  S d}x<tt|d D ](}||d|  d> |d| d   7 }qFW t|d dkr||t|d  d> 7 }||d? d@ 7 }|d@ S d S )
Nr   r   r   r   r      i  )r;   	bytearray	algorithmr   rangelen)keyr6   rdataZtotalir
   r
   r   key_idk   s    

rF   c             C   s   |j  dkr d}tjjd  }n,|j  dkr@d}tjjd  }ntd| t| trdtjj| |} |j	| j
 j  |j	t|| |j }tjdt||j|| }tjjtjjtjj|dt|S )NSHA1r   SHA256r   zunsupported algorithm "%s"z!HBBr   )r.   dnshashhashesr   
isinstancer   name	from_textupdateZcanonicalizer7   r;   digeststructpackrF   r@   rD   Z	from_wire
rdataclassIN	rdatatypeZDSrB   )rM   rC   r@   r6   ZdsalgrJ   rP   Zdsrdatar
   r
   r   make_ds{   s    
rV   c             C   s   g }| j |j}|d krd S t|tjjrZy|jtjjtj	j
}W q^ tk
rV   d S X n|}x0|D ](}|j|jkrdt||jkrd|j| qdW |S )N)r-   signerrL   rI   ZnodeZNodeZfind_rdatasetrS   rT   rU   ZDNSKEYKeyErrorr@   rF   Zkey_tagappend)keysrrsigZcandidate_keysr1   rdatasetrD   r
   r
   r   _find_candidate_keys   s     

r]   c             C   s   | t ttttfkS )N)r   r   r    r!   r"   )r@   r
   r
   r   _is_rsa   s    r^   c             C   s   | t tfkS )N)r   r   )r@   r
   r
   r   _is_dsa   s    r_   c             C   s   t o| ttfkS )N)_have_ecdsar$   r%   )r@   r
   r
   r   	_is_ecdsa   s    ra   c             C   s   | t kS )N)r   )r@   r
   r
   r   _is_md5   s    rb   c             C   s   | t tttfkS )N)r   r   r   r    )r@   r
   r
   r   _is_sha1   s    rc   c             C   s   | t tfkS )N)r!   r$   )r@   r
   r
   r   
_is_sha256   s    rd   c             C   s   | t kS )N)r%   )r@   r
   r
   r   
_is_sha384   s    re   c             C   s   | t kS )N)r"   )r@   r
   r
   r   
_is_sha512   s    rf   c             C   s~   t | rtjjd  S t| r,tjjd  S t| rBtjjd  S t| rXtjjd  S t| rntjjd  S td|  d S )NZMD5rG   rH   ZSHA384ZSHA512zunknown hash for algorithm %u)	rb   rI   rJ   rK   rc   rd   re   rf   r   )r@   r
   r
   r   
_make_hash   s    rg   c          	   C   s   t | rddddddddg}ndt| r6dd	d
ddg}nLt| rVdddddd
dddg	}n,t| rvdddddd
ddd
g	}ntd|  t|}t| j}dgd| | g d|d g d|g | ddg d|g }tj	dt| f| S )N*      H      r   r   r   +   r   r      `   r   e   r   zunknown algorithm %u0   r   r   r   z!%dB)
rb   rc   rd   rf   r   rB   rg   Zdigest_sizerQ   rR   )r@   ZoidZolenZdlenZidbytesr
   r
   r   _make_algorithm_id   s    
<rq   c       )      C   s  t |trtjj|tjj}xt||D ]}|s<tdt | trX| d }| d }n
| j}| }|dkrrt	j	 }|j
|k rtd|j|krtdt|j}t|jr`|j}	tjd|	dd \}
|	dd }	|
dkr tjd|	dd	 \}
|	d	d }	|	d|
 }|	|
d }t|d
 }tjjjtjjj|tjjj|f}tjjj|jf}nt|jrj|j}	tjd|	dd \}|	dd }	d|d
  }|	dd }|	dd }	|	d| }|	|d }	|	d| }|	|d }	|	d| }tjjjtjjj|tjjj|tjjj|tjjj|f}tjd|jdd \}}tjjj|tjjj|f}nt|jrX|jtkrtj j!}d}n"|jt"krtj j#}d}ntd|j}	tjjj|	d| }tjjj|	||d	  }tj$j%|j&|||j'}tj(j)j*||}t+||}|jd| }|j|d }tjj,tjjj|tjjj|}ntd|j |j-t.||dd  |j-|j/j0| |j1t|d k r|j2|j1d d } tjjd| }|j0|}!tj3d|j4|j5|j6}"t7|}#xP|#D ]H}$|j-|! |j-|" |$j0|}%tj3dt|%}&|j-|& |j-|% qW |j8 }'t|jrt9|j|' }'|d
 t|' d }(tj3dd	|( d  fddgdg|(  dg  |' }'n(t|jst|jrntd|j |j:|'|r*dS q*W tddS )a  Validate an RRset against a single signature rdata

    The owner name of the rrsig is assumed to be the same as the owner name
    of the rrset.

    @param rrset: The RRset to validate
    @type rrset: dns.rrset.RRset or (dns.name.Name, dns.rdataset.Rdataset)
    tuple
    @param rrsig: The signature rdata
    @type rrsig: dns.rrset.Rdata
    @param keys: The key dictionary.
    @type keys: a dictionary keyed by dns.name.Name with node or rdataset
    values
    @param origin: The origin to use for relative names
    @type origin: dns.name.Name or None
    @param now: The time to use when validating the signatures.  The default
    is the current time.
    @type now: int
    zunknown keyr   r   NZexpiredznot yet validz!Bz!Hr   r   @      z!20s20s    rp   zunknown ECDSA curvezunknown algorithm %u   *z!HHIr   z!%dB   zverify failure);rL   r   rI   rM   rN   rootr]   r   tupletimeZ
expirationZ	inceptionrg   r@   r^   rC   rQ   unpackrB   CryptoZ	PublicKeyZRSAZ	constructUtilnumberbytes_to_longZ	signaturer_   r   ra   r$   ecdsaZcurvesZNIST256pr%   ZNIST384pZellipticcurveZPointcurveorderrZ   ZVerifyingKeyZfrom_public_pointECKeyWrapperZ	SignaturerO   r;   rW   Zto_digestableZlabelssplitrR   ZrdtypeZrdclassZoriginal_ttlsortedrP   rq   verify))rrsetr[   rZ   r6   nowZcandidate_keyrrnamer\   rJ   ZkeyptrZbytes_Zrsa_eZrsa_nZkeylenpubkeysigtZoctetsZdsa_qZdsa_pZdsa_gZdsa_yZdsa_rZdsa_sr   key_lenr)   r*   ZpointZverifying_keyrr:   suffixZ	rrnamebufZrrfixedZrrlistZrrZrrdataZrrlenrP   Zpadlenr
   r
   r   _validate_rrsig   s    














"r   c       	      C   s   t |trtjj|tjj}t | tr0| d }n| j}t |trR|d }|d }n
|j}|}|j|}|j|}||krtdx6|D ].}yt	| |||| dS  tk
r   Y qX qW tddS )ah  Validate an RRset

    @param rrset: The RRset to validate
    @type rrset: dns.rrset.RRset or (dns.name.Name, dns.rdataset.Rdataset)
    tuple
    @param rrsigset: The signature RRset
    @type rrsigset: dns.rrset.RRset or (dns.name.Name, dns.rdataset.Rdataset)
    tuple
    @param keys: The key dictionary.
    @type keys: a dictionary keyed by dns.name.Name with node or rdataset
    values
    @param origin: The origin to use for relative names
    @type origin: dns.name.Name or None
    @param now: The time to use when validating the signatures.  The default
    is the current time.
    @type now: int
    r   r   zowner names do not matchNzno RRSIGs validated)
rL   r   rI   rM   rN   rx   ry   Zchoose_relativityr   r   )	r   ZrrsigsetrZ   r6   r   r   Z	rrsignameZrrsigrdatasetr[   r
   r
   r   	_validatex  s*    








r   c              O   s   t dd S )Nz#DNSSEC validation requires pycrypto)NotImplementedError)argskwargsr
   r
   r   _need_pycrypto  s    r   TFc               @   s   e Zd Zdd Zdd ZdS )r   c             C   s   || _ || _d S )N)rC   r   )selfrC   r   r
   r
   r   __init__  s    zECKeyWrapper.__init__c             C   s   t jjj|}| jjj||S )N)r|   r}   r~   r   rC   r   Zverifies)r   rP   r   Zdiglongr
   r
   r   r     s    zECKeyWrapper.verifyN)r   r   r   r   r   r
   r
   r
   r   r     s   r   )N)N)NN)NN)Hr	   ior   rQ   rz   Zdns.exceptionrI   Zdns.hashZdns.nameZdns.nodeZdns.rdatasetZ	dns.rdataZdns.rdatatypeZdns.rdataclassZ_compatr   Z	exceptionZDNSExceptionr   r   r   r   r   r   r   r   r    r!   r"   r$   r%   r#   r&   r'   r,   dictitemsr3   r2   r5   r;   rF   rV   r]   r^   r_   ra   rb   rc   rd   re   rf   rg   rq   r   r   r   ZCrypto.PublicKey.RSAr|   ZCrypto.PublicKey.DSAZCrypto.Util.numberZvalidateZvalidate_rrsigZ_have_pycryptoImportErrorr   Zecdsa.ecdsaZecdsa.ellipticcurveZ
ecdsa.keysr`   objectr   r
   r
   r
   r   <module>   s   




 
0

