entropy.go 1003 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. package kcp
  2. import (
  3. "crypto/aes"
  4. "crypto/cipher"
  5. "crypto/md5"
  6. "crypto/rand"
  7. "io"
  8. )
  9. // Entropy defines a entropy source
  10. type Entropy interface {
  11. Init()
  12. Fill(nonce []byte)
  13. }
  14. // nonceMD5 nonce generator for packet header
  15. type nonceMD5 struct {
  16. seed [md5.Size]byte
  17. }
  18. func (n *nonceMD5) Init() { /*nothing required*/ }
  19. func (n *nonceMD5) Fill(nonce []byte) {
  20. if n.seed[0] == 0 { // entropy update
  21. io.ReadFull(rand.Reader, n.seed[:])
  22. }
  23. n.seed = md5.Sum(n.seed[:])
  24. copy(nonce, n.seed[:])
  25. }
  26. // nonceAES128 nonce generator for packet headers
  27. type nonceAES128 struct {
  28. seed [aes.BlockSize]byte
  29. block cipher.Block
  30. }
  31. func (n *nonceAES128) Init() {
  32. var key [16]byte //aes-128
  33. io.ReadFull(rand.Reader, key[:])
  34. io.ReadFull(rand.Reader, n.seed[:])
  35. block, _ := aes.NewCipher(key[:])
  36. n.block = block
  37. }
  38. func (n *nonceAES128) Fill(nonce []byte) {
  39. if n.seed[0] == 0 { // entropy update
  40. io.ReadFull(rand.Reader, n.seed[:])
  41. }
  42. n.block.Encrypt(n.seed[:], n.seed[:])
  43. copy(nonce, n.seed[:])
  44. }