mirror of
https://github.com/golang/go
synced 2024-11-23 15:00:03 -07:00
cmd/internal/gc: use crypto/md5 instead of md5.go
Note: for simplicity, this CL changes the identifiers assigned to gclocals.* objects; e.g., on amd64, gclocals.ABCDEFGHIJKLMNOP is now gclocals.HGFEDCBAPONMLKJI. However, since Go requires all packages to be built with the same toolchain version anyway, this should be a non-issue. Similarly, type hashes change somewhat, but don't seem to be exposed to users in any detectable manner. Change-Id: Iadb3bce472af9b022b88d52b3c4c5e4113cda330 Reviewed-on: https://go-review.googlesource.com/6232 Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> Run-TryBot: Matthew Dempsky <mdempsky@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Keith Randall <khr@golang.org>
This commit is contained in:
parent
ed263f4dd2
commit
392434e1d0
@ -1,298 +0,0 @@
|
||||
// Copyright 2009 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 gc
|
||||
|
||||
// 64-bit MD5 (does full MD5 but returns 64 bits only).
|
||||
// Translation of ../../crypto/md5/md5*.go.
|
||||
|
||||
// Copyright 2009 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.
|
||||
|
||||
type MD5 struct {
|
||||
s [4]uint32
|
||||
x [64]uint8
|
||||
nx int
|
||||
len uint64
|
||||
}
|
||||
|
||||
const (
|
||||
_Chunk = 64
|
||||
)
|
||||
|
||||
const (
|
||||
_Init0 = 0x67452301
|
||||
_Init1 = 0xEFCDAB89
|
||||
_Init2 = 0x98BADCFE
|
||||
_Init3 = 0x10325476
|
||||
)
|
||||
|
||||
func md5reset(d *MD5) {
|
||||
d.s[0] = _Init0
|
||||
d.s[1] = _Init1
|
||||
d.s[2] = _Init2
|
||||
d.s[3] = _Init3
|
||||
d.nx = 0
|
||||
d.len = 0
|
||||
}
|
||||
|
||||
func md5write(d *MD5, p []byte, nn int) {
|
||||
d.len += uint64(nn)
|
||||
if d.nx > 0 {
|
||||
n := nn
|
||||
if n > _Chunk-d.nx {
|
||||
n = _Chunk - d.nx
|
||||
}
|
||||
for i := 0; i < n; i++ {
|
||||
d.x[d.nx+i] = uint8(p[i])
|
||||
}
|
||||
d.nx += n
|
||||
if d.nx == _Chunk {
|
||||
md5block(d, d.x[:], _Chunk)
|
||||
d.nx = 0
|
||||
}
|
||||
|
||||
p = p[n:]
|
||||
nn -= n
|
||||
}
|
||||
|
||||
n := md5block(d, p, nn)
|
||||
p = p[n:]
|
||||
nn -= n
|
||||
if nn > 0 {
|
||||
for i := 0; i < nn; i++ {
|
||||
d.x[i] = uint8(p[i])
|
||||
}
|
||||
d.nx = nn
|
||||
}
|
||||
}
|
||||
|
||||
func md5sum(d *MD5, hi *uint64) uint64 {
|
||||
// Padding. Add a 1 bit and 0 bits until 56 bytes mod 64.
|
||||
len := d.len
|
||||
|
||||
var tmp [64]uint8
|
||||
tmp[0] = 0x80
|
||||
if len%64 < 56 {
|
||||
md5write(d, tmp[:], int(56-len%64))
|
||||
} else {
|
||||
md5write(d, tmp[:], int(64+56-len%64))
|
||||
}
|
||||
|
||||
// Length in bits.
|
||||
len <<= 3
|
||||
|
||||
for i := 0; i < 8; i++ {
|
||||
tmp[i] = uint8(len >> uint(8*i))
|
||||
}
|
||||
md5write(d, tmp[:], 8)
|
||||
|
||||
if d.nx != 0 {
|
||||
Fatal("md5sum")
|
||||
}
|
||||
|
||||
if hi != nil {
|
||||
*hi = uint64(d.s[2]) | uint64(d.s[3])<<32
|
||||
}
|
||||
return uint64(d.s[0]) | uint64(d.s[1])<<32
|
||||
}
|
||||
|
||||
// MD5 block step.
|
||||
// In its own file so that a faster assembly or C version
|
||||
// can be substituted easily.
|
||||
|
||||
// table[i] = int((1<<32) * abs(sin(i+1 radians))).
|
||||
var table = [64]uint32{
|
||||
// round 1
|
||||
0xd76aa478,
|
||||
0xe8c7b756,
|
||||
0x242070db,
|
||||
0xc1bdceee,
|
||||
0xf57c0faf,
|
||||
0x4787c62a,
|
||||
0xa8304613,
|
||||
0xfd469501,
|
||||
0x698098d8,
|
||||
0x8b44f7af,
|
||||
0xffff5bb1,
|
||||
0x895cd7be,
|
||||
0x6b901122,
|
||||
0xfd987193,
|
||||
0xa679438e,
|
||||
0x49b40821,
|
||||
|
||||
// round 2
|
||||
0xf61e2562,
|
||||
0xc040b340,
|
||||
0x265e5a51,
|
||||
0xe9b6c7aa,
|
||||
0xd62f105d,
|
||||
0x2441453,
|
||||
0xd8a1e681,
|
||||
0xe7d3fbc8,
|
||||
0x21e1cde6,
|
||||
0xc33707d6,
|
||||
0xf4d50d87,
|
||||
0x455a14ed,
|
||||
0xa9e3e905,
|
||||
0xfcefa3f8,
|
||||
0x676f02d9,
|
||||
0x8d2a4c8a,
|
||||
|
||||
// round3
|
||||
0xfffa3942,
|
||||
0x8771f681,
|
||||
0x6d9d6122,
|
||||
0xfde5380c,
|
||||
0xa4beea44,
|
||||
0x4bdecfa9,
|
||||
0xf6bb4b60,
|
||||
0xbebfbc70,
|
||||
0x289b7ec6,
|
||||
0xeaa127fa,
|
||||
0xd4ef3085,
|
||||
0x4881d05,
|
||||
0xd9d4d039,
|
||||
0xe6db99e5,
|
||||
0x1fa27cf8,
|
||||
0xc4ac5665,
|
||||
|
||||
// round 4
|
||||
0xf4292244,
|
||||
0x432aff97,
|
||||
0xab9423a7,
|
||||
0xfc93a039,
|
||||
0x655b59c3,
|
||||
0x8f0ccc92,
|
||||
0xffeff47d,
|
||||
0x85845dd1,
|
||||
0x6fa87e4f,
|
||||
0xfe2ce6e0,
|
||||
0xa3014314,
|
||||
0x4e0811a1,
|
||||
0xf7537e82,
|
||||
0xbd3af235,
|
||||
0x2ad7d2bb,
|
||||
0xeb86d391,
|
||||
}
|
||||
|
||||
var shift1 = []uint32{7, 12, 17, 22}
|
||||
|
||||
var shift2 = []uint32{5, 9, 14, 20}
|
||||
|
||||
var shift3 = []uint32{4, 11, 16, 23}
|
||||
|
||||
var shift4 = []uint32{6, 10, 15, 21}
|
||||
|
||||
func md5block(dig *MD5, p []byte, nn int) int {
|
||||
var aa uint32
|
||||
var bb uint32
|
||||
var cc uint32
|
||||
var dd uint32
|
||||
var i int
|
||||
var j int
|
||||
var X [16]uint32
|
||||
|
||||
a := dig.s[0]
|
||||
b := dig.s[1]
|
||||
c := dig.s[2]
|
||||
d := dig.s[3]
|
||||
n := 0
|
||||
|
||||
for nn >= _Chunk {
|
||||
aa = a
|
||||
bb = b
|
||||
cc = c
|
||||
dd = d
|
||||
|
||||
for i = 0; i < 16; i++ {
|
||||
j = i * 4
|
||||
X[i] = uint32(p[j]) | uint32(p[j+1])<<8 | uint32(p[j+2])<<16 | uint32(p[j+3])<<24
|
||||
}
|
||||
|
||||
// Round 1.
|
||||
for i = 0; i < 16; i++ {
|
||||
x := uint32(i)
|
||||
t := uint32(i)
|
||||
s := shift1[i%4]
|
||||
f := ((c ^ d) & b) ^ d
|
||||
a += f + X[x] + table[t]
|
||||
a = a<<s | a>>(32-s)
|
||||
a += b
|
||||
|
||||
t = d
|
||||
d = c
|
||||
c = b
|
||||
b = a
|
||||
a = t
|
||||
}
|
||||
|
||||
// Round 2.
|
||||
for i = 0; i < 16; i++ {
|
||||
x := (1 + 5*uint32(i)) % 16
|
||||
t := 16 + uint32(i)
|
||||
s := shift2[i%4]
|
||||
g := ((b ^ c) & d) ^ c
|
||||
a += g + X[x] + table[t]
|
||||
a = a<<s | a>>(32-s)
|
||||
a += b
|
||||
|
||||
t = d
|
||||
d = c
|
||||
c = b
|
||||
b = a
|
||||
a = t
|
||||
}
|
||||
|
||||
// Round 3.
|
||||
for i = 0; i < 16; i++ {
|
||||
x := (5 + 3*uint32(i)) % 16
|
||||
t := 32 + uint32(i)
|
||||
s := shift3[i%4]
|
||||
h := b ^ c ^ d
|
||||
a += h + X[x] + table[t]
|
||||
a = a<<s | a>>(32-s)
|
||||
a += b
|
||||
|
||||
t = d
|
||||
d = c
|
||||
c = b
|
||||
b = a
|
||||
a = t
|
||||
}
|
||||
|
||||
// Round 4.
|
||||
for i = 0; i < 16; i++ {
|
||||
x := (7 * uint32(i)) % 16
|
||||
s := shift4[i%4]
|
||||
t := 48 + uint32(i)
|
||||
ii := c ^ (b | ^d)
|
||||
a += ii + X[x] + table[t]
|
||||
a = a<<s | a>>(32-s)
|
||||
a += b
|
||||
|
||||
t = d
|
||||
d = c
|
||||
c = b
|
||||
b = a
|
||||
a = t
|
||||
}
|
||||
|
||||
a += aa
|
||||
b += bb
|
||||
c += cc
|
||||
d += dd
|
||||
|
||||
p = p[_Chunk:]
|
||||
n += _Chunk
|
||||
nn -= _Chunk
|
||||
}
|
||||
|
||||
dig.s[0] = a
|
||||
dig.s[1] = b
|
||||
dig.s[2] = c
|
||||
dig.s[3] = d
|
||||
return n
|
||||
}
|
@ -6,6 +6,7 @@ package gc
|
||||
|
||||
import (
|
||||
"cmd/internal/obj"
|
||||
"crypto/md5"
|
||||
"fmt"
|
||||
"strings"
|
||||
)
|
||||
@ -130,12 +131,7 @@ func gcsymdup(s *Sym) {
|
||||
if len(ls.R) > 0 {
|
||||
Fatal("cannot rosymdup %s with relocations", ls.Name)
|
||||
}
|
||||
var d MD5
|
||||
md5reset(&d)
|
||||
md5write(&d, ls.P, len(ls.P))
|
||||
var hi uint64
|
||||
lo := md5sum(&d, &hi)
|
||||
ls.Name = fmt.Sprintf("gclocals·%016x%016x", lo, hi)
|
||||
ls.Name = fmt.Sprintf("gclocals·%x", md5.Sum(ls.P))
|
||||
ls.Dupok = 1
|
||||
}
|
||||
|
||||
|
@ -7,6 +7,8 @@ package gc
|
||||
import (
|
||||
"bytes"
|
||||
"cmd/internal/obj"
|
||||
"crypto/md5"
|
||||
"encoding/binary"
|
||||
"fmt"
|
||||
"os"
|
||||
"sort"
|
||||
@ -1587,12 +1589,8 @@ func typehash(t *Type) uint32 {
|
||||
}
|
||||
|
||||
//print("typehash: %s\n", p);
|
||||
var d MD5
|
||||
md5reset(&d)
|
||||
|
||||
md5write(&d, []byte(p), len(p))
|
||||
|
||||
return uint32(md5sum(&d, nil))
|
||||
h := md5.Sum([]byte(p))
|
||||
return binary.LittleEndian.Uint32(h[:4])
|
||||
}
|
||||
|
||||
func Ptrto(t *Type) *Type {
|
||||
|
Loading…
Reference in New Issue
Block a user