---
name: generate_identity
kind: function
lang: go
domain: cybersecurity
version: "1.0.0"
purity: impure
signature: "func GenerateIdentity() (Identity, error)"
description: "Genera una identidad criptográfica dual con un par Ed25519 (firma) y un par X25519 (intercambio de claves). Punto de entrada obligatorio para cualquier participante en el bus de mensajería cifrado."
tags: [messaging, e2e-crypto, crypto, identity, ed25519, x25519, keygen, e2e-messaging]
uses_functions: []
uses_types: []
returns: []
returns_optional: false
error_type: "error_go_core"
imports:
  - crypto/ed25519
  - crypto/rand
  - golang.org/x/crypto/nacl/box
params:
  - name: "(ninguno)"
    desc: "Sin parámetros. Usa crypto/rand como fuente de entropía del sistema."
output: "Identity{SignPub []byte, SignPriv []byte, KexPub []byte, KexPriv []byte} o error si falla el RNG del sistema."
tested: true
tests:
  - "genera keypairs con longitudes correctas"
  - "dos llamadas producen identidades distintas"
test_file_path: "functions/cybersecurity/e2e_messaging_crypto_test.go"
file_path: "functions/cybersecurity/generate_identity.go"
---

## Ejemplo

```go
id, err := cybersecurity.GenerateIdentity()
if err != nil {
    log.Fatal(err)
}
// id.SignPub / id.SignPriv — par Ed25519 para firmar mensajes
// id.KexPub  / id.KexPriv  — par X25519 para recibir claves de sala cifradas
fmt.Printf("identity pub(sign)=%x pub(kex)=%x\n", id.SignPub, id.KexPub)
```

## Cuando usarla

Al registrar un nuevo participante en el bus de mensajería: llama GenerateIdentity una sola vez por dispositivo/sesión, persiste los bytes de las cuatro claves de forma segura, y publica `SignPub` + `KexPub` en el directorio de participantes.

## Gotchas

- La función depende de `crypto/rand`; en entornos con entropía insuficiente (contenedores recién arrancados) puede bloquearse brevemente.
- `SignPriv` tiene 64 bytes (no 32): Ed25519 concatena seed (32) + clave pública (32) internamente. No truncar.
- `KexPub`/`KexPriv` son exactamente 32 bytes (Curve25519). Pasar exactamente esos slices a `SealKeyBox`/`OpenKeyBox`.
- Nunca reutilizar una identidad entre dispositivos distintos del mismo usuario sin un protocolo de clonado seguro.
