Files
fn_registry/functions/cybersecurity/generate_identity.md
T
2026-06-04 23:44:39 +02:00

54 lines
2.2 KiB
Markdown

---
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.