729921e16e
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
54 lines
2.2 KiB
Markdown
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.
|