init: v1.0.0
This commit is contained in:
@@ -0,0 +1,41 @@
|
||||
package entropy
|
||||
|
||||
import (
|
||||
"sync"
|
||||
|
||||
"xdx.jelly/xgcl/grand/drng/entropy/rdtsc"
|
||||
)
|
||||
|
||||
// SysTimeEntropySource 系统时间熵源
|
||||
type SysTimeEntropySource struct {
|
||||
mu sync.Mutex
|
||||
}
|
||||
|
||||
// GetEntropy
|
||||
func (e *SysTimeEntropySource) GetEntropy(minEntropy int64, minEntropyInputLength int64, maxEntropyInputLength int64) ([]byte, error) {
|
||||
//使用互斥锁保证熵源的独占性
|
||||
e.mu.Lock()
|
||||
defer e.mu.Unlock()
|
||||
|
||||
// SysTimeEntropySource熵源的Markov测试min entropy ~ 0.58
|
||||
// 因此向熵源最少要取minEntropy / 0.58 ~ 2*minEntropy
|
||||
n := minEntropy << 1
|
||||
if n < minEntropyInputLength {
|
||||
n = minEntropyInputLength
|
||||
}
|
||||
entropy := make([]byte, n)
|
||||
for i := int64(0); i < n; i++ {
|
||||
// var b byte
|
||||
// for j := 0; j < 8; j++ {
|
||||
// t := rdtsc.GetCPUTimeStamp()
|
||||
// // xor of the the last two bits are used.
|
||||
// // for a rdtsc usually used 20~50 cycles.
|
||||
// // b |= byte((t^(t>>1)^(t>>2)^(t>>3))&1) << j
|
||||
// b |= byte(t&1) << j
|
||||
// }
|
||||
// entropy[i] = b
|
||||
|
||||
entropy[i] = byte(rdtsc.GetCPUTimeStamp())
|
||||
}
|
||||
return entropy, nil
|
||||
}
|
||||
Reference in New Issue
Block a user