@@ -35,13 +35,16 @@ class CryptoRsa: NSObject {
35
35
}
36
36
37
37
func getKeyFromKeychain( tag: String ) -> SecKey ? {
38
- let query : [ String : Any ] = [
38
+ var query : [ String : Any ] = [
39
39
kSecClass as String : kSecClassKey,
40
40
kSecAttrApplicationTag as String : tag,
41
41
kSecAttrKeyType as String : kSecAttrKeyTypeRSA,
42
- kSecReturnRef as String : true ,
43
- kSecReturnData as String : kCFBooleanTrue ?? true
44
42
]
43
+ if ( tag == publicTag) {
44
+ query [ kSecReturnData as String ] = kCFBooleanTrue ?? true
45
+ } else {
46
+ query [ kSecReturnRef as String ] = true
47
+ }
45
48
46
49
var item : CFTypeRef ?
47
50
let status = SecItemCopyMatching ( query as CFDictionary , & item)
@@ -178,6 +181,11 @@ class CryptoRsa: NSObject {
178
181
func encrypt( message: String , pemString: String , resolve: RCTPromiseResolveBlock , reject: RCTPromiseRejectBlock ) -> Void {
179
182
guard let data = message. data ( using: . utf8) else { return reject ( nil , nil , RuntimeError ( " Data is null " ) ) }
180
183
184
+ // 데이터 크기 확인 (예시: RSA 키 크기 2048비트, 최대 데이터 크기 245바이트)
185
+ if data. count > 245 {
186
+ return reject ( nil , nil , RuntimeError ( " Data size too large for RSA encryption " ) )
187
+ }
188
+
181
189
guard let publicKey = pemStringToPublicKey ( pemString) else {
182
190
return reject ( nil , nil , RuntimeError ( " pemStringTopublicKey is null " ) )
183
191
}
@@ -193,34 +201,39 @@ class CryptoRsa: NSObject {
193
201
return reject ( nil , nil , RuntimeError ( " Encryption error: \( ( error? . takeRetainedValue ( ) ) !) " ) )
194
202
}
195
203
196
- resolve ( cipherData . base64EncodedString ( ) )
204
+ resolve ( base64EncodeString ( cipherData ) )
197
205
}
198
206
199
207
@objc ( decrypt: withResolver: withRejecter: )
200
208
func decrypt( encryptedDataString: String , resolve: RCTPromiseResolveBlock , reject: RCTPromiseRejectBlock ) -> Any ? {
201
209
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 " ) )
204
212
}
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
208
226
}
209
- print ( " Load privateKey in KeyChain : " , loadedPrivateKey)
210
227
211
228
guard SecKeyIsAlgorithmSupported ( loadedPrivateKey, . decrypt, secKeyAlgorithm) else {
212
- reject ( nil , nil , RuntimeError ( " SecKeyIsAlgorithm not supported " ) )
229
+ reject ( nil , nil , RuntimeError ( " SecKeyIsAlgorithm not supported " ) )
213
230
return nil
214
231
}
215
- var error : Unmanaged < CFError > ?
216
232
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 " ) " ) )
224
237
}
225
238
226
239
return resolve ( String ( data: clearData, encoding: . utf8) )
0 commit comments