97 Commits

Author SHA1 Message Date
Piotr Lizonczyk
09392fda82 Add pypi badge 2017-09-12 22:42:34 +02:00
Piotr Lizonczyk
35dcd1c83b Add travis build status badge 2017-09-12 22:25:44 +02:00
Piotr Lizonczyk
b5e9542fb1 Update setup.py for PyPI. Version bump 2017-09-12 22:09:47 +02:00
Piotr Lizonczyk
3a8439894a Prepare for public release
- Added readme
- Updated setup.py
- Removed pytest from requirements, added version of cryptography
package
- Small improvements in code:

noise/noise_protocol.py:
* removed unused one_way variable

noise/patterns.py
* fixed has_pre_messages - no longer a variable, but method - and now
works properly

noise/state.py
* SymmetricState now holds reference to CipherState.
2017-09-12 21:59:47 +02:00
Piotr Lizończyk
fd8de56f8f Create LICENSE 2017-09-12 21:07:14 +02:00
Piotr Lizonczyk
2fa2f03d90 Various small fixes and cleanups
tests/vectors/*:
- removed noise-c-basic.txt test vectors

tests/test_vectors.py:
- removed workarounds related to noise-c test vectors

noise/builder.py:
- added some more type hinting

noise/state.py:
- CipherState is now consistent in raising NoiseMaxNonceError
and using MAX_NONCE constant for encrypt and decrypt methods

noise/functions.py:
- Keypair constructors now guarded from invalid length of given
public/private bytes
- _25519_generate_keypair now returns proper class instance

requirements.txt:
- specified versions of packages that are compatible with currently used source code
2017-09-12 00:49:24 +02:00
Piotr Lizonczyk
a60def7614 Added snow-multipsk test-vectors 2017-09-11 01:00:03 +02:00
Piotr Lizonczyk
ac7e3506a9 Turning off 3.7-dev testing
Cryptography ships with OpenSSL 1.0.2g when it's installed against
python3.7. Old OpenSSL is largely incompatible with this package.
Testing (and any required development for ensuring compatibility) will
be turned on again when Cryptography wheel for python3.7 will ship with
new OpenSSL
2017-09-03 22:52:28 +02:00
Piotr Lizończyk
48ab143bd9 Test against 3.7-dev - first alpha release is here 2017-09-03 21:56:59 +02:00
Piotr Lizonczyk
d0899c6871 Removing old echo example 2017-09-03 19:42:14 +02:00
Piotr Lizonczyk
57a64fc05e Fixing little bug with warnings 2017-09-03 19:40:09 +02:00
Piotr Lizonczyk
368d401701 Improved validation, various additions
noise/builder.py:
- Added guard for data length in decrypt
- Handling InvalidTag exception when AEAD fails
- New NoiseInvalidMessage exception class

noise/exceptions.py
- Three new exception classes

noise/noise_protocol.py
- Implemented rest of validation, now checks for required keypairs, setting initiator/responder role, warns if ephemeral keypairs are set.

noise/patterns.py:
- added name field to every Pattern with pattern name
- added get_required_keypairs method that returns list of keypairs required for given handshake pattern

noise/state.py
- new NoiseMaxNonceError exception

Overall: some TODOs resolved
2017-09-03 13:33:15 +02:00
Piotr Lizonczyk
eaecac6af4 Wireguard interoperability test script
This commit introduces an example of interoperability of this library
with Wireguard. The script is responsible for performing a Noise
handshake between localhost and Wireguard test server. Then, ICMP echo
request is sent and ICMP echo reply is retrieved. Lastly, Wireguard
keepalive packet is sent.

Example utilises Noise messages wrapped in Wireguard's packet
format.
2017-09-03 01:03:41 +02:00
Piotr Lizonczyk
8a5ff74cac Moved ed448 warning inside functions.py 2017-09-03 01:02:59 +02:00
Piotr Lizonczyk
865bbfe5ba Implemented cipher rekeying
noise/builder.py
- Added methods for rekeying cipherstates
- Added method for getting handshake hash (for channel binding)

noise/functions.py
- Added default rekey behavior and set it for AESGCM and ChaCha20

noise/constants.py
- Added MAX_NONCE

noise/state.py
- Added rekey method to CipherState
- Removed writing to noise_protocol instance in SymmetricState.
NoiseProtocol fills the appropriate field by taking the data from
HandshakeState now.
2017-09-02 17:38:02 +02:00
Piotr Lizończyk
46825bb075 Added NoiseBuilder class as final interface. (#1)
noise/__init__.py
- __all__ containing builder module

noise/builder.py
- NoiseBuilder class providing interface for use with other apps. Allows
for setting up all required data for Noise protocol, using appropriate
methods. Enforces proper path of handshake execution

noise/constants.py
- Added maximum Noise message length constant

noise/exceptions.py
- A few exceptions created for proper signaling of errors

noise/noise_protocol.py
- handshake_done does proper cleanup now
- new validation method that should be ran before starting handshake
(checks presence of prerequisites for current settings)
- new HandshakeState initialization method

noise/state.py
- Modified read_message and write_message methods of HandshakeState to
operate on bytes/bytearray as message/payload and bytearray as
message_buffer/payload_buffer. It is application's responsibility to
provide data in this form, underlying Noise code doesn't do buffer
reading/writing anymore.

tests/test_vectors.py
- Changed tests to comply with new code
2017-09-02 16:09:49 +02:00
Piotr Lizonczyk
96f7ba9b6b Added own insecure implementation of ed448 2017-08-27 17:03:50 +02:00
Piotr Lizonczyk
52fd5058bc Enabling PSK support. Core functionality ready!
noise/noise_protocol.py
* PSKs should be now delivered to NoiseProtocol while initialising
* New field `is_psk_handshake` in NoiseProtocol

noise/patterns.py
* Fixed erronenous super call in OneWayPattern
* Changed class variables to instance variables in Patterns, fixes
things.

noise/state.py
* Added missing mix_key_and_hash to SymmetricState
* Added required calls when in PSK handshake (TOKEN_E and TOKEN_PSK),
both in write_message and read_message of HandshakeState

tests/test_vectors.py
* Enabled PSK tests, some minor fixes to make them work
2017-08-19 01:27:59 +02:00
Piotr Lizonczyk
69aafd92d8 Turning off python3.5 support
It won't be supported until Cryptography gets fixed and we can turn away
from python's hashlib, since it supports blake2b/s from version 3.6
2017-08-19 00:04:56 +02:00
Piotr Lizonczyk
2384248d1c Enabling Blake2b/s support via hashlib
noise/functions.py
* Turning off Cryptography's primitives for hmac and hash functions,
using ones from python's hashlib instead.

tests/test_vectors.py
* Enabled blake2b/s tests
2017-08-19 00:01:34 +02:00
Piotr Lizonczyk
582ead091d Tons of fixes, working except Blake and PSK
noise/functions.py
* Enabling ChaCha20 usage (from Cryptography)
* Switching to per-cipher nonce formatting function
* Changes to KeyPair interface - now wrappers exist for every ECDH
* Fixing hmac_hash bug in implementation

noise/noise_protocol.py
* Added placeholders for multiple datafields in __init__, as well as for
transport mode cipher states
* Added handshake_done method for cleanup (post-handshake,
pre-transport), not finished though

noise/patterns.py
* Now Pattern holds boolean telling if it's oneway. OneWayPattern class
created for derivation by PatternN, PatternK, PatternX
* Fixed wrong mapping of PatternK and PatternX in patterns_map

noise/state.py
* CipherState now takes noise_protocol in __init__, so that
initialize_key() only reinitalizes CipherState instead of creating it.
* Changed CipherState creation in SymmetricState to reflect change above
* Fixing wrong sequence of concatenation hash and data in mix_hash()
* SymmetricState's split() fixed and calling noise_protocol's
handshake_done()
* Pattern tokens are now copied to HandshakeState instead of modifying
original Pattern
* Changes in HandshakeState's writemessage and readmessage to reflect
changes in KeyPair interface
* Added workaround for tests (usage of pre-generated ephemeral keypair),
to be removed in future

tests/test_vectors.py
* Individual test now is properly described in pytest with protocol name
* Finished main test case, fully utilises test vectors (and all their
messages)

tests/vectors/noise-c-basic.txttests/vectors/noise-c-basic.txt
* Forked rev30 test vector from noise-c
2017-08-18 23:13:07 +02:00
Piotr Lizonczyk
5c0311dff7 Implemented rest of CipherState's methods
noise/state.py
* Implemented CipherState's encrypt_with_ad() and decrypt_with_ad()
2017-08-15 00:59:52 +02:00
Piotr Lizonczyk
f2e68d226f Implemented rest of SymmetricState methods
noise/functions.py
* Added hmac_hash() and hkdf()

noise/noise_protocol.py
* Stores partials for hmac and hkdf (we need to specify proper hash
algorithm)

noise/state.py
* Implemented SymmetricState's mix_key(), encrypt_and_hash(),
decrypt_and_hash(), split()
2017-08-15 00:51:16 +02:00
Piotr Lizonczyk
bed5809cc1 Implementing write_message and read_message
noise/state.py
* Implemented HandshakeState's write_message and read_message
* Added variable placeholders in HandshakeState.__init__

noise/functions.py
* Refactored KeyPair into abstract class
* KeyPair25519 implements KeyPair with appropriate ed25519 methods

noise/noise_protocol.py
* Now holds proper KeyPair wrapper (chosen based on DH)

tests/test_vectors.py
* Skipping psk tests for now
2017-08-15 00:15:50 +02:00
Piotr Lizonczyk
512feb2029 Added AESGCM interface, skipping tests with ChaCha 2017-08-14 23:24:23 +02:00
Piotr Lizonczyk
8d807f9c6c Removing variable annotations for python 3.5 compatibility... again. 2017-08-14 22:54:52 +02:00
Piotr Lizonczyk
384ae2539b Switching source of crypto, adding DH
requirements.py
* Removing pycryptodome and ed25519 - the latter lacked ability to
perform DH
* Replacing aforementioned with cryptography package

noise/functions.py
* Switched hash-functions to ones from cryptography
* Added ed25519 method for DH wrapper and added compatible constructors
for KeyPair

tests/test_vectors.py
* Omit test vectors with ed448
* Parse hexstrings from JSONs properly into bytearrays.
2017-08-14 22:46:48 +02:00
Piotr Lizonczyk
bf054106ff Functioning HandshakeState.initialize()
noise/functions.py
* Wrapped cryptoalgorithms in maps with appropriate wrapper classes
* Probably finished Hash wrapper (to verify when we test first outputs
in tests)

noise/noise_protocol.py
* Slightly renamed attributes containing wrapped cryptoalgorithms
* Added placeholders for protocol State objects
* Now checks if given protocol_name is of bytes()

noise/state.py
* HandshakeState: remove handshake_pattern argument and take it from
given NoiseProtocol instance instead.
* HandshakeState: save NoiseProtocol instance in the HandshakeState
instance and vice versa
* SymmetricState: implemented initialize_symmetric() and mix_hash()
* SymmetricState: save NoiseProtocol instance in the SymmetricState
instance and vice versa
* CipherState: implemented initialize_key() as class constructor
* CipherState: save NoiseProtocol instance in the CipherState
instance and vice versa

tests/test_vectors.py
* Changes to reflect new signature of HandshakeState
* Fix - strings read from .json are now casted to bytes()
2017-08-14 17:47:54 +02:00
Piotr Lizonczyk
2e85d7527b Multiple improvements, fixing HandshakeState logic
noise/functions.py
* Moved dh, cipher and hash maps from noise_protocol.py
* Provisioned DH, Cipher, Hash classes
* Provisioned key public key derivation in KeyPair class

noise/state.py
* Fixed buggy logic for getting appropriate keys when parsing
pre-messages

tests/test_vectors.py
* Updated tests to reflect what we have already and prepare for next
failing additions (TDD-ish)
2017-08-14 12:05:09 +02:00
Piotr Lizonczyk
1164c4cabe Switching string formatting for python3.5 compat 2017-08-12 19:24:31 +02:00
Piotr Lizonczyk
bcaceb9ccd Improvements to initialization of NoiseProtocol
noise/noise_protocol.py
* Added validation of given function names vs available crypto methods
* Members of NoiseProtocol should now refer to proper classes/methods
after initialization of an instance

noise/patterns.py
* Added method for application of pattern modifiers

noise/crypto.py
* Provisioned ed448 function

noise/state.py
* Changed references to NoiseProtocol instances to make it more
consistent throughout the code
2017-08-12 13:30:44 +02:00
Piotr Lizonczyk
de73505ac3 Implementing NoiseProtocol (WIP), binding crypto
noise/noise_protocol.py - added maps of cryptofunctions that will be
used, finished protocol name splitting

noise/patterns.py - added map of patterns

requirements.txt - switching to pycryptodome as a source of cipher and
hashing functions, and ed25519 package for that curve
2017-08-09 23:55:32 +02:00
Piotr Lizonczyk
5cb448369c Removing rev30 tests, replacing with rev32
tests/vectors/Noise* - removed, as they are incompatible with current
revision

tests/vectors/cacophony.txt - added from Cacophony repository

tests/test_vectors.py - updated with currently implemented functionality
2017-08-09 23:51:39 +02:00
Piotr Lizonczyk
a6eec85ef7 Implemented HandshakeState.initialize()
constants.py
* Adding max Noise protocol name constant

noise_protocol.py
* Provisioning NoiseProtocol and KeyPair classes

patterns.py
* Switching to proper intra-package relative imports
* Adding getter functions for pre-messages

state.py
* Switching to proper intra-package relative imports
* Removed __init__ of HandshakeState, leaving only initialize() as
constructor function.
* Implemented initialize() along with helper functions for retrieving
keypairs
* Modified SymmetricState, removing __init__ and leaving
initialize_symmetric as a constructor function (only provisioned)
2017-08-07 00:50:45 +02:00
Piotr Lizonczyk
19e78f1583 Moving tests outside main package directory 2017-08-06 21:32:30 +02:00
Piotr Lizonczyk
fd95788672 Adding readme files to examples 2017-08-06 21:29:10 +02:00
Piotr Lizonczyk
611c456d5e Moving example related files from noise directory 2017-08-06 21:29:10 +02:00
Piotr Lizonczyk
bf36429fd7 * Adding handshake patterns
* Adding token constants for handshake patterns
2017-08-06 21:29:10 +02:00
Piotr Lizończyk
b7b9e29c27 Adding setup.py contents and README placeholder 2017-08-06 21:29:10 +02:00
Piotr Lizonczyk
7f0f6fb417 .travis.yml modification (no email notifications, add folding) 2017-08-06 21:29:10 +02:00
Piotr Lizonczyk
8cddef8ae5 Moving echo-script related code into suitable directory
Adding Empty class and switching some Nones to it where required by specification
Some additions to CipherState
2017-08-06 21:29:10 +02:00
Piotr Lizonczyk
2bfc10e080 Adding test vectors from reference implementation (noise-c)
Configuration for travis with pytest
Basic (failing) test for each vector
2017-08-06 21:29:10 +02:00
Piotr Lizonczyk
2c61f2bb86 State objects provisioned with appropriate methods 2017-08-06 21:29:10 +02:00
Piotr Lizonczyk
7a998277ea Adding pynacl to requirements
Adding noise-c echo-like script
2017-08-06 21:28:58 +02:00
Piotr Lizonczyk
4c77b8abdb Add example keys
Add python3.6 to travis
Provision directories
2017-08-06 21:28:22 +02:00
Piotr Lizończyk
60b1bae3cb Travis config provisioned 2016-10-11 14:20:09 +02:00
Piotr Lizończyk
0a796cfdfe Requirements and gitignore 2016-02-18 18:30:47 +01:00