+
      xi"H  c                  s2   R t ^ RIHt ^ RIt^ RIt^ RIt^ RIHtHtH	t	H
t
 ^ RIHtHt ^ RIHt ^ RIHtHt ^ RIHt ^ RIHtHtHtHtHtHtHtHtHtHt ]	'       d+   ^ R	I H!t! ^ R
I"H#t# ^ RI$H%t% ^ RI&H't' ^ RIH(t( ^ RI)H*t* ^ RI+H,t, R R lt- ! R R4      t.R# )zModule for parsing PSKC files.)annotationsN)AnyIOTYPE_CHECKINGcast)
EncryptionKeyDerivation)
ParseError)EncryptedIntegerValueEncryptedValue)MAC)
findfindallfindbinfindintfindtextfindtimegetboolgetintparseremove_namespaces)PathLike)_Element)PSKC)Device)Key)Policy)	Signaturec                    V ^8  d   QhRRRR/# )   valuezint | str | bytesreturnint format   "0/usr/lib/python3.14/site-packages/pskc/parser.py__annotate__r&   2   s      & 3     c                s*    \        V 4      #   \         d     Mi ; i\        P                  ! \	        \
        T 4      4      p T P                  4       '       d   \        T 4      # ^ p\        P                  ! RT 4       F  pT^,          T,           pK  	  T# )z%Convert a plain text value to an int.ZB)r    Z
ValueErrorbase64	b64decoder   ZbytesZisdigitarray)r   ZresultZxs   &  r%   	plain2intr+   2   s~    5z  T%/0E}}5zF[[e$A+" %Ms   
 c                  s   ] tR t^EtRt]R R l4       t]R R l4       t]R R l4       t]R R	 l4       t	]R
 R l4       t
]R R l4       t]R R l4       t]R R l4       t]R R l4       t]R R l4       t]R R l4       tRtR# )
PSKCParserz;Class to read various PSKC XML files into a PSKC structure.c               $    V ^8  d   QhRRRRRR/# )r   pskcr   filenamezCstr | bytes | PathLike[str] | PathLike[bytes] | IO[str] | IO[bytes]r   Noner!   r"   r$   r%   r&   PSKCParser.__annotate__I   s)     1 11 V1 
	1r'   c                s     \        V4      p\        P                  ! T4      TP
                  n        T P                  YP                  4       4       R#   \         d    \        R4      hi ; i)z<Parse the provided file and store data in the PSKC instance.zError parsing XMLN)	r   Z	Exceptionr   copyZdeepcopy	signaturetreeparse_documentZgetroot)clsr.   r/   r4   s   &&& r%   
