Aead docs
This commit is contained in:
parent
a70bb5243c
commit
6183a2eb6b
@ -1,4 +1,27 @@
|
|||||||
# Package com.ionspin.kotlin.crypto.aead
|
# 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_NPUBBYTES = 8
|
||||||
val crypto_aead_chacha20poly1305_ABYTES = 16
|
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)
|
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 {
|
expect object AuthenticatedEncryptionWithAssociatedData {
|
||||||
// X - Ietf
|
// X - Ietf
|
||||||
fun xChaCha20Poly1305IetfEncrypt(
|
fun xChaCha20Poly1305IetfEncrypt(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user