]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: clean up & go-ify the hash function seeder
authorKeith Randall <khr@golang.org>
Tue, 9 Dec 2014 22:40:40 +0000 (14:40 -0800)
committerKeith Randall <khr@golang.org>
Wed, 10 Dec 2014 21:15:35 +0000 (21:15 +0000)
Change-Id: I0e95f8a5962c547da20e19a356ae1cf8375c9107
Reviewed-on: https://go-review.googlesource.com/1270
Reviewed-by: Russ Cox <rsc@golang.org>
13 files changed:
src/runtime/alg.go
src/runtime/os1_darwin.go
src/runtime/os1_dragonfly.go
src/runtime/os1_freebsd.go
src/runtime/os1_linux.go
src/runtime/os1_netbsd.go
src/runtime/os1_openbsd.go
src/runtime/os1_plan9.go
src/runtime/os1_windows.go
src/runtime/os3_solaris.go
src/runtime/os_linux_386.go
src/runtime/runtime2.go
src/runtime/vdso_linux_amd64.go

index e367bc5b2f4d23986ef39cb4f068de30282b7670..6e53f817a05657d5892749d0b85f4d395713a7ef 100644 (file)
@@ -332,18 +332,6 @@ func init() {
                algarray[alg_MEM128].hash = aeshash
                algarray[alg_STRING].hash = aeshashstr
                // Initialize with random data so hash collisions will be hard to engineer.
-               var rnd unsafe.Pointer
-               var n int32
-               get_random_data(&rnd, &n)
-               if n > hashRandomBytes {
-                       n = hashRandomBytes
-               }
-               memmove(unsafe.Pointer(&aeskeysched[0]), rnd, uintptr(n))
-               if n < hashRandomBytes {
-                       // Not very random, but better than nothing.
-                       for t := nanotime(); n < hashRandomBytes; n++ {
-                               aeskeysched[n] = byte(t >> uint(8*(n%8)))
-                       }
-               }
+               getRandomData(aeskeysched[:])
        }
 }
index 2fbf2cae04e8282ee4910df46ac9125762d55879..12642aa121ab723e3b5de1965cdff09a57172bf7 100644 (file)
@@ -45,20 +45,14 @@ func osinit() {
        }
 }
 
-var urandom_data [_HashRandomBytes]byte
 var urandom_dev = []byte("/dev/random\x00")
 
 //go:nosplit
