ó
›t0^c           @   s
  d  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 m Z m	 Z	 m
 Z
 m Z m Z d e f d „  ƒ  YZ d e	 j f d „  ƒ  YZ d e	 j f d	 „  ƒ  YZ d
 e	 j f d „  ƒ  YZ d e f d „  ƒ  YZ e d k re e j ƒ  ƒ n  d S(   s   JSON Web Signature.iÿÿÿÿN(   t   b64t   errorst	   json_utilt   jwat   jwkt   utilt	   MediaTypec           B   s2   e  Z d  Z d Z e d „  ƒ Z e d „  ƒ Z RS(   s    MediaType field encoder/decoder.s   application/c         C   s9   d | k r5 d | k r* t  j d ƒ ‚ n  |  j | S| S(   s   Decoder.t   /t   ;s   Unexpected semi-colon(   R   t   DeserializationErrort   PREFIX(   t   clst   value(    (    s.   /usr/lib/python2.7/site-packages/josepy/jws.pyt   decode   s
    c         C   s9   d | k r5 | j  |  j ƒ s$ t ‚ | t |  j ƒ S| S(   s   Encoder.R   (   t
   startswithR
   t   AssertionErrort   len(   R   R   (    (    s.   /usr/lib/python2.7/site-packages/josepy/jws.pyt   encode   s    (   t   __name__t
   __module__t   __doc__R
   t   classmethodR   R   (    (    (    s.   /usr/lib/python2.7/site-packages/josepy/jws.pyR      s   
t   Headerc           B   s   e  Z d  Z e j d d e j j d e ƒZ	 e j d d e ƒZ
 e j d d e j j d e ƒZ e j d d e ƒZ e j d d e ƒZ e j d d e d	 d ƒZ e j d
 d e j d e ƒZ e j d d e j d e ƒZ e j d d e j d e j d e ƒZ e j d d e j d e j d e ƒZ e j d d e d	 d ƒZ d „  Z d „  Z d „  Z e j d „  ƒ Z e j d „  ƒ Z e j d „  ƒ Z RS(   s6  JOSE Header.

    .. warning:: This class supports **only** Registered Header
        Parameter Names (as defined in section 4.1 of the
        protocol). If you need Public Header Parameter Names (4.2)
        or Private Header Parameter Names (4.3), you must subclass
        and override :meth:`from_json` and :meth:`to_partial_json`
        appropriately.

    .. warning:: This class does not support any extensions through
        the "crit" (Critical) Header Parameter (4.1.11) and as a
        conforming implementation, :meth:`from_json` treats its
        occurrence as an error. Please subclass if you seek for
        a different behaviour.

    :ivar x5tS256: "x5t#S256"
    :ivar str typ: MIME Media Type, inc. :const:`MediaType.PREFIX`.
    :ivar str cty: Content-Type, inc. :const:`MediaType.PREFIX`.

    t   algt   decodert	   omitemptyt   jkuR   t   kidt   x5ut   x5ct   defaultt   x5ts   x5t#S256t   typt   encodert   ctyt   critc            s&   t  ‡  f d †  t j ˆ  j ƒ Dƒ ƒ S(   s4   Fields that would not be omitted in the JSON object.c         3   sB   |  ]8 \ } } | j  t ˆ  | ƒ ƒ s | t ˆ  | ƒ f Vq d  S(   N(   t   omitt   getattr(   t   .0t   namet   field(   t   self(    s.   /usr/lib/python2.7/site-packages/josepy/jws.pys	   <genexpr>N   s   	(   t   dictt   sixt	   iteritemst   _fields(   R)   (    (   R)   s.   /usr/lib/python2.7/site-packages/josepy/jws.pyt   not_omittedL   s    c         C   sŒ   t  | t |  ƒ ƒ s3 t d j t | ƒ ƒ ƒ ‚ n  |  j ƒ  } | j ƒ  } t | ƒ j | ƒ ro t d ƒ ‚ n  | j | ƒ t |  ƒ |   S(   Ns   Header cannot be added to: {0}s+   Addition of overlapping headers not defined(   t
   isinstancet   typet	   TypeErrort   formatR.   t   sett   intersectiont   update(   R)   t   othert   not_omitted_selft   not_omitted_other(    (    s.   /usr/lib/python2.7/site-packages/josepy/jws.pyt   __add__R   s    	c         C   s(   |  j  d k r! t j d ƒ ‚ n  |  j  S(   sí   Find key based on header.

        .. todo:: Supports only "jwk" header parameter lookup.

        :returns: (Public) key found in the header.
        :rtype: .JWK

        :raises josepy.errors.Error: if key could not be found

        s   No key foundN(   R   t   NoneR   t   Error(   R)   (    (    s.   /usr/lib/python2.7/site-packages/josepy/jws.pyt   find_key`   s    c         C   s   t  j d ƒ ‚ d  S(   Ns(   "crit" is not supported, please subclass(   R   R	   (   t   unused_value(    (    s.   /usr/lib/python2.7/site-packages/josepy/jws.pyR#   o   s    c         C   s8   g  |  D]- } t  j t j j t j j | j ƒ ƒ ^ q S(   N(   t   base64t	   b64encodet   OpenSSLt   cryptot   dump_certificatet   FILETYPE_ASN1t   wrapped(   R   t   cert(    (    s.   /usr/lib/python2.7/site-packages/josepy/jws.pyR   w   s    c         C   sG   y t  d „  |  Dƒ ƒ SWn( t j j k
 rB } t j | ƒ ‚ n Xd  S(   Nc         s   s<   |  ]2 } t  j t j j t j j t j | ƒ ƒ ƒ Vq d  S(   N(   R   t   ComparableX509R@   RA   t   load_certificateRC   R>   t	   b64decode(   R&   RE   (    (    s.   /usr/lib/python2.7/site-packages/josepy/jws.pys	   <genexpr>   s   (   t   tupleR@   RA   R;   R   R	   (   R   t   error(    (    s.   /usr/lib/python2.7/site-packages/josepy/jws.pyR   |   s
    	(    (    (   R   R   R   R   t   FieldR   t   JWASignaturet	   from_jsont   TrueR   R   R   t   JWKR   R   R   t   decode_b64joseR   t   x5tS256R   R   R   R    R"   R#   R.   R9   R<   R   R!   (    (    (    s.   /usr/lib/python2.7/site-packages/josepy/jws.pyR   &   s.   !			t	   Signaturec           B   s  e  Z d  Z e Z d Z e j d d e d d ƒZ	 e j d d e d e ƒ  d e j
 ƒZ e j d d e j d	 e j ƒZ e	 j d
 „  ƒ Z	 e	 j d „  ƒ Z	 d „  Z e d „  ƒ Z e d „  ƒ Z d d „ Z e e e ƒ  d „ ƒ Z d „  Z e d „  ƒ Z RS(   s  JWS Signature.

    :ivar combined: Combined Header (protected and unprotected,
        :class:`Header`).
    :ivar unicode protected: JWS protected header (Jose Base-64 decoded).
    :ivar header: JWS Unprotected Header (:class:`Header`).
    :ivar str signature: The signature.

    t   combinedt	   protectedR   R   t    t   headerR   t	   signatureR!   c         C   s   t  j |  j d ƒ ƒ S(   Ns   utf-8(   R   t   encode_b64joseR   (   R   (    (    s.   /usr/lib/python2.7/site-packages/josepy/jws.pyRT   ›   s    c         C   s   t  j |  ƒ j d ƒ S(   Ns   utf-8(   R   RP   R   (   R   (    (    s.   /usr/lib/python2.7/site-packages/josepy/jws.pyRT       s    c         K   sP   d | k r |  j  | ƒ } n  t t |  ƒ j |   |  j j d  k	 sL t ‚ d  S(   NRS   (   t   _with_combinedt   superRR   t   __init__RS   R   R:   R   (   R)   t   kwargs(    (    s.   /usr/lib/python2.7/site-packages/josepy/jws.pyR[   ¤   s    c         C   s}   d | k s t  ‚ | j d |  j d j ƒ } | j d |  j d j ƒ } | ri | |  j j | ƒ } n | } | | d <| S(   NRS   RV   RT   (   R   t   getR-   R   t
   header_clst
   json_loads(   R   R\   RV   RT   RS   (    (    s.   /usr/lib/python2.7/site-packages/josepy/jws.pyRY   ª   s    
c         C   s'   t  j | j d ƒ ƒ d t  j | ƒ S(   Ns   utf-8t   .(   R    R?   R   (   R   RT   t   payload(    (    s.   /usr/lib/python2.7/site-packages/josepy/jws.pyt   _msg¸   s    c      	   C   sX   | d k r |  j j ƒ  n | } |  j j j d | j d |  j d |  j |  j | ƒ ƒ S(   sE   Verify.

        :param JWK key: Key used for verification.

        t   keyt   sigt   msgN(	   R:   RS   R<   R   t   verifyRc   RW   Rb   RT   (   R)   Ra   Rc   (    (    s.   /usr/lib/python2.7/site-packages/josepy/jws.pyRf   ½   s    !c         K   s#  t  | | j ƒ s t ‚ | } | | d <| rA | j ƒ  | d <n  t | ƒ j |  j j ƒ sb t ‚ | j |  j j ƒ s} t ‚ i  } x0 | D]( }	 |	 | k rŠ | j |	 ƒ | |	 <qŠ qŠ W| rÔ |  j |   j	 ƒ  }
 n d }
 |  j |   }	 | j
 | j |  j |
 | ƒ ƒ } |  d |
 d |	 d | ƒ S(   s;   Sign.

        :param JWK key: Key for signature.

        R   R   RU   RT   RV   RW   (   R/   t   ktyR   t
   public_keyR3   t   issubsetR^   R-   t   popt
   json_dumpst   signRc   Rb   (   R   Ra   Rc   R   t   include_jwkt   protectR\   t   header_paramst   protected_paramsRV   RT   RW   (    (    s.   /usr/lib/python2.7/site-packages/josepy/jws.pyRl   È   s"    
!!c         C   s3   t  t |  ƒ j ƒ  } | d j ƒ  s/ | d =n  | S(   NRV   (   RZ   RR   t   fields_to_partial_jsonR.   (   R)   t   fields(    (    s.   /usr/lib/python2.7/site-packages/josepy/jws.pyRq   é   s    
c         C   sS   t  t |  ƒ j | ƒ } |  j | ƒ } d | d j ƒ  k rO t j d ƒ ‚ n  | S(   NR   RS   s   alg not present(   RZ   RR   t   fields_from_jsonRY   R.   R   R	   (   R   t   jobjRr   t   fields_with_combined(    (    s.   /usr/lib/python2.7/site-packages/josepy/jws.pyRs   ï   s
    (   s   combinedN(   R   R   R   R   R^   t	   __slots__R   RK   RN   RT   RM   RV   RP   RX   RW   R!   R   R[   R   RY   Rb   R:   Rf   t	   frozensetRl   Rq   Rs   (    (    (    s.   /usr/lib/python2.7/site-packages/josepy/jws.pyRR   †   s*   			t   JWSc           B   sw   e  Z d  Z d
 Z e Z d d „ Z e d „  ƒ Z	 e
 d „  ƒ Z d „  Z e d „  ƒ Z e d „ Z e d	 „  ƒ Z RS(   sg   JSON Web Signature.

    :ivar str payload: JWS Payload.
    :ivar str signature: JWS Signatures.

    Ra   t
   signaturesc            s    t  ‡  ‡ f d †  ˆ j Dƒ ƒ S(   s   Verify.c         3   s$   |  ] } | j  ˆ j ˆ  ƒ Vq d  S(   N(   Rf   Ra   (   R&   Rd   (   Rc   R)   (    s.   /usr/lib/python2.7/site-packages/josepy/jws.pys	   <genexpr>  s    (   t   allRy   (   R)   Rc   (    (   Rc   R)   s.   /usr/lib/python2.7/site-packages/josepy/jws.pyRf     s    c         K   s(   |  d | d |  j  j d | |  f ƒ S(   s   Sign.Ra   Ry   (   t   signature_clsRl   (   R   Ra   R\   (    (    s.   /usr/lib/python2.7/site-packages/josepy/jws.pyRl     s    c         C   s&   t  |  j ƒ d k s t ‚ |  j d S(   sP   Get a singleton signature.

        :rtype: :class:`JWS.signature_cls`

        i   i    (   R   Ry   R   (   R)   (    (    s.   /usr/lib/python2.7/site-packages/josepy/jws.pyRW     s    c         C   s€   t  |  j ƒ d k s t ‚ d |  j j j ƒ  k s9 t ‚ t j |  j j j	 d ƒ ƒ d t j |  j
 ƒ d t j |  j j ƒ S(   s7   Compact serialization.

        :rtype: bytes

        i   R   s   utf-8R`   (   R   Ry   R   RW   RV   R.   R    R?   RT   R   Ra   (   R)   (    (    s.   /usr/lib/python2.7/site-packages/josepy/jws.pyt
   to_compact  s    3c         C   s‘   y | j  d ƒ \ } } } Wn  t k
 r> t j d ƒ ‚ n X|  j d t j | ƒ j d ƒ d t j | ƒ ƒ } |  d t j | ƒ d | f ƒ S(   sA   Compact deserialization.

        :param bytes compact:

        R`   sO   Compact JWS serialization should comprise of exactly 3 dot-separated componentsRT   s   utf-8RW   Ra   Ry   (   t   splitt
   ValueErrorR   R	   R{   R    RH   R   (   R   t   compactRT   Ra   RW   Rd   (    (    s.   /usr/lib/python2.7/site-packages/josepy/jws.pyt   from_compact)  s    	c         C   sv   |  j  s t ‚ t j |  j ƒ } | r] t |  j  ƒ d k r] |  j  d j ƒ  } | | d <| Si | d 6|  j  d 6Sd  S(   Ni   i    Ra   Ry   (   Ry   R   R   RX   Ra   R   t   to_partial_json(   R)   t   flatRa   t   ret(    (    s.   /usr/lib/python2.7/site-packages/josepy/jws.pyR   <  s    
c      	      s¨   d | k r* d | k r* t  j d ƒ ‚ nz d | k rj ˆ  d t j | j d ƒ ƒ d ˆ  j j | ƒ f ƒ Sˆ  d t j | d ƒ d t ‡  f d †  | d Dƒ ƒ ƒ Sd  S(   NRW   Ry   s   Flat mixed with non-flatRa   c         3   s!   |  ] } ˆ  j  j | ƒ Vq d  S(   N(   R{   RM   (   R&   Rd   (   R   (    s.   /usr/lib/python2.7/site-packages/josepy/jws.pys	   <genexpr>S  s   (   R   R	   R   RP   Rj   R{   RM   RI   (   R   Rt   (    (   R   s.   /usr/lib/python2.7/site-packages/josepy/jws.pyRM   J  s    (   s   payloads
   signaturesN(   R   R   R   Rv   RR   R{   R:   Rf   R   Rl   t   propertyRW   R|   R€   RN   R   RM   (    (    (    s.   /usr/lib/python2.7/site-packages/josepy/jws.pyRx   ø   s   
	t   CLIc           B   sk   e  Z d  Z e d „  ƒ Z e d „  ƒ Z e d „  ƒ Z e d „  ƒ Z e d „  ƒ Z e d d „ ƒ Z
 RS(   s   JWS CLI.c      
   C   sà   | j  j j | j j ƒ  ƒ } | j j ƒ  | j d k rF g  | _ n  | j rb | j j	 d ƒ n  t
 j d t j j ƒ  j ƒ  d | d | j  d t | j ƒ ƒ } | j rÉ t j | j ƒ  j d ƒ ƒ n t j | j ƒ  ƒ d S(   s   Sign.R   Ra   Rc   Rn   s   utf-8N(   R   Rg   t   loadRc   t   readt   closeRn   R:   R   t   appendRx   Rl   t   syst   stdinR   R3   R+   t   print_R|   R   t   json_dumps_pretty(   R   t   argsRc   Rd   (    (    s.   /usr/lib/python2.7/site-packages/josepy/jws.pyRl   Z  s    	-	c         C   sì   | j  r* t j t j j ƒ  j ƒ  ƒ } nC y t j t j j ƒ  ƒ } Wn$ t j	 k
 rl } t
 j | ƒ d SX| j d k	 rÂ | j d k	 s‘ t ‚ | j j | j j ƒ  ƒ j ƒ  } | j j ƒ  n d } t j j | j ƒ | j d | ƒ S(   s   Verify.iÿÿÿÿRc   N(   R   Rx   R€   RŠ   R‹   R‡   R   R_   R   R;   R+   RŒ   Rc   R:   Rg   R   R†   Rh   Rˆ   t   stdoutt   writeRa   Rf   (   R   RŽ   Rd   RJ   Rc   (    (    s.   /usr/lib/python2.7/site-packages/josepy/jws.pyRf   l  s    	!!c         C   s   t  j j | ƒ S(   N(   R   RL   RM   (   R   t   arg(    (    s.   /usr/lib/python2.7/site-packages/josepy/jws.pyt	   _alg_type‚  s    c         C   s   | t  j j k s t ‚ | S(   N(   RR   R^   R-   R   (   R   R‘   (    (    s.   /usr/lib/python2.7/site-packages/josepy/jws.pyt   _header_type†  s    c         C   s&   | t  j j k s t ‚ t  j j | S(   N(   R   RO   t   TYPESR   (   R   R‘   (    (    s.   /usr/lib/python2.7/site-packages/josepy/jws.pyt	   _kty_type‹  s    c         C   sN  | d k r t j d } n  t j ƒ  } | j d d d ƒ| j ƒ  } | j d ƒ } | j d |  j	 ƒ | j d d d	 t j
 d
 ƒ d t ƒ| j d d d	 |  j d t j ƒ| j d d d d d	 |  j ƒ| j d ƒ } | j d |  j ƒ | j d d d	 t j
 d
 ƒ d t ƒ| j d d	 |  j d t ƒ| j | ƒ } | j | ƒ S(   s    Parse arguments and sign/verify.i   s	   --compactt   actiont
   store_trueRl   t   funcs   -ks   --keyR0   t   rbt   requireds   -as   --algR   s   -ps	   --protectR‰   Rf   s   --ktyN(   R:   RŠ   t   argvt   argparset   ArgumentParsert   add_argumentt   add_subparserst
   add_parsert   set_defaultsRl   t   FileTypeRN   R’   R   t   RS256R“   Rf   t   FalseR•   t
   parse_argsR˜   (   R   RŽ   t   parsert
   subparserst   parser_signt   parser_verifyt   parsed(    (    s.   /usr/lib/python2.7/site-packages/josepy/jws.pyt   run  s*    N(   R   R   R   R   Rl   Rf   R’   R“   R•   R:   R«   (    (    (    s.   /usr/lib/python2.7/site-packages/josepy/jws.pyR…   W  s   t   __main__(   R   Rœ   R>   RŠ   R@   R+   t   josepyR    R   R   R   R   R   t   objectR   t   JSONObjectWithFieldsR   RR   Rx   R…   R   t   exitR«   (    (    (    s.   /usr/lib/python2.7/site-packages/josepy/jws.pyt   <module>   s   .`r_V