Skip to content

Commit c116c75

Browse files
committed
chore: rsa base64decode add
1 parent 6e2993e commit c116c75

File tree

5 files changed

+59
-25
lines changed

5 files changed

+59
-25
lines changed

android/src/main/java/com/cryptorsa/CryptoRsa.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,12 @@ class CryptoRsa(originReactContext: ReactApplicationContext, keySize:Int?) {
255255
return String(cipher.doFinal(decryptedData), Charsets.UTF_8)
256256
}
257257

258+
@Throws(NoSuchAlgorithmException::class, InvalidKeySpecException::class, IllegalBlockSizeException::class, BadPaddingException::class, NoSuchPaddingException::class, InvalidKeyException::class)
259+
fun base64Decode(base64String: String): String? {
260+
val originValues = Base64.decode(base64String,Base64.DEFAULT)
261+
return originValues.toString()
262+
}
263+
258264
companion object {
259265
private var originKeySize = 2048
260266
private lateinit var reactContext: ReactApplicationContext;

android/src/main/java/com/cryptorsa/CryptoRsaModule.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,13 @@ class CryptoRsaModule(reactContext: ReactApplicationContext) :
7575
}
7676
}
7777

78+
@ReactMethod
79+
fun base64Decode(base64String: String,promise: Promise) {
80+
runBlocking {
81+
launch { promise.resolve(cryptoRsa.base64Decode(base64String)) }
82+
}
83+
}
84+
7885
companion object {
7986
const val NAME = "CryptoRsa"
8087
private lateinit var cryptoRsa: CryptoRsa

example/src/App.tsx

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,18 +14,21 @@ export default function App() {
1414
try {
1515
const { publicKey } = await RNCryptoRsa.init();
1616
setPublicString(publicKey);
17-
// console.log('@publicKey : ', publicKey);
17+
console.log('@publicKey : ', publicKey);
1818
// console.log('privateKey : ', privateKey);
1919
const encryptBase64String = await RNCryptoRsa.encrypt(
2020
'hello world',
2121
publicKey
2222
);
2323
console.log('@encryptBase64String : ', encryptBase64String);
24-
RNCryptoRsa.decrypt(encryptBase64String)
25-
.then((rrr) => {
26-
console.log('@decrypt String : ', rrr);
27-
})
28-
.catch(console.error);
24+
RNCryptoRsa.base64Decode(encryptBase64String).then((str) =>
25+
console.log('base64Decode', str)
26+
);
27+
// RNCryptoRsa.decrypt(encryptBase64String)
28+
// .then((rrr) => {
29+
// console.log('@decrypt String : ', rrr);
30+
// })
31+
// .catch(console.error);
2932
} catch (e) {
3033
console.error('error : ', e);
3134
}
@@ -35,6 +38,7 @@ export default function App() {
3538
const decryptString = async () => {
3639
console.log('base64String : ', base64String);
3740
const originString = await RNCryptoRsa.decrypt(base64String);
41+
console.log('originString : ', originString);
3842
setResult(originString);
3943
};
4044

ios/CryptoRsa.swift

Lines changed: 32 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,16 @@ class CryptoRsa: NSObject {
3535
}
3636

3737
func getKeyFromKeychain(tag: String) -> SecKey? {
38-
let query: [String: Any] = [
38+
var query: [String: Any] = [
3939
kSecClass as String: kSecClassKey,
4040
kSecAttrApplicationTag as String: tag,
4141
kSecAttrKeyType as String: kSecAttrKeyTypeRSA,
42-
kSecReturnRef as String: true,
43-
kSecReturnData as String: kCFBooleanTrue ?? true
4442
]
43+
if(tag == publicTag) {
44+
query[kSecReturnData as String] = kCFBooleanTrue ?? true
45+
} else {
46+
query[kSecReturnRef as String] = true
47+
}
4548

4649
var item: CFTypeRef?
4750
let status = SecItemCopyMatching(query as CFDictionary, &item)
@@ -178,6 +181,11 @@ class CryptoRsa: NSObject {
178181
func encrypt(message: String, pemString: String,resolve:RCTPromiseResolveBlock,reject:RCTPromiseRejectBlock) -> Void {
179182
guard let data = message.data(using: .utf8) else { return reject(nil,nil,RuntimeError("Data is null")) }
180183

184+
// 데이터 크기 확인 (예시: RSA 키 크기 2048비트, 최대 데이터 크기 245바이트)
185+
if data.count > 245 {
186+
return reject(nil, nil, RuntimeError("Data size too large for RSA encryption"))
187+
}
188+
181189
guard let publicKey = pemStringToPublicKey(pemString) else {
182190
return reject(nil,nil,RuntimeError("pemStringTopublicKey is null"))
183191
}
@@ -193,34 +201,39 @@ class CryptoRsa: NSObject {
193201
return reject(nil, nil, RuntimeError("Encryption error: \((error?.takeRetainedValue())!)"))
194202
}
195203

196-
resolve(cipherData.base64EncodedString())
204+
resolve(base64EncodeString(cipherData))
197205
}
198206

199207
@objc(decrypt:withResolver:withRejecter:)
200208
func decrypt(encryptedDataString: String, resolve:RCTPromiseResolveBlock,reject:RCTPromiseRejectBlock) -> Any? {
201209
guard let encryptedData = base64Decode(encryptedDataString) else {
202-
print("base64Decode Faild")
203-
return reject(nil,nil,RuntimeError("base64Decode Faild"))
210+
print("base64Decode Failed")
211+
return reject(nil, nil, RuntimeError("base64Decode Failed"))
204212
}
205-
guard let loadedPrivateKey = getKeyFromKeychain(tag: privateTag ) else {
206-
print("Load Faild privateKey in KeyChain ")
207-
return reject(nil,nil,RuntimeError("Keychain Load failed"))
213+
214+
guard let loadedPrivateKey = getKeyFromKeychain(tag: privateTag) else {
215+
print("Load Failed privateKey in KeyChain")
216+
reject(nil, nil, RuntimeError("Keychain Load failed"))
217+
return nil
218+
}
219+
220+
// Check if the encrypted data size matches the key size
221+
let blockSize = SecKeyGetBlockSize(loadedPrivateKey)
222+
if encryptedData.count != blockSize {
223+
print("Encrypted data size does not match key block size")
224+
reject(nil, nil, RuntimeError("Encrypted data size does not match key block size"))
225+
return nil
208226
}
209-
print("Load privateKey in KeyChain :", loadedPrivateKey)
210227

211228
guard SecKeyIsAlgorithmSupported(loadedPrivateKey, .decrypt, secKeyAlgorithm) else {
212-
reject(nil,nil,RuntimeError("SecKeyIsAlgorithm not supported"))
229+
reject(nil, nil, RuntimeError("SecKeyIsAlgorithm not supported"))
213230
return nil
214231
}
215-
var error: Unmanaged<CFError>?
216232

217-
guard let clearData = SecKeyCreateDecryptedData(loadedPrivateKey,
218-
secKeyAlgorithm,
219-
encryptedData as CFData,
220-
&error) as Data? else {
221-
print("Decryption error: \((error?.takeRetainedValue())!)")
222-
return reject(nil,nil,RuntimeError("SecKeyIsAlgorithm not supported"))
223-
233+
var error: Unmanaged<CFError>?
234+
guard let clearData = SecKeyCreateDecryptedData(loadedPrivateKey, secKeyAlgorithm, encryptedData as CFData, &error) as Data? else {
235+
print("Decryption error: \(error?.takeRetainedValue().localizedDescription ?? "Unknown error")")
236+
return reject(nil, nil, RuntimeError("Decryption error: \(error?.takeRetainedValue().localizedDescription ?? "Unknown error")"))
224237
}
225238

226239
return resolve(String(data: clearData, encoding: .utf8))

src/index.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@ class CryptoRsaClass {
4343
async getSHA512Text(pemString: string): Promise<string> {
4444
return await this.instance.getSHA512Text(pemString);
4545
}
46+
47+
async base64Decode(base64String: string): Promise<string> {
48+
return await this.instance.base64Decode(base64String);
49+
}
4650
}
4751

4852
const RNCryptoRsa = new CryptoRsaClass();

0 commit comments

Comments
 (0)