-func get_random_data(rnd *unsafe.Pointer, rnd_len *int32) {
+func getRandomData(r []byte) {
        fd := open(&urandom_dev[0], 0 /* O_RDONLY */, 0)
-       if read(fd, unsafe.Pointer(&urandom_data), _HashRandomBytes) == _HashRandomBytes {
-               *rnd = unsafe.Pointer(&urandom_data[0])
-               *rnd_len = _HashRandomBytes
-       } else {
-               *rnd = nil
-               *rnd_len = 0
-       }
+       n := read(fd, unsafe.Pointer(&r[0]), int32(len(r)))
        close(fd)
+       extendRandom(r, int(n))
 }
 
 func goenvs() {
index 82bb45b9b7e5c4d685868c73ab0473052691337d..d02e925ec51badc9dbadabfb314a9b60942e88fb 100644 (file)
@@ -97,20 +97,14 @@ func osinit() {
        ncpu = getncpu()
 }
 
-var urandom_data [_HashRandomBytes]byte
 var urandom_dev = []byte("/dev/urandom\x00")
 
 //go:nosplit
-func get_random_data(rnd *unsafe.Pointer, rnd_len *int32) {
+func getRandomData(r []byte) {
        fd := open(&urandom_dev[0], 0 /* O_RDONLY */, 0)
-       if read(fd, unsafe.Pointer(&urandom_data), _HashRandomBytes) == _HashRandomBytes {
-               *rnd = unsafe.Pointer(&urandom_data[0])
-               *rnd_len = _HashRandomBytes
-       } else {
-               *rnd = nil
-               *rnd_len = 0
-       }
+       n := read(fd, unsafe.Pointer(&r[0]), int32(len(r)))
        close(fd)
+       extendRandom(r, int(n))
 }
 
 func goenvs() {
index 2cacfbae61f1881b5c37055c1c207aa15fa56d35..80e45324391716b1d839c19d42d792d78debbc48 100644 (file)
@@ -96,20 +96,14 @@ func osinit() {
        ncpu = getncpu()
 }
 
-var urandom_data [_HashRandomBytes]byte
 var urandom_dev = []byte("/dev/random\x00")
 
 //go:nosplit
-func get_random_data(rnd *unsafe.Pointer, rnd_len *int32) {
+func getRandomData(r []byte) {
        fd := open(&urandom_dev[0], 0 /* O_RDONLY */, 0)
-       if read(fd, unsafe.Pointer(&urandom_data), _HashRandomBytes) == _HashRandomBytes {
-               *rnd = unsafe.Pointer(&urandom_data[0])
-               *rnd_len = _HashRandomBytes
-       } else {
-               *rnd = nil
-               *rnd_len = 0
-       }
+       n := read(fd, unsafe.Pointer(&r[0]), int32(len(r)))
        close(fd)
+       extendRandom(r, int(n))
 }
 
 func goenvs() {
index 67fa6391e1d47c4738ee70ff35b2ed4611f4cb63..2e12d74f442d282c6edfb276586a0c0d9075a1a0 100644 (file)
@@ -145,30 +145,18 @@ func osinit() {
        ncpu = getproccount()
 }
 
-// Random bytes initialized at startup.  These come
-// from the ELF AT_RANDOM auxiliary vector (vdso_linux_amd64.c).
-// byte*       runtime·startup_random_data;
-// uint32      runtime·startup_random_data_len;
-
-var urandom_data [_HashRandomBytes]byte
 var urandom_dev = []byte("/dev/random\x00")
 
-//go:nosplit
-func get_random_data(rnd *unsafe.Pointer, rnd_len *int32) {
-       if startup_random_data != nil {
-               *rnd = unsafe.Pointer(startup_random_data)
-               *rnd_len = int32(startup_random_data_len)
+func getRandomData(r []byte) {
+       if startupRandomData != nil {
+               n := copy(r, startupRandomData)
+               extendRandom(r, n)
                return
        }
        fd := open(&urandom_dev[0], 0 /* O_RDONLY */, 0)
-       if read(fd, unsafe.Pointer(&urandom_data), _HashRandomBytes) == _HashRandomBytes {
-               *rnd = unsafe.Pointer(&urandom_data[0])
-               *rnd_len = _HashRandomBytes
-       } else {
-               *rnd = nil
-               *rnd_len = 0
-       }
+       n := read(fd, unsafe.Pointer(&r[0]), int32(len(r)))
        close(fd)
+       extendRandom(r, int(n))
 }
 
 func goenvs() {
index 493be30fa5fcec03eaebf8aaa3a566e43914707d..b5068629ba340b8465ea2987f8c29bd98b5612d5 100644 (file)
@@ -170,20 +170,14 @@ func osinit() {
        ncpu = getncpu()
 }
 
-var urandom_data [_HashRandomBytes]byte
 var urandom_dev = []byte("/dev/urandom\x00")
 
 //go:nosplit
-func get_random_data(rnd *unsafe.Pointer, rnd_len *int32) {
+func getRandomData(r []byte) {
        fd := open(&urandom_dev[0], 0 /* O_RDONLY */, 0)
-       if read(fd, unsafe.Pointer(&urandom_data), _HashRandomBytes) == _HashRandomBytes {
-               *rnd = unsafe.Pointer(&urandom_data[0])
-               *rnd_len = _HashRandomBytes
-       } else {
-               *rnd = nil
-               *rnd_len = 0
-       }
+       n := read(fd, unsafe.Pointer(&r[0]), int32(len(r)))
        close(fd)
+       extendRandom(r, int(n))
 }
 
 func goenvs() {
index d5ffe10a8170484c2066ebf09e40f283ef535f6b..b1a16d582b958053fd5b4934d1b7554e4e707a29 100644 (file)
@@ -138,20 +138,14 @@ func osinit() {
        ncpu = getncpu()
 }
 
-var urandom_data [_HashRandomBytes]byte
 var urandom_dev = []byte("/dev/urandom\x00")
 
 //go:nosplit
-func get_random_data(rnd *unsafe.Pointer, rnd_len *int32) {
+func getRandomData(r []byte) {
        fd := open(&urandom_dev[0], 0 /* O_RDONLY */, 0)
-       if read(fd, unsafe.Pointer(&urandom_data), _HashRandomBytes) == _HashRandomBytes {
-               *rnd = unsafe.Pointer(&urandom_data[0])
-               *rnd_len = _HashRandomBytes
-       } else {
-               *rnd = nil
-               *rnd_len = 0
-       }
+       n := read(fd, unsafe.Pointer(&r[0]), int32(len(r)))
        close(fd)
+       extendRandom(r, int(n))
 }
 
 func goenvs() {
index 0f8da03f2b0db9de76e0e91564f02b45678e92f5..9581f0cb67d54c8761590c4275f87ee963b402fb 100644 (file)
@@ -85,20 +85,14 @@ func crash() {
        *(*int)(nil) = 0
 }
 
-var random_data [_HashRandomBytes]byte
 var random_dev = []byte("/dev/random\x00")
 
 //go:nosplit
-func get_random_data(rnd *unsafe.Pointer, rnd_len *int32) {
+func getRandomData(r []byte) {
        fd := open(&random_dev[0], 0 /* O_RDONLY */, 0)
-       if read(fd, unsafe.Pointer(&random_data), _HashRandomBytes) == _HashRandomBytes {
-               *rnd = unsafe.Pointer(&random_data[0])
-               *rnd_len = _HashRandomBytes
-       } else {
-               *rnd = nil
-               *rnd_len = 0
-       }
+       n := read(fd, unsafe.Pointer(&r[0]), int32(len(r)))
        close(fd)
+       extendRandom(r, int(n))
 }
 
 func goenvs() {
index 57ea050f2662c27b2dd0c4dde7aad7d07988da5a..a78eeace15311925ac363363ee90625c0231d777 100644 (file)
@@ -148,24 +148,21 @@ func osinit() {
        }
 }
 
-var random_data [_HashRandomBytes]byte
-
 //go:nosplit
-func get_random_data(rnd *unsafe.Pointer, rnd_len *int32) {
+func getRandomData(r []byte) {
        const (
                prov_rsa_full       = 1
                crypt_verifycontext = 0xF0000000
        )
        var handle uintptr
-       *rnd = nil
-       *rnd_len = 0
+       n := 0
        if stdcall5(_CryptAcquireContextW, uintptr(unsafe.Pointer(&handle)), 0, 0, prov_rsa_full, crypt_verifycontext) != 0 {
-               if stdcall3(_CryptGenRandom, handle, _HashRandomBytes, uintptr(unsafe.Pointer(&random_data[0]))) != 0 {
-                       *rnd = unsafe.Pointer(&random_data[0])
-                       *rnd_len = _HashRandomBytes
+               if stdcall3(_CryptGenRandom, handle, uintptr(len(r)), uintptr(unsafe.Pointer(&r[0]))) != 0 {
+                       n = len(r)
                }
                stdcall2(_CryptReleaseContext, handle, 0)
        }
+       extendRandom(r, n)
 }
 
 func goenvs() {
index 1df74faad2d67a8e71a94a8fae86386736095a9f..6ccbbe29eea53d52ff71d67c20f6bca924527e3d 100644 (file)
@@ -165,20 +165,14 @@ func newosproc(mp *m, _ unsafe.Pointer) {
        }
 }
 
-var urandom_data [_HashRandomBytes]byte
 var urandom_dev = []byte("/dev/random\x00")
 
 //go:nosplit
-func get_random_data(rnd *unsafe.Pointer, rnd_len *int32) {
+func getRandomData(r []byte) {
        fd := open(&urandom_dev[0], 0 /* O_RDONLY */, 0)
-       if read(fd, unsafe.Pointer(&urandom_data), _HashRandomBytes) == _HashRandomBytes {
-               *rnd = unsafe.Pointer(&urandom_data[0])
-               *rnd_len = _HashRandomBytes
-       } else {
-               *rnd = nil
-               *rnd_len = 0
-       }
+       n := read(fd, unsafe.Pointer(&r[0]), int32(len(r)))
        close(fd)
+       extendRandom(r, int(n))
 }
 
 func goenvs() {
index adcd5a1c4eec7e0c454a36b4370a65658364bd39..e2120da905875bafa67c3f291894f46068ca2a06 100644 (file)
@@ -29,8 +29,7 @@ func sysargs(argc int32, argv **byte) {
                        _vdso = auxv[i+1]
 
                case _AT_RANDOM:
-                       startup_random_data = (*byte)(unsafe.Pointer(uintptr(auxv[i+1])))
-                       startup_random_data_len = 16
+                       startupRandomData = (*[16]byte)(unsafe.Pointer(uintptr(auxv[i+1])))[:]
                }
        }
 }
index d18178d0939475eab1d66b46ea3282f82966af0c..e0d23e722f7fc53c3c9e6712496a3981891eb885 100644 (file)
@@ -475,16 +475,33 @@ const (
        _Structrnd = regSize
 )
 
-var startup_random_data *byte
-var startup_random_data_len uint32
+// startup_random_data holds random bytes initialized at startup.  These come from
+// the ELF AT_RANDOM auxiliary vector (vdso_linux_amd64.go or os_linux_386.go).
+var startupRandomData []byte
+
+// extendRandom extends the random numbers in r[:n] to the whole slice r.
+// Treats n<0 as n==0.
+func extendRandom(r []byte, n int) {
+       if n < 0 {
+               n = 0
+       }
+       for n < len(r) {
+               // Extend random bits using hash function & time seed
+               w := n
+               if w > 16 {
+                       w = 16
+               }
+               h := memhash(unsafe.Pointer(&r[n-w]), uintptr(w), uintptr(nanotime()))
+               for i := 0; i < ptrSize && n < len(r); i++ {
+                       r[n] = byte(h)
+                       n++
+                       h >>= 8
+               }
+       }
+}
 
 var invalidptr int32
 
-const (
-       // hashinit wants this many random bytes
-       _HashRandomBytes = 32
-)
-
 /*
  * deferred subroutine calls
  */
index 7eb6988118ece796e1e6f7e30c37d2697b0a3cae..244001590a02422ceda8b5eced7b01b67cca628f 100644 (file)
@@ -321,8 +321,7 @@ func sysargs(argc int32, argv **byte) {
                        vdso_parse_symbols(info1, vdso_find_version(info1, &linux26))
 
                case _AT_RANDOM:
-                       startup_random_data = (*byte)(unsafe.Pointer(uintptr(av.a_val)))
-                       startup_random_data_len = 16
+                       startupRandomData = (*[16]byte)(unsafe.Pointer(uintptr(av.a_val)))[:]
                }
        }
 }