
    ]gH                        S r SSKrSSKrSSKrSSKJr  SSKJrJr  SSK	J
r
JrJr  SSKJrJrJr  SSKJr  SSKJr  SS	KJrJrJr  \
(       a  SS
KJr  OSr\R8                  " \5      rSr " S S5      r  " S S\ 5      r! " S S\ 5      r" " S S\ 5      r# " S S\ 5      r$ " S S\ 5      r% " S S\ 5      r& " S S5      r' " S S\5      r(S r) S/S jr*S  r+S! r,S" r-S# r. S/S$ jr/S% r0S& r1S' r2\!\%\&S(.r3/ S)Qr4\
(       aL  \"\#S*.r5\" S+5      (       a  \$\5S,'   \3Rm                  \55        \7" S- \5Rq                  5        5       5      (       d   e\9" \3Rq                  5       5      r:/ S.Qr;g)0aB  The interfaces in this module are not intended for public use.

This module defines interfaces for applying checksums to HTTP requests within
the context of botocore. This involves both resolving the checksum to be used
based on client configuration and environment, as well as application of the
checksum to the request.
    N)crc32)sha1sha256)HAS_CRThas_minimum_crt_versionurlparse)AwsChunkedWrapperErrorFlexibleChecksumErrorMissingDependencyException)StructureShape)StreamingBody)conditionally_calculate_md5determine_content_lengthhas_checksum_header)	checksumsCRC32c                   6    \ rS rSrSrS rS rS rS rS r	Sr
