|
@@ -4,6 +4,8 @@
|
|
Contact: [marcin@krzyzanowskim.com](http://krzyzanowskim.com)
|
|
Contact: [marcin@krzyzanowskim.com](http://krzyzanowskim.com)
|
|
*/
|
|
*/
|
|
import CryptoSwift
|
|
import CryptoSwift
|
|
|
|
+import Foundation
|
|
|
|
+import XCPlayground
|
|
|
|
|
|
//: # AES
|
|
//: # AES
|
|
//: One-time shot
|
|
//: One-time shot
|
|
@@ -30,3 +32,54 @@ do {
|
|
} catch {
|
|
} catch {
|
|
print(error)
|
|
print(error)
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+//: Encrypt stream incrementally
|
|
|
|
+do {
|
|
|
|
+ // write until all is written
|
|
|
|
+ func writeToStream(stream: NSOutputStream, bytes: [UInt8]) {
|
|
|
|
+ var writtenCount = 0
|
|
|
|
+ while stream.hasSpaceAvailable && writtenCount < bytes.count {
|
|
|
|
+ let c = stream.write(bytes, maxLength: bytes.count)
|
|
|
|
+ if c <= 0 {
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ writtenCount += stream.write(bytes, maxLength: bytes.count)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ let aes = try AES(key: "passwordpassword", iv: "drowssapdrowssap")
|
|
|
|
+ var encryptor = aes.makeEncryptor()
|
|
|
|
+
|
|
|
|
+ // prepare streams
|
|
|
|
+ let data = NSData(bytes: (0..<100).map { $0 })
|
|
|
|
+ let inputStream = NSInputStream(data: data)
|
|
|
|
+ let outputStream = NSOutputStream(toMemory: ())
|
|
|
|
+ inputStream.open()
|
|
|
|
+ outputStream.open()
|
|
|
|
+
|
|
|
|
+ var buffer = [UInt8](count: 2, repeatedValue: 0)
|
|
|
|
+
|
|
|
|
+ // encrypt input stream data and write encrypted result to output stream
|
|
|
|
+ while (inputStream.hasBytesAvailable) {
|
|
|
|
+ let readCount = inputStream.read(&buffer, maxLength: buffer.count)
|
|
|
|
+ if (readCount > 0) {
|
|
|
|
+ try encryptor.update(withBytes: Array(buffer[0..<readCount])) { (bytes) in
|
|
|
|
+ writeToStream(outputStream, bytes: bytes)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // finalize encryption
|
|
|
|
+ try encryptor.finish { (bytes) in
|
|
|
|
+ writeToStream(outputStream, bytes: bytes)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // print result
|
|
|
|
+ if let ciphertext = outputStream.propertyForKey(NSStreamDataWrittenToMemoryStreamKey) as? NSData {
|
|
|
|
+ print("Encrypted stream data: \(ciphertext.toHexString())")
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+} catch {
|
|
|
|
+ print(error)
|
|
|
|
+}
|