SAKKE (Sakai-Kasahara Key Encryption) is specified in RFC 6508 (https://tools.ietf.org/html/rfc6508).
SAKKE is used to transfer a secret to a peer using Identity Based cryptography.
The Key Management Service (KMS) is responsible for issuing Receiver Secret Keys (RSKs). Data up to (2^hashlen)^hashlen bytes of data can be transferred.
The sender must know the identity of the receiver and the KMS Public Key.
The receiver must have obtained a Receiver Secret Key (RSK) for the identity from a KMS in order to derive the secret.
KMS:
- Initialize SAKKE Key: wc_InitSakkeKey()
- Make and save or load SAKKE Key:
- wc_MakeSakkeKey(), wc_ExportSakkeKey(), wc_ExportSakkePublicKey() or
- wc_ImportSakkeKey()
- Wait for request:
- Make an RSK base on ID for the client: wc_MakeSakkeRsk()
- Encode RSK for transfer to client: wc_EncodeSakkeRsk()
- Free SAKKE Key: wc_FreeSakkeKey()
Key Exchange, Peer A:
- Initialize SAKKE Key: wc_InitSakkeKey()
- Load KMS Public Key: wc_ImportSakkePublicKey()
- Generate a random SSV: wc_GenerateSakkeSSV()
- Set the identity of Peer B: wc_SetSakkeIdentity()
- Make an encapsulated SSV and auth data: wc_MakeSakkeEncapsulatedSSV()
- Send encapsulated data to Peer B
- Free SAKKE Key: wc_FreeSakkeKey()
Key Exchange, Peer B:
- Receive encapsulated data.
- Initialize SAKKE Key: wc_InitSakkeKey()
- Load KMS Public Key: wc_ImportSakkePublicKey()
- Decode RSK transferred from KMS or stored locally: wc_DecodeSakkeRsk()
- [Optional] Validate RSK before first use: wc_ValidateSakkeRsk()
- Set the identity: wc_SetSakkeIdentity()
- Set the RSK and, optionally precomputation table: wc_SetSakkeRsk()
- Derive SSV with auth data: wc_DeriveSakkeSSV()
- Free SAKKE Key: wc_FreeSakkeKey()
Transfer secret, Peer A:
- Initialize SAKKE Key: wc_InitSakkeKey()
- Load KMS Public Key: wc_ImportSakkePublicKey()
- Set the identity of Peer B: wc_SetSakkeIdentity()
- Make an encapsulation of the SSV and auth data: wc_MakeSakkeEncapsulatedSSV()
- Send encapsulated data to Peer B
- Free SAKKE Key: wc_FreeSakkeKey()
Transfer secret, Peer B:
- Initialize SAKKE Key: wc_InitSakkeKey()
- Load KMS Public Key: wc_ImportSakkePublicKey()
- Decode RSK transferred from KMS or stored locally: wc_DecodeSakkeRsk()
- [Optional] Validate RSK before first use: wc_ValidateSakkeRsk()
- Receive encapsulated data.
- Set the identity: wc_SetSakkeIdentity()
- Set the RSK and, optionally precomputation table: wc_SetSakkeRsk()
- Derive SSV and auth data: wc_DeriveSakkeSSV()
- Free SAKKE Key: wc_FreeSakkeKey()