method_aes256gcm.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  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. }
  11. func (A AES256GCMMethod) GetSessionSubKeyAndSaltLength() int {
  12. return 32
  13. }
  14. func (A AES256GCMMethod) GetStreamAEAD(SessionSubKey []byte) (cipher.AEAD, error) {
  15. aesCipher, err := aes.NewCipher(SessionSubKey)
  16. if err != nil {
  17. return nil, newError("failed to create AES cipher").Base(err)
  18. }
  19. aead, err := cipher.NewGCM(aesCipher)
  20. if err != nil {
  21. return nil, newError("failed to create AES-GCM AEAD").Base(err)
  22. }
  23. return aead, nil
  24. }
  25. func (A AES256GCMMethod) GenerateEIH(CurrentIdentitySubKey []byte, nextPskHash []byte, out []byte) error {
  26. aesCipher, err := aes.NewCipher(CurrentIdentitySubKey)
  27. if err != nil {
  28. return newError("failed to create AES cipher").Base(err)
  29. }
  30. aesCipher.Encrypt(out, nextPskHash)
  31. return nil
  32. }
  33. func (A AES256GCMMethod) GetUDPClientProcessor(ipsk [][]byte, psk []byte, derivation KeyDerivation) (UDPClientPacketProcessor, error) {
  34. reqSeparateHeaderPsk := psk
  35. if ipsk != nil {
  36. reqSeparateHeaderPsk = ipsk[0]
  37. }
  38. reqSeparateHeaderCipher, err := aes.NewCipher(reqSeparateHeaderPsk)
  39. if err != nil {
  40. return nil, newError("failed to create AES cipher").Base(err)
  41. }
  42. respSeparateHeaderCipher, err := aes.NewCipher(psk)
  43. if err != nil {
  44. return nil, newError("failed to create AES cipher").Base(err)
  45. }
  46. getPacketAEAD := func(sessionID []byte) cipher.AEAD {
  47. sessionKey := make([]byte, A.GetSessionSubKeyAndSaltLength())
  48. derivation.GetSessionSubKey(psk, sessionID, sessionKey)
  49. block, err := aes.NewCipher(sessionKey)
  50. aead, err := cipher.NewGCM(block)
  51. if err != nil {
  52. panic(err)
  53. }
  54. return aead
  55. }
  56. eihGenerator := newAESEIHGeneratorContainer(len(ipsk), psk, ipsk)
  57. getEIH := func(mask []byte) ExtensibleIdentityHeaders {
  58. eih, err := eihGenerator.GenerateEIHUDP(derivation, A, mask)
  59. if err != nil {
  60. newError("failed to generate EIH").Base(err).WriteToLog()
  61. }
  62. return eih
  63. }
  64. return NewAESUDPClientPacketProcessor(reqSeparateHeaderCipher, respSeparateHeaderCipher, getPacketAEAD, getEIH), nil
  65. }