~bigbes/core-go

98806e712f5ea30970becdf66a91e42f8f33f5b2 — наб 5 years ago 9d6ae2e
Add crypto module with depessimised webhook signing from gitsrht-update-hook
3 files changed, 62 insertions(+), 1 deletions(-)

A crypto/webhook.go
M go.mod
M go.sum
A crypto/webhook.go => crypto/webhook.go +51 -0
@@ 0,0 1,51 @@
package crypto

import (
	"crypto/rand"
	"encoding/base64"
	"encoding/hex"
	"log"

	"github.com/vaughan0/go-ini"
	"golang.org/x/crypto/ed25519"
)

var (
	webhookKey ed25519.PrivateKey
)

func initWebhookKey(logger *log.Logger, config ini.File) {
	if webhookKey != nil {
		return
	}

	b64key, ok := config.Get("webhooks", "private-key")
	if !ok {
		logger.Fatalf("No webhook key configured")
	}
	seed, err := base64.StdEncoding.DecodeString(b64key)
	if err != nil {
		logger.Fatalf("base64 decode webhooks private key: %v", err)
	}
	webhookKey = ed25519.NewKeyFromSeed(seed)
}

func SignWebhookPayload(payload []byte, logger *log.Logger, config ini.File) (string, string) {
	var (
		nonceSeed [8]byte
		nonceHex  [16]byte
	)

	_, err := rand.Read(nonceSeed[:])
	if err != nil {
		logger.Fatalf("generate nonce: %v", err)
	}
	hex.Encode(nonceHex[:], nonceSeed[:])
	nonce := string(nonceHex[:])

	initWebhookKey(logger, config)
	signature := base64.StdEncoding.EncodeToString(
		ed25519.Sign(webhookKey, append(payload, nonceHex[:]...)))

	return nonce, signature
}

M go.mod => go.mod +2 -0
@@ 3,4 3,6 @@ module git.sr.ht/~sircmpwn/core-go
go 1.13

require (
	github.com/vaughan0/go-ini v0.0.0-20130923145212-a98ad7ee00ec
	golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de
)

M go.sum => go.sum +9 -1
@@ 1,1 1,9 @@

github.com/vaughan0/go-ini v0.0.0-20130923145212-a98ad7ee00ec h1:DGmKwyZwEB8dI7tbLt/I/gQuP559o/0FrAkHKlQM/Ks=
github.com/vaughan0/go-ini v0.0.0-20130923145212-a98ad7ee00ec/go.mod h1:owBmyHYMLkxyrugmfwE/DLJyW8Ro9mkphwuVErQ0iUw=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de h1:ikNHVSjEfnvz6sxdSPCaPt572qowuyMDMJLLm3Db3ig=
golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=