28 lines
516 B
Go
28 lines
516 B
Go
package entropy
|
|
|
|
import (
|
|
"crypto/rand"
|
|
"sync"
|
|
)
|
|
|
|
type OSEntropySource struct {
|
|
mu sync.Mutex
|
|
}
|
|
|
|
func (e *OSEntropySource) GetEntropy(minEntropy int64, minEntropyInputLength int64, maxEntropyInputLength int64) ([]byte, error) {
|
|
//使用互斥锁保证熵源的独占性
|
|
e.mu.Lock()
|
|
defer e.mu.Unlock()
|
|
|
|
n := minEntropy
|
|
if n < minEntropyInputLength {
|
|
n = minEntropyInputLength
|
|
}
|
|
entropy := make([]byte, n)
|
|
if _, err := rand.Reader.Read(entropy); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return entropy, nil
|
|
}
|