This repository has been archived on 2024-08-25. You can view files and clone it, but cannot push or open issues or pull requests.
Burgernotes-iOS/Burgernotes/Extensions/String.swift

69 lines
2.2 KiB
Swift

//
// String.swift
// Burgernotes
//
// Created by ffqq on 27/02/2024.
//
// STRING EXTENSIONS
//
// This file will define String.encrypt and String.decrypt (using
// crypto.js because upstream isn't documented enough)
import Foundation
import JavaScriptCore
extension String {
func encrypt(password: String) -> String {
let context = JSContext()!
// Load the CryptoJS library
let cryptoJSPath = Bundle.main.path(forResource: "crypto-js.min", ofType: "js")!
let cryptoJSScript = try! String(contentsOfFile: cryptoJSPath)
context.evaluateScript(cryptoJSScript)
// Embed the javascript code
let jsCode = """
function encryptString(content, password) {
try {
var contentWithNewline = content.replace(/NEWLINEHERETHISISHACKY/g, '\\n');
var encrypted = CryptoJS.AES.encrypt(contentWithNewline, password).toString();
return encrypted;
} catch (error) {
return error.message;
}
}
encryptString('\(self)', '\(password)');
"""
let encryptedValue = context.evaluateScript(jsCode)?.toString() // Run and output as a string
return encryptedValue ?? "" // Return the string output
}
func decrypt(password: String) -> String {
let context = JSContext()!
// Load the CryptoJS library
let cryptoJSPath = Bundle.main.path(forResource: "crypto-js.min", ofType: "js")!
let cryptoJSScript = try! String(contentsOfFile: cryptoJSPath)
context.evaluateScript(cryptoJSScript)
// Embed the javascript code
let jsCode = """
function decryptString(content, password) {
try {
var decrypted = CryptoJS.AES.decrypt(content, password).toString(CryptoJS.enc.Utf8);
return decrypted;
} catch (error) {
return error.message;
}
}
decryptString('\(self)', '\(password)');
"""
let decryptedValue = context.evaluateScript(jsCode)?.toString() // Run and output as a string
return decryptedValue ?? "" // Return the string output
}
}