memkms

package
v0.0.0-...-94a1697 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 4, 2024 License: MIT Imports: 12 Imported by: 0

Documentation

Overview

Package memkms implements crypto.Signer and crypto.Decrypter for keys stored in memory.

Index

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-----
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
+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

func NewDecrypter[T string | []byte](key T) (*Decrypter, error)

NewDecrypter returns returns a new Decrypter based on key from given input. Input key MUST be PEM encoded (optionally base64 encoded PEM).

func (*Decrypter) Algorithm

func (d *Decrypter) Algorithm() cryptokms.Algorithm

Algorithm returns key algorithm.

func (*Decrypter) CreatedAt

func (d *Decrypter) CreatedAt() time.Time

CreatedAt returns time at which the key file was last modified.

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.

func (*Decrypter) HashFunc

func (d *Decrypter) HashFunc() crypto.Hash

HashFunc returns the hash algorithm used for computing the digest.

func (*Decrypter) Public

func (d *Decrypter) Public() crypto.PublicKey

Public returns the public key for the Decrypter.

func (*Decrypter) WithContext

func (d *Decrypter) WithContext(ctx context.Context) *Decrypter

WithContext adds the given context to the signer.

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

func NewSigner[T string | []byte](key T) (*Signer, error)

NewSigner returns a new signer based on key from given input. Input key MUST be PEM encoded (optionally base64 encoded PEM).

func (*Signer) Algorithm

func (s *Signer) Algorithm() cryptokms.Algorithm

Algorithm returns key algorithm.

func (*Signer) CreatedAt

func (s *Signer) CreatedAt() time.Time

CreatedAt returns time at which the key file was last modified.

func (*Signer) HashFunc

func (s *Signer) HashFunc() crypto.Hash

HashFunc returns the hash algorithm used for computing the digest.

func (*Signer) Public

func (s *Signer) Public() crypto.PublicKey

Public returns the public key for the Signer.

func (*Signer) Sign

func (s *Signer) Sign(_ io.Reader, digest []byte, opts crypto.SignerOpts) ([]byte, error)

Sign is a wrapper around SignContext.

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.

func (*Signer) WithContext

func (s *Signer) WithContext(ctx context.Context) *Signer

WithContext adds the given context to the signer.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL