|
|
@@ -3,7 +3,9 @@ import Foundation
|
|
|
/// Runtime-decoded OpenAI credentials bundled with the app.
|
|
|
/// The key is XOR-obfuscated so it does not appear as plain text in source or strings tables.
|
|
|
enum EncryptedOpenAIKey {
|
|
|
- private static let obfuscatedPayload: [UInt8] = [
|
|
|
+ private static let xorSeed: [UInt8] = Array("ReddoraAI".utf8) + Array("ServiceKey".utf8) + Array("2026".utf8)
|
|
|
+
|
|
|
+ private static let obfuscatedOpenAIKey: [UInt8] = [
|
|
|
33, 14, 73, 23, 25, 17, 0, 34, 42, 39, 72, 39, 6, 89, 13, 21, 34, 11, 40, 91,
|
|
|
120, 112, 89, 106, 63, 15, 30, 94, 23, 8, 37, 124, 10, 22, 62, 63, 47, 78, 21, 15,
|
|
|
55, 12, 104, 119, 7, 1, 57, 19, 28, 3, 48, 22, 87, 44, 61, 107, 43, 54, 46, 7, 91,
|
|
|
@@ -14,27 +16,18 @@ enum EncryptedOpenAIKey {
|
|
|
48, 30, 3, 5, 6, 85, 44, 36, 46, 109, 65, 4, 105, 8, 40, 29, 60, 28, 51,
|
|
|
]
|
|
|
|
|
|
- private static var maskBytes: [UInt8] {
|
|
|
- Array("ReddoraAI".utf8) + Array("ServiceKey".utf8) + Array("2026".utf8)
|
|
|
- }
|
|
|
-
|
|
|
- static func resolve() -> String? {
|
|
|
- let mask = maskBytes
|
|
|
- guard !mask.isEmpty else { return nil }
|
|
|
+ static func openAIAPIKey() -> String? {
|
|
|
+ guard !xorSeed.isEmpty else { return nil }
|
|
|
|
|
|
- var decoded = [UInt8]()
|
|
|
- decoded.reserveCapacity(obfuscatedPayload.count)
|
|
|
-
|
|
|
- for (index, byte) in obfuscatedPayload.enumerated() {
|
|
|
- decoded.append(byte ^ mask[index % mask.count])
|
|
|
+ let decoded = obfuscatedOpenAIKey.enumerated().map { index, byte in
|
|
|
+ byte ^ xorSeed[index % xorSeed.count]
|
|
|
}
|
|
|
|
|
|
- guard let key = String(bytes: decoded, encoding: .utf8),
|
|
|
- key.hasPrefix("sk-"),
|
|
|
- !key.isEmpty else {
|
|
|
- return nil
|
|
|
- }
|
|
|
+ guard let key = String(bytes: decoded, encoding: .utf8) else { return nil }
|
|
|
+
|
|
|
+ let trimmed = key.trimmingCharacters(in: .whitespacesAndNewlines)
|
|
|
+ guard !trimmed.isEmpty, trimmed.hasPrefix("sk-") else { return nil }
|
|
|
|
|
|
- return key
|
|
|
+ return trimmed
|
|
|
}
|
|
|
}
|