1
0
mirror of https://github.com/golang/go synced 2024-11-21 19:54:41 -07:00

crypto/openpgp: minor updates to subpackages

Now that packet/ is checked in, we can add its Makefile. Also, a couple
of updates to error/ and s2k/ for bugfixes and to use the new crypto
package.

R=bradfitzgo
CC=golang-dev
https://golang.org/cl/4179043
This commit is contained in:
Adam Langley 2011-02-11 08:34:19 -05:00
parent 047b023119
commit 4ee90b764e
3 changed files with 82 additions and 28 deletions

View File

@ -5,6 +5,10 @@
// This package contains common error types for the OpenPGP packages. // This package contains common error types for the OpenPGP packages.
package error package error
import (
"strconv"
)
// A StructuralError is returned when OpenPGP data is found to be syntactically // A StructuralError is returned when OpenPGP data is found to be syntactically
// invalid. // invalid.
type StructuralError string type StructuralError string
@ -44,3 +48,17 @@ func (ki keyIncorrect) String() string {
} }
var KeyIncorrectError = keyIncorrect(0) var KeyIncorrectError = keyIncorrect(0)
type unknownIssuer int
func (unknownIssuer) String() string {
return "signature make by unknown entity"
}
var UnknownIssuerError = unknownIssuer(0)
type UnknownPacketTypeError uint8
func (upte UnknownPacketTypeError) String() string {
return "unknown OpenPGP packet type: " + strconv.Itoa(int(upte))
}

View File

@ -0,0 +1,22 @@
# 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.
include ../../../../Make.inc
TARG=crypto/openpgp/packet
GOFILES=\
compressed.go\
encrypted_key.go\
literal.go\
one_pass_signature.go\
packet.go\
private_key.go\
public_key.go\
reader.go\
signature.go\
symmetrically_encrypted.go\
symmetric_key_encrypted.go\
userid.go\
include ../../../../Make.pkg

View File

@ -7,15 +7,12 @@
package s2k package s2k
import ( import (
"crypto/md5" "crypto"
"crypto/openpgp/error" "crypto/openpgp/error"
"crypto/ripemd160"
"crypto/sha1"
"crypto/sha256"
"crypto/sha512"
"hash" "hash"
"io" "io"
"os" "os"
"strconv"
) )
// Simple writes to out the result of computing the Simple S2K function (RFC // Simple writes to out the result of computing the Simple S2K function (RFC
@ -87,9 +84,13 @@ func Parse(r io.Reader) (f func(out, in []byte), err os.Error) {
return return
} }
h := hashFuncFromType(buf[1]) hash, ok := HashIdToHash(buf[1])
if !ok {
return nil, error.UnsupportedError("hash for S2K function: " + strconv.Itoa(int(buf[1])))
}
h := hash.New()
if h == nil { if h == nil {
return nil, error.UnsupportedError("hash for S2K function") return nil, error.UnsupportedError("hash not availible: " + strconv.Itoa(int(hash)))
} }
switch buf[0] { switch buf[0] {
@ -122,25 +123,38 @@ func Parse(r io.Reader) (f func(out, in []byte), err os.Error) {
return nil, error.UnsupportedError("S2K function") return nil, error.UnsupportedError("S2K function")
} }
// hashFuncFromType returns a hash.Hash which corresponds to the given hash // hashToHashIdMapping contains pairs relating OpenPGP's hash identifier with
// type byte. See RFC 4880, section 9.4. // Go's crypto.Hash type. See RFC 4880, section 9.4.
func hashFuncFromType(hashType byte) hash.Hash { var hashToHashIdMapping = []struct {
switch hashType { id byte
case 1: hash crypto.Hash
return md5.New() }{
case 2: {1, crypto.MD5},
return sha1.New() {2, crypto.SHA1},
case 3: {3, crypto.RIPEMD160},
return ripemd160.New() {8, crypto.SHA256},
case 8: {9, crypto.SHA384},
return sha256.New() {10, crypto.SHA512},
case 9: {11, crypto.SHA224},
return sha512.New384() }
case 10:
return sha512.New() // HashIdToHash returns a crypto.Hash which corresponds to the given OpenPGP
case 11: // hash id.
return sha256.New224() func HashIdToHash(id byte) (h crypto.Hash, ok bool) {
} for _, m := range hashToHashIdMapping {
if m.id == id {
return nil return m.hash, true
}
}
return 0, false
}
// HashIdToHash returns an OpenPGP hash id which corresponds the given Hash.
func HashToHashId(h crypto.Hash) (id byte, ok bool) {
for _, m := range hashToHashIdMapping {
if m.hash == h {
return m.id, true
}
}
return 0, false
} }