|
@@ -14,6 +14,7 @@ package rc2
|
|
import (
|
|
import (
|
|
"crypto/cipher"
|
|
"crypto/cipher"
|
|
"encoding/binary"
|
|
"encoding/binary"
|
|
|
|
+ "math/bits"
|
|
)
|
|
)
|
|
|
|
|
|
// The rc2 block size in bytes
|
|
// The rc2 block size in bytes
|
|
@@ -80,10 +81,6 @@ func expandKey(key []byte, t1 int) [64]uint16 {
|
|
return k
|
|
return k
|
|
}
|
|
}
|
|
|
|
|
|
-func rotl16(x uint16, b uint) uint16 {
|
|
|
|
- return (x >> (16 - b)) | (x << b)
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
func (c *rc2Cipher) Encrypt(dst, src []byte) {
|
|
func (c *rc2Cipher) Encrypt(dst, src []byte) {
|
|
|
|
|
|
r0 := binary.LittleEndian.Uint16(src[0:])
|
|
r0 := binary.LittleEndian.Uint16(src[0:])
|
|
@@ -96,22 +93,22 @@ func (c *rc2Cipher) Encrypt(dst, src []byte) {
|
|
for j <= 16 {
|
|
for j <= 16 {
|
|
// mix r0
|
|
// mix r0
|
|
r0 = r0 + c.k[j] + (r3 & r2) + ((^r3) & r1)
|
|
r0 = r0 + c.k[j] + (r3 & r2) + ((^r3) & r1)
|
|
- r0 = rotl16(r0, 1)
|
|
|
|
|
|
+ r0 = bits.RotateLeft16(r0, 1)
|
|
j++
|
|
j++
|
|
|
|
|
|
// mix r1
|
|
// mix r1
|
|
r1 = r1 + c.k[j] + (r0 & r3) + ((^r0) & r2)
|
|
r1 = r1 + c.k[j] + (r0 & r3) + ((^r0) & r2)
|
|
- r1 = rotl16(r1, 2)
|
|
|
|
|
|
+ r1 = bits.RotateLeft16(r1, 2)
|
|
j++
|
|
j++
|
|
|
|
|
|
// mix r2
|
|
// mix r2
|
|
r2 = r2 + c.k[j] + (r1 & r0) + ((^r1) & r3)
|
|
r2 = r2 + c.k[j] + (r1 & r0) + ((^r1) & r3)
|
|
- r2 = rotl16(r2, 3)
|
|
|
|
|
|
+ r2 = bits.RotateLeft16(r2, 3)
|
|
j++
|
|
j++
|
|
|
|
|
|
// mix r3
|
|
// mix r3
|
|
r3 = r3 + c.k[j] + (r2 & r1) + ((^r2) & r0)
|
|
r3 = r3 + c.k[j] + (r2 & r1) + ((^r2) & r0)
|
|
- r3 = rotl16(r3, 5)
|
|
|
|
|
|
+ r3 = bits.RotateLeft16(r3, 5)
|
|
j++
|
|
j++
|
|
|
|
|
|
}
|
|
}
|
|
@@ -124,22 +121,22 @@ func (c *rc2Cipher) Encrypt(dst, src []byte) {
|
|
for j <= 40 {
|
|
for j <= 40 {
|
|
// mix r0
|
|
// mix r0
|
|
r0 = r0 + c.k[j] + (r3 & r2) + ((^r3) & r1)
|
|
r0 = r0 + c.k[j] + (r3 & r2) + ((^r3) & r1)
|
|
- r0 = rotl16(r0, 1)
|
|
|
|
|
|
+ r0 = bits.RotateLeft16(r0, 1)
|
|
j++
|
|
j++
|
|
|
|
|
|
// mix r1
|
|
// mix r1
|
|
r1 = r1 + c.k[j] + (r0 & r3) + ((^r0) & r2)
|
|
r1 = r1 + c.k[j] + (r0 & r3) + ((^r0) & r2)
|
|
- r1 = rotl16(r1, 2)
|
|
|
|
|
|
+ r1 = bits.RotateLeft16(r1, 2)
|
|
j++
|
|
j++
|
|
|
|
|
|
// mix r2
|
|
// mix r2
|
|
r2 = r2 + c.k[j] + (r1 & r0) + ((^r1) & r3)
|
|
r2 = r2 + c.k[j] + (r1 & r0) + ((^r1) & r3)
|
|
- r2 = rotl16(r2, 3)
|
|
|
|
|
|
+ r2 = bits.RotateLeft16(r2, 3)
|
|
j++
|
|
j++
|
|
|
|
|
|
// mix r3
|
|
// mix r3
|
|
r3 = r3 + c.k[j] + (r2 & r1) + ((^r2) & r0)
|
|
r3 = r3 + c.k[j] + (r2 & r1) + ((^r2) & r0)
|
|
- r3 = rotl16(r3, 5)
|
|
|
|
|
|
+ r3 = bits.RotateLeft16(r3, 5)
|
|
j++
|
|
j++
|
|
|
|
|
|
}
|
|
}
|
|
@@ -152,22 +149,22 @@ func (c *rc2Cipher) Encrypt(dst, src []byte) {
|
|
for j <= 60 {
|
|
for j <= 60 {
|
|
// mix r0
|
|
// mix r0
|
|
r0 = r0 + c.k[j] + (r3 & r2) + ((^r3) & r1)
|
|
r0 = r0 + c.k[j] + (r3 & r2) + ((^r3) & r1)
|
|
- r0 = rotl16(r0, 1)
|
|
|
|
|
|
+ r0 = bits.RotateLeft16(r0, 1)
|
|
j++
|
|
j++
|
|
|
|
|
|
// mix r1
|
|
// mix r1
|
|
r1 = r1 + c.k[j] + (r0 & r3) + ((^r0) & r2)
|
|
r1 = r1 + c.k[j] + (r0 & r3) + ((^r0) & r2)
|
|
- r1 = rotl16(r1, 2)
|
|
|
|
|
|
+ r1 = bits.RotateLeft16(r1, 2)
|
|
j++
|
|
j++
|
|
|
|
|
|
// mix r2
|
|
// mix r2
|
|
r2 = r2 + c.k[j] + (r1 & r0) + ((^r1) & r3)
|
|
r2 = r2 + c.k[j] + (r1 & r0) + ((^r1) & r3)
|
|
- r2 = rotl16(r2, 3)
|
|
|
|
|
|
+ r2 = bits.RotateLeft16(r2, 3)
|
|
j++
|
|
j++
|
|
|
|
|
|
// mix r3
|
|
// mix r3
|
|
r3 = r3 + c.k[j] + (r2 & r1) + ((^r2) & r0)
|
|
r3 = r3 + c.k[j] + (r2 & r1) + ((^r2) & r0)
|
|
- r3 = rotl16(r3, 5)
|
|
|
|
|
|
+ r3 = bits.RotateLeft16(r3, 5)
|
|
j++
|
|
j++
|
|
}
|
|
}
|
|
|
|
|
|
@@ -188,22 +185,22 @@ func (c *rc2Cipher) Decrypt(dst, src []byte) {
|
|
|
|
|
|
for j >= 44 {
|
|
for j >= 44 {
|
|
// unmix r3
|
|
// unmix r3
|
|
- r3 = rotl16(r3, 16-5)
|
|
|
|
|
|
+ r3 = bits.RotateLeft16(r3, 16-5)
|
|
r3 = r3 - c.k[j] - (r2 & r1) - ((^r2) & r0)
|
|
r3 = r3 - c.k[j] - (r2 & r1) - ((^r2) & r0)
|
|
j--
|
|
j--
|
|
|
|
|
|
// unmix r2
|
|
// unmix r2
|
|
- r2 = rotl16(r2, 16-3)
|
|
|
|
|
|
+ r2 = bits.RotateLeft16(r2, 16-3)
|
|
r2 = r2 - c.k[j] - (r1 & r0) - ((^r1) & r3)
|
|
r2 = r2 - c.k[j] - (r1 & r0) - ((^r1) & r3)
|
|
j--
|
|
j--
|
|
|
|
|
|
// unmix r1
|
|
// unmix r1
|
|
- r1 = rotl16(r1, 16-2)
|
|
|
|
|
|
+ r1 = bits.RotateLeft16(r1, 16-2)
|
|
r1 = r1 - c.k[j] - (r0 & r3) - ((^r0) & r2)
|
|
r1 = r1 - c.k[j] - (r0 & r3) - ((^r0) & r2)
|
|
j--
|
|
j--
|
|
|
|
|
|
// unmix r0
|
|
// unmix r0
|
|
- r0 = rotl16(r0, 16-1)
|
|
|
|
|
|
+ r0 = bits.RotateLeft16(r0, 16-1)
|
|
r0 = r0 - c.k[j] - (r3 & r2) - ((^r3) & r1)
|
|
r0 = r0 - c.k[j] - (r3 & r2) - ((^r3) & r1)
|
|
j--
|
|
j--
|
|
}
|
|
}
|
|
@@ -215,22 +212,22 @@ func (c *rc2Cipher) Decrypt(dst, src []byte) {
|
|
|
|
|
|
for j >= 20 {
|
|
for j >= 20 {
|
|
// unmix r3
|
|
// unmix r3
|
|
- r3 = rotl16(r3, 16-5)
|
|
|
|
|
|
+ r3 = bits.RotateLeft16(r3, 16-5)
|
|
r3 = r3 - c.k[j] - (r2 & r1) - ((^r2) & r0)
|
|
r3 = r3 - c.k[j] - (r2 & r1) - ((^r2) & r0)
|
|
j--
|
|
j--
|
|
|
|
|
|
// unmix r2
|
|
// unmix r2
|
|
- r2 = rotl16(r2, 16-3)
|
|
|
|
|
|
+ r2 = bits.RotateLeft16(r2, 16-3)
|
|
r2 = r2 - c.k[j] - (r1 & r0) - ((^r1) & r3)
|
|
r2 = r2 - c.k[j] - (r1 & r0) - ((^r1) & r3)
|
|
j--
|
|
j--
|
|
|
|
|
|
// unmix r1
|
|
// unmix r1
|
|
- r1 = rotl16(r1, 16-2)
|
|
|
|
|
|
+ r1 = bits.RotateLeft16(r1, 16-2)
|
|
r1 = r1 - c.k[j] - (r0 & r3) - ((^r0) & r2)
|
|
r1 = r1 - c.k[j] - (r0 & r3) - ((^r0) & r2)
|
|
j--
|
|
j--
|
|
|
|
|
|
// unmix r0
|
|
// unmix r0
|
|
- r0 = rotl16(r0, 16-1)
|
|
|
|
|
|
+ r0 = bits.RotateLeft16(r0, 16-1)
|
|
r0 = r0 - c.k[j] - (r3 & r2) - ((^r3) & r1)
|
|
r0 = r0 - c.k[j] - (r3 & r2) - ((^r3) & r1)
|
|
j--
|
|
j--
|
|
|
|
|
|
@@ -243,22 +240,22 @@ func (c *rc2Cipher) Decrypt(dst, src []byte) {
|
|
|
|
|
|
for j >= 0 {
|
|
for j >= 0 {
|
|
// unmix r3
|
|
// unmix r3
|
|
- r3 = rotl16(r3, 16-5)
|
|
|
|
|
|
+ r3 = bits.RotateLeft16(r3, 16-5)
|
|
r3 = r3 - c.k[j] - (r2 & r1) - ((^r2) & r0)
|
|
r3 = r3 - c.k[j] - (r2 & r1) - ((^r2) & r0)
|
|
j--
|
|
j--
|
|
|
|
|
|
// unmix r2
|
|
// unmix r2
|
|
- r2 = rotl16(r2, 16-3)
|
|
|
|
|
|
+ r2 = bits.RotateLeft16(r2, 16-3)
|
|
r2 = r2 - c.k[j] - (r1 & r0) - ((^r1) & r3)
|
|
r2 = r2 - c.k[j] - (r1 & r0) - ((^r1) & r3)
|
|
j--
|
|
j--
|
|
|
|
|
|
// unmix r1
|
|
// unmix r1
|
|
- r1 = rotl16(r1, 16-2)
|
|
|
|
|
|
+ r1 = bits.RotateLeft16(r1, 16-2)
|
|
r1 = r1 - c.k[j] - (r0 & r3) - ((^r0) & r2)
|
|
r1 = r1 - c.k[j] - (r0 & r3) - ((^r0) & r2)
|
|
j--
|
|
j--
|
|
|
|
|
|
// unmix r0
|
|
// unmix r0
|
|
- r0 = rotl16(r0, 16-1)
|
|
|
|
|
|
+ r0 = bits.RotateLeft16(r0, 16-1)
|
|
r0 = r0 - c.k[j] - (r3 & r2) - ((^r3) & r1)
|
|
r0 = r0 - c.k[j] - (r3 & r2) - ((^r3) & r1)
|
|
j--
|
|
j--
|
|
|
|
|