Files

98 lines
3.0 KiB
Swift

//
// The MIT License (MIT)
//
// Copyright (c) 2023 Ihar Katkavets
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to
// the following conditions:
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
import Foundation
import CommonCrypto
public let AesIVSize = 16
public typealias AesOptions = Int
public extension AesOptions {
static let CBCMode = 0
static let PKCS7Padding = kCCOptionPKCS7Padding
static let ECBMode = kCCOptionECBMode
}
public struct AesStreamError: LocalizedError {
public enum Kind {
case paramError
case bufferTooSmall
case memoryFailure
case alignmentError
case decodeError
case unimplemented
case overflow
case rngFailure
case unspecifiedError
case callSequenceError
case keySizeError
case ivSizeError
case otherError(code: Int32)
}
public let file: String
public let line: Int
public let kind: Kind
internal init(file: String = #file, line: Int = #line, code: Int32) {
self.file = String(describing: file)
self.line = line
switch Int(code) {
case kCCParamError:
kind = .paramError
case kCCBufferTooSmall:
kind = .bufferTooSmall
case kCCMemoryFailure:
kind = .memoryFailure
case kCCAlignmentError:
kind = .alignmentError
case kCCDecodeError:
kind = .decodeError
case kCCUnimplemented:
kind = .unimplemented
case kCCOverflow:
kind = .overflow
case kCCRNGFailure:
kind = .rngFailure
case kCCUnspecifiedError:
kind = .unspecifiedError
case kCCCallSequenceError:
kind = .callSequenceError
case kCCKeySizeError:
kind = .keySizeError
case kCCAlignmentError:
kind = .alignmentError
default:
kind = .otherError(code: code)
}
}
internal init(file: String = #file, line: Int = #line, kind: Kind) {
self.file = String(describing: file)
self.line = line
self.kind = kind
}
}