diff options
author | Christopher Speller <crspeller@gmail.com> | 2018-04-16 05:37:14 -0700 |
---|---|---|
committer | Joram Wilander <jwawilander@gmail.com> | 2018-04-16 08:37:14 -0400 |
commit | 6e2cb00008cbf09e556b00f87603797fcaa47e09 (patch) | |
tree | 3c0eb55ff4226a3f024aad373140d1fb860a6404 /vendor/github.com/mattermost/rsc/crypt | |
parent | bf24f51c4e1cc6286885460672f7f449e8c6f5ef (diff) | |
download | chat-6e2cb00008cbf09e556b00f87603797fcaa47e09.tar.gz chat-6e2cb00008cbf09e556b00f87603797fcaa47e09.tar.bz2 chat-6e2cb00008cbf09e556b00f87603797fcaa47e09.zip |
Depenancy upgrades and movign to dep. (#8630)
Diffstat (limited to 'vendor/github.com/mattermost/rsc/crypt')
-rw-r--r-- | vendor/github.com/mattermost/rsc/crypt/crypt.go | 150 |
1 files changed, 0 insertions, 150 deletions
diff --git a/vendor/github.com/mattermost/rsc/crypt/crypt.go b/vendor/github.com/mattermost/rsc/crypt/crypt.go deleted file mode 100644 index c65129be4..000000000 --- a/vendor/github.com/mattermost/rsc/crypt/crypt.go +++ /dev/null @@ -1,150 +0,0 @@ -// 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 crypt provides simple, password-based encryption and decryption of data blobs. -package crypt - -import ( - "bytes" - "crypto/aes" - "crypto/cipher" - "crypto/hmac" - "crypto/rand" - "crypto/sha1" - "fmt" - "io" - - "code.google.com/p/go.crypto/pbkdf2" -) - -// This program manipulates encrypted, signed packets with the following format: -// 1 byte version -// 8 byte salt -// 4 byte key hash -// aes.BlockSize-byte IV -// aes.BlockSize-byte encryption (maybe longer) -// sha1.Size-byte HMAC signature - -const version = 0 - -// deriveKey returns the AES key, HMAC-SHA1 key, and key hash for -// the given password, salt combination. -func deriveKey(password string, salt []byte) (aesKey, hmacKey, keyHash []byte) { - const keySize = 16 - key := pbkdf2.Key([]byte(password), salt, 4096, 2*keySize, sha1.New) - aesKey = key[:keySize] - hmacKey = key[keySize:] - h := sha1.New() - h.Write(key) - keyHash = h.Sum(nil)[:4] - return -} - -// Encrypt encrypts the plaintext into an encrypted packet -// using the given password. The password is required for -// decryption. -func Encrypt(password string, plaintext []byte) (encrypted []byte, err error) { - // Derive key material from password and salt. - salt := make([]byte, 8) - _, err = io.ReadFull(rand.Reader, salt) - if err != nil { - return nil, err - } - aesKey, hmacKey, keyHash := deriveKey(password, salt) - - // Pad. - n := aes.BlockSize - len(plaintext)%aes.BlockSize - dec := make([]byte, len(plaintext)+n) - copy(dec, plaintext) - for i := len(plaintext); i < len(dec); i++ { - dec[i] = byte(n) - } - - // Encrypt. - iv := make([]byte, aes.BlockSize) - _, err = io.ReadFull(rand.Reader, iv) - if err != nil { - return nil, err - } - aesBlock, err := aes.NewCipher(aesKey) - if err != nil { - // Cannot happen - key is right size. - panic("aes: " + err.Error()) - } - m := cipher.NewCBCEncrypter(aesBlock, iv) - enc := make([]byte, len(dec)) - m.CryptBlocks(enc, dec) - - // Construct packet. - var pkt []byte - pkt = append(pkt, version) - pkt = append(pkt, salt...) - pkt = append(pkt, keyHash...) - pkt = append(pkt, iv...) - pkt = append(pkt, enc...) - - // Sign. - h := hmac.New(sha1.New, hmacKey) - h.Write(pkt) - pkt = append(pkt, h.Sum(nil)...) - - return pkt, nil -} - -// Decrypt decrypts the encrypted packet using the given password. -// It returns the decrypted data. -func Decrypt(password string, encrypted []byte) (plaintext []byte, err error) { - // Pull apart packet. - pkt := encrypted - if len(pkt) < 1+8+4+2*aes.BlockSize+sha1.Size { - return nil, fmt.Errorf("encrypted packet too short") - } - vers, pkt := pkt[:1], pkt[1:] - salt, pkt := pkt[:8], pkt[8:] - hash, pkt := pkt[:4], pkt[4:] - iv, pkt := pkt[:aes.BlockSize], pkt[aes.BlockSize:] - enc, sig := pkt[:len(pkt)-sha1.Size], pkt[len(pkt)-sha1.Size:] - - if vers[0] != version || len(enc)%aes.BlockSize != 0 { - return nil, fmt.Errorf("malformed encrypted packet") - } - - // Derive key and check against hash. - aesKey, hmacKey, keyHash := deriveKey(password, salt) - if !bytes.Equal(hash, keyHash) { - return nil, fmt.Errorf("incorrect password - %x vs %x", hash, keyHash) - } - - // Verify signature. - h := hmac.New(sha1.New, hmacKey) - h.Write(encrypted[:len(encrypted)-len(sig)]) - if !bytes.Equal(sig, h.Sum(nil)) { - return nil, fmt.Errorf("cannot authenticate encrypted packet") - } - - // Decrypt. - aesBlock, err := aes.NewCipher(aesKey) - if err != nil { - // Cannot happen - key is right size. - panic("aes: " + err.Error()) - } - m := cipher.NewCBCDecrypter(aesBlock, iv) - dec := make([]byte, len(enc)) - m.CryptBlocks(dec, enc) - - // Unpad. - pad := dec[len(dec)-1] - if pad <= 0 || pad > aes.BlockSize { - return nil, fmt.Errorf("malformed packet padding") - } - for _, b := range dec[len(dec)-int(pad):] { - if b != pad { - return nil, fmt.Errorf("malformed packet padding") - } - } - dec = dec[:len(dec)-int(pad)] - - // Success! - return dec, nil -} |