diff --git a/Sources/TweetNacl/TweetNacl.swift b/Sources/TweetNacl/TweetNacl.swift index ad8bb52..cc9eb1a 100644 --- a/Sources/TweetNacl/TweetNacl.swift +++ b/Sources/TweetNacl/TweetNacl.swift @@ -58,11 +58,18 @@ public struct NaclUtil { #else var randomData = Data(count: count) - let result = randomData.withUnsafeMutableBytes { - return SecRandomCopyBytes(kSecRandomDefault, count, $0) - } - guard result == errSecSuccess else { - throw NaclUtilError.internalError + + if count > 0 { + let result = try randomData.withUnsafeMutableBytes { (randomPointer: UnsafeMutableRawBufferPointer) throws -> Int32 in + guard let pointer = randomPointer.bindMemory(to: UInt8.self).baseAddress else { + throw NaclUtilError.internalError + } + + return SecRandomCopyBytes(kSecRandomDefault, count, pointer) + } + guard result == errSecSuccess else { + throw NaclUtilError.internalError + } } return randomData @@ -72,10 +79,14 @@ public struct NaclUtil { public static func hash(message: Data) throws -> Data { var hash = Data(count: Constants.Hash.bytes) - let r = hash.withUnsafeMutableBytes { (hashPointer: UnsafeMutablePointer) -> Int32 in - return message.withUnsafeBytes({ (messagePointer: UnsafePointer) -> Int32 in - return CTweetNacl.crypto_hash_sha512_tweet(hashPointer, messagePointer, UInt64(message.count)) - }) + let r = hash.withUnsafeMutableBytes { (hashPointer: UnsafeMutableRawBufferPointer) -> Int32 in + message.withUnsafeBytes { (messagePointer: UnsafeRawBufferPointer) -> Int32 in + crypto_hash_sha512_tweet( + hashPointer.bindMemory(to: UInt8.self).baseAddress, + messagePointer.bindMemory(to: UInt8.self).baseAddress, + UInt64(message.count) + ) + } } if r != 0 { @@ -93,11 +104,14 @@ public struct NaclUtil { if x.count != y.count { throw NaclUtilError.badKeySize } - - let r = x.withUnsafeBytes { (xPointer: UnsafePointer) -> Int32 in - return y.withUnsafeBytes({ (yPointer: UnsafePointer) -> Int32 in - return CTweetNacl.crypto_verify_32_tweet(xPointer, yPointer) - }) + + let r = x.withUnsafeBytes { (xPointer: UnsafeRawBufferPointer) -> Int32 in + y.withUnsafeBytes { (yPointer: UnsafeRawBufferPointer) -> Int32 in + crypto_verify_32_tweet( + xPointer.bindMemory(to: UInt8.self).baseAddress, + yPointer.bindMemory(to: UInt8.self).baseAddress + ) + } } return r == 0 @@ -115,13 +129,16 @@ struct NaclWrapper { static func crypto_box_keypair(secretKey sk: Data) throws -> (publicKey: Data, secretKey: Data) { var pk = Data(count: Constants.Box.secretKeyBytes) - - let result = pk.withUnsafeMutableBytes({ (pkPointer: UnsafeMutablePointer) -> Int32 in - return sk.withUnsafeBytes({ (skPointer: UnsafePointer) -> Int32 in - return CTweetNacl.crypto_scalarmult_curve25519_tweet_base(pkPointer, skPointer) - }) - }) - + + let result = pk.withUnsafeMutableBytes { (pkPointer: UnsafeMutableRawBufferPointer) -> Int32 in + sk.withUnsafeBytes { (skPointer: UnsafeRawBufferPointer) -> Int32 in + crypto_scalarmult_curve25519_tweet_base( + pkPointer.bindMemory(to: UInt8.self).baseAddress, + skPointer.bindMemory(to: UInt8.self).baseAddress + ) + } + } + if result != 0 { throw NaclWrapperError.internalError } @@ -139,13 +156,16 @@ struct NaclWrapper { var pk = Data(count: Constants.Sign.publicKeyBytes) var sk = Data(count: Constants.Sign.secretKeyBytes) sk.replaceSubrange(0..) -> Int32 in - return sk.withUnsafeMutableBytes({ (skPointer: UnsafeMutablePointer) -> Int32 in - return CTweetNacl.crypto_sign_ed25519_tweet_keypair(pkPointer, skPointer) - }) - }) - + + let result = pk.withUnsafeMutableBytes { (pkPointer: UnsafeMutableRawBufferPointer) -> Int32 in + sk.withUnsafeMutableBytes { (skPointer: UnsafeMutableRawBufferPointer) -> Int32 in + crypto_sign_ed25519_tweet_keypair( + pkPointer.bindMemory(to: UInt8.self).baseAddress, + skPointer.bindMemory(to: UInt8.self).baseAddress + ) + } + } + if result != 0 { throw NaclWrapperError.internalError } @@ -170,15 +190,21 @@ public struct NaclSecretBox { m.replaceSubrange(Constants.Secretbox.zeroBytes..) -> Int32 in - return m.withUnsafeBytes({ (mPointer: UnsafePointer) -> Int32 in - return nonce.withUnsafeBytes({ (noncePointer: UnsafePointer) -> Int32 in - return key.withUnsafeBytes({ (keyPointer: UnsafePointer) -> Int32 in - return CTweetNacl.crypto_secretbox_xsalsa20poly1305_tweet(cPointer, mPointer, UInt64(m.count), noncePointer, keyPointer) - }) - }) - }) + + let result = c.withUnsafeMutableBytes { (cPointer: UnsafeMutableRawBufferPointer) -> Int32 in + m.withUnsafeBytes { (mPointer: UnsafeRawBufferPointer) -> Int32 in + nonce.withUnsafeBytes { (noncePointer: UnsafeRawBufferPointer) -> Int32 in + key.withUnsafeBytes { (keyPointer: UnsafeRawBufferPointer) -> Int32 in + crypto_secretbox_xsalsa20poly1305_tweet( + cPointer.bindMemory(to: UInt8.self).baseAddress, + mPointer.bindMemory(to: UInt8.self).baseAddress, + UInt64(m.count), + noncePointer.bindMemory(to: UInt8.self).baseAddress, + keyPointer.bindMemory(to: UInt8.self).baseAddress + ) + } + } + } } if result != 0 { @@ -195,15 +221,21 @@ public struct NaclSecretBox { c.replaceSubrange(Constants.Secretbox.boxZeroBytes..) -> Int32 in - return c.withUnsafeBytes({ (cPointer: UnsafePointer) -> Int32 in - return nonce.withUnsafeBytes({ (noncePointer: UnsafePointer) -> Int32 in - return key.withUnsafeBytes({ (keyPointer: UnsafePointer) -> Int32 in - return CTweetNacl.crypto_secretbox_xsalsa20poly1305_tweet_open(mPointer, cPointer, UInt64(c.count), noncePointer, keyPointer) - }) - }) - }) + + let result = m.withUnsafeMutableBytes { (mPointer: UnsafeMutableRawBufferPointer) -> Int32 in + c.withUnsafeBytes { (cPointer: UnsafeRawBufferPointer) -> Int32 in + nonce.withUnsafeBytes { (noncePointer: UnsafeRawBufferPointer) -> Int32 in + key.withUnsafeBytes { (keyPointer: UnsafeRawBufferPointer) -> Int32 in + crypto_secretbox_xsalsa20poly1305_tweet_open( + mPointer.bindMemory(to: UInt8.self).baseAddress, + cPointer.bindMemory(to: UInt8.self).baseAddress, + UInt64(c.count), + noncePointer.bindMemory(to: UInt8.self).baseAddress, + keyPointer.bindMemory(to: UInt8.self).baseAddress + ) + } + } + } } if result != 0 { @@ -233,13 +265,17 @@ public struct NaclScalarMult { } var q = Data(count: Constants.Scalarmult.bytes) - - let result = q.withUnsafeMutableBytes { (qPointer: UnsafeMutablePointer) -> Int32 in - return n.withUnsafeBytes({ (nPointer: UnsafePointer) -> Int32 in - return p.withUnsafeBytes({ (pPointer: UnsafePointer) -> Int32 in - return CTweetNacl.crypto_scalarmult_curve25519_tweet(qPointer, nPointer, pPointer) - }) - }) + + let result = q.withUnsafeMutableBytes { (qPointer: UnsafeMutableRawBufferPointer) -> Int32 in + n.withUnsafeBytes { (nPointer: UnsafeRawBufferPointer) -> Int32 in + p.withUnsafeBytes { (pPointer: UnsafeRawBufferPointer) -> Int32 in + crypto_scalarmult_curve25519_tweet( + qPointer.bindMemory(to: UInt8.self).baseAddress, + nPointer.bindMemory(to: UInt8.self).baseAddress, + pPointer.bindMemory(to: UInt8.self).baseAddress + ) + } + } } if result != 0 { @@ -255,11 +291,14 @@ public struct NaclScalarMult { } var q = Data(count: Constants.Scalarmult.bytes) - - let result = q.withUnsafeMutableBytes { (qPointer: UnsafeMutablePointer) -> Int32 in - return n.withUnsafeBytes({ (nPointer: UnsafePointer) -> Int32 in - return CTweetNacl.crypto_scalarmult_curve25519_tweet_base(qPointer, nPointer) - }) + + let result = q.withUnsafeMutableBytes { (qPointer: UnsafeMutableRawBufferPointer) -> Int32 in + n.withUnsafeBytes { (nPointer: UnsafeRawBufferPointer) -> Int32 in + crypto_scalarmult_curve25519_tweet_base( + qPointer.bindMemory(to: UInt8.self).baseAddress, + nPointer.bindMemory(to: UInt8.self).baseAddress + ) + } } if result != 0 { @@ -289,13 +328,17 @@ public struct NaclBox { try NaclUtil.checkBoxLength(publicKey: publicKey, secretKey: secretKey) var k = Data(count: Constants.Box.beforeNMBytes) - - let result = k.withUnsafeMutableBytes { (kPointer: UnsafeMutablePointer) -> Int32 in - return publicKey.withUnsafeBytes({ (pkPointer: UnsafePointer) -> Int32 in - return secretKey.withUnsafeBytes({ (skPointer: UnsafePointer) -> Int32 in - return CTweetNacl.crypto_box_curve25519xsalsa20poly1305_tweet_beforenm(kPointer, pkPointer, skPointer) - }) - }) + + let result = k.withUnsafeMutableBytes { (kPointer: UnsafeMutableRawBufferPointer) -> Int32 in + publicKey.withUnsafeBytes { (pkPointer: UnsafeRawBufferPointer) -> Int32 in + secretKey.withUnsafeBytes { (skPointer: UnsafeRawBufferPointer) -> Int32 in + crypto_box_curve25519xsalsa20poly1305_tweet_beforenm( + kPointer.bindMemory(to: UInt8.self).baseAddress, + pkPointer.bindMemory(to: UInt8.self).baseAddress, + skPointer.bindMemory(to: UInt8.self).baseAddress + ) + } + } } if result != 0 { @@ -343,13 +386,19 @@ public struct NaclSign { var signedMessage = Data(count: Constants.Sign.bytes + message.count) let tmpLength = UnsafeMutablePointer.allocate(capacity: 1) - - let result = signedMessage.withUnsafeMutableBytes { (signedMessagePointer: UnsafeMutablePointer) -> Int32 in - return message.withUnsafeBytes({ (messagePointer: UnsafePointer) -> Int32 in - return secretKey.withUnsafeBytes({ (secretKeyPointer: UnsafePointer) -> Int32 in - return CTweetNacl.crypto_sign_ed25519_tweet(signedMessagePointer, tmpLength, messagePointer, UInt64(message.count), secretKeyPointer) - }) - }) + + let result = signedMessage.withUnsafeMutableBytes { (signedMessagePointer: UnsafeMutableRawBufferPointer) -> Int32 in + message.withUnsafeBytes { (messagePointer: UnsafeRawBufferPointer) -> Int32 in + secretKey.withUnsafeBytes { (secretKeyPointer: UnsafeRawBufferPointer) -> Int32 in + crypto_sign_ed25519_tweet( + signedMessagePointer.bindMemory(to: UInt8.self).baseAddress, + tmpLength, + messagePointer.bindMemory(to: UInt8.self).baseAddress, + UInt64(message.count), + secretKeyPointer.bindMemory(to: UInt8.self).baseAddress + ) + } + } } if result != 0 { @@ -366,13 +415,19 @@ public struct NaclSign { var tmp = Data(count: signedMessage.count) let tmpLength = UnsafeMutablePointer.allocate(capacity: 1) - - let result = tmp.withUnsafeMutableBytes { (tmpPointer: UnsafeMutablePointer) -> Int32 in - return signedMessage.withUnsafeBytes({ (signMessagePointer: UnsafePointer) -> Int32 in - return publicKey.withUnsafeBytes({ (publicKeyPointer: UnsafePointer) -> Int32 in - return CTweetNacl.crypto_sign_ed25519_tweet_open(tmpPointer, tmpLength, signMessagePointer, UInt64(signedMessage.count), publicKeyPointer) - }) - }) + + let result = tmp.withUnsafeMutableBytes { (tmpPointer: UnsafeMutableRawBufferPointer) -> Int32 in + signedMessage.withUnsafeBytes { (signMessagePointer: UnsafeRawBufferPointer) -> Int32 in + publicKey.withUnsafeBytes { (publicKeyPointer: UnsafeRawBufferPointer) -> Int32 in + crypto_sign_ed25519_tweet_open( + tmpPointer.bindMemory(to: UInt8.self).baseAddress, + tmpLength, + signMessagePointer.bindMemory(to: UInt8.self).baseAddress, + UInt64(signedMessage.count), + publicKeyPointer.bindMemory(to: UInt8.self).baseAddress + ) + } + } } if result != 0 { @@ -407,13 +462,19 @@ public struct NaclSign { sm.append(message) let tmpLength = UnsafeMutablePointer.allocate(capacity: 1) - - let result = m.withUnsafeMutableBytes { (mPointer: UnsafeMutablePointer) -> Int32 in - return sm.withUnsafeBytes({ (smPointer: UnsafePointer) -> Int32 in - return publicKey.withUnsafeBytes({ (publicKeyPointer: UnsafePointer) -> Int32 in - return CTweetNacl.crypto_sign_ed25519_tweet_open(mPointer, tmpLength, smPointer, UInt64(sm.count), publicKeyPointer) - }) - }) + + let result = m.withUnsafeMutableBytes { (mPointer: UnsafeMutableRawBufferPointer) -> Int32 in + sm.withUnsafeBytes { (smPointer: UnsafeRawBufferPointer) -> Int32 in + publicKey.withUnsafeBytes { (publicKeyPointer: UnsafeRawBufferPointer) -> Int32 in + crypto_sign_ed25519_tweet_open( + mPointer.bindMemory(to: UInt8.self).baseAddress, + tmpLength, + smPointer.bindMemory(to: UInt8.self).baseAddress, + UInt64(sm.count), + publicKeyPointer.bindMemory(to: UInt8.self).baseAddress + ) + } + } } return result == 0