Skip to content

Commit

Permalink
MOB-843 Change RSA Padding Algorithm (#99)
Browse files Browse the repository at this point in the history
- Changed Padding to OAEPSHA1
	- Updated Unit Tests
	- Updated Test Card function to run on the main thread
  • Loading branch information
Peter-John-paystack authored Oct 24, 2023
1 parent 9bf8e69 commit 2b1417f
Show file tree
Hide file tree
Showing 3 changed files with 7 additions and 13 deletions.
Original file line number Diff line number Diff line change
@@ -1,19 +1,13 @@
import Foundation

struct Cryptography {
private var paystackPublicKey = "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANIsL+RHqfkBiKGn/D1y1QnNrMkKzxWP" +
"2wkeSokw2OJrCI+d6YGJPrHHx+nmb/Qn885/R01Gw6d7M824qofmCvkCAwEAAQ=="

func encrypt(text: String) throws -> String {
try encrypt(text: text, publicKey: paystackPublicKey)
}

func encrypt(text: String, publicKey: String) throws -> String {
let key = try createKey(from: publicKey, isPublic: true)

var encryptionError: Unmanaged<CFError>?
guard let textData = text.data(using: .utf8),
let encryptedData = SecKeyCreateEncryptedData(key, .rsaEncryptionPKCS1,
let encryptedData = SecKeyCreateEncryptedData(key, .rsaEncryptionOAEPSHA1,
textData as CFData, &encryptionError) as Data? else {
throw CryptographyError.encryptionFailed
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ class TestModeCardSelectionViewModel: ObservableObject {
testCard != nil
}

@MainActor
func proceedWithTestCard() async {
do {
guard let testCard else { return }
Expand Down
11 changes: 5 additions & 6 deletions Tests/PaystackSDKTests/Core/CryptographyTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ final class CryptographyTests: XCTestCase {
XCTFail("Encryption failed")
return
}

guard let decryptedString = try? serviceUnderTest.decrypt(base64String: encryptedData,
privateKey: privateKey) else {
XCTFail("Decryption failed")
Expand Down Expand Up @@ -49,7 +48,7 @@ final class CryptographyTests: XCTestCase {
}

func testLongClearTextCase() {
let clearText = [String](repeating: "a", count: 117).joined(separator: "")
let clearText = [String](repeating: "a", count: 86).joined(separator: "")

guard let encryptedData = try? serviceUnderTest.encrypt(text: clearText, publicKey: publicKey) else {
XCTFail("Encryption failed")
Expand Down Expand Up @@ -118,7 +117,7 @@ final class CryptographyTests: XCTestCase {

func testStandaloneDecryptionWithMatchingPrivateKey() {
// swiftlint:disable:next line_length
let encryptedData = "UoeZtFlZgBu5j6OzH+5qKeDMAklJ6dyo/2fCYzY0MmifDqQHx81ZzO1GRjYXvKehgZRfU7dwcr8behWHFiHC/BS0X0h25rEtoaH4+2ddkfMGmhVHcIYSyQWzPhabD5rIGZdfPQnHCdNx6OR4lraGM6C0ngraMdSNQifiXe6+qfU="
let encryptedData = "JGQR/v/7z+Owaw969pxlO5PmEn1WFwHqvEPHvXvsBs4QLyakWW+AciAEqrBK1vBAFgLHuzWTrD9uwAR5OC3or14tTDVAy5vMDyXRGgVFiR1JXdK4fuPxG5+anr/i1VIL4bQb+F2g3alLgjLkl1J7wPINhj0lXFOS0hrssKZDaCU="
guard let decryptedString = try? serviceUnderTest.decrypt(base64String: encryptedData,
privateKey: privateKey) else {
XCTFail("Decryption failed")
Expand All @@ -141,7 +140,7 @@ final class CryptographyTests: XCTestCase {

func testAlreadyEncryptedJsonStringDecryptsCorrectlyToModel() throws {
// swiftlint:disable:next line_length
let encryptedData = "gF8m8NyQKJSYJTxNaEoTMDrJSie0A1ixKVvkNPm+xQuOvcKc81LISkzgXd4UoFq7wW1ueNafAexADNqrubmW/PwonWjcbTMpqEtx/CVJMlg9QMA7LIXSELbLZsxodiPlH8aZ3xTDqaajEYf5A1o2S3aYCXMZqotBwRNE2/kUvEQ="
let encryptedData = "g+zqJYWMz0FcUQpOvvaWSa6/Tyb4WZP8G0MdoHhmR9BXUXhX/n3JkQ2dyH7AM97DxUOIVZGcnQHJIEAssVG5FdCWpFVQTuTd7ErDk0vMjJfnJHwol8VBxd+b8rbFKnNbVMOeleLPJ6Jgvv2jdoFLqOsb/0iTF17SLlTIYH1uSd0="
let expectedObject = MockObject(number: 789, name: "Test Decrypt")

let decryptedData: MockObject = try serviceUnderTest.decrypt(base64String: encryptedData,
Expand All @@ -151,7 +150,7 @@ final class CryptographyTests: XCTestCase {

func testDecryptionFailsWhenDecryptedDataCannotBeDecodedToTheExpectedModel() {
// swiftlint:disable:next line_length
let encryptedData = "UoeZtFlZgBu5j6OzH+5qKeDMAklJ6dyo/2fCYzY0MmifDqQHx81ZzO1GRjYXvKehgZRfU7dwcr8behWHFiHC/BS0X0h25rEtoaH4+2ddkfMGmhVHcIYSyQWzPhabD5rIGZdfPQnHCdNx6OR4lraGM6C0ngraMdSNQifiXe6+qfU="
let encryptedData = "D745spEYFbavF2a0JRuc/cgK5YQuNuBP5DsAjDx+2aY84jH6S7PoeiD4nAUy7mVkSp133Py+nVCBWrd9nKfzrjArZYjvXgwy7+Q1gdRXD132GD2YI1wLg9M4nauid1cbKfPeXMqboisuEdHWR6dvCqn55septvQOwJAOariJAsE="

do {
let _: MockObject = try serviceUnderTest.decrypt(base64String: encryptedData,
Expand All @@ -178,7 +177,7 @@ extension Cryptography {
let key = try createKey(from: privateKey, isPublic: false)

var error: Unmanaged<CFError>?
guard let decrypted = SecKeyCreateDecryptedData(key, .rsaEncryptionPKCS1,
guard let decrypted = SecKeyCreateDecryptedData(key, .rsaEncryptionOAEPSHA1,
data as CFData, &error),
let decryptedString = String(data: decrypted as Data, encoding: .utf8) else {
throw CryptographyError.decryptionFailed
Expand Down

0 comments on commit 2b1417f

Please sign in to comment.