| // Copyright 2009 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. | |
| // The block package implements standard block cipher modes | |
| // that can be wrapped around low-level block cipher implementations. | |
| // See http://csrc.nist.gov/groups/ST/toolkit/BCM/current_modes.html | |
| // and NIST Special Publication 800-38A. | |
| package block | |
| // A Cipher represents an implementation of block cipher | |
| // using a given key. It provides the capability to encrypt | |
| // or decrypt individual blocks. The mode implementations | |
| // extend that capability to streams of blocks. | |
| type Cipher interface { | |
| // BlockSize returns the cipher's block size. | |
| BlockSize() int | |
| // Encrypt encrypts the first block in src into dst. | |
| // Src and dst may point at the same memory. | |
| Encrypt(src, dst []byte) | |
| // Decrypt decrypts the first block in src into dst. | |
| // Src and dst may point at the same memory. | |
| Decrypt(src, dst []byte) | |
| } | |
| // Utility routines | |
| func shift1(src, dst []byte) byte { | |
| var b byte | |
| for i := len(src) - 1; i >= 0; i-- { | |
| bb := src[i] >> 7 | |
| dst[i] = src[i]<<1 | b | |
| b = bb | |
| } | |
| return b | |
| } | |
| func same(p, q []byte) bool { | |
| if len(p) != len(q) { | |
| return false | |
| } | |
| for i := 0; i < len(p); i++ { | |
| if p[i] != q[i] { | |
| return false | |
| } | |
| } | |
| return true | |
| } | |
| func copy(p []byte) []byte { | |
| q := make([]byte, len(p)) | |
| for i, b := range p { | |
| q[i] = b | |
| } | |
| return q | |
| } |