partysig

Create and verify distributed multi-party signatures

MIT License

Downloads
36
Stars
6
Committers
1

========
partysig

A command-line tool for creating and verifying distributed multi-party signatures.

Installation

::

$ pip install partysig

Usage

Key generation

On one machine, run::

$ partysig keygen start [--size=N] [--threshold=K] [SOME LABEL]

Example output::

Give one code to each participant:
- 5-recipe-adult
- 4-potato-gremlin
Waiting for participants  [####################################]  100%
Key generated!
Master key: MASTER_KEY

On the other machines, run::

$ partysig keygen join [SOME LABEL]

Example output::

Enter code from Alice: 5-recipe-adult
Key generated!
Master key: MASTER_KEY

Enter code from Alice: 4-potato-gremlin
Key generated!
Master key: MASTER_KEY

Signing

On the machine with the file to sign, run::

$ partysig sign start --key=MASTER_KEY FILE

Example output::

Give one code to each participant:
- 1-aftermath-pheasant
- 2-document-framework
Waiting for signers  [####################################]  100%
Threshold reached!
Signature: SIGNATURE

On the other machines, run::

$ partysig sign join
Enter code from Alice: 1-aftermath-pheasant
Waiting for signers...
Threshold reached!
Signature: SIGNATURE

$ partysig sign join
Enter code from Alice: 2-document-framework
Waiting for signers...
Threshold reached!
Signature: SIGNATURE

Verifying signatures

Run::

$ partysig verify FILE SIGNATURE

Example output::

Signature is valid!

Design

The current signature version (v1) implements Bitcoin-style multi-sig, where the overall multisignature contains:

  • The number of signatures required for the multisignature to be valid
  • The public keys allowed to create signatures
  • Signatures from a subset of those keys

The first two parts together are equivalent to a Bitcoin script, and are similarly hashed to get the "master key" for the multi-party signature group. Ed25519 is used for the individual signatures, and BLAKE2b is used for creating the master key.

Signature format

::

Version    (1-byte uint)     \
Threshold  (1-byte uint)      |_ Hashed to obtain
Size       (1-byte uint)      |  the master key
Pubkeys    (32 x size bytes) /
Signatures (64 x threshold bytes)

Acknowledgements

  • Joanna Rutkowska_ asked the question_ that prompted the creation of this tool.
  • Brian Warner_ wrote Magic Wormhole_, which is a key component to this tool's usability.

.. _Joanna Rutkowska: https://blog.invisiblethings.org/ .. _the question: https://twitter.com/rootkovska/status/806553962770006019 .. _Brian Warner: http://www.lothar.com/ .. _Magic Wormhole: https://github.com/warner/magic-wormhole