// Copyright 2024 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 rsa import ( "bytes" "crypto" "crypto/x509/pkix" "encoding/asn1" "testing" ) func TestHashPrefixes(t *testing.T) { prefixes := map[crypto.Hash]asn1.ObjectIdentifier{ // RFC 3370, Section 2.1 and 2.2 // // sha-1 OBJECT IDENTIFIER ::= { iso(1) identified-organization(3) // oiw(14) secsig(3) algorithm(2) 26 } // // md5 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) // rsadsi(113549) digestAlgorithm(2) 5 } crypto.MD5: {1, 2, 840, 113549, 2, 5}, crypto.SHA1: {1, 3, 14, 3, 2, 26}, // https://csrc.nist.gov/projects/computer-security-objects-register/algorithm-registration // // nistAlgorithms OBJECT IDENTIFIER ::= { joint-iso-ccitt(2) country(16) us(840) // organization(1) gov(101) csor(3) nistAlgorithm(4) } // // hashAlgs OBJECT IDENTIFIER ::= { nistAlgorithms 2 } // // id-sha256 OBJECT IDENTIFIER ::= { hashAlgs 1 } // id-sha384 OBJECT IDENTIFIER ::= { hashAlgs 2 } // id-sha512 OBJECT IDENTIFIER ::= { hashAlgs 3 } // id-sha224 OBJECT IDENTIFIER ::= { hashAlgs 4 } // id-sha512-224 OBJECT IDENTIFIER ::= { hashAlgs 5 } // id-sha512-256 OBJECT IDENTIFIER ::= { hashAlgs 6 } // id-sha3-224 OBJECT IDENTIFIER ::= { hashAlgs 7 } // id-sha3-256 OBJECT IDENTIFIER ::= { hashAlgs 8 } // id-sha3-384 OBJECT IDENTIFIER ::= { hashAlgs 9 } // id-sha3-512 OBJECT IDENTIFIER ::= { hashAlgs 10 } crypto.SHA224: {2, 16, 840, 1, 101, 3, 4, 2, 4}, crypto.SHA256: {2, 16, 840, 1, 101, 3, 4, 2, 1}, crypto.SHA384: {2, 16, 840, 1, 101, 3, 4, 2, 2}, crypto.SHA512: {2, 16, 840, 1, 101, 3, 4, 2, 3}, crypto.SHA512_224: {2, 16, 840, 1, 101, 3, 4, 2, 5}, crypto.SHA512_256: {2, 16, 840, 1, 101, 3, 4, 2, 6}, crypto.SHA3_224: {2, 16, 840, 1, 101, 3, 4, 2, 7}, crypto.SHA3_256: {2, 16, 840, 1, 101, 3, 4, 2, 8}, crypto.SHA3_384: {2, 16, 840, 1, 101, 3, 4, 2, 9}, crypto.SHA3_512: {2, 16, 840, 1, 101, 3, 4, 2, 10}, } for h, oid := range prefixes { want, err := asn1.Marshal(struct { HashAlgorithm pkix.AlgorithmIdentifier Hash []byte }{ HashAlgorithm: pkix.AlgorithmIdentifier{ Algorithm: oid, Parameters: asn1.NullRawValue, }, Hash: make([]byte, h.Size()), }) if err != nil { t.Fatal(err) } want = want[:len(want)-h.Size()] got := hashPrefixes[h.String()] if !bytes.Equal(got, want) { t.Errorf("%s: got %x, want %x", h, got, want) } } }