Skip to content

Commit

Permalink
Merge pull request #134 from eJamesLin/feature/ExtractDigestAlgorithm
Browse files Browse the repository at this point in the history
Extract common digest algorithm logic
  • Loading branch information
onevcat committed Jan 24, 2020
2 parents 381bba9 + 384f7d9 commit 4a14de8
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 40 deletions.
30 changes: 10 additions & 20 deletions LineSDK/LineSDK/Crypto/Algorithms/ECDSA.swift
Original file line number Diff line number Diff line change
Expand Up @@ -55,16 +55,6 @@ extension ECDSA {

case sha1, sha224, sha256, sha384, sha512

var length: CC_LONG {
switch self {
case .sha1: return CC_LONG(CC_SHA1_DIGEST_LENGTH)
case .sha224: return CC_LONG(CC_SHA224_DIGEST_LENGTH)
case .sha256: return CC_LONG(CC_SHA256_DIGEST_LENGTH)
case .sha384: return CC_LONG(CC_SHA384_DIGEST_LENGTH)
case .sha512: return CC_LONG(CC_SHA512_DIGEST_LENGTH)
}
}

var signatureAlgorithm: SecKeyAlgorithm {
switch self {
case .sha1: return .ecdsaSignatureMessageX962SHA1
Expand All @@ -74,20 +64,20 @@ extension ECDSA {
case .sha512: return .ecdsaSignatureMessageX962SHA512
}
}

var digestAlgorithm: DigestAlgorithm {
switch self {
case .sha1: return .sha1
case .sha224: return .sha224
case .sha256: return .sha256
case .sha384: return .sha384
case .sha512: return .sha384
}
}

var encryptionAlgorithm: SecKeyAlgorithm {
Log.fatalError("ECDSA should be only used for signing purpose.")
}

var digest: CryptoDigest {
switch self {
case .sha1: return CC_SHA1
case .sha224: return CC_SHA224
case .sha256: return CC_SHA256
case .sha384: return CC_SHA384
case .sha512: return CC_SHA512
}
}

func convertSignatureData(_ data: Data) throws -> Data {

Expand Down
30 changes: 10 additions & 20 deletions LineSDK/LineSDK/Crypto/Algorithms/RSA.swift
Original file line number Diff line number Diff line change
Expand Up @@ -30,16 +30,6 @@ extension RSA {
enum Algorithm: CryptoAlgorithm {
case sha1, sha224, sha256, sha384, sha512

var length: CC_LONG {
switch self {
case .sha1: return CC_LONG(CC_SHA1_DIGEST_LENGTH)
case .sha224: return CC_LONG(CC_SHA224_DIGEST_LENGTH)
case .sha256: return CC_LONG(CC_SHA256_DIGEST_LENGTH)
case .sha384: return CC_LONG(CC_SHA384_DIGEST_LENGTH)
case .sha512: return CC_LONG(CC_SHA512_DIGEST_LENGTH)
}
}

var signatureAlgorithm: SecKeyAlgorithm {
switch self {
case .sha1: return .rsaSignatureMessagePKCS1v15SHA1
Expand All @@ -49,6 +39,16 @@ extension RSA {
case .sha512: return .rsaSignatureMessagePKCS1v15SHA512
}
}

var digestAlgorithm: DigestAlgorithm {
switch self {
case .sha1: return .sha1
case .sha224: return .sha224
case .sha256: return .sha256
case .sha384: return .sha384
case .sha512: return .sha384
}
}

var encryptionAlgorithm: SecKeyAlgorithm {
switch self {
Expand All @@ -59,15 +59,5 @@ extension RSA {
case .sha512: return .rsaEncryptionOAEPSHA512AESGCM
}
}

var digest: CryptoDigest {
switch self {
case .sha1: return CC_SHA1
case .sha224: return CC_SHA224
case .sha256: return CC_SHA256
case .sha384: return CC_SHA384
case .sha512: return CC_SHA512
}
}
}
}
31 changes: 31 additions & 0 deletions LineSDK/LineSDK/Crypto/CryptoAlgorithm.swift
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ typealias CryptoDigest = (

/// Represents an algorithm used in cryptography.
protocol CryptoAlgorithm {
var digestAlgorithm: DigestAlgorithm { get }
var length: CC_LONG { get }
var signatureAlgorithm: SecKeyAlgorithm { get }
var encryptionAlgorithm: SecKeyAlgorithm { get }
Expand All @@ -38,6 +39,8 @@ protocol CryptoAlgorithm {
}

extension CryptoAlgorithm {
var length: CC_LONG { return digestAlgorithm.length }
var digest: CryptoDigest { return digestAlgorithm.digest }
func convertSignatureData(_ data: Data) throws -> Data { return data }
}

Expand All @@ -48,6 +51,10 @@ extension Data {
/// - Parameter algorithm: The algorithm be used. It should provide a digest hash method at least.
/// - Returns: The digest data.
func digest(using algorithm: CryptoAlgorithm) -> Data {
return digest(using: algorithm.digestAlgorithm)
}

func digest(using algorithm: DigestAlgorithm) -> Data {
var hash = [UInt8](repeating: 0, count: Int(algorithm.length))
#if swift(>=5.0)
withUnsafeBytes { _ = algorithm.digest($0.baseAddress, CC_LONG(count), &hash) }
Expand All @@ -58,3 +65,27 @@ extension Data {
#endif
}
}

enum DigestAlgorithm {
case sha1, sha224, sha256, sha384, sha512

var length: CC_LONG {
switch self {
case .sha1: return CC_LONG(CC_SHA1_DIGEST_LENGTH)
case .sha224: return CC_LONG(CC_SHA224_DIGEST_LENGTH)
case .sha256: return CC_LONG(CC_SHA256_DIGEST_LENGTH)
case .sha384: return CC_LONG(CC_SHA384_DIGEST_LENGTH)
case .sha512: return CC_LONG(CC_SHA512_DIGEST_LENGTH)
}
}

var digest: CryptoDigest {
switch self {
case .sha1: return CC_SHA1
case .sha224: return CC_SHA224
case .sha256: return CC_SHA256
case .sha384: return CC_SHA384
case .sha512: return CC_SHA512
}
}
}

0 comments on commit 4a14de8

Please sign in to comment.