1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
|
//===----------------------------------------------------------------------===//
//
// This source file is part of the SwiftCrypto open source project
//
// Copyright (c) 2021 Apple Inc. and the SwiftCrypto project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.md for the list of SwiftCrypto project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//
#if !canImport(Security)
@_implementationOnly import CCryptoBoringSSL
import Foundation
import Crypto
internal enum BIOHelper {
static func withReadOnlyMemoryBIO<ReturnValue>(
wrapping pointer: UnsafeRawBufferPointer, _ block: (UnsafeMutablePointer<BIO>) throws -> ReturnValue
) rethrows -> ReturnValue {
let bio = CCryptoBoringSSL_BIO_new_mem_buf(pointer.baseAddress, pointer.count)!
defer {
CCryptoBoringSSL_BIO_free(bio)
}
return try block(bio)
}
static func withReadOnlyMemoryBIO<ReturnValue>(
wrapping pointer: UnsafeBufferPointer<UInt8>, _ block: (UnsafeMutablePointer<BIO>) throws -> ReturnValue
) rethrows -> ReturnValue {
let bio = CCryptoBoringSSL_BIO_new_mem_buf(pointer.baseAddress, pointer.count)!
defer {
CCryptoBoringSSL_BIO_free(bio)
}
return try block(bio)
}
static func withWritableMemoryBIO<ReturnValue>(_ block: (UnsafeMutablePointer<BIO>) throws -> ReturnValue) rethrows -> ReturnValue {
let bio = CCryptoBoringSSL_BIO_new(CCryptoBoringSSL_BIO_s_mem())!
defer {
CCryptoBoringSSL_BIO_free(bio)
}
return try block(bio)
}
}
extension Data {
init(copyingMemoryBIO bio: UnsafeMutablePointer<BIO>) throws {
var innerPointer: UnsafePointer<UInt8>? = nil
var innerLength = 0
guard 1 == CCryptoBoringSSL_BIO_mem_contents(bio, &innerPointer, &innerLength) else {
throw CryptoKitError.internalBoringSSLError()
}
self = Data(UnsafeBufferPointer(start: innerPointer, count: innerLength))
}
}
extension String {
init(copyingUTF8MemoryBIO bio: UnsafeMutablePointer<BIO>) throws {
var innerPointer: UnsafePointer<UInt8>? = nil
var innerLength = 0
guard 1 == CCryptoBoringSSL_BIO_mem_contents(bio, &innerPointer, &innerLength) else {
throw CryptoKitError.internalBoringSSLError()
}
self = String(decoding: UnsafeBufferPointer(start: innerPointer, count: innerLength), as: UTF8.self)
}
}
extension FixedWidthInteger {
func withBignumPointer<ReturnType>(_ block: (UnsafeMutablePointer<BIGNUM>) throws -> ReturnType) rethrows -> ReturnType {
precondition(self.bitWidth <= UInt.bitWidth)
var bn = BIGNUM()
CCryptoBoringSSL_BN_init(&bn)
defer {
CCryptoBoringSSL_BN_clear(&bn)
}
CCryptoBoringSSL_BN_set_word(&bn, .init(self))
return try block(&bn)
}
}
#endif
|