
    j?              	           d dl Z d dlZd dl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  G d d          Zded	dfd
Zddededed	efdZddeded	efdZ	 ddeee
f         deded	efdZd Zd ZdS )    N)BinaryIOUnion)keysx509)Name)loggerc                   $    e Zd ZdeddfdZd ZdS )MyFilterlevelreturnNc                     || _         d S N)r   )selfr   s     V/home/ubuntu/.hermes/hermes-agent/venv/lib/python3.11/site-packages/androguard/util.py__init__zMyFilter.__init__   s    


    c                 `    t          j        | j                  j        }|d         j        |k    S )Nr   )r   r   no)r   recordlevelnos      r   __call__zMyFilter.__call__   s(    ,tz**-g!W,,r   )__name__
__module____qualname__strr   r    r   r   r
   r
      sE        c d    - - - - -r   r
   r   r   c                     t          j        d           t          |           }t          j        t          j        |d           dS )a   
    Sets the log for loguru based on the level being passed.
    The possible string values are:
     
    * `TRACE`
    * `DEBUG`
    * `INFO`
    * `SUCCESS`
    * `WARNING`
    * `ERROR`
    * `CRITICAL`
    
    :param level: the log level string
    r   )filterr   N)r   remover
   addsysstderr)r   	my_filters     r   set_logr$      s>     M!I
Jsz)1555555r   buffoffsetsizec                     |                                  }|                     |           |                     |          }|                     |           |S r   )tellseekread)r&   r'   r(   idxds        r   read_atr/   -   sD    
))++CIIf		$AIIcNNNHr   Tfilenamebinaryc                     t          | |rdnd          5 }|                                cddd           S # 1 swxY w Y   dS )z
    Open and read a file
    :param filename: filename to open and read
    :param binary: `True` if the file should be read as binary
    :return: bytes if binary is `True`, str otherwise
    rbrN)openr,   )r0   r1   fs      r   readFiler7   5   s     
h/C	0	0 Avvxx                 s   6::F, nameshort	delimiterc                     t           t                    r j         i ddddddddd	d
dddddddddddddddddddddd d!d"d#d$d%d&d'd(d)|                     fd* D                       S )+a)  
    Format the Name type of a X509 Certificate in a human readable form.

    :param name: Name object to return the DN from
    :param short: Use short form (default: False)
    :param delimiter: Delimiter string or character between two parts (default: ', ')

    :returns: the name string
    business_category)businessCategoryr>   serial_number)serialNumberr@   country_name)CcountryNamepostal_code)
postalCoderE   state_or_province_name)STstateOrProvinceNamelocality_name)LlocalityNamestreet_address)streetstreetAddressorganization_name)OorganizationNameorganizational_unit_name)OUorganizationalUnitNametitle)rU   rU   common_name)CN
commonNameinitials)rY   rY   generation_qualifier)generationQualifierr[   surname)SNr\   
given_name)GN	givenNamer9   )r9   r9   	pseudonym)ra   ra   )dnQualifierrb   )telephoneNumberrc   )EemailAddress)DCdomainComponent)nameDistinguisherrh   )organizationIdentifierri   )dn_qualifiertelephone_numberemail_addressdomain_componentname_distinguisherorganization_identifierc           	          g | ]>}d                                          |||f          rdnd         |                   ?S )z{}={}r      )formatget).0attr_r9   r:   s     r   
<listcomp>z/get_certificate_name_string.<locals>.<listcomp>n   sb     	
 	
 	
  NNdT4L))u*;!!!<d4j 	
 	
 	
r   )
isinstancer   nativejoin)r9   r:   r;   rv   s   `` @r   get_certificate_name_stringr{   @   so    $ {	E	9	 	,	 	3		
 	!"?	 	.	 	5	 	6	 	#$D	 	#	 	+	 	,	 	 N	 	$	 	)	  	 !	" 	/#	$ 7B.5H$
/	 	 	A8 >>	
 	
 	
 	
 	
 	
 		
 	
 	
  r   c                 D   ddl m}m}m} 	 |                    |           r-|                    |           \  }}}|dv rt          d          n| }	 |j                            |          }|j	         |S # t          $ r Y nw xY w	 |j
                            |          }|d         d         }|j	         |S # t          $ r Y nw xY w	 |j                            |          }	|	j	         |j                            |	d          S # t          $ r Y nw xY wt          d          )	Nr   )r   pemr   )zPRIVATE KEYzRSA PRIVATE KEYzAThe data specified appears to be a private key, not a public key.tbs_certificatesubject_public_key_inforsazRThe data specified does not appear to be a known public key or certificate format.)
asn1cryptor   r}   r   detectunarmor
ValueErrorPublicKeyInfoloadry   CertificateRSAPublicKeywrap)
datar   r}   r   	type_namerv   	der_bytespublic_key_infocertificatersa_public_keys
             r   parse_publicr   w   s   ********** zz$ "%++d"3"3	1i:::S   ; 	,11)<<   &++I66%&78%
 	   *//	::!&&~u===    \  s6   "A4 4
B B0B6 6
CC;D 
DDc                 >   d}| j         dk    r+| d         j        }d|d         j        |d         j        fz  }n| j         dk    rK| d         j        }| d         d	         }d
|d         j        |d         j        |d         j        |j        fz  }n@| j         dk    r5| d         j        }d| j        d         z  }|                    d          |z   }t          |t                    r|                    d          }t          j        |          	                                S )z
    Calculates a SHA-256 fingerprint of the public key based on its components.

    :param key_object: A keys.PublicKeyInfo object containing the parsed public key
    :return: The fingerprint of the public key as a byte string
    Nr   
public_keyz%d:%dmoduluspublic_exponentdsa	algorithm
parametersz%d:%d:%d:%dpqgecz%s:rq   zutf-8)
r   parsedry   curveencoderx   r   hashlibsha256digest)
key_objectto_hashkeyparamsr   s        r   calculate_fingerprintr      s5    G u$$&-	N!!")
 
 
		&	&&-K(63K3K3KJ	#
 
 
		%	%-4
**1--..))J6 '3 *..)) >'""))+++r   )r%   )T)Fr8   )binasciir   r!   typingr   r   r   r   r   asn1crypto.x509r   logurur   r
   r   r$   intbytesr/   boolr7   dictr{   r   r   r   r   r   <module>r      s     



 " " " " " " " " ! ! ! ! ! ! ! ! !                - - - - - - - -6# 6$ 6 6 6 6. ( C s E     s D E     DH4 4
d

4$(4=@44 4 4 4n5 5 5p+, +, +, +, +,r   