From 12d2c7d8d60ffe1d0543c854ccdfa37c0b3ef4ac Mon Sep 17 00:00:00 2001 From: zach-planet-nine Date: Wed, 7 Aug 2024 17:28:00 -0700 Subject: [PATCH 1/6] documentation --- ...onless Product Detail.md => README-PROD.md | 0 docs/CONTRIBUTING | 41 ++++++++++++++++++ src/cpp/README.md | 2 +- src/csharp/Sessionless/README.md | 4 ++ src/javascript/README.md | 26 +++++++++++ src/javascript/example/server-deno/dump.rdb | Bin 0 -> 81303 bytes src/javascript/node/README.md | 4 ++ src/python/README.md | 25 +++++++++++ src/python/package/README.md | 4 ++ src/rust/README.md | 25 +++++++++++ src/rust/crate/README.md | 6 ++- src/swift/README.md | 2 + 12 files changed, 137 insertions(+), 2 deletions(-) rename Sessionless Product Detail.md => README-PROD.md (100%) create mode 100644 docs/CONTRIBUTING create mode 100644 src/javascript/README.md create mode 100644 src/javascript/example/server-deno/dump.rdb create mode 100644 src/python/README.md create mode 100644 src/rust/README.md diff --git a/Sessionless Product Detail.md b/README-PROD.md similarity index 100% rename from Sessionless Product Detail.md rename to README-PROD.md diff --git a/docs/CONTRIBUTING b/docs/CONTRIBUTING new file mode 100644 index 000000000..2dda6fb65 --- /dev/null +++ b/docs/CONTRIBUTING @@ -0,0 +1,41 @@ +# How to contribute + +I'm of the opinion that contributing should be as easy and inviting as possible. +This guide is written with that premise in mind. + +The discussion about Sessionless takes place on Discord in the [Open Source Force][osf] server. +Follow that link to get an invite. + +Before contributing, I recommend you read through the READMEs and supporting documentation thoroughly. + +## Testing + +New language implementations should include an example server, which is added to the color tests of the language CLIs (of which only javascript and Rust are currently setup for new languages). + +New client implementations should be testable against any of the example servers, and should include an example with some simple UI for doing that test. + +Unit tests for implementations are encouraged, but not required since testing an implementation against itself can give false positives.[^1] + +## Submitting changes + +Please send a with a clear list of what you've done (read more about [pull requests](http://help.github.com/pull-requests/)). +Feel free to give us a heads up on Discord of your impressive contribution. + +## Coding conventions + +The Sessionless repo is multi-language, and multi-platform so there are no global conventions. +Still some concepts are common between implementations. + +* Sessionless is small (only 6-8 functions), and should be as flat as possible. +Try to avoid indirection, and unecessary abstraction. + +* Your implementation should match the words of the names of functions, but adopt other conventions of your language, i.e. snake_casing vs camelCasing. + +* If your implementation errors, it should log a clear message about why it is erroring. + +Thank you for your interest in Sessionless! +We look forward to seeing what you come up with. + +Planet Nine & Open Source Force + +[osf]: https://opensourceforce.net diff --git a/src/cpp/README.md b/src/cpp/README.md index 2891d55ae..4e1543684 100644 --- a/src/cpp/README.md +++ b/src/cpp/README.md @@ -1,7 +1,7 @@ ### Overview The c++ implementation of Sessionless wraps the c bitcoin-core secp256k1 library. -It has been tested on Mac, and Linux (and Arduino--coming soon). +It has been tested on Mac, Linux, and Arduino. c++ doesn't really have a package manager, so you'll want to include sessionless from git. Check the CMakeLists.txt in src/cpp/client/example for instructions on how to do this. diff --git a/src/csharp/Sessionless/README.md b/src/csharp/Sessionless/README.md index 0c458d6a3..18655caba 100644 --- a/src/csharp/Sessionless/README.md +++ b/src/csharp/Sessionless/README.md @@ -1,5 +1,9 @@ # Sessionless +[*Sessionless*](https://www.github.com/planet-nine-app/sessionless) is a multi-language implementation of public-key cryptography. +It's trying to be like the cordless drill or sewing machine of authentication--a tool everyone can have in their house t +o help them make things. + This is the C# implementation of the Sessionless protocol--a protocol for providing auth without user data like emails, passwords, or sessions. diff --git a/src/javascript/README.md b/src/javascript/README.md new file mode 100644 index 000000000..9ba6e5d7e --- /dev/null +++ b/src/javascript/README.md @@ -0,0 +1,26 @@ +# Sessionless + +This folder holds the JavaScript, and TypeScript implementation of Sessionless. +There are node, and React Native Expo versions currently. +The node version should work everywhere you want it to, there's just a need for platform-specific implementations due to how secure things are stored. + +## Usage + +### Installation + +Currently these are available only in npm, though other registries should come soon. +So a standard `npm i sessionless-node` should work for you. + +### Methods + +Function | What it does +:--------|:------------ +`generateKeys(saveKeys?: keys => void, getKeys?: () => Keys)` | Generates a private/public keypair and stores it in the platform's secure storage. Takes an optional `saveKeys` function for platforms that don't have clear-cut secure storage. +`getKeys()` | Gets keys from secure storage. +`sign(message: String)` | Signs a message with the user's private key. +`verifySignature(message: String, signature: String, publicKey: String)` | Verifies a given signature with a public key. +`generateUUID()` | Creates a unique UUID for a user. +`associateKeys(associationMessage: String, primarySignature: String, secondarySignature: String, publicKey: String)` | Associates a secondary's key with the user's primary key. +`revokeKey(message: String, signature: String, publicKey: String)` | Revokes a gateway's key from the user. + + diff --git a/src/javascript/example/server-deno/dump.rdb b/src/javascript/example/server-deno/dump.rdb new file mode 100644 index 0000000000000000000000000000000000000000..8570b9ae40fbbb7e65ae618dc538a7baa10d10bf GIT binary patch literal 81303 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 Z(OioCwTvm$2fxw%wg3A2|NQ5-{tuBsVAlWu literal 0 HcmV?d00001 diff --git a/src/javascript/node/README.md b/src/javascript/node/README.md index 58f95e3b6..c2411f6f8 100644 --- a/src/javascript/node/README.md +++ b/src/javascript/node/README.md @@ -1,5 +1,9 @@ # Sessionless +[*Sessionless*](https://www.github.com/planet-nine-app/sessionless) is a multi-language implementation of public-key cryptography. +It's trying to be like the cordless drill or sewing machine of authentication--a tool everyone can have in their house t +o help them make things. + This is the node implementation of the Sessionless protocol--a protocol for providing auth without user data like emails, passwords, or sessions. For examples of various server implementations, please see [here][examples]. diff --git a/src/python/README.md b/src/python/README.md new file mode 100644 index 000000000..132fa92a1 --- /dev/null +++ b/src/python/README.md @@ -0,0 +1,25 @@ +# Sessionless + +This folder holds the Python implementation of Sessionless. +There is a Flask example, and a cli as well. + +## Usage + +### Installation + +Currently available in pip. +`pip install sessionless` + +### Methods + +Function | What it does +:--------|:------------ +`generateKeys(saveKeys?: keys => void, getKeys?: () => Keys)` | Generates a private/public keypair and stores it in the platform's secure storage. Takes an optional `saveKeys` function for platforms that don't have clear-cut secure storage. +`getKeys()` | Gets keys from secure storage. +`sign(message: String)` | Signs a message with the user's private key. +`verifySignature(message: String, signature: String, publicKey: String)` | Verifies a given signature with a public key. +`generateUUID()` | Creates a unique UUID for a user. +`associateKeys(associationMessage: String, primarySignature: String, secondarySignature: String, publicKey: String)` | Associates a secondary's key with the user's primary key. +`revokeKey(message: String, signature: String, publicKey: String)` | Revokes a gateway's key from the user. + + diff --git a/src/python/package/README.md b/src/python/package/README.md index 677b6fb02..ee93eaf51 100644 --- a/src/python/package/README.md +++ b/src/python/package/README.md @@ -4,6 +4,10 @@ ## About +[*Sessionless*](https://www.github.com/planet-nine-app/sessionless) is a multi-language implementation of public-key cryptography. +It's trying to be like the cordless drill or sewing machine of authentication--a tool everyone can have in their house t +o help them make things. + [Sessionless](https://sessionless.org/) is an open-source authentication protocol that uses the cryptography employed by Bitcoin and Ethereum to authenticate messages sent between a client and a server. Within this protocol, you create and store a private key on the client and then use that key to sign messages; the server then verifies those messages via the public key associated with the client. When you verify a message you also certify its provenance. Sessions are wholly unnecessary because no other secret needs to be shared between client and server. ## Getting Started diff --git a/src/rust/README.md b/src/rust/README.md new file mode 100644 index 000000000..e62bd22cd --- /dev/null +++ b/src/rust/README.md @@ -0,0 +1,25 @@ +# Sessionless + +This folder holds the Rust implementation of Sessionless. +There is a hyper example, and a cli as well. + +## Usage + +### Installation + +Currently available as a crate. +`crate add sessionless` + +### Methods + +Function | What it does +:--------|:------------ +`generateKeys(saveKeys?: keys => void, getKeys?: () => Keys)` | Generates a private/public keypair and stores it in the platform's secure storage. Takes an optional `saveKeys` function for platforms that don't have clear-cut secure storage. +`getKeys()` | Gets keys from secure storage. +`sign(message: String)` | Signs a message with the user's private key. +`verifySignature(message: String, signature: String, publicKey: String)` | Verifies a given signature with a public key. +`generateUUID()` | Creates a unique UUID for a user. +`associateKeys(associationMessage: String, primarySignature: String, secondarySignature: String, publicKey: String)` | Associates a secondary's key with the user's primary key. +`revokeKey(message: String, signature: String, publicKey: String)` | Revokes a gateway's key from the user. + + diff --git a/src/rust/crate/README.md b/src/rust/crate/README.md index dccc4a3a0..ae622cefc 100644 --- a/src/rust/crate/README.md +++ b/src/rust/crate/README.md @@ -1,6 +1,10 @@ # Sessionless -Rust implementation of the [Sessionless](https://github.com/planet-nine-app/sessionless) protocol. +[*Sessionless*](https://www.github.com/planet-nine-app/sessionless) is a multi-language implementation of public-key cryptography. +It's trying to be like the cordless drill or sewing machine of authentication--a tool everyone can have in their house t +o help them make things. + +Rust implementation of the [Sessionless](https://sessionless.org) protocol. > Sessionless is an authentication protocol that uses the cryptography employed by Bitcoin and Ethereum to authenticate messages sent between a client and a server. diff --git a/src/swift/README.md b/src/swift/README.md index c8e16b23d..658ab687f 100644 --- a/src/swift/README.md +++ b/src/swift/README.md @@ -1,5 +1,7 @@ ### Overview +[PLEASE NOTE I THINK THIS MIGHT BE BROKEN RIGHT NOW. HOPEFULLY I REMEMBER TO REMOVE THIS MESSAGE WHEN I FIX IT] + The Swift implementation of Sessionless is available as a local pod from this repo. I think the new hotness is spm, so I'll likely distribute like that instead, but for now you can just grab the client-ios folder from this repo, and link it in your Podfile. See any of the examples' Podfiles for how to do this. From f6c89b04c5afcf40d47ec12a17311158dfef5609 Mon Sep 17 00:00:00 2001 From: FssAy <49795742+FssAy@users.noreply.github.com> Date: Thu, 8 Aug 2024 11:46:10 +0200 Subject: [PATCH 2/6] Fix Rust implementation README - Changed the installation command to use `cargo` - Changed the table formatting to fix compatibility issues --- src/rust/README.md | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/src/rust/README.md b/src/rust/README.md index e62bd22cd..b5853fae8 100644 --- a/src/rust/README.md +++ b/src/rust/README.md @@ -8,18 +8,16 @@ There is a hyper example, and a cli as well. ### Installation Currently available as a crate. -`crate add sessionless` +`cargo add sessionless` ### Methods -Function | What it does -:--------|:------------ -`generateKeys(saveKeys?: keys => void, getKeys?: () => Keys)` | Generates a private/public keypair and stores it in the platform's secure storage. Takes an optional `saveKeys` function for platforms that don't have clear-cut secure storage. -`getKeys()` | Gets keys from secure storage. -`sign(message: String)` | Signs a message with the user's private key. -`verifySignature(message: String, signature: String, publicKey: String)` | Verifies a given signature with a public key. -`generateUUID()` | Creates a unique UUID for a user. -`associateKeys(associationMessage: String, primarySignature: String, secondarySignature: String, publicKey: String)` | Associates a secondary's key with the user's primary key. -`revokeKey(message: String, signature: String, publicKey: String)` | Revokes a gateway's key from the user. - - +| Function | What it does | +|:---------------------------------------------------------------------------------------------------------------------|:------------| +| `generateKeys(saveKeys?: keys => void, getKeys?: () => Keys)` | Generates a private/public keypair and stores it in the platform's secure storage. Takes an optional `saveKeys` function for platforms that don't have clear-cut secure storage. | +| `getKeys()` | Gets keys from secure storage. | +| `sign(message: String)` | Signs a message with the user's private key. | +| `verifySignature(message: String, signature: String, publicKey: String)` | Verifies a given signature with a public key. | +| `generateUUID()` | Creates a unique UUID for a user. | +| `associateKeys(associationMessage: String, primarySignature: String, secondarySignature: String, publicKey: String)` | Associates a secondary's key with the user's primary key. | +| `revokeKey(message: String, signature: String, publicKey: String)` | Revokes a gateway's key from the user. | From 1ccd66b3cea645b747b3e754e7ba8984e71ca54e Mon Sep 17 00:00:00 2001 From: FssAy <49795742+FssAy@users.noreply.github.com> Date: Thu, 8 Aug 2024 19:10:23 +0200 Subject: [PATCH 3/6] Update Methods table for Rust implementation README --- src/rust/README.md | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/rust/README.md b/src/rust/README.md index b5853fae8..85bb14a6b 100644 --- a/src/rust/README.md +++ b/src/rust/README.md @@ -12,12 +12,11 @@ Currently available as a crate. ### Methods -| Function | What it does | -|:---------------------------------------------------------------------------------------------------------------------|:------------| -| `generateKeys(saveKeys?: keys => void, getKeys?: () => Keys)` | Generates a private/public keypair and stores it in the platform's secure storage. Takes an optional `saveKeys` function for platforms that don't have clear-cut secure storage. | -| `getKeys()` | Gets keys from secure storage. | -| `sign(message: String)` | Signs a message with the user's private key. | -| `verifySignature(message: String, signature: String, publicKey: String)` | Verifies a given signature with a public key. | -| `generateUUID()` | Creates a unique UUID for a user. | -| `associateKeys(associationMessage: String, primarySignature: String, secondarySignature: String, publicKey: String)` | Associates a secondary's key with the user's primary key. | -| `revokeKey(message: String, signature: String, publicKey: String)` | Revokes a gateway's key from the user. | +| Function | What it does | +|:------------------------------------------------------------------------------------------------------|:----------------------------------------------------------| +| `Sessionless::new()` | Generates new context object with private/public keypair. | +| `Sessionless::public_key(&self)` | Returns the public key. | +| `Sessionless::private_key(&self)` | Returns the private key. | +| `Sessionless::sign(&self, message: impl AsRef<[u8]>)` | Signs a message with the user's private key. | +| `Sessionless::verify(&self, message: impl AsRef<[u8]>, publicKey: &PublicKey, signature: &Signature)` | Verifies a given signature with a public key. | +| `Sessionless::generate_uuid()` | Creates a unique UUID for a user. | From 5f3bf2930d5e108d07e87cae07791a15e47f5944 Mon Sep 17 00:00:00 2001 From: zach-planet-nine Date: Sun, 11 Aug 2024 09:39:18 -0700 Subject: [PATCH 4/6] feedback --- docs/CONTRIBUTING | 41 ---------------------------------------- src/javascript/README.md | 2 +- src/python/README.md | 2 +- 3 files changed, 2 insertions(+), 43 deletions(-) delete mode 100644 docs/CONTRIBUTING diff --git a/docs/CONTRIBUTING b/docs/CONTRIBUTING deleted file mode 100644 index 2dda6fb65..000000000 --- a/docs/CONTRIBUTING +++ /dev/null @@ -1,41 +0,0 @@ -# How to contribute - -I'm of the opinion that contributing should be as easy and inviting as possible. -This guide is written with that premise in mind. - -The discussion about Sessionless takes place on Discord in the [Open Source Force][osf] server. -Follow that link to get an invite. - -Before contributing, I recommend you read through the READMEs and supporting documentation thoroughly. - -## Testing - -New language implementations should include an example server, which is added to the color tests of the language CLIs (of which only javascript and Rust are currently setup for new languages). - -New client implementations should be testable against any of the example servers, and should include an example with some simple UI for doing that test. - -Unit tests for implementations are encouraged, but not required since testing an implementation against itself can give false positives.[^1] - -## Submitting changes - -Please send a with a clear list of what you've done (read more about [pull requests](http://help.github.com/pull-requests/)). -Feel free to give us a heads up on Discord of your impressive contribution. - -## Coding conventions - -The Sessionless repo is multi-language, and multi-platform so there are no global conventions. -Still some concepts are common between implementations. - -* Sessionless is small (only 6-8 functions), and should be as flat as possible. -Try to avoid indirection, and unecessary abstraction. - -* Your implementation should match the words of the names of functions, but adopt other conventions of your language, i.e. snake_casing vs camelCasing. - -* If your implementation errors, it should log a clear message about why it is erroring. - -Thank you for your interest in Sessionless! -We look forward to seeing what you come up with. - -Planet Nine & Open Source Force - -[osf]: https://opensourceforce.net diff --git a/src/javascript/README.md b/src/javascript/README.md index 9ba6e5d7e..501d9e96c 100644 --- a/src/javascript/README.md +++ b/src/javascript/README.md @@ -14,7 +14,7 @@ So a standard `npm i sessionless-node` should work for you. ### Methods Function | What it does -:--------|:------------ +:--------|:------------| `generateKeys(saveKeys?: keys => void, getKeys?: () => Keys)` | Generates a private/public keypair and stores it in the platform's secure storage. Takes an optional `saveKeys` function for platforms that don't have clear-cut secure storage. `getKeys()` | Gets keys from secure storage. `sign(message: String)` | Signs a message with the user's private key. diff --git a/src/python/README.md b/src/python/README.md index 132fa92a1..3a92e3a58 100644 --- a/src/python/README.md +++ b/src/python/README.md @@ -13,7 +13,7 @@ Currently available in pip. ### Methods Function | What it does -:--------|:------------ +:--------|:------------| `generateKeys(saveKeys?: keys => void, getKeys?: () => Keys)` | Generates a private/public keypair and stores it in the platform's secure storage. Takes an optional `saveKeys` function for platforms that don't have clear-cut secure storage. `getKeys()` | Gets keys from secure storage. `sign(message: String)` | Signs a message with the user's private key. From 301880d09953039c7dc2f8c36c6820a33e3eedfc Mon Sep 17 00:00:00 2001 From: zach-planet-nine Date: Sun, 11 Aug 2024 09:45:33 -0700 Subject: [PATCH 5/6] note --- src/python/README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/python/README.md b/src/python/README.md index 3a92e3a58..0745a7bdf 100644 --- a/src/python/README.md +++ b/src/python/README.md @@ -12,6 +12,9 @@ Currently available in pip. ### Methods +* NOTE * These are pseudocode methods. +Please check documentation in Pip for the actual method signatures. + Function | What it does :--------|:------------| `generateKeys(saveKeys?: keys => void, getKeys?: () => Keys)` | Generates a private/public keypair and stores it in the platform's secure storage. Takes an optional `saveKeys` function for platforms that don't have clear-cut secure storage. From 49d9c9a297e0ba0460900b6fa144bea28ee71daf Mon Sep 17 00:00:00 2001 From: zach-planet-nine Date: Sun, 11 Aug 2024 11:37:12 -0700 Subject: [PATCH 6/6] md --- docs/CONTRIBUTING.md | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 docs/CONTRIBUTING.md diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md new file mode 100644 index 000000000..2dda6fb65 --- /dev/null +++ b/docs/CONTRIBUTING.md @@ -0,0 +1,41 @@ +# How to contribute + +I'm of the opinion that contributing should be as easy and inviting as possible. +This guide is written with that premise in mind. + +The discussion about Sessionless takes place on Discord in the [Open Source Force][osf] server. +Follow that link to get an invite. + +Before contributing, I recommend you read through the READMEs and supporting documentation thoroughly. + +## Testing + +New language implementations should include an example server, which is added to the color tests of the language CLIs (of which only javascript and Rust are currently setup for new languages). + +New client implementations should be testable against any of the example servers, and should include an example with some simple UI for doing that test. + +Unit tests for implementations are encouraged, but not required since testing an implementation against itself can give false positives.[^1] + +## Submitting changes + +Please send a with a clear list of what you've done (read more about [pull requests](http://help.github.com/pull-requests/)). +Feel free to give us a heads up on Discord of your impressive contribution. + +## Coding conventions + +The Sessionless repo is multi-language, and multi-platform so there are no global conventions. +Still some concepts are common between implementations. + +* Sessionless is small (only 6-8 functions), and should be as flat as possible. +Try to avoid indirection, and unecessary abstraction. + +* Your implementation should match the words of the names of functions, but adopt other conventions of your language, i.e. snake_casing vs camelCasing. + +* If your implementation errors, it should log a clear message about why it is erroring. + +Thank you for your interest in Sessionless! +We look forward to seeing what you come up with. + +Planet Nine & Open Source Force + +[osf]: https://opensourceforce.net