Usage Examples

April 7, 2026 ยท View on GitHub

All snippets below are aligned with the current v1 API (github.com/rekurt/gost-crypto).

1) Sign and verify

package main

import (
    "fmt"

    gostcrypto "github.com/rekurt/gost-crypto"
)

func main() {
    priv, err := gostcrypto.GenerateKey(gostcrypto.CurveTC26_256_A)
    if err != nil {
        panic(err)
    }
    defer priv.Zeroize()

    msg := []byte("hello")

    sig, err := gostcrypto.Sign(priv, msg)
    if err != nil {
        panic(err)
    }

    ok, err := gostcrypto.Verify(priv.PublicKey(), msg, sig)
    if err != nil {
        panic(err)
    }

    fmt.Println("valid:", ok)
}

2) Hashing (Streebog)

package main

import (
    "fmt"

    gostcrypto "github.com/rekurt/gost-crypto"
)

func main() {
    sum256 := gostcrypto.HashSum256([]byte("data"))
    sum512 := gostcrypto.HashSum512([]byte("data"))

    fmt.Println(len(sum256), len(sum512)) // 32 64
}

3) VKO key agreement

package main

import (
    "bytes"
    "fmt"

    gostcrypto "github.com/rekurt/gost-crypto"
)

func main() {
    a, _ := gostcrypto.GenerateKey(gostcrypto.CurveTC26_256_A)
    b, _ := gostcrypto.GenerateKey(gostcrypto.CurveTC26_256_A)
    defer a.Zeroize()
    defer b.Zeroize()

    ukm := []byte("context-ukm")

    s1, err := gostcrypto.Agree(a, b.PublicKey(), ukm)
    if err != nil {
        panic(err)
    }
    s2, err := gostcrypto.Agree(b, a.PublicKey(), ukm)
    if err != nil {
        panic(err)
    }

    fmt.Println("equal:", bytes.Equal(s1, s2))
}

4) Low-level package usage

package main

import (
    "fmt"

    "github.com/rekurt/gost-crypto/pkg/gost3410"
    "github.com/rekurt/gost-crypto/pkg/gost3411"
)

func main() {
    priv, err := gost3410.GenerateKey(gost3410.CurveTC26_512_A)
    if err != nil {
        panic(err)
    }
    defer priv.Zeroize()

    digest := gost3411.Sum512([]byte("payload"))
    sig, err := gost3410.SignDigest(priv, digest[:])
    if err != nil {
        panic(err)
    }

    ok, err := gost3410.VerifyDigest(priv.PublicKey(), digest[:], sig)
    if err != nil {
        panic(err)
    }

    fmt.Println(ok)
}

5) Kuznechik + MGM authenticated encryption

package main

import (
    "crypto/rand"
    "fmt"

    "github.com/rekurt/gost-crypto/pkg/gost3412"
    "github.com/rekurt/gost-crypto/pkg/gost3413"
)

func main() {
    key := make([]byte, gost3412.KuznechikKeySize)
    rand.Read(key)

    aead, err := gost3413.NewMGMFromKey(key)
    if err != nil {
        panic(err)
    }

    nonce := make([]byte, aead.NonceSize())
    rand.Read(nonce)

    ct := aead.Seal(nil, nonce, []byte("secret"), []byte("aad"))
    pt, err := aead.Open(nil, nonce, ct, []byte("aad"))
    if err != nil {
        panic(err)
    }

    fmt.Println(string(pt)) // secret
}

6) HD key derivation

package main

import (
    "fmt"

    gostcrypto "github.com/rekurt/gost-crypto"
    "github.com/rekurt/gost-crypto/pkg/hd"
)

func main() {
    seed := []byte("my secret seed phrase - at least 16 bytes")

    master, err := hd.Master(seed, gostcrypto.CurveTC26_256_A)
    if err != nil {
        panic(err)
    }
    defer master.Zeroize()

    child, err := hd.Derive(master, "m/44'/0'/0", gostcrypto.CurveTC26_256_A)
    if err != nil {
        panic(err)
    }
    defer child.Zeroize()

    sig, _ := gostcrypto.Sign(child.Key, []byte("tx"))
    fmt.Printf("sig: %x...\n", sig[:8])
}

Important note for pkg/hd

pkg/hd currently derives chain codes deterministically but does not yet construct deterministic private keys from seed material. If you need strict BIP32-like deterministic private keys today, do not rely on pkg/hd for that part yet.