
    |je)                    n   d Z ddlmZ 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dl	Z	ddl
mZ ddlmZ  ee      j                         j                   Z ed      Z ed      Zedz  Zed	z  Zed
z  Zedz  Zedz  ZdZddZddZddZddZ	 	 	 	 	 	 	 	 ddZddZddZ ddZ!e"dk(  r e# e!             y)zIIndependently verify the offline Task23 gateway and profile-package seal.    )annotationsN)Path)castz(/home/cube/projects/richard/hermes-agentz?/home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cliz9dualcoach-task22-supplemental-compatibility-manifest.jsonz2dualcoach-task23-expiry-supersession-manifest.jsonz(dualcoach-task23-expiry-supersession.whlz/dualcoach-task23-expiry-supersession-wheel.jsonz0dualcoach-task23-expiry-supersession-freeze.json)zcheckin_cli/customer_admin.pyc                R    t        j                  | dddd      j                         S )NFT),:)ensure_ascii	sort_keys
separators	allow_nan)jsondumpsencode)values    \/home/cube/projects/richard/traning coach/.omo/evidence/verify-task23-expiry-supersession.py
_canonicalr      s#    ::e%4Jbghooqq    c                H    t        j                  |       j                         S )N)hashlibsha256	hexdigest)datas    r   _shar   !   s    >>$))++r   c                    t        t        t        j                  | j	                                     }t        |t              st        d| j                         t        t        t        t        f   |      S )Nzinvalid JSON: )
r   objectr   loads
read_bytes
isinstancedictRuntimeErrornamestr)pathr   s     r   _objectr$   %   sT    DOO$567EeT"^DII;788S&[!5))r   c                \   t        j                  | t        i t        j                  dddt         j
                  t         j
                  d      }|j                  dvs|j                  r7t        d| d|j                  j                         j                                |j                  S )NzC.UTF-8)LANGLC_ALLF)cwdenvstdoutstderrcheck>   r      zcommand failed: z: )
subprocessrunGATEWAYosenvironPIPE
returncoder+   r    decodestripr*   )argvresults     r   _runr9   ,   s    ^^BrzzB9	BF &&---dXR8L8L8N8T8T8V7WXYY==r   c               ^   t        j                         }g }t        |      D ]x  }| |z  j                         }|j	                  |t        |      t        |      d       |j                  |j                         dz   |j                         z   dz   |z   dz          z ||j                         fS )N)r#   bytesr      :    )
r   r   sortedr   appendlenr   updater   r   )rootpaths	namespacedigestleavesr#   contents          r   _source_leavesrH   :   s     ^^F&(Fu$;**,\7m
 	
 	%5=G%O	
  6##%%%r   c                    t        j                  dddd| gt        t         j                  t         j                  d      j                  dk(  }|rdt        dd	d
dddd| g      dfS dt        dd	dd
dddd|  g      dfS )Ngitzls-filesz--error-unmatchz--F)r(   r*   r+   r,   r   zgateway-trackeddiffz--binaryz--no-ext-diffz--no-textconvHEADzgateway-untrackedz
--no-indexz	/dev/nullz./r-   )r.   r/   r0   DEVNULLr4   r9   )r#   trackeds     r   _patchrO   O   s    nn	
-tT:!!!! jAG %_ovW[]abc
 	
 	eV\:k]_`d_e[fgh	 r   c                ^   | j                  d      }t        |t              st        d      t	        j
                  t              5 }|j                         D cg c]E  }|j                  |j                  |j                  |j                  t        |j                        dG }}d d d        t        j                  t        t        j!                               t        j#                         j$                  t'              t        t)        |            ddgdt        t*        dz  dz  j!                               d	d
d
d}||k7  st-        d |D              rt        d      t        |      }|j/                  dd       }d| j                  d      t        t0        j!                               t        t2        j!                               t        j                  |d   |d   |d   |d   |d   | d   d   d	d
d}	||	k7  s|t        t)        |            k7  rt        d      y c c}w # 1 sw Y   xY w)Nwheel_provenancezwheel provenance is invalid)filenamecompress_size	file_sizecrc	date_timei Sei Ikz scripts/reproducible-wheel-buildscriptszreproducible-wheel-buildTF)rR   r   r;   membersmember_index_sha256source_epochsbuilder_relative_pathbuilder_sha256reproduced_exactlyincludes_profile_package_sourcelive_profile_data_accessedc              3  0   K   | ]  }|d    g dk7    yw)rV   )i  r-   r-   r   r   r   N ).0members     r   	<genexpr>z _verify_wheel.<locals>.<genexpr>   s     $h`gV\VK%8<Q%Q`gs   zwheel provenance does not matchreceipt_digestz#task23-expiry-supersession-wheel-v2candidate_digestr   r;   rX   rY   rZ   profile_package)schemarf   manifest_sha256predecessor_manifest_sha256wheel_filenamewheel_sha256wheel_byteswheel_memberswheel_member_index_sha256rZ    profile_package_candidate_digestr]   r_   zwheel receipt does not match)getr   r   r    zipfileZipFileWHEELinfolistrR   rS   rT   CRClistrV   r!   r   r   statst_sizer@   r   r0   anypopMANIFESTPREDECESSOR)
manifestreceipt
provenancearchiveitemrX   expectedunsignedrE   expected_receipts
             r   _verify_wheelr   d   s   01Jj$'899		7  ((*	
 + !MM!%!3!3!^^xx!$..1 + 	 	
 
  JJu'')*%%w<#Jw$78$j1!C) 36P P\\^_"+0&+H X$h`g$h!h<==G}H\\*D1F7$LL);< 3 3 56'+K,B,B,D'E** *(!),%-.C%D!/2,45F,G-
 #&+" ##vj6J1K'K9:: (LY	
 
 	s   H"A
