Skip to content

Commit a598772

Browse files
committed
refactor(cipher): Optimize the logical structure of encryption and decryption #29
1 parent 833c1c2 commit a598772

File tree

3 files changed

+78
-130
lines changed

3 files changed

+78
-130
lines changed

crypto/cipher/cipher.go

Lines changed: 32 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -39,82 +39,52 @@ func (c *blockCipher) SetAAD(aad []byte) {
3939
}
4040

4141
func (c *blockCipher) Encrypt(src []byte, block cipher.Block) (dst []byte, err error) {
42-
var paddedSrc []byte
43-
switch c.Padding {
44-
case No:
45-
paddedSrc = src
46-
case Zero:
47-
paddedSrc = newZeroPadding(src, block.BlockSize())
48-
case PKCS5:
49-
paddedSrc = newPKCS5Padding(src)
50-
case PKCS7:
51-
paddedSrc = newPKCS7Padding(src, block.BlockSize())
52-
case AnsiX923:
53-
paddedSrc = newAnsiX923Padding(src, block.BlockSize())
54-
case ISO97971:
55-
paddedSrc = newISO97971Padding(src, block.BlockSize())
56-
case ISO10126:
57-
paddedSrc = newISO10126Padding(src, block.BlockSize())
58-
case ISO78164:
59-
paddedSrc = newISO78164Padding(src, block.BlockSize())
60-
case Bit:
61-
paddedSrc = newBitPadding(src, block.BlockSize())
42+
if c.Block == CFB {
43+
return newCFBEncrypter(src, c.IV, block)
6244
}
63-
switch c.Block {
64-
case CBC:
65-
return newCBCEncrypter(paddedSrc, c.IV, block)
66-
case ECB:
67-
return newECBEncrypter(paddedSrc, block)
68-
case CTR:
45+
if c.Block == OFB {
46+
return newOFBEncrypter(src, c.IV, block)
47+
}
48+
if c.Block == CTR {
6949
return newCTREncrypter(src, c.IV, block)
70-
case GCM:
50+
}
51+
if c.Block == GCM {
7152
return newGCMEncrypter(src, c.Nonce, c.AAD, block)
72-
case CFB:
73-
return newCFBEncrypter(src, c.IV, block)
74-
case OFB:
75-
return newOFBEncrypter(src, c.IV, block)
53+
}
54+
55+
paddedSrc := newPadding(c.Padding, src, block.BlockSize())
56+
if c.Block == CBC {
57+
return newCBCEncrypter(paddedSrc, c.IV, block)
58+
}
59+
if c.Block == ECB {
60+
return newECBEncrypter(paddedSrc, block)
7661
}
7762
return
7863
}
7964

8065
func (c *blockCipher) Decrypt(src []byte, block cipher.Block) (dst []byte, err error) {
66+
if c.Block == CFB {
67+
return newCFBDecrypter(src, c.IV, block)
68+
}
69+
if c.Block == OFB {
70+
return newOFBDecrypter(src, c.IV, block)
71+
}
72+
if c.Block == CTR {
73+
return newCTRDecrypter(src, c.IV, block)
74+
}
75+
if c.Block == GCM {
76+
return newGCMDecrypter(src, c.Nonce, c.AAD, block)
77+
}
8178
var decrypted []byte
82-
switch c.Block {
83-
case CBC:
79+
if c.Block == CBC {
8480
decrypted, err = newCBCDecrypter(src, c.IV, block)
85-
case CTR:
86-
decrypted, err = newCTRDecrypter(src, c.IV, block)
87-
case ECB:
81+
}
82+
if c.Block == ECB {
8883
decrypted, err = newECBDecrypter(src, block)
89-
case GCM:
90-
decrypted, err = newGCMDecrypter(src, c.Nonce, c.AAD, block)
91-
case CFB:
92-
decrypted, err = newCFBDecrypter(src, c.IV, block)
93-
case OFB:
94-
decrypted, err = newOFBDecrypter(src, c.IV, block)
9584
}
9685
if err != nil {
9786
return
9887
}
99-
switch c.Padding {
100-
case No:
101-
dst = decrypted
102-
case Zero:
103-
dst = newZeroUnPadding(decrypted)
104-
case PKCS5:
105-
dst = newPKCS5UnPadding(decrypted)
106-
case PKCS7:
107-
dst = newPKCS7UnPadding(decrypted)
108-
case AnsiX923:
109-
dst = newAnsiX923UnPadding(decrypted)
110-
case ISO97971:
111-
dst = newISO97971UnPadding(decrypted)
112-
case ISO10126:
113-
dst = newISO10126UnPadding(decrypted)
114-
case ISO78164:
115-
dst = newISO78164UnPadding(decrypted)
116-
case Bit:
117-
dst = newBitUnPadding(decrypted)
118-
}
88+
dst = newUnPadding(c.Padding, decrypted)
11989
return
12090
}

crypto/cipher/cipher_test.go

Lines changed: 0 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -853,40 +853,6 @@ func TestBlockCipher_Decrypt(t *testing.T) {
853853
assert.Nil(t, result)
854854
})
855855

856-
t.Run("decrypt with unknown padding mode", func(t *testing.T) {
857-
cipher := &blockCipher{
858-
Block: CBC,
859-
Padding: PaddingMode("UNKNOWN"), // Unknown padding mode
860-
IV: testIV,
861-
}
862-
863-
block := &mockBlock{
864-
blockSize: 16,
865-
encrypt: func(dst, src []byte) {
866-
// Simple mock encryption: XOR with 0x55
867-
for i := range src {
868-
dst[i] = src[i] ^ 0x55
869-
}
870-
},
871-
decrypt: func(dst, src []byte) {
872-
// Simple mock decryption: XOR with 0x55 (same as encryption for this mock)
873-
for i := range src {
874-
dst[i] = src[i] ^ 0x55
875-
}
876-
},
877-
}
878-
879-
// First encrypt some data
880-
encrypted, err := cipher.Encrypt(testData, block)
881-
assert.NoError(t, err)
882-
assert.NotNil(t, encrypted)
883-
884-
// Decryption should return nil result because padding mode is unknown
885-
result, err := cipher.Decrypt(encrypted, block)
886-
assert.NoError(t, err)
887-
assert.Nil(t, result)
888-
})
889-
890856
t.Run("decrypt with decryption error", func(t *testing.T) {
891857
cipher := &blockCipher{
892858
Block: BlockMode("UNKNOWN"), // Unknown block mode
@@ -974,40 +940,6 @@ func TestBlockCipher_Decrypt(t *testing.T) {
974940
assert.Nil(t, result)
975941
})
976942

977-
t.Run("decrypt with default padding mode", func(t *testing.T) {
978-
cipher := &blockCipher{
979-
Block: CBC,
980-
Padding: PaddingMode(""), // Empty padding mode
981-
IV: testIV,
982-
}
983-
984-
block := &mockBlock{
985-
blockSize: 16,
986-
encrypt: func(dst, src []byte) {
987-
// Simple mock encryption: XOR with 0x55
988-
for i := range src {
989-
dst[i] = src[i] ^ 0x55
990-
}
991-
},
992-
decrypt: func(dst, src []byte) {
993-
// Simple mock decryption: XOR with 0x55 (same as encryption for this mock)
994-
for i := range src {
995-
dst[i] = src[i] ^ 0x55
996-
}
997-
},
998-
}
999-
1000-
// First encrypt some data
1001-
encrypted, err := cipher.Encrypt(testData, block)
1002-
assert.NoError(t, err)
1003-
assert.NotNil(t, encrypted)
1004-
1005-
// Decryption with empty padding mode should return nil without error
1006-
result, err := cipher.Decrypt(encrypted, block)
1007-
assert.NoError(t, err)
1008-
assert.Nil(t, result)
1009-
})
1010-
1011943
t.Run("decrypt with function error", func(t *testing.T) {
1012944
cipher := &blockCipher{
1013945
Block: CBC,

crypto/cipher/padding.go

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,3 +239,49 @@ func newBitPadding(src []byte, blockSize int) []byte {
239239
func newBitUnPadding(src []byte) []byte {
240240
return newISO97971UnPadding(src)
241241
}
242+
243+
// newPadding applies the specified padding mode to the source data.
244+
func newPadding(paddingMode PaddingMode, src []byte, blockSize int) []byte {
245+
switch paddingMode {
246+
case Zero:
247+
return newZeroPadding(src, blockSize)
248+
case PKCS5:
249+
return newPKCS5Padding(src)
250+
case PKCS7:
251+
return newPKCS7Padding(src, blockSize)
252+
case AnsiX923:
253+
return newAnsiX923Padding(src, blockSize)
254+
case ISO97971:
255+
return newISO97971Padding(src, blockSize)
256+
case ISO10126:
257+
return newISO10126Padding(src, blockSize)
258+
case ISO78164:
259+
return newISO78164Padding(src, blockSize)
260+
case Bit:
261+
return newBitPadding(src, blockSize)
262+
}
263+
return src
264+
}
265+
266+
// newUnPadding removes the specified padding mode from the source data.
267+
func newUnPadding(paddingMode PaddingMode, src []byte) []byte {
268+
switch paddingMode {
269+
case Zero:
270+
return newZeroUnPadding(src)
271+
case PKCS5:
272+
return newPKCS5UnPadding(src)
273+
case PKCS7:
274+
return newPKCS7UnPadding(src)
275+
case AnsiX923:
276+
return newAnsiX923UnPadding(src)
277+
case ISO97971:
278+
return newISO97971UnPadding(src)
279+
case ISO10126:
280+
return newISO10126UnPadding(src)
281+
case ISO78164:
282+
return newISO78164UnPadding(src)
283+
case Bit:
284+
return newBitUnPadding(src)
285+
}
286+
return src
287+
}

0 commit comments

Comments
 (0)