8.0.6 • Published 1 year ago

supersphincs v8.0.6

Weekly downloads
37
License
MIT
Repository
github
Last release
1 year ago

supersphincs

Overview

SuperSPHINCS combines the post-quantum SPHINCS+ with the more conventional elliptic-curve (ECC) Ed25519 as a single signing scheme. SPHINCS+ is provided by sphincs and Ed25519 signing is performed using libsodium.js.

Before signing, a SHA-512 hash is performed, using the current platform's native implementation where available or an efficient JavaScript implementation from TweetNaCl.js otherwise.

Example Usage

import {superSphincs} from 'supersphincs';

const keyPair /*: {privateKey: Uint8Array; publicKey: Uint8Array} */ =
	await superSphincs.keyPair()
;

const message /*: Uint8Array */ =
	new Uint8Array([104, 101, 108, 108, 111]) // "hello"
;

// Optional additional data argument, similar conceptually to what AEAD cyphers support.
// If specified, must be the same when signing and verifying. For more information and
// usage advice, see: https://download.libsodium.org/doc/secret-key_cryptography/aead.html
const additionalData /*: Uint8Array */ =
	new Uint8Array([119, 111, 114, 108, 100]) // "world"
;

/* Combined signatures */

const signed /*: Uint8Array */ =
	await superSphincs.sign(message, keyPair.privateKey, additionalData)
;

const verified /*: Uint8Array */ =
	await superSphincs.open(signed, keyPair.publicKey, additionalData) // same as message
;

/* Detached signatures */

const signature /*: Uint8Array */ =
	await superSphincs.signDetached(message, keyPair.privateKey, additionalData)
;

const isValid /*: boolean */ =
	await superSphincs.verifyDetached(
		signature,
		message,
		keyPair.publicKey,
		additionalData
	) // true
;

/* Export and optionally encrypt keys */

const keyData /*: {
	private: {
		classical: string;
		combined: string;
		postQuantum: string;
	};
	public: {
		classical: string;
		combined: string;
		postQuantum: string;
	};
} */ =
	await superSphincs.exportKeys(keyPair, 'secret passphrase')
;

if (typeof localStorage === 'undefined') {
	localStorage	= {};
}

// May now save exported keys to disk (or whatever)
localStorage.superSphincsPrivateKey = keyData.private.combined;
localStorage.sphincsPrivateKey      = keyData.private.postQuantum;
localStorage.eccPrivateKey          = keyData.private.classical;
localStorage.superSphincsPublicKey  = keyData.public.combined;
localStorage.sphincsPublicKey       = keyData.public.postQuantum;
localStorage.eccPublicKey           = keyData.public.classical;


/* Reconstruct an exported key using either the superSphincs
	value or any pair of valid sphincs and ecc values */

const keyPair1 = await superSphincs.importKeys({
	public: {
		classical: localStorage.eccPublicKey,
		postQuantum: localStorage.sphincsPublicKey
	}
});

// May now use keyPair1.publicKey as in the above examples
console.log('Import #1:');
console.log(keyPair1);

const keyPair2 = await superSphincs.importKeys(
	{
		private: {
			combined: localStorage.superSphincsPrivateKey
		}
	},
	'secret passphrase'
);

// May now use keyPair2 as in the above examples
console.log('Import #2:');
console.log(keyPair2);

// Constructing an entirely new SuperSPHINCS key pair from
// the original SPHINCS+ key pair and a new ECC key pair
const keyPair3 = await superSphincs.importKeys(
	{
		private: {
			classical: (
				await superSphincs.exportKeys(
					await superSphincs.keyPair(),
					'hunter2'
				)
			).private.classical,
			postQuantum: localStorage.sphincsPrivateKey
		}
	},
	{
		classical: 'hunter2',
		postQuantum: 'secret passphrase'
	}
);

// May now use keyPair3 as in the above examples
console.log('Import #3:');
console.log(keyPair3);

Changelog

Breaking changes in major versions:

8.0.0:

  • Standardized method signatures across packages.

7.0.0:

  • Upgraded from SPHINCS and RSA to SPHINCS+ and ECC. For backwards compatibility with previous versions of this package, use supersphincs-legacy.

6.0.0:

  • Additional data optional with default value of new Uint8Array(0).

5.0.0:

  • Additional data format change.

4.0.0:

  • As part of upgrading from asm.js to WebAssembly (with asm.js included as a fallback), the API is fully asynchronous.

3.0.0:

  • General API cleanup.

2.0.0:

  • Split into module (supersphincs.js) and standalone pre-bundled version (dist/supersphincs.js).
8.0.5

2 years ago

8.0.6

1 year ago

8.0.4

2 years ago

8.0.3

2 years ago

7.0.0

2 years ago

7.0.2

2 years ago

7.0.1

2 years ago

8.0.1

2 years ago

8.0.0

2 years ago

8.0.2

2 years ago

6.3.4

2 years ago

6.3.3

2 years ago

6.3.5

2 years ago

6.3.2

4 years ago

6.3.1

4 years ago

5.4.2

4 years ago

5.4.1

4 years ago

5.4.0

5 years ago

6.3.0

5 years ago

5.3.1

5 years ago

6.2.2

5 years ago

5.3.0

5 years ago

6.2.1

5 years ago

6.1.5

5 years ago

6.2.0

5 years ago

6.2.3-next

5 years ago

6.2.2-next

5 years ago

6.2.1-next

5 years ago

6.2.0-next

5 years ago

6.1.4

6 years ago

6.1.3

6 years ago

6.1.2

6 years ago

6.1.1

6 years ago

6.1.0

6 years ago

6.0.8-debug

6 years ago

6.0.7-debug

6 years ago

6.0.6

7 years ago

6.0.5

7 years ago

5.2.0

7 years ago

6.0.4

7 years ago

6.0.3

7 years ago

6.0.2

7 years ago

6.0.1

7 years ago

6.0.0

7 years ago

5.1.0

7 years ago

5.0.1

7 years ago

4.2.3

7 years ago

4.2.2

7 years ago

4.2.1

7 years ago

4.2.0

7 years ago

4.1.1

7 years ago

4.1.0

7 years ago

5.0.0

7 years ago

4.0.3

7 years ago

4.0.2

7 years ago

4.0.1

7 years ago

4.0.0

7 years ago

3.0.1

7 years ago

3.0.0

7 years ago

2.0.2

7 years ago

2.0.1

7 years ago

2.0.0

7 years ago

1.4.0

8 years ago

1.3.1

8 years ago

1.3.0

8 years ago

1.2.5

8 years ago

1.2.4

8 years ago

1.2.3

8 years ago

1.2.1

8 years ago

1.2.0

8 years ago

1.1.6

8 years ago

1.1.5

8 years ago

1.1.4

8 years ago

1.1.3

8 years ago

1.1.2

8 years ago

1.1.1

8 years ago

1.1.0

8 years ago

1.0.0

9 years ago