parse_fileZPSKCParser.parse_fileH   sX    	2?D #mmD140	  	2011	2s   A A*c               r-   )r   r.   r   	containerr   r   r0   r!   r"   r$   r%   r&   r1   X   s&     J J$ J8 J Jr'   c                sz   \        V4       VP                  R9  d   \        R4      hVP                  R4      ;'       g    VP                  R4      Vn        VP                  R8X  d@   VP                  '       d.   VP                  R9  d   \        RVP                  ,          4      hVP                  R4      ;'       g+    VP                  R4      ;'       g    VP                  R4      Vn        V P                  VP                  \        VR	R
4      4       V P                  VP                  \        VRR4      4       \        VR4      pV'       d   W1P                  n        \        VRR4       F#  pV P                  VP                  4       V4       K%  	  V P!                  VP"                  \        VR4      4       R# )z7Read information from the provided <KeyContainer> tree.KeyContainerzMissing KeyContainerZVersionversionzUnsupported version %rIdZIDidZEncryptionKeyEncryptionMethodZ	MACMethodZDigestMethodZMACAlgorithmZ
KeyPackager   r   N)r9   ZSecretContainer)Z1z1.0)r   tagr   getr:   r<   parse_encryption
encryptionr   parse_mac_methodmacr   	algorithmr   parse_key_packageZ
add_deviceparse_signaturer3   )r6   r.   r8   Zmac_algorithmkey_package   &&&  r%   r5   ZPSKCParser.parse_documentW   s_    	)$== CC344 }}Y/KK9==3KMM^+L05DEE MM$MM9==#6MM)--:M 	 	T__d(:/< 	= 	TXXt{N(4 	5 !N;!.HH"9lHEK!!$//"3[A F 	DNNDK,HIr'   c               r-   )r   rA   r   key_info_Element | Noner   r0   r!   r"   r$   r%   r&   r1   w   s"     5 5* 5 5TX 5r'   c                sF   Vf   R# VP                  R4      Vn        VP                  R4      ;'       g&    VP                  R4      ;'       g    VP                  Vn        \        VRRR4       F(  pVP                  P                  \        VR4      4       K*  	  \        VR	4      ;'       g    VP                  Vn        V P                  VP                  \        VR
4      4       \        VR4      ;'       g    VP                  P                  VP                  n        \        VR4      ;'       g    VP                  P                  VP                  n        VP                  R4      ;'       g    VP                  R4      ;'       g    RpVP                  4       P!                  R4      '       dr   VP                  P                  '       gT   RVP                  n        VP                  P"                  ;'       g    VP$                  ^ ,          VP                  n        R# R# R# )z>Read encryption information from the <EncryptionKey> XML tree.Nr;   	AlgorithmrD   ZKeyNamezDerivedKey/MasterKeyNamezDerivedKey/CarriedKeyName.ZIVzDerivedKey/KeyDerivationMethodZPBESaltZPBEIterationCountZ Zpbepbkdf2)r?   r<   rD   r   Z	key_namesappendr   r   Zivparse_key_derivation
derivationr   pbkdf2_saltr   pbkdf2_iterationslowerZ
startswithpbkdf2_key_lengthZalgorithm_key_lengths)r6   rA   rI   namerD   rH   r%   r@   ZPSKCParser.parse_encryptionv   s     T*
LL% ! !LL%! !   	 H%'A79D   ''s(;<9  $/@@:==
  !6!6698 	9 Hi(MMJ,A,A,M,M 	) H12 4 4!!33 	/ LL%HHk)BHHb 	OO((//))333.6J!!+%%77 4 4003 !!3 4 0r'   c               r-   )r   rP   r   key_derivationrJ   r   r0   r!   r"   r$   r%   r&   r1      s"     = =m =_ =ae =r'   c                s   Vf   R# VP                  R4      Vn        \        VR4      pVe^   \        VR4      Vn        \        VR4      Vn        \        VR4      Vn        \        VR4      pVe   VP                  R4      Vn        R# R# R# )z@Read derivation parameters from a <KeyDerivationMethod> element.NrK   zPBKDF2-paramszSalt/SpecifiedZIterationCountZ	KeyLengthZPRF)	r?   rD   r   r   rQ   r   rR   rT   Z
pbkdf2_prf)r6   rP   rV   rM   ZprfrH   r%   rO   ZPSKCParser.parse_key_derivation   s     !-11+>
no6%,V5E%FJ"+26;K+LJ(+26;+GJ(vu%C(+(<
%  r'   c               r-   )r   rC   r
   
mac_methodrJ   r   r0   r!   r"   r$   r%   r&   r1      s&     
D 
D3 
DO 
D 
Dr'   c                s    Vf   R# VP                  R4      ;'       g    VP                  R4      Vn        \        VR4      pVe(   V P                  V4      w  rE\	        VRV4      Vn        R# R# )z3Read MAC information from the <MACMethod> XML tree.NrK   rD   ZMACKey)r?   rD   r   parse_encrypted_valuer	   key)r6   rC   rW   Zmac_keyrD   cipher_values   &&&   r%   rB   ZPSKCParser.parse_mac_method   sr     NN;' ( (NN;' 	 z8,&)&?&?&H#I$\4CCG r'   c               r-   )r   devicer   rG   r   r   r0   r!   r"   r$   r%   r&   r1      s!     5 5v 5H 5 5r'   c                s   \        VRR4      pVe   \        VR4      Vn        \        VR4      Vn        \        VR4      Vn        \        VR4      Vn        \        VR4      Vn        \        VR	4      Vn        \        VR
R4      Vn	        \        VR4      Vn
        \        VR4      Vn        \        VRR4       F#  pV P                  VP                  4       V4       K%  	  R# )9Read key information from the provided <KeyPackage> tree.Z
DeviceInfoZDeviceIdNZManufacturerZSerialNoZModelZIssueNoZDeviceBinding	StartDate
ExpiryDateZExpiryUserIdzCryptoModuleInfo/Idr   Secret)r   r   ZmanufacturerserialZmodelZissue_noZdevice_bindingr   
start_dateexpiry_dateZdevice_useridZcrypto_moduler   	parse_keyZadd_key)r6   r[   rG   Zinfokey_elmrH   r%   rE   ZPSKCParser.parse_key_package   s     Kz:"*4"@F$T:6FM#D'2FL&tY7FO$,T?$CF! ({ ;F!)$h!GF#+D(#;F '5JK{E8<GMM&..*G4 =r'   c               r-   )r   rY   r   re   r   r   r0   r!   r"   r$   r%   r&   r1      s+     PG PGC PG( PGt PGr'   c                s   VP                  R4      ;'       g+    VP                  R4      ;'       g    VP                  R4      Vn        VP                  R4      ;'       g+    VP                  R4      ;'       g    VP                  R4      Vn        \        VR4      pVe   V P	                  VR	\        VR
4      4       V P	                  VR\        VR4      4       V P	                  VR\        VR4      4       V P	                  VR\        VR4      4       V P	                  VR\        VR4      4       \        VR4       F[  pVP                  R4      pV'       g   K  V P	                  V\        R	RRRR7      P                  VP                  4       4      V4       K]  	  \        VR4      Vn	        \        VR4      Vn
        \        VR4      Vn        \        VR4      Vn        \        VR4      Vn        \        VR4      Vn        \        VRR4      pVe   VP                  R4      ;'       g+    VP                  R4      ;'       g    VP                  R4      Vn        \!        VR 4      ;'       g    \!        VR!4      Vn        \!        VR"4      ;'       g    \!        VR#4      Vn        \'        VR$\'        VR%4      4      Vn        \        VR&R'4      pVe   VP                  R4      ;'       g+    VP                  R4      ;'       g    VP                  R4      Vn        \!        VR(4      ;'       g    \!        VR)4      Vn        \'        VR$\'        VR%4      4      Vn        V P1                  VP2                  \        VR*4      4       \        VR+4      pVeB   R. F;  p\'        Wx4      '       g   K  VP2                  P4                  P7                  V4       K=  	  \9        VR,4      ;'       g    VP2                  P:                  VP2                  n        \9        VR-4      ;'       g    VP2                  P<                  VP2                  n        R# )/r\   r;   ZKeyIdZSecretIdrK   ZKeyAlgorithmZSecretAlgorithmZDataNsecretr`   counterZCounterZtime_offsetZTimetime_intervalZTimeIntervalZ
time_driftZ	TimeDriftZName)rf   rg   Ztimerh   ZIssuerZKeyProfileIdZKeyReferenceZFriendlyNamer_   zAlgorithmParameters/Suitez#AlgorithmParameters/ChallengeFormatzUsage/ChallengeFormatZEncodingZFormatr#   ZMinZminZMaxZmaxZCheckDigitsZ
CheckDigitz"AlgorithmParameters/ResponseFormatzUsage/ResponseFormatZLengthZlengthr   ZUsager]   r^   )ZOTPZCRZ	IntegrityZEncryptZUnlock)r?   r<   rD   r   
parse_datar   ZdictrS   r   issuerZkey_profileZkey_referenceZfriendly_nameZ
key_useridZalgorithm_suiteZchallenge_encodingr   Zchallenge_min_lengthZchallenge_max_lengthr   Zchallenge_checkZresponse_encodingZresponse_lengthZresponse_checkparse_policypolicy	key_usagerN   r   rb   rc   )	r6   rY   re   ZdatarU   Zchallenge_formatZresponse_formatZusageZatts	   &&&      r%   rd   ZPSKCParser.parse_key   s   
 KK $ $W!5 $ $KK
