mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
85 lines
1.7 KiB
Swift
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()
|