mirror of
https://github.com/minio/minio.git
synced 2024-12-24 22:25:54 -05:00
Update minio-go dependencies to latest 5.0.0 release (#5640)
With following changes - Add SSE and refactor encryption API (#942) <Andreas Auernhammer> - add copyObject test changing metadata and preserving etag (#944) <Harshavardhana> - Add SSE-C tests for multipart, copy, get range operations (#941) <Harshavardhana> - Removing conditional check for notificationInfoCh in api-notication (#940) <Matthew Magaldi> - Honor prefix parameter in ListBucketPolicies API (#929) <kannappanr> - test for empty objects uploaded with SSE-C headers (#927) <kannappanr> - Encryption headers should also be set during initMultipart (#930) <Harshavardhana> - Add support for Content-Language metadata header (#928) <kannappanr> - Fix check for duplicate notification configuration entries (#917) <kannappanr> - allow OS to cleanup sockets in TIME_WAIT (#925) <Harshavardhana> - Sign V2: Fix signature calculation in virtual host style (#921) <A. Elleuch> - bucket policy: Support json string in Principal field (#919) <A. Elleuch> - Fix copyobject failure for empty files (#918) <kannappanr> - Add new constructor NewWithOptions to SDK (#915) <poornas> - Support redirect headers to sign again with new Host header. (#829) <Harshavardhana> - Fail in PutObject if invalid user metadata is passed <Harshavadhana> - PutObjectOptions Header: Don't include invalid header <Isaac Hess> - increase max retry count to 10 (#913) <poornas> - Add new regions for Paris and China west. (#905) <Harshavardhana> - fix s3signer to use req.Host header (#899) <Bartłomiej Nogaś>
This commit is contained in:
parent
5dc5e4928c
commit
4af89543cf
@ -21,7 +21,7 @@ import (
|
|||||||
"path/filepath"
|
"path/filepath"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
homedir "github.com/minio/go-homedir"
|
homedir "github.com/mitchellh/go-homedir"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Minio Cloud Storage, (C) 2017 Minio, Inc.
|
* Minio Cloud Storage, (C) 2017, 2018 Minio, Inc.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -968,7 +968,7 @@ func (a *azureObjects) CompleteMultipartUpload(bucket, object, uploadID string,
|
|||||||
func (a *azureObjects) SetBucketPolicy(bucket string, policyInfo policy.BucketAccessPolicy) error {
|
func (a *azureObjects) SetBucketPolicy(bucket string, policyInfo policy.BucketAccessPolicy) error {
|
||||||
var policies []minio.BucketAccessPolicy
|
var policies []minio.BucketAccessPolicy
|
||||||
|
|
||||||
for prefix, policy := range policy.GetPolicies(policyInfo.Statements, bucket) {
|
for prefix, policy := range policy.GetPolicies(policyInfo.Statements, bucket, "") {
|
||||||
policies = append(policies, minio.BucketAccessPolicy{
|
policies = append(policies, minio.BucketAccessPolicy{
|
||||||
Prefix: prefix,
|
Prefix: prefix,
|
||||||
Policy: policy,
|
Policy: policy,
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Minio Cloud Storage, (C) 2017 Minio, Inc.
|
* Minio Cloud Storage, (C) 2017, 2018 Minio, Inc.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -690,7 +690,7 @@ func (l *b2Objects) CompleteMultipartUpload(bucket string, object string, upload
|
|||||||
func (l *b2Objects) SetBucketPolicy(bucket string, policyInfo policy.BucketAccessPolicy) error {
|
func (l *b2Objects) SetBucketPolicy(bucket string, policyInfo policy.BucketAccessPolicy) error {
|
||||||
var policies []minio.BucketAccessPolicy
|
var policies []minio.BucketAccessPolicy
|
||||||
|
|
||||||
for prefix, policy := range policy.GetPolicies(policyInfo.Statements, bucket) {
|
for prefix, policy := range policy.GetPolicies(policyInfo.Statements, bucket, "") {
|
||||||
policies = append(policies, minio.BucketAccessPolicy{
|
policies = append(policies, minio.BucketAccessPolicy{
|
||||||
Prefix: prefix,
|
Prefix: prefix,
|
||||||
Policy: policy,
|
Policy: policy,
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Minio Cloud Storage, (C) 2017 Minio, Inc.
|
* Minio Cloud Storage, (C) 2017, 2018 Minio, Inc.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -1049,7 +1049,7 @@ func (l *gcsGateway) CompleteMultipartUpload(bucket string, key string, uploadID
|
|||||||
func (l *gcsGateway) SetBucketPolicy(bucket string, policyInfo policy.BucketAccessPolicy) error {
|
func (l *gcsGateway) SetBucketPolicy(bucket string, policyInfo policy.BucketAccessPolicy) error {
|
||||||
var policies []minio.BucketAccessPolicy
|
var policies []minio.BucketAccessPolicy
|
||||||
|
|
||||||
for prefix, policy := range policy.GetPolicies(policyInfo.Statements, bucket) {
|
for prefix, policy := range policy.GetPolicies(policyInfo.Statements, bucket, "") {
|
||||||
policies = append(policies, minio.BucketAccessPolicy{
|
policies = append(policies, minio.BucketAccessPolicy{
|
||||||
Prefix: prefix,
|
Prefix: prefix,
|
||||||
Policy: policy,
|
Policy: policy,
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Minio Cloud Storage, (C) 2017 Minio, Inc.
|
* Minio Cloud Storage, (C) 2017, 2018 Minio, Inc.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -919,7 +919,7 @@ func (l *ossObjects) CompleteMultipartUpload(bucket, object, uploadID string, up
|
|||||||
// oss.ACLPublicRead: readonly in minio terminology
|
// oss.ACLPublicRead: readonly in minio terminology
|
||||||
// oss.ACLPrivate: none in minio terminology
|
// oss.ACLPrivate: none in minio terminology
|
||||||
func (l *ossObjects) SetBucketPolicy(bucket string, policyInfo policy.BucketAccessPolicy) error {
|
func (l *ossObjects) SetBucketPolicy(bucket string, policyInfo policy.BucketAccessPolicy) error {
|
||||||
bucketPolicies := policy.GetPolicies(policyInfo.Statements, bucket)
|
bucketPolicies := policy.GetPolicies(policyInfo.Statements, bucket, "")
|
||||||
if len(bucketPolicies) != 1 {
|
if len(bucketPolicies) != 1 {
|
||||||
return errors.Trace(minio.NotImplemented{})
|
return errors.Trace(minio.NotImplemented{})
|
||||||
}
|
}
|
||||||
|
@ -1029,7 +1029,7 @@ func preSignV2(req *http.Request, accessKeyID, secretAccessKey string, expires i
|
|||||||
|
|
||||||
// Sign given request using Signature V2.
|
// Sign given request using Signature V2.
|
||||||
func signRequestV2(req *http.Request, accessKey, secretKey string) error {
|
func signRequestV2(req *http.Request, accessKey, secretKey string) error {
|
||||||
req = s3signer.SignV2(*req, accessKey, secretKey)
|
req = s3signer.SignV2(*req, accessKey, secretKey, false)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -767,7 +767,7 @@ func (web *webAPIHandlers) ListAllBucketPolicies(r *http.Request, args *ListAllB
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
reply.UIVersion = browser.UIVersion
|
reply.UIVersion = browser.UIVersion
|
||||||
for prefix, policy := range policy.GetPolicies(policyInfo.Statements, args.BucketName) {
|
for prefix, policy := range policy.GetPolicies(policyInfo.Statements, args.BucketName, "") {
|
||||||
reply.Policies = append(reply.Policies, BucketAccessPolicy{
|
reply.Policies = append(reply.Policies, BucketAccessPolicy{
|
||||||
Prefix: prefix,
|
Prefix: prefix,
|
||||||
Policy: policy,
|
Policy: policy,
|
||||||
|
16
vendor/github.com/minio/go-homedir/README.md
generated
vendored
16
vendor/github.com/minio/go-homedir/README.md
generated
vendored
@ -1,16 +0,0 @@
|
|||||||
# go-homedir
|
|
||||||
|
|
||||||
This is a Go library for detecting the user's home directory without
|
|
||||||
the use of cgo, so the library can be used in cross-compilation environments.
|
|
||||||
|
|
||||||
Usage is incredibly simple, just call `homedir.Dir()` to get the home directory
|
|
||||||
for a user, and `homedir.Expand()` to expand the `~` in a path to the home
|
|
||||||
directory.
|
|
||||||
|
|
||||||
**Why not just use `os/user`?** The built-in `os/user` package is not
|
|
||||||
available on certain architectures such as i386 or PNaCl. Additionally
|
|
||||||
it has a cgo dependency on Darwin systems. This means that any Go code
|
|
||||||
that uses that package cannot cross compile. But 99% of the time the
|
|
||||||
use for `os/user` is just to retrieve the home directory, which we can
|
|
||||||
do for the current user without cgo. This library does that, enabling
|
|
||||||
cross-compilation.
|
|
64
vendor/github.com/minio/go-homedir/dir_posix.go
generated
vendored
64
vendor/github.com/minio/go-homedir/dir_posix.go
generated
vendored
@ -1,64 +0,0 @@
|
|||||||
// +build !windows
|
|
||||||
|
|
||||||
// Copyright 2016 (C) Mitchell Hashimoto
|
|
||||||
// Distributed under the MIT License.
|
|
||||||
|
|
||||||
package homedir
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"errors"
|
|
||||||
"os"
|
|
||||||
"os/exec"
|
|
||||||
"os/user"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
// dir returns the homedir of current user for all POSIX compatible
|
|
||||||
// operating systems.
|
|
||||||
func dir() (string, error) {
|
|
||||||
// First prefer the HOME environmental variable
|
|
||||||
if home := os.Getenv("HOME"); home != "" {
|
|
||||||
return home, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// user.Current is not implemented for i386 and PNaCL like environments.
|
|
||||||
if currUser, err := user.Current(); err == nil {
|
|
||||||
return currUser.HomeDir, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// If that fails, try getent
|
|
||||||
var stdout bytes.Buffer
|
|
||||||
cmd := exec.Command("getent", "passwd", strconv.Itoa(os.Getuid()))
|
|
||||||
cmd.Stdout = &stdout
|
|
||||||
if err := cmd.Run(); err != nil {
|
|
||||||
// If "getent" is missing, ignore it
|
|
||||||
if err == exec.ErrNotFound {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if passwd := strings.TrimSpace(stdout.String()); passwd != "" {
|
|
||||||
// username:password:uid:gid:gecos:home:shell
|
|
||||||
passwdParts := strings.SplitN(passwd, ":", 7)
|
|
||||||
if len(passwdParts) > 5 {
|
|
||||||
return passwdParts[5], nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// If all else fails, try the shell
|
|
||||||
stdout.Reset()
|
|
||||||
cmd = exec.Command("sh", "-c", "cd && pwd")
|
|
||||||
cmd.Stdout = &stdout
|
|
||||||
if err := cmd.Run(); err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
|
|
||||||
result := strings.TrimSpace(stdout.String())
|
|
||||||
if result == "" {
|
|
||||||
return "", errors.New("blank output when reading home directory")
|
|
||||||
}
|
|
||||||
|
|
||||||
return result, nil
|
|
||||||
}
|
|
24
vendor/github.com/minio/go-homedir/dir_windows.go
generated
vendored
24
vendor/github.com/minio/go-homedir/dir_windows.go
generated
vendored
@ -1,24 +0,0 @@
|
|||||||
// Copyright 2016 (C) Mitchell Hashimoto
|
|
||||||
// Distributed under the MIT License.
|
|
||||||
|
|
||||||
package homedir
|
|
||||||
|
|
||||||
import (
|
|
||||||
"errors"
|
|
||||||
"os"
|
|
||||||
)
|
|
||||||
|
|
||||||
// dir returns the homedir of current user for MS Windows OS.
|
|
||||||
func dir() (string, error) {
|
|
||||||
drive := os.Getenv("HOMEDRIVE")
|
|
||||||
path := os.Getenv("HOMEPATH")
|
|
||||||
home := drive + path
|
|
||||||
if drive == "" || path == "" {
|
|
||||||
home = os.Getenv("USERPROFILE")
|
|
||||||
}
|
|
||||||
if home == "" {
|
|
||||||
return "", errors.New("HOMEDRIVE, HOMEPATH, and USERPROFILE are blank")
|
|
||||||
}
|
|
||||||
|
|
||||||
return home, nil
|
|
||||||
}
|
|
68
vendor/github.com/minio/go-homedir/homedir.go
generated
vendored
68
vendor/github.com/minio/go-homedir/homedir.go
generated
vendored
@ -1,68 +0,0 @@
|
|||||||
// Copyright 2016 (C) Mitchell Hashimoto
|
|
||||||
// Distributed under the MIT License.
|
|
||||||
|
|
||||||
// Package homedir implements a portable function to determine current user's homedir.
|
|
||||||
package homedir
|
|
||||||
|
|
||||||
import (
|
|
||||||
"errors"
|
|
||||||
"path/filepath"
|
|
||||||
"sync"
|
|
||||||
)
|
|
||||||
|
|
||||||
// DisableCache will disable caching of the home directory. Caching is enabled
|
|
||||||
// by default.
|
|
||||||
var DisableCache bool
|
|
||||||
|
|
||||||
var homedirCache string
|
|
||||||
var cacheLock sync.Mutex
|
|
||||||
|
|
||||||
// Dir returns the home directory for the executing user.
|
|
||||||
//
|
|
||||||
// This uses an OS-specific method for discovering the home directory.
|
|
||||||
// An error is returned if a home directory cannot be detected.
|
|
||||||
func Dir() (string, error) {
|
|
||||||
cacheLock.Lock()
|
|
||||||
defer cacheLock.Unlock()
|
|
||||||
|
|
||||||
// Return cached homedir if available.
|
|
||||||
if !DisableCache {
|
|
||||||
if homedirCache != "" {
|
|
||||||
return homedirCache, nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Determine OS speific current homedir.
|
|
||||||
result, err := dir()
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Cache for future lookups.
|
|
||||||
homedirCache = result
|
|
||||||
return result, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Expand expands the path to include the home directory if the path
|
|
||||||
// is prefixed with `~`. If it isn't prefixed with `~`, the path is
|
|
||||||
// returned as-is.
|
|
||||||
func Expand(path string) (string, error) {
|
|
||||||
if len(path) == 0 {
|
|
||||||
return path, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
if path[0] != '~' {
|
|
||||||
return path, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(path) > 1 && path[1] != '/' && path[1] != '\\' {
|
|
||||||
return "", errors.New("cannot expand user-specific home dir")
|
|
||||||
}
|
|
||||||
|
|
||||||
dir, err := Dir()
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
|
|
||||||
return filepath.Join(dir, path[1:]), nil
|
|
||||||
}
|
|
114
vendor/github.com/minio/go-homedir/homedir_test.go
generated
vendored
114
vendor/github.com/minio/go-homedir/homedir_test.go
generated
vendored
@ -1,114 +0,0 @@
|
|||||||
package homedir
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"os"
|
|
||||||
"os/user"
|
|
||||||
"testing"
|
|
||||||
)
|
|
||||||
|
|
||||||
func patchEnv(key, value string) func() {
|
|
||||||
bck := os.Getenv(key)
|
|
||||||
deferFunc := func() {
|
|
||||||
os.Setenv(key, bck)
|
|
||||||
}
|
|
||||||
|
|
||||||
os.Setenv(key, value)
|
|
||||||
return deferFunc
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkDir(b *testing.B) {
|
|
||||||
// We do this for any "warmups"
|
|
||||||
for i := 0; i < 10; i++ {
|
|
||||||
Dir()
|
|
||||||
}
|
|
||||||
|
|
||||||
b.ResetTimer()
|
|
||||||
for i := 0; i < b.N; i++ {
|
|
||||||
Dir()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestDir(t *testing.T) {
|
|
||||||
// NOTE: This test is not portable. If user.Current() worked
|
|
||||||
// everywhere, we wouldn't need our package in the first place.
|
|
||||||
u, err := user.Current()
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("err: %s", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
dir, err := Dir()
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("err: %s", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if u.HomeDir != dir {
|
|
||||||
t.Fatalf("%#v != %#v", u.HomeDir, dir)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestExpand(t *testing.T) {
|
|
||||||
u, err := user.Current()
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("err: %s", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
cases := []struct {
|
|
||||||
Input string
|
|
||||||
Output string
|
|
||||||
Err bool
|
|
||||||
}{
|
|
||||||
{
|
|
||||||
"/foo",
|
|
||||||
"/foo",
|
|
||||||
false,
|
|
||||||
},
|
|
||||||
|
|
||||||
{
|
|
||||||
"~/foo",
|
|
||||||
fmt.Sprintf("%s/foo", u.HomeDir),
|
|
||||||
false,
|
|
||||||
},
|
|
||||||
|
|
||||||
{
|
|
||||||
"",
|
|
||||||
"",
|
|
||||||
false,
|
|
||||||
},
|
|
||||||
|
|
||||||
{
|
|
||||||
"~",
|
|
||||||
u.HomeDir,
|
|
||||||
false,
|
|
||||||
},
|
|
||||||
|
|
||||||
{
|
|
||||||
"~foo/foo",
|
|
||||||
"",
|
|
||||||
true,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, tc := range cases {
|
|
||||||
actual, err := Expand(tc.Input)
|
|
||||||
if (err != nil) != tc.Err {
|
|
||||||
t.Fatalf("Input: %#v\n\nErr: %s", tc.Input, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if actual != tc.Output {
|
|
||||||
t.Fatalf("Input: %#v\n\nOutput: %#v", tc.Input, actual)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
DisableCache = true
|
|
||||||
defer func() { DisableCache = false }()
|
|
||||||
defer patchEnv("HOME", "/custom/path/")()
|
|
||||||
expected := "/custom/path/foo/bar"
|
|
||||||
actual, err := Expand("~/foo/bar")
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("No error is expected, got: %v", err)
|
|
||||||
} else if actual != "/custom/path/foo/bar" {
|
|
||||||
t.Errorf("Expected: %v; actual: %v", expected, actual)
|
|
||||||
}
|
|
||||||
}
|
|
12
vendor/github.com/minio/minio-go/Makefile
generated
vendored
12
vendor/github.com/minio/minio-go/Makefile
generated
vendored
@ -1,14 +1,12 @@
|
|||||||
all: checks
|
all: checks
|
||||||
|
|
||||||
checks:
|
checks:
|
||||||
@go get -u github.com/go-ini/ini/...
|
@go get -t ./...
|
||||||
@go get -u github.com/mitchellh/go-homedir/...
|
|
||||||
@go get -u github.com/cheggaaa/pb/...
|
|
||||||
@go get -u github.com/sirupsen/logrus/...
|
|
||||||
@go get -u github.com/dustin/go-humanize/...
|
|
||||||
@go vet ./...
|
@go vet ./...
|
||||||
@SERVER_ENDPOINT=play.minio.io:9000 ACCESS_KEY=Q3AM3UQ867SPQQA43P2F SECRET_KEY=zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG ENABLE_HTTPS=1 go test -race -v ./...
|
@SERVER_ENDPOINT=play.minio.io:9000 ACCESS_KEY=Q3AM3UQ867SPQQA43P2F SECRET_KEY=zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG ENABLE_HTTPS=1 MINT_MODE=full go test -race -v ./...
|
||||||
@SERVER_ENDPOINT=play.minio.io:9000 ACCESS_KEY=Q3AM3UQ867SPQQA43P2F SECRET_KEY=zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG ENABLE_HTTPS=1 go run functional_tests.go
|
@go get github.com/dustin/go-humanize/...
|
||||||
|
@go get github.com/sirupsen/logrus/...
|
||||||
|
@SERVER_ENDPOINT=play.minio.io:9000 ACCESS_KEY=Q3AM3UQ867SPQQA43P2F SECRET_KEY=zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG ENABLE_HTTPS=1 MINT_MODE=full go run functional_tests.go
|
||||||
@mkdir -p /tmp/examples && for i in $(echo examples/s3/*); do go build -o /tmp/examples/$(basename ${i:0:-3}) ${i}; done
|
@mkdir -p /tmp/examples && for i in $(echo examples/s3/*); do go build -o /tmp/examples/$(basename ${i:0:-3}) ${i}; done
|
||||||
@go get -u github.com/a8m/mark/...
|
@go get -u github.com/a8m/mark/...
|
||||||
@go get -u github.com/minio/cli/...
|
@go get -u github.com/minio/cli/...
|
||||||
|
4
vendor/github.com/minio/minio-go/README.md
generated
vendored
4
vendor/github.com/minio/minio-go/README.md
generated
vendored
@ -156,10 +156,6 @@ The full API Reference is available here.
|
|||||||
* [`RemoveObjects`](https://docs.minio.io/docs/golang-client-api-reference#RemoveObjects)
|
* [`RemoveObjects`](https://docs.minio.io/docs/golang-client-api-reference#RemoveObjects)
|
||||||
* [`RemoveIncompleteUpload`](https://docs.minio.io/docs/golang-client-api-reference#RemoveIncompleteUpload)
|
* [`RemoveIncompleteUpload`](https://docs.minio.io/docs/golang-client-api-reference#RemoveIncompleteUpload)
|
||||||
|
|
||||||
### API Reference: Encrypted Object Operations
|
|
||||||
* [`GetEncryptedObject`](https://docs.minio.io/docs/golang-client-api-reference#GetEncryptedObject)
|
|
||||||
* [`PutEncryptedObject`](https://docs.minio.io/docs/golang-client-api-reference#PutEncryptedObject)
|
|
||||||
|
|
||||||
### API Reference : Presigned Operations
|
### API Reference : Presigned Operations
|
||||||
* [`PresignedGetObject`](https://docs.minio.io/docs/golang-client-api-reference#PresignedGetObject)
|
* [`PresignedGetObject`](https://docs.minio.io/docs/golang-client-api-reference#PresignedGetObject)
|
||||||
* [`PresignedPutObject`](https://docs.minio.io/docs/golang-client-api-reference#PresignedPutObject)
|
* [`PresignedPutObject`](https://docs.minio.io/docs/golang-client-api-reference#PresignedPutObject)
|
||||||
|
86
vendor/github.com/minio/minio-go/api-compose-object.go
generated
vendored
86
vendor/github.com/minio/minio-go/api-compose-object.go
generated
vendored
@ -19,7 +19,6 @@ package minio
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"encoding/base64"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
@ -27,58 +26,15 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/minio/minio-go/pkg/encrypt"
|
||||||
"github.com/minio/minio-go/pkg/s3utils"
|
"github.com/minio/minio-go/pkg/s3utils"
|
||||||
)
|
)
|
||||||
|
|
||||||
// SSEInfo - represents Server-Side-Encryption parameters specified by
|
|
||||||
// a user.
|
|
||||||
type SSEInfo struct {
|
|
||||||
key []byte
|
|
||||||
algo string
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewSSEInfo - specifies (binary or un-encoded) encryption key and
|
|
||||||
// algorithm name. If algo is empty, it defaults to "AES256". Ref:
|
|
||||||
// https://docs.aws.amazon.com/AmazonS3/latest/dev/ServerSideEncryptionCustomerKeys.html
|
|
||||||
func NewSSEInfo(key []byte, algo string) SSEInfo {
|
|
||||||
if algo == "" {
|
|
||||||
algo = "AES256"
|
|
||||||
}
|
|
||||||
return SSEInfo{key, algo}
|
|
||||||
}
|
|
||||||
|
|
||||||
// internal method that computes SSE-C headers
|
|
||||||
func (s *SSEInfo) getSSEHeaders(isCopySource bool) map[string]string {
|
|
||||||
if s == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
cs := ""
|
|
||||||
if isCopySource {
|
|
||||||
cs = "copy-source-"
|
|
||||||
}
|
|
||||||
return map[string]string{
|
|
||||||
"x-amz-" + cs + "server-side-encryption-customer-algorithm": s.algo,
|
|
||||||
"x-amz-" + cs + "server-side-encryption-customer-key": base64.StdEncoding.EncodeToString(s.key),
|
|
||||||
"x-amz-" + cs + "server-side-encryption-customer-key-MD5": sumMD5Base64(s.key),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetSSEHeaders - computes and returns headers for SSE-C as key-value
|
|
||||||
// pairs. They can be set as metadata in PutObject* requests (for
|
|
||||||
// encryption) or be set as request headers in `Core.GetObject` (for
|
|
||||||
// decryption).
|
|
||||||
func (s *SSEInfo) GetSSEHeaders() map[string]string {
|
|
||||||
return s.getSSEHeaders(false)
|
|
||||||
}
|
|
||||||
|
|
||||||
// DestinationInfo - type with information about the object to be
|
// DestinationInfo - type with information about the object to be
|
||||||
// created via server-side copy requests, using the Compose API.
|
// created via server-side copy requests, using the Compose API.
|
||||||
type DestinationInfo struct {
|
type DestinationInfo struct {
|
||||||
bucket, object string
|
bucket, object string
|
||||||
|
encryption encrypt.ServerSide
|
||||||
// key for encrypting destination
|
|
||||||
encryption *SSEInfo
|
|
||||||
|
|
||||||
// if no user-metadata is provided, it is copied from source
|
// if no user-metadata is provided, it is copied from source
|
||||||
// (when there is only once source object in the compose
|
// (when there is only once source object in the compose
|
||||||
@ -97,9 +53,7 @@ type DestinationInfo struct {
|
|||||||
// if needed. If nil is passed, and if only a single source (of any
|
// if needed. If nil is passed, and if only a single source (of any
|
||||||
// size) is provided in the ComposeObject call, then metadata from the
|
// size) is provided in the ComposeObject call, then metadata from the
|
||||||
// source is copied to the destination.
|
// source is copied to the destination.
|
||||||
func NewDestinationInfo(bucket, object string, encryptSSEC *SSEInfo,
|
func NewDestinationInfo(bucket, object string, sse encrypt.ServerSide, userMeta map[string]string) (d DestinationInfo, err error) {
|
||||||
userMeta map[string]string) (d DestinationInfo, err error) {
|
|
||||||
|
|
||||||
// Input validation.
|
// Input validation.
|
||||||
if err = s3utils.CheckValidBucketName(bucket); err != nil {
|
if err = s3utils.CheckValidBucketName(bucket); err != nil {
|
||||||
return d, err
|
return d, err
|
||||||
@ -125,7 +79,7 @@ func NewDestinationInfo(bucket, object string, encryptSSEC *SSEInfo,
|
|||||||
return DestinationInfo{
|
return DestinationInfo{
|
||||||
bucket: bucket,
|
bucket: bucket,
|
||||||
object: object,
|
object: object,
|
||||||
encryption: encryptSSEC,
|
encryption: sse,
|
||||||
userMetadata: m,
|
userMetadata: m,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
@ -154,10 +108,8 @@ func (d *DestinationInfo) getUserMetaHeadersMap(withCopyDirectiveHeader bool) ma
|
|||||||
// server-side copying APIs.
|
// server-side copying APIs.
|
||||||
type SourceInfo struct {
|
type SourceInfo struct {
|
||||||
bucket, object string
|
bucket, object string
|
||||||
|
|
||||||
start, end int64
|
start, end int64
|
||||||
|
encryption encrypt.ServerSide
|
||||||
decryptKey *SSEInfo
|
|
||||||
// Headers to send with the upload-part-copy request involving
|
// Headers to send with the upload-part-copy request involving
|
||||||
// this source object.
|
// this source object.
|
||||||
Headers http.Header
|
Headers http.Header
|
||||||
@ -169,12 +121,12 @@ type SourceInfo struct {
|
|||||||
// `decryptSSEC` is the decryption key using server-side-encryption
|
// `decryptSSEC` is the decryption key using server-side-encryption
|
||||||
// with customer provided key. It may be nil if the source is not
|
// with customer provided key. It may be nil if the source is not
|
||||||
// encrypted.
|
// encrypted.
|
||||||
func NewSourceInfo(bucket, object string, decryptSSEC *SSEInfo) SourceInfo {
|
func NewSourceInfo(bucket, object string, sse encrypt.ServerSide) SourceInfo {
|
||||||
r := SourceInfo{
|
r := SourceInfo{
|
||||||
bucket: bucket,
|
bucket: bucket,
|
||||||
object: object,
|
object: object,
|
||||||
start: -1, // range is unspecified by default
|
start: -1, // range is unspecified by default
|
||||||
decryptKey: decryptSSEC,
|
encryption: sse,
|
||||||
Headers: make(http.Header),
|
Headers: make(http.Header),
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -182,8 +134,8 @@ func NewSourceInfo(bucket, object string, decryptSSEC *SSEInfo) SourceInfo {
|
|||||||
r.Headers.Set("x-amz-copy-source", s3utils.EncodePath(bucket+"/"+object))
|
r.Headers.Set("x-amz-copy-source", s3utils.EncodePath(bucket+"/"+object))
|
||||||
|
|
||||||
// Assemble decryption headers for upload-part-copy request
|
// Assemble decryption headers for upload-part-copy request
|
||||||
for k, v := range decryptSSEC.getSSEHeaders(true) {
|
if r.encryption != nil {
|
||||||
r.Headers.Set(k, v)
|
encrypt.SSECopy(r.encryption).Marshal(r.Headers)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r
|
return r
|
||||||
@ -245,10 +197,7 @@ func (s *SourceInfo) getProps(c Client) (size int64, etag string, userMeta map[s
|
|||||||
// Get object info - need size and etag here. Also, decryption
|
// Get object info - need size and etag here. Also, decryption
|
||||||
// headers are added to the stat request if given.
|
// headers are added to the stat request if given.
|
||||||
var objInfo ObjectInfo
|
var objInfo ObjectInfo
|
||||||
opts := StatObjectOptions{}
|
opts := StatObjectOptions{GetObjectOptions{ServerSideEncryption: s.encryption}}
|
||||||
for k, v := range s.decryptKey.getSSEHeaders(false) {
|
|
||||||
opts.Set(k, v)
|
|
||||||
}
|
|
||||||
objInfo, err = c.statObject(context.Background(), s.bucket, s.object, opts)
|
objInfo, err = c.statObject(context.Background(), s.bucket, s.object, opts)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
err = ErrInvalidArgument(fmt.Sprintf("Could not stat object - %s/%s: %v", s.bucket, s.object, err))
|
err = ErrInvalidArgument(fmt.Sprintf("Could not stat object - %s/%s: %v", s.bucket, s.object, err))
|
||||||
@ -476,12 +425,12 @@ func (c Client) ComposeObject(dst DestinationInfo, srcs []SourceInfo) error {
|
|||||||
|
|
||||||
// Single source object case (i.e. when only one source is
|
// Single source object case (i.e. when only one source is
|
||||||
// involved, it is being copied wholly and at most 5GiB in
|
// involved, it is being copied wholly and at most 5GiB in
|
||||||
// size).
|
// size, emptyfiles are also supported).
|
||||||
if totalParts == 1 && srcs[0].start == -1 && totalSize <= maxPartSize {
|
if (totalParts == 1 && srcs[0].start == -1 && totalSize <= maxPartSize) || (totalSize == 0) {
|
||||||
h := srcs[0].Headers
|
h := srcs[0].Headers
|
||||||
// Add destination encryption headers
|
// Add destination encryption headers
|
||||||
for k, v := range dst.encryption.getSSEHeaders(false) {
|
if dst.encryption != nil {
|
||||||
h.Set(k, v)
|
dst.encryption.Marshal(h)
|
||||||
}
|
}
|
||||||
|
|
||||||
// If no user metadata is specified (and so, the
|
// If no user metadata is specified (and so, the
|
||||||
@ -527,7 +476,8 @@ func (c Client) ComposeObject(dst DestinationInfo, srcs []SourceInfo) error {
|
|||||||
for k, v := range metaMap {
|
for k, v := range metaMap {
|
||||||
metaHeaders[k] = v
|
metaHeaders[k] = v
|
||||||
}
|
}
|
||||||
uploadID, err := c.newUploadID(ctx, dst.bucket, dst.object, PutObjectOptions{UserMetadata: metaHeaders})
|
|
||||||
|
uploadID, err := c.newUploadID(ctx, dst.bucket, dst.object, PutObjectOptions{ServerSideEncryption: dst.encryption, UserMetadata: metaHeaders})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -538,8 +488,8 @@ func (c Client) ComposeObject(dst DestinationInfo, srcs []SourceInfo) error {
|
|||||||
for i, src := range srcs {
|
for i, src := range srcs {
|
||||||
h := src.Headers
|
h := src.Headers
|
||||||
// Add destination encryption headers
|
// Add destination encryption headers
|
||||||
for k, v := range dst.encryption.getSSEHeaders(false) {
|
if dst.encryption != nil {
|
||||||
h.Set(k, v)
|
dst.encryption.Marshal(h)
|
||||||
}
|
}
|
||||||
|
|
||||||
// calculate start/end indices of parts after
|
// calculate start/end indices of parts after
|
||||||
|
13
vendor/github.com/minio/minio-go/api-get-object-file.go
generated
vendored
13
vendor/github.com/minio/minio-go/api-get-object-file.go
generated
vendored
@ -18,14 +18,11 @@
|
|||||||
package minio
|
package minio
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"io"
|
"io"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
|
||||||
"github.com/minio/minio-go/pkg/encrypt"
|
|
||||||
|
|
||||||
"context"
|
|
||||||
|
|
||||||
"github.com/minio/minio-go/pkg/s3utils"
|
"github.com/minio/minio-go/pkg/s3utils"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -40,14 +37,6 @@ func (c Client) FGetObject(bucketName, objectName, filePath string, opts GetObje
|
|||||||
return c.fGetObjectWithContext(context.Background(), bucketName, objectName, filePath, opts)
|
return c.fGetObjectWithContext(context.Background(), bucketName, objectName, filePath, opts)
|
||||||
}
|
}
|
||||||
|
|
||||||
// FGetEncryptedObject - Decrypt and store an object at filePath.
|
|
||||||
func (c Client) FGetEncryptedObject(bucketName, objectName, filePath string, materials encrypt.Materials) error {
|
|
||||||
if materials == nil {
|
|
||||||
return ErrInvalidArgument("Unable to recognize empty encryption properties")
|
|
||||||
}
|
|
||||||
return c.FGetObject(bucketName, objectName, filePath, GetObjectOptions{Materials: materials})
|
|
||||||
}
|
|
||||||
|
|
||||||
// fGetObjectWithContext - fgetObject wrapper function with context
|
// fGetObjectWithContext - fgetObject wrapper function with context
|
||||||
func (c Client) fGetObjectWithContext(ctx context.Context, bucketName, objectName, filePath string, opts GetObjectOptions) error {
|
func (c Client) fGetObjectWithContext(ctx context.Context, bucketName, objectName, filePath string, opts GetObjectOptions) error {
|
||||||
// Input validation.
|
// Input validation.
|
||||||
|
37
vendor/github.com/minio/minio-go/api-get-object.go
generated
vendored
37
vendor/github.com/minio/minio-go/api-get-object.go
generated
vendored
@ -27,20 +27,9 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/minio/minio-go/pkg/encrypt"
|
|
||||||
"github.com/minio/minio-go/pkg/s3utils"
|
"github.com/minio/minio-go/pkg/s3utils"
|
||||||
)
|
)
|
||||||
|
|
||||||
// GetEncryptedObject deciphers and streams data stored in the server after applying a specified encryption materials,
|
|
||||||
// returned stream should be closed by the caller.
|
|
||||||
func (c Client) GetEncryptedObject(bucketName, objectName string, encryptMaterials encrypt.Materials) (io.ReadCloser, error) {
|
|
||||||
if encryptMaterials == nil {
|
|
||||||
return nil, ErrInvalidArgument("Unable to recognize empty encryption properties")
|
|
||||||
}
|
|
||||||
|
|
||||||
return c.GetObject(bucketName, objectName, GetObjectOptions{Materials: encryptMaterials})
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetObject - returns an seekable, readable object.
|
// GetObject - returns an seekable, readable object.
|
||||||
func (c Client) GetObject(bucketName, objectName string, opts GetObjectOptions) (*Object, error) {
|
func (c Client) GetObject(bucketName, objectName string, opts GetObjectOptions) (*Object, error) {
|
||||||
return c.getObjectWithContext(context.Background(), bucketName, objectName, opts)
|
return c.getObjectWithContext(context.Background(), bucketName, objectName, opts)
|
||||||
@ -127,6 +116,9 @@ func (c Client) getObjectWithContext(ctx context.Context, bucketName, objectName
|
|||||||
} else {
|
} else {
|
||||||
// First request is a Stat or Seek call.
|
// First request is a Stat or Seek call.
|
||||||
// Only need to run a StatObject until an actual Read or ReadAt request comes through.
|
// Only need to run a StatObject until an actual Read or ReadAt request comes through.
|
||||||
|
|
||||||
|
// Remove range header if already set, for stat Operations to get original file size.
|
||||||
|
delete(opts.headers, "Range")
|
||||||
objectInfo, err = c.statObject(ctx, bucketName, objectName, StatObjectOptions{opts})
|
objectInfo, err = c.statObject(ctx, bucketName, objectName, StatObjectOptions{opts})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
resCh <- getResponse{
|
resCh <- getResponse{
|
||||||
@ -142,6 +134,8 @@ func (c Client) getObjectWithContext(ctx context.Context, bucketName, objectName
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if req.settingObjectInfo { // Request is just to get objectInfo.
|
} else if req.settingObjectInfo { // Request is just to get objectInfo.
|
||||||
|
// Remove range header if already set, for stat Operations to get original file size.
|
||||||
|
delete(opts.headers, "Range")
|
||||||
if etag != "" {
|
if etag != "" {
|
||||||
opts.SetMatchETag(etag)
|
opts.SetMatchETag(etag)
|
||||||
}
|
}
|
||||||
@ -381,13 +375,11 @@ func (o *Object) Stat() (ObjectInfo, error) {
|
|||||||
|
|
||||||
// This is the first request.
|
// This is the first request.
|
||||||
if !o.isStarted || !o.objectInfoSet {
|
if !o.isStarted || !o.objectInfoSet {
|
||||||
statReq := getRequest{
|
// Send the request and get the response.
|
||||||
|
_, err := o.doGetRequest(getRequest{
|
||||||
isFirstReq: !o.isStarted,
|
isFirstReq: !o.isStarted,
|
||||||
settingObjectInfo: !o.objectInfoSet,
|
settingObjectInfo: !o.objectInfoSet,
|
||||||
}
|
})
|
||||||
|
|
||||||
// Send the request and get the response.
|
|
||||||
_, err := o.doGetRequest(statReq)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
o.prevErr = err
|
o.prevErr = err
|
||||||
return ObjectInfo{}, err
|
return ObjectInfo{}, err
|
||||||
@ -493,7 +485,7 @@ func (o *Object) Seek(offset int64, whence int) (n int64, err error) {
|
|||||||
|
|
||||||
// Negative offset is valid for whence of '2'.
|
// Negative offset is valid for whence of '2'.
|
||||||
if offset < 0 && whence != 2 {
|
if offset < 0 && whence != 2 {
|
||||||
return 0, ErrInvalidArgument(fmt.Sprintf("Negative position not allowed for %d.", whence))
|
return 0, ErrInvalidArgument(fmt.Sprintf("Negative position not allowed for %d", whence))
|
||||||
}
|
}
|
||||||
|
|
||||||
// This is the first request. So before anything else
|
// This is the first request. So before anything else
|
||||||
@ -662,15 +654,6 @@ func (c Client) getObject(ctx context.Context, bucketName, objectName string, op
|
|||||||
Metadata: extractObjMetadata(resp.Header),
|
Metadata: extractObjMetadata(resp.Header),
|
||||||
}
|
}
|
||||||
|
|
||||||
reader := resp.Body
|
|
||||||
if opts.Materials != nil {
|
|
||||||
err = opts.Materials.SetupDecryptMode(reader, objectStat.Metadata.Get(amzHeaderIV), objectStat.Metadata.Get(amzHeaderKey))
|
|
||||||
if err != nil {
|
|
||||||
return nil, ObjectInfo{}, err
|
|
||||||
}
|
|
||||||
reader = opts.Materials
|
|
||||||
}
|
|
||||||
|
|
||||||
// do not close body here, caller will close
|
// do not close body here, caller will close
|
||||||
return reader, objectStat, nil
|
return resp.Body, objectStat, nil
|
||||||
}
|
}
|
||||||
|
6
vendor/github.com/minio/minio-go/api-get-options.go
generated
vendored
6
vendor/github.com/minio/minio-go/api-get-options.go
generated
vendored
@ -29,8 +29,7 @@ import (
|
|||||||
// during GET requests.
|
// during GET requests.
|
||||||
type GetObjectOptions struct {
|
type GetObjectOptions struct {
|
||||||
headers map[string]string
|
headers map[string]string
|
||||||
|
ServerSideEncryption encrypt.ServerSide
|
||||||
Materials encrypt.Materials
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// StatObjectOptions are used to specify additional headers or options
|
// StatObjectOptions are used to specify additional headers or options
|
||||||
@ -45,6 +44,9 @@ func (o GetObjectOptions) Header() http.Header {
|
|||||||
for k, v := range o.headers {
|
for k, v := range o.headers {
|
||||||
headers.Set(k, v)
|
headers.Set(k, v)
|
||||||
}
|
}
|
||||||
|
if o.ServerSideEncryption != nil {
|
||||||
|
o.ServerSideEncryption.Marshal(headers)
|
||||||
|
}
|
||||||
return headers
|
return headers
|
||||||
}
|
}
|
||||||
|
|
||||||
|
2
vendor/github.com/minio/minio-go/api-get-policy.go
generated
vendored
2
vendor/github.com/minio/minio-go/api-get-policy.go
generated
vendored
@ -65,7 +65,7 @@ func (c Client) ListBucketPolicies(bucketName, objectPrefix string) (bucketPolic
|
|||||||
}
|
}
|
||||||
return map[string]policy.BucketPolicy{}, err
|
return map[string]policy.BucketPolicy{}, err
|
||||||
}
|
}
|
||||||
return policy.GetPolicies(policyInfo.Statements, bucketName), nil
|
return policy.GetPolicies(policyInfo.Statements, bucketName, objectPrefix), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Default empty bucket access policy.
|
// Default empty bucket access policy.
|
||||||
|
6
vendor/github.com/minio/minio-go/api-notification.go
generated
vendored
6
vendor/github.com/minio/minio-go/api-notification.go
generated
vendored
@ -150,7 +150,7 @@ func (c Client) ListenBucketNotification(bucketName, prefix, suffix string, even
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Check ARN partition to verify if listening bucket is supported
|
// Check ARN partition to verify if listening bucket is supported
|
||||||
if s3utils.IsAmazonEndpoint(c.endpointURL) || s3utils.IsGoogleEndpoint(c.endpointURL) {
|
if s3utils.IsAmazonEndpoint(*c.endpointURL) || s3utils.IsGoogleEndpoint(*c.endpointURL) {
|
||||||
notificationInfoCh <- NotificationInfo{
|
notificationInfoCh <- NotificationInfo{
|
||||||
Err: ErrAPINotSupported("Listening for bucket notification is specific only to `minio` server endpoints"),
|
Err: ErrAPINotSupported("Listening for bucket notification is specific only to `minio` server endpoints"),
|
||||||
}
|
}
|
||||||
@ -205,15 +205,13 @@ func (c Client) ListenBucketNotification(bucketName, prefix, suffix string, even
|
|||||||
if err = json.Unmarshal(bio.Bytes(), ¬ificationInfo); err != nil {
|
if err = json.Unmarshal(bio.Bytes(), ¬ificationInfo); err != nil {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
// Send notifications on channel only if there are events received.
|
// Send notificationInfo
|
||||||
if len(notificationInfo.Records) > 0 {
|
|
||||||
select {
|
select {
|
||||||
case notificationInfoCh <- notificationInfo:
|
case notificationInfoCh <- notificationInfo:
|
||||||
case <-doneCh:
|
case <-doneCh:
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
// Look for any underlying errors.
|
// Look for any underlying errors.
|
||||||
if err = bio.Err(); err != nil {
|
if err = bio.Err(); err != nil {
|
||||||
// For an unexpected connection drop from server, we close the body
|
// For an unexpected connection drop from server, we close the body
|
||||||
|
6
vendor/github.com/minio/minio-go/api-presigned.go
generated
vendored
6
vendor/github.com/minio/minio-go/api-presigned.go
generated
vendored
@ -119,7 +119,9 @@ func (c Client) PresignedPostPolicy(p *PostPolicy) (u *url.URL, formData map[str
|
|||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
u, err = c.makeTargetURL(bucketName, "", location, nil)
|
isVirtualHost := c.isVirtualHostStyleRequest(*c.endpointURL, bucketName)
|
||||||
|
|
||||||
|
u, err = c.makeTargetURL(bucketName, "", location, isVirtualHost, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
@ -148,7 +150,7 @@ func (c Client) PresignedPostPolicy(p *PostPolicy) (u *url.URL, formData map[str
|
|||||||
policyBase64 := p.base64()
|
policyBase64 := p.base64()
|
||||||
p.formData["policy"] = policyBase64
|
p.formData["policy"] = policyBase64
|
||||||
// For Google endpoint set this value to be 'GoogleAccessId'.
|
// For Google endpoint set this value to be 'GoogleAccessId'.
|
||||||
if s3utils.IsGoogleEndpoint(c.endpointURL) {
|
if s3utils.IsGoogleEndpoint(*c.endpointURL) {
|
||||||
p.formData["GoogleAccessId"] = accessKeyID
|
p.formData["GoogleAccessId"] = accessKeyID
|
||||||
} else {
|
} else {
|
||||||
// For all other endpoints set this value to be 'AWSAccessKeyId'.
|
// For all other endpoints set this value to be 'AWSAccessKeyId'.
|
||||||
|
6
vendor/github.com/minio/minio-go/api-put-object-context.go
generated
vendored
6
vendor/github.com/minio/minio-go/api-put-object-context.go
generated
vendored
@ -29,11 +29,5 @@ func (c Client) PutObjectWithContext(ctx context.Context, bucketName, objectName
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
if opts.EncryptMaterials != nil {
|
|
||||||
if err = opts.EncryptMaterials.SetupEncryptMode(reader); err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
return c.putObjectMultipartStreamNoLength(ctx, bucketName, objectName, opts.EncryptMaterials, opts)
|
|
||||||
}
|
|
||||||
return c.putObjectCommon(ctx, bucketName, objectName, reader, objectSize, opts)
|
return c.putObjectCommon(ctx, bucketName, objectName, reader, objectSize, opts)
|
||||||
}
|
}
|
||||||
|
44
vendor/github.com/minio/minio-go/api-put-object-encrypted.go
generated
vendored
44
vendor/github.com/minio/minio-go/api-put-object-encrypted.go
generated
vendored
@ -1,44 +0,0 @@
|
|||||||
/*
|
|
||||||
* Minio Go Library for Amazon S3 Compatible Cloud Storage
|
|
||||||
* Copyright 2017 Minio, Inc.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package minio
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"io"
|
|
||||||
|
|
||||||
"github.com/minio/minio-go/pkg/encrypt"
|
|
||||||
)
|
|
||||||
|
|
||||||
// PutEncryptedObject - Encrypt and store object.
|
|
||||||
func (c Client) PutEncryptedObject(bucketName, objectName string, reader io.Reader, encryptMaterials encrypt.Materials) (n int64, err error) {
|
|
||||||
|
|
||||||
if encryptMaterials == nil {
|
|
||||||
return 0, ErrInvalidArgument("Unable to recognize empty encryption properties")
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := encryptMaterials.SetupEncryptMode(reader); err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return c.PutObjectWithContext(context.Background(), bucketName, objectName, reader, -1, PutObjectOptions{EncryptMaterials: encryptMaterials})
|
|
||||||
}
|
|
||||||
|
|
||||||
// FPutEncryptedObject - Encrypt and store an object with contents from file at filePath.
|
|
||||||
func (c Client) FPutEncryptedObject(bucketName, objectName, filePath string, encryptMaterials encrypt.Materials) (n int64, err error) {
|
|
||||||
return c.FPutObjectWithContext(context.Background(), bucketName, objectName, filePath, PutObjectOptions{EncryptMaterials: encryptMaterials})
|
|
||||||
}
|
|
15
vendor/github.com/minio/minio-go/api-put-object-multipart.go
generated
vendored
15
vendor/github.com/minio/minio-go/api-put-object-multipart.go
generated
vendored
@ -33,6 +33,7 @@ import (
|
|||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"github.com/minio/minio-go/pkg/encrypt"
|
||||||
"github.com/minio/minio-go/pkg/s3utils"
|
"github.com/minio/minio-go/pkg/s3utils"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -138,7 +139,7 @@ func (c Client) putObjectMultipartNoStream(ctx context.Context, bucketName, obje
|
|||||||
// Proceed to upload the part.
|
// Proceed to upload the part.
|
||||||
var objPart ObjectPart
|
var objPart ObjectPart
|
||||||
objPart, err = c.uploadPart(ctx, bucketName, objectName, uploadID, rd, partNumber,
|
objPart, err = c.uploadPart(ctx, bucketName, objectName, uploadID, rd, partNumber,
|
||||||
md5Base64, sha256Hex, int64(length), opts.UserMetadata)
|
md5Base64, sha256Hex, int64(length), opts.ServerSideEncryption)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return totalUploadedSize, err
|
return totalUploadedSize, err
|
||||||
}
|
}
|
||||||
@ -226,11 +227,9 @@ func (c Client) initiateMultipartUpload(ctx context.Context, bucketName, objectN
|
|||||||
return initiateMultipartUploadResult, nil
|
return initiateMultipartUploadResult, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
const serverEncryptionKeyPrefix = "x-amz-server-side-encryption"
|
|
||||||
|
|
||||||
// uploadPart - Uploads a part in a multipart upload.
|
// uploadPart - Uploads a part in a multipart upload.
|
||||||
func (c Client) uploadPart(ctx context.Context, bucketName, objectName, uploadID string, reader io.Reader,
|
func (c Client) uploadPart(ctx context.Context, bucketName, objectName, uploadID string, reader io.Reader,
|
||||||
partNumber int, md5Base64, sha256Hex string, size int64, metadata map[string]string) (ObjectPart, error) {
|
partNumber int, md5Base64, sha256Hex string, size int64, sse encrypt.ServerSide) (ObjectPart, error) {
|
||||||
// Input validation.
|
// Input validation.
|
||||||
if err := s3utils.CheckValidBucketName(bucketName); err != nil {
|
if err := s3utils.CheckValidBucketName(bucketName); err != nil {
|
||||||
return ObjectPart{}, err
|
return ObjectPart{}, err
|
||||||
@ -260,12 +259,8 @@ func (c Client) uploadPart(ctx context.Context, bucketName, objectName, uploadID
|
|||||||
|
|
||||||
// Set encryption headers, if any.
|
// Set encryption headers, if any.
|
||||||
customHeader := make(http.Header)
|
customHeader := make(http.Header)
|
||||||
for k, v := range metadata {
|
if sse != nil {
|
||||||
if len(v) > 0 {
|
sse.Marshal(customHeader)
|
||||||
if strings.HasPrefix(strings.ToLower(k), serverEncryptionKeyPrefix) {
|
|
||||||
customHeader.Set(k, v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
reqMetadata := requestMetadata{
|
reqMetadata := requestMetadata{
|
||||||
|
7
vendor/github.com/minio/minio-go/api-put-object-streaming.go
generated
vendored
7
vendor/github.com/minio/minio-go/api-put-object-streaming.go
generated
vendored
@ -167,7 +167,7 @@ func (c Client) putObjectMultipartStreamFromReadAt(ctx context.Context, bucketNa
|
|||||||
var objPart ObjectPart
|
var objPart ObjectPart
|
||||||
objPart, err = c.uploadPart(ctx, bucketName, objectName, uploadID,
|
objPart, err = c.uploadPart(ctx, bucketName, objectName, uploadID,
|
||||||
sectionReader, uploadReq.PartNum,
|
sectionReader, uploadReq.PartNum,
|
||||||
"", "", partSize, opts.UserMetadata)
|
"", "", partSize, opts.ServerSideEncryption)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
uploadedPartsCh <- uploadedPartRes{
|
uploadedPartsCh <- uploadedPartRes{
|
||||||
Size: 0,
|
Size: 0,
|
||||||
@ -280,7 +280,7 @@ func (c Client) putObjectMultipartStreamNoChecksum(ctx context.Context, bucketNa
|
|||||||
var objPart ObjectPart
|
var objPart ObjectPart
|
||||||
objPart, err = c.uploadPart(ctx, bucketName, objectName, uploadID,
|
objPart, err = c.uploadPart(ctx, bucketName, objectName, uploadID,
|
||||||
io.LimitReader(hookReader, partSize),
|
io.LimitReader(hookReader, partSize),
|
||||||
partNumber, "", "", partSize, opts.UserMetadata)
|
partNumber, "", "", partSize, opts.ServerSideEncryption)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return totalUploadedSize, err
|
return totalUploadedSize, err
|
||||||
}
|
}
|
||||||
@ -339,7 +339,7 @@ func (c Client) putObjectNoChecksum(ctx context.Context, bucketName, objectName
|
|||||||
|
|
||||||
// Size -1 is only supported on Google Cloud Storage, we error
|
// Size -1 is only supported on Google Cloud Storage, we error
|
||||||
// out in all other situations.
|
// out in all other situations.
|
||||||
if size < 0 && !s3utils.IsGoogleEndpoint(c.endpointURL) {
|
if size < 0 && !s3utils.IsGoogleEndpoint(*c.endpointURL) {
|
||||||
return 0, ErrEntityTooSmall(size, bucketName, objectName)
|
return 0, ErrEntityTooSmall(size, bucketName, objectName)
|
||||||
}
|
}
|
||||||
if size > 0 {
|
if size > 0 {
|
||||||
@ -381,6 +381,7 @@ func (c Client) putObjectDo(ctx context.Context, bucketName, objectName string,
|
|||||||
}
|
}
|
||||||
// Set headers.
|
// Set headers.
|
||||||
customHeader := opts.Header()
|
customHeader := opts.Header()
|
||||||
|
|
||||||
// Populate request metadata.
|
// Populate request metadata.
|
||||||
reqMetadata := requestMetadata{
|
reqMetadata := requestMetadata{
|
||||||
bucketName: bucketName,
|
bucketName: bucketName,
|
||||||
|
31
vendor/github.com/minio/minio-go/api-put-object.go
generated
vendored
31
vendor/github.com/minio/minio-go/api-put-object.go
generated
vendored
@ -28,6 +28,7 @@ import (
|
|||||||
|
|
||||||
"github.com/minio/minio-go/pkg/encrypt"
|
"github.com/minio/minio-go/pkg/encrypt"
|
||||||
"github.com/minio/minio-go/pkg/s3utils"
|
"github.com/minio/minio-go/pkg/s3utils"
|
||||||
|
"golang.org/x/net/lex/httplex"
|
||||||
)
|
)
|
||||||
|
|
||||||
// PutObjectOptions represents options specified by user for PutObject call
|
// PutObjectOptions represents options specified by user for PutObject call
|
||||||
@ -37,8 +38,9 @@ type PutObjectOptions struct {
|
|||||||
ContentType string
|
ContentType string
|
||||||
ContentEncoding string
|
ContentEncoding string
|
||||||
ContentDisposition string
|
ContentDisposition string
|
||||||
|
ContentLanguage string
|
||||||
CacheControl string
|
CacheControl string
|
||||||
EncryptMaterials encrypt.Materials
|
ServerSideEncryption encrypt.ServerSide
|
||||||
NumThreads uint
|
NumThreads uint
|
||||||
StorageClass string
|
StorageClass string
|
||||||
}
|
}
|
||||||
@ -70,19 +72,20 @@ func (opts PutObjectOptions) Header() (header http.Header) {
|
|||||||
if opts.ContentDisposition != "" {
|
if opts.ContentDisposition != "" {
|
||||||
header["Content-Disposition"] = []string{opts.ContentDisposition}
|
header["Content-Disposition"] = []string{opts.ContentDisposition}
|
||||||
}
|
}
|
||||||
|
if opts.ContentLanguage != "" {
|
||||||
|
header["Content-Language"] = []string{opts.ContentLanguage}
|
||||||
|
}
|
||||||
if opts.CacheControl != "" {
|
if opts.CacheControl != "" {
|
||||||
header["Cache-Control"] = []string{opts.CacheControl}
|
header["Cache-Control"] = []string{opts.CacheControl}
|
||||||
}
|
}
|
||||||
if opts.EncryptMaterials != nil {
|
if opts.ServerSideEncryption != nil {
|
||||||
header[amzHeaderIV] = []string{opts.EncryptMaterials.GetIV()}
|
opts.ServerSideEncryption.Marshal(header)
|
||||||
header[amzHeaderKey] = []string{opts.EncryptMaterials.GetKey()}
|
|
||||||
header[amzHeaderMatDesc] = []string{opts.EncryptMaterials.GetDesc()}
|
|
||||||
}
|
}
|
||||||
if opts.StorageClass != "" {
|
if opts.StorageClass != "" {
|
||||||
header[amzStorageClass] = []string{opts.StorageClass}
|
header[amzStorageClass] = []string{opts.StorageClass}
|
||||||
}
|
}
|
||||||
for k, v := range opts.UserMetadata {
|
for k, v := range opts.UserMetadata {
|
||||||
if !isAmzHeader(k) && !isStandardHeader(k) && !isSSEHeader(k) && !isStorageClassHeader(k) {
|
if !isAmzHeader(k) && !isStandardHeader(k) && !isStorageClassHeader(k) {
|
||||||
header["X-Amz-Meta-"+k] = []string{v}
|
header["X-Amz-Meta-"+k] = []string{v}
|
||||||
} else {
|
} else {
|
||||||
header[k] = []string{v}
|
header[k] = []string{v}
|
||||||
@ -91,12 +94,14 @@ func (opts PutObjectOptions) Header() (header http.Header) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// validate() checks if the UserMetadata map has standard headers or client side
|
// validate() checks if the UserMetadata map has standard headers or and raises an error if so.
|
||||||
// encryption headers and raises an error if so.
|
|
||||||
func (opts PutObjectOptions) validate() (err error) {
|
func (opts PutObjectOptions) validate() (err error) {
|
||||||
for k := range opts.UserMetadata {
|
for k, v := range opts.UserMetadata {
|
||||||
if isStandardHeader(k) || isCSEHeader(k) || isStorageClassHeader(k) {
|
if !httplex.ValidHeaderFieldName(k) || isStandardHeader(k) || isSSEHeader(k) || isStorageClassHeader(k) {
|
||||||
return ErrInvalidArgument(k + " unsupported request parameter for user defined metadata from minio-go")
|
return ErrInvalidArgument(k + " unsupported user defined metadata name")
|
||||||
|
}
|
||||||
|
if !httplex.ValidHeaderFieldValue(v) {
|
||||||
|
return ErrInvalidArgument(v + " unsupported user defined metadata value")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
@ -133,7 +138,7 @@ func (c Client) putObjectCommon(ctx context.Context, bucketName, objectName stri
|
|||||||
}
|
}
|
||||||
|
|
||||||
// NOTE: Streaming signature is not supported by GCS.
|
// NOTE: Streaming signature is not supported by GCS.
|
||||||
if s3utils.IsGoogleEndpoint(c.endpointURL) {
|
if s3utils.IsGoogleEndpoint(*c.endpointURL) {
|
||||||
// Do not compute MD5 for Google Cloud Storage.
|
// Do not compute MD5 for Google Cloud Storage.
|
||||||
return c.putObjectNoChecksum(ctx, bucketName, objectName, reader, size, opts)
|
return c.putObjectNoChecksum(ctx, bucketName, objectName, reader, size, opts)
|
||||||
}
|
}
|
||||||
@ -213,7 +218,7 @@ func (c Client) putObjectMultipartStreamNoLength(ctx context.Context, bucketName
|
|||||||
// Proceed to upload the part.
|
// Proceed to upload the part.
|
||||||
var objPart ObjectPart
|
var objPart ObjectPart
|
||||||
objPart, err = c.uploadPart(ctx, bucketName, objectName, uploadID, rd, partNumber,
|
objPart, err = c.uploadPart(ctx, bucketName, objectName, uploadID, rd, partNumber,
|
||||||
"", "", int64(length), opts.UserMetadata)
|
"", "", int64(length), opts.ServerSideEncryption)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return totalUploadedSize, err
|
return totalUploadedSize, err
|
||||||
}
|
}
|
||||||
|
15
vendor/github.com/minio/minio-go/api-remove.go
generated
vendored
15
vendor/github.com/minio/minio-go/api-remove.go
generated
vendored
@ -129,10 +129,8 @@ func processRemoveMultiObjectsResponse(body io.Reader, objects []string, errorCh
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// RemoveObjects remove multiples objects from a bucket.
|
// RemoveObjectsWithContext - Identical to RemoveObjects call, but accepts context to facilitate request cancellation.
|
||||||
// The list of objects to remove are received from objectsCh.
|
func (c Client) RemoveObjectsWithContext(ctx context.Context, bucketName string, objectsCh <-chan string) <-chan RemoveObjectError {
|
||||||
// Remove failures are sent back via error channel.
|
|
||||||
func (c Client) RemoveObjects(bucketName string, objectsCh <-chan string) <-chan RemoveObjectError {
|
|
||||||
errorCh := make(chan RemoveObjectError, 1)
|
errorCh := make(chan RemoveObjectError, 1)
|
||||||
|
|
||||||
// Validate if bucket name is valid.
|
// Validate if bucket name is valid.
|
||||||
@ -189,7 +187,7 @@ func (c Client) RemoveObjects(bucketName string, objectsCh <-chan string) <-chan
|
|||||||
// Generate remove multi objects XML request
|
// Generate remove multi objects XML request
|
||||||
removeBytes := generateRemoveMultiObjectsRequest(batch)
|
removeBytes := generateRemoveMultiObjectsRequest(batch)
|
||||||
// Execute GET on bucket to list objects.
|
// Execute GET on bucket to list objects.
|
||||||
resp, err := c.executeMethod(context.Background(), "POST", requestMetadata{
|
resp, err := c.executeMethod(ctx, "POST", requestMetadata{
|
||||||
bucketName: bucketName,
|
bucketName: bucketName,
|
||||||
queryValues: urlValues,
|
queryValues: urlValues,
|
||||||
contentBody: bytes.NewReader(removeBytes),
|
contentBody: bytes.NewReader(removeBytes),
|
||||||
@ -213,6 +211,13 @@ func (c Client) RemoveObjects(bucketName string, objectsCh <-chan string) <-chan
|
|||||||
return errorCh
|
return errorCh
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// RemoveObjects removes multiple objects from a bucket.
|
||||||
|
// The list of objects to remove are received from objectsCh.
|
||||||
|
// Remove failures are sent back via error channel.
|
||||||
|
func (c Client) RemoveObjects(bucketName string, objectsCh <-chan string) <-chan RemoveObjectError {
|
||||||
|
return c.RemoveObjectsWithContext(context.Background(), bucketName, objectsCh)
|
||||||
|
}
|
||||||
|
|
||||||
// RemoveIncompleteUpload aborts an partially uploaded object.
|
// RemoveIncompleteUpload aborts an partially uploaded object.
|
||||||
func (c Client) RemoveIncompleteUpload(bucketName, objectName string) error {
|
func (c Client) RemoveIncompleteUpload(bucketName, objectName string) error {
|
||||||
// Input validation.
|
// Input validation.
|
||||||
|
2
vendor/github.com/minio/minio-go/api-stat.go
generated
vendored
2
vendor/github.com/minio/minio-go/api-stat.go
generated
vendored
@ -115,7 +115,7 @@ func (c Client) statObject(ctx context.Context, bucketName, objectName string, o
|
|||||||
return ObjectInfo{}, err
|
return ObjectInfo{}, err
|
||||||
}
|
}
|
||||||
if resp != nil {
|
if resp != nil {
|
||||||
if resp.StatusCode != http.StatusOK {
|
if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusPartialContent {
|
||||||
return ObjectInfo{}, httpRespToErrorResponse(resp, bucketName, objectName)
|
return ObjectInfo{}, httpRespToErrorResponse(resp, bucketName, objectName)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
214
vendor/github.com/minio/minio-go/api.go
generated
vendored
214
vendor/github.com/minio/minio-go/api.go
generated
vendored
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Minio Go Library for Amazon S3 Compatible Cloud Storage
|
* Minio Go Library for Amazon S3 Compatible Cloud Storage
|
||||||
* Copyright 2015-2017 Minio, Inc.
|
* Copyright 2015-2018 Minio, Inc.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -48,7 +48,7 @@ type Client struct {
|
|||||||
/// Standard options.
|
/// Standard options.
|
||||||
|
|
||||||
// Parsed endpoint url provided by the user.
|
// Parsed endpoint url provided by the user.
|
||||||
endpointURL url.URL
|
endpointURL *url.URL
|
||||||
|
|
||||||
// Holds various credential providers.
|
// Holds various credential providers.
|
||||||
credsProvider *credentials.Credentials
|
credsProvider *credentials.Credentials
|
||||||
@ -81,12 +81,25 @@ type Client struct {
|
|||||||
|
|
||||||
// Random seed.
|
// Random seed.
|
||||||
random *rand.Rand
|
random *rand.Rand
|
||||||
|
|
||||||
|
// lookup indicates type of url lookup supported by server. If not specified,
|
||||||
|
// default to Auto.
|
||||||
|
lookup BucketLookupType
|
||||||
|
}
|
||||||
|
|
||||||
|
// Options for New method
|
||||||
|
type Options struct {
|
||||||
|
Creds *credentials.Credentials
|
||||||
|
Secure bool
|
||||||
|
Region string
|
||||||
|
BucketLookup BucketLookupType
|
||||||
|
// Add future fields here
|
||||||
}
|
}
|
||||||
|
|
||||||
// Global constants.
|
// Global constants.
|
||||||
const (
|
const (
|
||||||
libraryName = "minio-go"
|
libraryName = "minio-go"
|
||||||
libraryVersion = "4.0.6"
|
libraryVersion = "5.0.1"
|
||||||
)
|
)
|
||||||
|
|
||||||
// User Agent should always following the below style.
|
// User Agent should always following the below style.
|
||||||
@ -98,11 +111,21 @@ const (
|
|||||||
libraryUserAgent = libraryUserAgentPrefix + libraryName + "/" + libraryVersion
|
libraryUserAgent = libraryUserAgentPrefix + libraryName + "/" + libraryVersion
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// BucketLookupType is type of url lookup supported by server.
|
||||||
|
type BucketLookupType int
|
||||||
|
|
||||||
|
// Different types of url lookup supported by the server.Initialized to BucketLookupAuto
|
||||||
|
const (
|
||||||
|
BucketLookupAuto BucketLookupType = iota
|
||||||
|
BucketLookupDNS
|
||||||
|
BucketLookupPath
|
||||||
|
)
|
||||||
|
|
||||||
// NewV2 - instantiate minio client with Amazon S3 signature version
|
// NewV2 - instantiate minio client with Amazon S3 signature version
|
||||||
// '2' compatibility.
|
// '2' compatibility.
|
||||||
func NewV2(endpoint string, accessKeyID, secretAccessKey string, secure bool) (*Client, error) {
|
func NewV2(endpoint string, accessKeyID, secretAccessKey string, secure bool) (*Client, error) {
|
||||||
creds := credentials.NewStaticV2(accessKeyID, secretAccessKey, "")
|
creds := credentials.NewStaticV2(accessKeyID, secretAccessKey, "")
|
||||||
clnt, err := privateNew(endpoint, creds, secure, "")
|
clnt, err := privateNew(endpoint, creds, secure, "", BucketLookupAuto)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -114,7 +137,7 @@ func NewV2(endpoint string, accessKeyID, secretAccessKey string, secure bool) (*
|
|||||||
// '4' compatibility.
|
// '4' compatibility.
|
||||||
func NewV4(endpoint string, accessKeyID, secretAccessKey string, secure bool) (*Client, error) {
|
func NewV4(endpoint string, accessKeyID, secretAccessKey string, secure bool) (*Client, error) {
|
||||||
creds := credentials.NewStaticV4(accessKeyID, secretAccessKey, "")
|
creds := credentials.NewStaticV4(accessKeyID, secretAccessKey, "")
|
||||||
clnt, err := privateNew(endpoint, creds, secure, "")
|
clnt, err := privateNew(endpoint, creds, secure, "", BucketLookupAuto)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -125,16 +148,16 @@ func NewV4(endpoint string, accessKeyID, secretAccessKey string, secure bool) (*
|
|||||||
// New - instantiate minio client, adds automatic verification of signature.
|
// New - instantiate minio client, adds automatic verification of signature.
|
||||||
func New(endpoint, accessKeyID, secretAccessKey string, secure bool) (*Client, error) {
|
func New(endpoint, accessKeyID, secretAccessKey string, secure bool) (*Client, error) {
|
||||||
creds := credentials.NewStaticV4(accessKeyID, secretAccessKey, "")
|
creds := credentials.NewStaticV4(accessKeyID, secretAccessKey, "")
|
||||||
clnt, err := privateNew(endpoint, creds, secure, "")
|
clnt, err := privateNew(endpoint, creds, secure, "", BucketLookupAuto)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
// Google cloud storage should be set to signature V2, force it if not.
|
// Google cloud storage should be set to signature V2, force it if not.
|
||||||
if s3utils.IsGoogleEndpoint(clnt.endpointURL) {
|
if s3utils.IsGoogleEndpoint(*clnt.endpointURL) {
|
||||||
clnt.overrideSignerType = credentials.SignatureV2
|
clnt.overrideSignerType = credentials.SignatureV2
|
||||||
}
|
}
|
||||||
// If Amazon S3 set to signature v4.
|
// If Amazon S3 set to signature v4.
|
||||||
if s3utils.IsAmazonEndpoint(clnt.endpointURL) {
|
if s3utils.IsAmazonEndpoint(*clnt.endpointURL) {
|
||||||
clnt.overrideSignerType = credentials.SignatureV4
|
clnt.overrideSignerType = credentials.SignatureV4
|
||||||
}
|
}
|
||||||
return clnt, nil
|
return clnt, nil
|
||||||
@ -144,7 +167,7 @@ func New(endpoint, accessKeyID, secretAccessKey string, secure bool) (*Client, e
|
|||||||
// for retrieving credentials from various credentials provider such as
|
// for retrieving credentials from various credentials provider such as
|
||||||
// IAM, File, Env etc.
|
// IAM, File, Env etc.
|
||||||
func NewWithCredentials(endpoint string, creds *credentials.Credentials, secure bool, region string) (*Client, error) {
|
func NewWithCredentials(endpoint string, creds *credentials.Credentials, secure bool, region string) (*Client, error) {
|
||||||
return privateNew(endpoint, creds, secure, region)
|
return privateNew(endpoint, creds, secure, region, BucketLookupAuto)
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewWithRegion - instantiate minio client, with region configured. Unlike New(),
|
// NewWithRegion - instantiate minio client, with region configured. Unlike New(),
|
||||||
@ -152,7 +175,12 @@ func NewWithCredentials(endpoint string, creds *credentials.Credentials, secure
|
|||||||
// Use this function when if your application deals with single region.
|
// Use this function when if your application deals with single region.
|
||||||
func NewWithRegion(endpoint, accessKeyID, secretAccessKey string, secure bool, region string) (*Client, error) {
|
func NewWithRegion(endpoint, accessKeyID, secretAccessKey string, secure bool, region string) (*Client, error) {
|
||||||
creds := credentials.NewStaticV4(accessKeyID, secretAccessKey, "")
|
creds := credentials.NewStaticV4(accessKeyID, secretAccessKey, "")
|
||||||
return privateNew(endpoint, creds, secure, region)
|
return privateNew(endpoint, creds, secure, region, BucketLookupAuto)
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewWithOptions - instantiate minio client with options
|
||||||
|
func NewWithOptions(endpoint string, opts *Options) (*Client, error) {
|
||||||
|
return privateNew(endpoint, opts.Creds, opts.Secure, opts.Region, opts.BucketLookup)
|
||||||
}
|
}
|
||||||
|
|
||||||
// lockedRandSource provides protected rand source, implements rand.Source interface.
|
// lockedRandSource provides protected rand source, implements rand.Source interface.
|
||||||
@ -177,32 +205,68 @@ func (r *lockedRandSource) Seed(seed int64) {
|
|||||||
r.lk.Unlock()
|
r.lk.Unlock()
|
||||||
}
|
}
|
||||||
|
|
||||||
// getRegionFromURL - parse region from URL if present.
|
// Redirect requests by re signing the request.
|
||||||
func getRegionFromURL(u url.URL) (region string) {
|
func (c *Client) redirectHeaders(req *http.Request, via []*http.Request) error {
|
||||||
region = ""
|
if len(via) >= 5 {
|
||||||
if s3utils.IsGoogleEndpoint(u) {
|
return errors.New("stopped after 5 redirects")
|
||||||
return
|
|
||||||
} else if s3utils.IsAmazonChinaEndpoint(u) {
|
|
||||||
// For china specifically we need to set everything to
|
|
||||||
// cn-north-1 for now, there is no easier way until AWS S3
|
|
||||||
// provides a cleaner compatible API across "us-east-1" and
|
|
||||||
// China region.
|
|
||||||
return "cn-north-1"
|
|
||||||
} else if s3utils.IsAmazonGovCloudEndpoint(u) {
|
|
||||||
// For us-gov specifically we need to set everything to
|
|
||||||
// us-gov-west-1 for now, there is no easier way until AWS S3
|
|
||||||
// provides a cleaner compatible API across "us-east-1" and
|
|
||||||
// Gov cloud region.
|
|
||||||
return "us-gov-west-1"
|
|
||||||
}
|
}
|
||||||
parts := s3utils.AmazonS3Host.FindStringSubmatch(u.Host)
|
if len(via) == 0 {
|
||||||
if len(parts) > 1 {
|
return nil
|
||||||
region = parts[1]
|
|
||||||
}
|
}
|
||||||
return region
|
lastRequest := via[len(via)-1]
|
||||||
|
var reAuth bool
|
||||||
|
for attr, val := range lastRequest.Header {
|
||||||
|
// if hosts do not match do not copy Authorization header
|
||||||
|
if attr == "Authorization" && req.Host != lastRequest.Host {
|
||||||
|
reAuth = true
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if _, ok := req.Header[attr]; !ok {
|
||||||
|
req.Header[attr] = val
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
*c.endpointURL = *req.URL
|
||||||
|
|
||||||
|
value, err := c.credsProvider.Get()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
var (
|
||||||
|
signerType = value.SignerType
|
||||||
|
accessKeyID = value.AccessKeyID
|
||||||
|
secretAccessKey = value.SecretAccessKey
|
||||||
|
sessionToken = value.SessionToken
|
||||||
|
region = c.region
|
||||||
|
)
|
||||||
|
|
||||||
|
// Custom signer set then override the behavior.
|
||||||
|
if c.overrideSignerType != credentials.SignatureDefault {
|
||||||
|
signerType = c.overrideSignerType
|
||||||
|
}
|
||||||
|
|
||||||
|
// If signerType returned by credentials helper is anonymous,
|
||||||
|
// then do not sign regardless of signerType override.
|
||||||
|
if value.SignerType == credentials.SignatureAnonymous {
|
||||||
|
signerType = credentials.SignatureAnonymous
|
||||||
|
}
|
||||||
|
|
||||||
|
if reAuth {
|
||||||
|
// Check if there is no region override, if not get it from the URL if possible.
|
||||||
|
if region == "" {
|
||||||
|
region = s3utils.GetRegionFromURL(*c.endpointURL)
|
||||||
|
}
|
||||||
|
switch {
|
||||||
|
case signerType.IsV2():
|
||||||
|
return errors.New("signature V2 cannot support redirection")
|
||||||
|
case signerType.IsV4():
|
||||||
|
req = s3signer.SignV4(*req, accessKeyID, secretAccessKey, sessionToken, getDefaultLocation(*c.endpointURL, region))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func privateNew(endpoint string, creds *credentials.Credentials, secure bool, region string) (*Client, error) {
|
func privateNew(endpoint string, creds *credentials.Credentials, secure bool, region string, lookup BucketLookupType) (*Client, error) {
|
||||||
// construct endpoint.
|
// construct endpoint.
|
||||||
endpointURL, err := getEndpointURL(endpoint, secure)
|
endpointURL, err := getEndpointURL(endpoint, secure)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -219,16 +283,17 @@ func privateNew(endpoint string, creds *credentials.Credentials, secure bool, re
|
|||||||
clnt.secure = secure
|
clnt.secure = secure
|
||||||
|
|
||||||
// Save endpoint URL, user agent for future uses.
|
// Save endpoint URL, user agent for future uses.
|
||||||
clnt.endpointURL = *endpointURL
|
clnt.endpointURL = endpointURL
|
||||||
|
|
||||||
// Instantiate http client and bucket location cache.
|
// Instantiate http client and bucket location cache.
|
||||||
clnt.httpClient = &http.Client{
|
clnt.httpClient = &http.Client{
|
||||||
Transport: defaultMinioTransport,
|
Transport: DefaultTransport,
|
||||||
|
CheckRedirect: clnt.redirectHeaders,
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sets custom region, if region is empty bucket location cache is used automatically.
|
// Sets custom region, if region is empty bucket location cache is used automatically.
|
||||||
if region == "" {
|
if region == "" {
|
||||||
region = getRegionFromURL(clnt.endpointURL)
|
region = s3utils.GetRegionFromURL(*clnt.endpointURL)
|
||||||
}
|
}
|
||||||
clnt.region = region
|
clnt.region = region
|
||||||
|
|
||||||
@ -238,6 +303,9 @@ func privateNew(endpoint string, creds *credentials.Credentials, secure bool, re
|
|||||||
// Introduce a new locked random seed.
|
// Introduce a new locked random seed.
|
||||||
clnt.random = rand.New(&lockedRandSource{src: rand.NewSource(time.Now().UTC().UnixNano())})
|
clnt.random = rand.New(&lockedRandSource{src: rand.NewSource(time.Now().UTC().UnixNano())})
|
||||||
|
|
||||||
|
// Sets bucket lookup style, whether server accepts DNS or Path lookup. Default is Auto - determined
|
||||||
|
// by the SDK. When Auto is specified, DNS lookup is used for Amazon/Google cloud endpoints and Path for all other endpoints.
|
||||||
|
clnt.lookup = lookup
|
||||||
// Return.
|
// Return.
|
||||||
return clnt, nil
|
return clnt, nil
|
||||||
}
|
}
|
||||||
@ -269,7 +337,7 @@ func (c *Client) SetCustomTransport(customHTTPTransport http.RoundTripper) {
|
|||||||
// TLSClientConfig: &tls.Config{RootCAs: pool},
|
// TLSClientConfig: &tls.Config{RootCAs: pool},
|
||||||
// DisableCompression: true,
|
// DisableCompression: true,
|
||||||
// }
|
// }
|
||||||
// api.SetTransport(tr)
|
// api.SetCustomTransport(tr)
|
||||||
//
|
//
|
||||||
if c.httpClient != nil {
|
if c.httpClient != nil {
|
||||||
c.httpClient.Transport = customHTTPTransport
|
c.httpClient.Transport = customHTTPTransport
|
||||||
@ -301,7 +369,7 @@ func (c *Client) TraceOff() {
|
|||||||
// please vist -
|
// please vist -
|
||||||
// http://docs.aws.amazon.com/AmazonS3/latest/dev/transfer-acceleration.html
|
// http://docs.aws.amazon.com/AmazonS3/latest/dev/transfer-acceleration.html
|
||||||
func (c *Client) SetS3TransferAccelerate(accelerateEndpoint string) {
|
func (c *Client) SetS3TransferAccelerate(accelerateEndpoint string) {
|
||||||
if s3utils.IsAmazonEndpoint(c.endpointURL) {
|
if s3utils.IsAmazonEndpoint(*c.endpointURL) {
|
||||||
c.s3AccelerateEndpoint = accelerateEndpoint
|
c.s3AccelerateEndpoint = accelerateEndpoint
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -405,6 +473,7 @@ func (c Client) dumpHTTP(req *http.Request, resp *http.Response) error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Write response to trace output.
|
// Write response to trace output.
|
||||||
_, err = fmt.Fprint(c.traceOutput, strings.TrimSuffix(string(respTrace), "\r\n"))
|
_, err = fmt.Fprint(c.traceOutput, strings.TrimSuffix(string(respTrace), "\r\n"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -423,38 +492,22 @@ func (c Client) dumpHTTP(req *http.Request, resp *http.Response) error {
|
|||||||
|
|
||||||
// do - execute http request.
|
// do - execute http request.
|
||||||
func (c Client) do(req *http.Request) (*http.Response, error) {
|
func (c Client) do(req *http.Request) (*http.Response, error) {
|
||||||
var resp *http.Response
|
resp, err := c.httpClient.Do(req)
|
||||||
var err error
|
|
||||||
// Do the request in a loop in case of 307 http is met since golang still doesn't
|
|
||||||
// handle properly this situation (https://github.com/golang/go/issues/7912)
|
|
||||||
for {
|
|
||||||
resp, err = c.httpClient.Do(req)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// Handle this specifically for now until future Golang
|
// Handle this specifically for now until future Golang versions fix this issue properly.
|
||||||
// versions fix this issue properly.
|
if urlErr, ok := err.(*url.Error); ok {
|
||||||
urlErr, ok := err.(*url.Error)
|
if strings.Contains(urlErr.Err.Error(), "EOF") {
|
||||||
if ok && strings.Contains(urlErr.Err.Error(), "EOF") {
|
|
||||||
return nil, &url.Error{
|
return nil, &url.Error{
|
||||||
Op: urlErr.Op,
|
Op: urlErr.Op,
|
||||||
URL: urlErr.URL,
|
URL: urlErr.URL,
|
||||||
Err: errors.New("Connection closed by foreign host " + urlErr.URL + ". Retry again."),
|
Err: errors.New("Connection closed by foreign host " + urlErr.URL + ". Retry again."),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
// Redo the request with the new redirect url if http 307 is returned, quit the loop otherwise
|
|
||||||
if resp != nil && resp.StatusCode == http.StatusTemporaryRedirect {
|
|
||||||
newURL, err := url.Parse(resp.Header.Get("Location"))
|
|
||||||
if err != nil {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
req.URL = newURL
|
|
||||||
} else {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Response cannot be non-nil, report if its the case.
|
// Response cannot be non-nil, report error if thats the case.
|
||||||
if resp == nil {
|
if resp == nil {
|
||||||
msg := "Response is empty. " + reportIssue
|
msg := "Response is empty. " + reportIssue
|
||||||
return nil, ErrInvalidArgument(msg)
|
return nil, ErrInvalidArgument(msg)
|
||||||
@ -467,6 +520,7 @@ func (c Client) do(req *http.Request) (*http.Response, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return resp, nil
|
return resp, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -538,6 +592,7 @@ func (c Client) executeMethod(ctx context.Context, method string, metadata reque
|
|||||||
}
|
}
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add context to request
|
// Add context to request
|
||||||
req = req.WithContext(ctx)
|
req = req.WithContext(ctx)
|
||||||
|
|
||||||
@ -634,12 +689,15 @@ func (c Client) newRequest(method string, metadata requestMetadata) (req *http.R
|
|||||||
// happen when GetBucketLocation() is disabled using IAM policies.
|
// happen when GetBucketLocation() is disabled using IAM policies.
|
||||||
}
|
}
|
||||||
if location == "" {
|
if location == "" {
|
||||||
location = getDefaultLocation(c.endpointURL, c.region)
|
location = getDefaultLocation(*c.endpointURL, c.region)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Look if target url supports virtual host.
|
||||||
|
isVirtualHost := c.isVirtualHostStyleRequest(*c.endpointURL, metadata.bucketName)
|
||||||
|
|
||||||
// Construct a new target URL.
|
// Construct a new target URL.
|
||||||
targetURL, err := c.makeTargetURL(metadata.bucketName, metadata.objectName, location, metadata.queryValues)
|
targetURL, err := c.makeTargetURL(metadata.bucketName, metadata.objectName, location, isVirtualHost, metadata.queryValues)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -681,7 +739,7 @@ func (c Client) newRequest(method string, metadata requestMetadata) (req *http.R
|
|||||||
}
|
}
|
||||||
if signerType.IsV2() {
|
if signerType.IsV2() {
|
||||||
// Presign URL with signature v2.
|
// Presign URL with signature v2.
|
||||||
req = s3signer.PreSignV2(*req, accessKeyID, secretAccessKey, metadata.expires)
|
req = s3signer.PreSignV2(*req, accessKeyID, secretAccessKey, metadata.expires, isVirtualHost)
|
||||||
} else if signerType.IsV4() {
|
} else if signerType.IsV4() {
|
||||||
// Presign URL with signature v4.
|
// Presign URL with signature v4.
|
||||||
req = s3signer.PreSignV4(*req, accessKeyID, secretAccessKey, sessionToken, location, metadata.expires)
|
req = s3signer.PreSignV4(*req, accessKeyID, secretAccessKey, sessionToken, location, metadata.expires)
|
||||||
@ -727,7 +785,7 @@ func (c Client) newRequest(method string, metadata requestMetadata) (req *http.R
|
|||||||
switch {
|
switch {
|
||||||
case signerType.IsV2():
|
case signerType.IsV2():
|
||||||
// Add signature version '2' authorization header.
|
// Add signature version '2' authorization header.
|
||||||
req = s3signer.SignV2(*req, accessKeyID, secretAccessKey)
|
req = s3signer.SignV2(*req, accessKeyID, secretAccessKey, isVirtualHost)
|
||||||
case metadata.objectName != "" && method == "PUT" && metadata.customHeader.Get("X-Amz-Copy-Source") == "" && !c.secure:
|
case metadata.objectName != "" && method == "PUT" && metadata.customHeader.Get("X-Amz-Copy-Source") == "" && !c.secure:
|
||||||
// Streaming signature is used by default for a PUT object request. Additionally we also
|
// Streaming signature is used by default for a PUT object request. Additionally we also
|
||||||
// look if the initialized client is secure, if yes then we don't need to perform
|
// look if the initialized client is secure, if yes then we don't need to perform
|
||||||
@ -759,10 +817,10 @@ func (c Client) setUserAgent(req *http.Request) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// makeTargetURL make a new target url.
|
// makeTargetURL make a new target url.
|
||||||
func (c Client) makeTargetURL(bucketName, objectName, bucketLocation string, queryValues url.Values) (*url.URL, error) {
|
func (c Client) makeTargetURL(bucketName, objectName, bucketLocation string, isVirtualHostStyle bool, queryValues url.Values) (*url.URL, error) {
|
||||||
host := c.endpointURL.Host
|
host := c.endpointURL.Host
|
||||||
// For Amazon S3 endpoint, try to fetch location based endpoint.
|
// For Amazon S3 endpoint, try to fetch location based endpoint.
|
||||||
if s3utils.IsAmazonEndpoint(c.endpointURL) {
|
if s3utils.IsAmazonEndpoint(*c.endpointURL) {
|
||||||
if c.s3AccelerateEndpoint != "" && bucketName != "" {
|
if c.s3AccelerateEndpoint != "" && bucketName != "" {
|
||||||
// http://docs.aws.amazon.com/AmazonS3/latest/dev/transfer-acceleration.html
|
// http://docs.aws.amazon.com/AmazonS3/latest/dev/transfer-acceleration.html
|
||||||
// Disable transfer acceleration for non-compliant bucket names.
|
// Disable transfer acceleration for non-compliant bucket names.
|
||||||
@ -775,7 +833,7 @@ func (c Client) makeTargetURL(bucketName, objectName, bucketLocation string, que
|
|||||||
host = c.s3AccelerateEndpoint
|
host = c.s3AccelerateEndpoint
|
||||||
} else {
|
} else {
|
||||||
// Do not change the host if the endpoint URL is a FIPS S3 endpoint.
|
// Do not change the host if the endpoint URL is a FIPS S3 endpoint.
|
||||||
if !s3utils.IsAmazonFIPSGovCloudEndpoint(c.endpointURL) {
|
if !s3utils.IsAmazonFIPSGovCloudEndpoint(*c.endpointURL) {
|
||||||
// Fetch new host based on the bucket location.
|
// Fetch new host based on the bucket location.
|
||||||
host = getS3Endpoint(bucketLocation)
|
host = getS3Endpoint(bucketLocation)
|
||||||
}
|
}
|
||||||
@ -798,9 +856,6 @@ func (c Client) makeTargetURL(bucketName, objectName, bucketLocation string, que
|
|||||||
// Make URL only if bucketName is available, otherwise use the
|
// Make URL only if bucketName is available, otherwise use the
|
||||||
// endpoint URL.
|
// endpoint URL.
|
||||||
if bucketName != "" {
|
if bucketName != "" {
|
||||||
// Save if target url will have buckets which suppport virtual host.
|
|
||||||
isVirtualHostStyle := s3utils.IsVirtualHostSupported(c.endpointURL, bucketName)
|
|
||||||
|
|
||||||
// If endpoint supports virtual host style use that always.
|
// If endpoint supports virtual host style use that always.
|
||||||
// Currently only S3 and Google Cloud Storage would support
|
// Currently only S3 and Google Cloud Storage would support
|
||||||
// virtual host style.
|
// virtual host style.
|
||||||
@ -823,10 +878,23 @@ func (c Client) makeTargetURL(bucketName, objectName, bucketLocation string, que
|
|||||||
urlStr = urlStr + "?" + s3utils.QueryEncode(queryValues)
|
urlStr = urlStr + "?" + s3utils.QueryEncode(queryValues)
|
||||||
}
|
}
|
||||||
|
|
||||||
u, err := url.Parse(urlStr)
|
return url.Parse(urlStr)
|
||||||
if err != nil {
|
}
|
||||||
return nil, err
|
|
||||||
|
// returns true if virtual hosted style requests are to be used.
|
||||||
|
func (c *Client) isVirtualHostStyleRequest(url url.URL, bucketName string) bool {
|
||||||
|
if bucketName == "" {
|
||||||
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
return u, nil
|
if c.lookup == BucketLookupDNS {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
if c.lookup == BucketLookupPath {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// default to virtual only for Amazon/Google storage. In all other cases use
|
||||||
|
// path style requests
|
||||||
|
return s3utils.IsVirtualHostSupported(url, bucketName)
|
||||||
}
|
}
|
||||||
|
5
vendor/github.com/minio/minio-go/appveyor.yml
generated
vendored
5
vendor/github.com/minio/minio-go/appveyor.yml
generated
vendored
@ -17,11 +17,10 @@ install:
|
|||||||
- go version
|
- go version
|
||||||
- go env
|
- go env
|
||||||
- go get -u github.com/golang/lint/golint
|
- go get -u github.com/golang/lint/golint
|
||||||
- go get -u github.com/go-ini/ini
|
|
||||||
- go get -u github.com/mitchellh/go-homedir
|
|
||||||
- go get -u github.com/remyoudompheng/go-misc/deadcode
|
- go get -u github.com/remyoudompheng/go-misc/deadcode
|
||||||
- go get -u github.com/gordonklaus/ineffassign
|
- go get -u github.com/gordonklaus/ineffassign
|
||||||
- go get -u github.com/dustin/go-humanize
|
- go get -u golang.org/x/crypto/argon2
|
||||||
|
- go get -t ./...
|
||||||
|
|
||||||
# to run your custom scripts instead of automatic MSBuild
|
# to run your custom scripts instead of automatic MSBuild
|
||||||
build_script:
|
build_script:
|
||||||
|
4
vendor/github.com/minio/minio-go/bucket-cache.go
generated
vendored
4
vendor/github.com/minio/minio-go/bucket-cache.go
generated
vendored
@ -203,7 +203,9 @@ func (c Client) getBucketLocationRequest(bucketName string) (*http.Request, erro
|
|||||||
}
|
}
|
||||||
|
|
||||||
if signerType.IsV2() {
|
if signerType.IsV2() {
|
||||||
req = s3signer.SignV2(*req, accessKeyID, secretAccessKey)
|
// Get Bucket Location calls should be always path style
|
||||||
|
isVirtualHost := false
|
||||||
|
req = s3signer.SignV2(*req, accessKeyID, secretAccessKey, isVirtualHost)
|
||||||
return req, nil
|
return req, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
69
vendor/github.com/minio/minio-go/bucket-notification.go
generated
vendored
69
vendor/github.com/minio/minio-go/bucket-notification.go
generated
vendored
@ -19,7 +19,8 @@ package minio
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/xml"
|
"encoding/xml"
|
||||||
"reflect"
|
|
||||||
|
"github.com/minio/minio-go/pkg/set"
|
||||||
)
|
)
|
||||||
|
|
||||||
// NotificationEventType is a S3 notification event associated to the bucket notification configuration
|
// NotificationEventType is a S3 notification event associated to the bucket notification configuration
|
||||||
@ -96,7 +97,7 @@ type NotificationConfig struct {
|
|||||||
|
|
||||||
// NewNotificationConfig creates one notification config and sets the given ARN
|
// NewNotificationConfig creates one notification config and sets the given ARN
|
||||||
func NewNotificationConfig(arn Arn) NotificationConfig {
|
func NewNotificationConfig(arn Arn) NotificationConfig {
|
||||||
return NotificationConfig{Arn: arn}
|
return NotificationConfig{Arn: arn, Filter: &Filter{}}
|
||||||
}
|
}
|
||||||
|
|
||||||
// AddEvents adds one event to the current notification config
|
// AddEvents adds one event to the current notification config
|
||||||
@ -163,39 +164,79 @@ type BucketNotification struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// AddTopic adds a given topic config to the general bucket notification config
|
// AddTopic adds a given topic config to the general bucket notification config
|
||||||
func (b *BucketNotification) AddTopic(topicConfig NotificationConfig) {
|
func (b *BucketNotification) AddTopic(topicConfig NotificationConfig) bool {
|
||||||
newTopicConfig := TopicConfig{NotificationConfig: topicConfig, Topic: topicConfig.Arn.String()}
|
newTopicConfig := TopicConfig{NotificationConfig: topicConfig, Topic: topicConfig.Arn.String()}
|
||||||
for _, n := range b.TopicConfigs {
|
for _, n := range b.TopicConfigs {
|
||||||
if reflect.DeepEqual(n, newTopicConfig) {
|
// If new config matches existing one
|
||||||
// Avoid adding duplicated entry
|
if n.Topic == newTopicConfig.Arn.String() && newTopicConfig.Filter == n.Filter {
|
||||||
return
|
|
||||||
|
existingConfig := set.NewStringSet()
|
||||||
|
for _, v := range n.Events {
|
||||||
|
existingConfig.Add(string(v))
|
||||||
|
}
|
||||||
|
|
||||||
|
newConfig := set.NewStringSet()
|
||||||
|
for _, v := range topicConfig.Events {
|
||||||
|
newConfig.Add(string(v))
|
||||||
|
}
|
||||||
|
|
||||||
|
if !newConfig.Intersection(existingConfig).IsEmpty() {
|
||||||
|
return false
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
b.TopicConfigs = append(b.TopicConfigs, newTopicConfig)
|
b.TopicConfigs = append(b.TopicConfigs, newTopicConfig)
|
||||||
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
// AddQueue adds a given queue config to the general bucket notification config
|
// AddQueue adds a given queue config to the general bucket notification config
|
||||||
func (b *BucketNotification) AddQueue(queueConfig NotificationConfig) {
|
func (b *BucketNotification) AddQueue(queueConfig NotificationConfig) bool {
|
||||||
newQueueConfig := QueueConfig{NotificationConfig: queueConfig, Queue: queueConfig.Arn.String()}
|
newQueueConfig := QueueConfig{NotificationConfig: queueConfig, Queue: queueConfig.Arn.String()}
|
||||||
for _, n := range b.QueueConfigs {
|
for _, n := range b.QueueConfigs {
|
||||||
if reflect.DeepEqual(n, newQueueConfig) {
|
if n.Queue == newQueueConfig.Arn.String() && newQueueConfig.Filter == n.Filter {
|
||||||
// Avoid adding duplicated entry
|
|
||||||
return
|
existingConfig := set.NewStringSet()
|
||||||
|
for _, v := range n.Events {
|
||||||
|
existingConfig.Add(string(v))
|
||||||
|
}
|
||||||
|
|
||||||
|
newConfig := set.NewStringSet()
|
||||||
|
for _, v := range queueConfig.Events {
|
||||||
|
newConfig.Add(string(v))
|
||||||
|
}
|
||||||
|
|
||||||
|
if !newConfig.Intersection(existingConfig).IsEmpty() {
|
||||||
|
return false
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
b.QueueConfigs = append(b.QueueConfigs, newQueueConfig)
|
b.QueueConfigs = append(b.QueueConfigs, newQueueConfig)
|
||||||
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
// AddLambda adds a given lambda config to the general bucket notification config
|
// AddLambda adds a given lambda config to the general bucket notification config
|
||||||
func (b *BucketNotification) AddLambda(lambdaConfig NotificationConfig) {
|
func (b *BucketNotification) AddLambda(lambdaConfig NotificationConfig) bool {
|
||||||
newLambdaConfig := LambdaConfig{NotificationConfig: lambdaConfig, Lambda: lambdaConfig.Arn.String()}
|
newLambdaConfig := LambdaConfig{NotificationConfig: lambdaConfig, Lambda: lambdaConfig.Arn.String()}
|
||||||
for _, n := range b.LambdaConfigs {
|
for _, n := range b.LambdaConfigs {
|
||||||
if reflect.DeepEqual(n, newLambdaConfig) {
|
if n.Lambda == newLambdaConfig.Arn.String() && newLambdaConfig.Filter == n.Filter {
|
||||||
// Avoid adding duplicated entry
|
|
||||||
return
|
existingConfig := set.NewStringSet()
|
||||||
|
for _, v := range n.Events {
|
||||||
|
existingConfig.Add(string(v))
|
||||||
|
}
|
||||||
|
|
||||||
|
newConfig := set.NewStringSet()
|
||||||
|
for _, v := range lambdaConfig.Events {
|
||||||
|
newConfig.Add(string(v))
|
||||||
|
}
|
||||||
|
|
||||||
|
if !newConfig.Intersection(existingConfig).IsEmpty() {
|
||||||
|
return false
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
b.LambdaConfigs = append(b.LambdaConfigs, newLambdaConfig)
|
b.LambdaConfigs = append(b.LambdaConfigs, newLambdaConfig)
|
||||||
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
// RemoveTopicByArn removes all topic configurations that match the exact specified ARN
|
// RemoveTopicByArn removes all topic configurations that match the exact specified ARN
|
||||||
|
7
vendor/github.com/minio/minio-go/constants.go
generated
vendored
7
vendor/github.com/minio/minio-go/constants.go
generated
vendored
@ -59,12 +59,5 @@ const (
|
|||||||
iso8601DateFormat = "20060102T150405Z"
|
iso8601DateFormat = "20060102T150405Z"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Encryption headers stored along with the object.
|
|
||||||
const (
|
|
||||||
amzHeaderIV = "X-Amz-Meta-X-Amz-Iv"
|
|
||||||
amzHeaderKey = "X-Amz-Meta-X-Amz-Key"
|
|
||||||
amzHeaderMatDesc = "X-Amz-Meta-X-Amz-Matdesc"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Storage class header constant.
|
// Storage class header constant.
|
||||||
const amzStorageClass = "X-Amz-Storage-Class"
|
const amzStorageClass = "X-Amz-Storage-Class"
|
||||||
|
10
vendor/github.com/minio/minio-go/core.go
generated
vendored
10
vendor/github.com/minio/minio-go/core.go
generated
vendored
@ -78,6 +78,8 @@ func (c Core) PutObject(bucket, object string, data io.Reader, size int64, md5Ba
|
|||||||
opts.ContentEncoding = v
|
opts.ContentEncoding = v
|
||||||
} else if strings.ToLower(k) == "content-disposition" {
|
} else if strings.ToLower(k) == "content-disposition" {
|
||||||
opts.ContentDisposition = v
|
opts.ContentDisposition = v
|
||||||
|
} else if strings.ToLower(k) == "content-language" {
|
||||||
|
opts.ContentLanguage = v
|
||||||
} else if strings.ToLower(k) == "content-type" {
|
} else if strings.ToLower(k) == "content-type" {
|
||||||
opts.ContentType = v
|
opts.ContentType = v
|
||||||
} else if strings.ToLower(k) == "cache-control" {
|
} else if strings.ToLower(k) == "cache-control" {
|
||||||
@ -103,13 +105,7 @@ func (c Core) ListMultipartUploads(bucket, prefix, keyMarker, uploadIDMarker, de
|
|||||||
|
|
||||||
// PutObjectPart - Upload an object part.
|
// PutObjectPart - Upload an object part.
|
||||||
func (c Core) PutObjectPart(bucket, object, uploadID string, partID int, data io.Reader, size int64, md5Base64, sha256Hex string) (ObjectPart, error) {
|
func (c Core) PutObjectPart(bucket, object, uploadID string, partID int, data io.Reader, size int64, md5Base64, sha256Hex string) (ObjectPart, error) {
|
||||||
return c.PutObjectPartWithMetadata(bucket, object, uploadID, partID, data, size, md5Base64, sha256Hex, nil)
|
return c.uploadPart(context.Background(), bucket, object, uploadID, data, partID, md5Base64, sha256Hex, size, nil)
|
||||||
}
|
|
||||||
|
|
||||||
// PutObjectPartWithMetadata - upload an object part with additional request metadata.
|
|
||||||
func (c Core) PutObjectPartWithMetadata(bucket, object, uploadID string, partID int, data io.Reader,
|
|
||||||
size int64, md5Base64, sha256Hex string, metadata map[string]string) (ObjectPart, error) {
|
|
||||||
return c.uploadPart(context.Background(), bucket, object, uploadID, data, partID, md5Base64, sha256Hex, size, metadata)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ListObjectParts - List uploaded parts of an incomplete upload.x
|
// ListObjectParts - List uploaded parts of an incomplete upload.x
|
||||||
|
6939
vendor/github.com/minio/minio-go/functional_tests.go
generated
vendored
6939
vendor/github.com/minio/minio-go/functional_tests.go
generated
vendored
File diff suppressed because it is too large
Load Diff
32
vendor/github.com/minio/minio-go/pkg/credentials/chain.go
generated
vendored
32
vendor/github.com/minio/minio-go/pkg/credentials/chain.go
generated
vendored
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Minio Go Library for Amazon S3 Compatible Cloud Storage
|
* Minio Go Library for Amazon S3 Compatible Cloud Storage
|
||||||
* (C) 2017 Minio, Inc.
|
* Copyright 2017 Minio, Inc.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -17,8 +17,6 @@
|
|||||||
|
|
||||||
package credentials
|
package credentials
|
||||||
|
|
||||||
import "fmt"
|
|
||||||
|
|
||||||
// A Chain will search for a provider which returns credentials
|
// A Chain will search for a provider which returns credentials
|
||||||
// and cache that provider until Retrieve is called again.
|
// and cache that provider until Retrieve is called again.
|
||||||
//
|
//
|
||||||
@ -27,11 +25,11 @@ import "fmt"
|
|||||||
// Providers in the list.
|
// Providers in the list.
|
||||||
//
|
//
|
||||||
// If none of the Providers retrieve valid credentials Value, ChainProvider's
|
// If none of the Providers retrieve valid credentials Value, ChainProvider's
|
||||||
// Retrieve() will return the error, collecting all errors from all providers.
|
// Retrieve() will return the no credentials value.
|
||||||
//
|
//
|
||||||
// If a Provider is found which returns valid credentials Value ChainProvider
|
// If a Provider is found which returns valid credentials Value ChainProvider
|
||||||
// will cache that Provider for all calls to IsExpired(), until Retrieve is
|
// will cache that Provider for all calls to IsExpired(), until Retrieve is
|
||||||
// called again.
|
// called again after IsExpired() is true.
|
||||||
//
|
//
|
||||||
// creds := credentials.NewChainCredentials(
|
// creds := credentials.NewChainCredentials(
|
||||||
// []credentials.Provider{
|
// []credentials.Provider{
|
||||||
@ -58,24 +56,26 @@ func NewChainCredentials(providers []Provider) *Credentials {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// Retrieve returns the credentials value or error if no provider returned
|
// Retrieve returns the credentials value, returns no credentials(anonymous)
|
||||||
// without error.
|
// if no credentials provider returned any value.
|
||||||
//
|
//
|
||||||
// If a provider is found it will be cached and any calls to IsExpired()
|
// If a provider is found with credentials, it will be cached and any calls
|
||||||
// will return the expired state of the cached provider.
|
// to IsExpired() will return the expired state of the cached provider.
|
||||||
func (c *Chain) Retrieve() (Value, error) {
|
func (c *Chain) Retrieve() (Value, error) {
|
||||||
var errs []error
|
|
||||||
for _, p := range c.Providers {
|
for _, p := range c.Providers {
|
||||||
creds, err := p.Retrieve()
|
creds, _ := p.Retrieve()
|
||||||
if err != nil {
|
// Always prioritize non-anonymous providers, if any.
|
||||||
errs = append(errs, err)
|
if creds.AccessKeyID == "" && creds.SecretAccessKey == "" {
|
||||||
continue
|
continue
|
||||||
} // Success.
|
}
|
||||||
c.curr = p
|
c.curr = p
|
||||||
return creds, nil
|
return creds, nil
|
||||||
}
|
}
|
||||||
c.curr = nil
|
// At this point we have exhausted all the providers and
|
||||||
return Value{}, fmt.Errorf("No valid providers found %v", errs)
|
// are left without any credentials return anonymous.
|
||||||
|
return Value{
|
||||||
|
SignerType: SignatureAnonymous,
|
||||||
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsExpired will returned the expired state of the currently cached provider
|
// IsExpired will returned the expired state of the currently cached provider
|
||||||
|
2
vendor/github.com/minio/minio-go/pkg/credentials/credentials.go
generated
vendored
2
vendor/github.com/minio/minio-go/pkg/credentials/credentials.go
generated
vendored
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Minio Go Library for Amazon S3 Compatible Cloud Storage
|
* Minio Go Library for Amazon S3 Compatible Cloud Storage
|
||||||
* (C) 2017 Minio, Inc.
|
* Copyright 2017 Minio, Inc.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
17
vendor/github.com/minio/minio-go/pkg/credentials/doc.go
generated
vendored
17
vendor/github.com/minio/minio-go/pkg/credentials/doc.go
generated
vendored
@ -1,3 +1,20 @@
|
|||||||
|
/*
|
||||||
|
* Minio Go Library for Amazon S3 Compatible Cloud Storage
|
||||||
|
* Copyright 2017 Minio, Inc.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
// Package credentials provides credential retrieval and management
|
// Package credentials provides credential retrieval and management
|
||||||
// for S3 compatible object storage.
|
// for S3 compatible object storage.
|
||||||
//
|
//
|
||||||
|
2
vendor/github.com/minio/minio-go/pkg/credentials/env_aws.go
generated
vendored
2
vendor/github.com/minio/minio-go/pkg/credentials/env_aws.go
generated
vendored
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Minio Go Library for Amazon S3 Compatible Cloud Storage
|
* Minio Go Library for Amazon S3 Compatible Cloud Storage
|
||||||
* (C) 2017 Minio, Inc.
|
* Copyright 2017 Minio, Inc.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
2
vendor/github.com/minio/minio-go/pkg/credentials/env_minio.go
generated
vendored
2
vendor/github.com/minio/minio-go/pkg/credentials/env_minio.go
generated
vendored
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Minio Go Library for Amazon S3 Compatible Cloud Storage
|
* Minio Go Library for Amazon S3 Compatible Cloud Storage
|
||||||
* (C) 2017 Minio, Inc.
|
* Copyright 2017 Minio, Inc.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
4
vendor/github.com/minio/minio-go/pkg/credentials/file_aws_credentials.go
generated
vendored
4
vendor/github.com/minio/minio-go/pkg/credentials/file_aws_credentials.go
generated
vendored
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Minio Go Library for Amazon S3 Compatible Cloud Storage
|
* Minio Go Library for Amazon S3 Compatible Cloud Storage
|
||||||
* (C) 2017 Minio, Inc.
|
* Copyright 2017 Minio, Inc.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -22,7 +22,7 @@ import (
|
|||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
|
||||||
"github.com/go-ini/ini"
|
"github.com/go-ini/ini"
|
||||||
homedir "github.com/minio/go-homedir"
|
homedir "github.com/mitchellh/go-homedir"
|
||||||
)
|
)
|
||||||
|
|
||||||
// A FileAWSCredentials retrieves credentials from the current user's home
|
// A FileAWSCredentials retrieves credentials from the current user's home
|
||||||
|
4
vendor/github.com/minio/minio-go/pkg/credentials/file_minio_client.go
generated
vendored
4
vendor/github.com/minio/minio-go/pkg/credentials/file_minio_client.go
generated
vendored
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Minio Go Library for Amazon S3 Compatible Cloud Storage
|
* Minio Go Library for Amazon S3 Compatible Cloud Storage
|
||||||
* (C) 2017 Minio, Inc.
|
* Copyright 2017 Minio, Inc.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -24,7 +24,7 @@ import (
|
|||||||
"path/filepath"
|
"path/filepath"
|
||||||
"runtime"
|
"runtime"
|
||||||
|
|
||||||
homedir "github.com/minio/go-homedir"
|
homedir "github.com/mitchellh/go-homedir"
|
||||||
)
|
)
|
||||||
|
|
||||||
// A FileMinioClient retrieves credentials from the current user's home
|
// A FileMinioClient retrieves credentials from the current user's home
|
||||||
|
15
vendor/github.com/minio/minio-go/pkg/credentials/iam_aws.go
generated
vendored
15
vendor/github.com/minio/minio-go/pkg/credentials/iam_aws.go
generated
vendored
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Minio Go Library for Amazon S3 Compatible Cloud Storage
|
* Minio Go Library for Amazon S3 Compatible Cloud Storage
|
||||||
* (C) 2017 Minio, Inc.
|
* Copyright 2017 Minio, Inc.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -46,18 +46,6 @@ type IAM struct {
|
|||||||
endpoint string
|
endpoint string
|
||||||
}
|
}
|
||||||
|
|
||||||
// redirectHeaders copies all headers when following a redirect URL.
|
|
||||||
// This won't be needed anymore from go 1.8 (https://github.com/golang/go/issues/4800)
|
|
||||||
func redirectHeaders(req *http.Request, via []*http.Request) error {
|
|
||||||
if len(via) == 0 {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
for key, val := range via[0].Header {
|
|
||||||
req.Header[key] = val
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// IAM Roles for Amazon EC2
|
// IAM Roles for Amazon EC2
|
||||||
// http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html
|
// http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html
|
||||||
const (
|
const (
|
||||||
@ -75,7 +63,6 @@ func NewIAM(endpoint string) *Credentials {
|
|||||||
p := &IAM{
|
p := &IAM{
|
||||||
Client: &http.Client{
|
Client: &http.Client{
|
||||||
Transport: http.DefaultTransport,
|
Transport: http.DefaultTransport,
|
||||||
CheckRedirect: redirectHeaders,
|
|
||||||
},
|
},
|
||||||
endpoint: endpoint,
|
endpoint: endpoint,
|
||||||
}
|
}
|
||||||
|
3
vendor/github.com/minio/minio-go/pkg/credentials/signature-type.go
generated
vendored
3
vendor/github.com/minio/minio-go/pkg/credentials/signature-type.go
generated
vendored
@ -1,5 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Minio Go Library for Amazon S3 Compatible Cloud Storage (C) 2017 Minio, Inc.
|
* Minio Go Library for Amazon S3 Compatible Cloud Storage
|
||||||
|
* Copyright 2017 Minio, Inc.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
2
vendor/github.com/minio/minio-go/pkg/credentials/static.go
generated
vendored
2
vendor/github.com/minio/minio-go/pkg/credentials/static.go
generated
vendored
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Minio Go Library for Amazon S3 Compatible Cloud Storage
|
* Minio Go Library for Amazon S3 Compatible Cloud Storage
|
||||||
* (C) 2017 Minio, Inc.
|
* Copyright 2017 Minio, Inc.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
293
vendor/github.com/minio/minio-go/pkg/encrypt/cbc.go
generated
vendored
293
vendor/github.com/minio/minio-go/pkg/encrypt/cbc.go
generated
vendored
@ -1,293 +0,0 @@
|
|||||||
/*
|
|
||||||
* Minio Go Library for Amazon S3 Compatible Cloud Storage (C) 2017 Minio, Inc.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package encrypt
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"crypto/aes"
|
|
||||||
"crypto/cipher"
|
|
||||||
"crypto/rand"
|
|
||||||
"encoding/base64"
|
|
||||||
"errors"
|
|
||||||
"io"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Crypt mode - encryption or decryption
|
|
||||||
type cryptMode int
|
|
||||||
|
|
||||||
const (
|
|
||||||
encryptMode cryptMode = iota
|
|
||||||
decryptMode
|
|
||||||
)
|
|
||||||
|
|
||||||
// CBCSecureMaterials encrypts/decrypts data using AES CBC algorithm
|
|
||||||
type CBCSecureMaterials struct {
|
|
||||||
|
|
||||||
// Data stream to encrypt/decrypt
|
|
||||||
stream io.Reader
|
|
||||||
|
|
||||||
// Last internal error
|
|
||||||
err error
|
|
||||||
|
|
||||||
// End of file reached
|
|
||||||
eof bool
|
|
||||||
|
|
||||||
// Holds initial data
|
|
||||||
srcBuf *bytes.Buffer
|
|
||||||
|
|
||||||
// Holds transformed data (encrypted or decrypted)
|
|
||||||
dstBuf *bytes.Buffer
|
|
||||||
|
|
||||||
// Encryption algorithm
|
|
||||||
encryptionKey Key
|
|
||||||
|
|
||||||
// Key to encrypts/decrypts data
|
|
||||||
contentKey []byte
|
|
||||||
|
|
||||||
// Encrypted form of contentKey
|
|
||||||
cryptedKey []byte
|
|
||||||
|
|
||||||
// Initialization vector
|
|
||||||
iv []byte
|
|
||||||
|
|
||||||
// matDesc - currently unused
|
|
||||||
matDesc []byte
|
|
||||||
|
|
||||||
// Indicate if we are going to encrypt or decrypt
|
|
||||||
cryptMode cryptMode
|
|
||||||
|
|
||||||
// Helper that encrypts/decrypts data
|
|
||||||
blockMode cipher.BlockMode
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewCBCSecureMaterials builds new CBC crypter module with
|
|
||||||
// the specified encryption key (symmetric or asymmetric)
|
|
||||||
func NewCBCSecureMaterials(key Key) (*CBCSecureMaterials, error) {
|
|
||||||
if key == nil {
|
|
||||||
return nil, errors.New("Unable to recognize empty encryption properties")
|
|
||||||
}
|
|
||||||
return &CBCSecureMaterials{
|
|
||||||
srcBuf: bytes.NewBuffer([]byte{}),
|
|
||||||
dstBuf: bytes.NewBuffer([]byte{}),
|
|
||||||
encryptionKey: key,
|
|
||||||
matDesc: []byte("{}"),
|
|
||||||
}, nil
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Close implements closes the internal stream.
|
|
||||||
func (s *CBCSecureMaterials) Close() error {
|
|
||||||
closer, ok := s.stream.(io.Closer)
|
|
||||||
if ok {
|
|
||||||
return closer.Close()
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetupEncryptMode - tells CBC that we are going to encrypt data
|
|
||||||
func (s *CBCSecureMaterials) SetupEncryptMode(stream io.Reader) error {
|
|
||||||
// Set mode to encrypt
|
|
||||||
s.cryptMode = encryptMode
|
|
||||||
|
|
||||||
// Set underlying reader
|
|
||||||
s.stream = stream
|
|
||||||
|
|
||||||
s.eof = false
|
|
||||||
s.srcBuf.Reset()
|
|
||||||
s.dstBuf.Reset()
|
|
||||||
|
|
||||||
var err error
|
|
||||||
|
|
||||||
// Generate random content key
|
|
||||||
s.contentKey = make([]byte, aes.BlockSize*2)
|
|
||||||
if _, err := rand.Read(s.contentKey); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
// Encrypt content key
|
|
||||||
s.cryptedKey, err = s.encryptionKey.Encrypt(s.contentKey)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
// Generate random IV
|
|
||||||
s.iv = make([]byte, aes.BlockSize)
|
|
||||||
if _, err = rand.Read(s.iv); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
// New cipher
|
|
||||||
encryptContentBlock, err := aes.NewCipher(s.contentKey)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
s.blockMode = cipher.NewCBCEncrypter(encryptContentBlock, s.iv)
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetupDecryptMode - tells CBC that we are going to decrypt data
|
|
||||||
func (s *CBCSecureMaterials) SetupDecryptMode(stream io.Reader, iv string, key string) error {
|
|
||||||
// Set mode to decrypt
|
|
||||||
s.cryptMode = decryptMode
|
|
||||||
|
|
||||||
// Set underlying reader
|
|
||||||
s.stream = stream
|
|
||||||
|
|
||||||
// Reset
|
|
||||||
s.eof = false
|
|
||||||
s.srcBuf.Reset()
|
|
||||||
s.dstBuf.Reset()
|
|
||||||
|
|
||||||
var err error
|
|
||||||
|
|
||||||
// Get IV
|
|
||||||
s.iv, err = base64.StdEncoding.DecodeString(iv)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get encrypted content key
|
|
||||||
s.cryptedKey, err = base64.StdEncoding.DecodeString(key)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Decrypt content key
|
|
||||||
s.contentKey, err = s.encryptionKey.Decrypt(s.cryptedKey)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// New cipher
|
|
||||||
decryptContentBlock, err := aes.NewCipher(s.contentKey)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
s.blockMode = cipher.NewCBCDecrypter(decryptContentBlock, s.iv)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetIV - return randomly generated IV (per S3 object), base64 encoded.
|
|
||||||
func (s *CBCSecureMaterials) GetIV() string {
|
|
||||||
return base64.StdEncoding.EncodeToString(s.iv)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetKey - return content encrypting key (cek) in encrypted form, base64 encoded.
|
|
||||||
func (s *CBCSecureMaterials) GetKey() string {
|
|
||||||
return base64.StdEncoding.EncodeToString(s.cryptedKey)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetDesc - user provided encryption material description in JSON (UTF8) format.
|
|
||||||
func (s *CBCSecureMaterials) GetDesc() string {
|
|
||||||
return string(s.matDesc)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Fill buf with encrypted/decrypted data
|
|
||||||
func (s *CBCSecureMaterials) Read(buf []byte) (n int, err error) {
|
|
||||||
// Always fill buf from bufChunk at the end of this function
|
|
||||||
defer func() {
|
|
||||||
if s.err != nil {
|
|
||||||
n, err = 0, s.err
|
|
||||||
} else {
|
|
||||||
n, err = s.dstBuf.Read(buf)
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
|
|
||||||
// Return
|
|
||||||
if s.eof {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// Fill dest buffer if its length is less than buf
|
|
||||||
for !s.eof && s.dstBuf.Len() < len(buf) {
|
|
||||||
|
|
||||||
srcPart := make([]byte, aes.BlockSize)
|
|
||||||
dstPart := make([]byte, aes.BlockSize)
|
|
||||||
|
|
||||||
// Fill src buffer
|
|
||||||
for s.srcBuf.Len() < aes.BlockSize*2 {
|
|
||||||
_, err = io.CopyN(s.srcBuf, s.stream, aes.BlockSize)
|
|
||||||
if err != nil {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Quit immediately for errors other than io.EOF
|
|
||||||
if err != nil && err != io.EOF {
|
|
||||||
s.err = err
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// Mark current encrypting/decrypting as finished
|
|
||||||
s.eof = (err == io.EOF)
|
|
||||||
|
|
||||||
if s.eof && s.cryptMode == encryptMode {
|
|
||||||
if srcPart, err = pkcs5Pad(s.srcBuf.Bytes(), aes.BlockSize); err != nil {
|
|
||||||
s.err = err
|
|
||||||
return
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
_, _ = s.srcBuf.Read(srcPart)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Crypt srcPart content
|
|
||||||
for len(srcPart) > 0 {
|
|
||||||
|
|
||||||
// Crypt current part
|
|
||||||
s.blockMode.CryptBlocks(dstPart, srcPart[:aes.BlockSize])
|
|
||||||
|
|
||||||
// Unpad when this is the last part and we are decrypting
|
|
||||||
if s.eof && s.cryptMode == decryptMode {
|
|
||||||
dstPart, err = pkcs5Unpad(dstPart, aes.BlockSize)
|
|
||||||
if err != nil {
|
|
||||||
s.err = err
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Send crypted data to dstBuf
|
|
||||||
if _, wErr := s.dstBuf.Write(dstPart); wErr != nil {
|
|
||||||
s.err = wErr
|
|
||||||
return
|
|
||||||
}
|
|
||||||
// Move to the next part
|
|
||||||
srcPart = srcPart[aes.BlockSize:]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// Unpad a set of bytes following PKCS5 algorithm
|
|
||||||
func pkcs5Unpad(buf []byte, blockSize int) ([]byte, error) {
|
|
||||||
len := len(buf)
|
|
||||||
if len == 0 {
|
|
||||||
return nil, errors.New("buffer is empty")
|
|
||||||
}
|
|
||||||
pad := int(buf[len-1])
|
|
||||||
if pad > len || pad > blockSize {
|
|
||||||
return nil, errors.New("invalid padding size")
|
|
||||||
}
|
|
||||||
return buf[:len-pad], nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Pad a set of bytes following PKCS5 algorithm
|
|
||||||
func pkcs5Pad(buf []byte, blockSize int) ([]byte, error) {
|
|
||||||
len := len(buf)
|
|
||||||
pad := blockSize - (len % blockSize)
|
|
||||||
padText := bytes.Repeat([]byte{byte(pad)}, pad)
|
|
||||||
return append(buf, padText...), nil
|
|
||||||
}
|
|
53
vendor/github.com/minio/minio-go/pkg/encrypt/interface.go
generated
vendored
53
vendor/github.com/minio/minio-go/pkg/encrypt/interface.go
generated
vendored
@ -1,53 +0,0 @@
|
|||||||
/*
|
|
||||||
* Minio Go Library for Amazon S3 Compatible Cloud Storage (C) 2017 Minio, Inc.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Package encrypt implements a generic interface to encrypt any stream of data.
|
|
||||||
// currently this package implements two types of encryption
|
|
||||||
// - Symmetric encryption using AES.
|
|
||||||
// - Asymmetric encrytion using RSA.
|
|
||||||
package encrypt
|
|
||||||
|
|
||||||
import "io"
|
|
||||||
|
|
||||||
// Materials - provides generic interface to encrypt any stream of data.
|
|
||||||
type Materials interface {
|
|
||||||
|
|
||||||
// Closes the wrapped stream properly, initiated by the caller.
|
|
||||||
Close() error
|
|
||||||
|
|
||||||
// Returns encrypted/decrypted data, io.Reader compatible.
|
|
||||||
Read(b []byte) (int, error)
|
|
||||||
|
|
||||||
// Get randomly generated IV, base64 encoded.
|
|
||||||
GetIV() (iv string)
|
|
||||||
|
|
||||||
// Get content encrypting key (cek) in encrypted form, base64 encoded.
|
|
||||||
GetKey() (key string)
|
|
||||||
|
|
||||||
// Get user provided encryption material description in
|
|
||||||
// JSON (UTF8) format. This is not used, kept for future.
|
|
||||||
GetDesc() (desc string)
|
|
||||||
|
|
||||||
// Setup encrypt mode, further calls of Read() function
|
|
||||||
// will return the encrypted form of data streamed
|
|
||||||
// by the passed reader
|
|
||||||
SetupEncryptMode(stream io.Reader) error
|
|
||||||
|
|
||||||
// Setup decrypted mode, further calls of Read() function
|
|
||||||
// will return the decrypted form of data streamed
|
|
||||||
// by the passed reader
|
|
||||||
SetupDecryptMode(stream io.Reader, iv string, key string) error
|
|
||||||
}
|
|
165
vendor/github.com/minio/minio-go/pkg/encrypt/keys.go
generated
vendored
165
vendor/github.com/minio/minio-go/pkg/encrypt/keys.go
generated
vendored
@ -1,165 +0,0 @@
|
|||||||
/*
|
|
||||||
* Minio Go Library for Amazon S3 Compatible Cloud Storage (C) 2017 Minio, Inc.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package encrypt
|
|
||||||
|
|
||||||
import (
|
|
||||||
"crypto/aes"
|
|
||||||
"crypto/rand"
|
|
||||||
"crypto/rsa"
|
|
||||||
"crypto/x509"
|
|
||||||
"errors"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Key - generic interface to encrypt/decrypt a key.
|
|
||||||
// We use it to encrypt/decrypt content key which is the key
|
|
||||||
// that encrypt/decrypt object data.
|
|
||||||
type Key interface {
|
|
||||||
// Encrypt data using to the set encryption key
|
|
||||||
Encrypt([]byte) ([]byte, error)
|
|
||||||
// Decrypt data using to the set encryption key
|
|
||||||
Decrypt([]byte) ([]byte, error)
|
|
||||||
}
|
|
||||||
|
|
||||||
// SymmetricKey - encrypts data with a symmetric master key
|
|
||||||
type SymmetricKey struct {
|
|
||||||
masterKey []byte
|
|
||||||
}
|
|
||||||
|
|
||||||
// Encrypt passed bytes
|
|
||||||
func (s *SymmetricKey) Encrypt(plain []byte) ([]byte, error) {
|
|
||||||
// Initialize an AES encryptor using a master key
|
|
||||||
keyBlock, err := aes.NewCipher(s.masterKey)
|
|
||||||
if err != nil {
|
|
||||||
return []byte{}, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Pad the key before encryption
|
|
||||||
plain, _ = pkcs5Pad(plain, aes.BlockSize)
|
|
||||||
|
|
||||||
encKey := []byte{}
|
|
||||||
encPart := make([]byte, aes.BlockSize)
|
|
||||||
|
|
||||||
// Encrypt the passed key by block
|
|
||||||
for {
|
|
||||||
if len(plain) < aes.BlockSize {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
// Encrypt the passed key
|
|
||||||
keyBlock.Encrypt(encPart, plain[:aes.BlockSize])
|
|
||||||
// Add the encrypted block to the total encrypted key
|
|
||||||
encKey = append(encKey, encPart...)
|
|
||||||
// Pass to the next plain block
|
|
||||||
plain = plain[aes.BlockSize:]
|
|
||||||
}
|
|
||||||
return encKey, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Decrypt passed bytes
|
|
||||||
func (s *SymmetricKey) Decrypt(cipher []byte) ([]byte, error) {
|
|
||||||
// Initialize AES decrypter
|
|
||||||
keyBlock, err := aes.NewCipher(s.masterKey)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var plain []byte
|
|
||||||
plainPart := make([]byte, aes.BlockSize)
|
|
||||||
|
|
||||||
// Decrypt the encrypted data block by block
|
|
||||||
for {
|
|
||||||
if len(cipher) < aes.BlockSize {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
keyBlock.Decrypt(plainPart, cipher[:aes.BlockSize])
|
|
||||||
// Add the decrypted block to the total result
|
|
||||||
plain = append(plain, plainPart...)
|
|
||||||
// Pass to the next cipher block
|
|
||||||
cipher = cipher[aes.BlockSize:]
|
|
||||||
}
|
|
||||||
|
|
||||||
// Unpad the resulted plain data
|
|
||||||
plain, err = pkcs5Unpad(plain, aes.BlockSize)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return plain, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewSymmetricKey generates a new encrypt/decrypt crypto using
|
|
||||||
// an AES master key password
|
|
||||||
func NewSymmetricKey(b []byte) *SymmetricKey {
|
|
||||||
return &SymmetricKey{masterKey: b}
|
|
||||||
}
|
|
||||||
|
|
||||||
// AsymmetricKey - struct which encrypts/decrypts data
|
|
||||||
// using RSA public/private certificates
|
|
||||||
type AsymmetricKey struct {
|
|
||||||
publicKey *rsa.PublicKey
|
|
||||||
privateKey *rsa.PrivateKey
|
|
||||||
}
|
|
||||||
|
|
||||||
// Encrypt data using public key
|
|
||||||
func (a *AsymmetricKey) Encrypt(plain []byte) ([]byte, error) {
|
|
||||||
cipher, err := rsa.EncryptPKCS1v15(rand.Reader, a.publicKey, plain)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return cipher, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Decrypt data using public key
|
|
||||||
func (a *AsymmetricKey) Decrypt(cipher []byte) ([]byte, error) {
|
|
||||||
cipher, err := rsa.DecryptPKCS1v15(rand.Reader, a.privateKey, cipher)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return cipher, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewAsymmetricKey - generates a crypto module able to encrypt/decrypt
|
|
||||||
// data using a pair for private and public key
|
|
||||||
func NewAsymmetricKey(privData []byte, pubData []byte) (*AsymmetricKey, error) {
|
|
||||||
// Parse private key from passed data
|
|
||||||
priv, err := x509.ParsePKCS8PrivateKey(privData)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
privKey, ok := priv.(*rsa.PrivateKey)
|
|
||||||
if !ok {
|
|
||||||
return nil, errors.New("not a valid private key")
|
|
||||||
}
|
|
||||||
|
|
||||||
// Parse public key from passed data
|
|
||||||
pub, err := x509.ParsePKIXPublicKey(pubData)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
pubKey, ok := pub.(*rsa.PublicKey)
|
|
||||||
if !ok {
|
|
||||||
return nil, errors.New("not a valid public key")
|
|
||||||
}
|
|
||||||
|
|
||||||
// Associate the private key with the passed public key
|
|
||||||
privKey.PublicKey = *pubKey
|
|
||||||
|
|
||||||
return &AsymmetricKey{
|
|
||||||
publicKey: pubKey,
|
|
||||||
privateKey: privKey,
|
|
||||||
}, nil
|
|
||||||
}
|
|
146
vendor/github.com/minio/minio-go/pkg/encrypt/server-side.go
generated
vendored
Normal file
146
vendor/github.com/minio/minio-go/pkg/encrypt/server-side.go
generated
vendored
Normal file
@ -0,0 +1,146 @@
|
|||||||
|
/*
|
||||||
|
* Minio Go Library for Amazon S3 Compatible Cloud Storage
|
||||||
|
* Copyright 2018 Minio, Inc.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package encrypt
|
||||||
|
|
||||||
|
import (
|
||||||
|
"crypto/md5"
|
||||||
|
"encoding/base64"
|
||||||
|
"errors"
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
"golang.org/x/crypto/argon2"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
// sseGenericHeader is the AWS SSE header used for SSE-S3 and SSE-KMS.
|
||||||
|
sseGenericHeader = "X-Amz-Server-Side-Encryption"
|
||||||
|
|
||||||
|
// sseCustomerAlgorithm is the AWS SSE-C algorithm HTTP header key.
|
||||||
|
sseCustomerAlgorithm = sseGenericHeader + "-Customer-Algorithm"
|
||||||
|
// sseCustomerKey is the AWS SSE-C encryption key HTTP header key.
|
||||||
|
sseCustomerKey = sseGenericHeader + "-Customer-Key"
|
||||||
|
// sseCustomerKeyMD5 is the AWS SSE-C encryption key MD5 HTTP header key.
|
||||||
|
sseCustomerKeyMD5 = sseGenericHeader + "-Customer-Key-MD5"
|
||||||
|
|
||||||
|
// sseCopyCustomerAlgorithm is the AWS SSE-C algorithm HTTP header key for CopyObject API.
|
||||||
|
sseCopyCustomerAlgorithm = "X-Amz-Copy-Source-Server-Side-Encryption-Customer-Algorithm"
|
||||||
|
// sseCopyCustomerKey is the AWS SSE-C encryption key HTTP header key for CopyObject API.
|
||||||
|
sseCopyCustomerKey = "X-Amz-Copy-Source-Server-Side-Encryption-Customer-Key"
|
||||||
|
// sseCopyCustomerKeyMD5 is the AWS SSE-C encryption key MD5 HTTP header key for CopyObject API.
|
||||||
|
sseCopyCustomerKeyMD5 = "X-Amz-Copy-Source-Server-Side-Encryption-Customer-Key-MD5"
|
||||||
|
)
|
||||||
|
|
||||||
|
// PBKDF creates a SSE-C key from the provided password and salt.
|
||||||
|
// PBKDF is a password-based key derivation function
|
||||||
|
// which can be used to derive a high-entropy cryptographic
|
||||||
|
// key from a low-entropy password and a salt.
|
||||||
|
type PBKDF func(password, salt []byte) ServerSide
|
||||||
|
|
||||||
|
// DefaultPBKDF is the default PBKDF. It uses Argon2id with the
|
||||||
|
// recommended parameters from the RFC draft (1 pass, 64 MB memory, 4 threads).
|
||||||
|
var DefaultPBKDF PBKDF = func(password, salt []byte) ServerSide {
|
||||||
|
sse := ssec{}
|
||||||
|
copy(sse[:], argon2.IDKey(password, salt, 1, 64*1024, 4, 32))
|
||||||
|
return sse
|
||||||
|
}
|
||||||
|
|
||||||
|
// Type is the server-side-encryption method. It represents one of
|
||||||
|
// the following encryption methods:
|
||||||
|
// - SSE-C: server-side-encryption with customer provided keys
|
||||||
|
// - KMS: server-side-encryption with managed keys
|
||||||
|
// - S3: server-side-encryption using S3 storage encryption
|
||||||
|
type Type string
|
||||||
|
|
||||||
|
const (
|
||||||
|
// SSEC represents server-side-encryption with customer provided keys
|
||||||
|
SSEC Type = "SSE-C"
|
||||||
|
// KMS represents server-side-encryption with managed keys
|
||||||
|
KMS Type = "KMS"
|
||||||
|
// S3 represents server-side-encryption using S3 storage encryption
|
||||||
|
S3 Type = "S3"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ServerSide is a form of S3 server-side-encryption.
|
||||||
|
type ServerSide interface {
|
||||||
|
// Type returns the server-side-encryption method.
|
||||||
|
Type() Type
|
||||||
|
|
||||||
|
// Marshal adds encryption headers to the provided HTTP headers.
|
||||||
|
// It marks an HTTP request as server-side-encryption request
|
||||||
|
// and inserts the required data into the headers.
|
||||||
|
Marshal(h http.Header)
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewSSE returns a server-side-encryption using S3 storage encryption.
|
||||||
|
// Using SSE-S3 the server will encrypt the object with server-managed keys.
|
||||||
|
func NewSSE() ServerSide { return s3{} }
|
||||||
|
|
||||||
|
// NewSSEC returns a new server-side-encryption using SSE-C and the provided key.
|
||||||
|
// The key must be 32 bytes long.
|
||||||
|
func NewSSEC(key []byte) (ServerSide, error) {
|
||||||
|
if len(key) != 32 {
|
||||||
|
return nil, errors.New("encrypt: SSE-C key must be 256 bit long")
|
||||||
|
}
|
||||||
|
sse := ssec{}
|
||||||
|
copy(sse[:], key)
|
||||||
|
return sse, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// SSECopy transforms a SSE-C encryption into a SSE-C copy
|
||||||
|
// encryption. This is required for SSE-C key rotation or a SSE-C
|
||||||
|
// copy where the source and the destination should be encrypted.
|
||||||
|
//
|
||||||
|
// If the provided sse is no SSE-C encryption SSECopy returns
|
||||||
|
// sse unmodified.
|
||||||
|
func SSECopy(sse ServerSide) ServerSide {
|
||||||
|
if sse == nil || sse.Type() != SSEC {
|
||||||
|
return sse
|
||||||
|
}
|
||||||
|
if sse, ok := sse.(ssec); ok {
|
||||||
|
return ssecCopy(sse)
|
||||||
|
}
|
||||||
|
return sse
|
||||||
|
}
|
||||||
|
|
||||||
|
type ssec [32]byte
|
||||||
|
|
||||||
|
func (s ssec) Type() Type { return SSEC }
|
||||||
|
|
||||||
|
func (s ssec) Marshal(h http.Header) {
|
||||||
|
keyMD5 := md5.Sum(s[:])
|
||||||
|
h.Set(sseCustomerAlgorithm, "AES256")
|
||||||
|
h.Set(sseCustomerKey, base64.StdEncoding.EncodeToString(s[:]))
|
||||||
|
h.Set(sseCustomerKeyMD5, base64.StdEncoding.EncodeToString(keyMD5[:]))
|
||||||
|
}
|
||||||
|
|
||||||
|
type ssecCopy [32]byte
|
||||||
|
|
||||||
|
func (s ssecCopy) Type() Type { return SSEC }
|
||||||
|
|
||||||
|
func (s ssecCopy) Marshal(h http.Header) {
|
||||||
|
keyMD5 := md5.Sum(s[:])
|
||||||
|
h.Set(sseCopyCustomerAlgorithm, "AES256")
|
||||||
|
h.Set(sseCopyCustomerKey, base64.StdEncoding.EncodeToString(s[:]))
|
||||||
|
h.Set(sseCopyCustomerKeyMD5, base64.StdEncoding.EncodeToString(keyMD5[:]))
|
||||||
|
}
|
||||||
|
|
||||||
|
type s3 struct{}
|
||||||
|
|
||||||
|
func (s s3) Type() Type { return S3 }
|
||||||
|
|
||||||
|
func (s s3) Marshal(h http.Header) { h.Set(sseGenericHeader, "AES256") }
|
3
vendor/github.com/minio/minio-go/pkg/policy/bucket-policy-condition.go
generated
vendored
3
vendor/github.com/minio/minio-go/pkg/policy/bucket-policy-condition.go
generated
vendored
@ -1,5 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Minio Go Library for Amazon S3 Compatible Cloud Storage (C) 2015 Minio, Inc.
|
* Minio Go Library for Amazon S3 Compatible Cloud Storage
|
||||||
|
* Copyright 2015-2017 Minio, Inc.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
38
vendor/github.com/minio/minio-go/pkg/policy/bucket-policy.go
generated
vendored
38
vendor/github.com/minio/minio-go/pkg/policy/bucket-policy.go
generated
vendored
@ -1,5 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Minio Go Library for Amazon S3 Compatible Cloud Storage (C) 2015 Minio, Inc.
|
* Minio Go Library for Amazon S3 Compatible Cloud Storage
|
||||||
|
* Copyright 2015-2017 Minio, Inc.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -17,6 +18,8 @@
|
|||||||
package policy
|
package policy
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
"reflect"
|
"reflect"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
@ -81,6 +84,33 @@ type User struct {
|
|||||||
CanonicalUser set.StringSet `json:"CanonicalUser,omitempty"`
|
CanonicalUser set.StringSet `json:"CanonicalUser,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// UnmarshalJSON is a custom json unmarshaler for Principal field,
|
||||||
|
// the reason is that Principal can take a json struct represented by
|
||||||
|
// User string but it can also take a string.
|
||||||
|
func (u *User) UnmarshalJSON(data []byte) error {
|
||||||
|
// Try to unmarshal data in a struct equal to User, we need it
|
||||||
|
// to avoid infinite recursive call of this function
|
||||||
|
type AliasUser User
|
||||||
|
var au AliasUser
|
||||||
|
err := json.Unmarshal(data, &au)
|
||||||
|
if err == nil {
|
||||||
|
*u = User(au)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
// Data type is not known, check if it is a json string
|
||||||
|
// which contains a star, which is permitted in the spec
|
||||||
|
var str string
|
||||||
|
err = json.Unmarshal(data, &str)
|
||||||
|
if err == nil {
|
||||||
|
if str != "*" {
|
||||||
|
return errors.New("unrecognized Principal field")
|
||||||
|
}
|
||||||
|
*u = User{AWS: set.CreateStringSet("*")}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
// Statement - minio policy statement
|
// Statement - minio policy statement
|
||||||
type Statement struct {
|
type Statement struct {
|
||||||
Actions set.StringSet `json:"Action"`
|
Actions set.StringSet `json:"Action"`
|
||||||
@ -563,14 +593,14 @@ func GetPolicy(statements []Statement, bucketName string, prefix string) BucketP
|
|||||||
return policy
|
return policy
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPolicies - returns a map of policies rules of given bucket name, prefix in given statements.
|
// GetPolicies - returns a map of policies of given bucket name, prefix in given statements.
|
||||||
func GetPolicies(statements []Statement, bucketName string) map[string]BucketPolicy {
|
func GetPolicies(statements []Statement, bucketName, prefix string) map[string]BucketPolicy {
|
||||||
policyRules := map[string]BucketPolicy{}
|
policyRules := map[string]BucketPolicy{}
|
||||||
objResources := set.NewStringSet()
|
objResources := set.NewStringSet()
|
||||||
// Search all resources related to objects policy
|
// Search all resources related to objects policy
|
||||||
for _, s := range statements {
|
for _, s := range statements {
|
||||||
for r := range s.Resources {
|
for r := range s.Resources {
|
||||||
if strings.HasPrefix(r, awsResourcePrefix+bucketName+"/") {
|
if strings.HasPrefix(r, awsResourcePrefix+bucketName+"/"+prefix) {
|
||||||
objResources.Add(r)
|
objResources.Add(r)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
7
vendor/github.com/minio/minio-go/pkg/s3signer/request-signature-streaming.go
generated
vendored
7
vendor/github.com/minio/minio-go/pkg/s3signer/request-signature-streaming.go
generated
vendored
@ -1,5 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Minio Go Library for Amazon S3 Compatible Cloud Storage (C) 2017 Minio, Inc.
|
* Minio Go Library for Amazon S3 Compatible Cloud Storage
|
||||||
|
* Copyright 2017 Minio, Inc.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -32,7 +33,6 @@ import (
|
|||||||
// http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-streaming.html#example-signature-calculations-streaming
|
// http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-streaming.html#example-signature-calculations-streaming
|
||||||
const (
|
const (
|
||||||
streamingSignAlgorithm = "STREAMING-AWS4-HMAC-SHA256-PAYLOAD"
|
streamingSignAlgorithm = "STREAMING-AWS4-HMAC-SHA256-PAYLOAD"
|
||||||
streamingEncoding = "aws-chunked"
|
|
||||||
streamingPayloadHdr = "AWS4-HMAC-SHA256-PAYLOAD"
|
streamingPayloadHdr = "AWS4-HMAC-SHA256-PAYLOAD"
|
||||||
emptySHA256 = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
emptySHA256 = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||||
payloadChunkSize = 64 * 1024
|
payloadChunkSize = 64 * 1024
|
||||||
@ -99,9 +99,8 @@ func prepareStreamingRequest(req *http.Request, sessionToken string, dataLen int
|
|||||||
if sessionToken != "" {
|
if sessionToken != "" {
|
||||||
req.Header.Set("X-Amz-Security-Token", sessionToken)
|
req.Header.Set("X-Amz-Security-Token", sessionToken)
|
||||||
}
|
}
|
||||||
req.Header.Add("Content-Encoding", streamingEncoding)
|
|
||||||
req.Header.Set("X-Amz-Date", timestamp.Format(iso8601DateFormat))
|
|
||||||
|
|
||||||
|
req.Header.Set("X-Amz-Date", timestamp.Format(iso8601DateFormat))
|
||||||
// Set content length with streaming signature for each chunk included.
|
// Set content length with streaming signature for each chunk included.
|
||||||
req.ContentLength = getStreamLength(dataLen, int64(payloadChunkSize))
|
req.ContentLength = getStreamLength(dataLen, int64(payloadChunkSize))
|
||||||
req.Header.Set("x-amz-decoded-content-length", strconv.FormatInt(dataLen, 10))
|
req.Header.Set("x-amz-decoded-content-length", strconv.FormatInt(dataLen, 10))
|
||||||
|
72
vendor/github.com/minio/minio-go/pkg/s3signer/request-signature-v2.go
generated
vendored
72
vendor/github.com/minio/minio-go/pkg/s3signer/request-signature-v2.go
generated
vendored
@ -1,5 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Minio Go Library for Amazon S3 Compatible Cloud Storage (C) 2015 Minio, Inc.
|
* Minio Go Library for Amazon S3 Compatible Cloud Storage
|
||||||
|
* Copyright 2015-2017 Minio, Inc.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -24,7 +25,6 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
"path/filepath"
|
|
||||||
"sort"
|
"sort"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
@ -39,28 +39,25 @@ const (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// Encode input URL path to URL encoded path.
|
// Encode input URL path to URL encoded path.
|
||||||
func encodeURL2Path(u *url.URL) (path string) {
|
func encodeURL2Path(req *http.Request, virtualHost bool) (path string) {
|
||||||
// Encode URL path.
|
if virtualHost {
|
||||||
if isS3, _ := filepath.Match("*.s3*.amazonaws.com", u.Host); isS3 {
|
reqHost := getHostAddr(req)
|
||||||
bucketName := u.Host[:strings.LastIndex(u.Host, ".s3")]
|
dotPos := strings.Index(reqHost, ".")
|
||||||
|
if dotPos > -1 {
|
||||||
|
bucketName := reqHost[:dotPos]
|
||||||
path = "/" + bucketName
|
path = "/" + bucketName
|
||||||
path += u.Path
|
path += req.URL.Path
|
||||||
path = s3utils.EncodePath(path)
|
path = s3utils.EncodePath(path)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if strings.HasSuffix(u.Host, ".storage.googleapis.com") {
|
|
||||||
path = "/" + strings.TrimSuffix(u.Host, ".storage.googleapis.com")
|
|
||||||
path += u.Path
|
|
||||||
path = s3utils.EncodePath(path)
|
|
||||||
return
|
|
||||||
}
|
}
|
||||||
path = s3utils.EncodePath(u.Path)
|
path = s3utils.EncodePath(req.URL.Path)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// PreSignV2 - presign the request in following style.
|
// PreSignV2 - presign the request in following style.
|
||||||
// https://${S3_BUCKET}.s3.amazonaws.com/${S3_OBJECT}?AWSAccessKeyId=${S3_ACCESS_KEY}&Expires=${TIMESTAMP}&Signature=${SIGNATURE}.
|
// https://${S3_BUCKET}.s3.amazonaws.com/${S3_OBJECT}?AWSAccessKeyId=${S3_ACCESS_KEY}&Expires=${TIMESTAMP}&Signature=${SIGNATURE}.
|
||||||
func PreSignV2(req http.Request, accessKeyID, secretAccessKey string, expires int64) *http.Request {
|
func PreSignV2(req http.Request, accessKeyID, secretAccessKey string, expires int64, virtualHost bool) *http.Request {
|
||||||
// Presign is not needed for anonymous credentials.
|
// Presign is not needed for anonymous credentials.
|
||||||
if accessKeyID == "" || secretAccessKey == "" {
|
if accessKeyID == "" || secretAccessKey == "" {
|
||||||
return &req
|
return &req
|
||||||
@ -76,7 +73,7 @@ func PreSignV2(req http.Request, accessKeyID, secretAccessKey string, expires in
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Get presigned string to sign.
|
// Get presigned string to sign.
|
||||||
stringToSign := preStringifyHTTPReq(req)
|
stringToSign := preStringToSignV2(req, virtualHost)
|
||||||
hm := hmac.New(sha1.New, []byte(secretAccessKey))
|
hm := hmac.New(sha1.New, []byte(secretAccessKey))
|
||||||
hm.Write([]byte(stringToSign))
|
hm.Write([]byte(stringToSign))
|
||||||
|
|
||||||
@ -85,7 +82,7 @@ func PreSignV2(req http.Request, accessKeyID, secretAccessKey string, expires in
|
|||||||
|
|
||||||
query := req.URL.Query()
|
query := req.URL.Query()
|
||||||
// Handle specially for Google Cloud Storage.
|
// Handle specially for Google Cloud Storage.
|
||||||
if strings.Contains(req.URL.Host, ".storage.googleapis.com") {
|
if strings.Contains(getHostAddr(&req), ".storage.googleapis.com") {
|
||||||
query.Set("GoogleAccessId", accessKeyID)
|
query.Set("GoogleAccessId", accessKeyID)
|
||||||
} else {
|
} else {
|
||||||
query.Set("AWSAccessKeyId", accessKeyID)
|
query.Set("AWSAccessKeyId", accessKeyID)
|
||||||
@ -130,7 +127,7 @@ func PostPresignSignatureV2(policyBase64, secretAccessKey string) string {
|
|||||||
// CanonicalizedProtocolHeaders = <described below>
|
// CanonicalizedProtocolHeaders = <described below>
|
||||||
|
|
||||||
// SignV2 sign the request before Do() (AWS Signature Version 2).
|
// SignV2 sign the request before Do() (AWS Signature Version 2).
|
||||||
func SignV2(req http.Request, accessKeyID, secretAccessKey string) *http.Request {
|
func SignV2(req http.Request, accessKeyID, secretAccessKey string, virtualHost bool) *http.Request {
|
||||||
// Signature calculation is not needed for anonymous credentials.
|
// Signature calculation is not needed for anonymous credentials.
|
||||||
if accessKeyID == "" || secretAccessKey == "" {
|
if accessKeyID == "" || secretAccessKey == "" {
|
||||||
return &req
|
return &req
|
||||||
@ -145,7 +142,7 @@ func SignV2(req http.Request, accessKeyID, secretAccessKey string) *http.Request
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Calculate HMAC for secretAccessKey.
|
// Calculate HMAC for secretAccessKey.
|
||||||
stringToSign := stringifyHTTPReq(req)
|
stringToSign := stringToSignV2(req, virtualHost)
|
||||||
hm := hmac.New(sha1.New, []byte(secretAccessKey))
|
hm := hmac.New(sha1.New, []byte(secretAccessKey))
|
||||||
hm.Write([]byte(stringToSign))
|
hm.Write([]byte(stringToSign))
|
||||||
|
|
||||||
@ -170,15 +167,14 @@ func SignV2(req http.Request, accessKeyID, secretAccessKey string) *http.Request
|
|||||||
// Expires + "\n" +
|
// Expires + "\n" +
|
||||||
// CanonicalizedProtocolHeaders +
|
// CanonicalizedProtocolHeaders +
|
||||||
// CanonicalizedResource;
|
// CanonicalizedResource;
|
||||||
func preStringifyHTTPReq(req http.Request) string {
|
func preStringToSignV2(req http.Request, virtualHost bool) string {
|
||||||
buf := new(bytes.Buffer)
|
buf := new(bytes.Buffer)
|
||||||
// Write standard headers.
|
// Write standard headers.
|
||||||
writePreSignV2Headers(buf, req)
|
writePreSignV2Headers(buf, req)
|
||||||
// Write canonicalized protocol headers if any.
|
// Write canonicalized protocol headers if any.
|
||||||
writeCanonicalizedHeaders(buf, req)
|
writeCanonicalizedHeaders(buf, req)
|
||||||
// Write canonicalized Query resources if any.
|
// Write canonicalized Query resources if any.
|
||||||
isPreSign := true
|
writeCanonicalizedResource(buf, req, virtualHost)
|
||||||
writeCanonicalizedResource(buf, req, isPreSign)
|
|
||||||
return buf.String()
|
return buf.String()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -198,15 +194,14 @@ func writePreSignV2Headers(buf *bytes.Buffer, req http.Request) {
|
|||||||
// Date + "\n" +
|
// Date + "\n" +
|
||||||
// CanonicalizedProtocolHeaders +
|
// CanonicalizedProtocolHeaders +
|
||||||
// CanonicalizedResource;
|
// CanonicalizedResource;
|
||||||
func stringifyHTTPReq(req http.Request) string {
|
func stringToSignV2(req http.Request, virtualHost bool) string {
|
||||||
buf := new(bytes.Buffer)
|
buf := new(bytes.Buffer)
|
||||||
// Write standard headers.
|
// Write standard headers.
|
||||||
writeSignV2Headers(buf, req)
|
writeSignV2Headers(buf, req)
|
||||||
// Write canonicalized protocol headers if any.
|
// Write canonicalized protocol headers if any.
|
||||||
writeCanonicalizedHeaders(buf, req)
|
writeCanonicalizedHeaders(buf, req)
|
||||||
// Write canonicalized Query resources if any.
|
// Write canonicalized Query resources if any.
|
||||||
isPreSign := false
|
writeCanonicalizedResource(buf, req, virtualHost)
|
||||||
writeCanonicalizedResource(buf, req, isPreSign)
|
|
||||||
return buf.String()
|
return buf.String()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -253,17 +248,27 @@ func writeCanonicalizedHeaders(buf *bytes.Buffer, req http.Request) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// The following list is already sorted and should always be, otherwise we could
|
// AWS S3 Signature V2 calculation rule is give here:
|
||||||
// have signature-related issues
|
// http://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html#RESTAuthenticationStringToSign
|
||||||
|
|
||||||
|
// Whitelist resource list that will be used in query string for signature-V2 calculation.
|
||||||
|
// The list should be alphabetically sorted
|
||||||
var resourceList = []string{
|
var resourceList = []string{
|
||||||
"acl",
|
"acl",
|
||||||
"delete",
|
"delete",
|
||||||
|
"lifecycle",
|
||||||
"location",
|
"location",
|
||||||
"logging",
|
"logging",
|
||||||
"notification",
|
"notification",
|
||||||
"partNumber",
|
"partNumber",
|
||||||
"policy",
|
"policy",
|
||||||
"requestPayment",
|
"requestPayment",
|
||||||
|
"response-cache-control",
|
||||||
|
"response-content-disposition",
|
||||||
|
"response-content-encoding",
|
||||||
|
"response-content-language",
|
||||||
|
"response-content-type",
|
||||||
|
"response-expires",
|
||||||
"torrent",
|
"torrent",
|
||||||
"uploadId",
|
"uploadId",
|
||||||
"uploads",
|
"uploads",
|
||||||
@ -278,22 +283,11 @@ var resourceList = []string{
|
|||||||
// CanonicalizedResource = [ "/" + Bucket ] +
|
// CanonicalizedResource = [ "/" + Bucket ] +
|
||||||
// <HTTP-Request-URI, from the protocol name up to the query string> +
|
// <HTTP-Request-URI, from the protocol name up to the query string> +
|
||||||
// [ sub-resource, if present. For example "?acl", "?location", "?logging", or "?torrent"];
|
// [ sub-resource, if present. For example "?acl", "?location", "?logging", or "?torrent"];
|
||||||
func writeCanonicalizedResource(buf *bytes.Buffer, req http.Request, isPreSign bool) {
|
func writeCanonicalizedResource(buf *bytes.Buffer, req http.Request, virtualHost bool) {
|
||||||
// Save request URL.
|
// Save request URL.
|
||||||
requestURL := req.URL
|
requestURL := req.URL
|
||||||
// Get encoded URL path.
|
// Get encoded URL path.
|
||||||
path := encodeURL2Path(requestURL)
|
buf.WriteString(encodeURL2Path(&req, virtualHost))
|
||||||
if isPreSign {
|
|
||||||
// Get encoded URL path.
|
|
||||||
if len(requestURL.Query()) > 0 {
|
|
||||||
// Keep the usual queries unescaped for string to sign.
|
|
||||||
query, _ := url.QueryUnescape(s3utils.QueryEncode(requestURL.Query()))
|
|
||||||
path = path + "?" + query
|
|
||||||
}
|
|
||||||
buf.WriteString(path)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
buf.WriteString(path)
|
|
||||||
if requestURL.RawQuery != "" {
|
if requestURL.RawQuery != "" {
|
||||||
var n int
|
var n int
|
||||||
vals, _ := url.ParseQuery(requestURL.RawQuery)
|
vals, _ := url.ParseQuery(requestURL.RawQuery)
|
||||||
|
5
vendor/github.com/minio/minio-go/pkg/s3signer/request-signature-v4.go
generated
vendored
5
vendor/github.com/minio/minio-go/pkg/s3signer/request-signature-v4.go
generated
vendored
@ -1,5 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Minio Go Library for Amazon S3 Compatible Cloud Storage (C) 2015 Minio, Inc.
|
* Minio Go Library for Amazon S3 Compatible Cloud Storage
|
||||||
|
* Copyright 2015-2017 Minio, Inc.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -143,7 +144,7 @@ func getCanonicalHeaders(req http.Request, ignoredHeaders map[string]bool) strin
|
|||||||
buf.WriteByte(':')
|
buf.WriteByte(':')
|
||||||
switch {
|
switch {
|
||||||
case k == "host":
|
case k == "host":
|
||||||
buf.WriteString(req.URL.Host)
|
buf.WriteString(getHostAddr(&req))
|
||||||
fallthrough
|
fallthrough
|
||||||
default:
|
default:
|
||||||
for idx, v := range vals[k] {
|
for idx, v := range vals[k] {
|
||||||
|
12
vendor/github.com/minio/minio-go/pkg/s3signer/utils.go
generated
vendored
12
vendor/github.com/minio/minio-go/pkg/s3signer/utils.go
generated
vendored
@ -1,5 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Minio Go Library for Amazon S3 Compatible Cloud Storage (C) 2015 Minio, Inc.
|
* Minio Go Library for Amazon S3 Compatible Cloud Storage
|
||||||
|
* Copyright 2015-2017 Minio, Inc.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -19,6 +20,7 @@ package s3signer
|
|||||||
import (
|
import (
|
||||||
"crypto/hmac"
|
"crypto/hmac"
|
||||||
"crypto/sha256"
|
"crypto/sha256"
|
||||||
|
"net/http"
|
||||||
)
|
)
|
||||||
|
|
||||||
// unsignedPayload - value to be set to X-Amz-Content-Sha256 header when
|
// unsignedPayload - value to be set to X-Amz-Content-Sha256 header when
|
||||||
@ -37,3 +39,11 @@ func sumHMAC(key []byte, data []byte) []byte {
|
|||||||
hash.Write(data)
|
hash.Write(data)
|
||||||
return hash.Sum(nil)
|
return hash.Sum(nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// getHostAddr returns host header if available, otherwise returns host from URL
|
||||||
|
func getHostAddr(req *http.Request) string {
|
||||||
|
if req.Host != "" {
|
||||||
|
return req.Host
|
||||||
|
}
|
||||||
|
return req.URL.Host
|
||||||
|
}
|
||||||
|
68
vendor/github.com/minio/minio-go/pkg/s3utils/utils.go
generated
vendored
68
vendor/github.com/minio/minio-go/pkg/s3utils/utils.go
generated
vendored
@ -1,5 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Minio Go Library for Amazon S3 Compatible Cloud Storage (C) 2016 Minio, Inc.
|
* Minio Go Library for Amazon S3 Compatible Cloud Storage
|
||||||
|
* Copyright 2015-2017 Minio, Inc.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -80,18 +81,56 @@ func IsVirtualHostSupported(endpointURL url.URL, bucketName string) bool {
|
|||||||
return IsAmazonEndpoint(endpointURL) || IsGoogleEndpoint(endpointURL)
|
return IsAmazonEndpoint(endpointURL) || IsGoogleEndpoint(endpointURL)
|
||||||
}
|
}
|
||||||
|
|
||||||
// AmazonS3Host - regular expression used to determine if an arg is s3 host.
|
// Refer for region styles - https://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region
|
||||||
var AmazonS3Host = regexp.MustCompile("^s3[.-]?(.*?)\\.amazonaws\\.com$")
|
|
||||||
|
// amazonS3HostHyphen - regular expression used to determine if an arg is s3 host in hyphenated style.
|
||||||
|
var amazonS3HostHyphen = regexp.MustCompile(`^s3-(.*?)\.amazonaws\.com$`)
|
||||||
|
|
||||||
|
// amazonS3HostDualStack - regular expression used to determine if an arg is s3 host dualstack.
|
||||||
|
var amazonS3HostDualStack = regexp.MustCompile(`^s3\.dualstack\.(.*?)\.amazonaws\.com$`)
|
||||||
|
|
||||||
|
// amazonS3HostDot - regular expression used to determine if an arg is s3 host in . style.
|
||||||
|
var amazonS3HostDot = regexp.MustCompile(`^s3\.(.*?)\.amazonaws\.com$`)
|
||||||
|
|
||||||
|
// amazonS3ChinaHost - regular expression used to determine if the arg is s3 china host.
|
||||||
|
var amazonS3ChinaHost = regexp.MustCompile(`^s3\.(cn.*?)\.amazonaws\.com\.cn$`)
|
||||||
|
|
||||||
|
// GetRegionFromURL - returns a region from url host.
|
||||||
|
func GetRegionFromURL(endpointURL url.URL) string {
|
||||||
|
if endpointURL == sentinelURL {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
if endpointURL.Host == "s3-external-1.amazonaws.com" {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
if IsAmazonGovCloudEndpoint(endpointURL) {
|
||||||
|
return "us-gov-west-1"
|
||||||
|
}
|
||||||
|
parts := amazonS3HostDualStack.FindStringSubmatch(endpointURL.Host)
|
||||||
|
if len(parts) > 1 {
|
||||||
|
return parts[1]
|
||||||
|
}
|
||||||
|
parts = amazonS3HostHyphen.FindStringSubmatch(endpointURL.Host)
|
||||||
|
if len(parts) > 1 {
|
||||||
|
return parts[1]
|
||||||
|
}
|
||||||
|
parts = amazonS3ChinaHost.FindStringSubmatch(endpointURL.Host)
|
||||||
|
if len(parts) > 1 {
|
||||||
|
return parts[1]
|
||||||
|
}
|
||||||
|
parts = amazonS3HostDot.FindStringSubmatch(endpointURL.Host)
|
||||||
|
if len(parts) > 1 {
|
||||||
|
return parts[1]
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
// IsAmazonEndpoint - Match if it is exactly Amazon S3 endpoint.
|
// IsAmazonEndpoint - Match if it is exactly Amazon S3 endpoint.
|
||||||
func IsAmazonEndpoint(endpointURL url.URL) bool {
|
func IsAmazonEndpoint(endpointURL url.URL) bool {
|
||||||
if IsAmazonChinaEndpoint(endpointURL) {
|
if endpointURL.Host == "s3-external-1.amazonaws.com" || endpointURL.Host == "s3.amazonaws.com" {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
if IsAmazonGovCloudEndpoint(endpointURL) {
|
return GetRegionFromURL(endpointURL) != ""
|
||||||
return true
|
|
||||||
}
|
|
||||||
return AmazonS3Host.MatchString(endpointURL.Host)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsAmazonGovCloudEndpoint - Match if it is exactly Amazon S3 GovCloud endpoint.
|
// IsAmazonGovCloudEndpoint - Match if it is exactly Amazon S3 GovCloud endpoint.
|
||||||
@ -111,19 +150,6 @@ func IsAmazonFIPSGovCloudEndpoint(endpointURL url.URL) bool {
|
|||||||
return endpointURL.Host == "s3-fips-us-gov-west-1.amazonaws.com"
|
return endpointURL.Host == "s3-fips-us-gov-west-1.amazonaws.com"
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsAmazonChinaEndpoint - Match if it is exactly Amazon S3 China endpoint.
|
|
||||||
// Customers who wish to use the new Beijing Region are required
|
|
||||||
// to sign up for a separate set of account credentials unique to
|
|
||||||
// the China (Beijing) Region. Customers with existing AWS credentials
|
|
||||||
// will not be able to access resources in the new Region, and vice versa.
|
|
||||||
// For more info https://aws.amazon.com/about-aws/whats-new/2013/12/18/announcing-the-aws-china-beijing-region/
|
|
||||||
func IsAmazonChinaEndpoint(endpointURL url.URL) bool {
|
|
||||||
if endpointURL == sentinelURL {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
return endpointURL.Host == "s3.cn-north-1.amazonaws.com.cn"
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsGoogleEndpoint - Match if it is exactly Google cloud storage endpoint.
|
// IsGoogleEndpoint - Match if it is exactly Google cloud storage endpoint.
|
||||||
func IsGoogleEndpoint(endpointURL url.URL) bool {
|
func IsGoogleEndpoint(endpointURL url.URL) bool {
|
||||||
if endpointURL == sentinelURL {
|
if endpointURL == sentinelURL {
|
||||||
|
3
vendor/github.com/minio/minio-go/pkg/set/stringset.go
generated
vendored
3
vendor/github.com/minio/minio-go/pkg/set/stringset.go
generated
vendored
@ -1,5 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Minio Go Library for Amazon S3 Compatible Cloud Storage (C) 2016 Minio, Inc.
|
* Minio Go Library for Amazon S3 Compatible Cloud Storage
|
||||||
|
* Copyright 2015-2017 Minio, Inc.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
2
vendor/github.com/minio/minio-go/retry.go
generated
vendored
2
vendor/github.com/minio/minio-go/retry.go
generated
vendored
@ -26,7 +26,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// MaxRetry is the maximum number of retries before stopping.
|
// MaxRetry is the maximum number of retries before stopping.
|
||||||
var MaxRetry = 5
|
var MaxRetry = 10
|
||||||
|
|
||||||
// MaxJitter will randomize over the full exponential backoff time
|
// MaxJitter will randomize over the full exponential backoff time
|
||||||
const MaxJitter = 1.0
|
const MaxJitter = 1.0
|
||||||
|
5
vendor/github.com/minio/minio-go/s3-endpoints.go
generated
vendored
5
vendor/github.com/minio/minio-go/s3-endpoints.go
generated
vendored
@ -18,15 +18,15 @@
|
|||||||
package minio
|
package minio
|
||||||
|
|
||||||
// awsS3EndpointMap Amazon S3 endpoint map.
|
// awsS3EndpointMap Amazon S3 endpoint map.
|
||||||
// "cn-north-1" adds support for AWS China.
|
|
||||||
var awsS3EndpointMap = map[string]string{
|
var awsS3EndpointMap = map[string]string{
|
||||||
"us-east-1": "s3.amazonaws.com",
|
"us-east-1": "s3.amazonaws.com",
|
||||||
"us-east-2": "s3-us-east-2.amazonaws.com",
|
"us-east-2": "s3-us-east-2.amazonaws.com",
|
||||||
"us-west-2": "s3-us-west-2.amazonaws.com",
|
"us-west-2": "s3-us-west-2.amazonaws.com",
|
||||||
"us-west-1": "s3-us-west-1.amazonaws.com",
|
"us-west-1": "s3-us-west-1.amazonaws.com",
|
||||||
"ca-central-1": "s3.ca-central-1.amazonaws.com",
|
"ca-central-1": "s3-ca-central-1.amazonaws.com",
|
||||||
"eu-west-1": "s3-eu-west-1.amazonaws.com",
|
"eu-west-1": "s3-eu-west-1.amazonaws.com",
|
||||||
"eu-west-2": "s3-eu-west-2.amazonaws.com",
|
"eu-west-2": "s3-eu-west-2.amazonaws.com",
|
||||||
|
"eu-west-3": "s3-eu-west-3.amazonaws.com",
|
||||||
"eu-central-1": "s3-eu-central-1.amazonaws.com",
|
"eu-central-1": "s3-eu-central-1.amazonaws.com",
|
||||||
"ap-south-1": "s3-ap-south-1.amazonaws.com",
|
"ap-south-1": "s3-ap-south-1.amazonaws.com",
|
||||||
"ap-southeast-1": "s3-ap-southeast-1.amazonaws.com",
|
"ap-southeast-1": "s3-ap-southeast-1.amazonaws.com",
|
||||||
@ -36,6 +36,7 @@ var awsS3EndpointMap = map[string]string{
|
|||||||
"sa-east-1": "s3-sa-east-1.amazonaws.com",
|
"sa-east-1": "s3-sa-east-1.amazonaws.com",
|
||||||
"us-gov-west-1": "s3-us-gov-west-1.amazonaws.com",
|
"us-gov-west-1": "s3-us-gov-west-1.amazonaws.com",
|
||||||
"cn-north-1": "s3.cn-north-1.amazonaws.com.cn",
|
"cn-north-1": "s3.cn-north-1.amazonaws.com.cn",
|
||||||
|
"cn-northwest-1": "s3.cn-northwest-1.amazonaws.com.cn",
|
||||||
}
|
}
|
||||||
|
|
||||||
// getS3Endpoint get Amazon S3 endpoint based on the bucket location.
|
// getS3Endpoint get Amazon S3 endpoint based on the bucket location.
|
||||||
|
10
vendor/github.com/minio/minio-go/transport.go
generated
vendored
10
vendor/github.com/minio/minio-go/transport.go
generated
vendored
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Minio Go Library for Amazon S3 Compatible Cloud Storage
|
* Minio Go Library for Amazon S3 Compatible Cloud Storage
|
||||||
* Copyright 2017 Minio, Inc.
|
* Copyright 2017-2018 Minio, Inc.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -25,9 +25,10 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
// This default transport is similar to http.DefaultTransport
|
// DefaultTransport - this default transport is similar to
|
||||||
// but with additional DisableCompression:
|
// http.DefaultTransport but with additional param DisableCompression
|
||||||
var defaultMinioTransport http.RoundTripper = &http.Transport{
|
// is set to true to avoid decompressing content with 'gzip' encoding.
|
||||||
|
var DefaultTransport http.RoundTripper = &http.Transport{
|
||||||
Proxy: http.ProxyFromEnvironment,
|
Proxy: http.ProxyFromEnvironment,
|
||||||
DialContext: (&net.Dialer{
|
DialContext: (&net.Dialer{
|
||||||
Timeout: 30 * time.Second,
|
Timeout: 30 * time.Second,
|
||||||
@ -35,6 +36,7 @@ var defaultMinioTransport http.RoundTripper = &http.Transport{
|
|||||||
DualStack: true,
|
DualStack: true,
|
||||||
}).DialContext,
|
}).DialContext,
|
||||||
MaxIdleConns: 100,
|
MaxIdleConns: 100,
|
||||||
|
MaxIdleConnsPerHost: 100,
|
||||||
IdleConnTimeout: 90 * time.Second,
|
IdleConnTimeout: 90 * time.Second,
|
||||||
TLSHandshakeTimeout: 10 * time.Second,
|
TLSHandshakeTimeout: 10 * time.Second,
|
||||||
ExpectContinueTimeout: 1 * time.Second,
|
ExpectContinueTimeout: 1 * time.Second,
|
||||||
|
32
vendor/github.com/minio/minio-go/utils.go
generated
vendored
32
vendor/github.com/minio/minio-go/utils.go
generated
vendored
@ -209,14 +209,11 @@ func getDefaultLocation(u url.URL, regionOverride string) (location string) {
|
|||||||
if regionOverride != "" {
|
if regionOverride != "" {
|
||||||
return regionOverride
|
return regionOverride
|
||||||
}
|
}
|
||||||
if s3utils.IsAmazonChinaEndpoint(u) {
|
region := s3utils.GetRegionFromURL(u)
|
||||||
return "cn-north-1"
|
if region == "" {
|
||||||
|
region = "us-east-1"
|
||||||
}
|
}
|
||||||
if s3utils.IsAmazonGovCloudEndpoint(u) {
|
return region
|
||||||
return "us-gov-west-1"
|
|
||||||
}
|
|
||||||
// Default to location to 'us-east-1'.
|
|
||||||
return "us-east-1"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var supportedHeaders = []string{
|
var supportedHeaders = []string{
|
||||||
@ -224,16 +221,10 @@ var supportedHeaders = []string{
|
|||||||
"cache-control",
|
"cache-control",
|
||||||
"content-encoding",
|
"content-encoding",
|
||||||
"content-disposition",
|
"content-disposition",
|
||||||
|
"content-language",
|
||||||
// Add more supported headers here.
|
// Add more supported headers here.
|
||||||
}
|
}
|
||||||
|
|
||||||
// cseHeaders is list of client side encryption headers
|
|
||||||
var cseHeaders = []string{
|
|
||||||
"X-Amz-Iv",
|
|
||||||
"X-Amz-Key",
|
|
||||||
"X-Amz-Matdesc",
|
|
||||||
}
|
|
||||||
|
|
||||||
// isStorageClassHeader returns true if the header is a supported storage class header
|
// isStorageClassHeader returns true if the header is a supported storage class header
|
||||||
func isStorageClassHeader(headerKey string) bool {
|
func isStorageClassHeader(headerKey string) bool {
|
||||||
return strings.ToLower(amzStorageClass) == strings.ToLower(headerKey)
|
return strings.ToLower(amzStorageClass) == strings.ToLower(headerKey)
|
||||||
@ -250,19 +241,6 @@ func isStandardHeader(headerKey string) bool {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
// isCSEHeader returns true if header is a client side encryption header.
|
|
||||||
func isCSEHeader(headerKey string) bool {
|
|
||||||
key := strings.ToLower(headerKey)
|
|
||||||
for _, h := range cseHeaders {
|
|
||||||
header := strings.ToLower(h)
|
|
||||||
if (header == key) ||
|
|
||||||
(("x-amz-meta-" + header) == key) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
// sseHeaders is list of server side encryption headers
|
// sseHeaders is list of server side encryption headers
|
||||||
var sseHeaders = []string{
|
var sseHeaders = []string{
|
||||||
"x-amz-server-side-encryption",
|
"x-amz-server-side-encryption",
|
||||||
|
14
vendor/github.com/mitchellh/go-homedir/README.md
generated
vendored
Normal file
14
vendor/github.com/mitchellh/go-homedir/README.md
generated
vendored
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
# go-homedir
|
||||||
|
|
||||||
|
This is a Go library for detecting the user's home directory without
|
||||||
|
the use of cgo, so the library can be used in cross-compilation environments.
|
||||||
|
|
||||||
|
Usage is incredibly simple, just call `homedir.Dir()` to get the home directory
|
||||||
|
for a user, and `homedir.Expand()` to expand the `~` in a path to the home
|
||||||
|
directory.
|
||||||
|
|
||||||
|
**Why not just use `os/user`?** The built-in `os/user` package requires
|
||||||
|
cgo on Darwin systems. This means that any Go code that uses that package
|
||||||
|
cannot cross compile. But 99% of the time the use for `os/user` is just to
|
||||||
|
retrieve the home directory, which we can do for the current user without
|
||||||
|
cgo. This library does that, enabling cross-compilation.
|
137
vendor/github.com/mitchellh/go-homedir/homedir.go
generated
vendored
Normal file
137
vendor/github.com/mitchellh/go-homedir/homedir.go
generated
vendored
Normal file
@ -0,0 +1,137 @@
|
|||||||
|
package homedir
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"errors"
|
||||||
|
"os"
|
||||||
|
"os/exec"
|
||||||
|
"path/filepath"
|
||||||
|
"runtime"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
"sync"
|
||||||
|
)
|
||||||
|
|
||||||
|
// DisableCache will disable caching of the home directory. Caching is enabled
|
||||||
|
// by default.
|
||||||
|
var DisableCache bool
|
||||||
|
|
||||||
|
var homedirCache string
|
||||||
|
var cacheLock sync.RWMutex
|
||||||
|
|
||||||
|
// Dir returns the home directory for the executing user.
|
||||||
|
//
|
||||||
|
// This uses an OS-specific method for discovering the home directory.
|
||||||
|
// An error is returned if a home directory cannot be detected.
|
||||||
|
func Dir() (string, error) {
|
||||||
|
if !DisableCache {
|
||||||
|
cacheLock.RLock()
|
||||||
|
cached := homedirCache
|
||||||
|
cacheLock.RUnlock()
|
||||||
|
if cached != "" {
|
||||||
|
return cached, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
cacheLock.Lock()
|
||||||
|
defer cacheLock.Unlock()
|
||||||
|
|
||||||
|
var result string
|
||||||
|
var err error
|
||||||
|
if runtime.GOOS == "windows" {
|
||||||
|
result, err = dirWindows()
|
||||||
|
} else {
|
||||||
|
// Unix-like system, so just assume Unix
|
||||||
|
result, err = dirUnix()
|
||||||
|
}
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
homedirCache = result
|
||||||
|
return result, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Expand expands the path to include the home directory if the path
|
||||||
|
// is prefixed with `~`. If it isn't prefixed with `~`, the path is
|
||||||
|
// returned as-is.
|
||||||
|
func Expand(path string) (string, error) {
|
||||||
|
if len(path) == 0 {
|
||||||
|
return path, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if path[0] != '~' {
|
||||||
|
return path, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(path) > 1 && path[1] != '/' && path[1] != '\\' {
|
||||||
|
return "", errors.New("cannot expand user-specific home dir")
|
||||||
|
}
|
||||||
|
|
||||||
|
dir, err := Dir()
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
return filepath.Join(dir, path[1:]), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func dirUnix() (string, error) {
|
||||||
|
// First prefer the HOME environmental variable
|
||||||
|
if home := os.Getenv("HOME"); home != "" {
|
||||||
|
return home, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// If that fails, try getent
|
||||||
|
var stdout bytes.Buffer
|
||||||
|
cmd := exec.Command("getent", "passwd", strconv.Itoa(os.Getuid()))
|
||||||
|
cmd.Stdout = &stdout
|
||||||
|
if err := cmd.Run(); err != nil {
|
||||||
|
// If the error is ErrNotFound, we ignore it. Otherwise, return it.
|
||||||
|
if err != exec.ErrNotFound {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if passwd := strings.TrimSpace(stdout.String()); passwd != "" {
|
||||||
|
// username:password:uid:gid:gecos:home:shell
|
||||||
|
passwdParts := strings.SplitN(passwd, ":", 7)
|
||||||
|
if len(passwdParts) > 5 {
|
||||||
|
return passwdParts[5], nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If all else fails, try the shell
|
||||||
|
stdout.Reset()
|
||||||
|
cmd = exec.Command("sh", "-c", "cd && pwd")
|
||||||
|
cmd.Stdout = &stdout
|
||||||
|
if err := cmd.Run(); err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
result := strings.TrimSpace(stdout.String())
|
||||||
|
if result == "" {
|
||||||
|
return "", errors.New("blank output when reading home directory")
|
||||||
|
}
|
||||||
|
|
||||||
|
return result, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func dirWindows() (string, error) {
|
||||||
|
// First prefer the HOME environmental variable
|
||||||
|
if home := os.Getenv("HOME"); home != "" {
|
||||||
|
return home, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
drive := os.Getenv("HOMEDRIVE")
|
||||||
|
path := os.Getenv("HOMEPATH")
|
||||||
|
home := drive + path
|
||||||
|
if drive == "" || path == "" {
|
||||||
|
home = os.Getenv("USERPROFILE")
|
||||||
|
}
|
||||||
|
if home == "" {
|
||||||
|
return "", errors.New("HOMEDRIVE, HOMEPATH, and USERPROFILE are blank")
|
||||||
|
}
|
||||||
|
|
||||||
|
return home, nil
|
||||||
|
}
|
283
vendor/golang.org/x/crypto/argon2/argon2.go
generated
vendored
Normal file
283
vendor/golang.org/x/crypto/argon2/argon2.go
generated
vendored
Normal file
@ -0,0 +1,283 @@
|
|||||||
|
// Copyright 2017 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// Package argon2 implements the key derivation function Argon2.
|
||||||
|
// Argon2 was selected as the winner of the Password Hashing Competition and can
|
||||||
|
// be used to derive cryptographic keys from passwords.
|
||||||
|
//
|
||||||
|
// For a detailed specification of Argon2 see [1].
|
||||||
|
//
|
||||||
|
// If you aren't sure which function you need, use Argon2id (IDKey) and
|
||||||
|
// the parameter recommendations for your scenario.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// Argon2i
|
||||||
|
//
|
||||||
|
// Argon2i (implemented by Key) is the side-channel resistant version of Argon2.
|
||||||
|
// It uses data-independent memory access, which is preferred for password
|
||||||
|
// hashing and password-based key derivation. Argon2i requires more passes over
|
||||||
|
// memory than Argon2id to protect from trade-off attacks. The recommended
|
||||||
|
// parameters (taken from [2]) for non-interactive operations are time=3 and to
|
||||||
|
// use the maximum available memory.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// Argon2id
|
||||||
|
//
|
||||||
|
// Argon2id (implemented by IDKey) is a hybrid version of Argon2 combining
|
||||||
|
// Argon2i and Argon2d. It uses data-independent memory access for the first
|
||||||
|
// half of the first iteration over the memory and data-dependent memory access
|
||||||
|
// for the rest. Argon2id is side-channel resistant and provides better brute-
|
||||||
|
// force cost savings due to time-memory tradeoffs than Argon2i. The recommended
|
||||||
|
// parameters for non-interactive operations (taken from [2]) are time=1 and to
|
||||||
|
// use the maximum available memory.
|
||||||
|
//
|
||||||
|
// [1] https://github.com/P-H-C/phc-winner-argon2/blob/master/argon2-specs.pdf
|
||||||
|
// [2] https://tools.ietf.org/html/draft-irtf-cfrg-argon2-03#section-9.3
|
||||||
|
package argon2
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/binary"
|
||||||
|
"sync"
|
||||||
|
|
||||||
|
"golang.org/x/crypto/blake2b"
|
||||||
|
)
|
||||||
|
|
||||||
|
// The Argon2 version implemented by this package.
|
||||||
|
const Version = 0x13
|
||||||
|
|
||||||
|
const (
|
||||||
|
argon2d = iota
|
||||||
|
argon2i
|
||||||
|
argon2id
|
||||||
|
)
|
||||||
|
|
||||||
|
// Key derives a key from the password, salt, and cost parameters using Argon2i
|
||||||
|
// returning a byte slice of length keyLen that can be used as cryptographic
|
||||||
|
// key. The CPU cost and parallism degree must be greater than zero.
|
||||||
|
//
|
||||||
|
// For example, you can get a derived key for e.g. AES-256 (which needs a
|
||||||
|
// 32-byte key) by doing: `key := argon2.Key([]byte("some password"), salt, 3,
|
||||||
|
// 32*1024, 4, 32)`
|
||||||
|
//
|
||||||
|
// The draft RFC recommends[2] time=3, and memory=32*1024 is a sensible number.
|
||||||
|
// If using that amount of memory (32 MB) is not possible in some contexts then
|
||||||
|
// the time parameter can be increased to compensate.
|
||||||
|
//
|
||||||
|
// The time parameter specifies the number of passes over the memory and the
|
||||||
|
// memory parameter specifies the size of the memory in KiB. For example
|
||||||
|
// memory=32*1024 sets the memory cost to ~32 MB. The number of threads can be
|
||||||
|
// adjusted to the number of available CPUs. The cost parameters should be
|
||||||
|
// increased as memory latency and CPU parallelism increases. Remember to get a
|
||||||
|
// good random salt.
|
||||||
|
func Key(password, salt []byte, time, memory uint32, threads uint8, keyLen uint32) []byte {
|
||||||
|
return deriveKey(argon2i, password, salt, nil, nil, time, memory, threads, keyLen)
|
||||||
|
}
|
||||||
|
|
||||||
|
// IDKey derives a key from the password, salt, and cost parameters using
|
||||||
|
// Argon2id returning a byte slice of length keyLen that can be used as
|
||||||
|
// cryptographic key. The CPU cost and parallism degree must be greater than
|
||||||
|
// zero.
|
||||||
|
//
|
||||||
|
// For example, you can get a derived key for e.g. AES-256 (which needs a
|
||||||
|
// 32-byte key) by doing: `key := argon2.IDKey([]byte("some password"), salt, 1,
|
||||||
|
// 64*1024, 4, 32)`
|
||||||
|
//
|
||||||
|
// The draft RFC recommends[2] time=1, and memory=64*1024 is a sensible number.
|
||||||
|
// If using that amount of memory (64 MB) is not possible in some contexts then
|
||||||
|
// the time parameter can be increased to compensate.
|
||||||
|
//
|
||||||
|
// The time parameter specifies the number of passes over the memory and the
|
||||||
|
// memory parameter specifies the size of the memory in KiB. For example
|
||||||
|
// memory=64*1024 sets the memory cost to ~64 MB. The number of threads can be
|
||||||
|
// adjusted to the numbers of available CPUs. The cost parameters should be
|
||||||
|
// increased as memory latency and CPU parallelism increases. Remember to get a
|
||||||
|
// good random salt.
|
||||||
|
func IDKey(password, salt []byte, time, memory uint32, threads uint8, keyLen uint32) []byte {
|
||||||
|
return deriveKey(argon2id, password, salt, nil, nil, time, memory, threads, keyLen)
|
||||||
|
}
|
||||||
|
|
||||||
|
func deriveKey(mode int, password, salt, secret, data []byte, time, memory uint32, threads uint8, keyLen uint32) []byte {
|
||||||
|
if time < 1 {
|
||||||
|
panic("argon2: number of rounds too small")
|
||||||
|
}
|
||||||
|
if threads < 1 {
|
||||||
|
panic("argon2: parallelism degree too low")
|
||||||
|
}
|
||||||
|
h0 := initHash(password, salt, secret, data, time, memory, uint32(threads), keyLen, mode)
|
||||||
|
|
||||||
|
memory = memory / (syncPoints * uint32(threads)) * (syncPoints * uint32(threads))
|
||||||
|
if memory < 2*syncPoints*uint32(threads) {
|
||||||
|
memory = 2 * syncPoints * uint32(threads)
|
||||||
|
}
|
||||||
|
B := initBlocks(&h0, memory, uint32(threads))
|
||||||
|
processBlocks(B, time, memory, uint32(threads), mode)
|
||||||
|
return extractKey(B, memory, uint32(threads), keyLen)
|
||||||
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
blockLength = 128
|
||||||
|
syncPoints = 4
|
||||||
|
)
|
||||||
|
|
||||||
|
type block [blockLength]uint64
|
||||||
|
|
||||||
|
func initHash(password, salt, key, data []byte, time, memory, threads, keyLen uint32, mode int) [blake2b.Size + 8]byte {
|
||||||
|
var (
|
||||||
|
h0 [blake2b.Size + 8]byte
|
||||||
|
params [24]byte
|
||||||
|
tmp [4]byte
|
||||||
|
)
|
||||||
|
|
||||||
|
b2, _ := blake2b.New512(nil)
|
||||||
|
binary.LittleEndian.PutUint32(params[0:4], threads)
|
||||||
|
binary.LittleEndian.PutUint32(params[4:8], keyLen)
|
||||||
|
binary.LittleEndian.PutUint32(params[8:12], memory)
|
||||||
|
binary.LittleEndian.PutUint32(params[12:16], time)
|
||||||
|
binary.LittleEndian.PutUint32(params[16:20], uint32(Version))
|
||||||
|
binary.LittleEndian.PutUint32(params[20:24], uint32(mode))
|
||||||
|
b2.Write(params[:])
|
||||||
|
binary.LittleEndian.PutUint32(tmp[:], uint32(len(password)))
|
||||||
|
b2.Write(tmp[:])
|
||||||
|
b2.Write(password)
|
||||||
|
binary.LittleEndian.PutUint32(tmp[:], uint32(len(salt)))
|
||||||
|
b2.Write(tmp[:])
|
||||||
|
b2.Write(salt)
|
||||||
|
binary.LittleEndian.PutUint32(tmp[:], uint32(len(key)))
|
||||||
|
b2.Write(tmp[:])
|
||||||
|
b2.Write(key)
|
||||||
|
binary.LittleEndian.PutUint32(tmp[:], uint32(len(data)))
|
||||||
|
b2.Write(tmp[:])
|
||||||
|
b2.Write(data)
|
||||||
|
b2.Sum(h0[:0])
|
||||||
|
return h0
|
||||||
|
}
|
||||||
|
|
||||||
|
func initBlocks(h0 *[blake2b.Size + 8]byte, memory, threads uint32) []block {
|
||||||
|
var block0 [1024]byte
|
||||||
|
B := make([]block, memory)
|
||||||
|
for lane := uint32(0); lane < threads; lane++ {
|
||||||
|
j := lane * (memory / threads)
|
||||||
|
binary.LittleEndian.PutUint32(h0[blake2b.Size+4:], lane)
|
||||||
|
|
||||||
|
binary.LittleEndian.PutUint32(h0[blake2b.Size:], 0)
|
||||||
|
blake2bHash(block0[:], h0[:])
|
||||||
|
for i := range B[j+0] {
|
||||||
|
B[j+0][i] = binary.LittleEndian.Uint64(block0[i*8:])
|
||||||
|
}
|
||||||
|
|
||||||
|
binary.LittleEndian.PutUint32(h0[blake2b.Size:], 1)
|
||||||
|
blake2bHash(block0[:], h0[:])
|
||||||
|
for i := range B[j+1] {
|
||||||
|
B[j+1][i] = binary.LittleEndian.Uint64(block0[i*8:])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return B
|
||||||
|
}
|
||||||
|
|
||||||
|
func processBlocks(B []block, time, memory, threads uint32, mode int) {
|
||||||
|
lanes := memory / threads
|
||||||
|
segments := lanes / syncPoints
|
||||||
|
|
||||||
|
processSegment := func(n, slice, lane uint32, wg *sync.WaitGroup) {
|
||||||
|
var addresses, in, zero block
|
||||||
|
if mode == argon2i || (mode == argon2id && n == 0 && slice < syncPoints/2) {
|
||||||
|
in[0] = uint64(n)
|
||||||
|
in[1] = uint64(lane)
|
||||||
|
in[2] = uint64(slice)
|
||||||
|
in[3] = uint64(memory)
|
||||||
|
in[4] = uint64(time)
|
||||||
|
in[5] = uint64(mode)
|
||||||
|
}
|
||||||
|
|
||||||
|
index := uint32(0)
|
||||||
|
if n == 0 && slice == 0 {
|
||||||
|
index = 2 // we have already generated the first two blocks
|
||||||
|
if mode == argon2i || mode == argon2id {
|
||||||
|
in[6]++
|
||||||
|
processBlock(&addresses, &in, &zero)
|
||||||
|
processBlock(&addresses, &addresses, &zero)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
offset := lane*lanes + slice*segments + index
|
||||||
|
var random uint64
|
||||||
|
for index < segments {
|
||||||
|
prev := offset - 1
|
||||||
|
if index == 0 && slice == 0 {
|
||||||
|
prev += lanes // last block in lane
|
||||||
|
}
|
||||||
|
if mode == argon2i || (mode == argon2id && n == 0 && slice < syncPoints/2) {
|
||||||
|
if index%blockLength == 0 {
|
||||||
|
in[6]++
|
||||||
|
processBlock(&addresses, &in, &zero)
|
||||||
|
processBlock(&addresses, &addresses, &zero)
|
||||||
|
}
|
||||||
|
random = addresses[index%blockLength]
|
||||||
|
} else {
|
||||||
|
random = B[prev][0]
|
||||||
|
}
|
||||||
|
newOffset := indexAlpha(random, lanes, segments, threads, n, slice, lane, index)
|
||||||
|
processBlockXOR(&B[offset], &B[prev], &B[newOffset])
|
||||||
|
index, offset = index+1, offset+1
|
||||||
|
}
|
||||||
|
wg.Done()
|
||||||
|
}
|
||||||
|
|
||||||
|
for n := uint32(0); n < time; n++ {
|
||||||
|
for slice := uint32(0); slice < syncPoints; slice++ {
|
||||||
|
var wg sync.WaitGroup
|
||||||
|
for lane := uint32(0); lane < threads; lane++ {
|
||||||
|
wg.Add(1)
|
||||||
|
go processSegment(n, slice, lane, &wg)
|
||||||
|
}
|
||||||
|
wg.Wait()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func extractKey(B []block, memory, threads, keyLen uint32) []byte {
|
||||||
|
lanes := memory / threads
|
||||||
|
for lane := uint32(0); lane < threads-1; lane++ {
|
||||||
|
for i, v := range B[(lane*lanes)+lanes-1] {
|
||||||
|
B[memory-1][i] ^= v
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var block [1024]byte
|
||||||
|
for i, v := range B[memory-1] {
|
||||||
|
binary.LittleEndian.PutUint64(block[i*8:], v)
|
||||||
|
}
|
||||||
|
key := make([]byte, keyLen)
|
||||||
|
blake2bHash(key, block[:])
|
||||||
|
return key
|
||||||
|
}
|
||||||
|
|
||||||
|
func indexAlpha(rand uint64, lanes, segments, threads, n, slice, lane, index uint32) uint32 {
|
||||||
|
refLane := uint32(rand>>32) % threads
|
||||||
|
if n == 0 && slice == 0 {
|
||||||
|
refLane = lane
|
||||||
|
}
|
||||||
|
m, s := 3*segments, ((slice+1)%syncPoints)*segments
|
||||||
|
if lane == refLane {
|
||||||
|
m += index
|
||||||
|
}
|
||||||
|
if n == 0 {
|
||||||
|
m, s = slice*segments, 0
|
||||||
|
if slice == 0 || lane == refLane {
|
||||||
|
m += index
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if index == 0 || lane == refLane {
|
||||||
|
m--
|
||||||
|
}
|
||||||
|
return phi(rand, uint64(m), uint64(s), refLane, lanes)
|
||||||
|
}
|
||||||
|
|
||||||
|
func phi(rand, m, s uint64, lane, lanes uint32) uint32 {
|
||||||
|
p := rand & 0xFFFFFFFF
|
||||||
|
p = (p * p) >> 32
|
||||||
|
p = (p * m) >> 32
|
||||||
|
return lane*lanes + uint32((s+m-(p+1))%uint64(lanes))
|
||||||
|
}
|
53
vendor/golang.org/x/crypto/argon2/blake2b.go
generated
vendored
Normal file
53
vendor/golang.org/x/crypto/argon2/blake2b.go
generated
vendored
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
// Copyright 2017 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package argon2
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/binary"
|
||||||
|
"hash"
|
||||||
|
|
||||||
|
"golang.org/x/crypto/blake2b"
|
||||||
|
)
|
||||||
|
|
||||||
|
// blake2bHash computes an arbitrary long hash value of in
|
||||||
|
// and writes the hash to out.
|
||||||
|
func blake2bHash(out []byte, in []byte) {
|
||||||
|
var b2 hash.Hash
|
||||||
|
if n := len(out); n < blake2b.Size {
|
||||||
|
b2, _ = blake2b.New(n, nil)
|
||||||
|
} else {
|
||||||
|
b2, _ = blake2b.New512(nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
var buffer [blake2b.Size]byte
|
||||||
|
binary.LittleEndian.PutUint32(buffer[:4], uint32(len(out)))
|
||||||
|
b2.Write(buffer[:4])
|
||||||
|
b2.Write(in)
|
||||||
|
|
||||||
|
if len(out) <= blake2b.Size {
|
||||||
|
b2.Sum(out[:0])
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
outLen := len(out)
|
||||||
|
b2.Sum(buffer[:0])
|
||||||
|
b2.Reset()
|
||||||
|
copy(out, buffer[:32])
|
||||||
|
out = out[32:]
|
||||||
|
for len(out) > blake2b.Size {
|
||||||
|
b2.Write(buffer[:])
|
||||||
|
b2.Sum(buffer[:0])
|
||||||
|
copy(out, buffer[:32])
|
||||||
|
out = out[32:]
|
||||||
|
b2.Reset()
|
||||||
|
}
|
||||||
|
|
||||||
|
if outLen%blake2b.Size > 0 { // outLen > 64
|
||||||
|
r := ((outLen + 31) / 32) - 2 // ⌈τ /32⌉-2
|
||||||
|
b2, _ = blake2b.New(outLen-32*r, nil)
|
||||||
|
}
|
||||||
|
b2.Write(buffer[:])
|
||||||
|
b2.Sum(out[:0])
|
||||||
|
}
|
61
vendor/golang.org/x/crypto/argon2/blamka_amd64.go
generated
vendored
Normal file
61
vendor/golang.org/x/crypto/argon2/blamka_amd64.go
generated
vendored
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
// Copyright 2017 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// +build amd64,!gccgo,!appengine
|
||||||
|
|
||||||
|
package argon2
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
useSSE4 = supportsSSE4()
|
||||||
|
}
|
||||||
|
|
||||||
|
//go:noescape
|
||||||
|
func supportsSSE4() bool
|
||||||
|
|
||||||
|
//go:noescape
|
||||||
|
func mixBlocksSSE2(out, a, b, c *block)
|
||||||
|
|
||||||
|
//go:noescape
|
||||||
|
func xorBlocksSSE2(out, a, b, c *block)
|
||||||
|
|
||||||
|
//go:noescape
|
||||||
|
func blamkaSSE4(b *block)
|
||||||
|
|
||||||
|
func processBlockSSE(out, in1, in2 *block, xor bool) {
|
||||||
|
var t block
|
||||||
|
mixBlocksSSE2(&t, in1, in2, &t)
|
||||||
|
if useSSE4 {
|
||||||
|
blamkaSSE4(&t)
|
||||||
|
} else {
|
||||||
|
for i := 0; i < blockLength; i += 16 {
|
||||||
|
blamkaGeneric(
|
||||||
|
&t[i+0], &t[i+1], &t[i+2], &t[i+3],
|
||||||
|
&t[i+4], &t[i+5], &t[i+6], &t[i+7],
|
||||||
|
&t[i+8], &t[i+9], &t[i+10], &t[i+11],
|
||||||
|
&t[i+12], &t[i+13], &t[i+14], &t[i+15],
|
||||||
|
)
|
||||||
|
}
|
||||||
|
for i := 0; i < blockLength/8; i += 2 {
|
||||||
|
blamkaGeneric(
|
||||||
|
&t[i], &t[i+1], &t[16+i], &t[16+i+1],
|
||||||
|
&t[32+i], &t[32+i+1], &t[48+i], &t[48+i+1],
|
||||||
|
&t[64+i], &t[64+i+1], &t[80+i], &t[80+i+1],
|
||||||
|
&t[96+i], &t[96+i+1], &t[112+i], &t[112+i+1],
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if xor {
|
||||||
|
xorBlocksSSE2(out, in1, in2, &t)
|
||||||
|
} else {
|
||||||
|
mixBlocksSSE2(out, in1, in2, &t)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func processBlock(out, in1, in2 *block) {
|
||||||
|
processBlockSSE(out, in1, in2, false)
|
||||||
|
}
|
||||||
|
|
||||||
|
func processBlockXOR(out, in1, in2 *block) {
|
||||||
|
processBlockSSE(out, in1, in2, true)
|
||||||
|
}
|
252
vendor/golang.org/x/crypto/argon2/blamka_amd64.s
generated
vendored
Normal file
252
vendor/golang.org/x/crypto/argon2/blamka_amd64.s
generated
vendored
Normal file
@ -0,0 +1,252 @@
|
|||||||
|
// Copyright 2017 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// +build amd64,!gccgo,!appengine
|
||||||
|
|
||||||
|
#include "textflag.h"
|
||||||
|
|
||||||
|
DATA ·c40<>+0x00(SB)/8, $0x0201000706050403
|
||||||
|
DATA ·c40<>+0x08(SB)/8, $0x0a09080f0e0d0c0b
|
||||||
|
GLOBL ·c40<>(SB), (NOPTR+RODATA), $16
|
||||||
|
|
||||||
|
DATA ·c48<>+0x00(SB)/8, $0x0100070605040302
|
||||||
|
DATA ·c48<>+0x08(SB)/8, $0x09080f0e0d0c0b0a
|
||||||
|
GLOBL ·c48<>(SB), (NOPTR+RODATA), $16
|
||||||
|
|
||||||
|
#define SHUFFLE(v2, v3, v4, v5, v6, v7, t1, t2) \
|
||||||
|
MOVO v4, t1; \
|
||||||
|
MOVO v5, v4; \
|
||||||
|
MOVO t1, v5; \
|
||||||
|
MOVO v6, t1; \
|
||||||
|
PUNPCKLQDQ v6, t2; \
|
||||||
|
PUNPCKHQDQ v7, v6; \
|
||||||
|
PUNPCKHQDQ t2, v6; \
|
||||||
|
PUNPCKLQDQ v7, t2; \
|
||||||
|
MOVO t1, v7; \
|
||||||
|
MOVO v2, t1; \
|
||||||
|
PUNPCKHQDQ t2, v7; \
|
||||||
|
PUNPCKLQDQ v3, t2; \
|
||||||
|
PUNPCKHQDQ t2, v2; \
|
||||||
|
PUNPCKLQDQ t1, t2; \
|
||||||
|
PUNPCKHQDQ t2, v3
|
||||||
|
|
||||||
|
#define SHUFFLE_INV(v2, v3, v4, v5, v6, v7, t1, t2) \
|
||||||
|
MOVO v4, t1; \
|
||||||
|
MOVO v5, v4; \
|
||||||
|
MOVO t1, v5; \
|
||||||
|
MOVO v2, t1; \
|
||||||
|
PUNPCKLQDQ v2, t2; \
|
||||||
|
PUNPCKHQDQ v3, v2; \
|
||||||
|
PUNPCKHQDQ t2, v2; \
|
||||||
|
PUNPCKLQDQ v3, t2; \
|
||||||
|
MOVO t1, v3; \
|
||||||
|
MOVO v6, t1; \
|
||||||
|
PUNPCKHQDQ t2, v3; \
|
||||||
|
PUNPCKLQDQ v7, t2; \
|
||||||
|
PUNPCKHQDQ t2, v6; \
|
||||||
|
PUNPCKLQDQ t1, t2; \
|
||||||
|
PUNPCKHQDQ t2, v7
|
||||||
|
|
||||||
|
#define HALF_ROUND(v0, v1, v2, v3, v4, v5, v6, v7, t0, c40, c48) \
|
||||||
|
MOVO v0, t0; \
|
||||||
|
PMULULQ v2, t0; \
|
||||||
|
PADDQ v2, v0; \
|
||||||
|
PADDQ t0, v0; \
|
||||||
|
PADDQ t0, v0; \
|
||||||
|
PXOR v0, v6; \
|
||||||
|
PSHUFD $0xB1, v6, v6; \
|
||||||
|
MOVO v4, t0; \
|
||||||
|
PMULULQ v6, t0; \
|
||||||
|
PADDQ v6, v4; \
|
||||||
|
PADDQ t0, v4; \
|
||||||
|
PADDQ t0, v4; \
|
||||||
|
PXOR v4, v2; \
|
||||||
|
PSHUFB c40, v2; \
|
||||||
|
MOVO v0, t0; \
|
||||||
|
PMULULQ v2, t0; \
|
||||||
|
PADDQ v2, v0; \
|
||||||
|
PADDQ t0, v0; \
|
||||||
|
PADDQ t0, v0; \
|
||||||
|
PXOR v0, v6; \
|
||||||
|
PSHUFB c48, v6; \
|
||||||
|
MOVO v4, t0; \
|
||||||
|
PMULULQ v6, t0; \
|
||||||
|
PADDQ v6, v4; \
|
||||||
|
PADDQ t0, v4; \
|
||||||
|
PADDQ t0, v4; \
|
||||||
|
PXOR v4, v2; \
|
||||||
|
MOVO v2, t0; \
|
||||||
|
PADDQ v2, t0; \
|
||||||
|
PSRLQ $63, v2; \
|
||||||
|
PXOR t0, v2; \
|
||||||
|
MOVO v1, t0; \
|
||||||
|
PMULULQ v3, t0; \
|
||||||
|
PADDQ v3, v1; \
|
||||||
|
PADDQ t0, v1; \
|
||||||
|
PADDQ t0, v1; \
|
||||||
|
PXOR v1, v7; \
|
||||||
|
PSHUFD $0xB1, v7, v7; \
|
||||||
|
MOVO v5, t0; \
|
||||||
|
PMULULQ v7, t0; \
|
||||||
|
PADDQ v7, v5; \
|
||||||
|
PADDQ t0, v5; \
|
||||||
|
PADDQ t0, v5; \
|
||||||
|
PXOR v5, v3; \
|
||||||
|
PSHUFB c40, v3; \
|
||||||
|
MOVO v1, t0; \
|
||||||
|
PMULULQ v3, t0; \
|
||||||
|
PADDQ v3, v1; \
|
||||||
|
PADDQ t0, v1; \
|
||||||
|
PADDQ t0, v1; \
|
||||||
|
PXOR v1, v7; \
|
||||||
|
PSHUFB c48, v7; \
|
||||||
|
MOVO v5, t0; \
|
||||||
|
PMULULQ v7, t0; \
|
||||||
|
PADDQ v7, v5; \
|
||||||
|
PADDQ t0, v5; \
|
||||||
|
PADDQ t0, v5; \
|
||||||
|
PXOR v5, v3; \
|
||||||
|
MOVO v3, t0; \
|
||||||
|
PADDQ v3, t0; \
|
||||||
|
PSRLQ $63, v3; \
|
||||||
|
PXOR t0, v3
|
||||||
|
|
||||||
|
#define LOAD_MSG_0(block, off) \
|
||||||
|
MOVOU 8*(off+0)(block), X0; \
|
||||||
|
MOVOU 8*(off+2)(block), X1; \
|
||||||
|
MOVOU 8*(off+4)(block), X2; \
|
||||||
|
MOVOU 8*(off+6)(block), X3; \
|
||||||
|
MOVOU 8*(off+8)(block), X4; \
|
||||||
|
MOVOU 8*(off+10)(block), X5; \
|
||||||
|
MOVOU 8*(off+12)(block), X6; \
|
||||||
|
MOVOU 8*(off+14)(block), X7
|
||||||
|
|
||||||
|
#define STORE_MSG_0(block, off) \
|
||||||
|
MOVOU X0, 8*(off+0)(block); \
|
||||||
|
MOVOU X1, 8*(off+2)(block); \
|
||||||
|
MOVOU X2, 8*(off+4)(block); \
|
||||||
|
MOVOU X3, 8*(off+6)(block); \
|
||||||
|
MOVOU X4, 8*(off+8)(block); \
|
||||||
|
MOVOU X5, 8*(off+10)(block); \
|
||||||
|
MOVOU X6, 8*(off+12)(block); \
|
||||||
|
MOVOU X7, 8*(off+14)(block)
|
||||||
|
|
||||||
|
#define LOAD_MSG_1(block, off) \
|
||||||
|
MOVOU 8*off+0*8(block), X0; \
|
||||||
|
MOVOU 8*off+16*8(block), X1; \
|
||||||
|
MOVOU 8*off+32*8(block), X2; \
|
||||||
|
MOVOU 8*off+48*8(block), X3; \
|
||||||
|
MOVOU 8*off+64*8(block), X4; \
|
||||||
|
MOVOU 8*off+80*8(block), X5; \
|
||||||
|
MOVOU 8*off+96*8(block), X6; \
|
||||||
|
MOVOU 8*off+112*8(block), X7
|
||||||
|
|
||||||
|
#define STORE_MSG_1(block, off) \
|
||||||
|
MOVOU X0, 8*off+0*8(block); \
|
||||||
|
MOVOU X1, 8*off+16*8(block); \
|
||||||
|
MOVOU X2, 8*off+32*8(block); \
|
||||||
|
MOVOU X3, 8*off+48*8(block); \
|
||||||
|
MOVOU X4, 8*off+64*8(block); \
|
||||||
|
MOVOU X5, 8*off+80*8(block); \
|
||||||
|
MOVOU X6, 8*off+96*8(block); \
|
||||||
|
MOVOU X7, 8*off+112*8(block)
|
||||||
|
|
||||||
|
#define BLAMKA_ROUND_0(block, off, t0, t1, c40, c48) \
|
||||||
|
LOAD_MSG_0(block, off); \
|
||||||
|
HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, t0, c40, c48); \
|
||||||
|
SHUFFLE(X2, X3, X4, X5, X6, X7, t0, t1); \
|
||||||
|
HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, t0, c40, c48); \
|
||||||
|
SHUFFLE_INV(X2, X3, X4, X5, X6, X7, t0, t1); \
|
||||||
|
STORE_MSG_0(block, off)
|
||||||
|
|
||||||
|
#define BLAMKA_ROUND_1(block, off, t0, t1, c40, c48) \
|
||||||
|
LOAD_MSG_1(block, off); \
|
||||||
|
HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, t0, c40, c48); \
|
||||||
|
SHUFFLE(X2, X3, X4, X5, X6, X7, t0, t1); \
|
||||||
|
HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, t0, c40, c48); \
|
||||||
|
SHUFFLE_INV(X2, X3, X4, X5, X6, X7, t0, t1); \
|
||||||
|
STORE_MSG_1(block, off)
|
||||||
|
|
||||||
|
// func blamkaSSE4(b *block)
|
||||||
|
TEXT ·blamkaSSE4(SB), 4, $0-8
|
||||||
|
MOVQ b+0(FP), AX
|
||||||
|
|
||||||
|
MOVOU ·c40<>(SB), X10
|
||||||
|
MOVOU ·c48<>(SB), X11
|
||||||
|
|
||||||
|
BLAMKA_ROUND_0(AX, 0, X8, X9, X10, X11)
|
||||||
|
BLAMKA_ROUND_0(AX, 16, X8, X9, X10, X11)
|
||||||
|
BLAMKA_ROUND_0(AX, 32, X8, X9, X10, X11)
|
||||||
|
BLAMKA_ROUND_0(AX, 48, X8, X9, X10, X11)
|
||||||
|
BLAMKA_ROUND_0(AX, 64, X8, X9, X10, X11)
|
||||||
|
BLAMKA_ROUND_0(AX, 80, X8, X9, X10, X11)
|
||||||
|
BLAMKA_ROUND_0(AX, 96, X8, X9, X10, X11)
|
||||||
|
BLAMKA_ROUND_0(AX, 112, X8, X9, X10, X11)
|
||||||
|
|
||||||
|
BLAMKA_ROUND_1(AX, 0, X8, X9, X10, X11)
|
||||||
|
BLAMKA_ROUND_1(AX, 2, X8, X9, X10, X11)
|
||||||
|
BLAMKA_ROUND_1(AX, 4, X8, X9, X10, X11)
|
||||||
|
BLAMKA_ROUND_1(AX, 6, X8, X9, X10, X11)
|
||||||
|
BLAMKA_ROUND_1(AX, 8, X8, X9, X10, X11)
|
||||||
|
BLAMKA_ROUND_1(AX, 10, X8, X9, X10, X11)
|
||||||
|
BLAMKA_ROUND_1(AX, 12, X8, X9, X10, X11)
|
||||||
|
BLAMKA_ROUND_1(AX, 14, X8, X9, X10, X11)
|
||||||
|
RET
|
||||||
|
|
||||||
|
// func mixBlocksSSE2(out, a, b, c *block)
|
||||||
|
TEXT ·mixBlocksSSE2(SB), 4, $0-32
|
||||||
|
MOVQ out+0(FP), DX
|
||||||
|
MOVQ a+8(FP), AX
|
||||||
|
MOVQ b+16(FP), BX
|
||||||
|
MOVQ a+24(FP), CX
|
||||||
|
MOVQ $128, BP
|
||||||
|
|
||||||
|
loop:
|
||||||
|
MOVOU 0(AX), X0
|
||||||
|
MOVOU 0(BX), X1
|
||||||
|
MOVOU 0(CX), X2
|
||||||
|
PXOR X1, X0
|
||||||
|
PXOR X2, X0
|
||||||
|
MOVOU X0, 0(DX)
|
||||||
|
ADDQ $16, AX
|
||||||
|
ADDQ $16, BX
|
||||||
|
ADDQ $16, CX
|
||||||
|
ADDQ $16, DX
|
||||||
|
SUBQ $2, BP
|
||||||
|
JA loop
|
||||||
|
RET
|
||||||
|
|
||||||
|
// func xorBlocksSSE2(out, a, b, c *block)
|
||||||
|
TEXT ·xorBlocksSSE2(SB), 4, $0-32
|
||||||
|
MOVQ out+0(FP), DX
|
||||||
|
MOVQ a+8(FP), AX
|
||||||
|
MOVQ b+16(FP), BX
|
||||||
|
MOVQ a+24(FP), CX
|
||||||
|
MOVQ $128, BP
|
||||||
|
|
||||||
|
loop:
|
||||||
|
MOVOU 0(AX), X0
|
||||||
|
MOVOU 0(BX), X1
|
||||||
|
MOVOU 0(CX), X2
|
||||||
|
MOVOU 0(DX), X3
|
||||||
|
PXOR X1, X0
|
||||||
|
PXOR X2, X0
|
||||||
|
PXOR X3, X0
|
||||||
|
MOVOU X0, 0(DX)
|
||||||
|
ADDQ $16, AX
|
||||||
|
ADDQ $16, BX
|
||||||
|
ADDQ $16, CX
|
||||||
|
ADDQ $16, DX
|
||||||
|
SUBQ $2, BP
|
||||||
|
JA loop
|
||||||
|
RET
|
||||||
|
|
||||||
|
// func supportsSSE4() bool
|
||||||
|
TEXT ·supportsSSE4(SB), 4, $0-1
|
||||||
|
MOVL $1, AX
|
||||||
|
CPUID
|
||||||
|
SHRL $19, CX // Bit 19 indicates SSE4 support
|
||||||
|
ANDL $1, CX // CX != 0 if support SSE4
|
||||||
|
MOVB CX, ret+0(FP)
|
||||||
|
RET
|
163
vendor/golang.org/x/crypto/argon2/blamka_generic.go
generated
vendored
Normal file
163
vendor/golang.org/x/crypto/argon2/blamka_generic.go
generated
vendored
Normal file
@ -0,0 +1,163 @@
|
|||||||
|
// Copyright 2017 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package argon2
|
||||||
|
|
||||||
|
var useSSE4 bool
|
||||||
|
|
||||||
|
func processBlockGeneric(out, in1, in2 *block, xor bool) {
|
||||||
|
var t block
|
||||||
|
for i := range t {
|
||||||
|
t[i] = in1[i] ^ in2[i]
|
||||||
|
}
|
||||||
|
for i := 0; i < blockLength; i += 16 {
|
||||||
|
blamkaGeneric(
|
||||||
|
&t[i+0], &t[i+1], &t[i+2], &t[i+3],
|
||||||
|
&t[i+4], &t[i+5], &t[i+6], &t[i+7],
|
||||||
|
&t[i+8], &t[i+9], &t[i+10], &t[i+11],
|
||||||
|
&t[i+12], &t[i+13], &t[i+14], &t[i+15],
|
||||||
|
)
|
||||||
|
}
|
||||||
|
for i := 0; i < blockLength/8; i += 2 {
|
||||||
|
blamkaGeneric(
|
||||||
|
&t[i], &t[i+1], &t[16+i], &t[16+i+1],
|
||||||
|
&t[32+i], &t[32+i+1], &t[48+i], &t[48+i+1],
|
||||||
|
&t[64+i], &t[64+i+1], &t[80+i], &t[80+i+1],
|
||||||
|
&t[96+i], &t[96+i+1], &t[112+i], &t[112+i+1],
|
||||||
|
)
|
||||||
|
}
|
||||||
|
if xor {
|
||||||
|
for i := range t {
|
||||||
|
out[i] ^= in1[i] ^ in2[i] ^ t[i]
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for i := range t {
|
||||||
|
out[i] = in1[i] ^ in2[i] ^ t[i]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func blamkaGeneric(t00, t01, t02, t03, t04, t05, t06, t07, t08, t09, t10, t11, t12, t13, t14, t15 *uint64) {
|
||||||
|
v00, v01, v02, v03 := *t00, *t01, *t02, *t03
|
||||||
|
v04, v05, v06, v07 := *t04, *t05, *t06, *t07
|
||||||
|
v08, v09, v10, v11 := *t08, *t09, *t10, *t11
|
||||||
|
v12, v13, v14, v15 := *t12, *t13, *t14, *t15
|
||||||
|
|
||||||
|
v00 += v04 + 2*uint64(uint32(v00))*uint64(uint32(v04))
|
||||||
|
v12 ^= v00
|
||||||
|
v12 = v12>>32 | v12<<32
|
||||||
|
v08 += v12 + 2*uint64(uint32(v08))*uint64(uint32(v12))
|
||||||
|
v04 ^= v08
|
||||||
|
v04 = v04>>24 | v04<<40
|
||||||
|
|
||||||
|
v00 += v04 + 2*uint64(uint32(v00))*uint64(uint32(v04))
|
||||||
|
v12 ^= v00
|
||||||
|
v12 = v12>>16 | v12<<48
|
||||||
|
v08 += v12 + 2*uint64(uint32(v08))*uint64(uint32(v12))
|
||||||
|
v04 ^= v08
|
||||||
|
v04 = v04>>63 | v04<<1
|
||||||
|
|
||||||
|
v01 += v05 + 2*uint64(uint32(v01))*uint64(uint32(v05))
|
||||||
|
v13 ^= v01
|
||||||
|
v13 = v13>>32 | v13<<32
|
||||||
|
v09 += v13 + 2*uint64(uint32(v09))*uint64(uint32(v13))
|
||||||
|
v05 ^= v09
|
||||||
|
v05 = v05>>24 | v05<<40
|
||||||
|
|
||||||
|
v01 += v05 + 2*uint64(uint32(v01))*uint64(uint32(v05))
|
||||||
|
v13 ^= v01
|
||||||
|
v13 = v13>>16 | v13<<48
|
||||||
|
v09 += v13 + 2*uint64(uint32(v09))*uint64(uint32(v13))
|
||||||
|
v05 ^= v09
|
||||||
|
v05 = v05>>63 | v05<<1
|
||||||
|
|
||||||
|
v02 += v06 + 2*uint64(uint32(v02))*uint64(uint32(v06))
|
||||||
|
v14 ^= v02
|
||||||
|
v14 = v14>>32 | v14<<32
|
||||||
|
v10 += v14 + 2*uint64(uint32(v10))*uint64(uint32(v14))
|
||||||
|
v06 ^= v10
|
||||||
|
v06 = v06>>24 | v06<<40
|
||||||
|
|
||||||
|
v02 += v06 + 2*uint64(uint32(v02))*uint64(uint32(v06))
|
||||||
|
v14 ^= v02
|
||||||
|
v14 = v14>>16 | v14<<48
|
||||||
|
v10 += v14 + 2*uint64(uint32(v10))*uint64(uint32(v14))
|
||||||
|
v06 ^= v10
|
||||||
|
v06 = v06>>63 | v06<<1
|
||||||
|
|
||||||
|
v03 += v07 + 2*uint64(uint32(v03))*uint64(uint32(v07))
|
||||||
|
v15 ^= v03
|
||||||
|
v15 = v15>>32 | v15<<32
|
||||||
|
v11 += v15 + 2*uint64(uint32(v11))*uint64(uint32(v15))
|
||||||
|
v07 ^= v11
|
||||||
|
v07 = v07>>24 | v07<<40
|
||||||
|
|
||||||
|
v03 += v07 + 2*uint64(uint32(v03))*uint64(uint32(v07))
|
||||||
|
v15 ^= v03
|
||||||
|
v15 = v15>>16 | v15<<48
|
||||||
|
v11 += v15 + 2*uint64(uint32(v11))*uint64(uint32(v15))
|
||||||
|
v07 ^= v11
|
||||||
|
v07 = v07>>63 | v07<<1
|
||||||
|
|
||||||
|
v00 += v05 + 2*uint64(uint32(v00))*uint64(uint32(v05))
|
||||||
|
v15 ^= v00
|
||||||
|
v15 = v15>>32 | v15<<32
|
||||||
|
v10 += v15 + 2*uint64(uint32(v10))*uint64(uint32(v15))
|
||||||
|
v05 ^= v10
|
||||||
|
v05 = v05>>24 | v05<<40
|
||||||
|
|
||||||
|
v00 += v05 + 2*uint64(uint32(v00))*uint64(uint32(v05))
|
||||||
|
v15 ^= v00
|
||||||
|
v15 = v15>>16 | v15<<48
|
||||||
|
v10 += v15 + 2*uint64(uint32(v10))*uint64(uint32(v15))
|
||||||
|
v05 ^= v10
|
||||||
|
v05 = v05>>63 | v05<<1
|
||||||
|
|
||||||
|
v01 += v06 + 2*uint64(uint32(v01))*uint64(uint32(v06))
|
||||||
|
v12 ^= v01
|
||||||
|
v12 = v12>>32 | v12<<32
|
||||||
|
v11 += v12 + 2*uint64(uint32(v11))*uint64(uint32(v12))
|
||||||
|
v06 ^= v11
|
||||||
|
v06 = v06>>24 | v06<<40
|
||||||
|
|
||||||
|
v01 += v06 + 2*uint64(uint32(v01))*uint64(uint32(v06))
|
||||||
|
v12 ^= v01
|
||||||
|
v12 = v12>>16 | v12<<48
|
||||||
|
v11 += v12 + 2*uint64(uint32(v11))*uint64(uint32(v12))
|
||||||
|
v06 ^= v11
|
||||||
|
v06 = v06>>63 | v06<<1
|
||||||
|
|
||||||
|
v02 += v07 + 2*uint64(uint32(v02))*uint64(uint32(v07))
|
||||||
|
v13 ^= v02
|
||||||
|
v13 = v13>>32 | v13<<32
|
||||||
|
v08 += v13 + 2*uint64(uint32(v08))*uint64(uint32(v13))
|
||||||
|
v07 ^= v08
|
||||||
|
v07 = v07>>24 | v07<<40
|
||||||
|
|
||||||
|
v02 += v07 + 2*uint64(uint32(v02))*uint64(uint32(v07))
|
||||||
|
v13 ^= v02
|
||||||
|
v13 = v13>>16 | v13<<48
|
||||||
|
v08 += v13 + 2*uint64(uint32(v08))*uint64(uint32(v13))
|
||||||
|
v07 ^= v08
|
||||||
|
v07 = v07>>63 | v07<<1
|
||||||
|
|
||||||
|
v03 += v04 + 2*uint64(uint32(v03))*uint64(uint32(v04))
|
||||||
|
v14 ^= v03
|
||||||
|
v14 = v14>>32 | v14<<32
|
||||||
|
v09 += v14 + 2*uint64(uint32(v09))*uint64(uint32(v14))
|
||||||
|
v04 ^= v09
|
||||||
|
v04 = v04>>24 | v04<<40
|
||||||
|
|
||||||
|
v03 += v04 + 2*uint64(uint32(v03))*uint64(uint32(v04))
|
||||||
|
v14 ^= v03
|
||||||
|
v14 = v14>>16 | v14<<48
|
||||||
|
v09 += v14 + 2*uint64(uint32(v09))*uint64(uint32(v14))
|
||||||
|
v04 ^= v09
|
||||||
|
v04 = v04>>63 | v04<<1
|
||||||
|
|
||||||
|
*t00, *t01, *t02, *t03 = v00, v01, v02, v03
|
||||||
|
*t04, *t05, *t06, *t07 = v04, v05, v06, v07
|
||||||
|
*t08, *t09, *t10, *t11 = v08, v09, v10, v11
|
||||||
|
*t12, *t13, *t14, *t15 = v12, v13, v14, v15
|
||||||
|
}
|
15
vendor/golang.org/x/crypto/argon2/blamka_ref.go
generated
vendored
Normal file
15
vendor/golang.org/x/crypto/argon2/blamka_ref.go
generated
vendored
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
// Copyright 2017 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// +build !amd64 appengine gccgo
|
||||||
|
|
||||||
|
package argon2
|
||||||
|
|
||||||
|
func processBlock(out, in1, in2 *block) {
|
||||||
|
processBlockGeneric(out, in1, in2, false)
|
||||||
|
}
|
||||||
|
|
||||||
|
func processBlockXOR(out, in1, in2 *block) {
|
||||||
|
processBlockGeneric(out, in1, in2, true)
|
||||||
|
}
|
45
vendor/golang.org/x/crypto/blake2b/blake2b.go
generated
vendored
45
vendor/golang.org/x/crypto/blake2b/blake2b.go
generated
vendored
@ -2,8 +2,18 @@
|
|||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
// Package blake2b implements the BLAKE2b hash algorithm as
|
// Package blake2b implements the BLAKE2b hash algorithm defined by RFC 7693
|
||||||
// defined in RFC 7693.
|
// and the extendable output function (XOF) BLAKE2Xb.
|
||||||
|
//
|
||||||
|
// For a detailed specification of BLAKE2b see https://blake2.net/blake2.pdf
|
||||||
|
// and for BLAKE2Xb see https://blake2.net/blake2x.pdf
|
||||||
|
//
|
||||||
|
// If you aren't sure which function you need, use BLAKE2b (Sum512 or New512).
|
||||||
|
// If you need a secret-key MAC (message authentication code), use the New512
|
||||||
|
// function with a non-nil key.
|
||||||
|
//
|
||||||
|
// BLAKE2X is a construction to compute hash values larger than 64 bytes. It
|
||||||
|
// can produce hash values between 0 and 4 GiB.
|
||||||
package blake2b
|
package blake2b
|
||||||
|
|
||||||
import (
|
import (
|
||||||
@ -29,7 +39,10 @@ var (
|
|||||||
useSSE4 bool
|
useSSE4 bool
|
||||||
)
|
)
|
||||||
|
|
||||||
var errKeySize = errors.New("blake2b: invalid key size")
|
var (
|
||||||
|
errKeySize = errors.New("blake2b: invalid key size")
|
||||||
|
errHashSize = errors.New("blake2b: invalid hash size")
|
||||||
|
)
|
||||||
|
|
||||||
var iv = [8]uint64{
|
var iv = [8]uint64{
|
||||||
0x6a09e667f3bcc908, 0xbb67ae8584caa73b, 0x3c6ef372fe94f82b, 0xa54ff53a5f1d36f1,
|
0x6a09e667f3bcc908, 0xbb67ae8584caa73b, 0x3c6ef372fe94f82b, 0xa54ff53a5f1d36f1,
|
||||||
@ -73,7 +86,18 @@ func New384(key []byte) (hash.Hash, error) { return newDigest(Size384, key) }
|
|||||||
// key turns the hash into a MAC. The key must between zero and 64 bytes long.
|
// key turns the hash into a MAC. The key must between zero and 64 bytes long.
|
||||||
func New256(key []byte) (hash.Hash, error) { return newDigest(Size256, key) }
|
func New256(key []byte) (hash.Hash, error) { return newDigest(Size256, key) }
|
||||||
|
|
||||||
|
// New returns a new hash.Hash computing the BLAKE2b checksum with a custom length.
|
||||||
|
// A non-nil key turns the hash into a MAC. The key must between zero and 64 bytes long.
|
||||||
|
// The hash size can be a value between 1 and 64 but it is highly recommended to use
|
||||||
|
// values equal or greater than:
|
||||||
|
// - 32 if BLAKE2b is used as a hash function (The key is zero bytes long).
|
||||||
|
// - 16 if BLAKE2b is used as a MAC function (The key is at least 16 bytes long).
|
||||||
|
func New(size int, key []byte) (hash.Hash, error) { return newDigest(size, key) }
|
||||||
|
|
||||||
func newDigest(hashSize int, key []byte) (*digest, error) {
|
func newDigest(hashSize int, key []byte) (*digest, error) {
|
||||||
|
if hashSize < 1 || hashSize > Size {
|
||||||
|
return nil, errHashSize
|
||||||
|
}
|
||||||
if len(key) > Size {
|
if len(key) > Size {
|
||||||
return nil, errKeySize
|
return nil, errKeySize
|
||||||
}
|
}
|
||||||
@ -171,7 +195,13 @@ func (d *digest) Write(p []byte) (n int, err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *digest) Sum(b []byte) []byte {
|
func (d *digest) Sum(sum []byte) []byte {
|
||||||
|
var hash [Size]byte
|
||||||
|
d.finalize(&hash)
|
||||||
|
return append(sum, hash[:d.size]...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *digest) finalize(hash *[Size]byte) {
|
||||||
var block [BlockSize]byte
|
var block [BlockSize]byte
|
||||||
copy(block[:], d.block[:d.offset])
|
copy(block[:], d.block[:d.offset])
|
||||||
remaining := uint64(BlockSize - d.offset)
|
remaining := uint64(BlockSize - d.offset)
|
||||||
@ -185,10 +215,7 @@ func (d *digest) Sum(b []byte) []byte {
|
|||||||
h := d.h
|
h := d.h
|
||||||
hashBlocks(&h, &c, 0xFFFFFFFFFFFFFFFF, block[:])
|
hashBlocks(&h, &c, 0xFFFFFFFFFFFFFFFF, block[:])
|
||||||
|
|
||||||
var sum [Size]byte
|
for i, v := range h {
|
||||||
for i, v := range h[:(d.size+7)/8] {
|
binary.LittleEndian.PutUint64(hash[8*i:], v)
|
||||||
binary.LittleEndian.PutUint64(sum[8*i:], v)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return append(b, sum[:d.size]...)
|
|
||||||
}
|
}
|
||||||
|
448
vendor/golang.org/x/crypto/blake2b/blake2b_test.go
generated
vendored
448
vendor/golang.org/x/crypto/blake2b/blake2b_test.go
generated
vendored
@ -1,448 +0,0 @@
|
|||||||
// Copyright 2016 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package blake2b
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/hex"
|
|
||||||
"fmt"
|
|
||||||
"hash"
|
|
||||||
"testing"
|
|
||||||
)
|
|
||||||
|
|
||||||
func fromHex(s string) []byte {
|
|
||||||
b, err := hex.DecodeString(s)
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
return b
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestHashes(t *testing.T) {
|
|
||||||
defer func(sse4, avx, avx2 bool) {
|
|
||||||
useSSE4, useAVX, useAVX2 = sse4, useAVX, avx2
|
|
||||||
}(useSSE4, useAVX, useAVX2)
|
|
||||||
|
|
||||||
if useAVX2 {
|
|
||||||
t.Log("AVX2 version")
|
|
||||||
testHashes(t)
|
|
||||||
useAVX2 = false
|
|
||||||
}
|
|
||||||
if useAVX {
|
|
||||||
t.Log("AVX version")
|
|
||||||
testHashes(t)
|
|
||||||
useAVX = false
|
|
||||||
}
|
|
||||||
if useSSE4 {
|
|
||||||
t.Log("SSE4 version")
|
|
||||||
testHashes(t)
|
|
||||||
useSSE4 = false
|
|
||||||
}
|
|
||||||
t.Log("generic version")
|
|
||||||
testHashes(t)
|
|
||||||
}
|
|
||||||
|
|
||||||
func testHashes(t *testing.T) {
|
|
||||||
key, _ := hex.DecodeString("000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f")
|
|
||||||
|
|
||||||
input := make([]byte, 255)
|
|
||||||
for i := range input {
|
|
||||||
input[i] = byte(i)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i, expectedHex := range hashes {
|
|
||||||
h, err := New512(key)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("#%d: error from New512: %v", i, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
h.Write(input[:i])
|
|
||||||
sum := h.Sum(nil)
|
|
||||||
|
|
||||||
if gotHex := fmt.Sprintf("%x", sum); gotHex != expectedHex {
|
|
||||||
t.Fatalf("#%d (single write): got %s, wanted %s", i, gotHex, expectedHex)
|
|
||||||
}
|
|
||||||
|
|
||||||
h.Reset()
|
|
||||||
for j := 0; j < i; j++ {
|
|
||||||
h.Write(input[j : j+1])
|
|
||||||
}
|
|
||||||
|
|
||||||
sum = h.Sum(sum[:0])
|
|
||||||
if gotHex := fmt.Sprintf("%x", sum); gotHex != expectedHex {
|
|
||||||
t.Fatalf("#%d (byte-by-byte): got %s, wanted %s", i, gotHex, expectedHex)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func generateSequence(out []byte, seed uint32) {
|
|
||||||
a := 0xDEAD4BAD * seed // prime
|
|
||||||
b := uint32(1)
|
|
||||||
|
|
||||||
for i := range out { // fill the buf
|
|
||||||
a, b = b, a+b
|
|
||||||
out[i] = byte(b >> 24)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func computeMAC(msg []byte, hashSize int, key []byte) (sum []byte) {
|
|
||||||
var h hash.Hash
|
|
||||||
switch hashSize {
|
|
||||||
case Size:
|
|
||||||
h, _ = New512(key)
|
|
||||||
case Size384:
|
|
||||||
h, _ = New384(key)
|
|
||||||
case Size256:
|
|
||||||
h, _ = New256(key)
|
|
||||||
case 20:
|
|
||||||
h, _ = newDigest(20, key)
|
|
||||||
default:
|
|
||||||
panic("unexpected hashSize")
|
|
||||||
}
|
|
||||||
|
|
||||||
h.Write(msg)
|
|
||||||
return h.Sum(sum)
|
|
||||||
}
|
|
||||||
|
|
||||||
func computeHash(msg []byte, hashSize int) (sum []byte) {
|
|
||||||
switch hashSize {
|
|
||||||
case Size:
|
|
||||||
hash := Sum512(msg)
|
|
||||||
return hash[:]
|
|
||||||
case Size384:
|
|
||||||
hash := Sum384(msg)
|
|
||||||
return hash[:]
|
|
||||||
case Size256:
|
|
||||||
hash := Sum256(msg)
|
|
||||||
return hash[:]
|
|
||||||
case 20:
|
|
||||||
var hash [64]byte
|
|
||||||
checkSum(&hash, 20, msg)
|
|
||||||
return hash[:20]
|
|
||||||
default:
|
|
||||||
panic("unexpected hashSize")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Test function from RFC 7693.
|
|
||||||
func TestSelfTest(t *testing.T) {
|
|
||||||
hashLens := [4]int{20, 32, 48, 64}
|
|
||||||
msgLens := [6]int{0, 3, 128, 129, 255, 1024}
|
|
||||||
|
|
||||||
msg := make([]byte, 1024)
|
|
||||||
key := make([]byte, 64)
|
|
||||||
|
|
||||||
h, _ := New256(nil)
|
|
||||||
for _, hashSize := range hashLens {
|
|
||||||
for _, msgLength := range msgLens {
|
|
||||||
generateSequence(msg[:msgLength], uint32(msgLength)) // unkeyed hash
|
|
||||||
|
|
||||||
md := computeHash(msg[:msgLength], hashSize)
|
|
||||||
h.Write(md)
|
|
||||||
|
|
||||||
generateSequence(key[:], uint32(hashSize)) // keyed hash
|
|
||||||
md = computeMAC(msg[:msgLength], hashSize, key[:hashSize])
|
|
||||||
h.Write(md)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sum := h.Sum(nil)
|
|
||||||
expected := [32]byte{
|
|
||||||
0xc2, 0x3a, 0x78, 0x00, 0xd9, 0x81, 0x23, 0xbd,
|
|
||||||
0x10, 0xf5, 0x06, 0xc6, 0x1e, 0x29, 0xda, 0x56,
|
|
||||||
0x03, 0xd7, 0x63, 0xb8, 0xbb, 0xad, 0x2e, 0x73,
|
|
||||||
0x7f, 0x5e, 0x76, 0x5a, 0x7b, 0xcc, 0xd4, 0x75,
|
|
||||||
}
|
|
||||||
if !bytes.Equal(sum, expected[:]) {
|
|
||||||
t.Fatalf("got %x, wanted %x", sum, expected)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Benchmarks
|
|
||||||
|
|
||||||
func benchmarkSum(b *testing.B, size int) {
|
|
||||||
data := make([]byte, size)
|
|
||||||
b.SetBytes(int64(size))
|
|
||||||
b.ResetTimer()
|
|
||||||
for i := 0; i < b.N; i++ {
|
|
||||||
Sum512(data)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func benchmarkWrite(b *testing.B, size int) {
|
|
||||||
data := make([]byte, size)
|
|
||||||
h, _ := New512(nil)
|
|
||||||
b.SetBytes(int64(size))
|
|
||||||
b.ResetTimer()
|
|
||||||
for i := 0; i < b.N; i++ {
|
|
||||||
h.Write(data)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkWrite128(b *testing.B) { benchmarkWrite(b, 128) }
|
|
||||||
func BenchmarkWrite1K(b *testing.B) { benchmarkWrite(b, 1024) }
|
|
||||||
|
|
||||||
func BenchmarkSum128(b *testing.B) { benchmarkSum(b, 128) }
|
|
||||||
func BenchmarkSum1K(b *testing.B) { benchmarkSum(b, 1024) }
|
|
||||||
|
|
||||||
// These values were taken from https://blake2.net/blake2b-test.txt.
|
|
||||||
var hashes = []string{
|
|
||||||
"10ebb67700b1868efb4417987acf4690ae9d972fb7a590c2f02871799aaa4786b5e996e8f0f4eb981fc214b005f42d2ff4233499391653df7aefcbc13fc51568",
|
|
||||||
"961f6dd1e4dd30f63901690c512e78e4b45e4742ed197c3c5e45c549fd25f2e4187b0bc9fe30492b16b0d0bc4ef9b0f34c7003fac09a5ef1532e69430234cebd",
|
|
||||||
"da2cfbe2d8409a0f38026113884f84b50156371ae304c4430173d08a99d9fb1b983164a3770706d537f49e0c916d9f32b95cc37a95b99d857436f0232c88a965",
|
|
||||||
"33d0825dddf7ada99b0e7e307104ad07ca9cfd9692214f1561356315e784f3e5a17e364ae9dbb14cb2036df932b77f4b292761365fb328de7afdc6d8998f5fc1",
|
|
||||||
"beaa5a3d08f3807143cf621d95cd690514d0b49efff9c91d24b59241ec0eefa5f60196d407048bba8d2146828ebcb0488d8842fd56bb4f6df8e19c4b4daab8ac",
|
|
||||||
"098084b51fd13deae5f4320de94a688ee07baea2800486689a8636117b46c1f4c1f6af7f74ae7c857600456a58a3af251dc4723a64cc7c0a5ab6d9cac91c20bb",
|
|
||||||
"6044540d560853eb1c57df0077dd381094781cdb9073e5b1b3d3f6c7829e12066bbaca96d989a690de72ca3133a83652ba284a6d62942b271ffa2620c9e75b1f",
|
|
||||||
"7a8cfe9b90f75f7ecb3acc053aaed6193112b6f6a4aeeb3f65d3de541942deb9e2228152a3c4bbbe72fc3b12629528cfbb09fe630f0474339f54abf453e2ed52",
|
|
||||||
"380beaf6ea7cc9365e270ef0e6f3a64fb902acae51dd5512f84259ad2c91f4bc4108db73192a5bbfb0cbcf71e46c3e21aee1c5e860dc96e8eb0b7b8426e6abe9",
|
|
||||||
"60fe3c4535e1b59d9a61ea8500bfac41a69dffb1ceadd9aca323e9a625b64da5763bad7226da02b9c8c4f1a5de140ac5a6c1124e4f718ce0b28ea47393aa6637",
|
|
||||||
"4fe181f54ad63a2983feaaf77d1e7235c2beb17fa328b6d9505bda327df19fc37f02c4b6f0368ce23147313a8e5738b5fa2a95b29de1c7f8264eb77b69f585cd",
|
|
||||||
"f228773ce3f3a42b5f144d63237a72d99693adb8837d0e112a8a0f8ffff2c362857ac49c11ec740d1500749dac9b1f4548108bf3155794dcc9e4082849e2b85b",
|
|
||||||
"962452a8455cc56c8511317e3b1f3b2c37df75f588e94325fdd77070359cf63a9ae6e930936fdf8e1e08ffca440cfb72c28f06d89a2151d1c46cd5b268ef8563",
|
|
||||||
"43d44bfa18768c59896bf7ed1765cb2d14af8c260266039099b25a603e4ddc5039d6ef3a91847d1088d401c0c7e847781a8a590d33a3c6cb4df0fab1c2f22355",
|
|
||||||
"dcffa9d58c2a4ca2cdbb0c7aa4c4c1d45165190089f4e983bb1c2cab4aaeff1fa2b5ee516fecd780540240bf37e56c8bcca7fab980e1e61c9400d8a9a5b14ac6",
|
|
||||||
"6fbf31b45ab0c0b8dad1c0f5f4061379912dde5aa922099a030b725c73346c524291adef89d2f6fd8dfcda6d07dad811a9314536c2915ed45da34947e83de34e",
|
|
||||||
"a0c65bddde8adef57282b04b11e7bc8aab105b99231b750c021f4a735cb1bcfab87553bba3abb0c3e64a0b6955285185a0bd35fb8cfde557329bebb1f629ee93",
|
|
||||||
"f99d815550558e81eca2f96718aed10d86f3f1cfb675cce06b0eff02f617c5a42c5aa760270f2679da2677c5aeb94f1142277f21c7f79f3c4f0cce4ed8ee62b1",
|
|
||||||
"95391da8fc7b917a2044b3d6f5374e1ca072b41454d572c7356c05fd4bc1e0f40b8bb8b4a9f6bce9be2c4623c399b0dca0dab05cb7281b71a21b0ebcd9e55670",
|
|
||||||
"04b9cd3d20d221c09ac86913d3dc63041989a9a1e694f1e639a3ba7e451840f750c2fc191d56ad61f2e7936bc0ac8e094b60caeed878c18799045402d61ceaf9",
|
|
||||||
"ec0e0ef707e4ed6c0c66f9e089e4954b058030d2dd86398fe84059631f9ee591d9d77375355149178c0cf8f8e7c49ed2a5e4f95488a2247067c208510fadc44c",
|
|
||||||
"9a37cce273b79c09913677510eaf7688e89b3314d3532fd2764c39de022a2945b5710d13517af8ddc0316624e73bec1ce67df15228302036f330ab0cb4d218dd",
|
|
||||||
"4cf9bb8fb3d4de8b38b2f262d3c40f46dfe747e8fc0a414c193d9fcf753106ce47a18f172f12e8a2f1c26726545358e5ee28c9e2213a8787aafbc516d2343152",
|
|
||||||
"64e0c63af9c808fd893137129867fd91939d53f2af04be4fa268006100069b2d69daa5c5d8ed7fddcb2a70eeecdf2b105dd46a1e3b7311728f639ab489326bc9",
|
|
||||||
"5e9c93158d659b2def06b0c3c7565045542662d6eee8a96a89b78ade09fe8b3dcc096d4fe48815d88d8f82620156602af541955e1f6ca30dce14e254c326b88f",
|
|
||||||
"7775dff889458dd11aef417276853e21335eb88e4dec9cfb4e9edb49820088551a2ca60339f12066101169f0dfe84b098fddb148d9da6b3d613df263889ad64b",
|
|
||||||
"f0d2805afbb91f743951351a6d024f9353a23c7ce1fc2b051b3a8b968c233f46f50f806ecb1568ffaa0b60661e334b21dde04f8fa155ac740eeb42e20b60d764",
|
|
||||||
"86a2af316e7d7754201b942e275364ac12ea8962ab5bd8d7fb276dc5fbffc8f9a28cae4e4867df6780d9b72524160927c855da5b6078e0b554aa91e31cb9ca1d",
|
|
||||||
"10bdf0caa0802705e706369baf8a3f79d72c0a03a80675a7bbb00be3a45e516424d1ee88efb56f6d5777545ae6e27765c3a8f5e493fc308915638933a1dfee55",
|
|
||||||
"b01781092b1748459e2e4ec178696627bf4ebafebba774ecf018b79a68aeb84917bf0b84bb79d17b743151144cd66b7b33a4b9e52c76c4e112050ff5385b7f0b",
|
|
||||||
"c6dbc61dec6eaeac81e3d5f755203c8e220551534a0b2fd105a91889945a638550204f44093dd998c076205dffad703a0e5cd3c7f438a7e634cd59fededb539e",
|
|
||||||
"eba51acffb4cea31db4b8d87e9bf7dd48fe97b0253ae67aa580f9ac4a9d941f2bea518ee286818cc9f633f2a3b9fb68e594b48cdd6d515bf1d52ba6c85a203a7",
|
|
||||||
"86221f3ada52037b72224f105d7999231c5e5534d03da9d9c0a12acb68460cd375daf8e24386286f9668f72326dbf99ba094392437d398e95bb8161d717f8991",
|
|
||||||
"5595e05c13a7ec4dc8f41fb70cb50a71bce17c024ff6de7af618d0cc4e9c32d9570d6d3ea45b86525491030c0d8f2b1836d5778c1ce735c17707df364d054347",
|
|
||||||
"ce0f4f6aca89590a37fe034dd74dd5fa65eb1cbd0a41508aaddc09351a3cea6d18cb2189c54b700c009f4cbf0521c7ea01be61c5ae09cb54f27bc1b44d658c82",
|
|
||||||
"7ee80b06a215a3bca970c77cda8761822bc103d44fa4b33f4d07dcb997e36d55298bceae12241b3fa07fa63be5576068da387b8d5859aeab701369848b176d42",
|
|
||||||
"940a84b6a84d109aab208c024c6ce9647676ba0aaa11f86dbb7018f9fd2220a6d901a9027f9abcf935372727cbf09ebd61a2a2eeb87653e8ecad1bab85dc8327",
|
|
||||||
"2020b78264a82d9f4151141adba8d44bf20c5ec062eee9b595a11f9e84901bf148f298e0c9f8777dcdbc7cc4670aac356cc2ad8ccb1629f16f6a76bcefbee760",
|
|
||||||
"d1b897b0e075ba68ab572adf9d9c436663e43eb3d8e62d92fc49c9be214e6f27873fe215a65170e6bea902408a25b49506f47babd07cecf7113ec10c5dd31252",
|
|
||||||
"b14d0c62abfa469a357177e594c10c194243ed2025ab8aa5ad2fa41ad318e0ff48cd5e60bec07b13634a711d2326e488a985f31e31153399e73088efc86a5c55",
|
|
||||||
"4169c5cc808d2697dc2a82430dc23e3cd356dc70a94566810502b8d655b39abf9e7f902fe717e0389219859e1945df1af6ada42e4ccda55a197b7100a30c30a1",
|
|
||||||
"258a4edb113d66c839c8b1c91f15f35ade609f11cd7f8681a4045b9fef7b0b24c82cda06a5f2067b368825e3914e53d6948ede92efd6e8387fa2e537239b5bee",
|
|
||||||
"79d2d8696d30f30fb34657761171a11e6c3f1e64cbe7bebee159cb95bfaf812b4f411e2f26d9c421dc2c284a3342d823ec293849e42d1e46b0a4ac1e3c86abaa",
|
|
||||||
"8b9436010dc5dee992ae38aea97f2cd63b946d94fedd2ec9671dcde3bd4ce9564d555c66c15bb2b900df72edb6b891ebcadfeff63c9ea4036a998be7973981e7",
|
|
||||||
"c8f68e696ed28242bf997f5b3b34959508e42d613810f1e2a435c96ed2ff560c7022f361a9234b9837feee90bf47922ee0fd5f8ddf823718d86d1e16c6090071",
|
|
||||||
"b02d3eee4860d5868b2c39ce39bfe81011290564dd678c85e8783f29302dfc1399ba95b6b53cd9ebbf400cca1db0ab67e19a325f2d115812d25d00978ad1bca4",
|
|
||||||
"7693ea73af3ac4dad21ca0d8da85b3118a7d1c6024cfaf557699868217bc0c2f44a199bc6c0edd519798ba05bd5b1b4484346a47c2cadf6bf30b785cc88b2baf",
|
|
||||||
"a0e5c1c0031c02e48b7f09a5e896ee9aef2f17fc9e18e997d7f6cac7ae316422c2b1e77984e5f3a73cb45deed5d3f84600105e6ee38f2d090c7d0442ea34c46d",
|
|
||||||
"41daa6adcfdb69f1440c37b596440165c15ada596813e2e22f060fcd551f24dee8e04ba6890387886ceec4a7a0d7fc6b44506392ec3822c0d8c1acfc7d5aebe8",
|
|
||||||
"14d4d40d5984d84c5cf7523b7798b254e275a3a8cc0a1bd06ebc0bee726856acc3cbf516ff667cda2058ad5c3412254460a82c92187041363cc77a4dc215e487",
|
|
||||||
"d0e7a1e2b9a447fee83e2277e9ff8010c2f375ae12fa7aaa8ca5a6317868a26a367a0b69fbc1cf32a55d34eb370663016f3d2110230eba754028a56f54acf57c",
|
|
||||||
"e771aa8db5a3e043e8178f39a0857ba04a3f18e4aa05743cf8d222b0b095825350ba422f63382a23d92e4149074e816a36c1cd28284d146267940b31f8818ea2",
|
|
||||||
"feb4fd6f9e87a56bef398b3284d2bda5b5b0e166583a66b61e538457ff0584872c21a32962b9928ffab58de4af2edd4e15d8b35570523207ff4e2a5aa7754caa",
|
|
||||||
"462f17bf005fb1c1b9e671779f665209ec2873e3e411f98dabf240a1d5ec3f95ce6796b6fc23fe171903b502023467dec7273ff74879b92967a2a43a5a183d33",
|
|
||||||
"d3338193b64553dbd38d144bea71c5915bb110e2d88180dbc5db364fd6171df317fc7268831b5aef75e4342b2fad8797ba39eddcef80e6ec08159350b1ad696d",
|
|
||||||
"e1590d585a3d39f7cb599abd479070966409a6846d4377acf4471d065d5db94129cc9be92573b05ed226be1e9b7cb0cabe87918589f80dadd4ef5ef25a93d28e",
|
|
||||||
"f8f3726ac5a26cc80132493a6fedcb0e60760c09cfc84cad178175986819665e76842d7b9fedf76dddebf5d3f56faaad4477587af21606d396ae570d8e719af2",
|
|
||||||
"30186055c07949948183c850e9a756cc09937e247d9d928e869e20bafc3cd9721719d34e04a0899b92c736084550186886efba2e790d8be6ebf040b209c439a4",
|
|
||||||
"f3c4276cb863637712c241c444c5cc1e3554e0fddb174d035819dd83eb700b4ce88df3ab3841ba02085e1a99b4e17310c5341075c0458ba376c95a6818fbb3e2",
|
|
||||||
"0aa007c4dd9d5832393040a1583c930bca7dc5e77ea53add7e2b3f7c8e231368043520d4a3ef53c969b6bbfd025946f632bd7f765d53c21003b8f983f75e2a6a",
|
|
||||||
"08e9464720533b23a04ec24f7ae8c103145f765387d738777d3d343477fd1c58db052142cab754ea674378e18766c53542f71970171cc4f81694246b717d7564",
|
|
||||||
"d37ff7ad297993e7ec21e0f1b4b5ae719cdc83c5db687527f27516cbffa822888a6810ee5c1ca7bfe3321119be1ab7bfa0a502671c8329494df7ad6f522d440f",
|
|
||||||
"dd9042f6e464dcf86b1262f6accfafbd8cfd902ed3ed89abf78ffa482dbdeeb6969842394c9a1168ae3d481a017842f660002d42447c6b22f7b72f21aae021c9",
|
|
||||||
"bd965bf31e87d70327536f2a341cebc4768eca275fa05ef98f7f1b71a0351298de006fba73fe6733ed01d75801b4a928e54231b38e38c562b2e33ea1284992fa",
|
|
||||||
"65676d800617972fbd87e4b9514e1c67402b7a331096d3bfac22f1abb95374abc942f16e9ab0ead33b87c91968a6e509e119ff07787b3ef483e1dcdccf6e3022",
|
|
||||||
"939fa189699c5d2c81ddd1ffc1fa207c970b6a3685bb29ce1d3e99d42f2f7442da53e95a72907314f4588399a3ff5b0a92beb3f6be2694f9f86ecf2952d5b41c",
|
|
||||||
"c516541701863f91005f314108ceece3c643e04fc8c42fd2ff556220e616aaa6a48aeb97a84bad74782e8dff96a1a2fa949339d722edcaa32b57067041df88cc",
|
|
||||||
"987fd6e0d6857c553eaebb3d34970a2c2f6e89a3548f492521722b80a1c21a153892346d2cba6444212d56da9a26e324dccbc0dcde85d4d2ee4399eec5a64e8f",
|
|
||||||
"ae56deb1c2328d9c4017706bce6e99d41349053ba9d336d677c4c27d9fd50ae6aee17e853154e1f4fe7672346da2eaa31eea53fcf24a22804f11d03da6abfc2b",
|
|
||||||
"49d6a608c9bde4491870498572ac31aac3fa40938b38a7818f72383eb040ad39532bc06571e13d767e6945ab77c0bdc3b0284253343f9f6c1244ebf2ff0df866",
|
|
||||||
"da582ad8c5370b4469af862aa6467a2293b2b28bd80ae0e91f425ad3d47249fdf98825cc86f14028c3308c9804c78bfeeeee461444ce243687e1a50522456a1d",
|
|
||||||
"d5266aa3331194aef852eed86d7b5b2633a0af1c735906f2e13279f14931a9fc3b0eac5ce9245273bd1aa92905abe16278ef7efd47694789a7283b77da3c70f8",
|
|
||||||
"2962734c28252186a9a1111c732ad4de4506d4b4480916303eb7991d659ccda07a9911914bc75c418ab7a4541757ad054796e26797feaf36e9f6ad43f14b35a4",
|
|
||||||
"e8b79ec5d06e111bdfafd71e9f5760f00ac8ac5d8bf768f9ff6f08b8f026096b1cc3a4c973333019f1e3553e77da3f98cb9f542e0a90e5f8a940cc58e59844b3",
|
|
||||||
"dfb320c44f9d41d1efdcc015f08dd5539e526e39c87d509ae6812a969e5431bf4fa7d91ffd03b981e0d544cf72d7b1c0374f8801482e6dea2ef903877eba675e",
|
|
||||||
"d88675118fdb55a5fb365ac2af1d217bf526ce1ee9c94b2f0090b2c58a06ca58187d7fe57c7bed9d26fca067b4110eefcd9a0a345de872abe20de368001b0745",
|
|
||||||
"b893f2fc41f7b0dd6e2f6aa2e0370c0cff7df09e3acfcc0e920b6e6fad0ef747c40668417d342b80d2351e8c175f20897a062e9765e6c67b539b6ba8b9170545",
|
|
||||||
"6c67ec5697accd235c59b486d7b70baeedcbd4aa64ebd4eef3c7eac189561a726250aec4d48cadcafbbe2ce3c16ce2d691a8cce06e8879556d4483ed7165c063",
|
|
||||||
"f1aa2b044f8f0c638a3f362e677b5d891d6fd2ab0765f6ee1e4987de057ead357883d9b405b9d609eea1b869d97fb16d9b51017c553f3b93c0a1e0f1296fedcd",
|
|
||||||
"cbaa259572d4aebfc1917acddc582b9f8dfaa928a198ca7acd0f2aa76a134a90252e6298a65b08186a350d5b7626699f8cb721a3ea5921b753ae3a2dce24ba3a",
|
|
||||||
"fa1549c9796cd4d303dcf452c1fbd5744fd9b9b47003d920b92de34839d07ef2a29ded68f6fc9e6c45e071a2e48bd50c5084e96b657dd0404045a1ddefe282ed",
|
|
||||||
"5cf2ac897ab444dcb5c8d87c495dbdb34e1838b6b629427caa51702ad0f9688525f13bec503a3c3a2c80a65e0b5715e8afab00ffa56ec455a49a1ad30aa24fcd",
|
|
||||||
"9aaf80207bace17bb7ab145757d5696bde32406ef22b44292ef65d4519c3bb2ad41a59b62cc3e94b6fa96d32a7faadae28af7d35097219aa3fd8cda31e40c275",
|
|
||||||
"af88b163402c86745cb650c2988fb95211b94b03ef290eed9662034241fd51cf398f8073e369354c43eae1052f9b63b08191caa138aa54fea889cc7024236897",
|
|
||||||
"48fa7d64e1ceee27b9864db5ada4b53d00c9bc7626555813d3cd6730ab3cc06ff342d727905e33171bde6e8476e77fb1720861e94b73a2c538d254746285f430",
|
|
||||||
"0e6fd97a85e904f87bfe85bbeb34f69e1f18105cf4ed4f87aec36c6e8b5f68bd2a6f3dc8a9ecb2b61db4eedb6b2ea10bf9cb0251fb0f8b344abf7f366b6de5ab",
|
|
||||||
"06622da5787176287fdc8fed440bad187d830099c94e6d04c8e9c954cda70c8bb9e1fc4a6d0baa831b9b78ef6648681a4867a11da93ee36e5e6a37d87fc63f6f",
|
|
||||||
"1da6772b58fabf9c61f68d412c82f182c0236d7d575ef0b58dd22458d643cd1dfc93b03871c316d8430d312995d4197f0874c99172ba004a01ee295abac24e46",
|
|
||||||
"3cd2d9320b7b1d5fb9aab951a76023fa667be14a9124e394513918a3f44096ae4904ba0ffc150b63bc7ab1eeb9a6e257e5c8f000a70394a5afd842715de15f29",
|
|
||||||
"04cdc14f7434e0b4be70cb41db4c779a88eaef6accebcb41f2d42fffe7f32a8e281b5c103a27021d0d08362250753cdf70292195a53a48728ceb5844c2d98bab",
|
|
||||||
"9071b7a8a075d0095b8fb3ae5113785735ab98e2b52faf91d5b89e44aac5b5d4ebbf91223b0ff4c71905da55342e64655d6ef8c89a4768c3f93a6dc0366b5bc8",
|
|
||||||
"ebb30240dd96c7bc8d0abe49aa4edcbb4afdc51ff9aaf720d3f9e7fbb0f9c6d6571350501769fc4ebd0b2141247ff400d4fd4be414edf37757bb90a32ac5c65a",
|
|
||||||
"8532c58bf3c8015d9d1cbe00eef1f5082f8f3632fbe9f1ed4f9dfb1fa79e8283066d77c44c4af943d76b300364aecbd0648c8a8939bd204123f4b56260422dec",
|
|
||||||
"fe9846d64f7c7708696f840e2d76cb4408b6595c2f81ec6a28a7f2f20cb88cfe6ac0b9e9b8244f08bd7095c350c1d0842f64fb01bb7f532dfcd47371b0aeeb79",
|
|
||||||
"28f17ea6fb6c42092dc264257e29746321fb5bdaea9873c2a7fa9d8f53818e899e161bc77dfe8090afd82bf2266c5c1bc930a8d1547624439e662ef695f26f24",
|
|
||||||
"ec6b7d7f030d4850acae3cb615c21dd25206d63e84d1db8d957370737ba0e98467ea0ce274c66199901eaec18a08525715f53bfdb0aacb613d342ebdceeddc3b",
|
|
||||||
"b403d3691c03b0d3418df327d5860d34bbfcc4519bfbce36bf33b208385fadb9186bc78a76c489d89fd57e7dc75412d23bcd1dae8470ce9274754bb8585b13c5",
|
|
||||||
"31fc79738b8772b3f55cd8178813b3b52d0db5a419d30ba9495c4b9da0219fac6df8e7c23a811551a62b827f256ecdb8124ac8a6792ccfecc3b3012722e94463",
|
|
||||||
"bb2039ec287091bcc9642fc90049e73732e02e577e2862b32216ae9bedcd730c4c284ef3968c368b7d37584f97bd4b4dc6ef6127acfe2e6ae2509124e66c8af4",
|
|
||||||
"f53d68d13f45edfcb9bd415e2831e938350d5380d3432278fc1c0c381fcb7c65c82dafe051d8c8b0d44e0974a0e59ec7bf7ed0459f86e96f329fc79752510fd3",
|
|
||||||
"8d568c7984f0ecdf7640fbc483b5d8c9f86634f6f43291841b309a350ab9c1137d24066b09da9944bac54d5bb6580d836047aac74ab724b887ebf93d4b32eca9",
|
|
||||||
"c0b65ce5a96ff774c456cac3b5f2c4cd359b4ff53ef93a3da0778be4900d1e8da1601e769e8f1b02d2a2f8c5b9fa10b44f1c186985468feeb008730283a6657d",
|
|
||||||
"4900bba6f5fb103ece8ec96ada13a5c3c85488e05551da6b6b33d988e611ec0fe2e3c2aa48ea6ae8986a3a231b223c5d27cec2eadde91ce07981ee652862d1e4",
|
|
||||||
"c7f5c37c7285f927f76443414d4357ff789647d7a005a5a787e03c346b57f49f21b64fa9cf4b7e45573e23049017567121a9c3d4b2b73ec5e9413577525db45a",
|
|
||||||
"ec7096330736fdb2d64b5653e7475da746c23a4613a82687a28062d3236364284ac01720ffb406cfe265c0df626a188c9e5963ace5d3d5bb363e32c38c2190a6",
|
|
||||||
"82e744c75f4649ec52b80771a77d475a3bc091989556960e276a5f9ead92a03f718742cdcfeaee5cb85c44af198adc43a4a428f5f0c2ddb0be36059f06d7df73",
|
|
||||||
"2834b7a7170f1f5b68559ab78c1050ec21c919740b784a9072f6e5d69f828d70c919c5039fb148e39e2c8a52118378b064ca8d5001cd10a5478387b966715ed6",
|
|
||||||
"16b4ada883f72f853bb7ef253efcab0c3e2161687ad61543a0d2824f91c1f81347d86be709b16996e17f2dd486927b0288ad38d13063c4a9672c39397d3789b6",
|
|
||||||
"78d048f3a69d8b54ae0ed63a573ae350d89f7c6cf1f3688930de899afa037697629b314e5cd303aa62feea72a25bf42b304b6c6bcb27fae21c16d925e1fbdac3",
|
|
||||||
"0f746a48749287ada77a82961f05a4da4abdb7d77b1220f836d09ec814359c0ec0239b8c7b9ff9e02f569d1b301ef67c4612d1de4f730f81c12c40cc063c5caa",
|
|
||||||
"f0fc859d3bd195fbdc2d591e4cdac15179ec0f1dc821c11df1f0c1d26e6260aaa65b79fafacafd7d3ad61e600f250905f5878c87452897647a35b995bcadc3a3",
|
|
||||||
"2620f687e8625f6a412460b42e2cef67634208ce10a0cbd4dff7044a41b7880077e9f8dc3b8d1216d3376a21e015b58fb279b521d83f9388c7382c8505590b9b",
|
|
||||||
"227e3aed8d2cb10b918fcb04f9de3e6d0a57e08476d93759cd7b2ed54a1cbf0239c528fb04bbf288253e601d3bc38b21794afef90b17094a182cac557745e75f",
|
|
||||||
"1a929901b09c25f27d6b35be7b2f1c4745131fdebca7f3e2451926720434e0db6e74fd693ad29b777dc3355c592a361c4873b01133a57c2e3b7075cbdb86f4fc",
|
|
||||||
"5fd7968bc2fe34f220b5e3dc5af9571742d73b7d60819f2888b629072b96a9d8ab2d91b82d0a9aaba61bbd39958132fcc4257023d1eca591b3054e2dc81c8200",
|
|
||||||
"dfcce8cf32870cc6a503eadafc87fd6f78918b9b4d0737db6810be996b5497e7e5cc80e312f61e71ff3e9624436073156403f735f56b0b01845c18f6caf772e6",
|
|
||||||
"02f7ef3a9ce0fff960f67032b296efca3061f4934d690749f2d01c35c81c14f39a67fa350bc8a0359bf1724bffc3bca6d7c7bba4791fd522a3ad353c02ec5aa8",
|
|
||||||
"64be5c6aba65d594844ae78bb022e5bebe127fd6b6ffa5a13703855ab63b624dcd1a363f99203f632ec386f3ea767fc992e8ed9686586aa27555a8599d5b808f",
|
|
||||||
"f78585505c4eaa54a8b5be70a61e735e0ff97af944ddb3001e35d86c4e2199d976104b6ae31750a36a726ed285064f5981b503889fef822fcdc2898dddb7889a",
|
|
||||||
"e4b5566033869572edfd87479a5bb73c80e8759b91232879d96b1dda36c012076ee5a2ed7ae2de63ef8406a06aea82c188031b560beafb583fb3de9e57952a7e",
|
|
||||||
"e1b3e7ed867f6c9484a2a97f7715f25e25294e992e41f6a7c161ffc2adc6daaeb7113102d5e6090287fe6ad94ce5d6b739c6ca240b05c76fb73f25dd024bf935",
|
|
||||||
"85fd085fdc12a080983df07bd7012b0d402a0f4043fcb2775adf0bad174f9b08d1676e476985785c0a5dcc41dbff6d95ef4d66a3fbdc4a74b82ba52da0512b74",
|
|
||||||
"aed8fa764b0fbff821e05233d2f7b0900ec44d826f95e93c343c1bc3ba5a24374b1d616e7e7aba453a0ada5e4fab5382409e0d42ce9c2bc7fb39a99c340c20f0",
|
|
||||||
"7ba3b2e297233522eeb343bd3ebcfd835a04007735e87f0ca300cbee6d416565162171581e4020ff4cf176450f1291ea2285cb9ebffe4c56660627685145051c",
|
|
||||||
"de748bcf89ec88084721e16b85f30adb1a6134d664b5843569babc5bbd1a15ca9b61803c901a4fef32965a1749c9f3a4e243e173939dc5a8dc495c671ab52145",
|
|
||||||
"aaf4d2bdf200a919706d9842dce16c98140d34bc433df320aba9bd429e549aa7a3397652a4d768277786cf993cde2338673ed2e6b66c961fefb82cd20c93338f",
|
|
||||||
"c408218968b788bf864f0997e6bc4c3dba68b276e2125a4843296052ff93bf5767b8cdce7131f0876430c1165fec6c4f47adaa4fd8bcfacef463b5d3d0fa61a0",
|
|
||||||
"76d2d819c92bce55fa8e092ab1bf9b9eab237a25267986cacf2b8ee14d214d730dc9a5aa2d7b596e86a1fd8fa0804c77402d2fcd45083688b218b1cdfa0dcbcb",
|
|
||||||
"72065ee4dd91c2d8509fa1fc28a37c7fc9fa7d5b3f8ad3d0d7a25626b57b1b44788d4caf806290425f9890a3a2a35a905ab4b37acfd0da6e4517b2525c9651e4",
|
|
||||||
"64475dfe7600d7171bea0b394e27c9b00d8e74dd1e416a79473682ad3dfdbb706631558055cfc8a40e07bd015a4540dcdea15883cbbf31412df1de1cd4152b91",
|
|
||||||
"12cd1674a4488a5d7c2b3160d2e2c4b58371bedad793418d6f19c6ee385d70b3e06739369d4df910edb0b0a54cbff43d54544cd37ab3a06cfa0a3ddac8b66c89",
|
|
||||||
"60756966479dedc6dd4bcff8ea7d1d4ce4d4af2e7b097e32e3763518441147cc12b3c0ee6d2ecabf1198cec92e86a3616fba4f4e872f5825330adbb4c1dee444",
|
|
||||||
"a7803bcb71bc1d0f4383dde1e0612e04f872b715ad30815c2249cf34abb8b024915cb2fc9f4e7cc4c8cfd45be2d5a91eab0941c7d270e2da4ca4a9f7ac68663a",
|
|
||||||
"b84ef6a7229a34a750d9a98ee2529871816b87fbe3bc45b45fa5ae82d5141540211165c3c5d7a7476ba5a4aa06d66476f0d9dc49a3f1ee72c3acabd498967414",
|
|
||||||
"fae4b6d8efc3f8c8e64d001dabec3a21f544e82714745251b2b4b393f2f43e0da3d403c64db95a2cb6e23ebb7b9e94cdd5ddac54f07c4a61bd3cb10aa6f93b49",
|
|
||||||
"34f7286605a122369540141ded79b8957255da2d4155abbf5a8dbb89c8eb7ede8eeef1daa46dc29d751d045dc3b1d658bb64b80ff8589eddb3824b13da235a6b",
|
|
||||||
"3b3b48434be27b9eababba43bf6b35f14b30f6a88dc2e750c358470d6b3aa3c18e47db4017fa55106d8252f016371a00f5f8b070b74ba5f23cffc5511c9f09f0",
|
|
||||||
"ba289ebd6562c48c3e10a8ad6ce02e73433d1e93d7c9279d4d60a7e879ee11f441a000f48ed9f7c4ed87a45136d7dccdca482109c78a51062b3ba4044ada2469",
|
|
||||||
"022939e2386c5a37049856c850a2bb10a13dfea4212b4c732a8840a9ffa5faf54875c5448816b2785a007da8a8d2bc7d71a54e4e6571f10b600cbdb25d13ede3",
|
|
||||||
"e6fec19d89ce8717b1a087024670fe026f6c7cbda11caef959bb2d351bf856f8055d1c0ebdaaa9d1b17886fc2c562b5e99642fc064710c0d3488a02b5ed7f6fd",
|
|
||||||
"94c96f02a8f576aca32ba61c2b206f907285d9299b83ac175c209a8d43d53bfe683dd1d83e7549cb906c28f59ab7c46f8751366a28c39dd5fe2693c9019666c8",
|
|
||||||
"31a0cd215ebd2cb61de5b9edc91e6195e31c59a5648d5c9f737e125b2605708f2e325ab3381c8dce1a3e958886f1ecdc60318f882cfe20a24191352e617b0f21",
|
|
||||||
"91ab504a522dce78779f4c6c6ba2e6b6db5565c76d3e7e7c920caf7f757ef9db7c8fcf10e57f03379ea9bf75eb59895d96e149800b6aae01db778bb90afbc989",
|
|
||||||
"d85cabc6bd5b1a01a5afd8c6734740da9fd1c1acc6db29bfc8a2e5b668b028b6b3154bfb8703fa3180251d589ad38040ceb707c4bad1b5343cb426b61eaa49c1",
|
|
||||||
"d62efbec2ca9c1f8bd66ce8b3f6a898cb3f7566ba6568c618ad1feb2b65b76c3ce1dd20f7395372faf28427f61c9278049cf0140df434f5633048c86b81e0399",
|
|
||||||
"7c8fdc6175439e2c3db15bafa7fb06143a6a23bc90f449e79deef73c3d492a671715c193b6fea9f036050b946069856b897e08c00768f5ee5ddcf70b7cd6d0e0",
|
|
||||||
"58602ee7468e6bc9df21bd51b23c005f72d6cb013f0a1b48cbec5eca299299f97f09f54a9a01483eaeb315a6478bad37ba47ca1347c7c8fc9e6695592c91d723",
|
|
||||||
"27f5b79ed256b050993d793496edf4807c1d85a7b0a67c9c4fa99860750b0ae66989670a8ffd7856d7ce411599e58c4d77b232a62bef64d15275be46a68235ff",
|
|
||||||
"3957a976b9f1887bf004a8dca942c92d2b37ea52600f25e0c9bc5707d0279c00c6e85a839b0d2d8eb59c51d94788ebe62474a791cadf52cccf20f5070b6573fc",
|
|
||||||
"eaa2376d55380bf772ecca9cb0aa4668c95c707162fa86d518c8ce0ca9bf7362b9f2a0adc3ff59922df921b94567e81e452f6c1a07fc817cebe99604b3505d38",
|
|
||||||
"c1e2c78b6b2734e2480ec550434cb5d613111adcc21d475545c3b1b7e6ff12444476e5c055132e2229dc0f807044bb919b1a5662dd38a9ee65e243a3911aed1a",
|
|
||||||
"8ab48713389dd0fcf9f965d3ce66b1e559a1f8c58741d67683cd971354f452e62d0207a65e436c5d5d8f8ee71c6abfe50e669004c302b31a7ea8311d4a916051",
|
|
||||||
"24ce0addaa4c65038bd1b1c0f1452a0b128777aabc94a29df2fd6c7e2f85f8ab9ac7eff516b0e0a825c84a24cfe492eaad0a6308e46dd42fe8333ab971bb30ca",
|
|
||||||
"5154f929ee03045b6b0c0004fa778edee1d139893267cc84825ad7b36c63de32798e4a166d24686561354f63b00709a1364b3c241de3febf0754045897467cd4",
|
|
||||||
"e74e907920fd87bd5ad636dd11085e50ee70459c443e1ce5809af2bc2eba39f9e6d7128e0e3712c316da06f4705d78a4838e28121d4344a2c79c5e0db307a677",
|
|
||||||
"bf91a22334bac20f3fd80663b3cd06c4e8802f30e6b59f90d3035cc9798a217ed5a31abbda7fa6842827bdf2a7a1c21f6fcfccbb54c6c52926f32da816269be1",
|
|
||||||
"d9d5c74be5121b0bd742f26bffb8c89f89171f3f934913492b0903c271bbe2b3395ef259669bef43b57f7fcc3027db01823f6baee66e4f9fead4d6726c741fce",
|
|
||||||
"50c8b8cf34cd879f80e2faab3230b0c0e1cc3e9dcadeb1b9d97ab923415dd9a1fe38addd5c11756c67990b256e95ad6d8f9fedce10bf1c90679cde0ecf1be347",
|
|
||||||
"0a386e7cd5dd9b77a035e09fe6fee2c8ce61b5383c87ea43205059c5e4cd4f4408319bb0a82360f6a58e6c9ce3f487c446063bf813bc6ba535e17fc1826cfc91",
|
|
||||||
"1f1459cb6b61cbac5f0efe8fc487538f42548987fcd56221cfa7beb22504769e792c45adfb1d6b3d60d7b749c8a75b0bdf14e8ea721b95dca538ca6e25711209",
|
|
||||||
"e58b3836b7d8fedbb50ca5725c6571e74c0785e97821dab8b6298c10e4c079d4a6cdf22f0fedb55032925c16748115f01a105e77e00cee3d07924dc0d8f90659",
|
|
||||||
"b929cc6505f020158672deda56d0db081a2ee34c00c1100029bdf8ea98034fa4bf3e8655ec697fe36f40553c5bb46801644a627d3342f4fc92b61f03290fb381",
|
|
||||||
"72d353994b49d3e03153929a1e4d4f188ee58ab9e72ee8e512f29bc773913819ce057ddd7002c0433ee0a16114e3d156dd2c4a7e80ee53378b8670f23e33ef56",
|
|
||||||
"c70ef9bfd775d408176737a0736d68517ce1aaad7e81a93c8c1ed967ea214f56c8a377b1763e676615b60f3988241eae6eab9685a5124929d28188f29eab06f7",
|
|
||||||
"c230f0802679cb33822ef8b3b21bf7a9a28942092901d7dac3760300831026cf354c9232df3e084d9903130c601f63c1f4a4a4b8106e468cd443bbe5a734f45f",
|
|
||||||
"6f43094cafb5ebf1f7a4937ec50f56a4c9da303cbb55ac1f27f1f1976cd96beda9464f0e7b9c54620b8a9fba983164b8be3578425a024f5fe199c36356b88972",
|
|
||||||
"3745273f4c38225db2337381871a0c6aafd3af9b018c88aa02025850a5dc3a42a1a3e03e56cbf1b0876d63a441f1d2856a39b8801eb5af325201c415d65e97fe",
|
|
||||||
"c50c44cca3ec3edaae779a7e179450ebdda2f97067c690aa6c5a4ac7c30139bb27c0df4db3220e63cb110d64f37ffe078db72653e2daacf93ae3f0a2d1a7eb2e",
|
|
||||||
"8aef263e385cbc61e19b28914243262af5afe8726af3ce39a79c27028cf3ecd3f8d2dfd9cfc9ad91b58f6f20778fd5f02894a3d91c7d57d1e4b866a7f364b6be",
|
|
||||||
"28696141de6e2d9bcb3235578a66166c1448d3e905a1b482d423be4bc5369bc8c74dae0acc9cc123e1d8ddce9f97917e8c019c552da32d39d2219b9abf0fa8c8",
|
|
||||||
"2fb9eb2085830181903a9dafe3db428ee15be7662224efd643371fb25646aee716e531eca69b2bdc8233f1a8081fa43da1500302975a77f42fa592136710e9dc",
|
|
||||||
"66f9a7143f7a3314a669bf2e24bbb35014261d639f495b6c9c1f104fe8e320aca60d4550d69d52edbd5a3cdeb4014ae65b1d87aa770b69ae5c15f4330b0b0ad8",
|
|
||||||
"f4c4dd1d594c3565e3e25ca43dad82f62abea4835ed4cd811bcd975e46279828d44d4c62c3679f1b7f7b9dd4571d7b49557347b8c5460cbdc1bef690fb2a08c0",
|
|
||||||
"8f1dc9649c3a84551f8f6e91cac68242a43b1f8f328ee92280257387fa7559aa6db12e4aeadc2d26099178749c6864b357f3f83b2fb3efa8d2a8db056bed6bcc",
|
|
||||||
"3139c1a7f97afd1675d460ebbc07f2728aa150df849624511ee04b743ba0a833092f18c12dc91b4dd243f333402f59fe28abdbbbae301e7b659c7a26d5c0f979",
|
|
||||||
"06f94a2996158a819fe34c40de3cf0379fd9fb85b3e363ba3926a0e7d960e3f4c2e0c70c7ce0ccb2a64fc29869f6e7ab12bd4d3f14fce943279027e785fb5c29",
|
|
||||||
"c29c399ef3eee8961e87565c1ce263925fc3d0ce267d13e48dd9e732ee67b0f69fad56401b0f10fcaac119201046cca28c5b14abdea3212ae65562f7f138db3d",
|
|
||||||
"4cec4c9df52eef05c3f6faaa9791bc7445937183224ecc37a1e58d0132d35617531d7e795f52af7b1eb9d147de1292d345fe341823f8e6bc1e5badca5c656108",
|
|
||||||
"898bfbae93b3e18d00697eab7d9704fa36ec339d076131cefdf30edbe8d9cc81c3a80b129659b163a323bab9793d4feed92d54dae966c77529764a09be88db45",
|
|
||||||
"ee9bd0469d3aaf4f14035be48a2c3b84d9b4b1fff1d945e1f1c1d38980a951be197b25fe22c731f20aeacc930ba9c4a1f4762227617ad350fdabb4e80273a0f4",
|
|
||||||
"3d4d3113300581cd96acbf091c3d0f3c310138cd6979e6026cde623e2dd1b24d4a8638bed1073344783ad0649cc6305ccec04beb49f31c633088a99b65130267",
|
|
||||||
"95c0591ad91f921ac7be6d9ce37e0663ed8011c1cfd6d0162a5572e94368bac02024485e6a39854aa46fe38e97d6c6b1947cd272d86b06bb5b2f78b9b68d559d",
|
|
||||||
"227b79ded368153bf46c0a3ca978bfdbef31f3024a5665842468490b0ff748ae04e7832ed4c9f49de9b1706709d623e5c8c15e3caecae8d5e433430ff72f20eb",
|
|
||||||
"5d34f3952f0105eef88ae8b64c6ce95ebfade0e02c69b08762a8712d2e4911ad3f941fc4034dc9b2e479fdbcd279b902faf5d838bb2e0c6495d372b5b7029813",
|
|
||||||
"7f939bf8353abce49e77f14f3750af20b7b03902e1a1e7fb6aaf76d0259cd401a83190f15640e74f3e6c5a90e839c7821f6474757f75c7bf9002084ddc7a62dc",
|
|
||||||
"062b61a2f9a33a71d7d0a06119644c70b0716a504de7e5e1be49bd7b86e7ed6817714f9f0fc313d06129597e9a2235ec8521de36f7290a90ccfc1ffa6d0aee29",
|
|
||||||
"f29e01eeae64311eb7f1c6422f946bf7bea36379523e7b2bbaba7d1d34a22d5ea5f1c5a09d5ce1fe682cced9a4798d1a05b46cd72dff5c1b355440b2a2d476bc",
|
|
||||||
"ec38cd3bbab3ef35d7cb6d5c914298351d8a9dc97fcee051a8a02f58e3ed6184d0b7810a5615411ab1b95209c3c810114fdeb22452084e77f3f847c6dbaafe16",
|
|
||||||
"c2aef5e0ca43e82641565b8cb943aa8ba53550caef793b6532fafad94b816082f0113a3ea2f63608ab40437ecc0f0229cb8fa224dcf1c478a67d9b64162b92d1",
|
|
||||||
"15f534efff7105cd1c254d074e27d5898b89313b7d366dc2d7d87113fa7d53aae13f6dba487ad8103d5e854c91fdb6e1e74b2ef6d1431769c30767dde067a35c",
|
|
||||||
"89acbca0b169897a0a2714c2df8c95b5b79cb69390142b7d6018bb3e3076b099b79a964152a9d912b1b86412b7e372e9cecad7f25d4cbab8a317be36492a67d7",
|
|
||||||
"e3c0739190ed849c9c962fd9dbb55e207e624fcac1eb417691515499eea8d8267b7e8f1287a63633af5011fde8c4ddf55bfdf722edf88831414f2cfaed59cb9a",
|
|
||||||
"8d6cf87c08380d2d1506eee46fd4222d21d8c04e585fbfd08269c98f702833a156326a0724656400ee09351d57b440175e2a5de93cc5f80db6daf83576cf75fa",
|
|
||||||
"da24bede383666d563eeed37f6319baf20d5c75d1635a6ba5ef4cfa1ac95487e96f8c08af600aab87c986ebad49fc70a58b4890b9c876e091016daf49e1d322e",
|
|
||||||
"f9d1d1b1e87ea7ae753a029750cc1cf3d0157d41805e245c5617bb934e732f0ae3180b78e05bfe76c7c3051e3e3ac78b9b50c05142657e1e03215d6ec7bfd0fc",
|
|
||||||
"11b7bc1668032048aa43343de476395e814bbbc223678db951a1b03a021efac948cfbe215f97fe9a72a2f6bc039e3956bfa417c1a9f10d6d7ba5d3d32ff323e5",
|
|
||||||
"b8d9000e4fc2b066edb91afee8e7eb0f24e3a201db8b6793c0608581e628ed0bcc4e5aa6787992a4bcc44e288093e63ee83abd0bc3ec6d0934a674a4da13838a",
|
|
||||||
"ce325e294f9b6719d6b61278276ae06a2564c03bb0b783fafe785bdf89c7d5acd83e78756d301b445699024eaeb77b54d477336ec2a4f332f2b3f88765ddb0c3",
|
|
||||||
"29acc30e9603ae2fccf90bf97e6cc463ebe28c1b2f9b4b765e70537c25c702a29dcbfbf14c99c54345ba2b51f17b77b5f15db92bbad8fa95c471f5d070a137cc",
|
|
||||||
"3379cbaae562a87b4c0425550ffdd6bfe1203f0d666cc7ea095be407a5dfe61ee91441cd5154b3e53b4f5fb31ad4c7a9ad5c7af4ae679aa51a54003a54ca6b2d",
|
|
||||||
"3095a349d245708c7cf550118703d7302c27b60af5d4e67fc978f8a4e60953c7a04f92fcf41aee64321ccb707a895851552b1e37b00bc5e6b72fa5bcef9e3fff",
|
|
||||||
"07262d738b09321f4dbccec4bb26f48cb0f0ed246ce0b31b9a6e7bc683049f1f3e5545f28ce932dd985c5ab0f43bd6de0770560af329065ed2e49d34624c2cbb",
|
|
||||||
"b6405eca8ee3316c87061cc6ec18dba53e6c250c63ba1f3bae9e55dd3498036af08cd272aa24d713c6020d77ab2f3919af1a32f307420618ab97e73953994fb4",
|
|
||||||
"7ee682f63148ee45f6e5315da81e5c6e557c2c34641fc509c7a5701088c38a74756168e2cd8d351e88fd1a451f360a01f5b2580f9b5a2e8cfc138f3dd59a3ffc",
|
|
||||||
"1d263c179d6b268f6fa016f3a4f29e943891125ed8593c81256059f5a7b44af2dcb2030d175c00e62ecaf7ee96682aa07ab20a611024a28532b1c25b86657902",
|
|
||||||
"106d132cbdb4cd2597812846e2bc1bf732fec5f0a5f65dbb39ec4e6dc64ab2ce6d24630d0f15a805c3540025d84afa98e36703c3dbee713e72dde8465bc1be7e",
|
|
||||||
"0e79968226650667a8d862ea8da4891af56a4e3a8b6d1750e394f0dea76d640d85077bcec2cc86886e506751b4f6a5838f7f0b5fef765d9dc90dcdcbaf079f08",
|
|
||||||
"521156a82ab0c4e566e5844d5e31ad9aaf144bbd5a464fdca34dbd5717e8ff711d3ffebbfa085d67fe996a34f6d3e4e60b1396bf4b1610c263bdbb834d560816",
|
|
||||||
"1aba88befc55bc25efbce02db8b9933e46f57661baeabeb21cc2574d2a518a3cba5dc5a38e49713440b25f9c744e75f6b85c9d8f4681f676160f6105357b8406",
|
|
||||||
"5a9949fcb2c473cda968ac1b5d08566dc2d816d960f57e63b898fa701cf8ebd3f59b124d95bfbbedc5f1cf0e17d5eaed0c02c50b69d8a402cabcca4433b51fd4",
|
|
||||||
"b0cead09807c672af2eb2b0f06dde46cf5370e15a4096b1a7d7cbb36ec31c205fbefca00b7a4162fa89fb4fb3eb78d79770c23f44e7206664ce3cd931c291e5d",
|
|
||||||
"bb6664931ec97044e45b2ae420ae1c551a8874bc937d08e969399c3964ebdba8346cdd5d09caafe4c28ba7ec788191ceca65ddd6f95f18583e040d0f30d0364d",
|
|
||||||
"65bc770a5faa3792369803683e844b0be7ee96f29f6d6a35568006bd5590f9a4ef639b7a8061c7b0424b66b60ac34af3119905f33a9d8c3ae18382ca9b689900",
|
|
||||||
"ea9b4dca333336aaf839a45c6eaa48b8cb4c7ddabffea4f643d6357ea6628a480a5b45f2b052c1b07d1fedca918b6f1139d80f74c24510dcbaa4be70eacc1b06",
|
|
||||||
"e6342fb4a780ad975d0e24bce149989b91d360557e87994f6b457b895575cc02d0c15bad3ce7577f4c63927ff13f3e381ff7e72bdbe745324844a9d27e3f1c01",
|
|
||||||
"3e209c9b33e8e461178ab46b1c64b49a07fb745f1c8bc95fbfb94c6b87c69516651b264ef980937fad41238b91ddc011a5dd777c7efd4494b4b6ecd3a9c22ac0",
|
|
||||||
"fd6a3d5b1875d80486d6e69694a56dbb04a99a4d051f15db2689776ba1c4882e6d462a603b7015dc9f4b7450f05394303b8652cfb404a266962c41bae6e18a94",
|
|
||||||
"951e27517e6bad9e4195fc8671dee3e7e9be69cee1422cb9fecfce0dba875f7b310b93ee3a3d558f941f635f668ff832d2c1d033c5e2f0997e4c66f147344e02",
|
|
||||||
"8eba2f874f1ae84041903c7c4253c82292530fc8509550bfdc34c95c7e2889d5650b0ad8cb988e5c4894cb87fbfbb19612ea93ccc4c5cad17158b9763464b492",
|
|
||||||
"16f712eaa1b7c6354719a8e7dbdfaf55e4063a4d277d947550019b38dfb564830911057d50506136e2394c3b28945cc964967d54e3000c2181626cfb9b73efd2",
|
|
||||||
"c39639e7d5c7fb8cdd0fd3e6a52096039437122f21c78f1679cea9d78a734c56ecbeb28654b4f18e342c331f6f7229ec4b4bc281b2d80a6eb50043f31796c88c",
|
|
||||||
"72d081af99f8a173dcc9a0ac4eb3557405639a29084b54a40172912a2f8a395129d5536f0918e902f9e8fa6000995f4168ddc5f893011be6a0dbc9b8a1a3f5bb",
|
|
||||||
"c11aa81e5efd24d5fc27ee586cfd8847fbb0e27601ccece5ecca0198e3c7765393bb74457c7e7a27eb9170350e1fb53857177506be3e762cc0f14d8c3afe9077",
|
|
||||||
"c28f2150b452e6c0c424bcde6f8d72007f9310fed7f2f87de0dbb64f4479d6c1441ba66f44b2accee61609177ed340128b407ecec7c64bbe50d63d22d8627727",
|
|
||||||
"f63d88122877ec30b8c8b00d22e89000a966426112bd44166e2f525b769ccbe9b286d437a0129130dde1a86c43e04bedb594e671d98283afe64ce331de9828fd",
|
|
||||||
"348b0532880b88a6614a8d7408c3f913357fbb60e995c60205be9139e74998aede7f4581e42f6b52698f7fa1219708c14498067fd1e09502de83a77dd281150c",
|
|
||||||
"5133dc8bef725359dff59792d85eaf75b7e1dcd1978b01c35b1b85fcebc63388ad99a17b6346a217dc1a9622ebd122ecf6913c4d31a6b52a695b86af00d741a0",
|
|
||||||
"2753c4c0e98ecad806e88780ec27fccd0f5c1ab547f9e4bf1659d192c23aa2cc971b58b6802580baef8adc3b776ef7086b2545c2987f348ee3719cdef258c403",
|
|
||||||
"b1663573ce4b9d8caefc865012f3e39714b9898a5da6ce17c25a6a47931a9ddb9bbe98adaa553beed436e89578455416c2a52a525cf2862b8d1d49a2531b7391",
|
|
||||||
"64f58bd6bfc856f5e873b2a2956ea0eda0d6db0da39c8c7fc67c9f9feefcff3072cdf9e6ea37f69a44f0c61aa0da3693c2db5b54960c0281a088151db42b11e8",
|
|
||||||
"0764c7be28125d9065c4b98a69d60aede703547c66a12e17e1c618994132f5ef82482c1e3fe3146cc65376cc109f0138ed9a80e49f1f3c7d610d2f2432f20605",
|
|
||||||
"f748784398a2ff03ebeb07e155e66116a839741a336e32da71ec696001f0ad1b25cd48c69cfca7265eca1dd71904a0ce748ac4124f3571076dfa7116a9cf00e9",
|
|
||||||
"3f0dbc0186bceb6b785ba78d2a2a013c910be157bdaffae81bb6663b1a73722f7f1228795f3ecada87cf6ef0078474af73f31eca0cc200ed975b6893f761cb6d",
|
|
||||||
"d4762cd4599876ca75b2b8fe249944dbd27ace741fdab93616cbc6e425460feb51d4e7adcc38180e7fc47c89024a7f56191adb878dfde4ead62223f5a2610efe",
|
|
||||||
"cd36b3d5b4c91b90fcbba79513cfee1907d8645a162afd0cd4cf4192d4a5f4c892183a8eacdb2b6b6a9d9aa8c11ac1b261b380dbee24ca468f1bfd043c58eefe",
|
|
||||||
"98593452281661a53c48a9d8cd790826c1a1ce567738053d0bee4a91a3d5bd92eefdbabebe3204f2031ca5f781bda99ef5d8ae56e5b04a9e1ecd21b0eb05d3e1",
|
|
||||||
"771f57dd2775ccdab55921d3e8e30ccf484d61fe1c1b9c2ae819d0fb2a12fab9be70c4a7a138da84e8280435daade5bbe66af0836a154f817fb17f3397e725a3",
|
|
||||||
"c60897c6f828e21f16fbb5f15b323f87b6c8955eabf1d38061f707f608abdd993fac3070633e286cf8339ce295dd352df4b4b40b2f29da1dd50b3a05d079e6bb",
|
|
||||||
"8210cd2c2d3b135c2cf07fa0d1433cd771f325d075c6469d9c7f1ba0943cd4ab09808cabf4acb9ce5bb88b498929b4b847f681ad2c490d042db2aec94214b06b",
|
|
||||||
"1d4edfffd8fd80f7e4107840fa3aa31e32598491e4af7013c197a65b7f36dd3ac4b478456111cd4309d9243510782fa31b7c4c95fa951520d020eb7e5c36e4ef",
|
|
||||||
"af8e6e91fab46ce4873e1a50a8ef448cc29121f7f74deef34a71ef89cc00d9274bc6c2454bbb3230d8b2ec94c62b1dec85f3593bfa30ea6f7a44d7c09465a253",
|
|
||||||
"29fd384ed4906f2d13aa9fe7af905990938bed807f1832454a372ab412eea1f5625a1fcc9ac8343b7c67c5aba6e0b1cc4644654913692c6b39eb9187ceacd3ec",
|
|
||||||
"a268c7885d9874a51c44dffed8ea53e94f78456e0b2ed99ff5a3924760813826d960a15edbedbb5de5226ba4b074e71b05c55b9756bb79e55c02754c2c7b6c8a",
|
|
||||||
"0cf8545488d56a86817cd7ecb10f7116b7ea530a45b6ea497b6c72c997e09e3d0da8698f46bb006fc977c2cd3d1177463ac9057fdd1662c85d0c126443c10473",
|
|
||||||
"b39614268fdd8781515e2cfebf89b4d5402bab10c226e6344e6b9ae000fb0d6c79cb2f3ec80e80eaeb1980d2f8698916bd2e9f747236655116649cd3ca23a837",
|
|
||||||
"74bef092fc6f1e5dba3663a3fb003b2a5ba257496536d99f62b9d73f8f9eb3ce9ff3eec709eb883655ec9eb896b9128f2afc89cf7d1ab58a72f4a3bf034d2b4a",
|
|
||||||
"3a988d38d75611f3ef38b8774980b33e573b6c57bee0469ba5eed9b44f29945e7347967fba2c162e1c3be7f310f2f75ee2381e7bfd6b3f0baea8d95dfb1dafb1",
|
|
||||||
"58aedfce6f67ddc85a28c992f1c0bd0969f041e66f1ee88020a125cbfcfebcd61709c9c4eba192c15e69f020d462486019fa8dea0cd7a42921a19d2fe546d43d",
|
|
||||||
"9347bd291473e6b4e368437b8e561e065f649a6d8ada479ad09b1999a8f26b91cf6120fd3bfe014e83f23acfa4c0ad7b3712b2c3c0733270663112ccd9285cd9",
|
|
||||||
"b32163e7c5dbb5f51fdc11d2eac875efbbcb7e7699090a7e7ff8a8d50795af5d74d9ff98543ef8cdf89ac13d0485278756e0ef00c817745661e1d59fe38e7537",
|
|
||||||
"1085d78307b1c4b008c57a2e7e5b234658a0a82e4ff1e4aaac72b312fda0fe27d233bc5b10e9cc17fdc7697b540c7d95eb215a19a1a0e20e1abfa126efd568c7",
|
|
||||||
"4e5c734c7dde011d83eac2b7347b373594f92d7091b9ca34cb9c6f39bdf5a8d2f134379e16d822f6522170ccf2ddd55c84b9e6c64fc927ac4cf8dfb2a17701f2",
|
|
||||||
"695d83bd990a1117b3d0ce06cc888027d12a054c2677fd82f0d4fbfc93575523e7991a5e35a3752e9b70ce62992e268a877744cdd435f5f130869c9a2074b338",
|
|
||||||
"a6213743568e3b3158b9184301f3690847554c68457cb40fc9a4b8cfd8d4a118c301a07737aeda0f929c68913c5f51c80394f53bff1c3e83b2e40ca97eba9e15",
|
|
||||||
"d444bfa2362a96df213d070e33fa841f51334e4e76866b8139e8af3bb3398be2dfaddcbc56b9146de9f68118dc5829e74b0c28d7711907b121f9161cb92b69a9",
|
|
||||||
"142709d62e28fcccd0af97fad0f8465b971e82201dc51070faa0372aa43e92484be1c1e73ba10906d5d1853db6a4106e0a7bf9800d373d6dee2d46d62ef2a461",
|
|
||||||
}
|
|
177
vendor/golang.org/x/crypto/blake2b/blake2x.go
generated
vendored
Normal file
177
vendor/golang.org/x/crypto/blake2b/blake2x.go
generated
vendored
Normal file
@ -0,0 +1,177 @@
|
|||||||
|
// Copyright 2017 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package blake2b
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/binary"
|
||||||
|
"errors"
|
||||||
|
"io"
|
||||||
|
)
|
||||||
|
|
||||||
|
// XOF defines the interface to hash functions that
|
||||||
|
// support arbitrary-length output.
|
||||||
|
type XOF interface {
|
||||||
|
// Write absorbs more data into the hash's state. It panics if called
|
||||||
|
// after Read.
|
||||||
|
io.Writer
|
||||||
|
|
||||||
|
// Read reads more output from the hash. It returns io.EOF if the limit
|
||||||
|
// has been reached.
|
||||||
|
io.Reader
|
||||||
|
|
||||||
|
// Clone returns a copy of the XOF in its current state.
|
||||||
|
Clone() XOF
|
||||||
|
|
||||||
|
// Reset resets the XOF to its initial state.
|
||||||
|
Reset()
|
||||||
|
}
|
||||||
|
|
||||||
|
// OutputLengthUnknown can be used as the size argument to NewXOF to indicate
|
||||||
|
// the the length of the output is not known in advance.
|
||||||
|
const OutputLengthUnknown = 0
|
||||||
|
|
||||||
|
// magicUnknownOutputLength is a magic value for the output size that indicates
|
||||||
|
// an unknown number of output bytes.
|
||||||
|
const magicUnknownOutputLength = (1 << 32) - 1
|
||||||
|
|
||||||
|
// maxOutputLength is the absolute maximum number of bytes to produce when the
|
||||||
|
// number of output bytes is unknown.
|
||||||
|
const maxOutputLength = (1 << 32) * 64
|
||||||
|
|
||||||
|
// NewXOF creates a new variable-output-length hash. The hash either produce a
|
||||||
|
// known number of bytes (1 <= size < 2**32-1), or an unknown number of bytes
|
||||||
|
// (size == OutputLengthUnknown). In the latter case, an absolute limit of
|
||||||
|
// 256GiB applies.
|
||||||
|
//
|
||||||
|
// A non-nil key turns the hash into a MAC. The key must between
|
||||||
|
// zero and 32 bytes long.
|
||||||
|
func NewXOF(size uint32, key []byte) (XOF, error) {
|
||||||
|
if len(key) > Size {
|
||||||
|
return nil, errKeySize
|
||||||
|
}
|
||||||
|
if size == magicUnknownOutputLength {
|
||||||
|
// 2^32-1 indicates an unknown number of bytes and thus isn't a
|
||||||
|
// valid length.
|
||||||
|
return nil, errors.New("blake2b: XOF length too large")
|
||||||
|
}
|
||||||
|
if size == OutputLengthUnknown {
|
||||||
|
size = magicUnknownOutputLength
|
||||||
|
}
|
||||||
|
x := &xof{
|
||||||
|
d: digest{
|
||||||
|
size: Size,
|
||||||
|
keyLen: len(key),
|
||||||
|
},
|
||||||
|
length: size,
|
||||||
|
}
|
||||||
|
copy(x.d.key[:], key)
|
||||||
|
x.Reset()
|
||||||
|
return x, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type xof struct {
|
||||||
|
d digest
|
||||||
|
length uint32
|
||||||
|
remaining uint64
|
||||||
|
cfg, root, block [Size]byte
|
||||||
|
offset int
|
||||||
|
nodeOffset uint32
|
||||||
|
readMode bool
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *xof) Write(p []byte) (n int, err error) {
|
||||||
|
if x.readMode {
|
||||||
|
panic("blake2b: write to XOF after read")
|
||||||
|
}
|
||||||
|
return x.d.Write(p)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *xof) Clone() XOF {
|
||||||
|
clone := *x
|
||||||
|
return &clone
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *xof) Reset() {
|
||||||
|
x.cfg[0] = byte(Size)
|
||||||
|
binary.LittleEndian.PutUint32(x.cfg[4:], uint32(Size)) // leaf length
|
||||||
|
binary.LittleEndian.PutUint32(x.cfg[12:], x.length) // XOF length
|
||||||
|
x.cfg[17] = byte(Size) // inner hash size
|
||||||
|
|
||||||
|
x.d.Reset()
|
||||||
|
x.d.h[1] ^= uint64(x.length) << 32
|
||||||
|
|
||||||
|
x.remaining = uint64(x.length)
|
||||||
|
if x.remaining == magicUnknownOutputLength {
|
||||||
|
x.remaining = maxOutputLength
|
||||||
|
}
|
||||||
|
x.offset, x.nodeOffset = 0, 0
|
||||||
|
x.readMode = false
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *xof) Read(p []byte) (n int, err error) {
|
||||||
|
if !x.readMode {
|
||||||
|
x.d.finalize(&x.root)
|
||||||
|
x.readMode = true
|
||||||
|
}
|
||||||
|
|
||||||
|
if x.remaining == 0 {
|
||||||
|
return 0, io.EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
n = len(p)
|
||||||
|
if uint64(n) > x.remaining {
|
||||||
|
n = int(x.remaining)
|
||||||
|
p = p[:n]
|
||||||
|
}
|
||||||
|
|
||||||
|
if x.offset > 0 {
|
||||||
|
blockRemaining := Size - x.offset
|
||||||
|
if n < blockRemaining {
|
||||||
|
x.offset += copy(p, x.block[x.offset:])
|
||||||
|
x.remaining -= uint64(n)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
copy(p, x.block[x.offset:])
|
||||||
|
p = p[blockRemaining:]
|
||||||
|
x.offset = 0
|
||||||
|
x.remaining -= uint64(blockRemaining)
|
||||||
|
}
|
||||||
|
|
||||||
|
for len(p) >= Size {
|
||||||
|
binary.LittleEndian.PutUint32(x.cfg[8:], x.nodeOffset)
|
||||||
|
x.nodeOffset++
|
||||||
|
|
||||||
|
x.d.initConfig(&x.cfg)
|
||||||
|
x.d.Write(x.root[:])
|
||||||
|
x.d.finalize(&x.block)
|
||||||
|
|
||||||
|
copy(p, x.block[:])
|
||||||
|
p = p[Size:]
|
||||||
|
x.remaining -= uint64(Size)
|
||||||
|
}
|
||||||
|
|
||||||
|
if todo := len(p); todo > 0 {
|
||||||
|
if x.remaining < uint64(Size) {
|
||||||
|
x.cfg[0] = byte(x.remaining)
|
||||||
|
}
|
||||||
|
binary.LittleEndian.PutUint32(x.cfg[8:], x.nodeOffset)
|
||||||
|
x.nodeOffset++
|
||||||
|
|
||||||
|
x.d.initConfig(&x.cfg)
|
||||||
|
x.d.Write(x.root[:])
|
||||||
|
x.d.finalize(&x.block)
|
||||||
|
|
||||||
|
x.offset = copy(p, x.block[:todo])
|
||||||
|
x.remaining -= uint64(todo)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *digest) initConfig(cfg *[Size]byte) {
|
||||||
|
d.offset, d.c[0], d.c[1] = 0, 0, 0
|
||||||
|
for i := range d.h {
|
||||||
|
d.h[i] = iv[i] ^ binary.LittleEndian.Uint64(cfg[i*8:])
|
||||||
|
}
|
||||||
|
}
|
32
vendor/golang.org/x/crypto/blake2b/register.go
generated
vendored
Normal file
32
vendor/golang.org/x/crypto/blake2b/register.go
generated
vendored
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
// Copyright 2017 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// +build go1.9
|
||||||
|
|
||||||
|
package blake2b
|
||||||
|
|
||||||
|
import (
|
||||||
|
"crypto"
|
||||||
|
"hash"
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
newHash256 := func() hash.Hash {
|
||||||
|
h, _ := New256(nil)
|
||||||
|
return h
|
||||||
|
}
|
||||||
|
newHash384 := func() hash.Hash {
|
||||||
|
h, _ := New384(nil)
|
||||||
|
return h
|
||||||
|
}
|
||||||
|
|
||||||
|
newHash512 := func() hash.Hash {
|
||||||
|
h, _ := New512(nil)
|
||||||
|
return h
|
||||||
|
}
|
||||||
|
|
||||||
|
crypto.RegisterHash(crypto.BLAKE2b_256, newHash256)
|
||||||
|
crypto.RegisterHash(crypto.BLAKE2b_384, newHash384)
|
||||||
|
crypto.RegisterHash(crypto.BLAKE2b_512, newHash512)
|
||||||
|
}
|
65
vendor/vendor.json
vendored
65
vendor/vendor.json
vendored
@ -385,11 +385,6 @@
|
|||||||
"revision": "439a0961af700f80db84cc180fe324a89070fa65",
|
"revision": "439a0961af700f80db84cc180fe324a89070fa65",
|
||||||
"revisionTime": "2018-01-23T12:12:34Z"
|
"revisionTime": "2018-01-23T12:12:34Z"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"path": "github.com/minio/go-homedir",
|
|
||||||
"revision": "0b1069c753c94b3633cc06a1995252dbcc27c7a6",
|
|
||||||
"revisionTime": "2016-02-15T17:25:11+05:30"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"checksumSHA1": "w7ykRf31om2J6832Py4Kz/PEnSI=",
|
"checksumSHA1": "w7ykRf31om2J6832Py4Kz/PEnSI=",
|
||||||
"path": "github.com/minio/highwayhash",
|
"path": "github.com/minio/highwayhash",
|
||||||
@ -408,46 +403,46 @@
|
|||||||
"revisionTime": "2016-02-29T08:42:30-08:00"
|
"revisionTime": "2016-02-29T08:42:30-08:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"checksumSHA1": "wPmY8+2/EZHIgrrqCVk21Z4+TCc=",
|
"checksumSHA1": "XSYD1N4v3EtbiwJQpIO71ZaucP0=",
|
||||||
"path": "github.com/minio/minio-go",
|
"path": "github.com/minio/minio-go",
|
||||||
"revision": "93f1e8b8551b56c54dcb6b0fbb459546f54d9774",
|
"revision": "bfac4536aea242ea4d05fb552d2a85f397a85369",
|
||||||
"revisionTime": "2017-12-24T05:09:42Z"
|
"revisionTime": "2018-03-12T23:14:54Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"checksumSHA1": "5juljGXPkBWENR2Os7dlnPQER48=",
|
"checksumSHA1": "Qsj+6JPmJ8R5rFNQSHqRb8xAwOw=",
|
||||||
"path": "github.com/minio/minio-go/pkg/credentials",
|
"path": "github.com/minio/minio-go/pkg/credentials",
|
||||||
"revision": "84539d76271caeffb7a1d5f058bd83c6449f8145",
|
"revision": "bfac4536aea242ea4d05fb552d2a85f397a85369",
|
||||||
"revisionTime": "2017-09-01T08:51:27Z"
|
"revisionTime": "2018-03-12T23:14:54Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"checksumSHA1": "pggIpSePizRBQ7ybhB0CuaSQydw=",
|
"checksumSHA1": "p21oRW905lv0UBfpAm5Vs6EBmB8=",
|
||||||
"path": "github.com/minio/minio-go/pkg/encrypt",
|
"path": "github.com/minio/minio-go/pkg/encrypt",
|
||||||
"revision": "84539d76271caeffb7a1d5f058bd83c6449f8145",
|
"revision": "bfac4536aea242ea4d05fb552d2a85f397a85369",
|
||||||
"revisionTime": "2017-09-01T08:51:27Z"
|
"revisionTime": "2018-03-12T23:14:54Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"checksumSHA1": "3tl2ehmod/EzXE9o9WJ5HM2AQPE=",
|
"checksumSHA1": "Df4SG4ratsLn8yE9SkHcZiKhKRU=",
|
||||||
"path": "github.com/minio/minio-go/pkg/policy",
|
"path": "github.com/minio/minio-go/pkg/policy",
|
||||||
"revision": "84539d76271caeffb7a1d5f058bd83c6449f8145",
|
"revision": "bfac4536aea242ea4d05fb552d2a85f397a85369",
|
||||||
"revisionTime": "2017-09-01T08:51:27Z"
|
"revisionTime": "2018-03-12T23:14:54Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"checksumSHA1": "ENjhnv4qjgfc3/v6nJhLNR4COOQ=",
|
"checksumSHA1": "bbWjcrOQsV57qK+BSsrNAsI+Q/o=",
|
||||||
"path": "github.com/minio/minio-go/pkg/s3signer",
|
"path": "github.com/minio/minio-go/pkg/s3signer",
|
||||||
"revision": "84539d76271caeffb7a1d5f058bd83c6449f8145",
|
"revision": "bfac4536aea242ea4d05fb552d2a85f397a85369",
|
||||||
"revisionTime": "2017-09-01T08:51:27Z"
|
"revisionTime": "2018-03-12T23:14:54Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"checksumSHA1": "jWv8ONT9vgsX6MAMfCWHsyJtmHU=",
|
"checksumSHA1": "xrJThFwwkVrJdwd5iYFHqfx4wRY=",
|
||||||
"path": "github.com/minio/minio-go/pkg/s3utils",
|
"path": "github.com/minio/minio-go/pkg/s3utils",
|
||||||
"revision": "84539d76271caeffb7a1d5f058bd83c6449f8145",
|
"revision": "bfac4536aea242ea4d05fb552d2a85f397a85369",
|
||||||
"revisionTime": "2017-09-01T08:51:27Z"
|
"revisionTime": "2018-03-12T23:14:54Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"checksumSHA1": "maUy+dbN6VfTTnfErrAW2lLit1w=",
|
"checksumSHA1": "Wt8ej+rZXTdNBR9Xyw1eGo3Iq5o=",
|
||||||
"path": "github.com/minio/minio-go/pkg/set",
|
"path": "github.com/minio/minio-go/pkg/set",
|
||||||
"revision": "84539d76271caeffb7a1d5f058bd83c6449f8145",
|
"revision": "bfac4536aea242ea4d05fb552d2a85f397a85369",
|
||||||
"revisionTime": "2017-09-01T08:51:27Z"
|
"revisionTime": "2018-03-12T23:14:54Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"checksumSHA1": "cYuXpiVBMypgkEr0Wqd79jPPyBg=",
|
"checksumSHA1": "cYuXpiVBMypgkEr0Wqd79jPPyBg=",
|
||||||
@ -461,6 +456,12 @@
|
|||||||
"revision": "83dd737d26dbcf4847f48ecec77c2c13f739eb25",
|
"revision": "83dd737d26dbcf4847f48ecec77c2c13f739eb25",
|
||||||
"revisionTime": "2018-03-01T21:58:29Z"
|
"revisionTime": "2018-03-01T21:58:29Z"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"checksumSHA1": "V/quM7+em2ByJbWBLOsEwnY3j/Q=",
|
||||||
|
"path": "github.com/mitchellh/go-homedir",
|
||||||
|
"revision": "b8bc1bf767474819792c23f32d8286a45736f1c6",
|
||||||
|
"revisionTime": "2016-12-03T19:45:07Z"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"checksumSHA1": "zvQr4zOz1/g/Fui6co0sctxrJ28=",
|
"checksumSHA1": "zvQr4zOz1/g/Fui6co0sctxrJ28=",
|
||||||
"path": "github.com/nats-io/go-nats",
|
"path": "github.com/nats-io/go-nats",
|
||||||
@ -572,6 +573,18 @@
|
|||||||
"revision": "3b8db5e93c4c02efbc313e17b2e796b0914a01fb",
|
"revision": "3b8db5e93c4c02efbc313e17b2e796b0914a01fb",
|
||||||
"revisionTime": "2016-12-15T19:56:52Z"
|
"revisionTime": "2016-12-15T19:56:52Z"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"checksumSHA1": "ZD+2qFL2iuIXgLd3Q3xUadEhlr4=",
|
||||||
|
"path": "golang.org/x/crypto/argon2",
|
||||||
|
"revision": "91a49db82a88618983a78a06c1cbd4e00ab749ab",
|
||||||
|
"revisionTime": "2018-02-28T15:18:34Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"checksumSHA1": "ppPg0bIlBAVJy0Pn13BfBnkp9V4=",
|
||||||
|
"path": "golang.org/x/crypto/blake2b",
|
||||||
|
"revision": "182114d582623c1caa54f73de9c7224e23a48487",
|
||||||
|
"revisionTime": "2018-03-12T18:51:34Z"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"checksumSHA1": "CvMkf3KUUGUVHibg6G/zI7XtVbM=",
|
"checksumSHA1": "CvMkf3KUUGUVHibg6G/zI7XtVbM=",
|
||||||
"path": "golang.org/x/crypto/chacha20poly1305",
|
"path": "golang.org/x/crypto/chacha20poly1305",
|
||||||
|
Loading…
Reference in New Issue
Block a user