# 	 KK$ + +N(C + +KK)* 	 GV$NN3$tX*>?NN3	4i+@ANN3tD&/ABNN3dN1KLNN3d4.EFGV,D88F#DtsD#%&"1	%
 #djjl#T+ - gx0
"7N;$Wn=$Wn=!'84&02  13JL ' $$Z0 / / $$X./ / $$X. "
 '/ 0 0'/ $ '/ 0 0'/ $ #* -$l24#5C 02HJ &##J/ . .##H-. .##H- !
 1 2 21  ")#\13"4C 	T'8%<=Wg&F5&&JJ((//4 G Wk*CCcjj.C.C 	

 Wl+EEszz/E/E 	

r'   c               r   )r   encrypted_valuer   r   ztuple[str | None, bytes]r!   r"   r$   r%   r&   r1     s     ) )H )AY )r'   c                s    Rp\        VR4      p\        VR4      pVe   VP                  P                  R4      p\        VR4      pVe&   VP                  P                  R4      ;'       g    TpW#3# )z4Read encryption value from <EncryptedValue> element.NzCipherData/CipherValuer=   rK   z!EncryptionMethod/EncryptionScheme)r   r   attribr?   )r6   rn   rD   rZ   Zencryption_methodZencryption_schemes   &&    r%   rX   Z PSKCParser.parse_encrypted_value  s     	%o7OP 2DE()0044[AI @B()0044[ANNYI((r'   c               s(    V ^8  d   QhRRRRRRRR/# )	r   rY   r   fieldstrelementrJ   r   r0   r!   r"   r$   r%   r&   r1   ,  s.     .X .XS .X .X .X4 .Xr'   c                s   Vf   R# VP                   P                  pRpRpRpVR8X  d   \        P                  p\        p	M\
        p\        p	\        VR4      pVe	   V! V4      p\        VR4      p
V
eH   V P                  V
4      w  rvVP                  P                  '       g   V'       d   WtP                  n        \        VRR4      p\        VR4      pVe:   VP                  P                  '       d   V'       d   \        VR4      pMV! V4      pVe   \        WV4       R# V'       d$   \        WV	! Wk\        \        V4      4      4       R# R# )zRead information from the provided element.

The element is expected to contain <PlainValue>, <EncryptedValue>
and/or <ValueMAC> elements that contain information on the actual
value.
Nrf   Z
PlainValuer	   ZValueMACZValueDigestZValue)r[   r.   r(   r)   r	   r+   r   r   r   rX   rA   rD   r   Zsetattrr   rq   )r6   rY   rp   rr   r.   Zplain_valuerZ   rD   Zplain2valueZencrypted_value_clsrn   Z	mac_valuer   s   &&&&         r%   ri   ZPSKCParser.parse_data+  s+    ?zz04	H%//K"0#K"7w5"%k2Kw(89&&)&?&?'!#I ??,,,,5)GZ?	'*(((Y&w8)%0"C,C'c9AUVX r'   c               r-   )r   rl   r   
policy_elmrJ   r   r0   r!   r"   r$   r%   r&   r1   ]  s!     %6 %6& %6o %6$ %6r'   c                s   Vf   R# \        VR4      Vn        \        VR4      Vn        \        VR4      Vn        \        VR4       F(  pVP                  P                  \        VR4      4       K*  	  \        VR4      pVe   VP                  R4      Vn        VP                  R	4      Vn        \        VR
4      Vn        \        VR4      Vn        \        VR4      Vn        VP                  R4      Vn        \%        V4      '       d   RVn        \)        . RO4      p\)        VP+                  4       4      V,
          '       d   RVn        \)        . RO4      pV F  pVP,                  V9  g   K  RVn        K  	  R# )z<Read key policy information from the provided <Policy> tree.Nr]   r^   NumberOfTransactionsKeyUsagerL   	PINPolicyPINKeyIdPINUsageModeMaxFailedAttempts	MinLength	MaxLengthPINEncodingT)rw   rx   ry   rz   r{   r|   )r]   r^   rt   ru   rv   )r   rb   rc   r   Znumber_of_transactionsr   rm   rN   r   r   r?   Z