H#H"H""H,c                 L   t        t        j                        dk7  rt        d      t	        j
                  t        j	                         j                        dk7  st	        j
                  t        j	                         j                        dk7  sht	        j
                  t        j	                         j                        dk7  s4t	        j
                  t        j	                         j                        dk7  rt        d      t        t              } t        t              }|j                  d      t        t        j!                               dd}t#        t$        t&        d	
      \  }}||dddd}| j                  d      dk7  ss| j                  d      t)        t*              t)        t$              dk7  sB| j                  d      |k7  s.| j                  d      |k7  s| j                  d      ddddddk7  rt        d      | j                  d      }t-        |t.              r|st        d      t1        j2                         }t1        j2                         }d}	g }
|D ]M  }t-        |t4              st        d      t7        t4        t(        t8        f   |      }|j                  d      }t-        |t(              r|r||	k  rt        d      |}	t*        |z  j!                         }t;        |      \  }}}||t        |      t        |      |t        |      t        |      |dk7  rt        d |       |
j=                  |       |j?                  d!|jA                         z   d"z   |z   d"z          |j?                  |jA                         d"z   |jA                         z   d"z   |z   d"z          P |D ]P  }t)        |d         }|j?                  d#|jA                         z   d"z   t$        |z  j!                         z   d"z          R tC        g d$      }|jE                         | j                  d      k7  s|jE                         | j                  d%      k7  swt        |      | j                  d&      k7  sZt        |      | j                  d'      k7  s=t        |jG                  d"      D cg c]  }|s|	 c}      | j                  d(      k7  rt        d)      t        t              }tI        | |       t        t              }t5        |      }|jK                  d*d       }d+| j                  d      t        t        j!                               t        t        j!                               |j                  d*      | j                  d      d,}||k7  s|t        tM        |            k7  rt        d-      tO        tQ        jR                  |jE                         t        t        j!                               |d.   |d*   |d*   t        |
      t        |      d/d0d1             y2c c}w )3Nr-   z+usage: verify-task23-expiry-supersession.pyi  i$  z(Task23 seal file permissions are invalidrf   zETask22 terminal authority retained as immutable historical provenance)rf   ri   classificationzprofile-package)rD   TzPTask23 G1 historical-evidence exception is implemented in profile-package sourceF)source_filesrf   accessedreasonr_   rh   z"task23-expiry-supersession-seal-v2roots)gatewayrg   predecessorrg   verificationz.offline-code-and-profile-package-task23-reseal)moder_   profile_package_source_accessedtelegram_accessedservice_accessedz"Task23 manifest binding is invalidr   zTask23 source list is invalid zTask23 source leaf is invalidr#   zTask23 source order is invalid)r#   r;   r   diff_categorypatch_bytespatch_sha256patch_return_codezTask23 source leaf mismatch: s   gateway:r=   s   profile-package:)rJ   statusz--porcelain=v1z-zz--untracked-files=allcandidate_diff_sha256gateway_status_snapshot_sha256gateway_status_byte_lengthgateway_status_entry_countz/Task23 source or repository-status seal driftedre   z$task23-expiry-supersession-freeze-v2)rh   rf   ri   wheel_receipt_sha256wheel_receipt_digestr   z$Task23 freeze receipt does not matchrl   z4offline-code-and-profile-package-task23-verification)	candidater~   wheelwheel_receiptfreezerC   profile_pathsr   )r
   r   )*r@   sysr7   
SystemExitrx   S_IMODEr|   st_modert   WHEEL_RECEIPTFREEZEr    r$   r}   rq   r   r   rH   PROFILE_PACKAGEPROFILE_SOURCESr"   r0   r   rw   r   r   r   r   r   rO   r?   rA   r   r9   r   splitr   r{   r   printr   r   )r~   r   expected_predecessorprofile_leavesprofile_candidateexpected_profile_packagerF   r   rK   previousrC   rawleafr#   rG   categorypatchreturn_coder   r   r   r   r   rE   expected_freezes                            r   mainr      sS   
388}FGGX]]_,,-6<<

,,-6<<**,445><<--.%7EFFx H+&K'OO,>? 6 6 89a
 )7#)%N% '-% ',	  	X"FF<< 7|O8LMN<<&*>><<)*.FF<<'D*//3!& %,
 
 ?@@\\.)Ffd#6:;; I>>DHE#t$>??Df%s+xx$$DDH4D?@@T>--/'-d|$%\7m%u: K!,
 
 !>tfEFFTt{{}4u<wFNODKKME)HOO,==EMPUUV- . 4< kkm %1134 		
  TUF.@!AA>>x||,CDD<8<<(HIIv;(,,'CDDe!4=!4!4=>(,,OkBllLMMm$G(G$V_FF|H\\*D1F8$LL);< 3 3 56 $]%=%=%? @ ',< = ^4O ?"fZ5I0J&JABB	$**((*,,./( !12)*U^,F	 	 	 9 >s   )X!1X!__main__)r   r   returnr;   )r   r;   r   r"   )r#   r   r   dict[str, object])r7   z	list[str]r   r;   )rB   r   rC   ztuple[str, ...]rD   r"   r   z#tuple[list[dict[str, object]], str])r#   r"   r   ztuple[str, bytes, int])r~   r   r   r   r   None)r   int)$__doc__
__future__r   r   r   r1   rx   r.   r   rr   pathlibr   typingr   __file__resolveparentEVIDENCEr0   r   r}   r|   rt   r   r   r   r   r   r$   r9   rH   rO   r   r   __name__r   ra   r   r   <module>r      s    O "   	   
   >!!#**
9
:E TTJJ==LL	F	F4r,*&
&& 	&
 )&**2;jxv z
TV
 r   