ó
Õò—Vc           @   sX  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 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 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" d „  Z# d  „  Z$ d! „  Z% e& d" k rTe  j' e% ƒ  ƒ n  d S(#   iÿÿÿÿNt   IS_verify_bulkhashsm   Image signing application. This will verify the certificate chain and image signature using openssl commands.s   1.0s   [91ms   [93ms   [95ms   [92ms   [94ms   [96ms   [97ms   [0ms   [1ms   [4ms2   http://www.cisco.com/security/pki/certs/crcam2.cers6   http://www.cisco.com/security/pki/certs/innerspace.cert@   cd85167b3935e27bcc3b0f5fa24c8457882d0bb994f88269a7f72829d957eae9t@   f31e6b39dae6996fdf2045a61be8bd3688a86dfd06c46ce71af4af239f411c56c         C   sj   t  j j d ƒ d k r9 |  t k r1 d GH| GHqf | GHn- |  t k rY |  d | t GHn |  | t GHd  S(   Nt   linuxiÿÿÿÿs   Error Log: s   Error log: (   t   syst   platformt   findt   FAILt   ENDC(   t   colort   string(    (    s   IS_verify_bulkhash_release.pyt   LOG2   s    c         C   sj   t  j j t ƒ r" t  j t ƒ n  t  j j t ƒ rD t  j t ƒ n  t  j j d ƒ rf t  j d ƒ n  d  S(   Ns   ee_pubkey.pem(   t   ost   patht   existst	   root_certt   removet
   subca_cert(   t   args(    (    s   IS_verify_bulkhash_release.pyt   cleanupC   s    c         C   s$   t  j |  ƒ j d k r t St Sd  S(   Ni  (   t   urllibt   urlopent   codet   Falset   True(   t   url(    (    s   IS_verify_bulkhash_release.pyt
   url_existsQ   s    c         C   sn   t  j t |  d ƒ j ƒ  ƒ j ƒ  } | | k r4 t St t d |  d | ƒ t t d |  d | ƒ t Sd  S(   Nt   rbs   Computed sha256sum of s    = s   Expected sha256sum of (	   t   hashlibt   sha256t   opent   readt	   hexdigestR   R   R   R   (   t	   cert_namet   expected_sha256t   cert_sha256(    (    s   IS_verify_bulkhash_release.pyt   verify_cert_sha256\   s    $c         C   s¢   t  |  d ƒ  } | j ƒ  } | j d ƒ d k r˜ d j |  |  ƒ } t j | ƒ \ } } | j d ƒ d k r˜ t t d |  d ƒ t t | ƒ t Sn  Wd  QXt	 S(   Nt   rs   -----BEGIN CERTIFICATE-----iÿÿÿÿs'   openssl x509 -inform der -in {} -out {}t   errors   Failed to convert s   from DER to PEM.(
   R   t   readlineR   t   formatt   commandst   getstatusoutputR   R   R   R   (   R!   t   ft
   first_linet   cmdt   statust   out(    (    s   IS_verify_bulkhash_release.pyt   convert_cert_to_pemj   s    c         C   sI   d } t  |  ƒ r8 |  j d ƒ d } t j |  | ƒ n t t d ƒ | S(   Ns   N/At   /iÿÿÿÿs   Download certificate failed.(   R   t   splitR   t   urlretrieveR   R   (   t   cert_urlR!   (    (    s   IS_verify_bulkhash_release.pyt   download_cert}   s    c         C   sä   d j  t t ƒ } t j | ƒ \ } } | j d ƒ d k sH | d k rf t t d ƒ t t | ƒ d Sd j  t t |  ƒ } t j | ƒ \ } } | j d ƒ d k s± | d k rÏ t t d ƒ t t | ƒ d St t d ƒ | Sd  S(	   Ns   openssl verify -CAfile {} {}R&   iÿÿÿÿi    s2   Verification of root and subca certificate failed.s*   openssl verify -CAfile {} -untrusted {} {}s>   Failed to verify root, subca and end-entity certificate chain.sC   Successfully verified root, subca and end-entity certificate chain.(	   R(   R   R   R)   R*   R   R   R   t   OKGREEN(   t   ee_certR-   R.   R/   (    (    s   IS_verify_bulkhash_release.pyt   verify_3tier_cert_chainŠ   s    !!c         C   sf   d j  |  ƒ } t j | ƒ \ } } | d k rM t t d ƒ t t | ƒ n t t d |  d ƒ | S(   Ns2   openssl x509 -pubkey -noout -in {} > ee_pubkey.pemi    s6   Failed to fetch a public key from x509 PEM certificates'   Successfully fetched a public key from t   .(   R(   R)   R*   R   R   R6   (   R!   R-   R.   R/   (    (    s   IS_verify_bulkhash_release.pyt   fetch_pubkey_from_cert¥   s    c         C   s€   |  j  r d } n d } d j | |  j |  j ƒ } t j | ƒ \ } } | d k r| t t d |  j d ƒ t t | ƒ n  | S(   NR   t   sha512s7   openssl dgst -{} -verify ee_pubkey.pem -signature {} {}i    s#   Failed to verify dgst signature of R9   (   R   R(   t	   signaturet
   image_nameR)   R*   R   R   (   R   t   sha_versionR-   R.   R/   (    (    s   IS_verify_bulkhash_release.pyt   verify_dgst_signatureµ   s    		c         C   sk   d j  |  j |  j |  j ƒ } t j | ƒ \ } } | d k rg t t d |  j d ƒ t t | ƒ n  | S(   Ns]   openssl smime -verify -binary -in {} -inform PEM -content {} -noverify -nointern -certfile {}i    s$   Failed to verify smime signature of R9   (   R(   R<   R=   R7   R)   R*   R   R   (   R   R-   R.   R/   (    (    s   IS_verify_bulkhash_release.pyt   verify_smime_signatureÈ   s    c         C   sM   |  j  d k r t |  ƒ } n+ t |  j ƒ } | d k r= d St |  ƒ } | S(   Nt   smimei    i   (   t   verify_typeR@   R:   R7   R?   (   R   R.   (    (    s   IS_verify_bulkhash_release.pyt   verify_signature×   s    c         C   sk  t  t d t d ƒ t t ƒ a t d k ro t t t ƒ r^ t t ƒ t  t d t d ƒ q} t |  ƒ d  Sn t |  ƒ d  St  t d t	 d ƒ t t	 ƒ a
 t
 d k rì t t
 t ƒ rÛ t t
 ƒ t  t d t
 d ƒ qú t |  ƒ d  Sn t |  ƒ d  St |  j ƒ } | d k r#t |  ƒ d  St |  ƒ } | d k r]t  t d |  j d	 |  j ƒ n  t |  ƒ d  S(
   Ns    Downloading CA certificate from s    ...s   N/As%   Successfully downloaded and verified R9   s#   Downloading SubCA certificate from i    s'   Successfully verified the signature of s    using (   R   R6   t   rel_root_cert_urlR5   R   R$   t   rel_root_cert_sha256R0   R   t   rel_subca_cert_urlR   t   rel_subca_cert_sha256R8   R7   RC   R=   (   R   R.   (    (    s   IS_verify_bulkhash_release.pyt   command_handlerå   s:    






"
c         C   sÍ   |  j  d  k rC t j j |  j  ƒ sC t t d |  j  d ƒ d Sn  |  j d  k r† t j j |  j ƒ s† t t d |  j d ƒ d Sn  |  j d  k rÉ t j j |  j ƒ sÉ t t d |  j d ƒ d Sn  d S(   Nt   's   ' does not existi   i    (	   R=   t   NoneR   R   R   R   R   R<   R7   (   R   (    (    s   IS_verify_bulkhash_release.pyt   verify_parser_options  s    c          C   sO  t  j d t d t ƒ }  |  j d d d d d d t d ƒ|  j d	 d
 d d d d d t d d ƒ|  j d d d d d d d t d d ƒ|  j d d d d d d d t d d ƒ|  j d d d d d  g d! d g d d" d t d d# ƒ|  j d t ƒ } | j d$ d d% d d& d d' ƒ| j d( d d% d d) d d* ƒ|  j	 d+ t
 ƒ |  S(,   Nt   progt   descriptions   -Vs	   --versiont   actiont   versions   %(prog)s (version t   )s   -es	   --ee_certt   metavars   <ee_cert_name>t   destR7   t   requiredt   helps2   Local path to End-entity certificate in PEM formats   -ss   --signatures   <signature_file>R<   s#   Filename containing image signatures   -is   --image_names   <image_name>R=   s
   Image names   -vs   --verify_typet   choicest   dgstRA   t   defaultRB   s   Verify type: dgst|smimes   -sha256t
   store_trueR   s9   Using sha256 hashing algorithm (required only for 'dgst')s   -sha512R;   s9   Using sha512 hashing algorithm (required only for 'dgst')t   func(   t   argparset   ArgumentParsert	   PROG_NAMEt   MENU_MAIN_DESCt   add_argumentt   IS_VERIFY_BULKHASH_VERSIONR   R   t   add_mutually_exclusive_groupt   set_defaultsRH   (   t   pmaint   group_input(    (    s   IS_verify_bulkhash_release.pyt
   arg_parser,  s    $(((7c          C   s<   t  ƒ  }  |  j ƒ  } t | ƒ d k r+ d S| j | ƒ d S(   Ni    i   (   Rd   t
   parse_argsRK   RY   (   Rb   R   (    (    s   IS_verify_bulkhash_release.pyt   mainM  s    	t   __main__((   R   R   RZ   R)   R   R   R\   R]   R_   R   t   WARNINGt   HEADERR6   t   OKBLUEt   OKCYANt   OKWHITER   t   BOLDt	   UNDERLINERD   RF   RE   RG   R   R   R   R$   R0   R5   R8   R:   R?   R@   RC   RH   RK   Rd   Rf   t   __name__t   exit(    (    (    s   IS_verify_bulkhash_release.pyt   <module>   sN   												3		!	