
    <[jBL                    r   U d dl mZ d dlZd dlmZ d dlmZmZ d dlm	Z	m
Z
 d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZmZ ddlmZ ddlmZmZ ddlmZmZmZm Z mZm!Z!m"Z" dZ# ej$        d          Z%e G d de                      Z&e G d de                      Z'e G d de                      Z(e G d d                      Z)dZ*dZ+e G d d                      Z,e G d d                      Z- G d  d!e.          Z/e G d" d#e                      Z0e G d$ d%e                      Z1e G d& d'                      Z2e G d( d)                      Z3e G d* d+e                      Z4ej5        ej6        z  Z7d,e8d-<   e-e2z  Z9e/e3z  Z:e G d. d/                      Z;d0 Z< G d1 d2e          Z=dS )3    )annotationsN)	dataclass)IntEnumunique)	TypeAliascast)x509)InvalidSignature)default_backend)hashes)ecrsa   )CoseKey)
ByteBuffer	bytes2int   )AttestationAttestationResultAttestationTypeInvalidDatar
   _validate_cert_commoncatch_builtins   z2.23.133.8.3c                      e Zd ZdZdZdZdZdS )TpmRsaScheme            N)__name__
__module____qualname__RSASSARSAPSSOAEPRSAES     ]/home/thesage/.hermes/hermes-agent/venv/lib/python3.11/site-packages/fido2/attestation/tpm.pyr   r   ;   s"        FFDEEEr)   r   c                      e Zd ZdZdZdS )
TpmAlgAsymr   #   N)r!   r"   r#   RSAECCr(   r)   r*   r,   r,   C   s        
C
CCCr)   r,   c                  &    e Zd ZdZdZdZdZd	dZdS )

TpmAlgHash            returnhashes.HashAlgorithmc                >   | t           j        k    rt          j                    S | t           j        k    rt          j                    S | t           j        k    rt          j                    S | t           j        k    rt          j                    S t          d|           )Nz!_hash_alg is not implemented for )r1   SHA1r   SHA256SHA384SHA512NotImplementedErrorselfs    r*   	_hash_algzTpmAlgHash._hash_algP   s    :?"";== Z&&&=??"Z&&&=??"Z&&&=??"!"Nd"N"NOOOr)   N)r6   r7   )r!   r"   r#   r9   r:   r;   r<   r@   r(   r)   r*   r1   r1   I   sB        DFFF
P 
P 
P 
P 
P 
Pr)   r1   c                  $    e Zd ZU ded<   ded<   dS )TpmsCertifyInfobytesnamequalified_nameN)r!   r"   r#   __annotations__r(   r)   r*   rB   rB   ]   s'         KKKr)   rB   s   TCGs   c                  ^    e Zd ZU dZded<   ded<   ded<   ded<   d	ed
<   edd            ZdS )TpmAttestationFormatu  the signature data is defined by [TPMv2-Part2] Section 10.12.8 (TPMS_ATTEST)
    as:
      TPM_GENERATED_VALUE (0xff544347 aka "ÿTCG")
      TPMI_ST_ATTEST - always TPM_ST_ATTEST_CERTIFY (0x8017)
        because signing procedure defines it should call TPM_Certify
        [TPMv2-Part3] Section 18.2
      TPM2B_NAME
        size (uint16)
        name (size long)
      TPM2B_DATA
        size (uint16)
        name (size long)
      TPMS_CLOCK_INFO
        clock (uint64)
        resetCount (uint32)
        restartCount (uint32)
        safe (byte) 1 yes, 0 no
      firmwareVersion uint64
      attested TPMS_CERTIFY_INFO (because TPM_ST_ATTEST_CERTIFY)
        name TPM2B_NAME
        qualified_name TPM2B_NAME
    See:
      https://www.trustedcomputinggroup.org/wp-content/uploads/TPM-Rev-2.0-Part-2-Structures-01.38.pdf
      https://www.trustedcomputinggroup.org/wp-content/uploads/TPM-Rev-2.0-Part-3-Commands-01.38.pdf
    rC   rD   dataztuple[int, int, int, bool]
