I'm trying to use CC_SHA256_DIGEST_LENGTH in one of my functions in Swift and it throws an error because it cannot find that symbol. I've tried everything, importing CommonCrypto in the bridge-header and trying that .map solution.. Nothing works.
How can I use CC_SHA256_DIGEST_LENGTH in Swift? All the solutions seems to have stopped working. Thank you!
Bookmark this question. Show activity on this post. How do you import CommonCrypto in a Swift framework for iOS? I understand how to use CommonCrypto in a Swift app: You add #import <CommonCrypto/CommonCrypto.h> to the bridging header. However, Swift frameworks don't support bridging headers. The documentation says:
However, Swift frameworks don't support bridging headers. The documentation says: You can import external frameworks that have a pure Objective-C codebase, a pure Swift codebase, or a mixed-language codebase.
The process for importing an external framework is the same whether the framework is written in a single language or contains files from both languages. When you import an external framework, make sure the Defines Module build setting for the framework you’re importing is set to Yes.
Add the following line to your bridging header:#import <CommonCrypto/CommonHMAC.h>
Swift 2.x example:
func doSha256(#dataIn:NSData) -> NSData {
var shaOut: NSMutableData! = NSMutableData(length: Int(CC_SHA256_DIGEST_LENGTH));
CC_SHA256(dataIn.bytes, CC_LONG(dataIn.length), UnsafeMutablePointer<UInt8>(shaOut.mutableBytes));
return shaOut;
}
Swift 3.0 example:
func hashSHA256(data:Data) -> Data? {
var hashData = Data(count: Int(CC_SHA256_DIGEST_LENGTH))
_ = hashData.withUnsafeMutableBytes {digestBytes in
data.withUnsafeBytes {messageBytes in
CC_SHA256(messageBytes, CC_LONG(data.count), digestBytes)
}
}
return hashData
}
let clearData = "clearData0123456".data(using:String.Encoding.utf8)!
print("clearData: \(clearData.map { String(format: "%02hhx", $0) }.joined())")
let hash = hashSHA256(data:clearData)
print("hash: \(hash!.map { String(format: "%02hhx", $0) }.joined())")
Output:
clearData:
636c6561724461746130313233343536
hash:aabc766b6b357564e41f4f912d494bccbfa16924b574abbdba9e3e9da0c8920a
I don't have any frameworks added in the target Build Phases.
Be are you sure that the bridging-header is set up correctly? I added mine by adding a .m file and let the system automatically add the bridging-header and update any target settings.
General hash method moved from the sunsetted documentation section:
This function takes a hash name and Data to be hashed and returns a Data:
name: A name of a hash function as a String data: The Data to be hashed returns: the hashed result as Data
func hash(name:String, data:Data) -> Data? {
let algos = ["MD2": (CC_MD2, CC_MD2_DIGEST_LENGTH),
"MD4": (CC_MD4, CC_MD4_DIGEST_LENGTH),
"MD5": (CC_MD5, CC_MD5_DIGEST_LENGTH),
"SHA1": (CC_SHA1, CC_SHA1_DIGEST_LENGTH),
"SHA224": (CC_SHA224, CC_SHA224_DIGEST_LENGTH),
"SHA256": (CC_SHA256, CC_SHA256_DIGEST_LENGTH),
"SHA384": (CC_SHA384, CC_SHA384_DIGEST_LENGTH),
"SHA512": (CC_SHA512, CC_SHA512_DIGEST_LENGTH)]
guard let (hashAlgorithm, length) = algos[name] else { return nil }
var hashData = Data(count: Int(length))
_ = hashData.withUnsafeMutableBytes {digestBytes in
data.withUnsafeBytes {messageBytes in
hashAlgorithm(messageBytes, CC_LONG(data.count), digestBytes)
}
}
return hashData
}
Note: MD2, MD4, MD5 and SHA1 should not be used in new work, they are no longer secure for message digest usage.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With