Comments (2)
I have no plan for Mac OS X, but I suggest you using openssl library for OS X.
from objective-c-rsa.
Can been supported by using this code below to create SecKeyRef
and some compatible implementations using old APIs.
For SecKeyRawSign/SecKeyEncrypt/SecKeyDecrypt
:
#if TARGET_OS_OSX
#pragma clang diagnostic push
#pragma clang diagnostic ignored"-Wnonnull"
static OSStatus OSXSecKeyRawSign(SecKeyRef key, SecPadding padding, const uint8_t *plainText, size_t plainTextLen, uint8_t *cipherText, size_t *cipherTextLen)
{
CFErrorRef error = NULL;
SecTransformRef encrypt = SecEncryptTransformCreate(key, &error);
if (error) {
NSLog(@"Encryption failed: %@\n", (__bridge NSError *)error);
return (OSStatus)[(__bridge NSError *)error code];
}
CFDataRef sourceData = CFDataCreate(kCFAllocatorDefault, plainText, plainTextLen);
SecTransformSetAttribute(encrypt, kSecTransformInputAttributeName,
sourceData, &error);
CFDataRef encryptedData = SecTransformExecute(encrypt, &error);
if (error) {
NSLog(@"Encryption failed: %@\n", (__bridge NSError *)error);
return (OSStatus)[(__bridge NSError *)error code];
}
if ((unsigned long)CFDataGetLength(encryptedData) > *cipherTextLen) {
return errSecBufferTooSmall;
}
*cipherTextLen = CFDataGetLength(encryptedData);
CFDataGetBytes(encryptedData, CFRangeMake(0, *cipherTextLen), cipherText);
return noErr;
}
static OSStatus OSXSecKeyEncrypt(SecKeyRef key, SecPadding padding, const uint8_t *plainText, size_t plainTextLen, uint8_t *cipherText, size_t *cipherTextLen)
{
CFErrorRef error = NULL;
SecTransformRef encrypt = SecEncryptTransformCreate(key, &error);
if (error) {
NSLog(@"Encryption failed: %@\n", (__bridge NSError *)error);
return (OSStatus)[(__bridge NSError *)error code];
}
SecTransformSetAttribute(
encrypt,
kSecPaddingKey,
NULL,//kSecPaddingPKCS1Key (rdar://13661366 : NULL means kSecPaddingPKCS1Key and
//kSecPaddingPKCS1Key fails horribly)
&error);
CFDataRef sourceData = CFDataCreate(kCFAllocatorDefault, plainText, plainTextLen);
SecTransformSetAttribute(encrypt, kSecTransformInputAttributeName,
sourceData, &error);
CFDataRef encryptedData = SecTransformExecute(encrypt, &error);
if (error) {
NSLog(@"Encryption failed: %@\n", (__bridge NSError *)error);
return (OSStatus)[(__bridge NSError *)error code];
}
if ((unsigned long)CFDataGetLength(encryptedData) > *cipherTextLen) {
return errSecBufferTooSmall;
}
*cipherTextLen = CFDataGetLength(encryptedData);
CFDataGetBytes(encryptedData, CFRangeMake(0, *cipherTextLen), cipherText);
return noErr;
}
static OSStatus OSXSecKeyDecrypt(SecKeyRef key, SecPadding padding, const uint8_t *cipherText, size_t cipherTextLen, uint8_t *plainText, size_t *plainTextLen)
{
CFErrorRef error = NULL;
SecTransformRef decrypt = SecDecryptTransformCreate(key, &error);
if (error) {
NSLog(@"Decryption failed: %@\n", (__bridge NSError *)error);
return (OSStatus)[(__bridge NSError *)error code];
}
SecTransformSetAttribute(
decrypt,
kSecPaddingKey,
NULL,//kSecPaddingPKCS1Key (rdar://13661366 : NULL means kSecPaddingPKCS1Key and
//kSecPaddingPKCS1Key fails horribly)
&error);
CFDataRef sourceData = CFDataCreate(kCFAllocatorDefault, cipherText, cipherTextLen);
SecTransformSetAttribute(decrypt, kSecTransformInputAttributeName,
sourceData, &error);
CFDataRef decryptedData = SecTransformExecute(decrypt, &error);
if (error) {
NSLog(@"Decryption failed: %@\n", (__bridge NSError *)error);
return (OSStatus)[(__bridge NSError *)error code];
}
if ((unsigned long)CFDataGetLength(decryptedData) > *plainTextLen) {
return errSecBufferTooSmall;
}
*plainTextLen = CFDataGetLength(decryptedData);
CFDataGetBytes(decryptedData, CFRangeMake(0, *plainTextLen), plainText);
return noErr;
}
#pragma clang diagnostic pop
For SecKeyRef generation (don't use Keychain):
#if TARGET_OS_OSX
NSDictionary *publicKey = @{(__bridge NSString *)kSecAttrKeyType : (__bridge NSString *)kSecAttrKeyTypeRSA, (__bridge NSString *)kSecAttrKeyClass : (__bridge NSString *)kSecAttrKeyClassPublic};
SecKeyRef keyRef = SecKeyCreateFromData((__bridge CFDictionaryRef)publicKey, (__bridge CFDataRef)data, nil);
// SecKeyRef keyRef = SecKeyCreateWithData((__bridge CFDataRef)data, (__bridge CFDictionaryRef)publicKey, nil);
return keyRef;
#endif
from objective-c-rsa.
Related Issues (20)
- BEGIN RSA PUBLIC KEY
- 请问什么时候能支持私钥加密公钥解密啊?
- project returnung null values HOT 3
- 使用公钥加密后 java后台不能解密 HOT 2
- Can not decrypt HOT 3
- SecItemAdd status -34018 HOT 3
- Android sample HOT 3
- 请问有C#服务器的解密算法么? HOT 1
- RSA 加密线上失败,调试无法重现 HOT 7
- Can not decrypt with PKCS#1. HOT 1
- 应用在锁屏的时候解密失败,返回nil HOT 2
- RSA return -25308 errSecInteractionNotAllowed
- 并发时,SecItemCopyMatching方法会返回errSecItemNotFound HOT 5
- 在swift上加密后台不能解密 HOT 1
- 严重的bug HOT 1
- js怎么通过公钥解密?
- 并发的加解密会导致失败 HOT 1
- 这个库有两个严重的问题,使用前必看!!!
- 吴祖洋什么时候可以出来澄清,说下懒投资状态呢
- 请问 为什么解密时需要 把公钥存储到keychain? HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from objective-c-rsa.