{"id":38049124,"url":"https://github.com/gherynos/libsaltpack","last_synced_at":"2026-01-16T20:02:57.532Z","repository":{"id":148978153,"uuid":"70427200","full_name":"gherynos/libsaltpack","owner":"gherynos","description":"A C++ implementation of saltpack (https://saltpack.org)","archived":false,"fork":false,"pushed_at":"2024-04-15T07:39:56.000Z","size":535,"stargazers_count":4,"open_issues_count":0,"forks_count":2,"subscribers_count":4,"default_branch":"main","last_synced_at":"2024-12-24T21:34:14.706Z","etag":null,"topics":["cpp","libsodium","msgpack","saltpack","staticlibrary"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/gherynos.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2016-10-09T20:01:50.000Z","updated_at":"2024-03-14T21:23:59.000Z","dependencies_parsed_at":null,"dependency_job_id":"d782d70d-3b5c-442e-8112-f1909fd137b3","html_url":"https://github.com/gherynos/libsaltpack","commit_stats":null,"previous_names":[],"tags_count":10,"template":false,"template_full_name":null,"purl":"pkg:github/gherynos/libsaltpack","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gherynos%2Flibsaltpack","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gherynos%2Flibsaltpack/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gherynos%2Flibsaltpack/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gherynos%2Flibsaltpack/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gherynos","download_url":"https://codeload.github.com/gherynos/libsaltpack/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gherynos%2Flibsaltpack/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28482241,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-16T11:59:17.896Z","status":"ssl_error","status_checked_at":"2026-01-16T11:55:55.838Z","response_time":107,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cpp","libsodium","msgpack","saltpack","staticlibrary"],"created_at":"2026-01-16T20:02:57.409Z","updated_at":"2026-01-16T20:02:57.501Z","avatar_url":"https://github.com/gherynos.png","language":"C++","readme":"libsaltpack\n===========\nA C++ implementation of [saltpack](https://saltpack.org).\n\n[![Build Status](https://github.com/gherynos/libsaltpack/workflows/build/badge.svg)](https://github.com/gherynos/libsaltpack/actions/workflows/build.yaml)\n[![Coverage Status](https://coveralls.io/repos/github/gherynos/libsaltpack/badge.svg?branch=main)](https://coveralls.io/github/gherynos/libsaltpack?branch=main)\n\nDependencies\n------------\n\n* [libsodium](https://download.libsodium.org/doc/) \u003e= 1.0.9\n* [msgpack](https://github.com/msgpack/msgpack-c) \u003e= 2.0.0\n\nBig integer logic implemented using [Num](https://github.com/983/Num.git), included as a git submodule.\n\nBuilding\n--------\n\nHere's how to build the static library on Linux or OSX:\n\n```bash\ngit submodule init\ngit submodule update\ncmake .\nmake\nmake test\nmake install\n```\n\nAndroid Native Development Kit is also supported; see [libsaltpack-jni](https://github.com/Gherynos/libsaltpack-jni).\n\nDocumentation\n-------------\n\nThe classes documentation can be found here: [https://libsaltpack.gherynos.com/annotated.html](https://libsaltpack.gherynos.com/annotated.html).\n\nExamples\n--------\n\n### Encrypt/decrypt message\n\n```c++\n#include \u003csaltpack.h\u003e\n#include \u003csodium.h\u003e\n#include \u003ciostream\u003e\n\nint main(void) {\n\n    try {\n    \n        // generate keypair\n        saltpack::BYTE_ARRAY publickey(crypto_box_PUBLICKEYBYTES);\n        saltpack::BYTE_ARRAY secretkey(crypto_box_SECRETKEYBYTES);\n        saltpack::Utils::generateKeypair(publickey, secretkey);\n        \n        // recipients\n        std::list\u003csaltpack::BYTE_ARRAY\u003e recipients;\n        recipients.push_back(publickey);\n        \n        // encrypt message\n        std::stringstream out;\n        saltpack::ArmoredOutputStream aOut(out, saltpack::MODE_ENCRYPTION);\n        saltpack::MessageWriter *enc = new saltpack::MessageWriter(aOut, secretkey, recipients);\n        enc-\u003eaddBlock({'T', 'h', 'e', ' ', 'm', 'e', 's', 's', 'a', 'g', 'e'}, true);\n        aOut.finalise();\n        \n        out.flush();\n        delete enc;\n        \n        // display encrypted message\n        std::cout \u003c\u003c out.str() \u003c\u003c std::endl;\n    \n        // decrypt message\n        std::stringstream in(out.str());\n        saltpack::ArmoredInputStream aIn(in);\n        std::stringstream msg;\n        saltpack::MessageReader *dec = new saltpack::MessageReader(aIn, secretkey);\n        while (dec-\u003ehasMoreBlocks()) {\n        \n            saltpack::BYTE_ARRAY message = dec-\u003egetBlock();\n            msg.write(reinterpret_cast\u003cconst char *\u003e(message.data()), message.size());\n        }\n        delete dec;\n        \n        // display decrypted message\n        std::cout \u003c\u003c std::endl \u003c\u003c msg.str() \u003c\u003c std::endl;\n    \n    } catch (const saltpack::SaltpackException \u0026ex) {\n    \n        std::cerr \u003c\u003c \"ERROR: \" \u003c\u003c ex.what() \u003c\u003c std::endl;\n    }\n\n    return 0;\n}\n```\n\n### Sign/verify message\n\n#### Attached signature\n\n```c++\n#include \u003csaltpack.h\u003e\n#include \u003csodium.h\u003e\n#include \u003ciostream\u003e\n\nint main(void) {\n\n    try {\n    \n        // generate keypair\n        saltpack::BYTE_ARRAY secretkey(crypto_sign_SECRETKEYBYTES);\n        saltpack::BYTE_ARRAY publickey(crypto_sign_PUBLICKEYBYTES);\n        saltpack::Utils::generateSignKeypair(publickey, secretkey);\n        \n        // sign message\n        std::stringstream out;\n        saltpack::ArmoredOutputStream aOut(out, saltpack::MODE_ATTACHED_SIGNATURE);\n        saltpack::MessageWriter *sig = new saltpack::MessageWriter(aOut, secretkey, false);\n        sig-\u003eaddBlock({'a', ' ', 's', 'i', 'g', 'n', 'e', 'd', ' ', 'm', 'e', 's', 's', 'a', 'g', 'e'}, true);\n        aOut.finalise();\n        \n        out.flush();\n        delete sig;\n        \n        // display signed message\n        std::cout \u003c\u003c out.str() \u003c\u003c std::endl;\n        \n        // verify message\n        std::stringstream in(out.str());\n        saltpack::ArmoredInputStream aIn(in);\n        std::stringstream msg;\n        saltpack::MessageReader *dec = new saltpack::MessageReader(aIn);\n        while (dec-\u003ehasMoreBlocks()) {\n        \n            saltpack::BYTE_ARRAY message = dec-\u003egetBlock();\n            msg.write(reinterpret_cast\u003cconst char *\u003e(message.data()), message.size());\n        }\n        delete dec;\n    \n        // display verified message\n        std::cout \u003c\u003c std::endl \u003c\u003c msg.str() \u003c\u003c std::endl;\n    \n    } catch (const saltpack::SaltpackException \u0026ex) {\n    \n        std::cerr \u003c\u003c \"ERROR: \" \u003c\u003c ex.what() \u003c\u003c std::endl;\n    }\n\n    return 0;\n}\n```\n\n#### Detached signature\n\n```c++\n#include \u003csaltpack.h\u003e\n#include \u003csodium.h\u003e\n#include \u003ciostream\u003e\n\nint main(void) {\n\n    try {\n    \n        // generate keypair\n        saltpack::BYTE_ARRAY secretkey(crypto_sign_SECRETKEYBYTES);\n        saltpack::BYTE_ARRAY publickey(crypto_sign_PUBLICKEYBYTES);\n        saltpack::Utils::generateSignKeypair(publickey, secretkey);\n        \n        // sign message\n        std::stringstream out;\n        saltpack::ArmoredOutputStream aOut(out, saltpack::MODE_DETACHED_SIGNATURE);\n        saltpack::MessageWriter *sig = new saltpack::MessageWriter(aOut, secretkey, true);\n        sig-\u003eaddBlock({'a', ' ', 's', 'i', 'g', 'n', 'e', 'd', ' ', 'm', 'e', 's', 's', 'a', 'g', 'e'}, true);\n        aOut.finalise();\n        \n        out.flush();\n        delete sig;\n        \n        // display signature\n        std::cout \u003c\u003c out.str() \u003c\u003c std::endl;\n        \n        // verify message\n        std::stringstream in(out.str());\n        saltpack::ArmoredInputStream aIn(in);\n        std::stringstream msg(\"a signed message\");\n        saltpack::MessageReader *dec = new saltpack::MessageReader(aIn, msg);\n        delete dec;\n    \n    } catch (const saltpack::SaltpackException \u0026ex) {\n    \n        std::cerr \u003c\u003c \"ERROR: \" \u003c\u003c ex.what() \u003c\u003c std::endl;\n    }\n\n    return 0;\n}\n```\n\n### Signcrypt message\n\n#### Curve25519 key\n\n```c++\n#include \u003csaltpack.h\u003e\n#include \u003csodium.h\u003e\n#include \u003ciostream\u003e\n\nint main(void) {\n\n    try {\n    \n        // generate signer keypair\n        saltpack::BYTE_ARRAY signer_secretkey(crypto_sign_SECRETKEYBYTES);\n        saltpack::BYTE_ARRAY signer_publickey(crypto_sign_PUBLICKEYBYTES);\n        saltpack::Utils::generateSignKeypair(signer_publickey, signer_secretkey);\n        \n        // generate recipient keypair\n        saltpack::BYTE_ARRAY receiver_publickey(crypto_box_PUBLICKEYBYTES);\n        saltpack::BYTE_ARRAY receiver_secretkey(crypto_box_SECRETKEYBYTES);\n        saltpack::Utils::generateKeypair(receiver_publickey, receiver_secretkey);\n\n        // asymmetric keys\n        std::list\u003csaltpack::BYTE_ARRAY\u003e recipients;\n        recipients.push_back(receiver_publickey);\n\n        // symmetric keys (empty)\n        std::list\u003cstd::pair\u003csaltpack::BYTE_ARRAY, saltpack::BYTE_ARRAY\u003e\u003e symmetricKeys;\n\n        // signcrypt message\n        std::stringstream out;\n        saltpack::ArmoredOutputStream aOut(out, saltpack::MODE_ENCRYPTION);\n        saltpack::MessageWriter *sig = new saltpack::MessageWriter(\n            aOut, signer_secretkey, recipients, symmetricKeys);\n        sig-\u003eaddBlock({'a', ' ', 's', 'e', 'c', 'r', 'e', 't', ' ', 'm', 'e', 's', 's', 'a', 'g', 'e'}, true);\n        aOut.finalise();\n        \n        out.flush();\n        delete sig;\n        \n        // display message\n        std::cout \u003c\u003c out.str() \u003c\u003c std::endl;\n        \n        // verify message\n        std::stringstream in(out.str());\n        saltpack::ArmoredInputStream aIn(in);\n        std::stringstream msg;\n        saltpack::MessageReader *dec = new saltpack::MessageReader(aIn, receiver_secretkey,\n            std::pair\u003csaltpack::BYTE_ARRAY, saltpack::BYTE_ARRAY\u003e{});\n        while (dec-\u003ehasMoreBlocks()) {\n        \n            saltpack::BYTE_ARRAY message = dec-\u003egetBlock();\n            msg.write(reinterpret_cast\u003cconst char *\u003e(message.data()), message.size());\n        }\n        delete dec;\n    \n        // display verified message\n        std::cout \u003c\u003c std::endl \u003c\u003c msg.str() \u003c\u003c std::endl;\n    \n    } catch (const saltpack::SaltpackException \u0026ex) {\n    \n        std::cerr \u003c\u003c \"ERROR: \" \u003c\u003c ex.what() \u003c\u003c std::endl;\n    }\n\n    return 0;\n}\n```\n\n#### Symmetric key\n\n```c++\n#include \u003csaltpack.h\u003e\n#include \u003csodium.h\u003e\n#include \u003ciostream\u003e\n\nint main(void) {\n\n    try {\n    \n        // generate signer keypair\n        saltpack::BYTE_ARRAY signer_secretkey(crypto_sign_SECRETKEYBYTES);\n        saltpack::BYTE_ARRAY signer_publickey(crypto_sign_PUBLICKEYBYTES);\n        saltpack::Utils::generateSignKeypair(signer_publickey, signer_secretkey);\n        \n        // asymmetric keys (empty)\n        std::list\u003csaltpack::BYTE_ARRAY\u003e recipients;\n\n        // symmetric keys\n        std::list\u003cstd::pair\u003csaltpack::BYTE_ARRAY, saltpack::BYTE_ARRAY\u003e\u003e symmetricKeys;\n        std::pair\u003csaltpack::BYTE_ARRAY, saltpack::BYTE_ARRAY\u003e key(\n            saltpack::Utils::generateRandomBytes(32),\n            saltpack::Utils::generateRandomBytes(crypto_secretbox_KEYBYTES));\n        symmetricKeys.push_back(key);\n\n        // signcrypt message\n        std::stringstream out;\n        saltpack::ArmoredOutputStream aOut(out, saltpack::MODE_ENCRYPTION);\n        saltpack::MessageWriter *sig = new saltpack::MessageWriter(\n            aOut, signer_secretkey, recipients, symmetricKeys);\n        sig-\u003eaddBlock({'A', ' ', 's', '3', 'c', 'r', 'e', '7'}, false);\n        sig-\u003eaddBlock({' ', 'm', 'e', 's', 's', '@', 'g', 'e'}, true);\n        aOut.finalise();\n        \n        out.flush();\n        delete sig;\n        \n        // display message\n        std::cout \u003c\u003c out.str() \u003c\u003c std::endl;\n        \n        // verify message\n        std::stringstream in(out.str());\n        saltpack::ArmoredInputStream aIn(in);\n        std::stringstream msg;\n        saltpack::MessageReader *dec = new saltpack::MessageReader(aIn, saltpack::BYTE_ARRAY{}, key);\n        while (dec-\u003ehasMoreBlocks()) {\n        \n            saltpack::BYTE_ARRAY message = dec-\u003egetBlock();\n            msg.write(reinterpret_cast\u003cconst char *\u003e(message.data()), message.size());\n        }\n        delete dec;\n    \n        // display verified message\n        std::cout \u003c\u003c std::endl \u003c\u003c msg.str() \u003c\u003c std::endl;\n    \n    } catch (const saltpack::SaltpackException \u0026ex) {\n    \n        std::cerr \u003c\u003c \"ERROR: \" \u003c\u003c ex.what() \u003c\u003c std::endl;\n    }\n\n    return 0;\n}\n```\n\nAuthor\n------\n\n\u003e GitHub [@gherynos](https://github.com/gherynos)\n\nLicense\n-------\n\nlibsaltpack is licensed under the [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0).\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgherynos%2Flibsaltpack","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgherynos%2Flibsaltpack","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgherynos%2Flibsaltpack/lists"}