
    E#i!                       S r SSKJr  SSKJr  SrSrSrSrSr	\
" / S	Q5      r\
" / S
Q5      r\
" \SS/5      r\
" \SS/5      r\
" \	S\\" \5      /\Q\P\" \5      P\Q5      rSS jrSS jrSSS jjrSSS jjrSS jrSS jrg)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      c                r    U S:  a  [        U /5      $ [        U 5      n[        S[        U5      -  /5      U-   $ )zEncode a length in DER format.   )bytesr   len)lengthlength_bytess     G/home/james-whalen/.local/lib/python3.13/site-packages/coincurve/der.pyencode_lengthr   B   s@     |fX  'L$\**+,|;;    c                    [        [        U 5      5      n[        U5      n[        SU-   [        U 5      -   5      n[        US'   XSSU-   & XSU-   S& [	        U5      $ )z%Encode an OCTET STRING in DER format.r   r   N)r   r   	bytearrayOCTET_STRING_TAGr   )valuer   length_bytes_lenresults       r   encode_octet_stringr#   M   sh     U,L<(q++c%j89F F1I'31q##$%*1!"=r   c                    [        [        U 5      S-   5      n[        U5      n[        SU-   S-   [        U 5      -   5      n[        US'   X$SSU-   & XSU-   '   XSU-   S-   S& [	        U5      $ )z"Encode a BIT STRING in DER format.r   r   N)r   r   r   BIT_STRING_TAGr   )r    unused_bitsr   r!   r"   s        r   encode_bit_stringr'   X   s     Ua0L<(q++a/#e*<=FF1I'31q##$#.1 ).1!#%&=r   Nc                   [        [        5      n[        U 5      nUR                  U5        UbR  [	        U5      n[        U5      nUR                  S5        UR                  [        U5      5        UR                  U5        [        [        /5      nUR                  [        [        U5      5      5        UR                  U5        [        U5      n[        [        /5      nS[        [        5      -   [        U5      -   n	UR                  [        U	5      5        UR                  [        5        UR                  [        5        UR                  U5        [        U5      $ )a5  
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
   r   )r   VERSION_INTEGER_ONEr#   extendr'   r   appendr   SEQUENCE_TAGEC_ALGORITHM_IDENTIFIERVERSION_INTEGER_ZEROr   )
private_key
public_keyec_key_bufferprivate_key_ospublic_key_bs
pubkey_len
ec_key_seq	ec_key_osr"   	outer_lens
             r   
encode_derr9   d   s$    12M )5N( )*5'
T"]:67]+ L>*JmC$678m$ $J/I ~&F C/003y>AI
MM-	*+ MM&' MM)* MM)=r   c                |    X   nUS-  nUS:  a  X!4$ US-  nSn[        U5       H  nUS-  X   -  nUS-  nM     XA4$ )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)dataoffsetlength_bytenum_length_bytesr   _s         r   decode_lengthrC      sl     ,K
aKF S"" #T)F#$A+-! % >r   c                z   [        U 5      S:  d  U S   [        :w  a  Sn[        U5      eSn[        X5      u  p2X   [        :w  a  Sn[        U5      eUS-  n[        X5      u  pBX$-  nX   [        :w  a  Sn[        U5      eUS-  n[        X5      u  pRX%-   nX   [
        :w  a  Sn[        U5      eUS-  n[        X5      u  prXX'-    nU[        [        5      :w  d
  U[        :w  a  Sn[        U5      eUnX   [        :w  a  S	n[        U5      eUS-  n[        X5      u  pXX)-    n
[        U
5      S
:  d  U
S   [        :w  a  Sn[        U5      eSn[        X5      u  p;X   [        :w  a  Sn[        U5      eUS-  n[        X5      u  pX-  nX   [        :w  a  Sn[        U5      eUS-  n[        X5      u  pXX-    $ )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   r-   
ValueErrorrC   INTEGER_TAGOBJECT_IDENTIFIER_TAGEC_PUBKEY_OIDr   )der_datamsgr?   rB   version_lenalg_lenalg_endoid_lenalgorithm_oidpriv_lenec_data	ec_offset
ec_ver_lenkey_lens                 r   
decode_derrV      s    8}rXa[L89o Fh/IA ;&=o
aKF'9K
F <'@o
aKF#H5OGG 00;o
aKF#H5OGf&67M #m$$(F%o F ++Bo
aKF$X6H  12G 7|a71:57o I 4LA [(6oNI)'=JI --EoNI&w:G y233r   )r   intreturnr   )r    r   rX   r   )r   )r    r   r&   rW   rX   r   )N)r0   r   r1   zbytes | NonerX   r   )r>   r   r?   rW   rX   ztuple[int, int])rJ   r   rX   r   )__doc__
__future__r   coincurve.utilsr   rG   r%   r   rH   r-   r   rI   SECP256K1_OIDr/   r*   r   r.   r   r#   r'   r9   rC   rV    r   r   <module>r^      s   !F # (    @A45 k467 [$56 		!
 	! 	! 	! 	! 	 <	3l6Y4r   