utils.crypto.go

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
package main

import (
	"crypto"
	"crypto/rand"
	"crypto/rsa"
	"crypto/sha256"
	"crypto/x509"
	"encoding/base64"
	"encoding/pem"
	"fmt"
	"os"
	"strings"
)

type PublicKeyMeta struct {
	ID        string `json:"id"`
	Owner     string `json:"owner"`
	PublicKey string `json:"publicKeyPem"`
}

func (u *User) getPrivateKey() (*rsa.PrivateKey, error) {
	key, err := os.ReadFile("./keys/" + strings.TrimPrefix(u.UserName, "@") + ".key")
	if err != nil {
		return nil, err
	}
	block, _ := pem.Decode(key)
	if block == nil {
		return nil, fmt.Errorf("could not decode private key")
	}
	der, err := x509.ParsePKCS8PrivateKey(block.Bytes)
	if err != nil {
		return nil, err
	}
	key1, _ := der.(*rsa.PrivateKey)
	return key1, err
}

func (u *User) SignBlob(fields string, stringToSign string) (string, error) {
	privateKey, err := u.getPrivateKey()
	if err == nil {
		hashS := sha256.Sum256([]byte(stringToSign))
		signature, err := rsa.SignPKCS1v15(rand.Reader, privateKey, crypto.SHA256, hashS[:])
		if err == nil {
			sigB64 := base64.StdEncoding.EncodeToString(signature)
			actSig := fmt.Sprintf("keyId=\"%s#main-key\",algorithm=\"rsa-sha256\",headers=\"%s\",signature=\"%s\"", u.ID, fields, sigB64)
			return actSig, nil
		}
		return "", err
	}
	return "", err
}