---
name: open_aead
kind: function
lang: go
domain: cybersecurity
version: "1.0.0"
purity: impure
signature: "func OpenAEAD(key, nonce, ciphertext, aad []byte) ([]byte, error)"
description: "Descifra y autentica un ciphertext producido por SealAEAD usando ChaCha20-Poly1305. Devuelve error explícito si la autenticación falla (ciphertext alterado, clave incorrecta o AAD distinto)."
tags: [messaging, e2e-crypto, crypto, aead, chacha20poly1305, symmetric, e2e-messaging]
uses_functions: []
uses_types: []
returns: []
returns_optional: false
error_type: "error_go_core"
imports:
  - golang.org/x/crypto/chacha20poly1305
params:
  - name: key
    desc: "Clave simétrica de exactamente 32 bytes. Debe ser la misma usada en SealAEAD."
  - name: nonce
    desc: "Nonce de 12 bytes devuelto por SealAEAD. Debe transmitirse junto al ciphertext."
  - name: ciphertext
    desc: "Ciphertext producido por SealAEAD (incluye los 16 bytes del tag Poly1305)."
  - name: aad
    desc: "Datos autenticados adicionales. Debe ser idéntico al aad usado en SealAEAD, o nil si se pasó nil."
output: "Plaintext descifrado, o error si la autenticación falla o la clave tiene longitud incorrecta."
tested: true
tests:
  - "round-trip con aad"
  - "round-trip sin aad (nil)"
  - "error con clave de longitud incorrecta"
  - "error de autenticacion con ciphertext modificado"
  - "error de autenticacion con aad distinto"
  - "nonces distintos en llamadas sucesivas"
test_file_path: "functions/cybersecurity/e2e_messaging_crypto_test.go"
file_path: "functions/cybersecurity/open_aead.go"
---

## Ejemplo

```go
// nonce y ct vienen de SealAEAD; aad debe reconstruirse igual
aad := []byte("room:sala-general:seq:42")
plaintext, err := cybersecurity.OpenAEAD(key, nonce, ct, aad)
if err != nil {
    // mensaje alterado, clave incorrecta o aad distinto — descartar
    log.Printf("autenticación fallida: %v", err)
    return
}
fmt.Printf("mensaje: %s\n", plaintext)
```

## Cuando usarla

Al recibir un mensaje del bus: después de resolver la room key con OpenKeyBox, llama OpenAEAD para descifrar y verificar integridad. Si devuelve error, el mensaje llegó corrupto o fue alterado en tránsito — descartar siempre, nunca procesar plaintext parcial.

## Gotchas

- El error no distingue entre "clave incorrecta", "nonce incorrecto" y "ciphertext alterado": todos devuelven el mismo error de autenticación por diseño (evita oráculos de padding).
- Si el ciphertext tiene menos de 16 bytes, la función devuelve error antes de intentar descifrar.
- El aad debe ser reconstructible por el receptor de forma independiente (no viaja en el mensaje cifrado).
