//===--- RC4.swift --------------------------------------------------------===// // // This source file is part of the Swift.org open source project // // Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors // Licensed under Apache License v2.0 with Runtime Library Exception // // See https://swift.org/LICENSE.txt for license information // See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors // //===----------------------------------------------------------------------===// // This test is based on util/benchmarks/RC4, with modifications // for performance measuring. import TestsUtils public let RC4Test = BenchmarkInfo( name: "RC4", runFunction: run_RC4, tags: [.validation, .algorithm]) struct RC4 { var State : [UInt8] var I: UInt8 = 0 var J: UInt8 = 0 init() { State = [UInt8](repeating: 0, count: 256) } mutating func initialize(_ Key: [UInt8]) { for i in 0..<256 { State[i] = UInt8(i) } var j: UInt8 = 0 for i in 0..<256 { let K : UInt8 = Key[i % Key.count] let 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(_ Data: inout [UInt8]) { let cnt = Data.count for i in 0..