{"action":"created","comment":{"url":"https://api.github.com/repos/jedisct1/libsodium.js/pulls/comments/41322359","id":41322359,"diff_hunk":"@@ -0,0 +1,358 @@\n+(function(root, factory){\n+\tif (typeof exports == 'object'){ //nodejs context\n+\t\t/*\n+\t\t* LOAD RAW BUILD\n+\t\t*/\n+\t\tvar libsodium;\n+\t\tvar path = require('path');\n+\t\ttry {\n+\t\t\tlibsodium = require(path.join(__dirname, '../libsodium'));\n+\t\t} catch (e){\n+\t\t}\n+\t\tif (!libsodium){\n+\t\t\tconsole.log('Missing raw libsodium.js build. Downloading it');\n+\t\t\t//npm install libsodium\n+\t\t\tprocess.chdir(__dirname);\n+\t\t\tvar spawn = require('child_process').spawn;\n+\t\t\tvar npmInstall = spawn('npm', ['install', 'libsodium'], {cwd: process.cwd()});\n+\t\t\tnpmInstall.on('close', function(npmExitCode){\n+\t\t\t\tif (npmExitCode == 0){ //Success\n+\t\t\t\t\tconsole.log('NPM exited with success');\n+\t\t\t\t\tdoTests();\n+\t\t\t\t} else {\n+\t\t\t\t\tconsole.error('NPM exited with code ' + npmExitCode);\n+\t\t\t\t\tprocess.exit(npmExitCode);\n+\t\t\t\t}\n+\t\t\t});\n+\t\t} else doTests();\n+\n+\t\tfunction doTests(){\n+\t\t\tconsole.log('Testing libsodium.js with vectors, through the wrappers');\n+\t\t\tconsole.log('-------------------------------------------------------');\n+\t\t\tfactory(require(path.join(__dirname, '../dist/modules/libsodium-wrappers.js')), true);\n+\t\t}\n+\t} else { //Browser's context\n+\t\tfactory(window.sodium);\n+\t}\n+})(this, function(sodium, nodeEnv){\n+\tvar sodium_test = (function(){\n+\n+\t\t//This script tests a good chunk of the algorithms available in libsodium. The tests here are done with vectors harvested from the original C-written library\n+\n+\t\tvar t = {};\n+\t\tvar to_hex = sodium.to_hex;\n+\t\tvar from_hex = sodium.from_hex;\n+\t\tvar is_hex = function(s){\n+\t\t\treturn /^([a-f]|[0-9])+$/ig.test(s) && s.length % 2 == 0;\n+\t\t}\n+\n+\t\tt.scrypt = function(){\n+\t\t\tif (typeof sodium.crypto_pwhash_scryptsalsa208sha256 != 'function')\n+\t\t\t\tthrow new Error('scrypt cannot be found in the js-built library');\n+\n+\t\t\tvar vectors = [\n+\t\t\t\t{\n+\t\t\t\t\tpass: 'password',\n+\t\t\t\t\tsalt: 'NaCl',\n+\t\t\t\t\tkeyLength: 64,\n+\t\t\t\t\tr: 8,\n+\t\t\t\t\tp: 16,\n+\t\t\t\t\topsLimit: 1024,\n+\t\t\t\t\tresult: 'fdbabe1c9d3472007856e7190d01e9fe7c6ad7cbc8237830e77376634b3731622eaf30d92e22a3886ff109279d9830dac727afb94a83ee6d8360cbdfa2cc0640'\n+\t\t\t\t},\n+\t\t\t\t{\n+\t\t\t\t\tpass: 'pleaseletmein',\n+\t\t\t\t\tsalt: 'SodiumChloride',\n+\t\t\t\t\tkeyLength: 64,\n+\t\t\t\t\tr: 8,\n+\t\t\t\t\tp: 1,\n+\t\t\t\t\topsLimit: 16384,\n+\t\t\t\t\tresult: '7023bdcb3afd7348461c06cd81fd38ebfda8fbba904f8e3ea9b543f6545da1f2d5432955613f0fcf62d49705242a9af9e61e85dc0d651e40dfcf017b45575887'\n+\t\t\t\t}\n+\t\t\t];\n+\n+\t\t\tvectors.forEach(testVector);\n+\n+\t\t\tfunction testVector(v){\n+\t\t\t\tvar derivedKey = sodium.crypto_pwhash_scryptsalsa208sha256_ll(v.pass, v.salt, v.opsLimit, v.r, v.p, v.keyLength);\n+\t\t\t\tif (v.result != to_hex(derivedKey)){\n+\t\t\t\t\tthrow new Error('Error in pwhash_scryptsalsa208sha256_ll with vector ' + JSON.stringify(v));\n+\t\t\t\t}\n+\t\t\t}\n+\n+\t\t};\n+\n+\t\tt.scalarmult = function(){\n+\n+\t\t\tfunction scalarmult_base_test(){\n+\t\t\t\tvar secretKey = '5dab087e624a8a4b79e17f8b83800ee66f3bb1292618b6fd1c2f8b27ff88e0eb';\n+\t\t\t\tvar publicKey = sodium.crypto_scalarmult_base(from_hex(secretKey));\n+\t\t\t\tvar expectedPubKey = 'de9edb7d7b7dc1b4d35b61c2ece435373f8343c85b78674dadfc7e146f882b4f';\n+\t\t\t\tif (to_hex(publicKey) != expectedPubKey) throw new Error('Error in scalarmult_base');\n+\t\t\t}\n+\t\t\tscalarmult_base_test();\n+\n+\t\t\tvar scalarmult_vectors = [\n+\t\t\t\t{\n+\t\t\t\t\tsecretKey: '77076d0a7318a57d3c16c17251b26645df4c2f87ebc0992ab177fba51db92c2a',\n+\t\t\t\t\tpublicKey: 'de9edb7d7b7dc1b4d35b61c2ece435373f8343c85b78674dadfc7e146f882b4f',\n+\t\t\t\t\tsharedSecret: '4a5d9d5ba4ce2de1728e3bf480350f25e07e21c947d19e3376f09b3c1e161742'\n+\t\t\t\t},\n+\t\t\t\t{\n+\t\t\t\t\tsecretKey: '5dab087e624a8a4b79e17f8b83800ee66f3bb1292618b6fd1c2f8b27ff88e0eb',\n+\t\t\t\t\tpublicKey: '8520f0098930a754748b7ddcb43ef75a0dbf3a0d26381af4eba4a98eaa9b4e6a',\n+\t\t\t\t\tsharedSecret: '4a5d9d5ba4ce2de1728e3bf480350f25e07e21c947d19e3376f09b3c1e161742'\n+\t\t\t\t}\n+\t\t\t];\n+\n+\t\t\tfunction scalarmult_test(v){\n+\t\t\t\tvar sharedSecret = sodium.crypto_scalarmult(from_hex(v.secretKey), from_hex(v.publicKey));\n+\t\t\t\tif (v.sharedSecret != to_hex(sharedSecret)) throw new Error('Error in scalarmult with vector ' + JSON.stringify(v));\n+\t\t\t}\n+\t\t\tscalarmult_vectors.forEach(scalarmult_test);\n+\n+\t\t};\n+\n+\t\tt.sign = function(callback){\n+\t\t\tif (!nodeEnv && typeof callback != 'function') throw new TypeError('callback must be defined and must be a function');\n+\n+\t\t\tvar vData;\n+\t\t\tif (nodeEnv){\n+\t\t\t\tvData = require('./ed-vectors.json');\n+\t\t\t\ttestVectors();\n+\t\t\t} else {\n+\t\t\t\tvar loadVectorsReq = new XMLHttpRequest();\n+\t\t\t\tloadVectorsReq.open('get', 'ed-vectors.json', true);\n+\t\t\t\tloadVectorsReq.onload = function(e){\n+\t\t\t\t\tvData = loadVectorsReq.responseText;\n+\t\t\t\t\ttry {\n+\t\t\t\t\t\tvData = JSON.parse(vData);\n+\t\t\t\t\t} catch (e){\n+\t\t\t\t\t\tcallback(new Error('cannot parse ed25519 vectors'));\n+\t\t\t\t\t\treturn;\n+\t\t\t\t\t}\n+\t\t\t\t\tif (!Array.isArray(vData)){\n+\t\t\t\t\t\tcallback(new Error('invalid ed25519 vectors list'));\n+\t\t\t\t\t\treturn;\n+\t\t\t\t\t}\n+\t\t\t\t\ttestVectors();\n+\t\t\t\t};\n+\t\t\t\tloadVectorsReq.send();\n+\t\t\t}\n+\n+\t\t\tfunction testVectors(){\n+\t\t\t\tvar currentVector;\n+\t\t\t\tvar nTests = 64;\n+\t\t\t\tconsole.log('(Testing ' + nTests + ' different Ed25519 vectors)');\n+\t\t\t\tvar testCount = 0;\n+\t\t\t\ttry {\n+\t\t\t\t\twhile (testCount < nTests){\n+\t\t\t\t\t\tcurrentVector = vData[Math.floor(Math.random() * vData.length)];\n+\t\t\t\t\t\ttestVector(currentVector);\n+\t\t\t\t\t\ttestCount++;\n+\t\t\t\t\t}\n+\t\t\t\t} catch (e){\n+\t\t\t\t\tconsole.log('Error on test no. ' + testCount);\n+\t\t\t\t\tif (callback) callback(e + ' ' + JSON.stringify(currentVector));\n+\t\t\t\t\telse throw new Error(e + ' ' + JSON.stringify(currentVector));\n+\t\t\t\t\treturn;\n+\t\t\t\t}\n+\t\t\t\tif (callback) callback(undefined, {tested: nTests, count: vData.length});\n+\t\t\t\telse return {tested: nTests, count: vData.length};\n+\n+\t\t\t\tfunction testVector(v){\n+\t\t\t\t\tvar publicKey = v.sk.substr(64); //sodium.crypto_sign_ed25519_sk_to_pk(v.sk);\n+\t\t\t\t\tif (publicKey != v.pk) throw new Error('error with sk to pk derivation in Ed25519');\n+\t\t\t\t\tvar signature = sodium.crypto_sign_detached(from_hex(v.m), from_hex(v.sk));\n+\t\t\t\t\tif (to_hex(signature) != v.s) throw new Error('unexpected signature in Ed25519');\n+\t\t\t\t\tvar isValid = sodium.crypto_sign_verify_detached(signature, from_hex(v.m), from_hex(publicKey));\n+\t\t\t\t\tif (!isValid) throw new Error('invalid signature in Ed25519');\n+\t\t\t\t}\n+\t\t\t}\n+\n+\t\t};\n+\n+\t\tt.secretbox_easy = function(){\n+\t\t\tvar vectors = [\n+\t\t\t\t{\n+\t\t\t\t\tkey: '1b27556473e985d462cd51197a9a46c76009549eac6474f206c4ee0844f68389',\n+\t\t\t\t\tnonce: '69696ee955b62b73cd62bda875fc73d68219e0036b7a0b37',\n+\t\t\t\t\tm: 'be075fc53c81f2d5cf141316ebeb0c7b5228c52a4c62cbd44b66849b64244ffce5ecbaaf33bd751a1ac728d45e6c61296cdc3c01233561f41db66cce314adb310e3be8250c46f06dceea3a7fa1348057e2f6556ad6b1318a024a838f21af1fde048977eb48f59ffd4924ca1c60902e52f0a089bc76897040e082f937763848645e0705',\n+\t\t\t\t\tc: 'f3ffc7703f9400e52a7dfb4b3d3305d98e993b9f48681273c29650ba32fc76ce48332ea7164d96a4476fb8c531a1186ac0dfc17c98dce87b4da7f011ec48c97271d2c20f9b928fe2270d6fb863d51738b48eeee314a7cc8ab932164548e526ae90224368517acfeabd6bb3732bc0e9da99832b61ca01b6de56244a9e88d5f9b37973f622a43d14a6599b1f654cb45a74e355a5'\n+\t\t\t\t}\n+\t\t\t];\n+\n+\t\t\tfor (var i = 0; i < vectors.length; i++){\n+\t\t\t\tsecretbox_test(vectors[i]);\n+\t\t\t}\n+\n+\t\t\tfunction secretbox_test(v){\n+\t\t\t\tvar cipher = sodium.crypto_secretbox_easy(from_hex(v.m), from_hex(v.nonce), from_hex(v.key));\n+\t\t\t\tif (to_hex(cipher) != v.c) throw new Error('Unexpected ciphertext');\n+\t\t\t\tvar plaintext = sodium.crypto_secretbox_open_easy(cipher, from_hex(v.nonce), from_hex(v.key));\n+\t\t\t\tif (!(plaintext && to_hex(plaintext) == v.m)) throw new Error('Unexpected plaintext');\n+\t\t\t}\n+\t\t};\n+\n+\t\tt.hash = function(){\n+\t\t\tvar sha512Vectors = [\n+\t\t\t\t{\n+\t\t\t\t\tm: 'testing\\n',\n+\t\t\t\t\th: '24f950aac7b9ea9b3cb728228a0c82b67c39e96b4b344798870d5daee93e3ae5931baae8c7cacfea4b629452c38026a81d138bc7aad1af3ef7bfd5ec646d6c28'\n+\t\t\t\t},\n+\t\t\t\t{\n+\t\t\t\t\tm: 'The Conscience of a Hacker is a small essay written January 8, 1986 by a computer security hacker who went by the handle of The Mentor, who belonged to the 2nd generation of Legion of Doom.',\n+\t\t\t\t\th: 'a77abe1ccf8f5497e228fbc0acd73a521ededb21b89726684a6ebbc3baa32361aca5a244daa84f24bf19c68baf78e6907625a659b15479eb7bd426fc62aafa73'\n+\t\t\t\t}\n+\t\t\t];\n+\t\t\tvar sha256Vectors = [\n+\t\t\t\t{\n+\t\t\t\t\tm: 'testing\\n',\n+\t\t\t\t\th: '12a61f4e173fb3a11c05d6471f74728f76231b4a5fcd9667cef3af87a3ae4dc2'\n+\t\t\t\t},\n+\t\t\t\t{\n+\t\t\t\t\tm: 'The Conscience of a Hacker is a small essay written January 8, 1986 by a computer security hacker who went by the handle of The Mentor, who belonged to the 2nd generation of Legion of Doom.',\n+\t\t\t\t\th: '71cc8123fef8c236e451d3c3ddf1adae9aa6cd9521e7041769d737024900a03a'\n+\t\t\t\t}\n+\t\t\t];\n+\n+\t\t\tif (sodium.crypto_hash) for (var i = 0; i < sha512Vectors.length; i++) sha512_test(sha512Vectors[i]);\n+\t\t\tif (sodium.crypto_hash_sha256) for (var i = 0; i < sha256Vectors.length; i++) sha256_test(sha256Vectors[i]);\n+\n+\t\t\tfunction sha512_test(v){\n+\t\t\t\tvar hash = sodium.crypto_hash(v.m);\n+\t\t\t\tif (to_hex(hash) != v.h) throw new Error('Unexpected hash value for vector ' + JSON.stringify(v));\n+\t\t\t}\n+\n+\t\t\tfunction sha256_test(v){\n+\t\t\t\tvar hash = sodium.crypto_hash_sha256(v.m);\n+\t\t\t\tif (to_hex(hash) != v.h) throw new Error('Unexpected hash value for vector ' + JSON.stringify(v));\n+\t\t\t}\n+\n+\t\t};\n+\n+\t\tt.hmac = function(){\n+\t\t\tvar hmacSHA512256Vectors = [\n+\t\t\t\t{\n+\t\t\t\t\tk: 'Jefe',\n+\t\t\t\t\tm: 'what do ya want for nothing?',\n+\t\t\t\t\th: '164b7a7bfcf819e2e395fbe73b56e0a387bd64222e831fd610270cd7ea250554'\n+\t\t\t\t}\n+\t\t\t];\n+\n+\t\t\tvar hmacSHA512Vectors = [\n+\t\t\t\t{\n+\t\t\t\t\tk: 'Jefe',\n+\t\t\t\t\tm: 'what do ya want for nothing?',\n+\t\t\t\t\th: '164b7a7bfcf819e2e395fbe73b56e0a387bd64222e831fd610270cd7ea2505549758bf75c05a994a6d034f65f8f0e6fdcaeab1a34d4a6b4b636e070a38bce737'\n+\t\t\t\t}\n+\t\t\t];\n+\t\t\tvar hmacSHA256Vectors = [\n+\t\t\t\t{\n+\t\t\t\t\tk: '0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20',\n+\t\t\t\t\tm: 'cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd',\n+\t\t\t\t\th: '372efcf9b40b35c2115b1346903d2ef42fced46f0846e7257bb156d3d7b30d3f'\n+\t\t\t\t}\n+\t\t\t];\n+\n+\t\t\tif (sodium.crypto_auth) for (var i = 0; i < hmacSHA512256Vectors.length; i++) testHmacSHA512256Vector(hmacSHA512256Vectors[i]);\n+\t\t\tif (sodium.crypto_auth_hmacsha512) for (var i = 0; i < hmacSHA512Vectors.length; i++) testHmacSHA512Vector(hmacSHA512Vectors[i]);\n+\t\t\tif (sodium.crypto_auth_hmacsha256) for (var i = 0; i < hmacSHA256Vectors.length; i++) testHmacSHA256Vector(hmacSHA256Vectors[i]);","path":"test/test.js","position":260,"original_position":260,"commit_id":"c523a91e15b9500df2287a87bbd42d1e5b738aca","original_commit_id":"c523a91e15b9500df2287a87bbd42d1e5b738aca","user":{"login":"BatikhSouri","id":3635680,"avatar_url":"https://avatars.githubusercontent.com/u/3635680?v=3","gravatar_id":"","url":"https://api.github.com/users/BatikhSouri","html_url":"https://github.com/BatikhSouri","followers_url":"https://api.github.com/users/BatikhSouri/followers","following_url":"https://api.github.com/users/BatikhSouri/following{/other_user}","gists_url":"https://api.github.com/users/BatikhSouri/gists{/gist_id}","starred_url":"https://api.github.com/users/BatikhSouri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/BatikhSouri/subscriptions","organizations_url":"https://api.github.com/users/BatikhSouri/orgs","repos_url":"https://api.github.com/users/BatikhSouri/repos","events_url":"https://api.github.com/users/BatikhSouri/events{/privacy}","received_events_url":"https://api.github.com/users/BatikhSouri/received_events","type":"User","site_admin":false},"body":"You are right, only `sodium.crypto_auth` is exposed/compiled by default. That's why there is a condition; the method is only tested if it's defined.\r\n\r\nI guess for the sake of simplicity and shedding weight, @jedisct1 chose not to export all functions that exist in the original libsodium lib.\r\n\r\nHowever, the wrappers/symbols for `sodium.crypto_auth_hmacsha256` are already written (see [here](https://github.com/jedisct1/libsodium.js/blob/master/wrapper/symbols/crypto_auth_hmacsha256.json) and [here](https://github.com/jedisct1/libsodium.js/blob/master/wrapper/symbols/crypto_auth_hmacsha256_verify.json)). \r\n\r\nSo to access them, you need to rebuild libsodium.js to include these methods (and optionally removing those you don't need). Here is a way of doing it, providing that you have [all the dependencies](https://github.com/jedisct1/libsodium.js#compilation) installed:\r\n\r\n```shell\r\ngit clone https://github.com/jedisct1/libsodium.js\r\ncd ./libsodium.js\r\n\r\n# Get the original C version of libsodium and configure it\r\nmake libsodium/configure\r\n\r\n# Modify the emscripten.sh\r\n# Specifically, add the name of the missing functions in the \"EXPORTED_FUNCTIONS\" array.\r\n# Ensure that the name begins with an underscore and that it is between double quotes. \r\nnano libsodium/dist-build/emscripten.sh\r\n\r\n# Build libsodium, and then libsodium.js with your chosen functions\r\nmake\r\n```\r\n\r\nI hope that helps.","created_at":"2015-10-06T21:06:55Z","updated_at":"2015-10-06T21:06:55Z","html_url":"https://github.com/jedisct1/libsodium.js/pull/22#discussion_r41322359","pull_request_url":"https://api.github.com/repos/jedisct1/libsodium.js/pulls/22","_links":{"self":{"href":"https://api.github.com/repos/jedisct1/libsodium.js/pulls/comments/41322359"},"html":{"href":"https://github.com/jedisct1/libsodium.js/pull/22#discussion_r41322359"},"pull_request":{"href":"https://api.github.com/repos/jedisct1/libsodium.js/pulls/22"}}},"pull_request":{"url":"https://api.github.com/repos/jedisct1/libsodium.js/pulls/22","id":39975808,"html_url":"https://github.com/jedisct1/libsodium.js/pull/22","diff_url":"https://github.com/jedisct1/libsodium.js/pull/22.diff","patch_url":"https://github.com/jedisct1/libsodium.js/pull/22.patch","issue_url":"https://api.github.com/repos/jedisct1/libsodium.js/issues/22","number":22,"state":"open","locked":false,"title":"Adding test vectors, for both browsers and Nodejs","user":{"login":"BatikhSouri","id":3635680,"avatar_url":"https://avatars.githubusercontent.com/u/3635680?v=3","gravatar_id":"","url":"https://api.github.com/users/BatikhSouri","html_url":"https://github.com/BatikhSouri","followers_url":"https://api.github.com/users/BatikhSouri/followers","following_url":"https://api.github.com/users/BatikhSouri/following{/other_user}","gists_url":"https://api.github.com/users/BatikhSouri/gists{/gist_id}","starred_url":"https://api.github.com/users/BatikhSouri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/BatikhSouri/subscriptions","organizations_url":"https://api.github.com/users/BatikhSouri/orgs","repos_url":"https://api.github.com/users/BatikhSouri/repos","events_url":"https://api.github.com/users/BatikhSouri/events{/privacy}","received_events_url":"https://api.github.com/users/BatikhSouri/received_events","type":"User","site_admin":false},"body":"As previously mentionned in #11, I reworked the basic test vectors I manually js-ported, so that they can work for both browsers and Nodejs. Note that the test page included can perform tests on random data in addition to the original vectors.","created_at":"2015-07-14T23:54:36Z","updated_at":"2015-10-06T21:06:55Z","closed_at":null,"merged_at":null,"merge_commit_sha":"f64b9f88ea5ea29f0758cb0ee70448abe6c0cd94","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/jedisct1/libsodium.js/pulls/22/commits","review_comments_url":"https://api.github.com/repos/jedisct1/libsodium.js/pulls/22/comments","review_comment_url":"https://api.github.com/repos/jedisct1/libsodium.js/pulls/comments{/number}","comments_url":"https://api.github.com/repos/jedisct1/libsodium.js/issues/22/comments","statuses_url":"https://api.github.com/repos/jedisct1/libsodium.js/statuses/c523a91e15b9500df2287a87bbd42d1e5b738aca","head":{"label":"BatikhSouri:master","ref":"master","sha":"c523a91e15b9500df2287a87bbd42d1e5b738aca","user":{"login":"BatikhSouri","id":3635680,"avatar_url":"https://avatars.githubusercontent.com/u/3635680?v=3","gravatar_id":"","url":"https://api.github.com/users/BatikhSouri","html_url":"https://github.com/BatikhSouri","followers_url":"https://api.github.com/users/BatikhSouri/followers","following_url":"https://api.github.com/users/BatikhSouri/following{/other_user}","gists_url":"https://api.github.com/users/BatikhSouri/gists{/gist_id}","starred_url":"https://api.github.com/users/BatikhSouri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/BatikhSouri/subscriptions","organizations_url":"https://api.github.com/users/BatikhSouri/orgs","repos_url":"https://api.github.com/users/BatikhSouri/repos","events_url":"https://api.github.com/users/BatikhSouri/events{/privacy}","received_events_url":"https://api.github.com/users/BatikhSouri/received_events","type":"User","site_admin":false},"repo":{"id":35601429,"name":"libsodium.js","full_name":"BatikhSouri/libsodium.js","owner":{"login":"BatikhSouri","id":3635680,"avatar_url":"https://avatars.githubusercontent.com/u/3635680?v=3","gravatar_id":"","url":"https://api.github.com/users/BatikhSouri","html_url":"https://github.com/BatikhSouri","followers_url":"https://api.github.com/users/BatikhSouri/followers","following_url":"https://api.github.com/users/BatikhSouri/following{/other_user}","gists_url":"https://api.github.com/users/BatikhSouri/gists{/gist_id}","starred_url":"https://api.github.com/users/BatikhSouri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/BatikhSouri/subscriptions","organizations_url":"https://api.github.com/users/BatikhSouri/orgs","repos_url":"https://api.github.com/users/BatikhSouri/repos","events_url":"https://api.github.com/users/BatikhSouri/events{/privacy}","received_events_url":"https://api.github.com/users/BatikhSouri/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/BatikhSouri/libsodium.js","description":"libsodium compiled to pure JavaScript, with convenient wrappers","fork":true,"url":"https://api.github.com/repos/BatikhSouri/libsodium.js","forks_url":"https://api.github.com/repos/BatikhSouri/libsodium.js/forks","keys_url":"https://api.github.com/repos/BatikhSouri/libsodium.js/keys{/key_id}","collaborators_url":"https://api.github.com/repos/BatikhSouri/libsodium.js/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/BatikhSouri/libsodium.js/teams","hooks_url":"https://api.github.com/repos/BatikhSouri/libsodium.js/hooks","issue_events_url":"https://api.github.com/repos/BatikhSouri/libsodium.js/issues/events{/number}","events_url":"https://api.github.com/repos/BatikhSouri/libsodium.js/events","assignees_url":"https://api.github.com/repos/BatikhSouri/libsodium.js/assignees{/user}","branches_url":"https://api.github.com/repos/BatikhSouri/libsodium.js/branches{/branch}","tags_url":"https://api.github.com/repos/BatikhSouri/libsodium.js/tags","blobs_url":"https://api.github.com/repos/BatikhSouri/libsodium.js/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/BatikhSouri/libsodium.js/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/BatikhSouri/libsodium.js/git/refs{/sha}","trees_url":"https://api.github.com/repos/BatikhSouri/libsodium.js/git/trees{/sha}","statuses_url":"https://api.github.com/repos/BatikhSouri/libsodium.js/statuses/{sha}","languages_url":"https://api.github.com/repos/BatikhSouri/libsodium.js/languages","stargazers_url":"https://api.github.com/repos/BatikhSouri/libsodium.js/stargazers","contributors_url":"https://api.github.com/repos/BatikhSouri/libsodium.js/contributors","subscribers_url":"https://api.github.com/repos/BatikhSouri/libsodium.js/subscribers","subscription_url":"https://api.github.com/repos/BatikhSouri/libsodium.js/subscription","commits_url":"https://api.github.com/repos/BatikhSouri/libsodium.js/commits{/sha}","git_commits_url":"https://api.github.com/repos/BatikhSouri/libsodium.js/git/commits{/sha}","comments_url":"https://api.github.com/repos/BatikhSouri/libsodium.js/comments{/number}","issue_comment_url":"https://api.github.com/repos/BatikhSouri/libsodium.js/issues/comments{/number}","contents_url":"https://api.github.com/repos/BatikhSouri/libsodium.js/contents/{+path}","compare_url":"https://api.github.com/repos/BatikhSouri/libsodium.js/compare/{base}...{head}","merges_url":"https://api.github.com/repos/BatikhSouri/libsodium.js/merges","archive_url":"https://api.github.com/repos/BatikhSouri/libsodium.js/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/BatikhSouri/libsodium.js/downloads","issues_url":"https://api.github.com/repos/BatikhSouri/libsodium.js/issues{/number}","pulls_url":"https://api.github.com/repos/BatikhSouri/libsodium.js/pulls{/number}","milestones_url":"https://api.github.com/repos/BatikhSouri/libsodium.js/milestones{/number}","notifications_url":"https://api.github.com/repos/BatikhSouri/libsodium.js/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/BatikhSouri/libsodium.js/labels{/name}","releases_url":"https://api.github.com/repos/BatikhSouri/libsodium.js/releases{/id}","created_at":"2015-05-14T08:54:16Z","updated_at":"2015-05-14T08:54:17Z","pushed_at":"2015-07-22T14:01:33Z","git_url":"git://github.com/BatikhSouri/libsodium.js.git","ssh_url":"git@github.com:BatikhSouri/libsodium.js.git","clone_url":"https://github.com/BatikhSouri/libsodium.js.git","svn_url":"https://github.com/BatikhSouri/libsodium.js","homepage":"","size":6125,"stargazers_count":0,"watchers_count":0,"language":"JavaScript","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"jedisct1:master","ref":"master","sha":"1400d36a54dcd1ea7205db433ac3faa5b92be9c1","user":{"login":"jedisct1","id":124872,"avatar_url":"https://avatars.githubusercontent.com/u/124872?v=3","gravatar_id":"","url":"https://api.github.com/users/jedisct1","html_url":"https://github.com/jedisct1","followers_url":"https://api.github.com/users/jedisct1/followers","following_url":"https://api.github.com/users/jedisct1/following{/other_user}","gists_url":"https://api.github.com/users/jedisct1/gists{/gist_id}","starred_url":"https://api.github.com/users/jedisct1/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jedisct1/subscriptions","organizations_url":"https://api.github.com/users/jedisct1/orgs","repos_url":"https://api.github.com/users/jedisct1/repos","events_url":"https://api.github.com/users/jedisct1/events{/privacy}","received_events_url":"https://api.github.com/users/jedisct1/received_events","type":"User","site_admin":false},"repo":{"id":29293352,"name":"libsodium.js","full_name":"jedisct1/libsodium.js","owner":{"login":"jedisct1","id":124872,"avatar_url":"https://avatars.githubusercontent.com/u/124872?v=3","gravatar_id":"","url":"https://api.github.com/users/jedisct1","html_url":"https://github.com/jedisct1","followers_url":"https://api.github.com/users/jedisct1/followers","following_url":"https://api.github.com/users/jedisct1/following{/other_user}","gists_url":"https://api.github.com/users/jedisct1/gists{/gist_id}","starred_url":"https://api.github.com/users/jedisct1/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jedisct1/subscriptions","organizations_url":"https://api.github.com/users/jedisct1/orgs","repos_url":"https://api.github.com/users/jedisct1/repos","events_url":"https://api.github.com/users/jedisct1/events{/privacy}","received_events_url":"https://api.github.com/users/jedisct1/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/jedisct1/libsodium.js","description":"libsodium compiled to pure JavaScript, with convenient wrappers","fork":false,"url":"https://api.github.com/repos/jedisct1/libsodium.js","forks_url":"https://api.github.com/repos/jedisct1/libsodium.js/forks","keys_url":"https://api.github.com/repos/jedisct1/libsodium.js/keys{/key_id}","collaborators_url":"https://api.github.com/repos/jedisct1/libsodium.js/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/jedisct1/libsodium.js/teams","hooks_url":"https://api.github.com/repos/jedisct1/libsodium.js/hooks","issue_events_url":"https://api.github.com/repos/jedisct1/libsodium.js/issues/events{/number}","events_url":"https://api.github.com/repos/jedisct1/libsodium.js/events","assignees_url":"https://api.github.com/repos/jedisct1/libsodium.js/assignees{/user}","branches_url":"https://api.github.com/repos/jedisct1/libsodium.js/branches{/branch}","tags_url":"https://api.github.com/repos/jedisct1/libsodium.js/tags","blobs_url":"https://api.github.com/repos/jedisct1/libsodium.js/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/jedisct1/libsodium.js/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/jedisct1/libsodium.js/git/refs{/sha}","trees_url":"https://api.github.com/repos/jedisct1/libsodium.js/git/trees{/sha}","statuses_url":"https://api.github.com/repos/jedisct1/libsodium.js/statuses/{sha}","languages_url":"https://api.github.com/repos/jedisct1/libsodium.js/languages","stargazers_url":"https://api.github.com/repos/jedisct1/libsodium.js/stargazers","contributors_url":"https://api.github.com/repos/jedisct1/libsodium.js/contributors","subscribers_url":"https://api.github.com/repos/jedisct1/libsodium.js/subscribers","subscription_url":"https://api.github.com/repos/jedisct1/libsodium.js/subscription","commits_url":"https://api.github.com/repos/jedisct1/libsodium.js/commits{/sha}","git_commits_url":"https://api.github.com/repos/jedisct1/libsodium.js/git/commits{/sha}","comments_url":"https://api.github.com/repos/jedisct1/libsodium.js/comments{/number}","issue_comment_url":"https://api.github.com/repos/jedisct1/libsodium.js/issues/comments{/number}","contents_url":"https://api.github.com/repos/jedisct1/libsodium.js/contents/{+path}","compare_url":"https://api.github.com/repos/jedisct1/libsodium.js/compare/{base}...{head}","merges_url":"https://api.github.com/repos/jedisct1/libsodium.js/merges","archive_url":"https://api.github.com/repos/jedisct1/libsodium.js/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/jedisct1/libsodium.js/downloads","issues_url":"https://api.github.com/repos/jedisct1/libsodium.js/issues{/number}","pulls_url":"https://api.github.com/repos/jedisct1/libsodium.js/pulls{/number}","milestones_url":"https://api.github.com/repos/jedisct1/libsodium.js/milestones{/number}","notifications_url":"https://api.github.com/repos/jedisct1/libsodium.js/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/jedisct1/libsodium.js/labels{/name}","releases_url":"https://api.github.com/repos/jedisct1/libsodium.js/releases{/id}","created_at":"2015-01-15T10:58:39Z","updated_at":"2015-09-29T23:51:53Z","pushed_at":"2015-10-06T18:16:43Z","git_url":"git://github.com/jedisct1/libsodium.js.git","ssh_url":"git@github.com:jedisct1/libsodium.js.git","clone_url":"https://github.com/jedisct1/libsodium.js.git","svn_url":"https://github.com/jedisct1/libsodium.js","homepage":"","size":9391,"stargazers_count":107,"watchers_count":107,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":22,"mirror_url":null,"open_issues_count":3,"forks":22,"open_issues":3,"watchers":107,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/jedisct1/libsodium.js/pulls/22"},"html":{"href":"https://github.com/jedisct1/libsodium.js/pull/22"},"issue":{"href":"https://api.github.com/repos/jedisct1/libsodium.js/issues/22"},"comments":{"href":"https://api.github.com/repos/jedisct1/libsodium.js/issues/22/comments"},"review_comments":{"href":"https://api.github.com/repos/jedisct1/libsodium.js/pulls/22/comments"},"review_comment":{"href":"https://api.github.com/repos/jedisct1/libsodium.js/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/jedisct1/libsodium.js/pulls/22/commits"},"statuses":{"href":"https://api.github.com/repos/jedisct1/libsodium.js/statuses/c523a91e15b9500df2287a87bbd42d1e5b738aca"}}}}