clock_infointfirmware_versionrB   attestedr6   c           
        t          |          }|                    d          }|t          k    rt          d          |                    d          }|t          k    rt          d          	 |                    |                    d                    }|                    |                    d                    }|                    d          }|                    d          }|                    d          }|                    d          }	|	d	vrt          d
|	dd          |	dk    }
|                    d          }|                    |                    d                    }|                    |                    d                    }n&# t          j        $ r}t          |          d }~ww xY w | ||||||
f|t          ||                    S )Nr2   z generated value field is invalidr   ztpmi_st_attest field is invalid!Hz!Q!LB)r   r   zinvalid value 0xxz for booleanr   )rD   rE   )rD   rI   rJ   rL   rM   )	r   readTPM_GENERATED_VALUE
ValueErrorTPM_ST_ATTEST_CERTIFYunpackstructerrorrB   )clsrI   readergenerated_valuetpmi_st_attestrD   clockreset_countrestart_count
safe_valuesaferL   attested_nameattested_qualified_namees                  r*   parsezTpmAttestationFormat.parse   s   D!! ++a..
 111?@@@
  Q222>???	 ;;v}}T2233D;;v}}T2233DMM$''E ----K"MM$//Ms++J'' !NJ!N!N!N!NOOO?D%}}T22"KKd(;(;<<M&,kk&--2E2E&F&F##| 	  	  	 Q--	  s{M4@-$"3J  
 
 
 	
s   /D'F F:&F55F:N)rI   rC   r6   rH   r!   r"   r#   __doc__rF   classmethodrf   r(   r)   r*   rH   rH   g   sv          4 KKKKKK****,
 ,
 ,
 [,
 ,
 ,
r)   rH   c                  R    e Zd ZU dZded<   ded<   ded<   ded<   ed             ZdS )	TpmsRsaParmszParse TPMS_RSA_PARMS struct

    See:
    https://www.trustedcomputinggroup.org/wp-content/uploads/TPM-Rev-2.0-Part-2-Structures-01.38.pdf
    section 12.2.3.5
    rK   	symmetricschemekey_bitsexponentc                   |                     d          }|t          j        t          j        z  z  }|t          j        t          j        z  k    }|s|t          k    rt          d          |                     d          }|t          j        t          j        z  z  }|t          j        k    }|r/|t          t          j        t          j	        fvrt          d          |t          j        t          j        z  k    }	|	r)|t          j        t          j	        fvrt          d          |t          j        k    }
|
r/|t          j
        t          j        t          fvrt          d          |r|t          fvrt          d          |                     d          }|                     d          }|dk    rd	} | ||||          S )
NrO    symmetric is expected to be NULLzlkey is an unrestricted signing key, scheme is expected to be TPM_ALG_RSAPSS, TPM_ALG_RSASSA, or TPM_ALG_NULLz[key is a restricted signing key, scheme is expected to be TPM_ALG_RSAPSS, or TPM_ALG_RSASSAzlkey is an unrestricted decryption key, scheme is expected to be TPM_ALG_RSAES, TPM_ALG_OAEP, or TPM_ALG_NULLzJkey is an restricted decryption key, scheme is expected to be TPM_ALG_NULLrP   r   i  )rW   
ATTRIBUTES
RESTRICTEDDECRYPTTPM_ALG_NULLrU   SIGN_ENCRYPTr   r$   r%   r&   r'   )rZ   r[   
attributesrl   restricted_decryptionis_restricted_decryption_keyrm   restricted_signis_unrestricted_signing_keyis_restricted_signing_keyis_unrestricted_decryption_keyrn   ro   s                r*   rf   zTpmsRsaParms.parse   s   MM$''	 *!J$66!
 (=!66(
$ , 	A	\0I0I ?@@@ t$$$
(=
@W(WX&59P&P#& 		6:
 ,
 ,

 "   %4!J$;;%
! % 	8
 *
 *
 C  
 *?*BT)T&) 		f=
 /
 /

    ( 	F</,I,I.  
 ==&&==&&q=="Hs9fh999r)   Nrg   r(   r)   r*   rk   rk      sd           NNNKKKMMMMMMC: C: [C: C: C:r)   rk   c                  &    e Zd Zedd            ZdS )Tpm2bPublicKeyRsar[   r   r6   c                d     | |                     |                    d                              S NrO   rS   rW   )rZ   r[   s     r*   rf   zTpm2bPublicKeyRsa.parse  s*    s6;;v}}T2233444r)   N)r[   r   r6   r   )r!   r"   r#   ri   rf   r(   r)   r*   r   r     s2        5 5 5 [5 5 5r)   r   c                  >    e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZddZdS )TpmEccCurvezTPM_ECC_CURVE
    https://www.trustedcomputinggroup.org/wp-content/uploads/TPM-Rev-2.0-Part-2-Structures-01.38.pdf
    section 6.4
    r   r   r      r2      r          r6   ec.EllipticCurvec                   | t           j        k    rt          d          | t           j        k    rt	          j                    S | t           j        k    rt	          j                    S | t           j        k    rt	          j	                    S | t           j
        k    rt	          j                    S | t           j        k    rt	          j                    S t          d|           )NzNo such curvezcurve is not supported)r   NONErU   	NIST_P192r   	SECP192R1	NIST_P224	SECP224R1	NIST_P256	SECP256R1	NIST_P384	SECP384R1	NIST_P521	SECP521R1r>   s    r*   to_curvezTpmEccCurve.to_curve%  s    ;###_---[***<>>![***<>>![***<>>![***<>>![***<>>!14888r)   N)r6   r   )r!   r"   r#   rh   r   r   r   r   r   r   BN_P256BN_P638SM2_P256r   r(   r)   r*   r   r     sa         
 DIIIIIGGH9 9 9 9 9 9r)   r   c                  "    e Zd ZdZeZdZdZdZdS )
