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 }