ecb.go 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. package encrypt
  2. import (
  3. "crypto/cipher"
  4. )
  5. type ecb struct {
  6. b cipher.Block
  7. blockSize int
  8. }
  9. func newECB(b cipher.Block) *ecb {
  10. return &ecb{
  11. b: b,
  12. blockSize: b.BlockSize(),
  13. }
  14. }
  15. type ecbEncrypter ecb
  16. // NewECBEncrypter returns a BlockMode which encrypts in electronic code book
  17. // mode, using the given Block.
  18. func NewECBEncrypter(b cipher.Block) cipher.BlockMode {
  19. return (*ecbEncrypter)(newECB(b))
  20. }
  21. func (x *ecbEncrypter) BlockSize() int { return x.blockSize }
  22. func (x *ecbEncrypter) CryptBlocks(dst, src []byte) {
  23. if len(src)%x.blockSize != 0 {
  24. panic("crypto/cipher: input not full blocks")
  25. }
  26. if len(dst) < len(src) {
  27. panic("crypto/cipher: output smaller than input")
  28. }
  29. for len(src) > 0 {
  30. x.b.Encrypt(dst, src[:x.blockSize])
  31. src = src[x.blockSize:]
  32. dst = dst[x.blockSize:]
  33. }
  34. }
  35. type ecbDecrypter ecb
  36. // NewECBDecrypter returns a BlockMode which decrypts in electronic code book
  37. // mode, using the given Block.
  38. func NewECBDecrypter(b cipher.Block) cipher.BlockMode {
  39. return (*ecbDecrypter)(newECB(b))
  40. }
  41. func (x *ecbDecrypter) BlockSize() int { return x.blockSize }
  42. func (x *ecbDecrypter) CryptBlocks(dst, src []byte) {
  43. if len(src)%x.blockSize != 0 {
  44. panic("crypto/cipher: input not full blocks")
  45. }
  46. if len(dst) < len(src) {
  47. panic("crypto/cipher: output smaller than input")
  48. }
  49. for len(src) > 0 {
  50. x.b.Decrypt(dst, src[:x.blockSize])
  51. src = src[x.blockSize:]
  52. dst = dst[x.blockSize:]
  53. }
  54. }