ó
    À„ªj»  ã                   ó²   • S SK Jr  S SKJr  S SKr\" \5      R                  5       R                  S   rS r	SS jr
SS jrSSSSSSS	.S
 jrSS jrS rS rg)é    )Údeepcopy)ÚPathNé   c                  óX   • [         R                  " [        S-  R                  5       5      $ )Nzfixture/baseline-webauthn.json)ÚjsonÚloadsÚRÚ	read_text© ó    Ú_/mnt/data/_sec004_a/PO081_SEC-004/F2-L1/SEC-004/lab/SEC004-LAB1/learner/src/webauthn_fixture.pyÚload_baseliner      s    € Ü�:Š:”qÐ9Ñ9×DÑDÓFÓGÐGr   c                 óV  • [        U =(       d
    [        5       5      oS   o!S   o1S   oAS   n/ nUR                  S5      S:w  a  UR                  S5        UR                  S5      S:w  a  UR                  S5        UR                  S	5      S
:w  a  UR                  S	5        UR                  S5      SLa  UR                  S5        UR                  S5      SLa  UR                  S5        UR                  S5      SLa  UR                  S5        UR                  S5      SLa  UR                  S5        [	        UR                  SS5      5      S::  a  UR                  S5        UR                  S5      S:w  a  UR                  S5        UR                  S5      SLa  UR                  S5        UR                  S5      SLa  UR                  S5        UR                  S5      SLa  UR                  S5        SUR                  S/ 5      ;  a  UR                  S5        U(       + US.$ )NÚrelying_partyÚceremony_policyÚsynthetic_accountÚrecovery_policyÚrp_idúlogin.example.testÚexpected_originzhttps://login.example.testÚuser_verificationÚrequiredÚserver_generates_challengeTÚchallenge_single_useÚverify_originÚverify_rp_idÚchallenge_ttl_secondsr   Úprivate_key_locationÚ-VIRTUAL_AUTHENTICATOR_ONLY_NO_SECRET_EXPORTEDÚprivate_key_boundaryÚcredential_registeredÚrisk_based_decision_requiredÚrisk_based_recoveryÚ3revoke_or_supersede_lost_credential_on_reenrollmentÚ credential_lifecycle_on_recoveryÚemail_only_linkÚmaterially_weaker_shortcutsÚweaker_shortcut_marker)ÚpassÚfailures)r   r   ÚgetÚappendÚint)ÚmodelÚmÚrpÚpÚaÚrecr*   s          r   Úvalidate_model_invariantsr4   	   sð  € Üˆu×'œ›Ó(€A¨Ñ-?¨"ÐEVÑCWÀÐ]pÑ[qÐYZð  zKñ  xLÐsvð  WYð  NVØ	‡v�vˆgƒÐ,Ó,¨h¯o©o¸gÔ.FØ	‡v�vÐÓ Ð">Ó>ÀÇÁÐPaÔ@bØ‡u�uÐ Ó! :Ó-¨x¯©Ð?RÔ/SØ‡u�uÐ)Ó*°$Ò6¸¿¹ÐHdÔ8eØ‡u�uÐ#Ó$¨DÒ0°(·/±/ÐBXÔ2YØ‡u�uˆ_Ó TÒ)¨8¯?©?¸?Ô+KØ‡u�uˆ^Ó DÒ(¨(¯/©/¸.Ô*IÜ
ˆ1�5‰5Ð(¨Ó+Ó,°Ó1°8·?±?ÐCZÔ3[Ø‡u�uÐ#Ó$Ð&UÓUÐW_×WfÑWfÐg}ÔW~Ø‡u�uÐ$Ó%¨TÒ1°8·?±?ÐCZÔ3[Ø
‡w�wÐ-Ó.°dÒ:¸H¿O¹OÐLaÔ<bØ
‡w�wÐDÓEÈTÒQÐS[×SbÑSbð  dFô  TGØ §¡Ð(EÀbÓ IÓIÈ8Ï?É?Ð[sÔKtØ”<¨8Ñ4Ð4r   c                 ó  • U=(       d
    [        5       o"S   o3 Vs/ s H  oDU ;  d  M
  UPM     nnU Vs/ s H.  oDU ;   d  M
  [        X   5      R                  5       (       a  M,  UPM0     nnU(       + =(       a    U(       + XVS.$ s  snf s  snf )NÚrecord_fields)r)   ÚmissingÚblank)r   ÚstrÚstrip)Úrecordr.   r/   ÚreqÚxr7   r8   s          r   Úvalidate_evidence_recordr>      s³   € Ø×Œ}‹€A oÑ$6 ÈCÓ@cÊCÀqÐ\bÑSbÇÉC¸Ð@cÑwzó  ljÒwzÐrsð  DJñ  JÓlmô  SVð  W]ñ  W`ó  Sa÷  Sgñ  Sg÷  Si×lmÑwzÐejð  ljØ”;×, u¤9°wÑMÐMùò Adùò  ljs   ›	B¨B´	BÁBÁ#BT)r.   Ú	challengeÚnowÚoriginr   Úuv_performedc          	      óð  • [        U=(       d
    [        5       5      owS   o‡S   o—S   o§S   U    nUc  US   OUnUc  US   S-   OUnUc  U	S   OUnUc  U	S	   OUnX;S
   :”  a  SSSS.$ X+S   :w  a  SSSS.$ US   (       a  XIS   :w  a  SSSS.$ US   (       a  XYS	   :w  a  SSSS.$ US   S:X  a  USLa  SSSS.$ U S:X  a  U
R                  S5      SLa  SSSS.$ SU S :X  a  S!OS"S#XEU
S$   [        U5      S%.$ )&Nr   r   r   Ú
challengesÚexpectedÚ	issued_até
   r   r   Ú
expires_atFÚEXPIRED_CHALLENGE_REJECTEDzchallenge expired)ÚokÚclassificationÚreasonÚCHALLENGE_MISMATCH_REJECTEDzchallenge mismatchr   ÚORIGIN_MISMATCH_REJECTEDzunexpected originr   ÚRP_ID_MISMATCH_REJECTEDzunexpected RP IDr   r   TÚUSER_VERIFICATION_REQUIREDzrequired UV not observedÚauthenticationr!   Ú UNREGISTERED_CREDENTIAL_REJECTEDzcredential not registeredÚregistrationÚVERIFIED_REGISTRATIONÚVERIFIED_AUTHENTICATIONzfresh/matchedÚcredential_id)rJ   rK   Úchallenge_staterA   r   rV   Úuser_verification_observed)r   r   r+   Úbool)Úkindr.   r?   r@   rA   r   rB   r/   r1   r0   r2   Ústs               r   Ú_verify_ceremonyr\      sà  € Üˆu×'œ›Ó(€AÐ.?Ñ,@¨!ÀÑEWÀ"Ð]pÑ[qÐYZð  yEñ  wFð  GKñ  wLÐsuØ"+Ñ"3��:’¸€IØ #¡ˆ"ˆ[‰/˜"Ò
°€CØ&,¡nˆRÐ!Ò"¸&€FØ ™=ˆBˆwŠK¨e€EØ
�ÑÓ¨EÐC_Ði|Ñ&}Ð}Ø�z‘NÓ"°ÐHeð  pDñ  ,Eð  %EØˆ×˜fÐ+<Ñ(=Ó=ÈEÐc}ð  H[ñ  G\ð  @\Øˆ×˜U¨¡kÓ1ÀÐWpð  {Mñ  ;Nð  4NØÐ	Ñ˜zÓ)¨lÀ$Ò.FÐUZð  mIð  Smñ  Pnð  InØÐÓ !§%¡%Ð(?Ó"@ÈÒ"LÐ[`ð  sUð  _zñ  V{ð  O{ØÀ$ÈÓBVÑ'>Ð\uð  IXð  bhð  GHð  IXñ  GYô  w{ð  |Hó  wIñ  Jð  Jr   c                 ó|   • U=(       d
    [        5       o"S   nXS   ;   a  SSU SS.$ XS   ;   a	  SS	XS
   S.$ SSU S.$ )Nr   r'   FÚWEAK_RECOVERY_REJECTEDzVmaterially weaker synthetic shortcut requires rejection or separate justified redesign)rJ   rK   ÚpathrL   Úapproved_pathsTÚ RECOVERY_PATH_BOUNDED_ACCEPTABLEr$   )rJ   rK   r_   Úcredential_lifecycle_requiredÚRECOVERY_PATH_UNREVIEWED)rJ   rK   r_   )r   )r_   r.   r/   Úrs       r   Úevaluate_recoveryre   ,   sz   € Ø×Œ}‹€AÐ$5Ñ"6 ØÐ.Ñ/Ó/ØÐ,DÈDð  [sñ  tð  	tØÐ!Ñ"Ó"ØÐ+MÐUYð  }rñ  {sñ  tð  	tØÐ(BÈ$ÑOÐOr   c                 óø  • [        5       nU S:X  a
  [        SUS9$ U S:X  a
  [        SUS9$ U S:X  a  [        SXS   S   S   S	-   S
9$ U S:X  a  [        SUSS9$ U S:X  a  [        SUSS9$ U S:X  a  [        SUSS9$ U S:X  a  [        SUSS9$ U S:X  a  [        SU5      $ U S:X  aI  US    Vs0 s H  o"S:w  d  M
  US_M     nn[        X15      nUS   (       d  SOSUS   (       d  SUS!.$ S US!.$ [	        U 5      es  snf )"NÚbaseline_registrationrS   )r.   Úbaseline_authenticationrQ   Úexpired_registration_challengerD   rH   r   )r.   r@   Ú#mismatched_authentication_challengezwrong-auth-challenge)r.   r?   Úorigin_mismatchzhttps://evil.example.test)r.   rA   Úrp_id_mismatchzother.example.test)r.   r   Úuser_verification_missingF)r.   rB   Úweak_recovery_shortcutr&   Úevidence_field_removedr6   zResidual DecisionÚobservedr)   TÚEVIDENCE_INCOMPLETEÚEVIDENCE_ACCEPTED)rJ   rK   Ú
validation)r   r\   re   r>   ÚKeyError)Úcase_idr/   Úkr3   Úvs        r   Ú	run_proberx   4   s¤  € Üƒo€AØÐ'Ó'Ô0@ÀÐVWÑ0XÐ)XØÐ)Ó)Ô2BÐCSÐZ[Ñ2\Ð+\ØÐ0Ó0Ô9IÈ.Ð_`ÐgsÑetð  vDñ  fEð  FRñ  fSð  TUñ  fUñ  :Vð  3VØÐ5Ó5Ô>NÐO_Ðfgð  sIñ  ?Jð  8JØÐ!Ó!Ô*:Ð;KÐRSÐ[vÑ*wÐ#wØÐ Ó Ô)9Ð:JÐQRÐYmÑ)nÐ"nØÐ+Ó+Ô4DÐEUÐ\]ÐkpÑ4qÐ-qØÐ(Ó(Ô1BÐCTÐUVÓ1WÐ*WØÐ(Ó(Ø#$ _Ò#5ÓPÒ#5˜aÐ<OÑ9O‹\ˆQˆzŠ\Ñ#5ˆÐPÔTlÐmpÓTsÐRSØ"# F§)‘U°ÐdeÐfl×dmÐG\ð  UVñ  Wð  	Wð  tGð  UVñ  Wð  	WÜ
�7Ó
Ðùò Qs   Â*	C7Â7C7c                  ó˜  ^• [        5       n [        R                  " [        S-  R	                  5       5      S   o Vs0 s H  o"S   [        US   5      _M     snmU S   o0S   o@S   oPS   n[        5       S   [        U4S	 jU 5       5      TS
   S   TS   S   TS   S   (       + TS   S   (       + TS   S   (       + TS   S   (       + TS   S   (       + TS   S   (       + US   S:H  US   R                  S5      US   US   US   US   US   S:H  US   S:H  US   US    [        U S!   5      S":H  /nTU[        U5      S#S$S$S$S%.$ s  snf )&Nzfixture/probe-cases.jsonÚcasesÚidr   r   r   r   r)   c              3   óF   >#   • U  H  nTUS       S   US   :H  v •  M     g7f)r{   rK   Úexpected_classNr   )Ú.0ÚcÚobservationss     €r   Ú	<genexpr>Ú%publisher_selftest.<locals>.<genexpr>G   s-   øé € Ð	VÒPUÈ1ˆ,�q˜‘wÑ
Ð 0Ñ
1°1Ð5EÑ3FÖ
FÒPUùs   ƒ!rg   rJ   rh   ri   rj   rk   rl   rm   rn   r   r   r   zhttps://r   r   r   r   r   r   r   r   r"   r$   r6   é   Ú8PYTHON_IN_MEMORY_SYNTHETIC_DEFENSIVE_WEBAUTHN_MODEL_ONLYF)rz   Úchecksr)   Úruntime_scopeÚexternal_target_usedÚreal_credentials_usedÚproduction_runtime_claimed)
r   r   r   r	   r
   rx   r4   ÚallÚ
startswithÚlen)	r/   rz   r   r0   r1   r2   rd   r…   r€   s	           @r   Úpublisher_selftestr�   C   s²  ø€ Üƒo€AœTŸZšZ¬Ð+EÑ)E×(PÑ(PÓ(RÓSÐT[Ñ\�uð  QVó  lWò  QVð  LMÐnrÑlsÔt}Ð~ð  AEñ  Fó  uGò  mGñ  QVñ  lWÐ^jð  \]ð  ^mñ  \nð  Y[ð  tEñ  rFð  pqð  L_ñ  J`ð  HIð  fwñ  dxð  bcäÓ! &Ñ)Ü	Ô	VÑPUÓ	VÓVØÐ*Ñ+¨DÑ1°<Ð@YÑ3ZÐ[_Ñ3`Ø
Ð7Ñ
8¸Ñ
>Ô>ÀLÐQvÑDwÐx|ÑD}Ô@}Ø
Ð(Ñ
)¨$Ñ
/Ô/°\ÐBRÑ5SÐTXÑ5YÔ1YÐ_kð  mHñ  `Ið  JNñ  `Oô  \OØ
Ð/Ñ
0°Ñ
6Ô6Øˆ�kÐ'Ñ'¨Ð,=Ñ)>×)IÑ)IÈ*Ó)UÐWXÐYuÑWvÐxyð  {Qñ  yRð  TUð  Veñ  Tfð  hið  jxñ  hyð  {|ð  }Pñ  {Qð  S]ñ  {]ØÐÑÐ!PÑPÐRSÐTrÑRsÐuvð  xmñ  vnô  psð  tuð  vEñ  tFó  pGð  IKñ  pKð	€Fð !¨&¼¸F»ð  UOð  glð  EJð  hmñ  nð  nùò lWs   ½E)N)Úcopyr   Úpathlibr   r   Ú__file__ÚresolveÚparentsr	   r   r4   r>   r\   re   rx   r�   r   r   r   Ú<module>r“      sd   ðÝ Ý Û Ù€xƒ.×ÑÓ×"Ñ" 1Ñ%€òHô5ô"Nð %)°D¸dÈ4ÐW[Ðjnõ JôPòónr   