method_aes256gcm.go 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. package shadowsocks2022
  2. import (
  3. "crypto/aes"
  4. "crypto/cipher"
  5. )
  6. func newAES256GCMMethod() *AES256GCMMethod {
  7. return &AES256GCMMethod{}
  8. }
  9. type AES256GCMMethod struct{}
  10. func (a AES256GCMMethod) GetSessionSubKeyAndSaltLength() int {
  11. return 32
  12. }
  13. func (a AES256GCMMethod) GetStreamAEAD(sessionSubKey []byte) (cipher.AEAD, error) {
  14. aesCipher, err := aes.NewCipher(sessionSubKey)
  15. if err != nil {
  16. return nil, newError("failed to create AES cipher").Base(err)
  17. }
  18. aead, err := cipher.NewGCM(aesCipher)
  19. if err != nil {
  20. return nil, newError("failed to create AES-GCM AEAD").Base(err)
  21. }
  22. return aead, nil
  23. }
  24. func (a AES256GCMMethod) GenerateEIH(currentIdentitySubKey []byte, nextPskHash []byte, out []byte) error {
  25. aesCipher, err := aes.NewCipher(currentIdentitySubKey)
  26. if err != nil {
  27. return newError("failed to create AES cipher").Base(err)
  28. }
  29. aesCipher.Encrypt(out, nextPskHash)
  30. return nil
  31. }
  32. func (a AES256GCMMethod) GetUDPClientProcessor(ipsk [][]byte, psk []byte, derivation KeyDerivation) (UDPClientPacketProcessor, error) {
  33. reqSeparateHeaderPsk := psk
  34. if ipsk != nil {
  35. reqSeparateHeaderPsk = ipsk[0]
  36. }
  37. reqSeparateHeaderCipher, err := aes.NewCipher(reqSeparateHeaderPsk)
  38. if err != nil {
  39. return nil, newError("failed to create AES cipher").Base(err)
  40. }
  41. respSeparateHeaderCipher, err := aes.NewCipher(psk)
  42. if err != nil {
  43. return nil, newError("failed to create AES cipher").Base(err)
  44. }
  45. getPacketAEAD := func(sessionID []byte) cipher.AEAD {
  46. sessionKey := make([]byte, a.GetSessionSubKeyAndSaltLength())
  47. derivation.GetSessionSubKey(psk, sessionID, sessionKey)
  48. block, err := aes.NewCipher(sessionKey)
  49. if err != nil {
  50. panic(err)
  51. }
  52. aead, err := cipher.NewGCM(block)
  53. if err != nil {
  54. panic(err)
  55. }
  56. return aead
  57. }
  58. eihGenerator := newAESEIHGeneratorContainer(len(ipsk), psk, ipsk)
  59. getEIH := func(mask []byte) ExtensibleIdentityHeaders {
  60. eih, err := eihGenerator.GenerateEIHUDP(derivation, a, mask)
  61. if err != nil {
  62. newError("failed to generate EIH").Base(err).WriteToLog()
  63. }
  64. return eih
  65. }
  66. return NewAESUDPClientPacketProcessor(reqSeparateHeaderCipher, respSeparateHeaderCipher, getPacketAEAD, getEIH), nil
  67. }