复制加密推送发送脚本示例

This commit is contained in:
Fin 2023-03-07 12:39:13 +08:00
parent 27faf3e75b
commit 4c7727ff00
No known key found for this signature in database
GPG Key ID: CFB59B99D87A7B93
3 changed files with 107 additions and 35 deletions

View File

@ -11,7 +11,7 @@ import UIKit
class CryptoSettingController: BaseViewController<CryptoSettingViewModel> {
let algorithmFeild = DropBoxView(values: ["AES128", "AES192", "AES256"])
let modeFeild = DropBoxView(values: ["CBC", "ECB", "GCM"])
let modeFeild = DropBoxView(values: ["CBC", "ECB"])
let paddingField = DropBoxView(values: ["pkcs7"])
let keyTextField: BorderTextField = {
@ -149,7 +149,6 @@ class CryptoSettingController: BaseViewController<CryptoSettingViewModel> {
make.top.equalTo(ivLabel.snp.bottom).offset(5)
}
copyButton.snp.makeConstraints { make in
make.left.equalTo(ivTextField)
make.right.equalTo(ivTextField)
@ -202,25 +201,42 @@ class CryptoSettingController: BaseViewController<CryptoSettingViewModel> {
.asDriver(onErrorDriveWith: .empty())
))
output.algorithmList
.map { $0.map { $0.rawValue }}
.drive(self.algorithmFeild.rx.values)
.disposed(by: rx.disposeBag)
output.initial.drive(onNext: { [weak self] val in
self?.algorithmFeild.values = val.algorithmList.map { $0.rawValue }
self?.modeFeild.values = val.modeList
self?.paddingField.values = val.paddingList
if let fields = val.initialFields {
self?.algorithmFeild.currentValue = fields.algorithm
self?.modeFeild.currentValue = fields.mode
self?.paddingField.currentValue = fields.padding
self?.keyTextField.text = fields.key
self?.ivTextField.text = fields.iv
}
}).disposed(by: rx.disposeBag)
output.modeList
output.modeListChanged
.drive(self.modeFeild.rx.values)
.disposed(by: rx.disposeBag)
output.paddingList
output.paddingListChanged
.drive(self.paddingField.rx.values)
.disposed(by: rx.disposeBag)
output.keyLenght.drive(onNext: { [weak self] keyLenght in
output.keyLenghtChanged.drive(onNext: { [weak self] keyLenght in
self?.keyTextField.placeholder = String(format: NSLocalizedString("enterKey"), keyLenght)
}).disposed(by: rx.disposeBag)
output.showSnackbar.drive(onNext: { text in
HUDError(text)
}).disposed(by: rx.disposeBag)
output.done.drive(onNext: { [weak self] in
self?.navigationController?.dismiss(animated: true)
}).disposed(by: rx.disposeBag)
output.copy.drive(onNext: { text in
UIPasteboard.general.string = text
HUDSuccess(NSLocalizedString("Copy"))
}).disposed(by: rx.disposeBag)
}
}

View File

@ -19,22 +19,27 @@ class CryptoSettingViewModel: ViewModel, ViewModelType {
}
struct Output {
let algorithmList: Driver<[Algorithm]>
let modeList: Driver<[String]>
let paddingList: Driver<[String]>
let keyLenght: Driver<Int>
var showSnackbar: Driver<String>
let initial: Driver<(algorithmList: [Algorithm], modeList: [String], paddingList: [String], initialFields: CryptoSettingFields?)>
let modeListChanged: Driver<[String]>
let paddingListChanged: Driver<[String]>
let keyLenghtChanged: Driver<Int>
let showSnackbar: Driver<String>
let done: Driver<Void>
let copy: Driver<String>
}
struct Dependencies {
let settingFieldRelay: BehaviorRelay<CryptoSettingFields?>
let deviceKey: Driver<String>
}
private let dependencies: Dependencies
init(dependencies: Dependencies =
Dependencies(
settingFieldRelay: CryptoSettingRelay.shared.fields
settingFieldRelay: CryptoSettingRelay.shared.fields,
// Key just
deviceKey: Driver.just(ServerManager.shared.currentServer.key)
)
) {
self.dependencies = dependencies
@ -49,13 +54,18 @@ class CryptoSettingViewModel: ViewModel, ViewModelType {
.compactMap { Algorithm(rawValue: $0) }
.map { $0.modes }
let keyLenght = input
.algorithmChanged
.compactMap { Algorithm(rawValue: $0) }
.map { $0.keyLenght }
let keyLenght =
Driver.merge([
Driver.just(dependencies.settingFieldRelay.value)
.compactMap { $0 }
.compactMap { Algorithm(rawValue: $0.algorithm)?.keyLenght },
input
.algorithmChanged
.compactMap { Algorithm(rawValue: $0)?.keyLenght },
])
//
input.done
let done = input.done
.filter { fields in
do {
_ = try AESCryptoModel(cryptoFields: fields)
@ -65,17 +75,65 @@ class CryptoSettingViewModel: ViewModel, ViewModelType {
showSnackbar.accept(error.rawString())
return false
}
}.drive(onNext: { [weak self] fields in
//
self?.dependencies.settingFieldRelay.accept(fields)
}).disposed(by: rx.disposeBag)
}
done.drive(onNext: { [weak self] fields in
//
self?.dependencies.settingFieldRelay.accept(fields)
}).disposed(by: rx.disposeBag)
let copyScript = input.copyScript
.filter { [weak self] fields in
do {
_ = try AESCryptoModel(cryptoFields: fields)
//
self?.dependencies.settingFieldRelay.accept(fields)
return true
}
catch {
showSnackbar.accept(error.rawString())
return false
}
}
let copy = Driver.combineLatest(copyScript, dependencies.deviceKey)
.map { fields, deviceKey in
return
"""
#!/usr/bin/env bash
set -e
# bark key
deviceKey='\(deviceKey)'
# push payload
json='{"body": "test"}'
# must be 16 bytes long
key='\(fields.key ?? "")'
iv='\(fields.iv ?? "")'
# openssl requires Hex encoding of manual keys and IVs, not ASCII encoding.
key=$(printf $key | xxd -ps -c 200)
iv=$(printf $iv | xxd -ps -c 200)
ciphertext=$(echo -n $json | openssl enc -aes-\(fields.algorithm.suffix(3))-\(fields.mode.lowercased()) -K $key -iv $iv | base64)
echo $ciphertext
# curl --data-urlencode "ciphertext=$ciphertext" https://api.day.app/$deviceKey
"""
}
return Output(
algorithmList: Driver.just([Algorithm.aes128, Algorithm.aes192, Algorithm.aes256]),
modeList: Driver.merge(Driver.just(["CBC", "ECB", "GCM"]), modeList),
paddingList: Driver.just(["pkcs7"]),
keyLenght: Driver.merge(Driver.just(16), keyLenght),
showSnackbar: showSnackbar.asDriver(onErrorDriveWith: .empty())
initial: Driver.just((
algorithmList: [Algorithm.aes128, Algorithm.aes192, Algorithm.aes256],
modeList: ["CBC", "ECB"],
paddingList: ["okcs7"],
initialFields: dependencies.settingFieldRelay.value
)),
modeListChanged: modeList,
paddingListChanged: Driver.just(["pkcs7"]),
keyLenghtChanged: keyLenght,
showSnackbar: showSnackbar.asDriver(onErrorDriveWith: .empty()),
done: done.map { _ in () },
copy: copy
)
}
}

View File

@ -17,7 +17,7 @@ enum Algorithm: String {
var modes: [String] {
switch self {
case .aes128, .aes192, .aes256:
return ["CBC", "ECB", "GCM"]
return ["CBC", "ECB"]
}
}
@ -66,7 +66,7 @@ struct AESCryptoModel {
}
var iv = ""
if ["CBC", "GCM"].contains(cryptoFields.mode) {
if ["CBC"].contains(cryptoFields.mode) {
if let ivField = cryptoFields.iv, ivField.count == 16 {
iv = ivField
}
@ -81,8 +81,6 @@ struct AESCryptoModel {
mode = CBC(iv: iv.bytes)
case "ECB":
mode = ECB()
case "GCM":
mode = GCM(iv: iv.bytes)
default:
throw "Invalid Mode"
}