File: //usr/local/CyberCP/lib/python3.10/site-packages/ecdsa/__pycache__/ecdsa.cpython-310.pyc
o
�h�{ � @ sX d Z ddlZddlmZ ddlmZ ddlmZ ddlmZ ddl m
Z
G d d
� d
e�ZG dd� de�Z
G d
d� de�ZG dd� de�ZG dd� de�Zdd� Zdd� Zdd� Zdd� Zee
d�d�Zee
d�d�Zee
d�d�Zee
d�d�Zee
d �d�Zee
d!�d�ZdZe�eeee�Zej eeeded"d#�Z!ee
d�d�Zee
d$�d�Zee
d%�d�Zee
d&�d�Zee
d'�d�Zee
d(�d�Zd)Ze�eeee�Z"ej e"eeded"d#�Z#ee
d*�d�Zee
d+�d�Zee
d,�d�Zee
d-�d�Zee
d.�d�ZdZe�ed/ee�Z$ej e$eeded"d#�Z%ee
d0�d�Zee
d1�d�Zee
d2�d�Zee
d3�d�Zee
d4�d�ZdZe�ed/ee�Z&ej e&eeded"d#�Z'd5Zd6Zee
d7�d�Zee
d8�d�Zee
d9�d�Ze�ed/ed�Z(ej e(eeded"d#�Z)ee
d:��Zee
d;��Zee
d<�d�Zee
d=�d�Zee
d>�d�Ze�ed/ed�Z*ej e*eeded"d#�Z+ee
d?��Zee
d@��Zee
dA�d�Zee
dB�d�Zee
dC�d�Ze�ed/ed�Z,ej e,eeded"d#�Z-ee
dD��Zee
dE��Zee
dF�d�Zee
dG�d�Zee
dH�d�Ze�ed/ed�Z.ej e.eeded"d#�Z/edI�ZedJ�Zee
dK�d�Zee
dL�d�Zee
dM�d�Ze�ed/ed�Z0ej e0eeded"d#�Z1dZdNZdOZdPZdQZdRZe�eeed�Z2ej e2eeded"d#�Z3dSZdTZdUZdVZdWZdXZ4e�eeed�Z5ej e5eede4d"d#�Z6dYZdZZd[Zd\ZdXZ4e�eeed�Z7ej e7eede4d"d#�Z8d]Zd^Zd_Zd`ZdaZdbZ4e�eeed�Z9ej e9eede4d"d#�Z:dcZddZdeZdfZdbZ4e�eeed�Z;ej e;eede4d"d#�Z<dgZdhZdiZdjZdkZdlZ4e�eeed�Z=ej e=eede4d"d#�Z>dmZdnZdoZdpZdlZ4e�eeed�Z?ej e?eede4d"d#�Z@dqZdrZdsZdtZduZdvZ4e�eeed�ZAej eAeede4d"d#�ZBdwZdxZdyZdzZdvZ4e�eeed�ZCej eCeede4d"d#�ZDee
d{�d�Zee
d|�d�Zee
d}�d�Zee
d~�d�Zee
d�d�Zee
d��d�Z4e�eeed�ZEej eEeede4d"d#�ZFee
d��d�Zee
d��d�Zee
d��d�Zee
d��d�Zee
d��d�Z4e�eeed�ZGej eGeede4d"d#�ZHee
d��d�Zee
d��d�Zee
d��d�Zee
d��d�Zee
d��d�Zee
d��d�Z4e�eeed�ZIej eIeede4d"d#�ZJee
d��d�Zee
d��d�Zee
d��d�Zee
d��d�Zee
d��d�Z4e�eeed�ZKej eKeede4d"d#�ZLee
d��d�Zee
d��d�Zee
d��d�Zee
d��d�Zee
d��d�Zee
d��d�Z4e�eeed�ZMej eMeede4d"d#�ZNee
d��d�Zee
d��d�Zee
d��d�Zee
d��d�Zee
d��d�Z4e�eeed�ZOej eOeede4d"d#�ZPdS )�aB
Low level implementation of Elliptic-Curve Digital Signatures.
.. note ::
You're most likely looking for the :py:class:`~ecdsa.keys` module.
This is a low-level implementation of the ECDSA that operates on
integers, not byte strings.
NOTE: This a low level implementation of ECDSA, for normal applications
you should be looking at the keys.py module.
Classes and methods for elliptic-curve signatures:
private keys, public keys, signatures,
and definitions of prime-modulus curves.
Example:
.. code-block:: python
# (In real-life applications, you would probably want to
# protect against defects in SystemRandom.)
from random import SystemRandom
randrange = SystemRandom().randrange
# Generate a public/private key pair using the NIST Curve P-192:
g = generator_192
n = g.order()
secret = randrange( 1, n )
pubkey = Public_key( g, g * secret )
privkey = Private_key( pubkey, secret )
# Signing a hash value:
hash = randrange( 1, n )
signature = privkey.sign( hash, randrange( 1, n ) )
# Verifying a signature for a hash value:
if pubkey.verifies( hash, signature ):
print("Demo verification succeeded.")
else:
print("*** Demo verification failed.")
# Verification fails if the hash value is modified:
if pubkey.verifies( hash-1, signature ):
print("**** Demo verification failed to reject tampered hash.")
else:
print("Demo verification correctly rejected tampered hash.")
Revision history:
2005.12.31 - Initial version.
2008.11.25 - Substantial revisions introducing new classes.
2009.05.16 - Warn against using random.randrange in real applications.
2009.05.17 - Use random.SystemRandom by default.
Originally written in 2005 by Peter Pearson and placed in the public domain,
modified as part of the python-ecdsa package.
� N)�int2byte� )�
ellipticcurve)�numbertheory)�
bit_length)�remove_whitespacec @ � e Zd ZdS )�RSZeroErrorN��__name__�
__module__�__qualname__� r r �>/usr/local/CyberCP/lib/python3.10/site-packages/ecdsa/ecdsa.pyr K � r c @ r )�InvalidPointErrorNr
r r r r r O r r c @ s e Zd ZdZdd� Zdd� ZdS )� Signaturez�
ECDSA signature.
:ivar int r: the ``r`` element of the ECDSA signature
:ivar int s: the ``s`` element of the ECDSA signature
c C s || _ || _d S )N)�r�s)�selfr r r r r �__init__[ s
zSignature.__init__c C s |� � }|�� }| j}| j}|}|}t|d|�� �|�� | |�� |�� } t� | |�� �}
|
d dkr8|
n|�� |
}t
�|||d|�}t�||�|| | | | }
t
||
�}t
�||| d|�}t�||�|| | | | }t
||�}||gS )aL
Returns two public keys for which the signature is valid
:param int hash: signed hash
:param AbstractPoint generator: is the generator used in creation
of the signature
:rtype: tuple(Public_key, Public_key)
:return: a pair of public keys that can validate the signature
� � r r )�curve�orderr r �pow�p�a�br �square_root_mod_primer �PointJacobi�inverse_mod�
Public_key)r �hash� generatorr �nr r �e�x�alpha�beta�y�R1�Q1�Pk1�R2�Q2�Pk2r r r �recover_public_keys_ s$
"�"
"
zSignature.recover_public_keysN)r r r
�__doc__r r1 r r r r r S s r c @ s2 e Zd ZdZddd�Zdd� Zdd� Zd d
� ZdS )
r"