g	)
BaseChecksum4      c                     g N selfchunks     7/usr/lib/python3/dist-packages/botocore/httpchecksum.pyupdateBaseChecksum.update7           c                     g r   r   r   s    r   digestBaseChecksum.digest:   r    r!   c                 l    U R                  5       n[        R                  " U5      R                  S5      $ )Nascii)r$   base64	b64encodedecode)r   bss     r   	b64digestBaseChecksum.b64digest=   s)    [[]#**733r!   c                    ^ ^ TR                  5       n[        UU 4S jS5       H  nT R                  U5        M     TR                  U5        g )Nc                  :   > T R                  TR                  5      $ r   )read_CHUNK_SIZE)fileobjr   s   r   <lambda>.BaseChecksum._handle_fileobj.<locals>.<lambda>C   s    ',,t/?/?"@r!   r!   )telliterr   seek)r   r2   start_positionr   s   ``  r   _handle_fileobjBaseChecksum._handle_fileobjA   s9     @#FEKK G^$r!   c                     [        U[        [        45      (       a!  U R                  U5        U R                  5       $ U R	                  U5        U R                  5       $ r   )
isinstancebytes	bytearrayr   r9   r,   )r   bodys     r   handleBaseChecksum.handleG   sL    dUI.//KK ~~   &~~r!   r   N)__name__
__module____qualname____firstlineno__r1   r   r$   r,   r9   r@   __static_attributes__r   r!   r   r   r   4   s     K4% r!   r   c                   &    \ rS rSrS rS rS rSrg)Crc32ChecksumO   c                     SU l         g Nr   
_int_crc32r#   s    r   __init__Crc32Checksum.__init__P   	    r!   c                 >    [        XR                  5      S-  U l        g Nl    )r   rM   r   s     r   r   Crc32Checksum.updateS   s    7*Dr!   c                 6    U R                   R                  SSS9$ N   big	byteorderrM   to_bytesr#   s    r   r$   Crc32Checksum.digestV       ''U';;r!   rL   NrB   rC   rD   rE   rN   r   r$   rF   r   r!   r   rH   rH   O   s    E<r!   rH   c                   &    \ rS rSrS rS rS rSrg)CrtCrc32ChecksumZ   c                     SU l         g rK   rL   r#   s    r   rN   CrtCrc32Checksum.__init__\   rP   r!   c                 X    [         R                  " XR                  5      nUS-  U l        g rR   )crt_checksumsr   rM   r   r   new_checksums      r   r   CrtCrc32Checksum.update_   s"    $**5//B&3r!   c                 6    U R                   R                  SSS9$ rU   rZ   r#   s    r   r$   CrtCrc32Checksum.digestc   r]   r!   rL   Nr^   r   r!   r   r`   r`   Z   s    4<r!   r`   c                   &    \ rS rSrS rS rS rSrg)CrtCrc32cChecksumg   c                     SU l         g rK   _int_crc32cr#   s    r   rN   CrtCrc32cChecksum.__init__i   s
    r!   c                 X    [         R                  " XR                  5      nUS-  U l        g rR   )re   crc32crp   rf   s      r   r   CrtCrc32cChecksum.updatel   s%    $++E3C3CD'*4r!   c                 6    U R                   R                  SSS9$ rU   )rp   r[   r#   s    r   r$   CrtCrc32cChecksum.digestp   s    ((e(<<r!   ro   Nr^   r   r!   r   rl   rl   g   s    5=r!   rl   c                   &    \ rS rSrS rS rS rSrg)CrtCrc64NvmeChecksumt   c                     SU l         g rK   _int_crc64nvmer#   s    r   rN   CrtCrc64NvmeChecksum.__init__v   s
    r!   c                 X    [         R                  " XR                  5      nUS-  U l        g )Nl    )re   	crc64nvmer|   rf   s      r   r   CrtCrc64NvmeChecksum.updatey   s&    $..u6I6IJ*-??r!   c                 6    U R                   R                  SSS9$ )N   rW   rX   )r|   r[   r#   s    r   r$   CrtCrc64NvmeChecksum.digest}   s    ""++A+??r!   r{   Nr^   r   r!   r   rx   rx   t   s     @@r!   rx   c                   &    \ rS rSrS rS rS rSrg)Sha1Checksum   c                 "    [        5       U l        g r   )r   	_checksumr#   s    r   rN   Sha1Checksum.__init__   s    r!   c                 :    U R                   R                  U5        g r   r   r   r   s     r   r   Sha1Checksum.update       e$r!   c                 6    U R                   R                  5       $ r   r   r$   r#   s    r   r$   Sha1Checksum.digest       ~~$$&&r!   r   Nr^   r   r!   r   r   r      s     %'r!   r   c                   &    \ rS rSrS rS rS rSrg)Sha256Checksum   c                 "    [        5       U l        g r   )r   r   r#   s    r   rN   Sha256Checksum.__init__   s    r!   c                 :    U R                   R                  U5        g r   r   r   s     r   r   Sha256Checksum.update   r   r!   c                 6    U R                   R                  5       $ r   r   r#   s    r   r$   Sha256Checksum.digest   r   r!   r   Nr^   r   r!   r   r   r      s    "%'r!   r   c                   N    \ rS rSrSr   SS jrS rSS jrSS jrS r	S	 r
S
rg)AwsChunkedWrapper   r   Nc                 r    Xl         X0l        X l        U R                  5         Uc  U R                  nX@l        g r   )_raw_checksum_name_checksum_cls_reset_DEFAULT_CHUNK_SIZE_chunk_size)r   rawchecksum_clschecksum_name
chunk_sizes        r   rN   AwsChunkedWrapper.__init__   s5     	+)11J%r!   c                 |    SU l         SU l        S U l        U R                  (       a  U R                  5       U l        g g )Nr!   F)
_remaining	_completer   r   r#   s    r   r   AwsChunkedWrapper._reset   s5    !//1DN r!   c                     US:w  d  US:w  a	  [        SS9eU R                  5         U R                  R                  S5        g )Nr   z Can only seek to start of stream	error_msg)r	   r   r   r7   )r   offsetwhences      r   r7   AwsChunkedWrapper.seek   s:    Q;&A+(<  			qr!   c                    Ub  US::  a  S nU R                   (       a  U R                  (       d  gUS L =(       d    U[        U R                  5      :  nU R                   (       dg  U(       a`  U =R                  U R                  5       -  sl        US L =(       d    U[        U R                  5      :  nU R                   (       d	  U(       a  M`  Uc  [        U R                  5      nU R                  S U nU R                  US  U l        U$ )Nr   r!   )r   r   len_make_chunk)r   sizewant_more_bytes	to_returns       r   r0   AwsChunkedWrapper.read   s    	D >>$// $,E$T__1E*E.._OOt//11O"dlIdS5I.IO ..__
 <t'D OOET*	//$%0r!   c                    U R                   R                  U R                  5      n[        [	        U5      5      SS  R                  S5      nU(       + U l        U R                  (       a  U R                  R                  U5        U R                  (       a[  U R                  (       aJ  U R                  R                  S5      nU R                  R                  5       R                  S5      nSX44-  $ SX!4-  $ )N   r'   s   0
%s:%s

s   %s
%s
)r   r0   r   hexr   encoder   r   r   r   r,   )r   	raw_chunkhex_lennamechecksums        r   r   AwsChunkedWrapper._make_chunk   s     IINN4#3#34	c)n%ab)009&>>NN!!),>>dnn&&--g6D~~//188AH(D+;;;'!555r!   c              #   z   #    U R                   (       d&  U R                  5       v   U R                   (       d  M%  g g 7fr   )r   r   r#   s    r   __iter__AwsChunkedWrapper.__iter__   s&     ..""$$ ...s   5;;)r   r   r   r   r   r   r   )Nzx-amz-checksumN)r   r   )rB   rC   rD   rE   r   rN   r   r7   r0   r   r   rF   r   r!   r   r   r      s1    %
 && 226$%r!   r   c                   >   ^  \ rS rSrU 4S jrSU 4S jjrS rSrU =r$ )StreamingChecksumBody   c                 <   > [         TU ]  X5        X0l        X@l        g r   )superrN   r   	_expected)r   
