src/pkg/crypto/crypto.go - The Go Programming Language

Golang

Source file src/pkg/crypto/crypto.go

     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{}