node_crypto.go 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362
  1. package core
  2. import (
  3. "bytes"
  4. "crypto/aes"
  5. "crypto/cipher"
  6. "crypto/hmac"
  7. "crypto/md5"
  8. "crypto/sha1"
  9. "crypto/sha256"
  10. "crypto/sha512"
  11. "encoding/base64"
  12. "encoding/hex"
  13. "fmt"
  14. "hash"
  15. "github.com/dop251/goja"
  16. )
  17. func toBytes(v interface{}) []byte {
  18. switch v := v.(type) {
  19. case []byte:
  20. return v
  21. case string:
  22. return []byte(v)
  23. case *Buffer:
  24. return v.value
  25. }
  26. return nil
  27. }
  28. func toString(v interface{}) string {
  29. switch v := v.(type) {
  30. case []byte:
  31. return string(v)
  32. case string:
  33. return v
  34. case *Buffer:
  35. return string(v.value)
  36. }
  37. return ""
  38. }
  39. type Crypto struct {
  40. vm *goja.Runtime
  41. }
  42. type Hmac struct {
  43. // decode bool
  44. vm *goja.Runtime
  45. Algorithm string
  46. middle interface{}
  47. }
  48. func (h *Hmac) Digest(EF string) interface{} {
  49. var result interface{}
  50. var SF = ""
  51. switch h.Algorithm {
  52. case "md5", "sha1", "sha256", "sha512":
  53. result = h.middle.(hash.Hash).Sum(nil)
  54. case "aes-256-cbc":
  55. }
  56. if EF == "" {
  57. return &Buffer{
  58. value: result.([]byte),
  59. }
  60. }
  61. return Convert(h.vm, result, SF, EF)
  62. }
  63. func (h *Hmac) Update(data interface{}, SF, EF string) interface{} {
  64. switch h.Algorithm {
  65. case "md5", "sha1", "sha256", "sha512":
  66. h.middle.(hash.Hash).Write(toBytes(data))
  67. case "aes-256-cbc":
  68. if SF == "hex" {
  69. data = Convert(h.vm, data, "hex", "")
  70. }
  71. return Convert(h.vm, h.middle.(*AesCipher).Update(toBytes(data)), "", EF)
  72. }
  73. return nil
  74. }
  75. func (h *Hmac) Final(EF string) interface{} {
  76. switch h.Algorithm {
  77. case "md5", "sha1", "sha256", "sha512":
  78. case "aes-256-cbc":
  79. return Convert(h.vm, h.middle.(*AesCipher).Final(), "", EF)
  80. }
  81. return nil
  82. }
  83. func (c *Crypto) CreateCipheriv(algorithm string, key, iv interface{}) *Hmac {
  84. var middle interface{}
  85. var err error
  86. switch algorithm {
  87. case "aes-256-cbc":
  88. middle, err = NewAesCipher(c.vm, toBytes(key), toBytes(iv), false)
  89. if err != nil {
  90. panic(Error(c.vm, err))
  91. }
  92. }
  93. return &Hmac{
  94. vm: c.vm,
  95. // decode: true,
  96. middle: middle,
  97. Algorithm: algorithm,
  98. }
  99. }
  100. func (c *Crypto) CreateDecipheriv(algorithm string, key, iv interface{}) *Hmac {
  101. var middle interface{}
  102. var err error
  103. switch algorithm {
  104. case "aes-256-cbc":
  105. middle, err = NewAesCipher(c.vm, toBytes(key), toBytes(iv), true)
  106. if err != nil {
  107. panic(Error(c.vm, err))
  108. }
  109. }
  110. return &Hmac{
  111. // decode: true,
  112. vm: c.vm,
  113. middle: middle,
  114. Algorithm: algorithm,
  115. }
  116. }
  117. func (c *Crypto) CreateHash(algorithm string) *Hmac {
  118. var hashFunc func() hash.Hash
  119. switch algorithm {
  120. case "md5":
  121. hashFunc = md5.New
  122. case "sha1":
  123. hashFunc = sha1.New
  124. case "sha256":
  125. hashFunc = sha256.New
  126. case "sha512":
  127. hashFunc = sha512.New
  128. default:
  129. return nil
  130. }
  131. return &Hmac{
  132. vm: c.vm,
  133. middle: hashFunc(),
  134. Algorithm: algorithm,
  135. }
  136. }
  137. func (c *Crypto) CreateHmac(algorithm string, key interface{}) *Hmac {
  138. var hashFunc func() hash.Hash
  139. switch algorithm {
  140. case "md5":
  141. hashFunc = md5.New
  142. case "sha1":
  143. hashFunc = sha1.New
  144. case "sha256":
  145. hashFunc = sha256.New
  146. case "sha512":
  147. hashFunc = sha512.New
  148. default:
  149. return nil
  150. }
  151. return &Hmac{
  152. vm: c.vm,
  153. middle: hmac.New(hashFunc, toBytes(key)),
  154. Algorithm: algorithm,
  155. }
  156. }
  157. type AesCipher struct {
  158. block cipher.Block
  159. iv []byte
  160. mode cipher.BlockMode
  161. decode bool
  162. buffer bytes.Buffer
  163. vm *goja.Runtime
  164. }
  165. func NewAesCipher(vm *goja.Runtime, key, iv []byte, decode bool) (*AesCipher, error) {
  166. block, err := aes.NewCipher(key)
  167. if err != nil {
  168. return nil, err
  169. }
  170. mode := cipher.NewCBCDecrypter(block, iv)
  171. if !decode {
  172. mode = cipher.NewCBCEncrypter(block, iv)
  173. }
  174. return &AesCipher{
  175. vm: vm,
  176. block: block,
  177. iv: iv,
  178. mode: mode,
  179. decode: decode,
  180. }, nil
  181. }
  182. func (ac *AesCipher) Update(text []byte) []byte {
  183. //fmt.Println("Update", string(text))
  184. if ac.decode {
  185. // Decrypt
  186. var err error
  187. //fmt.Println("Decrypt1", string(text))
  188. ac.mode.CryptBlocks(text, text)
  189. //fmt.Println("Decrypt2", string(text))
  190. text, err = pkcs7Unpadding(text)
  191. if err != nil {
  192. panic(Error(ac.vm, err))
  193. }
  194. //fmt.Println("Decrypt3", string(text), err)
  195. } else {
  196. // Encrypt
  197. text = pkcs7Padding(text, ac.block.BlockSize())
  198. ac.mode.CryptBlocks(text, text)
  199. }
  200. ac.buffer.Write(text)
  201. return nil
  202. // return text
  203. }
  204. func (ac *AesCipher) Final() []byte {
  205. return ac.buffer.Bytes()
  206. }
  207. func pkcs7Unpadding(data []byte) ([]byte, error) {
  208. length := len(data)
  209. unpadding := int(data[length-1])
  210. if unpadding > length {
  211. return nil, fmt.Errorf("pkcs7: invalid padding")
  212. }
  213. return data[:(length - unpadding)], nil
  214. }
  215. // type Cipher struct{}
  216. // func (c *Cipher) AesEncrypt(key, data string) (string, error) {
  217. // block, err := aes.NewCipher([]byte(key))
  218. // if err != nil {
  219. // return "", err
  220. // }
  221. // ciphertext := make([]byte, aes.BlockSize+len(data))
  222. // iv := ciphertext[:aes.BlockSize]
  223. // if _, err := io.ReadFull(rand.Reader, iv); err != nil {
  224. // return "", err
  225. // }
  226. // stream := cipher.NewCFBEncrypter(block, iv)
  227. // stream.XORKeyStream(ciphertext[aes.BlockSize:], []byte(data))
  228. // return base64.StdEncoding.EncodeToString(ciphertext), nil
  229. // }
  230. // func (c *Cipher) AesDecrypt(key, ciphertext string) (string, error) {
  231. // block, err := aes.NewCipher([]byte(key))
  232. // if err != nil {
  233. // return "", err
  234. // }
  235. // data, err := base64.StdEncoding.DecodeString(ciphertext)
  236. // if err != nil {
  237. // return "", err
  238. // }
  239. // if len(data) < aes.BlockSize {
  240. // return "", fmt.Errorf("ciphertext too short")
  241. // }
  242. // iv := data[:aes.BlockSize]
  243. // data = data[aes.BlockSize:]
  244. // stream := cipher.NewCFBDecrypter(block, iv)
  245. // stream.XORKeyStream(data, data)
  246. // return string(data), nil
  247. // }
  248. // func (c *Cipher) Rc4Encrypt(key, data string) (string, error) {
  249. // cipher, err := rc4.NewCipher([]byte(key))
  250. // if err != nil {
  251. // return "", err
  252. // }
  253. // ciphertext := make([]byte, len(data))
  254. // cipher.XORKeyStream(ciphertext, []byte(data))
  255. // return base64.StdEncoding.EncodeToString(ciphertext), nil
  256. // }
  257. // func (c *Cipher) Rc4Decrypt(key, ciphertext string) (string, error) {
  258. // cipher, err := rc4.NewCipher([]byte(key))
  259. // if err != nil {
  260. // return "", err
  261. // }
  262. // data, err := base64.StdEncoding.DecodeString(ciphertext)
  263. // if err != nil {
  264. // return "", err
  265. // }
  266. // cipher.XORKeyStream(data, data)
  267. // return string(data), nil
  268. // }
  269. func Convert(vm *goja.Runtime, data interface{}, fromFormat string, toFormat string) interface{} {
  270. //fmt.Println(data, fromFormat, toFormat)
  271. var dataBytes []byte
  272. switch input := data.(type) {
  273. case string:
  274. dataBytes = []byte(input)
  275. case []byte:
  276. dataBytes = input
  277. case *Buffer:
  278. dataBytes = input.value
  279. default:
  280. panic(Error(vm, fmt.Errorf("invalid data type: %T", data)))
  281. }
  282. switch fromFormat {
  283. case "hex":
  284. // 将数据从 HEX 编码格式转换为字节数组
  285. decodedData, err := hex.DecodeString(string(dataBytes))
  286. if err != nil {
  287. panic(Error(vm, err))
  288. }
  289. dataBytes = decodedData
  290. case "base64":
  291. // 将数据从 Base64 编码格式转换为字节数组
  292. decodedData, err := base64.StdEncoding.DecodeString(string(dataBytes))
  293. if err != nil {
  294. panic(Error(vm, err))
  295. }
  296. dataBytes = decodedData
  297. case "bytes", "binary":
  298. // 不需要进行转换
  299. case "utf8", "utf-8", "":
  300. default:
  301. panic(Error(vm, fmt.Errorf("unsupported input format: %s", fromFormat)))
  302. }
  303. //fmt.Println(string(dataBytes), fromFormat, toFormat)
  304. switch toFormat {
  305. case "hex":
  306. // 将数据转换为 HEX 编码格式
  307. //fmt.Println("hex", hex.EncodeToString(dataBytes), fromFormat, toFormat)
  308. return hex.EncodeToString(dataBytes)
  309. case "base64":
  310. // 将数据转换为 Base64 编码格式
  311. return base64.StdEncoding.EncodeToString(dataBytes)
  312. case "bytes", "binary":
  313. // 不需要进行转换
  314. return dataBytes
  315. case "utf8", "utf-8", "":
  316. // 将数据转换为 UTF-8 编码格式
  317. return string(dataBytes)
  318. default:
  319. panic(Error(vm, fmt.Errorf("unsupported output format: %s", toFormat)))
  320. }
  321. }
  322. func cryptoModule(vm *goja.Runtime, module *goja.Object) {
  323. cryto := Crypto{
  324. vm: vm,
  325. }
  326. o := module.Get("exports").(*goja.Object)
  327. o.Set("createCipheriv", cryto.CreateCipheriv)
  328. o.Set("createDecipheriv", cryto.CreateDecipheriv)
  329. o.Set("createHash", cryto.CreateHash)
  330. o.Set("createHmac", cryto.CreateHmac)
  331. }