Home | History | Annotate | Download | only in aes
      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 	return newCipher(key)
     40 }
     41 
     42 // newCipherGeneric creates and returns a new cipher.Block
     43 // implemented in pure Go.
     44 func newCipherGeneric(key []byte) (cipher.Block, error) {
     45 	n := len(key) + 28
     46 	c := aesCipher{make([]uint32, n), make([]uint32, n)}
     47 	expandKeyGo(key, c.enc, c.dec)
     48 	return &c, nil
     49 }
     50 
     51 func (c *aesCipher) BlockSize() int { return BlockSize }
     52 
     53 func (c *aesCipher) Encrypt(dst, src []byte) {
     54 	if len(src) < BlockSize {
     55 		panic("crypto/aes: input not full block")
     56 	}
     57 	if len(dst) < BlockSize {
     58 		panic("crypto/aes: output not full block")
     59 	}
     60 	encryptBlockGo(c.enc, dst, src)
     61 }
     62 
     63 func (c *aesCipher) Decrypt(dst, src []byte) {
     64 	if len(src) < BlockSize {
     65 		panic("crypto/aes: input not full block")
     66 	}
     67 	if len(dst) < BlockSize {
     68 		panic("crypto/aes: output not full block")
     69 	}
     70 	decryptBlockGo(c.dec, dst, src)
     71 }
     72