pin_key_idZ	pin_usager   Zpin_max_failed_attemptsZpin_min_lengthZpin_max_lengthZpin_encodingZlistZunknown_policy_elementsZsetZkeysr>   )r6   rl   rs   rm   Zpin_policy_elmZknown_attributesZknown_childrenZchilds   &&&     r%   rk   ZPSKCParser.parse_policy\  s`    $Z=%j,?(/.)0% Z8I##HY$<= 9 j+6% . 2 2: >F-11.AF-3 3.5F*$*>;$GF!$*>;$GF!"0"4"4]"CFN##15." $,  - >&&(),<<<15.     Eyy.15.  r'   c               r-   )r   r3   r   signature_elmrJ   r   r0   r!   r"   r$   r%   r&   r1     s"     / /	 // /VZ /r'   c           
     s   Vf   R# \        VR4      pVe!   VP                  P                  R4      Vn        \        VR4      pVe!   VP                  P                  R4      Vn        \        VR4      pVe!   VP                  P                  R4      Vn        \        VR4      pVe#   \        VR4      Vn        \        VR4      Vn        \        VR	4      pV'       d{   \        P                  ! V4      P                  R
4      pRP                  R.\        ^ \        V4      ^@4       U	u. uF  p	WV	^@,            NK  	  up	,           R.,           4      Vn        R# R# u up	i )z8Read signature information from the <Signature> element.Nz!SignedInfo/CanonicalizationMethodrK   zSignedInfo/SignatureMethodz!SignedInfo/Reference/DigestMethodz!KeyInfo/X509Data/X509IssuerSerialZX509IssuerNameZX509SerialNumberz KeyInfo/X509Data/X509CertificateZasciiZ
z-----BEGIN CERTIFICATE-----z-----END CERTIFICATE-----)r   ro   r?   Zcanonicalization_methodrD   Zdigest_algorithmr   rj   ra   r   r(   Z	b64encodeZdecodeZjoinZrangeZlencertificate)
r6   r3   r}   Zcm_elmZsm_elmZdm_elmrj   r~   Zcertificate_strZis
   &&&       r%   rF   ZPSKCParser.parse_signature  sQ     m%HI060A0A+0NI-m%AB"(--"3"3K"@Im%HI)/):):;)GI&m%HI'0@AI'0BCI=?$..{;BB7KO$(II./3#7<><Q !1r6*<>> --.%/I! >s   'E
r!   N)Z__name__Z
__module__Z__qualname__Z__firstlineno____doc__Zclassmethodr7   r5   r@   rO   rB   rE   rd   rX   ri   rk   rF   Z__static_attributes__r!   r'   r%   r,   r,   E   s    E1 1 J J< 5 5< = =& 
D 
D 5 5& PG PGd ) ) .X .X` %6 %6N / /r'   r,   )/r   Z
__future__r    r*   r(   r2   Ztypingr   r   r   r   Zpskc.encryptionr   r   Zpskc.exceptionsr   Zpskc.keyr   r	   Zpskc.macr
   Zpskc.xmlr   r   r   r   r   r   r   r   r   r   Zosr   Z
lxml.etreer   r.   r   Zpskc.devicer   r   Zpskc.policyr   Zpskc.signaturer   r+   r,   r!   r'   r%   <module>r      sb   * % "    / / 5 & :    #""(&Y/ Y/r'   