
    ]j_W                     L   d Z ddlZddlZddlZddlmZ ddlmZmZm	Z	 ddl
mZmZmZ ddlmZmZmZ ddlmZ ddlmZ dd	lmZ dd
lmZmZmZmZ erddlmZ ndZ ej@                  e!      Z"dZ# G d d      Z$ G d de$      Z% G d de$      Z& G d de$      Z' G d de$      Z( G d de$      Z) G d de$      Z* G d de$      Z+ G d de$      Z, G d d e$      Z- G d! d"e$      Z. G d# d$      Z/ G d% d&e      Z0d' Z1	 d>d(Z2d) Z3d* Z4d+ Z5d, Z6d- Z7d. Z8	 d>d/Z9d0 Z:d1 Z;d2 Z<e%e,e-e.d3Z=g d4Z>erYe&e'd5Z? ed6      re(e?d7<    ed8      re)e?d9<   e*e?d:<   e+e?d;<   e=j                  e?        eAd< e?j                         D              sJ  eCe=j                               ZDg d=ZEy)?aB  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sha512)HAS_CRThas_minimum_crt_versionurlparse)AwsChunkedWrapperErrorFlexibleChecksumErrorMissingDependencyException)StructureShape)StreamingBody)register_feature_id)conditionally_calculate_md5determine_content_lengthget_checksum_algorithm_headershas_checksum_header)	checksumsCRC32c                   .    e Zd ZdZd Zd Zd Zd Zd Zy)BaseChecksum   c                      y N selfchunks     ?/root/env/lib/python3.12/site-packages/botocore/httpchecksum.pyupdatezBaseChecksum.update9           c                      y r   r   r   s    r   digestzBaseChecksum.digest<   r!   r"   c                 j    | j                         }t        j                  |      j                  d      S )Nascii)r%   base64	b64encodedecode)r   bss     r   	b64digestzBaseChecksum.b64digest?   s)    [[]#**733r"   c                      j                         }t         fdd      D ]  } j                  |        j                  |       y )Nc                  :     j                  j                        S r   )read_CHUNK_SIZE)fileobjr   s   r   <lambda>z.BaseChecksum._handle_fileobj.<locals>.<lambda>E   s    ',,t/?/?"@ r"   r"   )telliterr    seek)r   r1   start_positionr   s   ``  r   _handle_fileobjzBaseChecksum._handle_fileobjC   s=     @#F 	EKK	^$r"   c                     t        |t        t        f      r!| j                  |       | j                         S | j	                  |       | j                         S r   )
isinstancebytes	bytearrayr    r7   r,   )r   bodys     r   handlezBaseChecksum.handleI   sI    dUI./KK ~~   &~~r"   N)	__name__
__module____qualname__r0   r    r%   r,   r7   r=   r   r"   r   r   r   6   s     K4% r"   r   c                       e Zd Zd Zd Zd Zy)Crc32Checksumc                     d| _         y Nr   
_int_crc32r$   s    r   __init__zCrc32Checksum.__init__R   	    r"   c                 @    t        || j                        dz  | _        y Nl    )r   rF   r   s     r   r    zCrc32Checksum.updateU   s    t7*Dr"   c                 <    | j                   j                  dd      S N   big	byteorderrF   to_bytesr$   s    r   r%   zCrc32Checksum.digestX       ''U';;r"   Nr>   r?   r@   rG   r    r%   r   r"   r   rB   rB   Q   s    E<r"   rB   c                       e Zd Zd Zd Zd Zy)CrtCrc32Checksumc                     d| _         y rD   rE   r$   s    r   rG   zCrtCrc32Checksum.__init__^   rH   r"   c                 X    t        j                  || j                        }|dz  | _        y rJ   )crt_checksumsr   rF   r   r   new_checksums      r   r    zCrtCrc32Checksum.updatea   s$    $**5$//B&3r"   c                 <    | j                   j                  dd      S rL   rQ   r$   s    r   r%   zCrtCrc32Checksum.digeste   rS   r"   NrT   r   r"   r   rV   rV   \   s    4<r"   rV   c                       e Zd Zd Zd Zd Zy)CrtCrc32cChecksumc                     d| _         y rD   )_int_crc32cr$   s    r   rG   zCrtCrc32cChecksum.__init__k   s
    r"   c                 X    t        j                  || j                        }|dz  | _        y rJ   )rY   crc32cr`   rZ   s      r   r    zCrtCrc32cChecksum.updaten   s'    $++E43C3CD'*4r"   c                 <    | j                   j                  dd      S rL   )r`   rR   r$   s    r   r%   zCrtCrc32cChecksum.digestr   s    ((e(<<r"   NrT   r   r"   r   r^   r^   i   s    5=r"   r^   c                       e Zd Zd Zd Zd Zy)CrtCrc64NvmeChecksumc                     d| _         y rD   )_int_crc64nvmer$   s    r   rG   zCrtCrc64NvmeChecksum.__init__x   s
    r"   c                 X    t        j                  || j                        }|dz  | _        y )Nl    )rY   	crc64nvmerg   rZ   s      r   r    zCrtCrc64NvmeChecksum.update{   s(    $..ud6I6IJ*-??r"   c                 <    | j                   j                  dd      S )N   rN   rO   )rg   rR   r$   s    r   r%   zCrtCrc64NvmeChecksum.digest   s    ""++A+??r"   NrT   r   r"   r   re   re   v   s     @@r"   re   c                       e Zd Zd Zd Zd Zy)CrtXxhash64Checksumc                 J    t         j                  j                         | _        y r   )rY   XXHashnew_xxhash64_xxhashr$   s    r   rG   zCrtXxhash64Checksum.__init__   s    $++88:r"   c                 :    | j                   j                  |       y r   rq   r    r   s     r   r    zCrtXxhash64Checksum.update       E"r"   c                 6    | j                   j                         S r   rq   finalizer$   s    r   r%   zCrtXxhash64Checksum.digest       ||$$&&r"   NrT   r   r"   r   rm   rm      s    ;#'r"   rm   c                       e Zd Zd Zd Zd Zy)CrtXxhash3Checksumc                 J    t         j                  j                         | _        y r   )rY   ro   new_xxhash3_64rq   r$   s    r   rG   zCrtXxhash3Checksum.__init__   s    $++::<r"   c                 :    | j                   j                  |       y r   rs   r   s     r   r    zCrtXxhash3Checksum.update   rt   r"   c                 6    | j                   j                         S r   rv   r$   s    r   r%   zCrtXxhash3Checksum.digest   rx   r"   NrT   r   r"   r   rz   rz      s    =#'r"   rz   c                       e Zd Zd Zd Zd Zy)CrtXxhash128Checksumc                 J    t         j                  j                         | _        y r   )rY   ro   new_xxhash3_128rq   r$   s    r   rG   zCrtXxhash128Checksum.__init__   s    $++;;=r"   c                 :    | j                   j                  |       y r   rs   r   s     r   r    zCrtXxhash128Checksum.update   rt   r"   c                 6    | j                   j                         S r   rv   r$   s    r   r%   zCrtXxhash128Checksum.digest   rx   r"   NrT   r   r"   r   r   r      s    >#'r"   r   c                       e Zd Zd Zd Zd Zy)Sha1Checksumc                 "    t               | _        y r   )r   	_checksumr$   s    r   rG   zSha1Checksum.__init__   s    r"   c                 :    | j                   j                  |       y r   r   r    r   s     r   r    zSha1Checksum.update       e$r"   c                 6    | j                   j                         S r   r   r%   r$   s    r   r%   zSha1Checksum.digest       ~~$$&&r"   NrT   r   r"   r   r   r      s     %'r"   r   c                       e Zd Zd Zd Zd Zy)Sha256Checksumc                 "    t               | _        y r   )r   r   r$   s    r   rG   zSha256Checksum.__init__       r"   c                 :    | j                   j                  |       y r   r   r   s     r   r    zSha256Checksum.update   r   r"   c                 6    | j                   j                         S r   r   r$   s    r   r%   zSha256Checksum.digest   r   r"   NrT   r   r"   r   r   r          "%'r"   r   c                       e Zd Zd Zd Zd Zy)Sha512Checksumc                 "    t               | _        y r   )r   r   r$   s    r   rG   zSha512Checksum.__init__   r   r"   c                 :    | j                   j                  |       y r   r   r   s     r   r    zSha512Checksum.update   r   r"   c                 6    | j                   j                         S r   r   r$   s    r   r%   zSha512Checksum.digest   r   r"   NrT   r   r"   r   r   r      r   r"   r   c                   @    e Zd ZdZ	 	 	 d	dZd Zd
dZddZd Zd Z	y)AwsChunkedWrapperr   Nc                 x    || _         || _        || _        | j                          || j                  }|| _        y r   )_raw_checksum_name_checksum_cls_reset_DEFAULT_CHUNK_SIZE_chunk_size)r   rawchecksum_clschecksum_name
chunk_sizes        r   rG   zAwsChunkedWrapper.__init__   s=     	+)11J%r"   c                 r    d| _         d| _        d | _        | j                  r| j                         | _        y y )Nr"   F)
_remaining	_completer   r   r$   s    r   r   zAwsChunkedWrapper._reset   s5    !//1DN r"   c                     |dk7  s|dk7  rt        d      | j                          | j                  j                  d       y )Nr   z Can only seek to start of stream	error_msg)r
   r   r   r5   )r   offsetwhences      r   r5   zAwsChunkedWrapper.seek   s:    Q;&A+(<  			qr"   c                    ||dk  rd }| j                   r| j                  sy|d u xs |t        | j                        kD  }| j                   sR|rP| xj                  | j                         z  c_        |d u xs |t        | j                        kD  }| j                   s|rP|t        | j                        }| j                  d | }| j                  |d  | _        |S )Nr   r"   )r   r   len_make_chunk)r   sizewant_more_bytes	to_returns       r   r/   zAwsChunkedWrapper.read   s    	D >>$// $,E$T__1E*E.._OOt//11O"dlIdS5I.IO .._
 <t'D OOET*	//$%0r"   c                    | j                   j                  | j                        }t        t	        |            dd  j                  d      }| | _        | j                  r| j                  j                  |       | j                  rW| j                  rK| j                  j                  d      }| j                  j                         j                  d      }d||fz  S d||fz  S )N   r'   s   0
%s:%s

s   %s
%s
)r   r/   r   hexr   encoder   r   r    r   r,   )r   	raw_chunkhex_lennamechecksums        r   r   zAwsChunkedWrapper._make_chunk  s     IINN4#3#34	c)n%ab)009&>>NN!!),>>dnn&&--g6D~~//188AH(D(+;;;'9!555r"   c              #   d   K   | j                   s | j                          | j                   sy y wr   )r   r   r$   s    r   __iter__zAwsChunkedWrapper.__iter__  s%     ..""$$ ..s   +00)Nzx-amz-checksumN)r   r   )
r>   r?   r@   r   rG   r   r5   r/   r   r   r   r"   r   r   r      s1    %
 && 226$%r"   r   c                   :     e Zd Z fdZd fd	Z fdZd Z xZS )StreamingChecksumBodyc                 B    t         |   ||       || _        || _        y r   )superrG   r   	_expected)r   
raw_streamcontent_lengthr   expected	__class__s        r   rG   zStreamingChecksumBody.__init__  s     ^4!!r"   c                     t         |   |      }| j                  j                  |       ||s|dkD  r| j	                          |S )N)amtr   )r   r/   r   r    _validate_checksum)r   r   r   r   s      r   r/   zStreamingChecksumBody.read   sC    %e$;uq##%r"   c                     t         |   |      }|t        |      k(  r|}nt        |      d | }| j                  j                  |       |dk(  rt        |      dkD  r| j                          |S rD   )r   readintor   
memoryviewr   r    r   )r   bamount_readviewr   s       r   r   zStreamingChecksumBody.readinto'  si    g&q)#a& Da=+.Dd#!A
##%r"   c                     | j                   j                         t        j                  | j                        k7  r6d| j                   d| j                   j                          }t        |      y )NExpected checksum $ did not match calculated checksum: r   )r   r%   r(   	b64decoder   r,   r   )r   r   s     r   r   z(StreamingChecksumBody._validate_checksum2  sg    >>  "f&6&6t~~&FF$T^^$4 5!^^5578:  ()<< Gr"   r   )r>   r?   r@   rG   r/   r   r   __classcell__)r   s   @r   r   r     s    "
	=r"   r   c                 N    t        | ||       t        | ||       t        |        y r   )"resolve_request_checksum_algorithm$resolve_response_checksum_algorithms_register_checksum_feature_ids)requestoperation_modelparamss      r   resolve_checksum_contextr   ;  s"    &wH(/6J"7+r"   c                    t        |       ry | d   j                  di       }| d   d   j                  }|j                  }|j                  xs |j                  d      }|j                  d      }|r^||v rZ|t
        }||   j                         }	|	|vrt        s&|	t        v rt        d|	j                          d      t        d	|	 
      |s|rJ|dk(  rE| d   j                  d      ry t        j                         }	t        || |      }
|
|
t        d|d<   ny d}|j                  r2t        | d         j                   dk(  r| d   d   j"                  dk7  rd}|	|d|	 d}||d<   || d   d<   y )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   A  s    7#y)--j"=#*9#5$"" ! $11M.. 	867  %(()AB,6  '#A  01779!55~1II0 !5!5!7 8 9; ;  (<^<LM  
#9=MM 9!!"67399;"FW&6#
 #./3<78
 	M++WU^$++w69o.@@DH &M $!.!12I -6()%5GIz"r"   c                     | j                   }t        |t              sy|j                  j	                  |      }|r|j
                  j	                  d      S y)zDGet the name of the header targeted by the "requestAlgorithmMember".Nr   )input_shaper9   r   membersr   serialization)r   r   r  operation_input_shapealgorithm_member_shapes        r   r   r     sY     ,77+^<2::>> %3377?? r"   c                 N   | j                  di       j                  di       }|j                  d      }|sy |dk(  rt        |        nF|d   dk(  rt        |        n2|d   dk(  rt        |        nt	        dj                  |d         	      d
|v r|d
   }|d   | d   |d   <   y y )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    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                     | j                  di       j                  di       }|j                  d      }|d   }|| d   v ry t        j                  |d         } |       j                  | d         }|| d   |<   y )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(.GI}%r"   c                    | j                  di       j                  di       }|j                  d      }|d   }t        j                  |d         }| d   }| d   }||v ry d|d	<   d
|v r|d
xx   dz  cc<   nd|d
<   ||d<   t        |      }|d|v rt        |d         }|t	        |      |d<   d|v r|d= t
        j                  d       t        |t        t        f      rt        j                  |      }t        |||      | d<   y )Nr   r   r   r   r   r  r<   chunkedzTransfer-EncodingzContent-Encodingz,aws-chunkedzaws-chunkedzX-Amz-TrailerzContent-LengthzX-Amz-Decoded-Content-LengthzVRemoving the Content-Length header since 'chunked' is specified for Transfer-Encoding.)r   r   )r   r  r   intstrloggerdebugr9   r:   r;   ioBytesIOr   )r   r   r   r  r   r  r<   r   s           r   r  r    sA   {{9b155j"E $$%89If%M $$Y{%;<Li G6?D#,G W$ 	"#~5#&3"#,GO-d3N"2g"=
 W%567! 36n2E./7"$%d	
 $	*+zz$'!#GFOr"   c                 :   t        |       x}r9|D ]3  }|j                         }|dvs|j                  d      }t        |       5 y| j	                  di       j	                  di       }|j	                  d      }|r t        |t              rt        |d          yyy)zARegister feature IDs for checksum algorithms used in the request.)zX-AMZ-CHECKSUM-ALGORITHMzX-AMZ-CHECKSUM-MODEzX-AMZ-CHECKSUM-TYPEzX-AMZ-CHECKSUM-Nr   r   r   r   )r   r   removeprefix'_register_checksum_algorithm_feature_idr   r9   dict)r   algorithm_headersr   r  r   r   s         r   r   r     s    :7CCC' 	HF\\^F  
 "(!4!45F!G7G	H 	 {{9b155j"E $$%89IZ	40/	+0FG 1yr"   c                 R    | j                         }|dk(  rd}d| }t        |       y )N	CRC64NVMECRC64FLEXIBLE_CHECKSUMS_REQ_)r   r   )r   checksum_algorithm_name"checksum_algorithm_name_feature_ids      r   r  r    s9    'oo/+-")
!"9!:; ' :;r"   c                 V   |j                   }|j                  d      }|r||v r|t        }|j                  dg       D ch c]  }|j                          }}g }t        D ]  }	|	|vr|	|v s|j                  |	        | d   j                  di       }
||
d<   |
| d   d<   y y y c c}w )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{f,'#A ,001ErJ
AGGI
 
 2 	4I 3300!((3		4 #9-11*bA2C./)9	:&! -{
s    B&c                 X   |d   }|j                  di       }|j                  d      }|sy |D ]d  }d| }||vrd||   v r|j                  rt        | ||      |d<   nt        | ||      |d<   |d   j                  di       }||d<   ||d   d<    y  t        j                  d	|       y )
Nr  r   r+  r   -r<   r   response_algorithmz[Skipping checksum validation. Response did not contain one of the following algorithms: %s.)r   has_streaming_output_handle_streaming_response_handle_bytes_responser  r  )	http_responseresponser   r   r  r   
algorithmsr   header_names	            r   handle_checksum_bodyr;  -  s    y!G{{:r2!%%&;<J 	'	{3g%
 '+&&//9x HV  6x HV
 $I.22:rB1:-.*:J'36 LLer"   c                     t         j                  |      }d| }t        | j                  |d   j                  d       |       |d   |         S )Nr   r  zcontent-length)r  r   r   r   )r7  r8  r   r   r:  s        r   r5  r5  V  sZ     $$Y/L#I;/K  01K(	 r"   c                 "   | j                   }d| }t        j                  |      } |       }|j                  |       |d   |   }|j	                         t        j                  |      k7  r"d| d|j                          }t        |      |S )Nr   r  r   r   r   )	contentr  r   r    r%   r(   r   r,   r   )	r7  r8  r   r<   r:  r   r   r   r   s	            r   r6  r6  a  s      D#I;/K $$Y/L~HOOD	";/HF,,X66 
 +!++-.0 	 $i88Kr"   )r   r   r   r   )r   rb   ri   xxhash64xxhash3	xxhash128)r   rb   )r      rM   ri   )r      r   r?  r@  rA  c              #   ,   K   | ]  }|t         v   y wr   )r   ).0r   s     r   	<genexpr>rF    s      -1((s   )	rA  r@  ri   r?  rb   r   r   r   r   r   )F__doc__r(   r  loggingbinasciir   hashlibr   r   r   botocore.compatr   r   r	   botocore.exceptionsr
   r   r   botocore.modelr   botocore.responser   botocore.useragentr   botocore.utilsr   r   r   r   awscrtr   rY   	getLoggerr>   r  r   r   rB   rV   r^   re   rm   rz   r   r   r   r   r   r   r   r   r   r  r  r  r   r  r   r;  r5  r6  r  r   _CRT_CHECKSUM_CLSr    allkeyslistr   r,  r   r"   r   <module>rW     s    	   ( ( F F 
 * + 2  1M			8	$$    6<L <
<| 
<
= 
=
@< 
@	', 	'	' 	'	'< 	''< ''\ ''\ 'O% O%d=M =B, 	K6\@ 
2	//dH*< <@:0&R" 	   "#
 z*)=+&z*(;*%'9)$)=+&*+ 5F5K5K5M    "&m&8&8&:!; 
 r"   