1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- // Copyright 2011 The Go Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style
- // license that can be found in the LICENSE file.
- package openpgp
- import "hash"
- // NewCanonicalTextHash reformats text written to it into the canonical
- // form and then applies the hash h. See RFC 4880, section 5.2.1.
- func NewCanonicalTextHash(h hash.Hash) hash.Hash {
- return &canonicalTextHash{h, 0}
- }
- type canonicalTextHash struct {
- h hash.Hash
- s int
- }
- var newline = []byte{'\r', '\n'}
- func (cth *canonicalTextHash) Write(buf []byte) (int, error) {
- start := 0
- for i, c := range buf {
- switch cth.s {
- case 0:
- if c == '\r' {
- cth.s = 1
- } else if c == '\n' {
- cth.h.Write(buf[start:i])
- cth.h.Write(newline)
- start = i + 1
- }
- case 1:
- cth.s = 0
- }
- }
- cth.h.Write(buf[start:])
- return len(buf), nil
- }
- func (cth *canonicalTextHash) Sum(in []byte) []byte {
- return cth.h.Sum(in)
- }
- func (cth *canonicalTextHash) Reset() {
- cth.h.Reset()
- cth.s = 0
- }
- func (cth *canonicalTextHash) Size() int {
- return cth.h.Size()
- }
- func (cth *canonicalTextHash) BlockSize() int {
- return cth.h.BlockSize()
- }
|