116 lines
2.1 KiB
Go
116 lines
2.1 KiB
Go
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
|
|
//go:build script
|
|
// +build script
|
|
|
|
package js
|
|
|
|
import (
|
|
"crypto/hmac"
|
|
"crypto/md5"
|
|
"crypto/sha1"
|
|
"crypto/sha256"
|
|
"crypto/sha512"
|
|
"errors"
|
|
"fmt"
|
|
teaconst "github.com/TeaOSLab/EdgeNode/internal/const"
|
|
"hash"
|
|
)
|
|
|
|
func init() {
|
|
if !teaconst.IsMain {
|
|
return
|
|
}
|
|
|
|
SharedLibraryManager.Register(&JSHMACCryptoLibrary{})
|
|
}
|
|
|
|
type JSHMACCryptoLibrary struct {
|
|
JSBaseLibrary
|
|
}
|
|
|
|
func (this *JSHMACCryptoLibrary) JSNamespace() string {
|
|
return "gojs.crypto.JSHMACLibrary"
|
|
}
|
|
|
|
func (this *JSHMACCryptoLibrary) JSPrototype() string {
|
|
return `gojs.crypto.HMAC = class {
|
|
#goObjectId
|
|
|
|
constructor(algorithm, key) {
|
|
this.#goObjectId = $this.NewHMAC(algorithm, key)
|
|
}
|
|
|
|
update(data) {
|
|
$this.Update(this.#goObjectId, data)
|
|
}
|
|
|
|
sum() {
|
|
return $this.Sum(this.#goObjectId)
|
|
}
|
|
}`
|
|
}
|
|
|
|
func (this *JSHMACCryptoLibrary) NewHMAC(arguments *FunctionArguments) (any, error) {
|
|
algorithm, ok := arguments.StringAt(0)
|
|
if !ok {
|
|
return nil, errors.New("require hash algorithm")
|
|
}
|
|
|
|
key, ok := arguments.StringAt(1)
|
|
if !ok {
|
|
return nil, errors.New("require hash key")
|
|
}
|
|
|
|
var h hash.Hash
|
|
switch algorithm {
|
|
case "md5":
|
|
h = hmac.New(md5.New, []byte(key))
|
|
case "sha1":
|
|
h = hmac.New(sha1.New, []byte(key))
|
|
case "sha256":
|
|
h = hmac.New(sha256.New, []byte(key))
|
|
case "sha512":
|
|
h = hmac.New(sha512.New, []byte(key))
|
|
default:
|
|
return nil, errors.New("invalid hash algorithm")
|
|
}
|
|
|
|
return arguments.Context().AddGoObject(h), nil
|
|
}
|
|
|
|
func (this *JSHMACCryptoLibrary) Update(arguments *FunctionArguments) (any, error) {
|
|
obj, ok := arguments.GoObjectAt(0)
|
|
if !ok {
|
|
return nil, ErrGoObjectNotFound
|
|
}
|
|
|
|
data, ok := arguments.FormatStringAt(1)
|
|
if !ok {
|
|
return nil, errors.New("invalid data")
|
|
}
|
|
|
|
h, ok := obj.(hash.Hash)
|
|
if !ok {
|
|
return nil, errors.New("invalid hash")
|
|
}
|
|
|
|
h.Reset()
|
|
h.Write([]byte(data))
|
|
|
|
return nil, nil
|
|
}
|
|
|
|
func (this *JSHMACCryptoLibrary) Sum(arguments *FunctionArguments) (any, error) {
|
|
obj, ok := arguments.GoObjectAt(0)
|
|
if !ok {
|
|
return nil, ErrGoObjectNotFound
|
|
}
|
|
|
|
h, ok := obj.(hash.Hash)
|
|
if !ok {
|
|
return nil, errors.New("invalid hash")
|
|
}
|
|
|
|
return fmt.Sprintf("%x", h.Sum(nil)), nil
|
|
}
|