experiments

All kinds of coding experiments
Log | Files | Refs | Submodules

gosign.go (1087B)


      1 package main
      2 
      3 import (
      4 	"fmt"
      5 	"os"
      6 
      7 	"golang.org/x/crypto/ssh"
      8 )
      9 
     10 func main() {
     11 	if len(os.Args) < 2 {
     12 		fmt.Println("no ssh private key given")
     13 		os.Exit(1)
     14 	}
     15 	if len(os.Args) < 3 {
     16 		fmt.Println("no file given")
     17 		os.Exit(1)
     18 	}
     19 	if len(os.Args) < 4 {
     20 		fmt.Println("no ssh public key given")
     21 		os.Exit(1)
     22 	}
     23 
     24 	// private key and sign
     25 	privKey, err := os.ReadFile(os.Args[1])
     26 	if err != nil {
     27 		panic(fmt.Sprintln("1", err))
     28 	}
     29 	sshPriv, err := ssh.ParsePrivateKey(privKey)
     30 	if err != nil {
     31 		panic(fmt.Sprintln("2", err))
     32 	}
     33 	contents, err := os.ReadFile(os.Args[2])
     34 	if err != nil {
     35 		panic(fmt.Sprintln("3", err))
     36 	}
     37 	sig, err := sshPriv.Sign(nil, contents)
     38 	if err != nil {
     39 		panic(fmt.Sprintln("4", err))
     40 	}
     41 
     42 	// fmt.Printf("%v %x %x\n", sig.Format, sig.Blob, sig.Rest)
     43 
     44 	// load public key and verify
     45 	pubKey, err := os.ReadFile(os.Args[3])
     46 	if err != nil {
     47 		panic(fmt.Sprintln("5", err))
     48 	}
     49 	sshPub, err := ssh.ParsePublicKey(pubKey)
     50 	if err != nil {
     51 		panic(fmt.Sprintln("6", err))
     52 	}
     53 	err = sshPub.Verify(contents, sig)
     54 	if err != nil {
     55 		panic(fmt.Sprintln("7", err))
     56 	}
     57 }