config.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. package shadowsocks
  2. import (
  3. "crypto/md5"
  4. "io"
  5. "github.com/v2ray/v2ray-core/common/crypto"
  6. )
  7. type Cipher interface {
  8. KeySize() int
  9. IVSize() int
  10. NewEncodingStream(key []byte, iv []byte, writer io.Writer) (io.Writer, error)
  11. NewDecodingStream(key []byte, iv []byte, reader io.Reader) (io.Reader, error)
  12. }
  13. type AesCfb struct {
  14. KeyBytes int
  15. }
  16. func (this *AesCfb) KeySize() int {
  17. return this.KeyBytes
  18. }
  19. func (this *AesCfb) IVSize() int {
  20. return 16
  21. }
  22. func (this *AesCfb) NewEncodingStream(key []byte, iv []byte, writer io.Writer) (io.Writer, error) {
  23. stream, err := crypto.NewAesEncryptionStream(key, iv)
  24. if err != nil {
  25. return nil, err
  26. }
  27. aesWriter := crypto.NewCryptionWriter(stream, writer)
  28. return aesWriter, nil
  29. }
  30. func (this *AesCfb) NewDecodingStream(key []byte, iv []byte, reader io.Reader) (io.Reader, error) {
  31. stream, err := crypto.NewAesDecryptionStream(key, iv)
  32. if err != nil {
  33. return nil, err
  34. }
  35. aesReader := crypto.NewCryptionReader(stream, reader)
  36. return aesReader, nil
  37. }
  38. type Config struct {
  39. Cipher Cipher
  40. Key []byte
  41. UDP bool
  42. }
  43. func PasswordToCipherKey(password string, keySize int) []byte {
  44. pwdBytes := []byte(password)
  45. key := make([]byte, 0, keySize)
  46. md5Sum := md5.Sum(pwdBytes)
  47. key = append(key, md5Sum[:]...)
  48. for len(key) < keySize {
  49. md5Hash := md5.New()
  50. md5Hash.Write(md5Sum[:])
  51. md5Hash.Write(pwdBytes)
  52. md5Hash.Sum(md5Sum[:0])
  53. key = append(key, md5Sum[:]...)
  54. }
  55. return key
  56. }