9 // Yes, AniDB works in ECB mode
10 type ecbState struct {
14 func newECBState(udpKey string, salt []byte) *ecbState {
16 ecb.Init(udpKey, salt)
20 func (ecb *ecbState) Init(udpKey string, salt []byte) {
22 h.Write([]byte(udpKey))
27 b, err := aes.NewCipher(key)
34 func (ecb *ecbState) BlockSize() int {
38 func (ecb *ecbState) Encrypt(p []byte) (c []byte) {
43 padded := pkcs7Pad(p, aes.BlockSize)
44 c = make([]byte, len(padded))
46 for i := 0; i < len(padded); i += aes.BlockSize {
47 ecb.Block.Encrypt(c[i:i+aes.BlockSize], padded[i:i+aes.BlockSize])
52 func (ecb *ecbState) Decrypt(c []byte) []byte {
57 p := make([]byte, len(c))
58 for i := 0; i < len(c); i += aes.BlockSize {
59 ecb.Block.Decrypt(p[i:i+aes.BlockSize], c[i:i+aes.BlockSize])
61 return pkcs7Unpad(p, aes.BlockSize)
64 // examples for a blocksize of 4
68 func pkcs7Pad(b []byte, blockSize byte) (padded []byte) {
69 ps := int(blockSize) - len(b)%int(blockSize)
70 padded = make([]byte, 0, len(b)+ps)
71 padded = append(padded, b...)
73 for i := 0; i < ps; i++ {
74 padded = append(padded, byte(ps))
79 func pkcs7Unpad(b []byte, blockSize byte) (unpadded []byte) {
84 padding := b[len(b)-int(ps):]
85 for _, pb := range padding {
90 return b[:len(b)-int(ps)]