raw_streamcontent_lengthr   expected	__class__s        r   rN   StreamingChecksumBody.__init__   s    4!!r!   c                    > [         TU ]  US9nU R                  R                  U5        Ub  U(       d  US:  a  U R	                  5         U$ )N)amtr   )r   r0   r   r   _validate_checksum)r   r   r   r   s      r   r0   StreamingChecksumBody.read   sC    %e$;uq##%r!   c                     U R                   R                  5       [        R                  " U R                  5      :w  a3  SU R                   SU R                   R                  5        3n[        US9eg )NExpected checksum $ did not match calculated checksum: r   )r   r$   r(   	b64decoder   r,   r
   )r   r   s     r   r   (StreamingChecksumBody._validate_checksum   sg    >>  "f&6&6t~~&FF$T^^$4 5!^^5578:  ()<< Gr!   )r   r   r   )	rB   rC   rD   rE   rN   r0   r   rF   __classcell__)r   s   @r   r   r      s    "
= =r!   r   c                 4    [        XU5        [        XU5        g r   )"resolve_request_checksum_algorithm$resolve_response_checksum_algorithms)requestoperation_modelparamss      r   resolve_checksum_contextr      s    &wH(6Jr!   c                 <   [        U 5      (       a  g U S   R                  S0 5      nU S   S   R                  nUR                  nUR                  =(       d    UR                  S5      nUR                  S5      nU(       ab  X;   a]  Uc  [
        nX(   R                  5       n	X;  a<  [        (       d%  U	[        ;   a  [        SU	R                  5        S3S9e[        S	U	 3S
9eO_U(       d  U(       aP  US:X  aJ  U S   R                  S5      (       a  g [        R                  5       n	[        XU5      n
U
b  U
[        S.US'   Og SnUR                  (       a4  [        U S   5      R                   S:X  a  U S   S   R"                  S:w  a  SnU	USU	 3S.nXS'   X@S   S'   g )Ncontextr   client_configrequestChecksumRequiredrequestAlgorithmMemberzUsing za requires an additional dependency. You will need to pip install botocore[crt] before proceeding.)msgz Unsupported checksum algorithm: r   when_supportedis_presign_request)r   valuerequest_algorithm_headerheaderurlhttpss3trailerx-amz-checksum-)	algorithminr   request_algorithm)r   getrequest_checksum_calculationhttp_checksumhttp_checksum_required_SUPPORTED_CHECKSUM_ALGORITHMSlowerr   _CRT_CHECKSUM_ALGORITHMSr   upperr
   DEFAULT_CHECKSUM_ALGORITHM$_get_request_algorithm_member_headerhas_streaming_inputr   schemesignature_version)r   r   r   supported_algorithmschecksum_contextr   r   request_checksum_requiredalgorithm_memberalgorithm_namealgorithm_member_headerlocation_typer   s                r   r   r     s    7##y)--j"=#*9#5$"" ! $11M.. 	867  %(()AB,6  '#A 177957~1II0 !5!5!7 8 9; ;  (<^<LM  6 
#9=MM 9!!"677399;"F&6#
 #./3<78
 	M++WU^$++w69o.@@DH &M $!.!12I -6()%5Iz"r!   c                     U R                   n[        U[        5      (       d  gUR                  R	                  U5      nU(       a  UR
                  R	                  S5      $ g)zDGet the name of the header targeted by the "requestAlgorithmMember".Nr   )input_shaper<   r   membersr   serialization)r   r   r  operation_input_shapealgorithm_member_shapes        r   r   r   R  s\     ,77+^<<2::>> %3377?? r!   c                 \   U R                  S0 5      R                  S0 5      nUR                  S5      nU(       d  g US:X  a  [        U 5        OEUS   S:X  a  [        U 5        O0US   S:X  a  [        U 5        O[	        SR                  US   5      S	9eS
U;   a  US
   nUS   U S   US   '   g g )Nr   r   r   zconditional-md5r   r   r   zUnknown checksum variant: {}r   r   r   headersr   )r   r   _apply_request_header_checksum_apply_request_trailer_checksumr
   format)r   r  r   r   s       r   apply_request_checksumr  b  s    {{9b155j"E $$%89I%%#G,	4H	$&w/	4I	%'0#4;;IdOL
 	
 "%55#34N#O $W- 		3F;< 6r!   c                     U R                  S0 5      R                  S0 5      nUR                  S5      nUS   nX0S   ;   a  g [        R                  US   5      nU" 5       R                  U S   5      nXPS   U'   g )Nr   r   r   r   r  r   r?   )r   _CHECKSUM_CLSr@   )r   r  r   location_namer   r$   s         r   r  r  {  s    {{9b155j"E $$%89If%M	** $$Y{%;<L^""76?3F(.I}%r!   c                    U R                  S0 5      R                  S0 5      nUR                  S5      nUS   n[        R                  US   5      nU S   nU S   nX5;   a  g SUS	'   S
U;   a  US
==   S-  ss'   OSUS
'   X5S'   [        U5      nUb,  [        U5      US'   SU;   a  US	 [        R                  S5        [        U[        [        45      (       a  [        R                  " U5      n[        UUUS9U S'   g )Nr   r   r   r   r   r  r?   chunkedzTransfer-EncodingzContent-Encodingz,aws-chunkedzaws-chunkedzX-Amz-TrailerzX-Amz-Decoded-Content-LengthzContent-LengthzVRemoving the Content-Length header since 'chunked' is specified for Transfer-Encoding.)r   r   )r   r  r   strloggerdebugr<   r=   r>   ioBytesIOr   )r   r  r   r  r   r  r?   r   s           r   r  r    s    {{9b155j"E $$%89If%M $$Y{%;<Li G6?D#,G W$ 	"#~5#&3"#,O-d3N! 36n2E./w&()LLh $	*++zz$'!#GFOr!   c                 p   UR                   nUR                  S5      nU(       a  XR;   a  Uc  [        nUR                  S/ 5       Vs1 s H  ofR                  5       iM     nn/ n[         H"  n	X;  a  M
  X;   d  M  UR                  U	5        M$     U S   R                  S0 5      n
XS'   XS   S'   g g g s  snf )NrequestValidationModeMemberresponseAlgorithmsr   r   response_algorithms)r   r   r   r   _ALGORITHMS_PRIORITY_LISTappend)r   r   r   r  r   mode_memberar$  usable_algorithmsr   r  s              r   r   r     s     $11M##$ABK{,'#A ,001ErJ
J!GGIJ 	 
 2I30!((3	 3 #9-11*bA2C./)9	:&! -{
s   B3c                 t   US   nUR                  S0 5      nUR                  S5      nU(       d  g U Hi  nSU 3nX;  a  M  SXH   ;   a  M  UR                  (       a  [        XU5      US'   O[        XU5      US'   US   R                  S0 5      nXuS'   XQS   S'     g    [        R                  S	U S
35        g )Nr  r   r$  r   -r?   r   response_algorithmzXSkipping checksum validation. Response did not contain one of the following algorithms: .)r   has_streaming_output_handle_streaming_response_handle_bytes_responser  r  )	http_responseresponser   r   r  r  
algorithmsr   header_names	            r   handle_checksum_bodyr5    s    y!G{{:r2!%%&;<J	'	{3%
 '&&//9 HV  6 HV
 $I.22:rB1:-.*:J'3  6 LL!!+A	/r!   c                     [         R                  U5      nSU 3n[        U R                  US   R                  S5      U" 5       US   U   5      $ )Nr   r  zcontent-length)r  r   r   r   )r1  r2  r   r   r4  s        r   r/  r/    sZ     $$Y/L#I;/K  01K(	 r!   c                     U R                   nSU 3n[        R                  U5      nU" 5       nUR                  U5        US   U   nUR	                  5       [
        R                  " U5      :w  a  SU SUR                  5        3n[        US9eU$ )Nr   r  r   r   r   )	contentr  r   r   r$   r(   r   r,   r
   )	r1  r2  r   r?   r4  r   r   r   r   s	            r   r0  r0    s      D#I;/K $$Y/L~HOOD	";/HF,,X66 
 +!++-.0 	 $i88Kr!   )r   r   r   )r   rs   r   )r   rs   )r      rV   r   c              #   2   #    U  H  o[         ;   v   M     g 7fr   )r   ).0r   s     r   	<genexpr>r<  "  s      5MT((5Ms   )r   rs   r   r   r   r   )<__doc__r(   r  loggingbinasciir   hashlibr   r   botocore.compatr   r   r   botocore.exceptionsr	   r
   r   botocore.modelr   botocore.responser   botocore.utilsr   r   r   awscrtr   re   	getLoggerrB   r  r   r   rH   r`   rl   rx   r   r   r   r   r   r   r   r  r  r  r   r5  r/  r0  r  r   _CRT_CHECKSUM_CLSr   allkeyslistr   r%  r   r!   r   <module>rL     s    	     F F 
 * +  1M			8	$$    6<L <
<| 
<
= 
=
@< 
@'< ''\ 'O% O%d=M =,K 	K6\@ 
2	/)Z <@:0&R" 
 < 
 "#
 z**)=+&*+ 5F5K5K5M     "&m&8&8&:!; N r!   