github.com/varialus/godfly@v0.0.0-20130904042352-1934f9f095ab/src/pkg/crypto/aes/cipher.go (about) 1 // Copyright 2009 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package aes 6 7 import ( 8 "crypto/cipher" 9 "strconv" 10 ) 11 12 // The AES block size in bytes. 13 const BlockSize = 16 14 15 // A cipher is an instance of AES encryption using a particular key. 16 type aesCipher struct { 17 enc []uint32 18 dec []uint32 19 } 20 21 type KeySizeError int 22 23 func (k KeySizeError) Error() string { 24 return "crypto/aes: invalid key size " + strconv.Itoa(int(k)) 25 } 26 27 // NewCipher creates and returns a new cipher.Block. 28 // The key argument should be the AES key, 29 // either 16, 24, or 32 bytes to select 30 // AES-128, AES-192, or AES-256. 31 func NewCipher(key []byte) (cipher.Block, error) { 32 k := len(key) 33 switch k { 34 default: 35 return nil, KeySizeError(k) 36 case 16, 24, 32: 37 break 38 } 39 40 n := k + 28 41 c := &aesCipher{make([]uint32, n), make([]uint32, n)} 42 expandKey(key, c.enc, c.dec) 43 return c, nil 44 } 45 46 func (c *aesCipher) BlockSize() int { return BlockSize } 47 48 func (c *aesCipher) Encrypt(dst, src []byte) { 49 encryptBlock(c.enc, dst, src) 50 } 51 52 func (c *aesCipher) Decrypt(dst, src []byte) { 53 decryptBlock(c.dec, dst, src) 54 }