| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- //
- // Utils.swift
- // CryptoSwift
- //
- // Created by Marcin Krzyzanowski on 26/08/14.
- // Copyright (c) 2014 Marcin Krzyzanowski. All rights reserved.
- //
- func rotateLeft(_ value:UInt8, by:UInt8) -> UInt8 {
- return ((value << by) & 0xFF) | (value >> (8 - by))
- }
- func rotateLeft(_ value:UInt16, by:UInt16) -> UInt16 {
- return ((value << by) & 0xFFFF) | (value >> (16 - by))
- }
- func rotateLeft(_ value:UInt32, by:UInt32) -> UInt32 {
- return ((value << by) & 0xFFFFFFFF) | (value >> (32 - by))
- }
- func rotateLeft(_ value:UInt64, by:UInt64) -> UInt64 {
- return (value << by) | (value >> (64 - by))
- }
- func rotateRight(_ value:UInt16, by:UInt16) -> UInt16 {
- return (value >> by) | (value << (16 - by))
- }
- func rotateRight(_ value:UInt32, by:UInt32) -> UInt32 {
- return (value >> by) | (value << (32 - by))
- }
- func rotateRight(_ value:UInt64, by:UInt64) -> UInt64 {
- return ((value >> by) | (value << (64 - by)))
- }
- func reversed(_ uint8 : UInt8) -> UInt8 {
- var v = uint8
- v = (v & 0xF0) >> 4 | (v & 0x0F) << 4
- v = (v & 0xCC) >> 2 | (v & 0x33) << 2
- v = (v & 0xAA) >> 1 | (v & 0x55) << 1
- return v
- }
- func reversed(_ uint32 : UInt32) -> UInt32 {
- var v = uint32
- v = ((v >> 1) & 0x55555555) | ((v & 0x55555555) << 1)
- v = ((v >> 2) & 0x33333333) | ((v & 0x33333333) << 2)
- v = ((v >> 4) & 0x0f0f0f0f) | ((v & 0x0f0f0f0f) << 4)
- v = ((v >> 8) & 0x00ff00ff) | ((v & 0x00ff00ff) << 8)
- v = ((v >> 16) & 0xffff) | ((v & 0xffff) << 16)
- return v
- }
- func xor(_ a: Array<UInt8>, _ b:Array<UInt8>) -> Array<UInt8> {
- var xored = Array<UInt8>(repeating: 0, count: min(a.count, b.count))
- for i in 0..<xored.count {
- xored[i] = a[i] ^ b[i]
- }
- return xored
- }
- /**
- ISO/IEC 9797-1 Padding method 2.
- Add a single bit with value 1 to the end of the data.
- If necessary add bits with value 0 to the end of the data until the padded data is a multiple of blockSize.
- - parameters:
- - blockSize: Padding size in bytes.
- - allowance: Excluded trailing number of bytes.
- */
- func bitPadding(to data: Array<UInt8>, blockSize: Int, allowance: Int = 0) -> Array<UInt8> {
- var tmp = data
- // Step 1. Append Padding Bits
- tmp.append(0x80) // append one bit (UInt8 with one bit) to message
- // append "0" bit until message length in bits ≡ 448 (mod 512)
- var msgLength = tmp.count
- var counter = 0
- while msgLength % blockSize != (blockSize - allowance) {
- counter += 1
- msgLength += 1
- }
- tmp += Array<UInt8>(repeating: 0, count: counter)
- return tmp
- }
|