o
    e                     @   s8   d dl mZmZmZmZmZ dd Zdd Zdd ZdS )	    )DerSequence
DerIntegerDerBitStringDerObjectIdDerNullc                 C   s   t  j| dd}t  j|d dd}t |d }t |d j}t|dkr,d}nzt |d  d}W n   |d }Y |j||fS )zParse a SubjectPublicKeyInfo structure.

    It returns a triple with:
        * OID (string)
        * encoded public key (bytes)
        * Algorithm parameters (bytes or None)
       Znr_elementsr   )   r   r	   N)r   decoder   r   valuelenr   )encodedspkialgoalgo_oidZspkZalgo_params r   ID:\Projects\ConvertPro\env\Lib\site-packages\Crypto/PublicKey/__init__.py_expand_subject_public_key_info   s   
r   c                 C   s@   |d u rt t| g}nt t| |g}t |t|g}| S )N)r   r   r   encode)r   Z
public_keyparams	algorithmr   r   r   r   _create_subject_public_key_info?   s   r   c                 C   s   t  j| dd}t  j|d tddd}d}z|d d  d}W || S  tyE   tdd|d j}|d	vr>td
d}Y || S w )z:Extract subjectPublicKeyInfo from a DER X.509 certificate.   r   r            r	   )Zexplicit)r   r   z#Incorrect X.509 certificate version)r   r
   range	TypeErrorr   r   
ValueError)Zx509_certificateZcertificateZtbs_certificateindexversionr   r   r    _extract_subject_public_key_infoL   s    r!   N)	ZCrypto.Util.asn1r   r   r   r   r   r   r   r!   r   r   r   r   <module>   s   &