| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- /*
- * Copyright (c) 2000-2018, 达梦数据库有限公司.
- * All rights reserved.
- */
- // go官方没有实现ecb加密模式
- package security
- import (
- "crypto/cipher"
- )
- type ecb struct {
- b cipher.Block
- blockSize int
- }
- func newECB(b cipher.Block) *ecb {
- return &ecb{
- b: b,
- blockSize: b.BlockSize(),
- }
- }
- type ecbEncrypter ecb
- func NewECBEncrypter(b cipher.Block) cipher.BlockMode {
- return (*ecbEncrypter)(newECB(b))
- }
- func (x *ecbEncrypter) BlockSize() int { return x.blockSize }
- func (x *ecbEncrypter) CryptBlocks(dst, src []byte) {
- if len(src)%x.blockSize != 0 {
- panic("dm/security: input not full blocks")
- }
- if len(dst) < len(src) {
- panic("dm/security: output smaller than input")
- }
- if InexactOverlap(dst[:len(src)], src) {
- panic("dm/security: invalid buffer overlap")
- }
- for bs, be := 0, x.blockSize; bs < len(src); bs, be = bs+x.blockSize, be+x.blockSize {
- x.b.Encrypt(dst[bs:be], src[bs:be])
- }
- }
- type ecbDecrypter ecb
- func NewECBDecrypter(b cipher.Block) cipher.BlockMode {
- return (*ecbDecrypter)(newECB(b))
- }
- func (x *ecbDecrypter) BlockSize() int { return x.blockSize }
- func (x *ecbDecrypter) CryptBlocks(dst, src []byte) {
- if len(src)%x.blockSize != 0 {
- panic("dm/security: input not full blocks")
- }
- if len(dst) < len(src) {
- panic("dm/security: output smaller than input")
- }
- if InexactOverlap(dst[:len(src)], src) {
- panic("dm/security: invalid buffer overlap")
- }
- for bs, be := 0, x.blockSize; bs < len(src); bs, be = bs+x.blockSize, be+x.blockSize {
- x.b.Decrypt(dst[bs:be], src[bs:be])
- }
- }
|