diff options
author | David Baker <dbkr@users.noreply.github.com> | 2018-10-12 08:24:45 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-10-12 08:24:45 +0100 |
commit | b1130fb77f0bcaa436a5308bd1093b0e94aa6585 (patch) | |
tree | 0224871c07b0a98989e122c1937606a1857a2aa4 /javascript | |
parent | b2d91f55ece853ca1a398d3c6814f18a3f10bee0 (diff) | |
parent | 50ed20f61e76c4569c001cf8acb6e5bc361957b3 (diff) |
Merge pull request #61 from matrix-org/dbkr/pk_private_export_import
Work with PkDecryption keys by their private keys
Diffstat (limited to 'javascript')
-rw-r--r-- | javascript/olm_pk.js | 32 | ||||
-rw-r--r-- | javascript/olm_pre.js | 1 | ||||
-rw-r--r-- | javascript/test/pk.spec.js | 14 |
3 files changed, 45 insertions, 2 deletions
diff --git a/javascript/olm_pk.js b/javascript/olm_pk.js index 5a2c7dc..4f730dd 100644 --- a/javascript/olm_pk.js +++ b/javascript/olm_pk.js @@ -118,16 +118,32 @@ PkDecryption.prototype['free'] = function() { free(this.ptr); } +PkDecryption.prototype['init_with_private_key'] = restore_stack(function (private_key) { + var private_key_buffer = stack(private_key.length); + Module['HEAPU8'].set(private_key, private_key_buffer); + + var pubkey_length = pk_decryption_method( + Module['_olm_pk_key_length'] + )(); + var pubkey_buffer = stack(pubkey_length + NULL_BYTE_PADDING_LENGTH); + pk_decryption_method(Module['_olm_pk_key_from_private'])( + this.ptr, + pubkey_buffer, pubkey_length, + private_key_buffer, private_key.length + ); + return Pointer_stringify(pubkey_buffer); +}); + PkDecryption.prototype['generate_key'] = restore_stack(function () { var random_length = pk_decryption_method( - Module['_olm_pk_generate_key_random_length'] + Module['_olm_pk_private_key_length'] )(); var random_buffer = random_stack(random_length); var pubkey_length = pk_decryption_method( Module['_olm_pk_key_length'] )(); var pubkey_buffer = stack(pubkey_length + NULL_BYTE_PADDING_LENGTH); - pk_decryption_method(Module['_olm_pk_generate_key'])( + pk_decryption_method(Module['_olm_pk_key_from_private'])( this.ptr, pubkey_buffer, pubkey_length, random_buffer, random_length @@ -135,6 +151,18 @@ PkDecryption.prototype['generate_key'] = restore_stack(function () { return Pointer_stringify(pubkey_buffer); }); +PkDecryption.prototype['get_private_key'] = restore_stack(function () { + var privkey_length = pk_encryption_method( + Module['_olm_pk_private_key_length'] + )(); + var privkey_buffer = stack(privkey_length); + pk_decryption_method(Module['_olm_pk_get_private_key'])( + this.ptr, + privkey_buffer, privkey_length + ); + return new Uint8Array(Module['HEAPU8'].buffer, privkey_buffer, privkey_length); +}); + PkDecryption.prototype['pickle'] = restore_stack(function (key) { var key_array = array_from_string(key); var pickle_length = pk_decryption_method( diff --git a/javascript/olm_pre.js b/javascript/olm_pre.js index 18d836d..314d7da 100644 --- a/javascript/olm_pre.js +++ b/javascript/olm_pre.js @@ -40,6 +40,7 @@ var NULL_BYTE_PADDING_LENGTH = 1; Module['onRuntimeInitialized'] = function() { OLM_ERROR = Module['_olm_error'](); + olm_exports["PRIVATE_KEY_LENGTH"] = Module['_olm_pk_private_key_length'](); if (onInitSuccess) onInitSuccess(); }; diff --git a/javascript/test/pk.spec.js b/javascript/test/pk.spec.js index 34f7be5..b4b119e 100644 --- a/javascript/test/pk.spec.js +++ b/javascript/test/pk.spec.js @@ -41,6 +41,20 @@ describe("pk", function() { } }); + it('should import & export keys from private parts', function () { + var alice_private = new Uint8Array([ + 0x77, 0x07, 0x6D, 0x0A, 0x73, 0x18, 0xA5, 0x7D, + 0x3C, 0x16, 0xC1, 0x72, 0x51, 0xB2, 0x66, 0x45, + 0xDF, 0x4C, 0x2F, 0x87, 0xEB, 0xC0, 0x99, 0x2A, + 0xB1, 0x77, 0xFB, 0xA5, 0x1D, 0xB9, 0x2C, 0x2A + ]); + var alice_public = decryption.init_with_private_key(alice_private); + expect(alice_public).toEqual("hSDwCYkwp1R0i33ctD73Wg2/Og0mOBr066SpjqqbTmo"); + + var alice_private_out = decryption.get_private_key(); + expect(alice_private_out).toEqual(alice_private); + }); + it('should encrypt and decrypt', function () { var TEST_TEXT='têst1'; var pubkey = decryption.generate_key(); |