package des
import (
)
func ( []uint64, , []byte, bool) {
:= binary.BigEndian.Uint64()
= permuteInitialBlock()
, := uint32(>>32), uint32()
= ( << 1) | ( >> 31)
= ( << 1) | ( >> 31)
if {
for := 0; < 8; ++ {
, = feistel(, , [15-2*], [15-(2*+1)])
}
} else {
for := 0; < 8; ++ {
, = feistel(, , [2*], [2*+1])
}
}
= ( << 31) | ( >> 1)
= ( << 31) | ( >> 1)
:= (uint64() << 32) | uint64()
binary.BigEndian.PutUint64(, permuteFinalBlock())
}
func ( []uint64, , []byte) {
cryptBlock(, , , false)
}
func ( []uint64, , []byte) {
cryptBlock(, , , true)
}
func (, uint32, , uint64) (, uint32) {
var uint32
= ^ uint32(>>32)
^= feistelBox[7][&0x3f] ^
feistelBox[5][(>>8)&0x3f] ^
feistelBox[3][(>>16)&0x3f] ^
feistelBox[1][(>>24)&0x3f]
= (( << 28) | ( >> 4)) ^ uint32()
^= feistelBox[6][()&0x3f] ^
feistelBox[4][(>>8)&0x3f] ^
feistelBox[2][(>>16)&0x3f] ^
feistelBox[0][(>>24)&0x3f]
= ^ uint32(>>32)
^= feistelBox[7][&0x3f] ^
feistelBox[5][(>>8)&0x3f] ^
feistelBox[3][(>>16)&0x3f] ^
feistelBox[1][(>>24)&0x3f]
= (( << 28) | ( >> 4)) ^ uint32()
^= feistelBox[6][()&0x3f] ^
feistelBox[4][(>>8)&0x3f] ^
feistelBox[2][(>>16)&0x3f] ^
feistelBox[0][(>>24)&0x3f]
return ,
}
var feistelBox [8][64]uint32
var feistelBoxOnce sync.Once
func ( uint64, []uint8) ( uint64) {
for , := range {
:= ( >> ) & 1
|= << uint((len()-1)-)
}
return
}
func () {
for := range sBoxes {
for := 0; < 4; ++ {
for := 0; < 16; ++ {
:= uint64(sBoxes[][][]) << (4 * (7 - uint()))
= permuteBlock(, permutationFunction[:])
:= uint8((( & 2) << 4) | &1)
:= uint8( << 1)
:= |
= ( << 1) | ( >> 31)
feistelBox[][] = uint32()
}
}
}
}
func ( uint64) uint64 {
:= >> 48
:= << 48
^= ^ ^ <<48 ^ >>48
= >> 32 & 0xff00ff
= ( & 0xff00ff00)
^= <<32 ^ ^ <<8 ^ <<24
= & 0x0f0f00000f0f0000
= & 0x0000f0f00000f0f0
^= ^ ^ >>12 ^ <<12
= & 0x3300330033003300
= & 0x00cc00cc00cc00cc
^= ^ ^ >>6 ^ <<6
= & 0xaaaaaaaa55555555
^= ^ >>33 ^ <<33
return
}
func ( uint64) uint64 {
:= & 0xaaaaaaaa55555555
^= ^ >>33 ^ <<33
= & 0x3300330033003300
:= & 0x00cc00cc00cc00cc
^= ^ ^ >>6 ^ <<6
= & 0x0f0f00000f0f0000
= & 0x0000f0f00000f0f0
^= ^ ^ >>12 ^ <<12
= >> 32 & 0xff00ff
= ( & 0xff00ff00)
^= <<32 ^ ^ <<8 ^ <<24
= >> 48
= << 48
^= ^ ^ <<48 ^ >>48
return
}
func ( uint32) ( []uint32) {
= make([]uint32, 16)
:=
for := 0; < 16; ++ {
:= ( << (4 + ksRotations[])) >> 4
:= ( << 4) >> (32 - ksRotations[])
[] = |
= []
}
return
}
func ( *desCipher) ( []byte) {
feistelBoxOnce.Do(initFeistelBox)
:= binary.BigEndian.Uint64()
:= permuteBlock(, permutedChoice1[:])
:= ksRotate(uint32( >> 28))
:= ksRotate(uint32(<<4) >> 4)
for := 0; < 16; ++ {
:= uint64([])<<28 | uint64([])
.subkeys[] = unpack(permuteBlock(, permutedChoice2[:]))
}
}
func ( uint64) uint64 {
var uint64
= ((>>(6*1))&0xff)<<(8*0) |
((>>(6*3))&0xff)<<(8*1) |
((>>(6*5))&0xff)<<(8*2) |
((>>(6*7))&0xff)<<(8*3) |
((>>(6*0))&0xff)<<(8*4) |
((>>(6*2))&0xff)<<(8*5) |
((>>(6*4))&0xff)<<(8*6) |
((>>(6*6))&0xff)<<(8*7)
return
}