120 lines
3.1 KiB
Go
120 lines
3.1 KiB
Go
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)
|
||
}
|