diff --git a/.image.env b/.image.env index 7312f84861..8b3590941d 100644 --- a/.image.env +++ b/.image.env @@ -1,8 +1,8 @@ # Generated file, do not modify. This file is generated from a text file containing a list of images. The # most recent tag is interpolated from the source repository and used to generate a fully qualified image # name. -MINIO_TAG='0.20241013.133411-r0' -RQLITE_TAG='8.32.4-r0' +MINIO_TAG='0.20241029.160148-r0' +RQLITE_TAG='8.32.5-r0' DEX_TAG='2.41.1-r1' SCHEMAHERO_TAG='0.17.10' LVP_TAG='v0.6.7' \ No newline at end of file diff --git a/Makefile b/Makefile index 0d3c945ccc..d73c8b4f93 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ include Makefile.build.mk CURRENT_USER := $(shell id -u -n) -MINIO_TAG ?= 0.20241013.133411-r0 -RQLITE_TAG ?= 8.32.4-r0 +MINIO_TAG ?= 0.20241029.160148-r0 +RQLITE_TAG ?= 8.32.5-r0 DEX_TAG ?= 2.41.1-r1 LVP_TAG ?= v0.6.7 PACT_PUBLISH_CONTRACT ?= false diff --git a/go.mod b/go.mod index 30e8087cd7..b2c2f1e007 100644 --- a/go.mod +++ b/go.mod @@ -20,7 +20,7 @@ require ( github.com/distribution/reference v0.6.0 github.com/docker/go-units v0.5.0 github.com/drone/envsubst/v2 v2.0.0-20210730161058-179042472c46 - github.com/fatih/color v1.17.0 + github.com/fatih/color v1.18.0 github.com/ghodss/yaml v1.0.0 github.com/go-git/go-git/v5 v5.12.0 github.com/go-logfmt/logfmt v0.6.0 @@ -52,7 +52,7 @@ require ( github.com/replicatedhq/embedded-cluster/kinds v1.15.0 github.com/replicatedhq/kotskinds v0.0.0-20240718194123-1018dd404e95 github.com/replicatedhq/kurlkinds v1.5.0 - github.com/replicatedhq/troubleshoot v0.107.4 + github.com/replicatedhq/troubleshoot v0.107.5 github.com/replicatedhq/yaml/v3 v3.0.0-beta5-replicatedhq github.com/robfig/cron v1.2.0 github.com/robfig/cron/v3 v3.0.1 @@ -380,7 +380,7 @@ require ( gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/square/go-jose.v2 v2.6.0 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect - k8s.io/apiextensions-apiserver v0.31.1 // indirect + k8s.io/apiextensions-apiserver v0.31.2 // indirect k8s.io/apiserver v0.31.2 // indirect k8s.io/component-base v0.31.2 // indirect k8s.io/klog/v2 v2.130.1 // indirect diff --git a/go.sum b/go.sum index 84d0f8e3db..efe35ac5c5 100644 --- a/go.sum +++ b/go.sum @@ -542,8 +542,8 @@ github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d h1:105gxyaGwC github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d/go.mod h1:ZZMPRZwes7CROmyNKgQzC3XPs6L/G2EJLHddWejkmf4= github.com/fatih/color v1.6.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4= -github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI= +github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= +github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= @@ -1350,8 +1350,8 @@ github.com/replicatedhq/kurlkinds v1.5.0 h1:zZ0PKNeh4kXvSzVGkn62DKTo314GxhXg1TSB github.com/replicatedhq/kurlkinds v1.5.0/go.mod h1:rUpBMdC81IhmJNCWMU/uRsMETv9P0xFoMvdSP/TAr5A= github.com/replicatedhq/termui/v3 v3.1.1-0.20200811145416-f40076d26851 h1:eRlNDHxGfVkPCRXbA4BfQJvt5DHjFiTtWy3R/t4djyY= github.com/replicatedhq/termui/v3 v3.1.1-0.20200811145416-f40076d26851/go.mod h1:JDxG6+uubnk9/BZ2yUsyAJJwlptjrnmB2MPF5d2Xe/8= -github.com/replicatedhq/troubleshoot v0.107.4 h1:w6sHGU/Xq5Or7tVNTfMaGZTrqDp2IR7YEWEjooFBDo8= -github.com/replicatedhq/troubleshoot v0.107.4/go.mod h1:6mZzcO/EWVBNXVnFdSHfPaoTnjcQdV3sq61NkBF60YE= +github.com/replicatedhq/troubleshoot v0.107.5 h1:XrJEK8vN3HHEKmFnAe8rSmY+hPw8Fh5dsTMhhEBKQCM= +github.com/replicatedhq/troubleshoot v0.107.5/go.mod h1:QTV4q6TXiCO825IS1GcLzgJu2KHWekXiKdcHCqBJTck= github.com/replicatedhq/yaml/v3 v3.0.0-beta5-replicatedhq h1:PwPggruelq2336c1Ayg5STFqgbn/QB1tWLQwrVlU7ZQ= github.com/replicatedhq/yaml/v3 v3.0.0-beta5-replicatedhq/go.mod h1:Txa7LopbYCU8aRgmNe0n+y/EPMz50NbCPcVVJBquwag= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= @@ -2353,8 +2353,8 @@ k8s.io/api v0.31.2 h1:3wLBbL5Uom/8Zy98GRPXpJ254nEFpl+hwndmk9RwmL0= k8s.io/api v0.31.2/go.mod h1:bWmGvrGPssSK1ljmLzd3pwCQ9MgoTsRCuK35u6SygUk= k8s.io/apiextensions-apiserver v0.0.0-20190918161926-8f644eb6e783/go.mod h1:xvae1SZB3E17UpV59AWc271W/Ph25N+bjPyR63X6tPY= k8s.io/apiextensions-apiserver v0.17.0/go.mod h1:XiIFUakZywkUl54fVXa7QTEHcqQz9HG55nHd1DCoHj8= -k8s.io/apiextensions-apiserver v0.31.1 h1:L+hwULvXx+nvTYX/MKM3kKMZyei+UiSXQWciX/N6E40= -k8s.io/apiextensions-apiserver v0.31.1/go.mod h1:tWMPR3sgW+jsl2xm9v7lAyRF1rYEK71i9G5dRtkknoQ= +k8s.io/apiextensions-apiserver v0.31.2 h1:W8EwUb8+WXBLu56ser5IudT2cOho0gAKeTOnywBLxd0= +k8s.io/apiextensions-apiserver v0.31.2/go.mod h1:i+Geh+nGCJEGiCGR3MlBDkS7koHIIKWVfWeRFiOsUcM= k8s.io/apimachinery v0.0.0-20190913080033-27d36303b655/go.mod h1:nL6pwRT8NgfF8TT68DBI8uEePRt89cSvoXUVqbkWHq4= k8s.io/apimachinery v0.17.0/go.mod h1:b9qmWdKlLuU9EBh+06BtLcSf/Mu89rWL33naRxs1uZg= k8s.io/apimachinery v0.19.0/go.mod h1:DnPGDnARWFvYa3pMHgSxtbZb7gpzzAZ1pTfaUNDVlmA= diff --git a/kurl_proxy/assets/insecure.html b/kurl_proxy/assets/tls-warning.html similarity index 100% rename from kurl_proxy/assets/insecure.html rename to kurl_proxy/assets/tls-warning.html diff --git a/kurl_proxy/assets/welcome.html b/kurl_proxy/assets/welcome.html index 5ecc7d848e..70d12f4243 100644 --- a/kurl_proxy/assets/welcome.html +++ b/kurl_proxy/assets/welcome.html @@ -19,7 +19,7 @@ .replace(/\/$/, ""); var httpsLink = "http:" + rawLink; var opensslLink = rawLink.substring(2).replace("/", ""); - var insecureLink = httpsLink + "/insecure"; + var insecureLink = httpsLink + "/tls-warning";
diff --git a/kurl_proxy/cmd/main.go b/kurl_proxy/cmd/main.go index 4e7810d75c..38df41263c 100644 --- a/kurl_proxy/cmd/main.go +++ b/kurl_proxy/cmd/main.go @@ -275,11 +275,34 @@ func getHttpServer(fingerprint string, acceptAnonymousUploads bool, assetsDir st } appIcon := template.URL(app.Spec.Icon) - htmlPage := "welcome.html" - if c.Request.URL.Path == "/insecure" { - htmlPage = "insecure.html" + c.HTML(http.StatusOK, "welcome.html", gin.H{ + "fingerprintSHA1": fingerprint, + "AppIcon": appIcon, + "AppTitle": app.Spec.Title, + "IsEmbeddedCluster": isEmbeddedCluster(), + }) + }) + r.GET("/tls-warning", func(c *gin.Context) { + if !acceptAnonymousUploads { + log.Println("TLS certs already uploaded, redirecting to https") + target := url.URL{ + Scheme: "https", + Host: c.Request.Host, + Path: c.Request.URL.Path, + RawQuery: c.Request.URL.RawQuery, + } + // Returns StatusFound (302) to avoid browser caching + c.Redirect(http.StatusFound, target.String()) + return + } + + app, err := kotsadmApplication() + + if err != nil { + log.Printf("No kotsadm application metadata: %v", err) // continue } - c.HTML(http.StatusOK, htmlPage, gin.H{ + appIcon := template.URL(app.Spec.Icon) + c.HTML(http.StatusOK, "tls-warning.html", gin.H{ "fingerprintSHA1": fingerprint, "AppIcon": appIcon, "AppTitle": app.Spec.Title, diff --git a/pkg/docker/registry/temp_registry.go b/pkg/docker/registry/temp_registry.go index 6665a890ba..8715189405 100644 --- a/pkg/docker/registry/temp_registry.go +++ b/pkg/docker/registry/temp_registry.go @@ -1,6 +1,7 @@ package registry import ( + "bytes" _ "embed" "fmt" "io/ioutil" @@ -65,7 +66,11 @@ func (r *TempRegistry) Start(rootDir string) (finalError error) { // - We can't directly run the official docker registry binary because it doesn't necessarily exist when pushing images from the host. // - We need to be able to control stdout and stderr and stop the process later, but the registry go module doesn't give control over that. // - The KOTS CLI binary exists inside the kotsadm pod and/or will be used to push images from the host. + var stdout, stderr bytes.Buffer cmd := exec.Command(kotsutil.GetKOTSBinPath(), "docker-registry", "serve", configFile.Name()) + cmd.Stdout = &stdout + cmd.Stderr = &stderr + cmd.Env = []string{} // ignore env vars because they may override the config if err := cmd.Start(); err != nil { return errors.Wrap(err, "failed to start") } @@ -77,7 +82,7 @@ func (r *TempRegistry) Start(rootDir string) (finalError error) { r.port = freePort if err := r.WaitForReady(time.Second * 30); err != nil { - return errors.Wrap(err, "failed to wait for registry to become ready") + return errors.Wrapf(err, "failed to wait for registry to become ready\nstdout: %s\nstderr: %s", stdout.String(), stderr.String()) } return nil diff --git a/pkg/image/constants.go b/pkg/image/constants.go index 4d949ec746..aff6320d50 100644 --- a/pkg/image/constants.go +++ b/pkg/image/constants.go @@ -5,8 +5,8 @@ package image // image name. const ( - Minio = "kotsadm/minio:0.20241013.133411-r0" - Rqlite = "kotsadm/rqlite:8.32.4-r0" + Minio = "kotsadm/minio:0.20241029.160148-r0" + Rqlite = "kotsadm/rqlite:8.32.5-r0" Dex = "kotsadm/dex:2.41.1-r1" Schemahero = "schemahero/schemahero:0.17.10" Lvp = "replicated/local-volume-provider:v0.6.7" diff --git a/pkg/supportbundle/defaultspec/spec.yaml b/pkg/supportbundle/defaultspec/spec.yaml index ffb75ba44f..31bf58ac3f 100644 --- a/pkg/supportbundle/defaultspec/spec.yaml +++ b/pkg/supportbundle/defaultspec/spec.yaml @@ -172,10 +172,6 @@ spec: - app=kotsadm containerPath: /tmp/last-preflight-result containerName: kotsadm - - http: - collectorName: replicated.app-health-check - get: - url: https://replicated.app/healthz analyzers: - clusterVersion: outcomes: @@ -300,16 +296,3 @@ spec: message: No default storage class found - pass: message: Default storage class found - - jsonCompare: - checkName: https://replicated.app host health check - fileName: replicated.app-health-check.json - path: "response.status" - value: "200" - outcomes: - - fail: - when: "false" - message: https://replicated.app is unhealthy. License and software update checks from replicated will fail. If this is locked down environment, please check your proxy settings. - uri: https://kurl.sh/docs/install-with-kurl/proxy-installs - - pass: - when: "true" - message: https://replicated.app host is healthy diff --git a/pkg/supportbundle/execute.go b/pkg/supportbundle/execute.go index cb0f624fca..e2d07c21cd 100644 --- a/pkg/supportbundle/execute.go +++ b/pkg/supportbundle/execute.go @@ -171,11 +171,9 @@ func executeSupportBundleCollectRoutine(bundle *types.SupportBundle, progressCha Namespace: "", ProgressChan: progressChan, Redact: true, - RunHostCollectorsInPod: true, // always run host collectors in pod from KOTS regardless of the spec value } logger.Infof("Executing Collection go routine for support bundle ID: %s", bundle.ID) - logger.Infof("Always run host collectors in pod: %t", opts.RunHostCollectorsInPod) go func() { defer close(progressChan) diff --git a/pkg/supportbundle/spec.go b/pkg/supportbundle/spec.go index af00f1fefa..17a2782343 100644 --- a/pkg/supportbundle/spec.go +++ b/pkg/supportbundle/spec.go @@ -159,15 +159,11 @@ func mergeSupportBundleSpecs(builtBundles map[string]*troubleshootv1beta2.Suppor mergedBundle.Spec.Collectors = append(mergedBundle.Spec.Collectors, builtBundle.Spec.Collectors...) mergedBundle.Spec.Analyzers = append(mergedBundle.Spec.Analyzers, builtBundle.Spec.Analyzers...) mergedBundle.Spec.AfterCollection = append(mergedBundle.Spec.AfterCollection, builtBundle.Spec.AfterCollection...) - mergedBundle.Spec.HostCollectors = append(mergedBundle.Spec.HostCollectors, builtBundle.Spec.HostCollectors...) - mergedBundle.Spec.HostAnalyzers = append(mergedBundle.Spec.HostAnalyzers, builtBundle.Spec.HostAnalyzers...) } - mergedBundle.Spec.Collectors = Dedup(mergedBundle.Spec.Collectors) - mergedBundle.Spec.Analyzers = Dedup(mergedBundle.Spec.Analyzers) - mergedBundle.Spec.AfterCollection = Dedup(mergedBundle.Spec.AfterCollection) - mergedBundle.Spec.HostCollectors = Dedup(mergedBundle.Spec.HostCollectors) - mergedBundle.Spec.HostAnalyzers = Dedup(mergedBundle.Spec.HostAnalyzers) + mergedBundle = deduplicatedCollectors(mergedBundle) + mergedBundle = deduplicatedAnalyzers(mergedBundle) + mergedBundle = deduplicatedAfterCollection(mergedBundle) return mergedBundle } @@ -465,15 +461,11 @@ func addDiscoveredSpecs( supportBundle.Spec.Collectors = append(supportBundle.Spec.Collectors, sbObject.Spec.Collectors...) supportBundle.Spec.Analyzers = append(supportBundle.Spec.Analyzers, sbObject.Spec.Analyzers...) - supportBundle.Spec.HostCollectors = append(supportBundle.Spec.HostCollectors, sbObject.Spec.HostCollectors...) - supportBundle.Spec.HostAnalyzers = append(supportBundle.Spec.HostAnalyzers, sbObject.Spec.HostAnalyzers...) } - // remove duplicated specs if there are multiple support bundle upstream spec - supportBundle.Spec.Collectors = Dedup(supportBundle.Spec.Collectors) - supportBundle.Spec.Analyzers = Dedup(supportBundle.Spec.Analyzers) - supportBundle.Spec.HostCollectors = Dedup(supportBundle.Spec.HostCollectors) - supportBundle.Spec.HostAnalyzers = Dedup(supportBundle.Spec.HostAnalyzers) + // remove duplicated collectors and analyzers if there are multiple support bundle upstream spec + supportBundle = deduplicatedCollectors(supportBundle) + supportBundle = deduplicatedAnalyzers(supportBundle) return supportBundle } @@ -1253,26 +1245,3 @@ func removeKurlAnalyzers(analyzers []*troubleshootv1beta2.Analyze) []*troublesho return analyze } - -func Dedup[T any](objs []T) []T { - seen := make(map[string]bool) - out := []T{} - - if len(objs) == 0 { - return objs - } - - for _, o := range objs { - data, err := json.Marshal(o) - if err != nil { - out = append(out, o) - continue - } - key := string(data) - if _, ok := seen[key]; !ok { - out = append(out, o) - seen[key] = true - } - } - return out -} diff --git a/pkg/supportbundle/spec_test.go b/pkg/supportbundle/spec_test.go index 0ca623046c..89918af8fb 100644 --- a/pkg/supportbundle/spec_test.go +++ b/pkg/supportbundle/spec_test.go @@ -769,80 +769,3 @@ func createNamespaces(t *testing.T, clientset kubernetes.Interface, namespaces . require.NoError(t, err) } } - -func Test_mergeSupportBundleSpecs(t *testing.T) { - testBundle := &troubleshootv1beta2.SupportBundle{ - Spec: troubleshootv1beta2.SupportBundleSpec{ - Collectors: []*troubleshootv1beta2.Collect{ - { - ClusterResources: &troubleshootv1beta2.ClusterResources{ - CollectorMeta: troubleshootv1beta2.CollectorMeta{CollectorName: "first"}, - }, - }, - { - ClusterResources: &troubleshootv1beta2.ClusterResources{ - CollectorMeta: troubleshootv1beta2.CollectorMeta{CollectorName: "first"}, - }, - }, - { - ClusterResources: &troubleshootv1beta2.ClusterResources{}, - }, - }, - Analyzers: []*troubleshootv1beta2.Analyze{ - { - ClusterVersion: &troubleshootv1beta2.ClusterVersion{ - AnalyzeMeta: troubleshootv1beta2.AnalyzeMeta{CheckName: "first"}, - }, - }, - { - ClusterVersion: &troubleshootv1beta2.ClusterVersion{ - AnalyzeMeta: troubleshootv1beta2.AnalyzeMeta{CheckName: "first"}, - }, - }, - }, - AfterCollection: []*troubleshootv1beta2.AfterCollection{}, - HostCollectors: []*troubleshootv1beta2.HostCollect{ - { - CPU: &troubleshootv1beta2.CPU{}, - Memory: &troubleshootv1beta2.Memory{ - HostCollectorMeta: troubleshootv1beta2.HostCollectorMeta{CollectorName: "first"}, - }, - }, - { - CPU: &troubleshootv1beta2.CPU{}, - Memory: &troubleshootv1beta2.Memory{ - HostCollectorMeta: troubleshootv1beta2.HostCollectorMeta{CollectorName: "first"}, - }, - }, - { - CPU: &troubleshootv1beta2.CPU{}, - Memory: &troubleshootv1beta2.Memory{ - HostCollectorMeta: troubleshootv1beta2.HostCollectorMeta{CollectorName: "second"}, - }, - }, - }, - HostAnalyzers: []*troubleshootv1beta2.HostAnalyze{ - { - CPU: &troubleshootv1beta2.CPUAnalyze{ - AnalyzeMeta: troubleshootv1beta2.AnalyzeMeta{CheckName: "first"}, - }, - }, - { - CPU: &troubleshootv1beta2.CPUAnalyze{ - AnalyzeMeta: troubleshootv1beta2.AnalyzeMeta{CheckName: "first"}, - }, - }, - }, - }, - } - - builtBundles := map[string]*troubleshootv1beta2.SupportBundle{ - "first": testBundle, - } - merged := mergeSupportBundleSpecs(builtBundles) - - assert.Equal(t, 2, len(merged.Spec.Collectors)) - assert.Equal(t, 1, len(merged.Spec.Analyzers)) - assert.Equal(t, 2, len(merged.Spec.HostCollectors)) - assert.Equal(t, 1, len(merged.Spec.HostAnalyzers)) -} diff --git a/pkg/supportbundle/staticspecs/defaultspec.yaml b/pkg/supportbundle/staticspecs/defaultspec.yaml index 74e0fbf41f..58e3a25744 100644 --- a/pkg/supportbundle/staticspecs/defaultspec.yaml +++ b/pkg/supportbundle/staticspecs/defaultspec.yaml @@ -92,10 +92,6 @@ spec: containerPath: /tmp/last-preflight-result containerName: kotsadm - nodeMetrics: {} - - http: - collectorName: replicated.app-health-check - get: - url: https://replicated.app/healthz analyzers: - clusterVersion: outcomes: @@ -172,16 +168,3 @@ spec: message: No default storage class found - pass: message: Default storage class found - - jsonCompare: - checkName: https://replicated.app host health check - fileName: replicated.app-health-check.json - path: "response.status" - value: "200" - outcomes: - - fail: - when: "false" - message: https://replicated.app is unhealthy. License and software update checks from replicated will fail. If this is locked down environment, please check your proxy settings. - uri: https://kurl.sh/docs/install-with-kurl/proxy-installs - - pass: - when: "true" - message: https://replicated.app host is healthy diff --git a/pkg/supportbundle/supportbundle.go b/pkg/supportbundle/supportbundle.go index 3dace009f5..0584fe1278 100644 --- a/pkg/supportbundle/supportbundle.go +++ b/pkg/supportbundle/supportbundle.go @@ -155,7 +155,7 @@ func CreateSupportBundleDependencies(app *apptypes.App, sequence int64, opts typ URI: GetSpecURI(app.GetSlug()), RedactURIs: redactURIs, Progress: types.SupportBundleProgress{ - CollectorCount: len(supportBundle.Spec.Collectors) + len(supportBundle.Spec.HostCollectors), + CollectorCount: len(supportBundle.Spec.Collectors), }, } diff --git a/web/yarn.lock b/web/yarn.lock index 84c951ad65..8ab6ae3138 100644 --- a/web/yarn.lock +++ b/web/yarn.lock @@ -8275,9 +8275,9 @@ electron-to-chromium@^1.5.4: integrity sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q== elliptic@^6.5.3, elliptic@^6.5.4: - version "6.5.7" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.7.tgz#8ec4da2cb2939926a1b9a73619d768207e647c8b" - integrity sha512-ESVCtTwiA+XhY3wyh24QqRGBoP3rEdDUl3EDUUo9tft074fi19IrdpH7hLCMMP3CIj7jb3W96rn8lt/BqIlt5Q== + version "6.6.0" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.6.0.tgz#5919ec723286c1edf28685aa89261d4761afa210" + integrity sha512-dpwoQcLc/2WLQvJvLRHKZ+f9FgOdjnq11rurqwekGQygGPsYSK29OMMD2WalatiqQ+XGFDglTNixpPfI+lpaAA== dependencies: bn.js "^4.11.9" brorand "^1.1.0"