TpmiAlgKdfzTPMI_ALG_KDF
    https://www.trustedcomputinggroup.org/wp-content/uploads/TPM-Rev-2.0-Part-2-Structures-01.38.pdf
    section 9.28
    r   !   "   N)	r!   r"   r#   rh   ru   NULLKDF1_SP800_56AKDF2KDF1_SP800_108r(   r)   r*   r   r   6  s.         
 DNDNNNr)   r   c                  P    e Zd ZU ded<   ded<   ded<   ded<   edd            ZdS )TpmsEccParmsrK   rl   rm   r   curve_idr   kdfr[   r   r6   c                b   |                     d          }|                     d          }|t          k    rt          d          |t          k    rt          d          t          |                     d                    }t	          |                     d                    } | ||||          S )NrO   rq   zscheme is expected to be NULL)rW   ru   rU   r   r   )rZ   r[   rl   rm   r   
kdf_schemes         r*   rf   zTpmsEccParms.parseJ  s    MM$''	t$$$$?@@@\!!<===v}}T2233d 3 344
s9fh
;;;r)   N)r[   r   r6   r   )r!   r"   r#   rF   ri   rf   r(   r)   r*   r   r   C  s[         NNNKKKOOO< < < [< < <r)   r   c                  @    e Zd ZU dZded<   ded<   ed
d            Zd	S )TpmsEccPointzTPMS_ECC_POINT
    https://www.trustedcomputinggroup.org/wp-content/uploads/TPM-Rev-2.0-Part-2-Structures-01.38.pdf
    Section 11.2.5.2
    rC   rR   yr[   r   r6   c                    |                     |                    d                    }|                     |                    d                    } | ||          S r   r   )rZ   r[   rR   r   s       r*   rf   zTpmsEccPoint.parsec  sL    KKd++,,KKd++,,s1ayyr)   N)r[   r   r6   r   rg   r(   r)   r*   r   r   Y  sR          
 HHHHHH   [  r)   r   c                  B    e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdS )rr   zObject attributes
    see section 8.3
      https://www.trustedcomputinggroup.org/wp-content/uploads/TPM-Rev-2.0-Part-2-Structures-01.38.pdf
    r   r2   r   r   @      i   i   i   i   i   l   	s N)r!   r"   r#   rh   	FIXED_TPMST_CLEARFIXED_PARENTSENSITIVE_DATA_ORIGINUSER_WITH_AUTHADMIN_WITH_POLICYNO_DAENCRYPTED_DUPLICATIONrs   rt   rv   SHALL_BE_ZEROr(   r)   r*   rr   rr   k  s^         
 IHL"NE#JGL	- MMr)   rr   r   
