Moved to google.golang.org/genproto/googleapis/api/annotations
Fixes #52
This commit is contained in:
		
							
								
								
									
										53
									
								
								vendor/golang.org/x/crypto/nacl/secretbox/example_test.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								vendor/golang.org/x/crypto/nacl/secretbox/example_test.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,53 @@
 | 
			
		||||
// 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 secretbox_test
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"crypto/rand"
 | 
			
		||||
	"encoding/hex"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io"
 | 
			
		||||
 | 
			
		||||
	"golang.org/x/crypto/nacl/secretbox"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func Example() {
 | 
			
		||||
	// Load your secret key from a safe place and reuse it across multiple
 | 
			
		||||
	// Seal calls. (Obviously don't use this example key for anything
 | 
			
		||||
	// real.) If you want to convert a passphrase to a key, use a suitable
 | 
			
		||||
	// package like bcrypt or scrypt.
 | 
			
		||||
	secretKeyBytes, err := hex.DecodeString("6368616e676520746869732070617373776f726420746f206120736563726574")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		panic(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var secretKey [32]byte
 | 
			
		||||
	copy(secretKey[:], secretKeyBytes)
 | 
			
		||||
 | 
			
		||||
	// You must use a different nonce for each message you encrypt with the
 | 
			
		||||
	// same key. Since the nonce here is 192 bits long, a random value
 | 
			
		||||
	// provides a sufficiently small probability of repeats.
 | 
			
		||||
	var nonce [24]byte
 | 
			
		||||
	if _, err := io.ReadFull(rand.Reader, nonce[:]); err != nil {
 | 
			
		||||
		panic(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// This encrypts "hello world" and appends the result to the nonce.
 | 
			
		||||
	encrypted := secretbox.Seal(nonce[:], []byte("hello world"), &nonce, &secretKey)
 | 
			
		||||
 | 
			
		||||
	// When you decrypt, you must use the same nonce and key you used to
 | 
			
		||||
	// encrypt the message. One way to achieve this is to store the nonce
 | 
			
		||||
	// alongside the encrypted message. Above, we stored the nonce in the first
 | 
			
		||||
	// 24 bytes of the encrypted text.
 | 
			
		||||
	var decryptNonce [24]byte
 | 
			
		||||
	copy(decryptNonce[:], encrypted[:24])
 | 
			
		||||
	decrypted, ok := secretbox.Open([]byte{}, encrypted[24:], &decryptNonce, &secretKey)
 | 
			
		||||
	if !ok {
 | 
			
		||||
		panic("decryption error")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fmt.Println(string(decrypted))
 | 
			
		||||
	// Output: hello world
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										149
									
								
								vendor/golang.org/x/crypto/nacl/secretbox/secretbox.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										149
									
								
								vendor/golang.org/x/crypto/nacl/secretbox/secretbox.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,149 @@
 | 
			
		||||
// Copyright 2012 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 secretbox encrypts and authenticates small messages.
 | 
			
		||||
 | 
			
		||||
Secretbox uses XSalsa20 and Poly1305 to encrypt and authenticate messages with
 | 
			
		||||
secret-key cryptography. The length of messages is not hidden.
 | 
			
		||||
 | 
			
		||||
It is the caller's responsibility to ensure the uniqueness of nonces—for
 | 
			
		||||
example, by using nonce 1 for the first message, nonce 2 for the second
 | 
			
		||||
message, etc. Nonces are long enough that randomly generated nonces have
 | 
			
		||||
negligible risk of collision.
 | 
			
		||||
 | 
			
		||||
This package is interoperable with NaCl: https://nacl.cr.yp.to/secretbox.html.
 | 
			
		||||
*/
 | 
			
		||||
package secretbox // import "golang.org/x/crypto/nacl/secretbox"
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"golang.org/x/crypto/poly1305"
 | 
			
		||||
	"golang.org/x/crypto/salsa20/salsa"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Overhead is the number of bytes of overhead when boxing a message.
 | 
			
		||||
const Overhead = poly1305.TagSize
 | 
			
		||||
 | 
			
		||||
// setup produces a sub-key and Salsa20 counter given a nonce and key.
 | 
			
		||||
func setup(subKey *[32]byte, counter *[16]byte, nonce *[24]byte, key *[32]byte) {
 | 
			
		||||
	// We use XSalsa20 for encryption so first we need to generate a
 | 
			
		||||
	// key and nonce with HSalsa20.
 | 
			
		||||
	var hNonce [16]byte
 | 
			
		||||
	copy(hNonce[:], nonce[:])
 | 
			
		||||
	salsa.HSalsa20(subKey, &hNonce, key, &salsa.Sigma)
 | 
			
		||||
 | 
			
		||||
	// The final 8 bytes of the original nonce form the new nonce.
 | 
			
		||||
	copy(counter[:], nonce[16:])
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// sliceForAppend takes a slice and a requested number of bytes. It returns a
 | 
			
		||||
// slice with the contents of the given slice followed by that many bytes and a
 | 
			
		||||
// second slice that aliases into it and contains only the extra bytes. If the
 | 
			
		||||
// original slice has sufficient capacity then no allocation is performed.
 | 
			
		||||
func sliceForAppend(in []byte, n int) (head, tail []byte) {
 | 
			
		||||
	if total := len(in) + n; cap(in) >= total {
 | 
			
		||||
		head = in[:total]
 | 
			
		||||
	} else {
 | 
			
		||||
		head = make([]byte, total)
 | 
			
		||||
		copy(head, in)
 | 
			
		||||
	}
 | 
			
		||||
	tail = head[len(in):]
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Seal appends an encrypted and authenticated copy of message to out, which
 | 
			
		||||
// must not overlap message. The key and nonce pair must be unique for each
 | 
			
		||||
// distinct message and the output will be Overhead bytes longer than message.
 | 
			
		||||
func Seal(out, message []byte, nonce *[24]byte, key *[32]byte) []byte {
 | 
			
		||||
	var subKey [32]byte
 | 
			
		||||
	var counter [16]byte
 | 
			
		||||
	setup(&subKey, &counter, nonce, key)
 | 
			
		||||
 | 
			
		||||
	// The Poly1305 key is generated by encrypting 32 bytes of zeros. Since
 | 
			
		||||
	// Salsa20 works with 64-byte blocks, we also generate 32 bytes of
 | 
			
		||||
	// keystream as a side effect.
 | 
			
		||||
	var firstBlock [64]byte
 | 
			
		||||
	salsa.XORKeyStream(firstBlock[:], firstBlock[:], &counter, &subKey)
 | 
			
		||||
 | 
			
		||||
	var poly1305Key [32]byte
 | 
			
		||||
	copy(poly1305Key[:], firstBlock[:])
 | 
			
		||||
 | 
			
		||||
	ret, out := sliceForAppend(out, len(message)+poly1305.TagSize)
 | 
			
		||||
 | 
			
		||||
	// We XOR up to 32 bytes of message with the keystream generated from
 | 
			
		||||
	// the first block.
 | 
			
		||||
	firstMessageBlock := message
 | 
			
		||||
	if len(firstMessageBlock) > 32 {
 | 
			
		||||
		firstMessageBlock = firstMessageBlock[:32]
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	tagOut := out
 | 
			
		||||
	out = out[poly1305.TagSize:]
 | 
			
		||||
	for i, x := range firstMessageBlock {
 | 
			
		||||
		out[i] = firstBlock[32+i] ^ x
 | 
			
		||||
	}
 | 
			
		||||
	message = message[len(firstMessageBlock):]
 | 
			
		||||
	ciphertext := out
 | 
			
		||||
	out = out[len(firstMessageBlock):]
 | 
			
		||||
 | 
			
		||||
	// Now encrypt the rest.
 | 
			
		||||
	counter[8] = 1
 | 
			
		||||
	salsa.XORKeyStream(out, message, &counter, &subKey)
 | 
			
		||||
 | 
			
		||||
	var tag [poly1305.TagSize]byte
 | 
			
		||||
	poly1305.Sum(&tag, ciphertext, &poly1305Key)
 | 
			
		||||
	copy(tagOut, tag[:])
 | 
			
		||||
 | 
			
		||||
	return ret
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Open authenticates and decrypts a box produced by Seal and appends the
 | 
			
		||||
// message to out, which must not overlap box. The output will be Overhead
 | 
			
		||||
// bytes smaller than box.
 | 
			
		||||
func Open(out []byte, box []byte, nonce *[24]byte, key *[32]byte) ([]byte, bool) {
 | 
			
		||||
	if len(box) < Overhead {
 | 
			
		||||
		return nil, false
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var subKey [32]byte
 | 
			
		||||
	var counter [16]byte
 | 
			
		||||
	setup(&subKey, &counter, nonce, key)
 | 
			
		||||
 | 
			
		||||
	// The Poly1305 key is generated by encrypting 32 bytes of zeros. Since
 | 
			
		||||
	// Salsa20 works with 64-byte blocks, we also generate 32 bytes of
 | 
			
		||||
	// keystream as a side effect.
 | 
			
		||||
	var firstBlock [64]byte
 | 
			
		||||
	salsa.XORKeyStream(firstBlock[:], firstBlock[:], &counter, &subKey)
 | 
			
		||||
 | 
			
		||||
	var poly1305Key [32]byte
 | 
			
		||||
	copy(poly1305Key[:], firstBlock[:])
 | 
			
		||||
	var tag [poly1305.TagSize]byte
 | 
			
		||||
	copy(tag[:], box)
 | 
			
		||||
 | 
			
		||||
	if !poly1305.Verify(&tag, box[poly1305.TagSize:], &poly1305Key) {
 | 
			
		||||
		return nil, false
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ret, out := sliceForAppend(out, len(box)-Overhead)
 | 
			
		||||
 | 
			
		||||
	// We XOR up to 32 bytes of box with the keystream generated from
 | 
			
		||||
	// the first block.
 | 
			
		||||
	box = box[Overhead:]
 | 
			
		||||
	firstMessageBlock := box
 | 
			
		||||
	if len(firstMessageBlock) > 32 {
 | 
			
		||||
		firstMessageBlock = firstMessageBlock[:32]
 | 
			
		||||
	}
 | 
			
		||||
	for i, x := range firstMessageBlock {
 | 
			
		||||
		out[i] = firstBlock[32+i] ^ x
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	box = box[len(firstMessageBlock):]
 | 
			
		||||
	out = out[len(firstMessageBlock):]
 | 
			
		||||
 | 
			
		||||
	// Now decrypt the rest.
 | 
			
		||||
	counter[8] = 1
 | 
			
		||||
	salsa.XORKeyStream(out, box, &counter, &subKey)
 | 
			
		||||
 | 
			
		||||
	return ret, true
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										91
									
								
								vendor/golang.org/x/crypto/nacl/secretbox/secretbox_test.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										91
									
								
								vendor/golang.org/x/crypto/nacl/secretbox/secretbox_test.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,91 @@
 | 
			
		||||
// Copyright 2012 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 secretbox
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"crypto/rand"
 | 
			
		||||
	"encoding/hex"
 | 
			
		||||
	"testing"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func TestSealOpen(t *testing.T) {
 | 
			
		||||
	var key [32]byte
 | 
			
		||||
	var nonce [24]byte
 | 
			
		||||
 | 
			
		||||
	rand.Reader.Read(key[:])
 | 
			
		||||
	rand.Reader.Read(nonce[:])
 | 
			
		||||
 | 
			
		||||
	var box, opened []byte
 | 
			
		||||
 | 
			
		||||
	for msgLen := 0; msgLen < 128; msgLen += 17 {
 | 
			
		||||
		message := make([]byte, msgLen)
 | 
			
		||||
		rand.Reader.Read(message)
 | 
			
		||||
 | 
			
		||||
		box = Seal(box[:0], message, &nonce, &key)
 | 
			
		||||
		var ok bool
 | 
			
		||||
		opened, ok = Open(opened[:0], box, &nonce, &key)
 | 
			
		||||
		if !ok {
 | 
			
		||||
			t.Errorf("%d: failed to open box", msgLen)
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if !bytes.Equal(opened, message) {
 | 
			
		||||
			t.Errorf("%d: got %x, expected %x", msgLen, opened, message)
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for i := range box {
 | 
			
		||||
		box[i] ^= 0x20
 | 
			
		||||
		_, ok := Open(opened[:0], box, &nonce, &key)
 | 
			
		||||
		if ok {
 | 
			
		||||
			t.Errorf("box was opened after corrupting byte %d", i)
 | 
			
		||||
		}
 | 
			
		||||
		box[i] ^= 0x20
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestSecretBox(t *testing.T) {
 | 
			
		||||
	var key [32]byte
 | 
			
		||||
	var nonce [24]byte
 | 
			
		||||
	var message [64]byte
 | 
			
		||||
 | 
			
		||||
	for i := range key[:] {
 | 
			
		||||
		key[i] = 1
 | 
			
		||||
	}
 | 
			
		||||
	for i := range nonce[:] {
 | 
			
		||||
		nonce[i] = 2
 | 
			
		||||
	}
 | 
			
		||||
	for i := range message[:] {
 | 
			
		||||
		message[i] = 3
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	box := Seal(nil, message[:], &nonce, &key)
 | 
			
		||||
	// expected was generated using the C implementation of NaCl.
 | 
			
		||||
	expected, _ := hex.DecodeString("8442bc313f4626f1359e3b50122b6ce6fe66ddfe7d39d14e637eb4fd5b45beadab55198df6ab5368439792a23c87db70acb6156dc5ef957ac04f6276cf6093b84be77ff0849cc33e34b7254d5a8f65ad")
 | 
			
		||||
 | 
			
		||||
	if !bytes.Equal(box, expected) {
 | 
			
		||||
		t.Fatalf("box didn't match, got\n%x\n, expected\n%x", box, expected)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestAppend(t *testing.T) {
 | 
			
		||||
	var key [32]byte
 | 
			
		||||
	var nonce [24]byte
 | 
			
		||||
	var message [8]byte
 | 
			
		||||
 | 
			
		||||
	out := make([]byte, 4)
 | 
			
		||||
	box := Seal(out, message[:], &nonce, &key)
 | 
			
		||||
	if !bytes.Equal(box[:4], out[:4]) {
 | 
			
		||||
		t.Fatalf("Seal didn't correctly append")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	out = make([]byte, 4, 100)
 | 
			
		||||
	box = Seal(out, message[:], &nonce, &key)
 | 
			
		||||
	if !bytes.Equal(box[:4], out[:4]) {
 | 
			
		||||
		t.Fatalf("Seal didn't correctly append with sufficient capacity.")
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user