PhytonUtils/encryption/borlandrand.go

58 lines
1.6 KiB
Go

package encryption
import (
"encoding/binary"
)
// BorlandRandMultiplier 22695477
const BorlandRandMultiplier uint32 = 0x015A4E35
const BorlandRandAddend uint32 = 1
const BorlandRandOutputShift = 16
const BorlandRandOutputMask uint32 = 0x7FFF
const BorlandRandModulus = 0xFFFFFFFF
// BorlandRandMultiplierInverse Calculated using math.ModularMultiplicativeInverseFixed(uint32(BorlandRandMultiplier))
const BorlandRandMultiplierInverse uint32 = 0x2925141D
// BorlandRand Borland C++ rand()
func BorlandRand(seed uint32) (newSeed uint32, output uint16) {
newSeed = BorlandRandNextSeed(seed)
return newSeed, BorlandRandOutput(newSeed)
}
func BorlandRandOutput(seed uint32) uint16 {
return uint16(seed>>BorlandRandOutputShift) & uint16(BorlandRandOutputMask)
}
func BorlandRandNextSeed(seed uint32) uint32 {
return (seed*BorlandRandMultiplier + BorlandRandAddend) & BorlandRandModulus
}
func BorlandRandPreviousSeed(seed uint32) uint32 {
return ((seed - BorlandRandAddend) * BorlandRandMultiplierInverse) & BorlandRandModulus
}
func BorlandRandXORBytes(src, dst []byte, seed uint32) (newSeed uint32) {
_ = dst[len(src)-1]
var output uint16
for i := range src {
seed, output = BorlandRand(seed)
dst[i] = src[i] ^ byte(output)
}
return seed
}
func BorlandRandXORInPlace(data []byte, seed uint32) (newSeed uint32) {
return BorlandRandXORBytes(data, data, seed)
}
func BorlandRandXORUint32(value, seed uint32) (newValue, newSeed uint32) {
var buf [4]byte
binary.LittleEndian.PutUint32(buf[:], value)
newSeed = BorlandRandXORInPlace(buf[:], seed)
return binary.LittleEndian.Uint32(buf[:]), newSeed
}