forked from lug/matterbridge
		
	
		
			
				
	
	
		
			69 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package cryptoutil
 | 
						|
 | 
						|
import (
 | 
						|
	"crypto/cipher"
 | 
						|
)
 | 
						|
 | 
						|
// From this code review: https://codereview.appspot.com/7860047/
 | 
						|
// by fasmat for the Go crypto/cipher package
 | 
						|
 | 
						|
type ecb struct {
 | 
						|
	b         cipher.Block
 | 
						|
	blockSize int
 | 
						|
}
 | 
						|
 | 
						|
func newECB(b cipher.Block) *ecb {
 | 
						|
	return &ecb{
 | 
						|
		b:         b,
 | 
						|
		blockSize: b.BlockSize(),
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
type ecbEncrypter ecb
 | 
						|
 | 
						|
// NewECBEncrypter returns a BlockMode which encrypts in electronic code book
 | 
						|
// mode, using the given Block.
 | 
						|
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("cryptoutil/ecb: input not full blocks")
 | 
						|
	}
 | 
						|
	if len(dst) < len(src) {
 | 
						|
		panic("cryptoutil/ecb: output smaller than input")
 | 
						|
	}
 | 
						|
	for len(src) > 0 {
 | 
						|
		x.b.Encrypt(dst, src[:x.blockSize])
 | 
						|
		src = src[x.blockSize:]
 | 
						|
		dst = dst[x.blockSize:]
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
type ecbDecrypter ecb
 | 
						|
 | 
						|
// newECBDecrypter returns a BlockMode which decrypts in electronic code book
 | 
						|
// mode, using the given Block.
 | 
						|
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("cryptoutil/ecb: input not full blocks")
 | 
						|
	}
 | 
						|
	if len(dst) < len(src) {
 | 
						|
		panic("cryptoutil/ecb: output smaller than input")
 | 
						|
	}
 | 
						|
	for len(src) > 0 {
 | 
						|
		x.b.Decrypt(dst, src[:x.blockSize])
 | 
						|
		src = src[x.blockSize:]
 | 
						|
		dst = dst[x.blockSize:]
 | 
						|
	}
 | 
						|
}
 |