| 717 | } |
| 718 | |
| 719 | void testPrivateKey(PrivateKey (*factory)()) { |
| 720 | // stringify-deserialize private key. |
| 721 | // sign some data using deserialized private key to see whether public key can verify it. |
| 722 | auto& rng = *deterministicRandom(); |
| 723 | auto privKeyName = Standalone<StringRef>("somePrivateKey"_sr); |
| 724 | auto privKey = factory(); |
| 725 | auto pubKey = privKey.toPublic(); |
| 726 | auto jwks = JsonWebKeySet{}; |
| 727 | jwks.keys.emplace(privKeyName, privKey); |
| 728 | auto arena = Arena(); |
| 729 | auto jwksStr = jwks.toStringRef(arena).get(); |
| 730 | fmt::print("Test JWKS: {}\n", jwksStr.toString()); |
| 731 | auto jwksClone = JsonWebKeySet::parse(jwksStr, {}); |
| 732 | ASSERT(jwksClone.present()); |
| 733 | auto privKeyClone = jwksClone.get().keys[privKeyName].getPrivate(); |
| 734 | auto randByteStr = [&rng, &arena](int len) { |
| 735 | auto buf = new (arena) uint8_t[len]; |
| 736 | for (auto i = 0; i < len; i++) |
| 737 | buf[i] = rng.randomUInt32() % 255u; |
| 738 | return StringRef(buf, len); |
| 739 | }; |
| 740 | auto randData = randByteStr(rng.randomUInt32() % 128 + 16); |
| 741 | auto signature = privKeyClone.sign(arena, randData, *::EVP_sha256()); |
| 742 | ASSERT(pubKey.verify(randData, signature, *::EVP_sha256())); |
| 743 | const_cast<uint8_t&>(*randData.begin())++; |
| 744 | ASSERT(!pubKey.verify(randData, signature, *::EVP_sha256())); |
| 745 | fmt::print("TESTED OK FOR OPENSSL V{} API\n", (OPENSSL_VERSION_NUMBER >> 28)); |
| 746 | } |
| 747 | |
| 748 | } // anonymous namespace |
| 749 |
no test coverage detected