ó
›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   s!   d | k r | t  |  j ƒ S| S(   s   Encoder.R   (   t   lenR
   (   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>   R?   t   load_certificateRA   R<   t	   b64decode(   R$   RC   (    (    s.   /usr/lib/python2.7/site-packages/josepy/jws.pys	   <genexpr>   s   (   t   tupleR>   R?   R9   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,   R7   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.pyRR   ›   s    c         C   s   t  j |  ƒ j d ƒ S(   Ns   utf-8(   R   RN   R   (   R   (    (    s.   /usr/lib/python2.7/site-packages/josepy/jws.pyRR       s    c         K   s8   d | k r |  j  | ƒ } n  t t |  ƒ j |   d  S(   NRQ   (   t   _with_combinedt   superRP   t   __init__(   R'   t   kwargs(    (    s.   /usr/lib/python2.7/site-packages/josepy/jws.pyRY   ¤   s    c         C   sk   | j  d |  j d j ƒ } | j  d |  j d j ƒ } | rW | |  j j | ƒ } n | } | | d <| S(   NRT   RR   RQ   (   t   getR+   R   t
   header_clst
   json_loads(   R   RZ   RT   RR   RQ   (    (    s.   /usr/lib/python2.7/site-packages/josepy/jws.pyRW   ª   s    
c         C   s'   t  j | j d ƒ ƒ d t  j | ƒ S(   Ns   utf-8t   .(   R    R=   R   (   R   RR   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(	   R8   RQ   R:   R   t   verifyRa   RU   R`   RR   (   R'   R_   Ra   (    (    s.   /usr/lib/python2.7/site-packages/josepy/jws.pyRd   ½   s    !c         K   sÏ   | } | | d <| r) | j  ƒ  | d <n  i  } x0 | D]( }	 |	 | k r6 | j |	 ƒ | |	 <q6 q6 W| r€ |  j |   j ƒ  }
 n d }
 |  j |   }	 | j | j |  j |
 | ƒ ƒ } |  d |
 d |	 d | ƒ S(   s;   Sign.

        :param JWK key: Key for signature.

        R   R   RS   RR   RT   RU   (   t
   public_keyt   popR\   t
   json_dumpst   signRa   R`   (   R   R_   Ra   R   t   include_jwkt   protectRZ   t   header_paramst   protected_paramsRT   RR   RU   (    (    s.   /usr/lib/python2.7/site-packages/josepy/jws.pyRh   È   s    

!c         C   s3   t  t |  ƒ j ƒ  } | d j ƒ  s/ | d =n  | S(   NRT   (   RX   RP   t   fields_to_partial_jsonR,   (   R'   t   fields(    (    s.   /usr/lib/python2.7/site-packages/josepy/jws.pyRm   é   s    
c         C   sS   t  t |  ƒ j | ƒ } |  j | ƒ } d | d j ƒ  k rO t j d ƒ ‚ n  | S(   NR   RQ   s   alg not present(   RX   RP   t   fields_from_jsonRW   R,   R   R	   (   R   t   jobjRn   t   fields_with_combined(    (    s.   /usr/lib/python2.7/site-packages/josepy/jws.pyRo   ï   s
    (   s   combinedN(   R   R   R   R   R\   t	   __slots__R   RI   RL   RR   RK   RT   RN   RV   RU   R   R   RY   R   RW   R`   R8   Rd   t	   frozensetRh   Rm   Ro   (    (    (    s.   /usr/lib/python2.7/site-packages/josepy/jws.pyRP   †   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.

    R_   t
   signaturesc            s    t  ‡  ‡ f d †  ˆ j Dƒ ƒ S(   s   Verify.c         3   s$   |  ] } | j  ˆ j ˆ  ƒ Vq d  S(   N(   Rd   R_   (   R$   Rb   (   Ra   R'   (    s.   /usr/lib/python2.7/site-packages/josepy/jws.pys	   <genexpr>  s    (   t   allRu   (   R'   Ra   (    (   Ra   R'   s.   /usr/lib/python2.7/site-packages/josepy/jws.pyRd     s    c         K   s(   |  d | d |  j  j d | |  f ƒ S(   s   Sign.R_   Ru   (   t   signature_clsRh   (   R   R_   RZ   (    (    s.   /usr/lib/python2.7/site-packages/josepy/jws.pyRh     s    c         C   s   |  j  d S(   sP   Get a singleton signature.

        :rtype: :class:`JWS.signature_cls`

        i    (   Ru   (   R'   (    (    s.   /usr/lib/python2.7/site-packages/josepy/jws.pyRU     s    c         C   sG   t  j |  j j j d ƒ ƒ d t  j |  j ƒ d t  j |  j j ƒ S(   s7   Compact serialization.

        :rtype: bytes

        s   utf-8R^   (   R    R=   RU   RR   R   R_   (   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 componentsRR   s   utf-8RU   R_   Ru   (   t   splitt
   ValueErrorR   R	   Rw   R    RF   R   (   R   t   compactRR   R_   RU   Rb   (    (    s.   /usr/lib/python2.7/site-packages/josepy/jws.pyt   from_compact)  s    	c         C   sg   t  j |  j ƒ } | rN t |  j ƒ d k rN |  j d j ƒ  } | | d <| Si | d 6|  j d 6Sd  S(   Ni   i    R_   Ru   (   R   RV   R_   R   Ru   t   to_partial_json(   R'   t   flatR_   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(   NRU   Ru   s   Flat mixed with non-flatR_   c         3   s!   |  ] } ˆ  j  j | ƒ Vq d  S(   N(   Rw   RK   (   R$   Rb   (   R   (    s.   /usr/lib/python2.7/site-packages/josepy/jws.pys	   <genexpr>S  s   (   R   R	   R   RN   Rf   Rw   RK   RG   (   R   Rp   (    (   R   s.   /usr/lib/python2.7/site-packages/josepy/jws.pyRK   J  s    (   s   payloads
   signaturesN(   R   R   R   Rr   RP   Rw   R8   Rd   R   Rh   t   propertyRU   Rx   R|   RL   R}   RK   (    (    (    s.   /usr/lib/python2.7/site-packages/josepy/jws.pyRt   ø   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   R_   Ra   Rj   s   utf-8N(   R   t   ktyt   loadRa   t   readt   closeRj   R8   R{   t   appendRt   Rh   t   syst   stdinR   R1   R)   t   print_Rx   R   t   json_dumps_pretty(   R   t   argsRa   Rb   (    (    s.   /usr/lib/python2.7/site-packages/josepy/jws.pyRh   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 j | j j ƒ  ƒ j ƒ  } | j j ƒ  n d } t j j | j ƒ | j d | ƒ S(   s   Verify.iÿÿÿÿRa   N(   R{   Rt   R|   R‡   Rˆ   R„   R   R]   R   R9   R)   R‰   Ra   R8   R‚   Rƒ   Re   R…   t   stdoutt   writeR_   Rd   (   R   R‹   Rb   RH   Ra   (    (    s.   /usr/lib/python2.7/site-packages/josepy/jws.pyRd   l  s    	!!c         C   s   t  j j | ƒ S(   N(   R   RJ   RK   (   R   t   arg(    (    s.   /usr/lib/python2.7/site-packages/josepy/jws.pyt	   _alg_type‚  s    c         C   s   | S(   N(    (   R   RŽ   (    (    s.   /usr/lib/python2.7/site-packages/josepy/jws.pyt   _header_type†  s    c         C   s   t  j j | S(   N(   R   RM   t   TYPES(   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_trueRh   t   funcs   -ks   --keyR.   t   rbt   requireds   -as   --algR   s   -ps	   --protectR†   Rd   s   --ktyN(   R8   R‡   t   argvt   argparset   ArgumentParsert   add_argumentt   add_subparserst
   add_parsert   set_defaultsRh   t   FileTypeRL   R   R   t   RS256R   Rd   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   Rh   Rd   R   R   R’   R8   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   RP   Rt   R   R   t   exitR¨   (    (    (    s.   /usr/lib/python2.7/site-packages/josepy/jws.pyt   <module>   s   .`r_V