
# py25519
Python wrapper around curve25519 by mehdi sotoodeh.  The files under py25519/c  are from mehdi sotoodeh and are copied unchanged from https://github.com/msotoodeh/curve25519.

# LICENSE
The files under py25519/c are licensed under the MIT LICENSE (see license.txt file under py25519/c).

All remaining files in this package are licensed under the GNU General Public License version 3 or (at your option) any later version.

See the file LICENSE-GPLv3.txt for details of the GNU General Public License version 3.


# Class Documentation
~~~~ {.sourceCode .python}
	class Key25519(__builtin__.object)
	    __init__(self, secretkey=None, verifyingkey=None, pubkey=None)
		    '''
	        secretkey-->bytes[32]
 	        verifyingkey-->bytes[32]
	        pubkey-->bytes[32]

	        A PublicKey version of the object will have ONLY verifyingkey
	        and pubkey and signingkey will be None
	        A PrivateKey version of the object will have secretkey set
	        and verifyingkey and pubkey are ignored and derived from secretkey
	       
	        Storing and reusing the secretkey is a way to recreate your key pair
		    '''
	   
	    get_ecdh_key(self, other)
		    '''
	        other-->Key25519 instance
		    '''
	   
	    public_key(self)
		    '''
	        Returns a PublicKey version of this object
		    '''
	   
	    selftest(self)
		    '''
	        Returns-->boolean
		    '''
	   
	    serialize(self)
	   
	    sign = wrapped(*args, **kwargs)
	   
	    verify = wrapped(*args, **kwargs)
	   
	    # ---------------------------------------------------------------------
	    # Properties (data descriptors)
	    # ---------------------------------------------------------------------
	   
	    pubkey
	   
	    secretkey
	   
	    signingkey
	   
	    verifyingkey
~~~~


# Simple test
see py25519.test.py

~~~~ {.sourceCode .python}
    from py25519 import Key25519

    c = Key25519()
    print('secretkey: ', c.secretkey)
    print('signingkey: ', c.signingkey)
    print('verifyingkey: ', c.verifyingkey)

    msg = 'Hello world'
    badmsg = msg + '1'
    sig = c.sign(msg)
    badsig = c.sign(badmsg)
    print('good verify: ', c.verify(sig, msg))
    print('badmsg verify: ', c.verify(sig, badmsg))
    print('badsig verify: ', c.verify(badsig, msg))

    d = Key25519(secretkey=c.secretkey)
    print('----- d is a copy of c -----')
    print('d.verify: ', d.verify(sig, msg))
    print('c == d:', c == d)
    print('public(c) == public(d):', c.public_key() == d.public_key())
    print('c == public(d):', c == d.public_key())

    print('----- e is a new different key -----')
    e = Key25519()
    print('e.verify: ', e.verify(sig, msg))
    print('c == e:', c == e)
    print('public(c) == public(e):', c.public_key() == e.public_key())

    print('----- Test ECDH shared key -----')
    ecdh1 = c.get_ecdh_key(e.public_key())
    ecdh2 = e.get_ecdh_key(c.public_key())
    print('ecdh equal: ', ecdh1 == ecdh2)
    ecdh3 = e.get_ecdh_key(c.public_key())
    print('ecdh equal again: ', ecdh1 == ecdh3)
~~~~
