![]() |
![]()
| ![]() |
![]()
NAME
SYNOPSIS
void
void
void
void
DESCRIPTIONPoly1305 is a one-time message authentication code. “One-time” means the authentication key can be used only once. This makes Poly1305 easy to misuse. On the other hand, Poly1305 is fast and provably secure if used correctly. Poly1305 is a low-level primitive. Consider using authenticated encryption, implemented by crypto_aead_lock(3monocypher). The arguments are:
Direct interface
Incremental interface
RETURN VALUESThese functions return nothing. EXAMPLESThe following examples assume the existence of
To authenticate a message: const uint8_t msg[ 5] = "Lorem"; /* Message to authenticate */ uint8_t key[32]; /* Random secret key (use only once) */ uint8_t mac[16]; /* Message authentication code (MAC) */ arc4random_buf(key, 32); crypto_poly1305(mac, msg, 5, key); /* Wipe the key */ crypto_wipe(key, 32); To verify the above message: const uint8_t msg [ 5] = "Lorem"; /* Message to verify */ uint8_t key [32]; /* The above key */ const uint8_t mac [16]; /* The above MAC */ uint8_t real_mac[16]; /* The actual MAC */ crypto_poly1305(real_mac, msg, 5, key); /* Wipe the key */ crypto_wipe(key, 32); if (crypto_verify16(mac, real_mac)) { /* Corrupted message, abort processing */ } else { /* Genuine message */ } /* The real mac is secret. Wipe it */ crypto_wipe(real_mac, 16); Incremental authentication: const uint8_t msg[500]= {1}; /* Message to authenticate */ uint8_t key[ 32]; /* Random secret key (use only once) */ uint8_t mac[ 16]; /* Message authentication code (MAC) */ crypto_poly1305_ctx ctx; arc4random_buf(key, 32); crypto_poly1305_init(&ctx, key); /* Wipe the key */ crypto_wipe(key, 32); for (int i = 0; i < 500; i += 100) { crypto_poly1305_update(&ctx, msg, 100); } crypto_poly1305_final(&ctx, mac); SEE ALSOcrypto_blake2b(3monocypher), crypto_aead_lock(3monocypher), crypto_verify16(3monocypher), intro(3monocypher) STANDARDSThese functions implement Poly1305, described in RFC 8439. HISTORYThe CAVEATSMonocypher does not perform any input validation. Any deviation from the specified input and output length ranges results in undefined behaviour. Make sure your inputs are correct. SECURITY CONSIDERATIONSPoly1305 is difficult to use correctly. Do not use it unless you are absolutely sure what you are doing. Use authenticated encryption instead; see crypto_aead_lock(3monocypher). If you are certain you do not want encryption, refer to crypto_blake2b(3monocypher) on how to use BLAKE2b to generate message authentication codes. Authentication key requirementsPoly1305 is a one-time authenticator. This puts rather stringent constraints on the authentication key:
The only practical source for the authentication key is a chunk of the encryption stream used to encrypt the message. That chunk must be dedicated to the authentication key: if it is reused to encrypt the message itself, the attacker may recover that chunk by guessing the message then forge arbitrary messages. To get this right, you need a session key, a unique nonce, and a stream cipher. Generate a stream with the session key and nonce. Take the first 32 bytes of that stream as your authentication key, then use the rest of the stream to encrypt your message. This is the approach used by crypto_aead_lock(3monocypher). Protection against side channelsUse crypto_verify16(3monocypher) to compare message authentication codes. Avoid standard buffer comparison functions: they may not run in constant time, enabling an attacker to exploit timing attacks to recover the MAC. The authentication key should be wiped with crypto_wipe(3monocypher) after use. The incremental interface automatically wipes its context when finished, so users do not need to do it themselves.
|