-
Notifications
You must be signed in to change notification settings - Fork 16
/
md5.go
82 lines (71 loc) · 1.72 KB
/
md5.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
package dynaml
import (
"crypto/md5"
"crypto/sha1"
"crypto/sha256"
"crypto/sha512"
"fmt"
"golang.org/x/crypto/md4"
)
func func_md5(arguments []interface{}, binding Binding) (interface{}, EvaluationInfo, bool) {
info := DefaultInfo()
if len(arguments) != 1 {
return info.Error("md5 takes exactly one argument")
}
str, ok := arguments[0].(string)
if !ok {
return info.Error("first argument for md5 must be a string")
}
result := md5.Sum([]byte(str))
return fmt.Sprintf("%x", result), info, true
}
func func_hash(arguments []interface{}, binding Binding) (interface{}, EvaluationInfo, bool) {
info := DefaultInfo()
if len(arguments) < 1 || len(arguments) > 2 {
return info.Error("hash takes one or two arguments")
}
mode := "sha256"
if len(arguments) == 2 {
str, ok := arguments[1].(string)
if !ok {
return info.Error("second argument for hash must be a string")
}
mode = str
}
str, ok := arguments[0].(string)
if !ok {
return info.Error("first argument for hash must be a string")
}
var result []byte
switch mode {
case "md4":
result = md4.New().Sum([]byte(str))
case "md5":
r := md5.Sum([]byte(str))
result = r[:]
case "sha1":
r := sha1.Sum([]byte(str))
result = r[:]
case "sha224":
r := sha256.Sum224([]byte(str))
result = r[:]
case "sha256":
r := sha256.Sum256([]byte(str))
result = r[:]
case "sha384":
r := sha512.Sum384([]byte(str))
result = r[:]
case "sha512":
r := sha512.Sum512([]byte(str))
result = r[:]
case "sha512/224":
r := sha512.Sum512_224([]byte(str))
result = r[:]
case "sha512/256":
r := sha512.Sum512_256([]byte(str))
result = r[:]
default:
return info.Error("invalid hash type '%s'", mode)
}
return fmt.Sprintf("%x", result), info, true
}