diff --git a/BUILD.bazel b/BUILD.bazel index 57fab29..2575a00 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -33,6 +33,7 @@ go_library( "//internal/parser:go_default_library", "//internal/program:go_default_library", "@io_k8s_sigs_yaml//:go_default_library", + "@org_golang_x_crypto//sha3:go_default_library", ], ) diff --git a/ast/BUILD.bazel b/ast/BUILD.bazel index fe6fd87..be8a578 100644 --- a/ast/BUILD.bazel +++ b/ast/BUILD.bazel @@ -1,4 +1,4 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") +load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") go_library( name = "go_default_library", @@ -13,3 +13,9 @@ go_library( importpath = "github.com/google/go-jsonnet/ast", visibility = ["//visibility:public"], ) + +go_test( + name = "go_default_test", + srcs = ["util_test.go"], + embed = [":go_default_library"], +) diff --git a/bazel/deps.bzl b/bazel/deps.bzl index 38279a9..571dedf 100644 --- a/bazel/deps.bzl +++ b/bazel/deps.bzl @@ -21,10 +21,10 @@ def jsonnet_go_dependencies(go_sdk_version = "host"): ) go_repository( name = "com_github_fatih_color", + build_external = "external", importpath = "github.com/fatih/color", sum = "h1:mRhaKNwANqRgUBGKmnI5ZxEk7QXmjQeCcuYFMX2bfcc=", version = "v1.12.0", - build_external = "external", ) go_repository( @@ -47,17 +47,17 @@ def jsonnet_go_dependencies(go_sdk_version = "host"): ) go_repository( name = "com_github_mattn_go_colorable", + build_external = "external", importpath = "github.com/mattn/go-colorable", sum = "h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8=", version = "v0.1.8", - build_external = "external", ) go_repository( name = "com_github_mattn_go_isatty", + build_external = "external", importpath = "github.com/mattn/go-isatty", sum = "h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=", version = "v0.0.12", - build_external = "external", ) go_repository( name = "com_github_pmezard_go_difflib", @@ -101,9 +101,34 @@ def jsonnet_go_dependencies(go_sdk_version = "host"): sum = "h1:4A07+ZFc2wgJwo8YNlQpr1rVlgUDlxXHhPJciaPY5gs=", version = "v1.1.0", ) + go_repository( + name = "org_golang_x_crypto", + importpath = "golang.org/x/crypto", + sum = "h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g=", + version = "v0.9.0", + ) + go_repository( + name = "org_golang_x_net", + importpath = "golang.org/x/net", + sum = "h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M=", + version = "v0.10.0", + ) + go_repository( name = "org_golang_x_sys", importpath = "golang.org/x/sys", - sum = "h1:kunALQeHf1/185U1i0GOB/fy1IPRDDpuoOOqRReG57U=", - version = "v0.1.0", + sum = "h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU=", + version = "v0.8.0", + ) + go_repository( + name = "org_golang_x_term", + importpath = "golang.org/x/term", + sum = "h1:n5xxQn2i3PC0yLAbjTpNT85q/Kgzcr2gIoX9OrJUols=", + version = "v0.8.0", + ) + go_repository( + name = "org_golang_x_text", + importpath = "golang.org/x/text", + sum = "h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE=", + version = "v0.9.0", ) diff --git a/builtins.go b/builtins.go index b25ec6a..6373414 100644 --- a/builtins.go +++ b/builtins.go @@ -19,6 +19,9 @@ package jsonnet import ( "bytes" "crypto/md5" + "crypto/sha1" + "crypto/sha256" + "crypto/sha512" "encoding/base64" "encoding/hex" "encoding/json" @@ -31,6 +34,7 @@ import ( "strings" "github.com/google/go-jsonnet/ast" + "golang.org/x/crypto/sha3" ) func builtinPlus(i *interpreter, x, y value) (value, error) { @@ -916,6 +920,42 @@ func builtinMd5(i *interpreter, x value) (value, error) { return makeValueString(hex.EncodeToString(hash[:])), nil } +func builtinSha1(i *interpreter, x value) (value, error) { + str, err := i.getString(x) + if err != nil { + return nil, err + } + hash := sha1.Sum([]byte(str.getGoString())) + return makeValueString(hex.EncodeToString(hash[:])), nil +} + +func builtinSha256(i *interpreter, x value) (value, error) { + str, err := i.getString(x) + if err != nil { + return nil, err + } + hash := sha256.Sum256([]byte(str.getGoString())) + return makeValueString(hex.EncodeToString(hash[:])), nil +} + +func builtinSha512(i *interpreter, x value) (value, error) { + str, err := i.getString(x) + if err != nil { + return nil, err + } + hash := sha512.Sum512([]byte(str.getGoString())) + return makeValueString(hex.EncodeToString(hash[:])), nil +} + +func builtinSha3(i *interpreter, x value) (value, error) { + str, err := i.getString(x) + if err != nil { + return nil, err + } + hash := sha3.Sum512([]byte(str.getGoString())) + return makeValueString(hex.EncodeToString(hash[:])), nil +} + func builtinBase64(i *interpreter, input value) (value, error) { var byteArr []byte @@ -2406,6 +2446,10 @@ var funcBuiltins = buildBuiltinMap([]builtin{ &binaryBuiltin{name: "pow", function: builtinPow, params: ast.Identifiers{"x", "n"}}, &binaryBuiltin{name: "modulo", function: builtinModulo, params: ast.Identifiers{"x", "y"}}, &unaryBuiltin{name: "md5", function: builtinMd5, params: ast.Identifiers{"s"}}, + &unaryBuiltin{name: "sha1", function: builtinSha1, params: ast.Identifiers{"s"}}, + &unaryBuiltin{name: "sha256", function: builtinSha256, params: ast.Identifiers{"s"}}, + &unaryBuiltin{name: "sha512", function: builtinSha512, params: ast.Identifiers{"s"}}, + &unaryBuiltin{name: "sha3", function: builtinSha3, params: ast.Identifiers{"s"}}, &binaryBuiltin{name: "xnor", function: builtinXnor, params: ast.Identifiers{"x", "y"}}, &binaryBuiltin{name: "xor", function: builtinXor, params: ast.Identifiers{"x", "y"}}, &binaryBuiltin{name: "lstripChars", function: builtinLstripChars, params: ast.Identifiers{"str", "chars"}}, diff --git a/c-bindings/BUILD.bazel b/c-bindings/BUILD.bazel index 2143112..4fe6805 100644 --- a/c-bindings/BUILD.bazel +++ b/c-bindings/BUILD.bazel @@ -22,7 +22,7 @@ go_library( ], cgo = True, copts = ["-Wall -Icpp-jsonnet/include"], # keep - cxxopts = ["-std=c++11"], + cxxopts = ["-std=c++11 -Wall -Icpp-jsonnet/include"], importpath = "github.com/google/go-jsonnet/c-bindings", visibility = ["//visibility:private"], deps = [ diff --git a/cmd/wasm/BUILD.bazel b/cmd/wasm/BUILD.bazel index 9b56352..d05405b 100644 --- a/cmd/wasm/BUILD.bazel +++ b/cmd/wasm/BUILD.bazel @@ -2,15 +2,16 @@ load("@io_bazel_rules_go//go:def.bzl", "go_binary", "go_library") go_library( name = "go_default_library", - srcs = [ - "main.go", - ], + srcs = ["main.go"], importpath = "github.com/google/go-jsonnet/cmd/wasm", visibility = ["//visibility:private"], - deps = [ - "//:go_default_library", - "//internal/formatter:go_default_library", - ], + deps = select({ + "@io_bazel_rules_go//go/platform:js_wasm": [ + "//:go_default_library", + "//internal/formatter:go_default_library", + ], + "//conditions:default": [], + }), ) go_binary( diff --git a/go.mod b/go.mod index 998edea..afcd087 100644 --- a/go.mod +++ b/go.mod @@ -11,6 +11,7 @@ require ( require ( github.com/mattn/go-colorable v0.1.8 // indirect github.com/mattn/go-isatty v0.0.12 // indirect - golang.org/x/sys v0.1.0 // indirect + golang.org/x/crypto v0.9.0 // indirect + golang.org/x/sys v0.8.0 // indirect gopkg.in/yaml.v2 v2.2.7 // indirect ) diff --git a/go.sum b/go.sum index c2a65c6..31600e7 100644 --- a/go.sum +++ b/go.sum @@ -19,10 +19,14 @@ github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNX github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g= +golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.1.0 h1:kunALQeHf1/185U1i0GOB/fy1IPRDDpuoOOqRReG57U= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/linter/internal/types/stdlib.go b/linter/internal/types/stdlib.go index cb1f835..0646e57 100644 --- a/linter/internal/types/stdlib.go +++ b/linter/internal/types/stdlib.go @@ -169,6 +169,10 @@ func prepareStdlib(g *typeGraph) { "base64DecodeBytes": g.newSimpleFuncType(numberType, "str"), "base64Decode": g.newSimpleFuncType(stringType, "str"), "md5": g.newSimpleFuncType(stringType, "s"), + "sha1": g.newSimpleFuncType(stringType, "s"), + "sha256": g.newSimpleFuncType(stringType, "s"), + "sha512": g.newSimpleFuncType(stringType, "s"), + "sha3": g.newSimpleFuncType(stringType, "s"), // JSON Merge Patch diff --git a/testdata/builtinSha1.golden b/testdata/builtinSha1.golden new file mode 100644 index 0000000..7053481 --- /dev/null +++ b/testdata/builtinSha1.golden @@ -0,0 +1 @@ +"0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33" diff --git a/testdata/builtinSha1.jsonnet b/testdata/builtinSha1.jsonnet new file mode 100644 index 0000000..5bc64cd --- /dev/null +++ b/testdata/builtinSha1.jsonnet @@ -0,0 +1 @@ +std.sha1("foo") \ No newline at end of file diff --git a/testdata/builtinSha1.linter.golden b/testdata/builtinSha1.linter.golden new file mode 100644 index 0000000..e69de29 diff --git a/testdata/builtinSha256.golden b/testdata/builtinSha256.golden new file mode 100644 index 0000000..46baa60 --- /dev/null +++ b/testdata/builtinSha256.golden @@ -0,0 +1 @@ +"2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae" diff --git a/testdata/builtinSha256.jsonnet b/testdata/builtinSha256.jsonnet new file mode 100644 index 0000000..6180055 --- /dev/null +++ b/testdata/builtinSha256.jsonnet @@ -0,0 +1 @@ +std.sha256("foo") \ No newline at end of file diff --git a/testdata/builtinSha256.linter.golden b/testdata/builtinSha256.linter.golden new file mode 100644 index 0000000..e69de29 diff --git a/testdata/builtinSha3.golden b/testdata/builtinSha3.golden new file mode 100644 index 0000000..9efbf3e --- /dev/null +++ b/testdata/builtinSha3.golden @@ -0,0 +1 @@ +"4bca2b137edc580fe50a88983ef860ebaca36c857b1f492839d6d7392452a63c82cbebc68e3b70a2a1480b4bb5d437a7cba6ecf9d89f9ff3ccd14cd6146ea7e7" diff --git a/testdata/builtinSha3.jsonnet b/testdata/builtinSha3.jsonnet new file mode 100644 index 0000000..31decf6 --- /dev/null +++ b/testdata/builtinSha3.jsonnet @@ -0,0 +1 @@ +std.sha3("foo") \ No newline at end of file diff --git a/testdata/builtinSha3.linter.golden b/testdata/builtinSha3.linter.golden new file mode 100644 index 0000000..e69de29 diff --git a/testdata/builtinSha512.golden b/testdata/builtinSha512.golden new file mode 100644 index 0000000..7d4f2d9 --- /dev/null +++ b/testdata/builtinSha512.golden @@ -0,0 +1 @@ +"f7fbba6e0636f890e56fbbf3283e524c6fa3204ae298382d624741d0dc6638326e282c41be5e4254d8820772c5518a2c5a8c0c7f7eda19594a7eb539453e1ed7" diff --git a/testdata/builtinSha512.jsonnet b/testdata/builtinSha512.jsonnet new file mode 100644 index 0000000..0a8b7ad --- /dev/null +++ b/testdata/builtinSha512.jsonnet @@ -0,0 +1 @@ +std.sha512("foo") \ No newline at end of file diff --git a/testdata/builtinSha512.linter.golden b/testdata/builtinSha512.linter.golden new file mode 100644 index 0000000..e69de29