SymEncKeys
The concept of SymEncKeys
is a feature of the Seald SDK that allows retrieving an EncryptionSession
without being a direct recipient.
The idea is to transmit a secret (in the form of a password
, or a rawSecret
/rawSymKey
pair) to the recipient, along with the ID of the SymEncKey
. This will enable them to retrieve the EncryptionSession
.
Here's how SymEncKeys
work:
- The creator of a session adds a
SymEncKey
using thesession.addSymEncKey()
method, with a secret. This returns the ID of the newly createdSymEncKey
. - The secret is transmitted out-of-band to the person who will decrypt (for example, via a QRCode). This person can then use
sdk.retrieveEncryptionSessionWithSymEncKey()
oranonymousSdk.retrieveEncryptionSession()
to retrieve the session and decrypt.
How you transmit the secret from the creator to the recipient is up to you, and depends on your use case.
WARNING
This feature is currently only available in the Seald SDK for JavaScript, and has not yet been implemented in the Seald Mobile SDK for Android, iOS, and Flutter.
Creating a SymEncKey
The user who created an EncryptionSession
, or anyone with access to it and who has the forward
right, can create a SymEncKey
for this EncryptionSession
.
To create a SymEncKey
, you need to retrieve the EncryptionSession
object and use the session.addSymEncKey()
method. This method accepts either:
- a
password
; - or a
rawSecret
andrawSymKey
pair.
Using a password
is simpler, as you only have to transmit this single value to the recipient. However, it is slower, as the SDK derives the rawSecret
and rawSymKey
from this password
, which can take up to a few hundred milliseconds.
TIP
To ensure end-to-end confidentiality, rawSecret
and rawSymKey
(or password
, which allows to derive them) must remain secret, even from your server.
rawSecret
allows you to prove to the Seald server that you have the right to retrieve the encrypted session key, and rawSymKey
is the key that decrypts the session key.
You can also specify rights for users of this SymEncKey
using the rights
argument.
TIP
The default rights
for a SymEncKey
are { read: true, forward: true, revoke: false }
.
- the
read
right is necessary, otherwise theSymEncKey
is unusable; - the
forward
right allows the use ofsdk.selfAddToEncryptionSessionWithSymEncKey
to add yourself as a normal recipient of anEncryptionSession
via aSymEncKey
; - the
revoke
right allows you when usingsdk.selfAddToEncryptionSessionWithSymEncKey
, to give yourself therevoke
right.
The session.addSymEncKey()
method returns a string
, which is the ID of the created SymEncKey
. This ID is not secret and can be transmitted to your server.
Example:
const crypto = require('node:crypto')
// `rawSecret` can be an arbitrary string, as long as it is hard enough to guess. Here, we use `crypto` for simplicity. A UUIDv4 would also be a good choice.
const rawSecret = crypto.randomBytes(64).toString('base64')
// `rawSymKey` must be a cryptographically secure random buffer of 64 bytes, encoded in base64.
const rawSymKey = crypto.randomBytes(64).toString('base64')
// Creating the `SymEncKey`
const symEncKeyId = await session.addSymEncKey({
rawSecret,
rawSymKey,
rights: { read: true, forward: false, revoke: false }
})
Retrieving a session with a SymEncKey
To retrieve an EncryptionSession
via a SymEncKey
, use the sdk.retrieveEncryptionSessionWithSymEncKey()
method. This method takes as arguments:
- the session ID;
- the
SymEncKey
ID, which is not secret and can be transmitted via your server; - the
SymEncKey
secret (either apassword
, or arawSecret
/rawSymKey
pair).
TIP
To ensure end-to-end confidentiality, the secret of the SymEncKey
(either a password
or a rawSecret
/rawSymKey
pair) must remain secret, even from your server.
How you transmit the secret from the creator to the recipient is up to you, and depends on your use case.
The sdk.retrieveEncryptionSessionWithSymEncKey()
method returns an EncryptionSession
, which then allows you to encrypt/decrypt messages and files.
TIP
If you access an EncryptionSession
via a SymEncKey
, you cannot use the access management methods of that session (session.addRecipients()
, session.addSymEncKey()
, session.revokeRecipients()
, session.listRecipients()
, ...).
Example:
// Retrieving a session with a `SymEncKey`
const session = await sdk.retrieveEncryptionSessionWithSymEncKey({
sessionId, // `sessionId` is not secret, and can be transferred via your server
symEncKeyId, // `symEncKeyId` is not secret, and can be transferred via your server
symEncKeyRawSecret, // `symEncKeyRawSecret` is secret, and should never be known by your server
symEncKeyRawSymKey // `symEncKeyRawSymKey` is secret, and should never be known by your server
})
Self-adding to a Session with a SymEncKey
If you have access to an EncryptionSession
via a SymEncKey
, and this SymEncKey
has the forward
right, you can also use it to add yourself as a "normal" recipient of this session. This allows you, for example, to then transfer this session to other users or to a group. For this, you can use the sdk.selfAddToEncryptionSessionWithSymEncKey()
method. This method takes as arguments:
- the session ID;
- the
SymEncKey
ID, which is not secret and can be transmitted via your server; - the
SymEncKey
secret (either apassword
, or arawSecret
/rawSymKey
pair).
You can also specify the rights for yourself as a recipient of this session, within the limit of the rights of the SymEncKey
, using the rights
argument.
TIP
The default rights
for yourself are { read: true, forward: true, revoke: false }
.
- the
read
right is necessary; - the
forward
right allows you to transfer this session to other recipients viasession.addRecipients()
and to create newSymEncKeys
; - the
revoke
right allows you to revoke recipients from this session and removeSymEncKeys
.
For convenience, the method sdk.selfAddToEncryptionSessionWithSymEncKey()
also returns the EncryptionSession
.
Example:
// Self-adding to a session with a `SymEncKey`
const session = await sdk.selfAddToEncryptionSessionWithSymEncKey({
sessionId, // `sessionId` is not secret, and can be transferred via your server
symEncKeyId, // `symEncKeyId` is not secret, and can be transferred via your server
symEncKeyRawSecret, // `symEncKeyRawSecret` is secret, and should never be known by your server
symEncKeyRawSymKey, // `symEncKeyRawSymKey` is secret, and should never be known by your server
rights: { read: true, forward: false, revoke: false }
})
Anonymous Retrieval of a session with a SymEncKey
To anonymously retrieve an EncryptionSession
via a SymEncKey
, you can use the method anonymousSdk.retrieveEncryptionSession()
. This method takes the following arguments:
- the session ID;
- the
SymEncKey
ID, which is not secret and can be transmitted via your server; - the
SymEncKey
secret (either apassword
andappId
, or arawSecret
/rawSymKey
pair); - a JWT
retrieveSessionToken
, created by your server, which authorizes the session retrieval.
TIP
To ensure end-to-end confidentiality, the secret of the SymEncKey
(either a password
or a rawSecret
/rawSymKey
pair) must remain secret, even from your server.
How you transmit the secret from the creator to the recipient is up to you, and depends on your use case.
The method anonymousSdk.retrieveEncryptionSession()
returns an AnonymousEncryptionSession
, which allows you to then encrypt/decrypt messages and files.
Usage example:
// Anonymous retrieval of a session with a `SymEncKey`
const session = await anonymousSdk.retrieveEncryptionSession({
sessionId, // `sessionId` is not secret, and can be transferred via your server
symEncKeyId, // `symEncKeyId` is not secret, and can be transferred via your server
symEncKeyRawSecret, // `symEncKeyRawSecret` is secret, and should never be known by your server
symEncKeyRawSymKey, // `symEncKeyRawSymKey` is secret, and should never be known by your server
retrieveSessionToken // JWT generated by your server to authorize this anonymous retrieval
})