diff --git a/Sources/CryptoKitten/MD5.swift b/Sources/CryptoKitten/MD5.swift index 08a231c..b67687d 100644 --- a/Sources/CryptoKitten/MD5.swift +++ b/Sources/CryptoKitten/MD5.swift @@ -32,7 +32,11 @@ fileprivate let k: [UInt32] = [ 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, fileprivate let chunkSize = 64 public final class MD5 : Hash { - public static let littleEndian = true + #if arch(s390x) + public static let littleEndian = false + #else + public static let littleEndian = true + #endif public static let chunkSize = 64 public static let digestSize = 16 @@ -76,7 +80,11 @@ public final class MD5 : Hash { buffer.reserveCapacity(16) func convert(_ int: UInt32) -> [UInt8] { - let int = int.littleEndian + #if arch(s390x) + let int = int.bigEndian + #else + let int = int.littleEndian + #endif return [ UInt8(int & 0xff), UInt8((int >> 8) & 0xff), @@ -115,7 +123,11 @@ public final class MD5 : Hash { g = (7 &* i) % 16 } - Mg = pointer.advanced(by: g << 2).withMemoryRebound(to: UInt32.self, capacity: 1, { $0.pointee }) + #if arch(s390x) + Mg = UInt32(littleEndian: pointer.advanced(by: g << 2).withMemoryRebound(to: UInt32.self, capacity: 1, { $0.pointee })) + #else + Mg = pointer.advanced(by: g << 2).withMemoryRebound(to: UInt32.self, capacity: 1, { $0.pointee }) + #endif F = F &+ a1 &+ k[i] &+ Mg a1 = d1 diff --git a/Sources/CryptoKitten/SHA1.swift b/Sources/CryptoKitten/SHA1.swift index ac5144c..f9a2e1b 100644 --- a/Sources/CryptoKitten/SHA1.swift +++ b/Sources/CryptoKitten/SHA1.swift @@ -1,7 +1,11 @@ public final class SHA1 : Hash { public static let digestSize = 20 public static let chunkSize = 64 - public static let littleEndian = false + #if arch(s390x) + public static let littleEndian = true + #else + public static let littleEndian = false + #endif var h0: UInt32 = 0x67452301 var h1: UInt32 = 0xEFCDAB89 @@ -40,7 +44,11 @@ public final class SHA1 : Hash { buffer.reserveCapacity(20) func convert(_ int: UInt32) -> [UInt8] { - let int = int.bigEndian + #if arch(s390x) + let int = int.littleEndian + #else + let int = int.bigEndian + #endif return [ UInt8(int & 0xff), UInt8((int >> 8) & 0xff), @@ -61,14 +69,22 @@ public final class SHA1 : Hash { public init() {} public func update(pointer: UnsafePointer) { - var w = pointer.withMemoryRebound(to: UInt32.self, capacity: 16, { pointer in - return [ - pointer[0].bigEndian, pointer[1].bigEndian, pointer[2].bigEndian, pointer[3].bigEndian, - pointer[4].bigEndian, pointer[5].bigEndian, pointer[6].bigEndian, pointer[7].bigEndian, - pointer[8].bigEndian, pointer[9].bigEndian, pointer[10].bigEndian, pointer[11].bigEndian, - pointer[12].bigEndian, pointer[13].bigEndian, pointer[14].bigEndian, pointer[15].bigEndian, - ] - }) + #if arch(s390x) + var w : [UInt32] = [] + w.reserveCapacity(16) + for index in stride(from: 0, to: 64, by: 4) { + w.append(UInt32(bigEndian: pointer.advanced(by: index).withMemoryRebound(to: UInt32.self, capacity: 1, { $0.pointee }))) + } + #else + var w = pointer.withMemoryRebound(to: UInt32.self, capacity: 16, { pointer in + return [ + pointer[0].bigEndian, pointer[1].bigEndian, pointer[2].bigEndian, pointer[3].bigEndian, + pointer[4].bigEndian, pointer[5].bigEndian, pointer[6].bigEndian, pointer[7].bigEndian, + pointer[8].bigEndian, pointer[9].bigEndian, pointer[10].bigEndian, pointer[11].bigEndian, + pointer[12].bigEndian, pointer[13].bigEndian, pointer[14].bigEndian, pointer[15].bigEndian, + ] + }) + #endif w.reserveCapacity(80) diff --git a/Sources/CryptoKitten/SHA2_32Base.swift b/Sources/CryptoKitten/SHA2_32Base.swift index 088c515..c88747e 100644 --- a/Sources/CryptoKitten/SHA2_32Base.swift +++ b/Sources/CryptoKitten/SHA2_32Base.swift @@ -29,14 +29,22 @@ internal protocol SHA2_32 : Hash { extension SHA2_32 { public func update(pointer: UnsafePointer) { - var w = pointer.withMemoryRebound(to: UInt32.self, capacity: 16, { pointer in - return [ - pointer[0].bigEndian, pointer[1].bigEndian, pointer[2].bigEndian, pointer[3].bigEndian, - pointer[4].bigEndian, pointer[5].bigEndian, pointer[6].bigEndian, pointer[7].bigEndian, - pointer[8].bigEndian, pointer[9].bigEndian, pointer[10].bigEndian, pointer[11].bigEndian, - pointer[12].bigEndian, pointer[13].bigEndian, pointer[14].bigEndian, pointer[15].bigEndian, - ] - }) + #if arch(s390x) + var w : [UInt32] = [] + w.reserveCapacity(16) + for index in stride(from: 0, to: 64, by: 4) { + w.append(UInt32(bigEndian: pointer.advanced(by: index).withMemoryRebound(to: UInt32.self, capacity: 1, { $0.pointee }))) + } + #else + var w = pointer.withMemoryRebound(to: UInt32.self, capacity: 16, { pointer in + return [ + pointer[0].bigEndian, pointer[1].bigEndian, pointer[2].bigEndian, pointer[3].bigEndian, + pointer[4].bigEndian, pointer[5].bigEndian, pointer[6].bigEndian, pointer[7].bigEndian, + pointer[8].bigEndian, pointer[9].bigEndian, pointer[10].bigEndian, pointer[11].bigEndian, + pointer[12].bigEndian, pointer[13].bigEndian, pointer[14].bigEndian, pointer[15].bigEndian, + ] + }) + #endif w.reserveCapacity(64) diff --git a/Sources/CryptoKitten/SHA2_32Implementations.swift b/Sources/CryptoKitten/SHA2_32Implementations.swift index 2edb17b..35af27e 100644 --- a/Sources/CryptoKitten/SHA2_32Implementations.swift +++ b/Sources/CryptoKitten/SHA2_32Implementations.swift @@ -1,5 +1,9 @@ public final class SHA256 : SHA2_32 { - public static let littleEndian = false + #if arch(s390x) + public static let littleEndian = true + #else + public static let littleEndian = false + #endif public static let digestSize = 32 public static let chunkSize = 64 @@ -16,7 +20,11 @@ public final class SHA256 : SHA2_32 { buffer.reserveCapacity(32) func convert(_ int: UInt32) -> [UInt8] { - let int = int.bigEndian + #if arch(s390x) + let int = int.littleEndian + #else + let int = int.bigEndian + #endif return [ UInt8(int & 0xff), UInt8((int >> 8) & 0xff), @@ -70,7 +78,11 @@ public final class SHA256 : SHA2_32 { } public final class SHA224 : SHA2_32 { - public static let littleEndian = false + #if arch(s390x) + public static let littleEndian = true + #else + public static let littleEndian = false + #endif public static let digestSize = 28 public static let chunkSize = 64 @@ -98,7 +110,11 @@ public final class SHA224 : SHA2_32 { buffer.reserveCapacity(28) func convert(_ int: UInt32) -> [UInt8] { - let int = int.bigEndian + #if arch(s390x) + let int = int.littleEndian + #else + let int = int.bigEndian + #endif return [ UInt8(int & 0xff), UInt8((int >> 8) & 0xff), diff --git a/Sources/CryptoKitten/SHA2_64Base.swift b/Sources/CryptoKitten/SHA2_64Base.swift index ddf9315..af9631d 100644 --- a/Sources/CryptoKitten/SHA2_64Base.swift +++ b/Sources/CryptoKitten/SHA2_64Base.swift @@ -37,14 +37,22 @@ internal protocol SHA2_64 : Hash { extension SHA2_64 { public func update(pointer: UnsafePointer) { - var w = pointer.withMemoryRebound(to: UInt64.self, capacity: 16, { pointer in - return [ - pointer[0].bigEndian, pointer[1].bigEndian, pointer[2].bigEndian, pointer[3].bigEndian, - pointer[4].bigEndian, pointer[5].bigEndian, pointer[6].bigEndian, pointer[7].bigEndian, - pointer[8].bigEndian, pointer[9].bigEndian, pointer[10].bigEndian, pointer[11].bigEndian, - pointer[12].bigEndian, pointer[13].bigEndian, pointer[14].bigEndian, pointer[15].bigEndian, - ] - }) + #if arch(s390x) + var w : [UInt64] = [] + w.reserveCapacity(16) + for index in stride(from: 0, to: 128, by: 8) { + w.append(UInt64(bigEndian: pointer.advanced(by: index).withMemoryRebound(to: UInt64.self, capacity: 1, { $0.pointee }))) + } + #else + var w = pointer.withMemoryRebound(to: UInt64.self, capacity: 16, { pointer in + return [ + pointer[0].bigEndian, pointer[1].bigEndian, pointer[2].bigEndian, pointer[3].bigEndian, + pointer[4].bigEndian, pointer[5].bigEndian, pointer[6].bigEndian, pointer[7].bigEndian, + pointer[8].bigEndian, pointer[9].bigEndian, pointer[10].bigEndian, pointer[11].bigEndian, + pointer[12].bigEndian, pointer[13].bigEndian, pointer[14].bigEndian, pointer[15].bigEndian, + ] + }) + #endif w.reserveCapacity(64) diff --git a/Sources/CryptoKitten/SHA2_64Implementations.swift b/Sources/CryptoKitten/SHA2_64Implementations.swift index a2efefc..7ab10fe 100644 --- a/Sources/CryptoKitten/SHA2_64Implementations.swift +++ b/Sources/CryptoKitten/SHA2_64Implementations.swift @@ -1,5 +1,9 @@ public final class SHA512 : SHA2_64 { - public static let littleEndian = false + #if arch(s390x) + public static let littleEndian = true + #else + public static let littleEndian = false + #endif public static let digestSize = 64 public static let chunkSize = 128 @@ -16,7 +20,11 @@ public final class SHA512 : SHA2_64 { buffer.reserveCapacity(32) func convert(_ int: UInt64) -> [UInt8] { - let int = int.bigEndian + #if arch(s390x) + let int = int.littleEndian + #else + let int = int.bigEndian + #endif return [ UInt8(int & 0xff), UInt8((int >> 8) & 0xff), @@ -75,7 +83,11 @@ public final class SHA512 : SHA2_64 { public final class SHA384: SHA2_64 { - public static let littleEndian = false + #if arch(s390x) + public static let littleEndian = true + #else + public static let littleEndian = false + #endif public static let digestSize = 48 public static let chunkSize = 128 @@ -92,7 +104,11 @@ public final class SHA384: SHA2_64 { buffer.reserveCapacity(32) func convert(_ int: UInt64) -> [UInt8] { - let int = int.bigEndian + #if arch(s390x) + let int = int.littleEndian + #else + let int = int.bigEndian + #endif return [ UInt8(int & 0xff), UInt8((int >> 8) & 0xff),