···
10
+
"tangled.sh/tangled.sh/core/crypto"
13
+
func parseCommitObject(commitData string) (string, string, error) {
14
+
lines := strings.Split(commitData, "\n")
16
+
var payloadLines []string
17
+
var signatureLines []string
18
+
var inSignature bool
19
+
var foundSignature bool
21
+
for _, line := range lines {
22
+
if strings.HasPrefix(line, "gpgsig ") {
23
+
foundSignature = true
25
+
// remove 'gpgsig' prefix
26
+
sigLine := strings.TrimPrefix(line, "gpgsig ")
27
+
signatureLines = append(signatureLines, sigLine)
32
+
// check if this line is part of the signature (starts with space)
33
+
if strings.HasPrefix(line, " ") {
34
+
// remove the leading space and add to signature
35
+
sigLine := strings.TrimPrefix(line, " ")
36
+
signatureLines = append(signatureLines, sigLine)
39
+
// end of signature block
41
+
// this line is part of payload, so add it
42
+
payloadLines = append(payloadLines, line)
45
+
// regular payload line
46
+
payloadLines = append(payloadLines, line)
50
+
if !foundSignature {
51
+
return "", commitData, nil // no signature found, return empty signature and full data as payload
54
+
signature := strings.Join(signatureLines, "\n")
55
+
payload := strings.Join(payloadLines, "\n")
57
+
return signature, payload, nil
61
+
var pubkeyPath string
62
+
flag.StringVar(&pubkeyPath, "pubkey", "", "Path to the public key file")
67
+
if pubkeyPath != "" {
68
+
pubKey, err = os.ReadFile(pubkeyPath)
70
+
fmt.Fprintf(os.Stderr, "error reading public key file: %v\n", err)
75
+
input, err := io.ReadAll(os.Stdin)
77
+
fmt.Fprintf(os.Stderr, "error reading from stdin: %v\n", err)
81
+
commitData := string(input)
83
+
signature, payload, err := parseCommitObject(commitData)
85
+
fmt.Fprintf(os.Stderr, "error parsing commit: %v\n", err)
89
+
fmt.Println("signature")
90
+
fmt.Println(signature)
92
+
fmt.Println("payload:")
93
+
fmt.Println(payload)
95
+
err, ok := crypto.VerifySignature(pubKey, []byte(signature), []byte(payload))
97
+
fmt.Fprintf(os.Stderr, "%v\n", err)