_PublicKeyc                      e Zd ZU dZded<   ded<   ded<   ded	<   d
ed<   ded<   ded<   edd            ZddZddZdS )TpmPublicFormata  the public area structure is defined by [TPMv2-Part2] Section 12.2.4
    (TPMT_PUBLIC)
    as:
      TPMI_ALG_PUBLIC - type
      TPMI_ALG_HASH - nameAlg
        or + to indicate TPM_ALG_NULL
      TPMA_OBJECT - objectAttributes
      TPM2B_DIGEST - authPolicy
      TPMU_PUBLIC_PARMS - type parameters
      TPMU_PUBLIC_ID - uniq
    See:
      https://www.trustedcomputinggroup.org/wp-content/uploads/TPM-Rev-2.0-Part-2-Structures-01.38.pdf
    r,   sign_algr1   name_algrK   rw   rC   auth_policy_Parameters
parameters_Uniquer   rI   r6   c           	     :   t          |          }t          |                    d                    }t          |                    d                    }|                    d          }|t          j        z  dk    rt          d|d          |                    |                    d                    }|t          j        k    r6t          
                    ||          }t          
                    |          }nY|t          j        k    r5t          
                    |          }t          
                    |          }nt          d|dd          |                                }	t!          |	          dk    rt          d           | |||||||          S )	NrO   rP   r   z(attributes is not formated correctly: 0xrR   z	sign alg z is not supportedz+there should not be any data left in buffer)r   r,   rW   r1   rr   r   rU   rS   r.   rk   rf   r   r/   r   r   r=   len)
rZ   rI   r[   r   r   rw   r   r   r   rests
             r*   rf   zTpmPublicFormat.parse  ss   D!!fmmD1122fmmD1122]]4((

00A55V
VVVWWWkk&--"5"566z~%%&2&8&8&L&LJ/55f==FF''%++F33J!''//FF%&O(&O&O&O&OPPP{{}}t99>>JKKKsh
KVT
 
 	
r)   r   c                   | j         t          j        k    rzt          t          | j                  j        }t          t          t          | j	                            }t          j        ||                              t                                S | j         t          j        k    rt          t          | j	                  }t!          j        t          |j                  t          |j                  t          t(          | j                  j                                                                      t                                S t/          d| j                   )Nzpublic_key not implemented for )r   r,   r.   r   rk   r   ro   r   r   r   r   RSAPublicNumbers
public_keyr   r/   r   r   EllipticCurvePublicNumbersrR   r   r   r   r   r=   )r?   ro   modulusr   s       r*   r   zTpmPublicFormat.public_key  s   =JN**L$/::CH%6 D DEEG''::EEoFWFWXXX]jn,,,44F0&(##&(##\4?33<EEGG  j**++	, ""UDM"U"UVVVr)   c                   t          j        d| j                  }t          j        | j                                        t                                }|                    | j                   ||	                                z  }|S )u  
        Computing Entity Names

        see:
          https://www.trustedcomputinggroup.org/wp-content/uploads/TPM-Rev-2.0-Part-1-Architecture-01.38.pdf
        section 16 Names

        Name ≔ nameAlg || HnameAlg (handle→nvPublicArea)
          where
            nameAlg algorithm used to compute Name
            HnameAlg hash using the nameAlg parameter in the NV Index location
                     associated with handle
            nvPublicArea contents of the TPMS_NV_PUBLIC associated with handle
        rO   backend)
