o
    Þý°j“  ã                   @   s`   d dl T d dlmZmZmZmZ d dlmZmZm	Z	 ddgZ
dddeƒ dfdd„Zd	dd„ZdS )
é    )Ú*)ÚDerNullÚDerSequenceÚDerObjectIdÚDerOctetString)ÚPBES1ÚPBES2Ú	PbesErrorÚwrapÚunwrapNc           
      C   s€   |du rt t|ƒgƒ}nt t|ƒ|gƒ}t d|t| ƒgƒ}| ¡ }	|du r'|	S |s-tdƒ‚t|ƒ}|du r7d}t |	||||¡S )a6  Wrap a private key into a PKCS#8 blob (clear or encrypted).

    Args:

      private_key (bytes):
        The private key encoded in binary form. The actual encoding is
        algorithm specific. In most cases, it is DER.

      key_oid (string):
        The object identifier (OID) of the private key to wrap.
        It is a dotted string, like ``'1.2.840.113549.1.1.1'`` (for RSA keys)
        or ``'1.2.840.10045.2.1'`` (for ECC keys).

    Keyword Args:

      passphrase (bytes or string):
        The secret passphrase from which the wrapping key is derived.
        Set it only if encryption is required.

      protection (string):
        The identifier of the algorithm to use for securely wrapping the key.
        Refer to :ref:`the encryption parameters<enc_params>` .
        The default value is ``'PBKDF2WithHMAC-SHA1AndDES-EDE3-CBC'``.

      prot_params (dictionary):
        Parameters for the key derivation function (KDF).
        Refer to :ref:`the encryption parameters<enc_params>` .

      key_params (DER object or None):
        The ``parameters`` field to use in the ``AlgorithmIdentifier``
        SEQUENCE. If ``None``, no ``parameters`` field will be added.
        By default, the ASN.1 type ``NULL`` is used.

      randfunc (callable):
        Random number generation function; it should accept a single integer
        N and return a string of random data, N bytes long.
        If not specified, a new RNG will be instantiated
        from :mod:`Cryptodome.Random`.

    Returns:
      bytes: The PKCS#8-wrapped private key (possibly encrypted).
    Nr   zEmpty passphrasez"PBKDF2WithHMAC-SHA1AndDES-EDE3-CBC)r   r   r   ÚencodeÚ
ValueErrorÚtobytesr   Úencrypt)
Úprivate_keyÚkey_oidÚ
passphraseÚ
protectionÚprot_paramsÚ
key_paramsÚrandfuncÚ	algorithmÚpk_infoÚpk_info_der© r   ú†/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/Cryptodome/IO/PKCS8.pyr
   2   s&   5ýÿc           
   
   C   sÖ  |durrt |ƒ}d}z
t | |¡} d}W n" ty, } zdt|ƒ }W Y d}~nd}~w ty6   d}Y nw |sjz
t | |¡} d}W n& ty] } z|dt|ƒ 7 }W Y d}~nd}~w tyi   |d7 }Y nw |srtd| ƒ‚tƒ j| d	d
�}t	|ƒdkr†|s†tdƒ‚|d dkr—t	|ƒdvr–tdƒ‚n|d dkr¨t	|ƒdvr§tdƒ‚ntdƒ‚tƒ j|d dd
�}t
ƒ  |d ¡j}t	|ƒdkrÈd}nztƒ  |d ¡ d}W n   |d }Y tƒ  |d ¡j}	||	|fS )aN  Unwrap a private key from a PKCS#8 blob (clear or encrypted).

    Args:
      p8_private_key (bytes):
        The private key wrapped into a PKCS#8 container, DER encoded.

    Keyword Args:
      passphrase (byte string or string):
        The passphrase to use to decrypt the blob (if it is encrypted).

    Return:
      A tuple containing

       #. the algorithm identifier of the wrapped key (OID, dotted string)
       #. the private key (bytes, DER encoded)
       #. the associated parameters (bytes, DER encoded) or ``None``

    Raises:
      ValueError : if decoding fails
    NFTz	PBES1[%s]zPBES1[Invalid]z
,PBES2[%s]z,PBES2[Invalid]zError decoding PKCS#8 (%s))é   é   é   é   )Únr_elementsr   z;Not a valid clear PKCS#8 structure (maybe it is encrypted?)r   )r   r   z#Not a valid PrivateKeyInfo SEQUENCEé   )r   r   r   )r!   r   )r   r   Údecryptr	   Ústrr   r   r   ÚdecodeÚlenr   Úvaluer   r   Úpayload)
Úp8_private_keyr   ÚfoundÚeÚ	error_strr   ÚalgoÚalgo_oidÚalgo_paramsr   r   r   r   r   �   s^   €ÿ€ÿÿÿ

)N)ÚCryptodome.Util.py3compatÚCryptodome.Util.asn1r   r   r   r   ÚCryptodome.IO._PBESr   r   r	   Ú__all__r
   r   r   r   r   r   Ú<module>   s   "
ÿO