package acme import ( "crypto/rsa" "errors" "io" "net/mail" "strings" "github.com/square/go-jose" ) // KeySize is a default RSA key size const KeySize = 2048 // Account ... type Account struct { Contact Contacts `json:"contact"` PrivKey *rsa.PrivateKey `json:"key"` signer jose.Signer nonce chan string } // NewAccount ... func NewAccount(key *rsa.PrivateKey) (*Account, error) { return &Account{PrivKey: key}, nil } func (a *Account) AddMail(email string) error { m, err := mail.ParseAddress(email) if err != nil { return err } a.Contact = append(a.Contact, Mail(m.Address)) return nil } func (a *Account) AddPhone(phone string) error { if ph := strings.TrimSpace(phone); ph != "" { a.Contact = append(a.Contact, Phone(ph)) } return nil } // Signer describes a signing interface type Signer interface { Init(jose.NonceSource) error Sign([]byte) (io.Reader, error) } func (a *Account) Init(n jose.NonceSource) error { var err error a.signer, err = jose.NewSigner(jose.RS256, a.PrivKey) if err != nil { return err } a.signer.SetNonceSource(n) return nil } func (a *Account) Sign(msg []byte) (io.Reader, error) { if a.signer == nil { return nil, errors.New("init first") } obj, err := a.signer.Sign(msg) if err != nil { return nil, err } return strings.NewReader(obj.FullSerialize()), nil }