
    di!                    (   d Z ddlmZ ddlmZ dZdZdZdZdZ	 e
g d	          Z e
g d
          Z e
eddg          Z e
eddg          Z e
e	de ee          gee ee          e          Zd!dZd"dZd#d$dZd%d&dZd'dZd(d ZdS ))a  
Minimal, dependency-free ASN.1/DER encoder & decoder for secp256k1 EC private keys.

This module implements just enough DER encoding/decoding to support:

    1. Outputting a DER-encoded PKCS#8 EC private key (with an embedded ECPrivateKey per RFC 5915)
    2. Reading such a DER-encoded EC private key

Only the following ASN.1 types are supported:

    - INTEGER
    - BIT STRING
    - OCTET STRING
    - OBJECT IDENTIFIER
    - SEQUENCE
    - Context-specific EXPLICIT tags (for the optional public key)

The expected DER structure is as follows:

    PrivateKeyInfo ::= SEQUENCE {
        version             INTEGER,           -- must be 0
        privateKeyAlgorithm SEQUENCE {
            algorithm       OBJECT IDENTIFIER, -- id-ecPublicKey (1.2.840.10045.2.1)
            parameters      OBJECT IDENTIFIER  -- secp256k1 (1.3.132.0.10)
        },
        privateKey          OCTET STRING       -- DER encoding of ECPrivateKey
    }

    ECPrivateKey ::= SEQUENCE {
        version        INTEGER,                     -- must be 1
        privateKey     OCTET STRING,                -- the secret bytes
        publicKey  [1] EXPLICIT BIT STRING OPTIONAL -- uncompressed public key
    }
    )annotations)int_to_bytes            0   )*      H      =   r      )+      r   r   
   r      lengthintreturnbytesc                    | dk     rt          | g          S t          |           }t          dt          |          z  g          |z   S )zEncode a length in DER format.   )r   r   len)r   length_bytess     K/var/www/html/volatility/venv/lib/python3.11/site-packages/coincurve/der.pyencode_lengthr   B   sM     ||fX  ''L$\***+,,|;;    valuec                    t          t          |                     }t          |          }t          d|z   t          |           z             }t          |d<   ||dd|z   <   | |d|z   d<   t	          |          S )z%Encode an OCTET STRING in DER format.r   r   N)r   r   	bytearrayOCTET_STRING_TAGr   )r   r   length_bytes_lenresults       r   encode_octet_stringr%   M   s     U,,L<((q++c%jj899F F1I'3F1q###$%*F1!!"==r   unused_bitsc                   t          t          |           dz             }t          |          }t          d|z   dz   t          |           z             }t          |d<   ||dd|z   <   ||d|z   <   | |d|z   dz   d<   t	          |          S )z"Encode a BIT STRING in DER format.r   r   N)r   r   r!   BIT_STRING_TAGr   )r   r&   r   r#   r$   s        r   encode_bit_stringr)   X   s     Ua00L<((q++a/#e**<==FF1I'3F1q###$#.F1 ).F1!#%%&==r   Nprivate_key
public_keybytes | Nonec                   t          t                    }t          |           }|                    |           |jt	          |          }t          |          }|                    d           |                    t          |                     |                    |           t          t          g          }|                    t          t          |                               |                    |           t          |          }t          t          g          }dt          t                    z   t          |          z   }	|                    t          |	                     |                    t                     |                    t                     |                    |           t          |          S )aU  
    Encode an EC private key in DER format (PKCS#8/RFC 5208).
    Optimized for secp256k1 keys.

    Parameters:
        private_key: The private key as bytes (32 bytes for secp256k1)
        public_key: The public key as bytes (65 bytes uncompressed for secp256k1, starting with 0x04)

    Returns:
        The DER-encoded private key
    N   r   )r!   VERSION_INTEGER_ONEr%   extendr)   r   appendr   SEQUENCE_TAGEC_ALGORITHM_IDENTIFIERVERSION_INTEGER_ZEROr   )
