+static void testkeygen3(size_t keySizeInBits) {
+ SecKeyRef pubKey = NULL, privKey = NULL;
+ size_t keySizeInBytes = (keySizeInBits + 7) / 8;
+ CFNumberRef kzib;
+
+ kzib = CFNumberCreate(NULL, kCFNumberSInt64Type, &keySizeInBits);
+ CFMutableDictionaryRef kgp = CFDictionaryCreateMutable(NULL, 0, NULL, NULL);
+ CFDictionaryAddValue(kgp, kSecAttrKeyType, kSecAttrKeyTypeECSECPrimeRandom);
+ CFDictionaryAddValue(kgp, kSecAttrKeySizeInBits, kzib);
+ CFDictionaryAddValue(kgp, kSecAttrIsPermanent, kCFBooleanFalse);
+
+ ok(privKey = SecKeyCreateRandomKey(kgp, NULL));
+ CFRelease(kzib);
+ CFRelease(kgp);
+
+ ok(pubKey = SecKeyCopyPublicKey(privKey));
+ is(CFGetRetainCount(pubKey),1);
+
+ /* Sign something. */
+ uint8_t something[20] = {0x80, 0xbe, 0xef, 0xba, 0xd0, };
+ uint8_t sig[8+2*keySizeInBytes];
+ size_t sigLen = sizeof(sig);
+ ok_status(SecKeyRawSign(privKey, kSecPaddingNone,
+ something, sizeof(something), sig, &sigLen), "sign something");
+ ok_status(SecKeyRawVerify(pubKey, kSecPaddingNone,
+ something, sizeof(something), sig, sigLen), "verify sig on something");
+
+ /* Cleanup. */
+ CFReleaseNull(pubKey);
+ CFReleaseNull(privKey);
+}
+
+