ag_tools/cmd/rsa/verify.go

120 lines
3.1 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package rsa
import (
"fmt"
"io"
"os"
"archgrid.xyz/ag/tools/types"
"archgrid.xyz/ag/toolsbox/encryption/rsa"
"archgrid.xyz/ag/toolsbox/serialize/base64"
"archgrid.xyz/ag/toolsbox/serialize/hex"
"github.com/spf13/cobra"
)
var (
rsaVerifyFile bool
rsaVerifyInputFile string
rsaVerifyEncoding types.ResultEncoding = types.ResultInHex
)
var rsaVerifyCmd = &cobra.Command{
Use: "verify",
Short: `使用RSA算法对给定的内容进行验证`,
Long: `使用RSA算法对给定的内容进行验证生成RSA密钥。如果指定了输入文件则从输入文件中读取内容进行验证否则从命令行读取内容进行验证。`,
Args: cobra.MaximumNArgs(2),
Run: rsaVerifyExecute,
}
func rsaVerifyExecute(cmd *cobra.Command, args []string) {
var (
content []byte
cert []byte
keys *rsa.KeyPair
err error
)
if len(publicKeyFile) > 0 {
file, err := os.Open(publicKeyFile)
if err != nil {
fmt.Printf("无法打开RSA公钥文件%s\n", err)
return
}
cert, err = io.ReadAll(file)
if err != nil {
fmt.Printf("无法读取RSA公钥文件%s\n", err)
return
}
} else if len(privateKeyFile) > 0 {
file, err := os.Open(privateKeyFile)
if err != nil {
fmt.Printf("无法打开RSA私钥文件%s\n", err)
return
}
cert, err = io.ReadAll(file)
if err != nil {
fmt.Printf("无法读取RSA私钥文件%s\n", err)
return
}
} else {
fmt.Println("必须提供RSA密钥文件才能够验证。")
return
}
keys, err = rsa.NewFromPEM(cert)
if err != nil {
fmt.Printf("无法解析RSA密钥%s\n", err)
return
}
if rsaVerifyFile {
if len(rsaVerifyInputFile) == 0 {
fmt.Println("必须指定输入文件名。")
return
}
file, err := os.Open(rsaVerifyInputFile)
if err != nil {
fmt.Printf("无法打开输入文件:%s\n", err)
return
}
content, err = io.ReadAll(file)
if err != nil {
fmt.Printf("无法读取输入文件:%s\n", err)
return
}
} else {
if len(args) < 1 {
fmt.Println("必须指定待验证内容。")
return
}
content = []byte(args[0])
}
var signature []byte
switch rsaVerifyEncoding {
case types.ResultInHex:
signature, err = hex.FromHex(args[len(args)-1])
if err != nil {
fmt.Printf("无法解析签名内容:%s\n", err)
return
}
case types.ResultInBase64:
signature, err = base64.FromBase64(args[len(args)-1])
if err != nil {
fmt.Printf("无法解析签名内容:%s\n", err)
return
}
default:
fmt.Println("不支持的签名内容编码方式。")
return
}
if err = keys.Verify(content, signature); err != nil {
fmt.Printf("验证失败,%s\n", err)
} else {
fmt.Println("验证成功。")
}
}
func init() {
rsaVerifyCmd.Flags().BoolVarP(&rsaVerifyFile, "file", "f", false, "指定从文件中读入待验证内容")
rsaVerifyCmd.Flags().StringVarP(&rsaVerifyInputFile, "input", "i", "", "指定读入内容的文件名")
rsaVerifyCmd.Flags().VarP(&rsaVerifyEncoding, "encoding", "e", "指定签名内容的编码方式可选值为hex和base64默认为hex")
rsaCmd.AddCommand(rsaVerifyCmd)
}