PassRefPtr<CryptoKeyRSA> CryptoKeyRSA::create(CryptoAlgorithmIdentifier identifier, const CryptoKeyDataRSAComponents& keyData, bool extractable, CryptoKeyUsage usage) { if (keyData.type() == CryptoKeyDataRSAComponents::Type::Private && !keyData.hasAdditionalPrivateKeyParameters()) { // <rdar://problem/15452324> tracks adding support. WTFLogAlways("Private keys without additional data are not supported"); return nullptr; } if (keyData.otherPrimeInfos().size()) { // <rdar://problem/15444074> tracks adding support. WTFLogAlways("Keys with more than two primes are not supported"); return nullptr; } CCRSACryptorRef cryptor; CCCryptorStatus status = CCRSACryptorCreateFromData( keyData.type() == CryptoKeyDataRSAComponents::Type::Public ? ccRSAKeyPublic : ccRSAKeyPrivate, (uint8_t*)keyData.modulus().data(), keyData.modulus().size(), (uint8_t*)keyData.exponent().data(), keyData.exponent().size(), (uint8_t*)keyData.firstPrimeInfo().primeFactor.data(), keyData.firstPrimeInfo().primeFactor.size(), (uint8_t*)keyData.secondPrimeInfo().primeFactor.data(), keyData.secondPrimeInfo().primeFactor.size(), &cryptor); if (status) { LOG_ERROR("Couldn't create RSA key from data, error %d", status); return nullptr; } return adoptRef(new CryptoKeyRSA(identifier, keyData.type() == CryptoKeyDataRSAComponents::Type::Public ? CryptoKeyType::Public : CryptoKeyType::Private, cryptor, extractable, usage)); }
RefPtr<CryptoKeyRSA> CryptoKeyRSA::create(CryptoAlgorithmIdentifier identifier, CryptoAlgorithmIdentifier hash, bool hasHash, const CryptoKeyDataRSAComponents& keyData, bool extractable, CryptoKeyUsageBitmap usage) { if (keyData.type() == CryptoKeyDataRSAComponents::Type::Private && !keyData.hasAdditionalPrivateKeyParameters()) { // <rdar://problem/15452324> tracks adding support. WTFLogAlways("Private keys without additional data are not supported"); return nullptr; } if (keyData.otherPrimeInfos().size()) { // <rdar://problem/15444074> tracks adding support. WTFLogAlways("Keys with more than two primes are not supported"); return nullptr; } CCRSACryptorRef cryptor; // FIXME: It is so weired that we recaculate the private exponent from first prime factor and second prime factor, // given the fact that we have already had it. Also, the re-caculated private exponent may not match the given one. // See <rdar://problem/15452324>. CCCryptorStatus status = CCRSACryptorCreateFromData( keyData.type() == CryptoKeyDataRSAComponents::Type::Public ? ccRSAKeyPublic : ccRSAKeyPrivate, (uint8_t*)keyData.modulus().data(), keyData.modulus().size(), (uint8_t*)keyData.exponent().data(), keyData.exponent().size(), (uint8_t*)keyData.firstPrimeInfo().primeFactor.data(), keyData.firstPrimeInfo().primeFactor.size(), (uint8_t*)keyData.secondPrimeInfo().primeFactor.data(), keyData.secondPrimeInfo().primeFactor.size(), &cryptor); if (status) { LOG_ERROR("Couldn't create RSA key from data, error %d", status); return nullptr; } return adoptRef(new CryptoKeyRSA(identifier, hash, hasHash, keyData.type() == CryptoKeyDataRSAComponents::Type::Public ? CryptoKeyType::Public : CryptoKeyType::Private, cryptor, extractable, usage)); }