
    ¿ig                     l    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Zd	dZdS )
    )*)DerNullDerSequenceDerObjectIdDerOctetString)PBES1PBES2	PbesErrorwrapunwrapNc                 d   |t          t          |          g          }nt          t          |          |g          }t          d|t          |           g          }|                                }	||	S |st	          d          t          |          }|d}t          j        |	||||          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_ders
             O/var/www/html/afkarena/venv/lib/python3.11/site-packages/Cryptodome/IO/PKCS8.pyr   r   2   s    j W!5!5 677		W!5!5z BCC	{++  G
 ..""K -+,,, $$J9
=j#[(< < <    c                    |t          |          }d}	 t          j        | |          } d}n6# t          $ r}dt	          |          z  }Y d}~nd}~wt
          $ r d}Y nw xY w|sU	 t          j        | |          } d}n<# t          $ r}|dt	          |          z  z  }Y d}~nd}~wt
          $ r |dz  }Y nw xY w|st          d|z            t                                          | 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                                          |d         d
          }t                                          |d                   j        }t          |          dk    rd}n:	 t                                          |d                    d}n#  |d         }Y nxY w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   s
             r   r   r      s   , Z((
	)"]>:FFNEE 	- 	- 	-#c!ff,IIIIII 	) 	) 	)(III	)  	//!&~z!J!J 3 3 3\CFF22						 / / /..			/  	G9IEFFFmm"">|"LLG
7||q 4 5 5 	50 qzQw<<v%%BCCC &	qw<<y((BCCC ) >???==
??D}}##DG,,2H
4yyA~~	"IIT!W%%%KK	"q'KKK !""))'!*55=K k;//sD   - 
A AA A &A> >
B7B""B76B7*)H 
H )N)Cryptodome.Util.py3compatCryptodome.Util.asn1r   r   r   r   Cryptodome.IO._PBESr   r	   r
   __all__r   r    r   r   <module>r7      s   F ( ' ' '            8 7 7 7 7 7 7 7 7 7 8
 +/4ggii$L< L< L< L<^a0 a0 a0 a0 a0 a0r   