rX   packr   r   Hashr@   r   updaterI   finalize)r?   outputdigests      r*   rD   zTpmPublicFormat.name  sl     T4=11T]4466@Q@QRRRdi   &//###r)   N)rI   rC   r6   r   )r6   r   )r6   rC   )	r!   r"   r#   rh   rF   ri   rf   r   rD   r(   r)   r*   r   r     s           OOOOOOKKK
 
 
 [
8W W W W     r)   r   c                l   t          |            t          | j                  dk    rt          d          | j                            t          j                  }|st          d          | j                            t          j                  }d |j	        D             }d|vrt          d          d S )Nr   z#Certificate should not have Subjectz.Certificate should have SubjectAlternativeNamec                $    g | ]}|t           k    S r(   )OID_AIK_CERTIFICATE).0rR   s     r*   
<listcomp>z&_validate_tpm_cert.<locals>.<listcomp>  s    ;;;Aq'';;;r)   TzExtended key usage MUST contain the "joint-iso-itu-t(2) internationalorganizations(23) 133 tcg-kp(8) tcg-kp-AIKCertificate(3)" OID.)
r   r   subjectr   
extensionsget_extension_for_classr	   SubjectAlternativeNameExtendedKeyUsagevalue)certsexthas_aiks       r*   _validate_tpm_certr     s    $
4<1?@@@//0KLLA LJKKK
/
1
1$2G
H
HC;;;;;G7-
 
 	
 r)   c                  (    e Zd ZdZed             ZdS )TpmAttestationtpmc                   d|v rt          d          |d         }|d         }|d         }t          j        |d         t                                }t	          |           t          j        |                              |                                          }	 t          
                    |d                   }	n"# t          $ r}
t          d|
          d }
~
ww xY w|j        J |j        j                            |	                                          |j        j        k    rt          d	          	 t          
                    |          }||z   }|j        }t#          j        |t                      
          }|                    |           |                                }|j        |k    rt          d          |j        j        |	                                k    rt          d          |                    ||d                    t3          t4          j        |          S # t8          $ r t          d          w xY w)N
ecdaaKeyIdzECDAA not implementedalgx5ccertInfor   pubAreazunable to parse pubAreaz9attestation pubArea does not match attestedCredentialDatar   z5attestation does not sign for authData and ClientDataz;TPMS_CERTIFY_INFO does not include a valid name for pubAreasigz$signature of certInfo does not match)r=   r	   load_der_x509_certificater   r   r   for_algfrom_cryptography_keyr   r   rf   	Exceptionr   credential_datar
   rH   	_HASH_ALGr   r   r   r   rI   rM   rD   verifyr   r   ATT_CA_InvalidSignature)r?   	statement	auth_dataclient_data_hashr   r   	cert_infor   pub_keypub_areare   r   att_to_be_signedhash_algr   rI   s                   r*   r   zTpmAttestation.verify  sY   9$$%&=>>>j)	-c!fo6G6GHH4   /#&&<<T__=N=NOO	<&,,Yy-ABBHH 	< 	< 	<7;;;	< (444%0FF##%%  (34 4
 #K  $	K ',,Y77C  )+;;(H[?3D3DEEEFMM*+++??$$Dx4&K   | HMMOO33!Q   NN9i&6777$_%;SAAA  	K 	K 	K"#IJJJ	Ks%    B= =
CCC7C1H) )IN)r!   r"   r#   FORMATr   r   r(   r)   r*   r   r     s<        FBK BK ^BK BK BKr)   r   )>
__future__r   rX   dataclassesr   enumr   r   typingr   r   cryptographyr	   cryptography.exceptionsr
   r   cryptography.hazmat.backendsr   cryptography.hazmat.primitivesr   )cryptography.hazmat.primitives.asymmetricr   r   coser   utilsr   r   baser   r   r   r   r   r   ru   ObjectIdentifierr   r   r,   r1   rB   rT   rV   rH   rk   rC   r   r   r   r   r   rr   RSAPublicKeyEllipticCurvePublicKeyr   rF   r   r   r   r   r   r(   r)   r*   <module>r     s  < # " " " " " "  ! ! ! ! ! !                 " " " " " " " "       I I I I I I 8 8 8 8 8 8 1 1 1 1 1 1 = = = = = = = =       ) ) ) ) ) ) ) )                  +d+N;;      7           
 P P P P P P P P&        
 ! #  N
 N
 N
 N
 N
 N
 N
 N
b Q: Q: Q: Q: Q: Q: Q: Q:h5 5 5 5 5 5 5 5 9 9 9 9 9' 9 9 9B 	 	 	 	 	 	 	 	 < < < < < < < <*        "        6 (2+DD
 D D D D\)
l
* X X X X X X X Xv
 
 
(FK FK FK FK FK[ FK FK FK FK FKr)   