1 // Copyright 2011 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // Package crypto collects common cryptographic constants. 6 package crypto 7 8 import ( 9 "hash" 10 ) 11 12 // Hash identifies a cryptographic hash function that is implemented in another 13 // package. 14 type Hash uint 15 16 const ( 17 MD4 Hash = 1 + iota // import code.google.com/p/go.crypto/md4 18 MD5 // import crypto/md5 19 SHA1 // import crypto/sha1 20 SHA224 // import crypto/sha256 21 SHA256 // import crypto/sha256 22 SHA384 // import crypto/sha512 23 SHA512 // import crypto/sha512 24 MD5SHA1 // no implementation; MD5+SHA1 used for TLS RSA 25 RIPEMD160 // import code.google.com/p/go.crypto/ripemd160 26 maxHash 27 ) 28 29 var digestSizes = []uint8{ 30 MD4: 16, 31 MD5: 16, 32 SHA1: 20, 33 SHA224: 28, 34 SHA256: 32, 35 SHA384: 48, 36 SHA512: 64, 37 MD5SHA1: 36, 38 RIPEMD160: 20, 39 } 40 41 // Size returns the length, in bytes, of a digest resulting from the given hash 42 // function. It doesn't require that the hash function in question be linked 43 // into the program. 44 func (h Hash) Size() int { 45 if h > 0 && h < maxHash { 46 return int(digestSizes[h]) 47 } 48 panic("crypto: Size of unknown hash function") 49 } 50 51 var hashes = make([]func() hash.Hash, maxHash) 52 53 // New returns a new hash.Hash calculating the given hash function. New panics 54 // if the hash function is not linked into the binary. 55 func (h Hash) New() hash.Hash { 56 if h > 0 && h < maxHash { 57 f := hashes[h] 58 if f != nil { 59 return f() 60 } 61 } 62 panic("crypto: requested hash function is unavailable") 63 } 64 65 // Available reports whether the given hash function is linked into the binary. 66 func (h Hash) Available() bool { 67 return h < maxHash && hashes[h] != nil 68 } 69 70 // RegisterHash registers a function that returns a new instance of the given 71 // hash function. This is intended to be called from the init function in 72 // packages that implement hash functions. 73 func RegisterHash(h Hash, f func() hash.Hash) { 74 if h >= maxHash { 75 panic("crypto: RegisterHash of unknown hash function") 76 } 77 hashes[h] = f 78 } 79 80 // PrivateKey represents a private key using an unspecified algorithm. 81 type PrivateKey interface{}