package acme import ( "bytes" "encoding/json" "log" "net/http" jose "github.com/square/go-jose" ) type Nonce []string var nonce = Nonce([]string{}) func (n *Nonce) Parse(r *http.Response) { nonce := r.Header.Get("Replay-Nonce") *n = append(*n, nonce) } func (n Nonce) Nonce() (string, error) { last := n[len(n)-1] return last, nil } func Get(uri string, v interface{}) error { resp, err := http.Get(uri) if err != nil { return err } defer resp.Body.Close() nonce.Parse(resp) return json.NewDecoder(resp.Body).Decode(v) } func Post(uri string, v interface{}) error { body, err := json.Marshal(v) if err != nil { return err } log.Println(string(body)) return nil // premature debug abort _, err = http.Post(uri, "application/jose+json", bytes.NewReader(body)) if err != nil { return err } return nil } func Sign(acc Account, body []byte) (string, error) { signer, err := jose.NewSigner(jose.RS256, acc.PrivKey) signer.SetNonceSource(nonce) if err != nil { return "", err } obj, err := signer.Sign(body) if err != nil { return "", err } return obj.FullSerialize(), nil } func ParseSigned(body string) error { obj, err := jose.ParseSigned(body) if err != nil { return err } log.Printf("%+v\n", obj) return nil }