Documentation ¶
Overview ¶
Package memkms implements crypto.Signer and crypto.Decrypter for keys stored in memory.
Index ¶
- type Decrypter
- func (d *Decrypter) Algorithm() cryptokms.Algorithm
- func (d *Decrypter) CreatedAt() time.Time
- func (d *Decrypter) Decrypt(_ io.Reader, ciphertext []byte, opts crypto.DecrypterOpts) ([]byte, error)
- func (d *Decrypter) DecryptContext(ctx context.Context, _ io.Reader, ciphertext []byte, opts crypto.DecrypterOpts) ([]byte, error)
- func (d *Decrypter) HashFunc() crypto.Hash
- func (d *Decrypter) Public() crypto.PublicKey
- func (d *Decrypter) WithContext(ctx context.Context) *Decrypter
- type Signer
- func (s *Signer) Algorithm() cryptokms.Algorithm
- func (s *Signer) CreatedAt() time.Time
- func (s *Signer) HashFunc() crypto.Hash
- func (s *Signer) Public() crypto.PublicKey
- func (s *Signer) Sign(_ io.Reader, digest []byte, opts crypto.SignerOpts) ([]byte, error)
- func (s *Signer) SignContext(ctx context.Context, _ io.Reader, digest []byte, opts crypto.SignerOpts) ([]byte, error)
- func (s *Signer) WithContext(ctx context.Context) *Signer
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type Decrypter ¶
type Decrypter struct {
// contains filtered or unexported fields
}
Decrypter.
Example ¶
package main import ( "context" "crypto/rand" "crypto/rsa" "fmt" "github.com/tprasadtp/cryptokms/memkms" ) const Key = ` -----BEGIN PRIVATE KEY----- MIIJQgIBADANBgkqhkiG9w0BAQEFAASCCSwwggkoAgEAAoICAQC8TMuzKdyr3rqn Qf/bW0VJknSmjxLG7Hrmq3RSX2ROAKKRDm5Y4Rk0fOlY3ZWFP7U3SMgut3OIm16L n/iij2+fSyy9rxs0t3pNUtmnBfOk1bqggqSXtR7gXaQrJXcrdawaI+cRxV4sx5bx ESKH0htaKFPqVd9Y8gkrZBXE/tTrpnOrJ6skiEUGVr8r/RIrDqki3sA1yCES0l0F NUyQWHbIA3SdJs9spmEntPUVSPR5ePgGYBCFjh5QZgVqTC8L+xXt8DL/5Aj7Dq9S Yhhzbs3jAROkKFZYmrUtN7gzt6ZcqCMRhhCs1rDTUhQx+j8qq4GPIpauJw2N1CUx HUj77r76FYHQJgdhR/zvt7LVGPhxDIarxc3hq0d6SYFxJ3vQuDxDJ8DyeUey2Fpc IXVZJHSpxNxFoOerLHIEfXMRXWf1y1/p270l0lcCJI5o9RUYvPcxpAcLpUHzN0Wu zdJgp2FM07sTCYTP7vhqj6npqWTpkmkdzdgj55UWxa37W4l3ivVp14sG+BlB+xan 7TznZfUvcomOwr0tNgnIA7VRNCdGLLNSGisNsvi2787wcTrX32DO6e5EC/5ASyHG y5qlcAaJ+b2lII/QekGgrdqPeRyN3Ds9UoNfx/MEM77eEMLzcI28caPcI2dm7ebu BGYB/FR6h/+4Kb9YAyAxdP6gTJvzAwIDAQABAoICACp4r+FjadCiVjtvmYQinAgy Lnl6/+M6Z6YrufryZS9q2UAany0Q6Jx8KC3RHO6HJhqoIe7XlgmT8clQdcZE0Ap/ 7EGEg4Bqef2C2HDh2MivJH8buIA3bBVzSZopwy1cR0tGGdJaUBmNkzAgi0dTTrQR MIxEfjITtZnB418hk2jrjF9ofSOqUNdTLZ+AX16y2ddxoqz+zObv5+dK1FAig/gt P1pK7LI2/Ob12+nHIM1dSaQ2esOFALVlrYcCVAJByfp3GSm6h4QJFeZhFd7DeVDg Z0u5hXBKxN7EGJohrDZt/irvsEcrzYp8ku2K4kB/mqNsS8xQJrB8zz66ukGI4i4m /9WsOJSNm8iHjEFuwgaAlpNibrZgNG3H7yezYTArwVOzyIzpT/KcaWxUd+yLKeNm zNCNL5ShvYBif+AxCUSTOZOL4OsyK1aGBapsKdjEoViZfMSfgEbvPhT95KXcGzTz ybJCe29+n0VHShJDrKFgYEk9qBFfjj6dTUnezDI/Uq5QjXTo8Lx06dl1B2qnsKtd KhUGqAQ6p9a04h5ZB0b/rjvRT3mDj+ObbOvnXcJAQmoju8aMuzNFz7u3W0OVtvq2 mNxWhIa7ThvtCWdbORb0OhRUm8yjC/shLIjpbykWjZUmqEUiGNfEuPIq9Z/bxQl0 oNH7iP146VkdAkTODOohAoIBAQDO6d/5bdFLUFAA/572s+P7zdl+3ETs66uIwtiM KHqJjG/Tsy9HzPMwnIj85scgQogNMrcquDt7GEvPXCv9u40ai9yNtWZxfsTxcfmO q+2I1ro3tDjwqCFSPE18w0L/qPTYlq4ukp6Q3lLb0WH4sySzOcgP3Ak8ndxJPZ44 l4hICZzo6j+vMPFZkob4ZaGfHNjcxEzcsBavA90QOtspP5YfL9iSCUdxbF8xSrf+ PvRV66dYU3KQgDq0jk4iQWdk1sEpIw0qwLA40IS8BHtaYJfFG9aXxihlPaLYoQnk IfagOFgS2Gnw5jSZXp7C0+noqo4z8Uc/9IVqh9qreB/t3XrZAoIBAQDo+H5kQbXX d/lC3HtATqSkbcx5r1aWncpzoIDNU1gsyl3bIfGTAGm//JLb4npFeoM+FW0s/uD3 c/Bx9KDYtBrjXFWIJIMXcLKp8kZKCebSjZ7BinKeWTcB8NGTHhVLbez4kVw6RYd5 NY+spxOXovYA/wX5iYrulU64xxvGiHt6q45AwXM/zdzqa86t0gxCt7oQiFzeK6gp x6bpfRtYA0rufgujKSwjqsSnZ5Zp4V0cjFqwpAbZSvecsHhvUKu4ozihKLEeAeG9 QOh9QrooWwKSRd9+61S1Tm/ZRO6jJ4rLcCvfp0EcVmwuWbUxknX8yburZ8sRBNJa 9k7ZZlPAods7AoIBAEaR3aHkoo1dRuwQQtdBY3BuNM/fsGJdvpNWYSTsaV6gV0OM yYNjk03xFYer7h5CksRtl6sqSp8hGjoO5bIUVXvIV+C9DcOHyQPQK51NZiZVlg2J miH6NeMmTgdPUXqA1YFJYv7fYtVl/jyanR+Fee7mtiUylrPl40vXiC8k/4YSQUHv IulNeANkxkPR5d2uqQgiq1RZemMWnj760+StmzXny6WDJKq6m3zkTvyX3B2x0dF+ JITEN0F9h4iHZgwucpLlMYhzT6cQ9zRpEukwKJNBe18oZn6hFvlrc0QrkUHz9ZX3 2aof2bC1ZNBuFkkUYou0ruhRLW+4BgyVW850y4ECggEAJSpXR3kwIDKUgjUYOHcT TuPxRcxR/O8pN+73/Ul5fJPAC1BL8I6VUDpj1043AVR9EW9rnkz+6JsHVbaX3lpF G9ZEEtb4Tsn8xp3O1srjlt1e4TNL+7Tx0I5xcI3RCdp8fl76HpWu+ggwZnO07XDi 29/TPS7TCiKpj1K8PJzTTguGQxBZaWlW/9K5AwPKTu5ucWq/nfXK+vdNylvZ+91y m79h7eKIlxwMCUS+Ox/nscE2So2wRgPuooGIhQGSk37+br9GGipkr8NmE22Msxlp vJoHAIFcXxwnPbsAcujA/JlldmWBPpsO4QoQnNrnla89ECgbvhhN0pMOmyH25Hkt twKCAQEAtcISLSX1XzCGUKBYcCreompIvm4t1F3f4/cftznCr5DyvvYjkCW3MTgT eNuTTIez7vdY2eNWq7Zdd2x1E7FNuk+aPL3wTSqXtqzIEa6gq6PRqyIQKVcX8ReR vFgDQrInNL6kwhj+lthnTGc+FBUmd5Mds3KeFNZ6jKoegc6HntZYEnrH9okhH262 jXriAOwvJRqLKS40uQAlW6Nz3DtHhxX6KYV5/BOfNwACgOdq9SEHqml6yQIaohVX sd5L5kcvP91wPIYVDTGKeJqDYbW8lTuoszLq+iWEWFptLJt2gjY7HM8kXufiWhRL +8CUjAuwrbsmTxncKFn5uS1gaieOBQ== -----END PRIVATE KEY----- ` func main() { ctx := context.Background() // Create a new Decrypter decrypter, err := memkms.NewDecrypter(Key) if err != nil { // TODO: Handle error panic(err) } // Message you want to encrypt // A nod to https://en.wikipedia.org/wiki/Stellar_classification. msg := []byte(`Oh Be A Fine Girl Kiss Me`) // Encrypt the message using public key. encrypted, err := rsa.EncryptOAEP( decrypter.HashFunc().New(), rand.Reader, decrypter.Public().(*rsa.PublicKey), msg, nil, ) if err != nil { // TODO: Handle error panic(err) } // Decrypt the message plaintext, err := decrypter.DecryptContext(ctx, nil, encrypted, nil) if err != nil { // TODO: Handle error panic(err) } fmt.Printf("Plaintext: %s", string(plaintext)) }
Output: Plaintext: Oh Be A Fine Girl Kiss Me
func NewDecrypter ¶
NewDecrypter returns returns a new Decrypter based on key from given input. Input key MUST be PEM encoded (optionally base64 encoded PEM).
func (*Decrypter) Decrypt ¶
func (d *Decrypter) Decrypt(_ io.Reader, ciphertext []byte, opts crypto.DecrypterOpts) ([]byte, error)
Sign is a wrapper around SignContext.
func (*Decrypter) DecryptContext ¶
func (d *Decrypter) DecryptContext(ctx context.Context, _ io.Reader, ciphertext []byte, opts crypto.DecrypterOpts) ([]byte, error)
DecryptContext decrypts the message with asymmetric key. The rand parameter is ignored, and it can be nil.
type Signer ¶
type Signer struct {
// contains filtered or unexported fields
}
Signer.
Example ¶
package main import ( "context" "encoding/hex" "fmt" "github.com/tprasadtp/cryptokms" "github.com/tprasadtp/cryptokms/memkms" ) const Key = ` -----BEGIN PRIVATE KEY----- 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 +8CUjAuwrbsmTxncKFn5uS1gaieOBQ== -----END PRIVATE KEY----- ` func main() { ctx := context.Background() // Create a new Signer. signer, err := memkms.NewSigner(Key) if err != nil { // TODO: Handle error panic(err) } // Message you want to sign // A nod to https://en.wikipedia.org/wiki/Stellar_classification. msg := []byte(`Oh Be A Fine Girl Kiss Me`) // hash the message you want to sign. // with defined hash function. h := signer.HashFunc().New() h.Write(msg) digest := h.Sum(nil) // Sign the digest signature, err := signer.SignContext(ctx, nil, digest, nil) if err != nil { // TODO: Handle error panic(err) } // Verify the signature err = cryptokms.VerifyDigestSignature(signer.Public(), signer.HashFunc(), digest, signature) if err != nil { // TODO: Handle error panic(err) } fmt.Printf("Digest : %s\n", hex.EncodeToString(digest)) fmt.Printf("Signature: Verified\n") }
Output: Digest : 381d492615cee4337ef441d9fb2e3682c0306fb99b82ff966af4cc5dc8db61b7 Signature: Verified
func NewSigner ¶
NewSigner returns a new signer based on key from given input. Input key MUST be PEM encoded (optionally base64 encoded PEM).
func (*Signer) SignContext ¶
func (s *Signer) SignContext(ctx context.Context, _ io.Reader, digest []byte, opts crypto.SignerOpts) ([]byte, error)
SignContext signs the given digest with asymmetric key. The random parameter is ignored, and thus it can be as nil and is always set to crypto/rand.Reader.