config.go 1.5 KB

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