Aead docs
This commit is contained in:
parent
a70bb5243c
commit
6183a2eb6b
@ -1,4 +1,27 @@
|
||||
# Package com.ionspin.kotlin.crypto.aead
|
||||
|
||||
Package AEAD stuff here
|
||||
## Authenticated encryption with associated data
|
||||
|
||||
This is a form of symmetric encryption, that assures both confidentiality and authenticity of the data.
|
||||
|
||||
In general it works like this:
|
||||
|
||||
Inputs:
|
||||
- Message to encrypt and authenticate
|
||||
- Key to use for encryption
|
||||
- **Unique** nonce
|
||||
- Additional data that is not encrypted but also authenticated
|
||||
|
||||
Simplified encryption algorithm:
|
||||
1. Encrypt message with key and nonce
|
||||
1. Apply MAC to encrypted message + unencrypted associated data to generate authentication data (tag)
|
||||
1. Send the encrypted data + associated data + authentication data + nonce
|
||||
|
||||
Simplified decryption algorithm:
|
||||
1. Apply MAC to encrypted message + unencrypted associated data to generate authentication data
|
||||
1. If the generated authenticated data, and the received authentication data match, proceed, otherwise sound the alarm and stop.
|
||||
1. Decrypt the encrypted data
|
||||
1. Return the decrypted data and associated data to the user
|
||||
|
||||
|
||||
|
||||
|
@ -22,11 +22,36 @@ val crypto_aead_chacha20poly1305_KEYBYTES = 32
|
||||
val crypto_aead_chacha20poly1305_NPUBBYTES = 8
|
||||
val crypto_aead_chacha20poly1305_ABYTES = 16
|
||||
|
||||
|
||||
/**
|
||||
* A data class wrapping returned encrypted data and and tag from aead encrypt functions.
|
||||
*/
|
||||
data class AeadEncryptedDataAndTag(val data: UByteArray, val tag: UByteArray)
|
||||
|
||||
class AeadCorrupedOrTamperedDataException() : RuntimeException("MAC validation failed. Data is corrupted or tampered with.")
|
||||
/**
|
||||
* An exception thrown when tag generated from received data and key doesn't match the received tag
|
||||
*/
|
||||
class AeadCorrupedOrTamperedDataException() : RuntimeException("Tag (authentication data) validation failed. Data is corrupted or tampered with.")
|
||||
|
||||
/**
|
||||
* This is a form of symmetric encryption, that assures both confidentiality and authenticity of the data.
|
||||
*
|
||||
* Offered here are three implementations of (x)ChaCha20-Poly1305 construction:
|
||||
* - ChaCha20Poly1305 - uses 64bit nonce
|
||||
* - ChaCha20Poly1305-IETF - uses 96bit nonce (standardised by [RFC8439](https://tools.ietf.org/html/rfc8439)
|
||||
* - XChaCha20Poly1305 - uses 192bit nonce - recommended choice
|
||||
*
|
||||
* The only difference is the size of the nonce, and how is the nonce used.
|
||||
*
|
||||
* (x)ChaCha20 is a streaming cipher develop by Daniel J. Bernstein. He is also the author of Poly1305 a fast Message
|
||||
* Authentication Code system
|
||||
*
|
||||
* Libsodium offers two additional variants for each of the aforementioned variants:
|
||||
* - Combined
|
||||
* - Detached
|
||||
*
|
||||
* Combined mode returns encrypted data and tag as one UByteArray, while detached mode returns them as separate UByteArrays.
|
||||
* To be kotlin idiomatic we are returning detached tag and encrypted data inside a wrapper data class [AeadEncryptedDataAndTag]
|
||||
*/
|
||||
expect object AuthenticatedEncryptionWithAssociatedData {
|
||||
// X - Ietf
|
||||
fun xChaCha20Poly1305IetfEncrypt(
|
||||
|
Loading…
x
Reference in New Issue
Block a user