// Package b64file implements signify file format package b64file import ( "bufio" "encoding" "encoding/base64" "errors" "fmt" "io" "io/ioutil" "strings" ) const untrusted = "untrusted comment: " // Original Error: "invalid comment in %s; must start with 'untrusted comment: '" var ErrUntrusted = errors.New("comment must start with 'untrusted comment: '") func Decode(r io.Reader, u encoding.BinaryUnmarshaler) (string, []byte, error) { buf := bufio.NewReader(r) comment, err := buf.ReadString('\n') if err != nil { return "", nil, err } if !strings.HasPrefix(comment, untrusted) { return "", nil, ErrUntrusted } comment = strings.TrimSpace(comment[len(untrusted):]) raw, err := buf.ReadString('\n') if err != nil { return "", nil, err } b, err := base64.StdEncoding.DecodeString(raw) if err != nil { return "", nil, err } if err := u.UnmarshalBinary(b); err != nil { return "", nil, err } message, err := ioutil.ReadAll(buf) if err != nil { return "", nil, err } return comment, message, nil } func Encode(w io.Writer, u encoding.BinaryMarshaler, comment string, msg []byte) error { raw, err := u.MarshalBinary() if err != nil { return err } fmt.Fprintf(w, "%s%s\n", untrusted, comment) fmt.Fprintf(w, "%s\n", base64.StdEncoding.EncodeToString(raw)) w.Write(msg) return nil }