Files
swift-mirror/utils/benchmark/RC4/RC4.swift
Nadav Rotem c9d9b530a5 Update the tests to make them compile
Swift SVN r19096
2014-06-23 19:31:04 +00:00

85 lines
1.7 KiB
Swift

@asmname("mach_absolute_time") func __mach_absolute_time__() -> UInt64
struct RC4 {
var State : UInt8[]
var I : UInt8 = 0
var J : UInt8 = 0
init() {
State = new UInt8[256]
}
mutating
func initialize(Key: UInt8[]) {
for (var i = 0; i < 256; i++) {
State[i] = UInt8(i)
}
var j : UInt8 = 0
for (var i = 0; i < 256; i++) {
var K : UInt8 = Key[i % Key.count]
var S : UInt8 = State[i]
j = j &+ S &+ K
swapByIndex(i, y: Int(j))
}
}
mutating
func swapByIndex(x: Int, y: Int) {
let T1 : UInt8 = State[x]
let T2 : UInt8 = State[y]
State[x] = T2
State[y] = T1
}
mutating
func next() -> UInt8 {
I = I &+ 1
J = J &+ State[Int(I)]
swapByIndex(Int(I), y: Int(J))
return State[Int(State[Int(I)] &+ State[Int(J)]) & 0xFF]
}
mutating
func encrypt(inout Data: UInt8[]) {
var cnt = Data.count
for (var i = 0; i < cnt; i++) {
Data[i] = Data[i] ^ next()
}
}
}
func benchRC4_internal(messageLen : Int, iterations : Int) {
let Secret = "This is my secret message"
let Key = "This is my key"
let SecretData : UInt8[] = Array(Secret.utf8)
let KeyData : UInt8[] = Array(Key.utf8)
var LongData : UInt8[] = new UInt8[messageLen]
// Generate a long message.
for (var i = 0; i < messageLen; i++) {
LongData[i] = SecretData[i % SecretData.count]
}
var Enc = RC4()
Enc.initialize(KeyData)
let start = __mach_absolute_time__()
for (var i = 0; i < iterations; i++) {
Enc.encrypt(&LongData)
}
let delta = __mach_absolute_time__() - start
println("\(delta) nanoseconds. \(LongData[0])")
println("\(Double(delta) / Double(iterations)) nanoseconds/lap")
}
func benchRC4() {
benchRC4_internal(5000, 100000)
}
benchRC4()