From e57d6766248d53afff00223fc97895f487d3d12f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Haziza?= Date: Fri, 17 May 2024 17:48:50 +0200 Subject: [PATCH 01/14] Adding a separate header stream --- crypt4gh/cli.py | 22 ++++++++++++++++------ crypt4gh/lib.py | 6 ++++-- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/crypt4gh/cli.py b/crypt4gh/cli.py index 1859787..1cef13d 100644 --- a/crypt4gh/cli.py +++ b/crypt4gh/cli.py @@ -26,7 +26,7 @@ Utility for the cryptographic GA4GH standard, reading from stdin and outputting to stdout. Usage: - {PROG} [-hv] [--log ] encrypt [--sk ] --recipient_pk [--recipient_pk ]... [--range ] + {PROG} [-hv] [--log ] encrypt [--sk ] --recipient_pk [--recipient_pk ]... [--range ] [--header ] {PROG} [-hv] [--log ] decrypt [--sk ] [--sender_pk ] [--range ] {PROG} [-hv] [--log ] rearrange [--sk ] --range {PROG} [-hv] [--log ] reencrypt [--sk ] --recipient_pk [--recipient_pk ]... [--trim] @@ -41,6 +41,7 @@ --sender_pk Peer's Curve25519-based Public key to verify provenance (akin to signature) --range Byte-range either as or just (Start included, End excluded) -t, --trim Keep only header packets that you can decrypt + --header Where to write the header (default: stdout) Environment variables: @@ -146,11 +147,20 @@ def build_recipients(): if not recipient_keys: raise ValueError("No Recipients' Public Key found") - lib.encrypt(recipient_keys, - sys.stdin.buffer, - sys.stdout.buffer, - offset = range_start, - span = range_span) + header = args["--header"] + + try: + if header: + header = open(header, 'wb') + lib.encrypt(recipient_keys, + sys.stdin.buffer, + sys.stdout.buffer, + header= header, + offset = range_start, + span = range_span) + finally: + if header: + header.close() def decrypt(args): diff --git a/crypt4gh/lib.py b/crypt4gh/lib.py index 601797b..6589a4b 100644 --- a/crypt4gh/lib.py +++ b/crypt4gh/lib.py @@ -46,7 +46,7 @@ def _encrypt_segment(data, process, key): @close_on_broken_pipe -def encrypt(keys, infile, outfile, offset=0, span=None): +def encrypt(keys, infile, outfile, header_stream=None, offset=0, span=None): '''Encrypt infile into outfile, using the list of keys. @@ -58,6 +58,8 @@ def encrypt(keys, infile, outfile, offset=0, span=None): LOG.info('Encrypting the file') + header_stream = header_stream or outfile + # Forward to start position LOG.debug(" Start Coordinate: %s", offset) try: @@ -91,7 +93,7 @@ def encrypt(keys, infile, outfile, offset=0, span=None): header_bytes = header.serialize(header_packets) LOG.debug('header length: %d', len(header_bytes)) - outfile.write(header_bytes) + header_stream.write(header_bytes) # ...and cue music LOG.debug("Streaming content") From b4ee9c761274f870e168140259c37071c6a2a49e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Haziza?= Date: Fri, 17 May 2024 17:51:41 +0200 Subject: [PATCH 02/14] Renaming the keyword argument --- crypt4gh/cli.py | 4 ++-- crypt4gh/lib.py | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/crypt4gh/cli.py b/crypt4gh/cli.py index 1cef13d..325be55 100644 --- a/crypt4gh/cli.py +++ b/crypt4gh/cli.py @@ -151,11 +151,11 @@ def build_recipients(): try: if header: - header = open(header, 'wb') + header = open(header, 'wb') # let it raise exception lib.encrypt(recipient_keys, sys.stdin.buffer, sys.stdout.buffer, - header= header, + headerfile = header, offset = range_start, span = range_span) finally: diff --git a/crypt4gh/lib.py b/crypt4gh/lib.py index 6589a4b..fd24325 100644 --- a/crypt4gh/lib.py +++ b/crypt4gh/lib.py @@ -46,7 +46,7 @@ def _encrypt_segment(data, process, key): @close_on_broken_pipe -def encrypt(keys, infile, outfile, header_stream=None, offset=0, span=None): +def encrypt(keys, infile, outfile, headerfile=None, offset=0, span=None): '''Encrypt infile into outfile, using the list of keys. @@ -57,8 +57,8 @@ def encrypt(keys, infile, outfile, header_stream=None, offset=0, span=None): ''' LOG.info('Encrypting the file') - - header_stream = header_stream or outfile + + headerfile = headerfile or outfile # Forward to start position LOG.debug(" Start Coordinate: %s", offset) @@ -93,7 +93,7 @@ def encrypt(keys, infile, outfile, header_stream=None, offset=0, span=None): header_bytes = header.serialize(header_packets) LOG.debug('header length: %d', len(header_bytes)) - header_stream.write(header_bytes) + headerfile.write(header_bytes) # ...and cue music LOG.debug("Streaming content") From 6fd9dfdb0398fa09c3025ec5d4eb3f1921847354 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Haziza?= Date: Fri, 17 May 2024 20:55:40 +0200 Subject: [PATCH 03/14] Updating github action for python 3.12 --- .github/workflows/bats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/bats.yml b/.github/workflows/bats.yml index 0c4d250..09f14e4 100644 --- a/.github/workflows/bats.yml +++ b/.github/workflows/bats.yml @@ -7,9 +7,9 @@ jobs: runs-on: ubuntu-latest strategy: - max-parallel: 4 + max-parallel: 6 matrix: - python-version: [3.7, 3.8, 3.9] + python-version: [3.7, 3.8, 3.9, 3.10, 3.11, 3.12] steps: - uses: actions/checkout@v1 From d62d97687edc8f0b6f4532023d74c5767029aaf4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Haziza?= Date: Fri, 17 May 2024 20:56:01 +0200 Subject: [PATCH 04/14] Readme formatting --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f836fe2..fcac1a8 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ # Crypt4GH Encryption Utility -`crypt4gh`is a Python tool to encrypt, decrypt or re-encrypt files, according to the [GA4GH encryption file format](https://www.ga4gh.org/news/crypt4gh-a-secure-method-for-sharing-human-genetic-data/). +`crypt4gh` is a Python tool to encrypt, decrypt or re-encrypt files, according to the [GA4GH encryption file format](https://www.ga4gh.org/news/crypt4gh-a-secure-method-for-sharing-human-genetic-data/). ## Installation From 88c986a77e56014040160fed9cb564b54c83a4a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Haziza?= Date: Fri, 17 May 2024 20:58:03 +0200 Subject: [PATCH 05/14] upgrading github actions --- .github/workflows/bats.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/bats.yml b/.github/workflows/bats.yml index 09f14e4..29250b2 100644 --- a/.github/workflows/bats.yml +++ b/.github/workflows/bats.yml @@ -9,12 +9,12 @@ jobs: strategy: max-parallel: 6 matrix: - python-version: [3.7, 3.8, 3.9, 3.10, 3.11, 3.12] + python-version: ['3.7', '3.8', '3.9', '3.10', '3.11', '3.12'] steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v1 + uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} - name: Install dependencies From 8d1a26e9c3fe025b66a232a0aff87c00d931db5d Mon Sep 17 00:00:00 2001 From: Joris Vankerschaver Date: Tue, 21 May 2024 08:15:05 +0900 Subject: [PATCH 06/14] Test storing header separately --- tests/header_stream.bats | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 tests/header_stream.bats diff --git a/tests/header_stream.bats b/tests/header_stream.bats new file mode 100644 index 0000000..10f3baa --- /dev/null +++ b/tests/header_stream.bats @@ -0,0 +1,36 @@ +#!/usr/bin/env bats + +load _common/helpers + +function setup() { + + # Defining the TMP dir + TESTFILES=${BATS_TEST_FILENAME}.d + mkdir -p "$TESTFILES" + +} + +function teardown() { + rm -rf ${TESTFILES} +} + +@test "Bob sends the testfile secretly (with separate header and data) to Alice" { + + TESTFILE=${BATS_TEST_DIRNAME}/_common/testfile.abcd + + # Bob encrypts the testfile for Alice, storing the header separately + export C4GH_PASSPHRASE=${BOB_PASSPHRASE} + crypt4gh encrypt --sk ${BOB_SECKEY} --recipient_pk ${ALICE_PUBKEY} --header $TESTFILES/header.alice.c4gh < $TESTFILE > $TESTFILES/data.c4gh + + # Alice concatenates the header and data + cat $TESTFILES/header.alice.c4gh $TESTFILES/data.c4gh > $TESTFILES/message.c4gh + + # Alice decrypts the concatenated file + export C4GH_PASSPHRASE=${ALICE_PASSPHRASE} + crypt4gh decrypt --sk ${ALICE_SECKEY} < $TESTFILES/message.c4gh > $TESTFILES/message.received + + run diff $TESTFILE $TESTFILES/message.received + [ "$status" -eq 0 ] + + unset C4GH_PASSPHRASE +} \ No newline at end of file From 8bcd0b57881eaa33e60097cd6cd4ea71d4d03edc Mon Sep 17 00:00:00 2001 From: Joris Vankerschaver Date: Tue, 21 May 2024 08:57:41 +0900 Subject: [PATCH 07/14] Test reencrypting header --- tests/header_stream.bats | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/tests/header_stream.bats b/tests/header_stream.bats index 10f3baa..85fecea 100644 --- a/tests/header_stream.bats +++ b/tests/header_stream.bats @@ -32,5 +32,29 @@ function teardown() { run diff $TESTFILE $TESTFILES/message.received [ "$status" -eq 0 ] + unset C4GH_PASSPHRASE +} + +@test "Bob encrypts the testfile for himself (with separate header) and reencrypts the header for Alice" { + + TESTFILE=${BATS_TEST_DIRNAME}/_common/testfile.abcd + + # Bob encrypts the testfile for himself + export C4GH_PASSPHRASE=${BOB_PASSPHRASE} + crypt4gh encrypt --sk ${BOB_SECKEY} --recipient_pk ${BOB_PUBKEY} --header $TESTFILES/header.bob.c4gh < $TESTFILE > $TESTFILES/data.c4gh + + # Bob changes the header for Alice + crypt4gh reencrypt --sk ${BOB_SECKEY} --recipient_pk ${ALICE_PUBKEY} < $TESTFILES/header.bob.c4gh > $TESTFILES/header.alice.c4gh + + # Alice concatenates the header and data + cat $TESTFILES/header.alice.c4gh $TESTFILES/data.c4gh > $TESTFILES/message.c4gh + + # Alice decrypts the header and encrypted data + export C4GH_PASSPHRASE=${ALICE_PASSPHRASE} + crypt4gh decrypt --sk ${ALICE_SECKEY} < $TESTFILES/message.c4gh > $TESTFILES/message.received + + run diff $TESTFILE $TESTFILES/message.received + [ "$status" -eq 0 ] + unset C4GH_PASSPHRASE } \ No newline at end of file From d9a6e104e083d636c4089bf80d7b46fff85f2b0e Mon Sep 17 00:00:00 2001 From: Joris Vankerschaver Date: Tue, 21 May 2024 09:23:02 +0900 Subject: [PATCH 08/14] Remove deprecated sphinx API --- docs/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/conf.py b/docs/conf.py index 320df70..bde48db 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -130,7 +130,7 @@ today_fmt = '%B %d, %Y' def setup(app): - app.add_stylesheet('custom.css') + app.add_css_file('custom.css') # -- Other stuff ---------------------------------------------------------- htmlhelp_basename = 'crypt4gh' From 0b906804f3b0631ba8cc62e18bca3aaf753b50b8 Mon Sep 17 00:00:00 2001 From: Joris Vankerschaver Date: Tue, 21 May 2024 09:23:15 +0900 Subject: [PATCH 09/14] Add docs about separate header --- docs/usage.rst | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/docs/usage.rst b/docs/usage.rst index 8d95c3f..cfcdaa3 100644 --- a/docs/usage.rst +++ b/docs/usage.rst @@ -64,3 +64,27 @@ Any user can generate a keypair with: $ crypt4gh-keygen --sk user.sec --pk user.pub The private key will be encrypted with a passphrase. The user is prompted at the terminal for that passphrase. + +Storing the encrypted header separately +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The encrypted header can be stored separately from the encrypted data. This is useful, for example, when sharing the encrypted message with many recipients. In this case, only the header needs to be re-encrypted (for a specific recipient) while the encrypted data can stay the same. + +To store the encrypted header in a separate file ``header.dat``, use the flag ``--header``: + +.. code-block:: console + + $ crypt4gh encrypt --sk alice.sec --recipient_pk bob.pub --header header.bob.c4gh < M > M.data.c4gh + +Bob can then decrypt the message by concatenating the header and the data, and decrypting the whole file: + +.. code-block:: console + + $ cat header.bob.c4gh M.data.c4gh > M.c4gh + $ crypt4gh decrypt --sk bob.sec < M.c4gh > M + +To re-encrypt the message for another user Eve, with public key ``eve.pub``, Alice can run the ``crypt4gh reencrypt`` command: + +.. code-block:: console + + $ crypt4gh reencrypt --sk alice.sec --recipient_pk eve.pub < header.alice.c4gh > header.eve.c4gh From fdd26b28dd5dc585642984e4e7070b44b5338d56 Mon Sep 17 00:00:00 2001 From: Joris Vankerschaver Date: Wed, 22 May 2024 07:51:03 +0000 Subject: [PATCH 10/14] Avoid temporary files during tests --- tests/header_stream.bats | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/tests/header_stream.bats b/tests/header_stream.bats index 85fecea..f2cf8a1 100644 --- a/tests/header_stream.bats +++ b/tests/header_stream.bats @@ -22,12 +22,9 @@ function teardown() { export C4GH_PASSPHRASE=${BOB_PASSPHRASE} crypt4gh encrypt --sk ${BOB_SECKEY} --recipient_pk ${ALICE_PUBKEY} --header $TESTFILES/header.alice.c4gh < $TESTFILE > $TESTFILES/data.c4gh - # Alice concatenates the header and data - cat $TESTFILES/header.alice.c4gh $TESTFILES/data.c4gh > $TESTFILES/message.c4gh - - # Alice decrypts the concatenated file + # Alice concatenates the header and the data and decrypts the combined result export C4GH_PASSPHRASE=${ALICE_PASSPHRASE} - crypt4gh decrypt --sk ${ALICE_SECKEY} < $TESTFILES/message.c4gh > $TESTFILES/message.received + cat $TESTFILES/header.alice.c4gh $TESTFILES/data.c4gh | crypt4gh decrypt --sk ${ALICE_SECKEY} > $TESTFILES/message.received run diff $TESTFILE $TESTFILES/message.received [ "$status" -eq 0 ] @@ -46,12 +43,9 @@ function teardown() { # Bob changes the header for Alice crypt4gh reencrypt --sk ${BOB_SECKEY} --recipient_pk ${ALICE_PUBKEY} < $TESTFILES/header.bob.c4gh > $TESTFILES/header.alice.c4gh - # Alice concatenates the header and data - cat $TESTFILES/header.alice.c4gh $TESTFILES/data.c4gh > $TESTFILES/message.c4gh - - # Alice decrypts the header and encrypted data + # Alice concatenates the header and data and decrypts the results export C4GH_PASSPHRASE=${ALICE_PASSPHRASE} - crypt4gh decrypt --sk ${ALICE_SECKEY} < $TESTFILES/message.c4gh > $TESTFILES/message.received + cat $TESTFILES/header.alice.c4gh $TESTFILES/data.c4gh | crypt4gh decrypt --sk ${ALICE_SECKEY} > $TESTFILES/message.received run diff $TESTFILE $TESTFILES/message.received [ "$status" -eq 0 ] From 9bdc8020891644c6c5aab6089a30a9bb6334bc3c Mon Sep 17 00:00:00 2001 From: Joris Vankerschaver Date: Wed, 22 May 2024 07:59:15 +0000 Subject: [PATCH 11/14] Add CLI option to re-encrypt only the header --- crypt4gh/cli.py | 7 ++++--- crypt4gh/lib.py | 17 +++++++++-------- tests/header_stream.bats | 2 +- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/crypt4gh/cli.py b/crypt4gh/cli.py index 325be55..345fdfe 100644 --- a/crypt4gh/cli.py +++ b/crypt4gh/cli.py @@ -29,7 +29,7 @@ {PROG} [-hv] [--log ] encrypt [--sk ] --recipient_pk [--recipient_pk ]... [--range ] [--header ] {PROG} [-hv] [--log ] decrypt [--sk ] [--sender_pk ] [--range ] {PROG} [-hv] [--log ] rearrange [--sk ] --range - {PROG} [-hv] [--log ] reencrypt [--sk ] --recipient_pk [--recipient_pk ]... [--trim] + {PROG} [-hv] [--log ] reencrypt [--sk ] --recipient_pk [--recipient_pk ]... [--trim] [--header-only] Options: -h, --help Prints this help and exit @@ -42,7 +42,7 @@ --range Byte-range either as or just (Start included, End excluded) -t, --trim Keep only header packets that you can decrypt --header Where to write the header (default: stdout) - + --header-only Whether the input data consists only of a header (default: false) Environment variables: C4GH_LOG If defined, it will be used as the default logger @@ -222,4 +222,5 @@ def build_recipients(): recipient_keys, sys.stdin.buffer, sys.stdout.buffer, - trim=args['--trim']) + trim=args['--trim'], + header_only=args['--header-only']) diff --git a/crypt4gh/lib.py b/crypt4gh/lib.py index fd24325..c58bd76 100644 --- a/crypt4gh/lib.py +++ b/crypt4gh/lib.py @@ -407,7 +407,7 @@ def decrypt(keys, infile, outfile, sender_pubkey=None, offset=0, span=None): @close_on_broken_pipe -def reencrypt(keys, recipient_keys, infile, outfile, chunk_size=4096, trim=False): +def reencrypt(keys, recipient_keys, infile, outfile, chunk_size=4096, trim=False, header_only=False): '''Extract header packets from infile and generate another one to outfile. The encrypted data section is only copied from infile to outfile.''' @@ -416,13 +416,14 @@ def reencrypt(keys, recipient_keys, infile, outfile, chunk_size=4096, trim=False packets = header.reencrypt(header_packets, keys, recipient_keys, trim=trim) outfile.write(header.serialize(packets)) - # Stream the remainder - LOG.info(f'Streaming the remainder of the file') - while True: - data = infile.read(chunk_size) - if not data: - break - outfile.write(data) + # Stream the remainder, if present + if not header_only: + LOG.info(f'Streaming the remainder of the file') + while True: + data = infile.read(chunk_size) + if not data: + break + outfile.write(data) LOG.info('Reencryption Successful') diff --git a/tests/header_stream.bats b/tests/header_stream.bats index f2cf8a1..123785b 100644 --- a/tests/header_stream.bats +++ b/tests/header_stream.bats @@ -41,7 +41,7 @@ function teardown() { crypt4gh encrypt --sk ${BOB_SECKEY} --recipient_pk ${BOB_PUBKEY} --header $TESTFILES/header.bob.c4gh < $TESTFILE > $TESTFILES/data.c4gh # Bob changes the header for Alice - crypt4gh reencrypt --sk ${BOB_SECKEY} --recipient_pk ${ALICE_PUBKEY} < $TESTFILES/header.bob.c4gh > $TESTFILES/header.alice.c4gh + crypt4gh reencrypt --sk ${BOB_SECKEY} --recipient_pk ${ALICE_PUBKEY} --header-only < $TESTFILES/header.bob.c4gh > $TESTFILES/header.alice.c4gh # Alice concatenates the header and data and decrypts the results export C4GH_PASSPHRASE=${ALICE_PASSPHRASE} From a970f202fc84955e4c8e0d2fcfd924b208436ab3 Mon Sep 17 00:00:00 2001 From: Joris Vankerschaver Date: Thu, 23 May 2024 05:53:26 +0000 Subject: [PATCH 12/14] Early bail-out for header-only reencryption --- crypt4gh/lib.py | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/crypt4gh/lib.py b/crypt4gh/lib.py index c58bd76..341795c 100644 --- a/crypt4gh/lib.py +++ b/crypt4gh/lib.py @@ -416,14 +416,18 @@ def reencrypt(keys, recipient_keys, infile, outfile, chunk_size=4096, trim=False packets = header.reencrypt(header_packets, keys, recipient_keys, trim=trim) outfile.write(header.serialize(packets)) - # Stream the remainder, if present - if not header_only: - LOG.info(f'Streaming the remainder of the file') - while True: - data = infile.read(chunk_size) - if not data: - break - outfile.write(data) + # If header-only reencryption, we are done. + if header_only: + LOG.info(f'Header-only reencryption Successful') + return + + # Stream the remainder + LOG.info(f'Streaming the remainder of the file') + while True: + data = infile.read(chunk_size) + if not data: + break + outfile.write(data) LOG.info('Reencryption Successful') From f8746cdf48604a32eab91e063ce44422d3214ad1 Mon Sep 17 00:00:00 2001 From: Joris Vankerschaver Date: Thu, 23 May 2024 05:55:53 +0000 Subject: [PATCH 13/14] Remove stray use of temporary files --- docs/usage.rst | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/usage.rst b/docs/usage.rst index cfcdaa3..a84ff0b 100644 --- a/docs/usage.rst +++ b/docs/usage.rst @@ -80,8 +80,7 @@ Bob can then decrypt the message by concatenating the header and the data, and d .. code-block:: console - $ cat header.bob.c4gh M.data.c4gh > M.c4gh - $ crypt4gh decrypt --sk bob.sec < M.c4gh > M + $ cat header.bob.c4gh M.data.c4gh | crypt4gh decrypt --sk bob.sec > M To re-encrypt the message for another user Eve, with public key ``eve.pub``, Alice can run the ``crypt4gh reencrypt`` command: From fc6d3a03d3c5cfa7f92a6ad980cc230e7c80b961 Mon Sep 17 00:00:00 2001 From: Joris Vankerschaver Date: Fri, 24 May 2024 23:24:41 +0000 Subject: [PATCH 14/14] Bump version to 1.7 --- crypt4gh/__init__.py | 2 +- setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/crypt4gh/__init__.py b/crypt4gh/__init__.py index 783278f..ad47ab5 100644 --- a/crypt4gh/__init__.py +++ b/crypt4gh/__init__.py @@ -37,7 +37,7 @@ __title__ = 'GA4GH cryptographic utilities' -__version__ = '1.6' # VERSION in header is 1 (as 4 bytes little endian) +__version__ = '1.7' # VERSION in header is 1 (as 4 bytes little endian) __author__ = 'Frédéric Haziza' __author_email__ = 'frederic.haziza@crg.eu' __license__ = 'Apache License 2.0' diff --git a/setup.py b/setup.py index 295f085..5b3bb88 100644 --- a/setup.py +++ b/setup.py @@ -7,7 +7,7 @@ _readme = (Path(__file__).parent / "README.md").read_text() setup(name='crypt4gh', - version='1.6', + version='1.7', url='https://www.github.com/EGA-archive/crypt4gh', license='Apache License 2.0', author='Frédéric Haziza',