auth/algo/rs/option.go
shchva fd8edfb70a create: pkg algo/rs
pkg algo/rs подписывает данные с помощью ключа RSA
2025-01-10 18:35:11 +03:00

103 lines
1.9 KiB
Go

package rs
import (
"crypto/rand"
"crypto/rsa"
"crypto/x509"
"encoding/pem"
"os"
)
type Option func(*Algo) error
// WithGenerateKey генерирует RSA ключ
func WithGenerateKey(bits int) Option {
return func(a *Algo) error {
key, err := rsa.GenerateKey(rand.Reader, bits)
if err != nil {
return err
}
a.p = key
return nil
}
}
// WithKey устанавливает приватный ключ
func WithKey(key *rsa.PrivateKey) Option {
return func(a *Algo) error {
a.p = key
return nil
}
}
// WithPub устанавливает публичный ключ
func WithPub(pub *rsa.PublicKey) Option {
return func(a *Algo) error {
if a.p == nil {
a.p = &rsa.PrivateKey{}
}
a.p.PublicKey = *pub
return nil
}
}
// WithKeyPemFile загружает приватный ключ из pem-файла
func WithKeyPEMFile(file string) Option {
return func(a *Algo) error {
buf, err := os.ReadFile(file)
if err != nil {
return err
}
block, _ := pem.Decode(buf)
key, err := x509.ParsePKCS1PrivateKey(block.Bytes)
if err != nil {
return err
}
return WithKey(key)(a)
}
}
func WithPEM(pub, key []byte) Option {
return func(a *Algo) error {
if len(key) > 0 {
block, _ := pem.Decode(key)
val, err := x509.ParsePKCS1PrivateKey(block.Bytes)
if err != nil {
return err
}
return WithKey(val)(a)
}
block, _ := pem.Decode(pub)
val, err := x509.ParsePKCS1PublicKey(block.Bytes)
if err != nil {
return err
}
return WithPub(val)(a)
}
}
// WithPubFile загружает публичный ключ из pem-файла
func WithPubFile(file string) Option {
return func(a *Algo) error {
buf, err := os.ReadFile(file)
if err != nil {
return err
}
block, _ := pem.Decode(buf)
pub, err := x509.ParsePKCS1PublicKey(block.Bytes)
if err != nil {
return err
}
return WithPub(pub)(a)
}
}