obfs.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. #!/usr/bin/env python
  2. #
  3. # Copyright 2015-2015 breakwa11
  4. #
  5. # Licensed under the Apache License, Version 2.0 (the "License"); you may
  6. # not use this file except in compliance with the License. You may obtain
  7. # a copy of the License at
  8. #
  9. # http://www.apache.org/licenses/LICENSE-2.0
  10. #
  11. # Unless required by applicable law or agreed to in writing, software
  12. # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  13. # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
  14. # License for the specific language governing permissions and limitations
  15. # under the License.
  16. from __future__ import absolute_import, division, print_function, \
  17. with_statement
  18. import os
  19. import sys
  20. import hashlib
  21. import logging
  22. from shadowsocks import common
  23. from shadowsocks.obfsplugin import plain, http_simple, obfs_tls, verify, auth
  24. method_supported = {}
  25. method_supported.update(plain.obfs_map)
  26. method_supported.update(http_simple.obfs_map)
  27. method_supported.update(obfs_tls.obfs_map)
  28. method_supported.update(verify.obfs_map)
  29. method_supported.update(auth.obfs_map)
  30. class server_info(object):
  31. def __init__(self, data):
  32. self.data = data
  33. class obfs(object):
  34. def __init__(self, method):
  35. method = common.to_str(method)
  36. self.method = method
  37. self._method_info = self.get_method_info(method)
  38. if self._method_info:
  39. self.obfs = self.get_obfs(method)
  40. else:
  41. raise Exception('obfs plugin [%s] not supported' % method)
  42. def init_data(self):
  43. return self.obfs.init_data()
  44. def set_server_info(self, server_info):
  45. return self.obfs.set_server_info(server_info)
  46. def get_method_info(self, method):
  47. method = method.lower()
  48. m = method_supported.get(method)
  49. return m
  50. def get_obfs(self, method):
  51. m = self._method_info
  52. return m[0](method)
  53. def client_pre_encrypt(self, buf):
  54. return self.obfs.client_pre_encrypt(buf)
  55. def client_encode(self, buf):
  56. return self.obfs.client_encode(buf)
  57. def client_decode(self, buf):
  58. return self.obfs.client_decode(buf)
  59. def client_post_decrypt(self, buf):
  60. return self.obfs.client_post_decrypt(buf)
  61. def server_pre_encrypt(self, buf):
  62. return self.obfs.server_pre_encrypt(buf)
  63. def server_encode(self, buf):
  64. return self.obfs.server_encode(buf)
  65. def server_decode(self, buf):
  66. return self.obfs.server_decode(buf)
  67. def server_post_decrypt(self, buf):
  68. return self.obfs.server_post_decrypt(buf)
  69. def client_udp_pre_encrypt(self, buf):
  70. return self.obfs.client_udp_pre_encrypt(buf)
  71. def client_udp_post_decrypt(self, buf):
  72. return self.obfs.client_udp_post_decrypt(buf)
  73. def server_udp_pre_encrypt(self, buf):
  74. return self.obfs.server_udp_pre_encrypt(buf)
  75. def server_udp_post_decrypt(self, buf):
  76. return self.obfs.server_udp_post_decrypt(buf)
  77. def dispose(self):
  78. self.obfs.dispose()
  79. del self.obfs