r*   r+   ec_key_bufferprivate_key_ospublic_key_bs
pubkey_len
ec_key_seq	ec_key_osr$   	outer_lens
             r   
encode_derr<   d   s    122M )55N((( )*55''
T"""]:66777]+++ L>**JmC$6$677888m$$$ $J//I ~&&F C/0003y>>AI
MM-	**+++ MM&''' MM)*** MM)==r   dataoffsettuple[int, int]c                    | |         }|dz  }|dk     r||fS |dz  }d}t          |          D ]}|dz  | |         z  }|dz  }||fS )z
    Decode a DER length field.

    Parameters:
        data: The DER-encoded data
        offset: The current offset in the data

    Returns:
        Tuple of (length, new_offset)
    r   r      r      )range)r=   r>   length_bytenum_length_bytesr   _s         r   decode_lengthrG      s     v,K
aKF SF"" #T)F#$$  A+f-!6>r   der_datac                   t          |           dk     s| d         t          k    rd}t          |          d}t          | |          \  }}| |         t          k    rd}t          |          |dz  }t          | |          \  }}||z  }| |         t          k    rd}t          |          |dz  }t          | |          \  }}||z   }| |         t
          k    rd}t          |          |dz  }t          | |          \  }}| |||z            }|t          t                    k    s|t          k    rd}t          |          |}| |         t          k    rd	}t          |          |dz  }t          | |          \  }	}| |||	z            }
t          |
          d
k     s|
d         t          k    rd}t          |          d}t          |
|          \  }}|
|         t          k    rd}t          |          |dz  }t          |
|          \  }}||z  }|
|         t          k    rd}t          |          |dz  }t          |
|          \  }}|
|||z            S )z
    Decode a DER-encoded EC private key to extract the private key secret.
    Optimized for secp256k1 keys.

    Parameters:
        der_data: The DER-encoded private key in PKCS#8 format

    Returns:
        The private key secret as bytes
    "   r   z)Invalid DER: not a valid PKCS#8 structurer   z-Invalid DER: expected INTEGER tag for versionz0Invalid DER: expected SEQUENCE tag for algorithmz+Invalid DER: expected OBJECT IDENTIFIER tagzNot an EC private keyz2Invalid DER: expected OCTET STRING for private keyr   z'Invalid EC key format: missing sequencez&Invalid EC key format: missing versionz5Invalid DER: expected OCTET STRING for EC private key)r   r2   
ValueErrorrG   INTEGER_TAGOBJECT_IDENTIFIER_TAGEC_PUBKEY_OIDr"   )rH   msgr>   rF   version_lenalg_lenalg_endoid_lenalgorithm_oidpriv_lenec_data	ec_offset
ec_ver_lenkey_lens                 r   
decode_derrZ      s    8}}rXa[L889oo Fh//IAv ;&&=oo
aKF'&99K
kF <''@oo
aKF#Hf55OGVwG 000;oo
aKF#Hf55OGVVfw&667M #m$$$$(F(F%oo F +++Boo
aKF$Xv66Hf v 112G 7||a71:557oo I )44LAy y[((6ooNI)'9==J	I y---EooNI&w	::GY 9y72233r   )r   r   r   r   )r   r   r   r   )r   )r   r   r&   r   r   r   )N)r*   r   r+   r,   r   r   )r=   r   r>   r   r   r?   )rH   r   r   r   )__doc__
__future__r   coincurve.utilsr   rL   r(   r"   rM   r2   r   rN   SECP256K1_OIDr4   r/   r   r3   r   r%   r)   r<   rG   rZ    r   r   <module>r`      s  ! !F # " " " " " ( ( ( ( ( (    @@@AA44455 uk4677 e[$566 %C		!
 	! 	! C	! 	! 	 	 < < < <   	 	 	 	 	3 3 3 3 3l   6Y4 Y4 Y4 Y4 Y4 Y4r   