Actually make Padding work
This commit is contained in:
parent
c537f79ccc
commit
a683caaf76
2 changed files with 31 additions and 14 deletions
29
crypto.go
29
crypto.go
|
@ -43,7 +43,7 @@ func DecryptAndVerify(input []byte, key *rsa.PrivateKey, pub *rsa.PublicKey, sig
|
||||||
body := make([]byte, len(encBody))
|
body := make([]byte, len(encBody))
|
||||||
dec := cipher2.NewCBCDecrypter(cipher, iv)
|
dec := cipher2.NewCBCDecrypter(cipher, iv)
|
||||||
dec.CryptBlocks(body, encBody)
|
dec.CryptBlocks(body, encBody)
|
||||||
err = json.Unmarshal(unpad(body), v)
|
err = json.Unmarshal(Unpad(body), v)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -112,16 +112,16 @@ func EncryptAndSign(v interface{}, key *rsa.PrivateKey, pub *rsa.PublicKey, sign
|
||||||
enc := cipher2.NewCBCEncrypter(cipher, iv)
|
enc := cipher2.NewCBCEncrypter(cipher, iv)
|
||||||
enc.CryptBlocks(encBody, body)
|
enc.CryptBlocks(encBody, body)
|
||||||
|
|
||||||
copy(pad(encBody), encBody[len(encBody):])
|
copy(encBody[len(encBody):], Pad(encBody))
|
||||||
writer.Write([]byte(hex.EncodeToString(encBody)))
|
writer.Write([]byte(hex.EncodeToString(encBody)))
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func pad(body []byte) []byte {
|
func Pad(body []byte) []byte {
|
||||||
rest := len(body) % 8
|
rest := len(body) % 8
|
||||||
if rest == 0 {
|
if rest == 0 {
|
||||||
padLen := getPad(body)
|
padLen := GetPad(body)
|
||||||
if padLen != 0 {
|
if padLen != 0 {
|
||||||
return []byte{8, 8, 8, 8, 8, 8, 8, 8}
|
return []byte{8, 8, 8, 8, 8, 8, 8, 8}
|
||||||
}
|
}
|
||||||
|
@ -129,36 +129,37 @@ func pad(body []byte) []byte {
|
||||||
return []byte{}
|
return []byte{}
|
||||||
}
|
}
|
||||||
|
|
||||||
pad := make([]byte, rest)
|
padLen := 8 - rest
|
||||||
|
pad := make([]byte, padLen)
|
||||||
|
|
||||||
for i := 0; i < rest; i++ {
|
for i := 0; i < padLen; i++ {
|
||||||
pad[i] = byte(rest)
|
pad[i] = byte(padLen)
|
||||||
}
|
}
|
||||||
|
|
||||||
return pad
|
return pad
|
||||||
}
|
}
|
||||||
|
|
||||||
func getPad(body []byte) int {
|
func GetPad(body []byte) int {
|
||||||
lastIndex := len(body) - 1
|
lastIndex := len(body) - 1
|
||||||
padLen := body[lastIndex]
|
padLen := int(body[lastIndex])
|
||||||
if 1 < padLen && padLen < 9 {
|
if 1 < padLen && padLen < 9 {
|
||||||
isPadding := true
|
isPadding := true
|
||||||
|
|
||||||
for i := byte(0); i < padLen; i++ {
|
for i := 0; i < padLen; i++ {
|
||||||
if body[-i] != padLen {
|
if body[lastIndex-i] != byte(padLen) {
|
||||||
isPadding = false
|
isPadding = false
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if isPadding {
|
if isPadding {
|
||||||
return int(padLen)
|
return padLen
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
func unpad(body []byte) []byte {
|
func Unpad(body []byte) []byte {
|
||||||
return body[:len(body)-getPad(body)]
|
return body[:len(body)-GetPad(body)]
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,6 +8,22 @@ import (
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func TestPadding(t *testing.T) {
|
||||||
|
x := []byte{0, 0, 0}
|
||||||
|
x = append(x, service.Pad(x)...)
|
||||||
|
|
||||||
|
padLen := service.GetPad(x)
|
||||||
|
|
||||||
|
if padLen != 5 {
|
||||||
|
t.Errorf("Failed adding/measuring padding, Pad(%v, len=%d)", x, padLen)
|
||||||
|
}
|
||||||
|
|
||||||
|
y := service.Unpad(x)
|
||||||
|
if len(y) != 3 {
|
||||||
|
t.Errorf("Failed padding and unpadding, Pad(%v), Unpad(%v)", x, y)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestSingleRound(t *testing.T) {
|
func TestSingleRound(t *testing.T) {
|
||||||
keyA, _ := rsa.GenerateKey(rand.Reader, 4096)
|
keyA, _ := rsa.GenerateKey(rand.Reader, 4096)
|
||||||
keyB, _ := rsa.GenerateKey(rand.Reader, 4096)
|
keyB, _ := rsa.GenerateKey(rand.Reader, 4096)
|
||||||
|
|
Loading…
Reference in a new issue