Skip to content

Commit 866b325

Browse files
committed
PHPLIB-929: Prose test for rewrapManyDataKey
1 parent e51710f commit 866b325

File tree

1 file changed

+78
-0
lines changed

1 file changed

+78
-0
lines changed

tests/SpecTests/ClientSideEncryptionSpecTest.php

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1640,6 +1640,84 @@ static function (self $test, Client $setupClient, ClientEncryption $clientEncryp
16401640
];
16411641
}
16421642

1643+
/**
1644+
* Prose test 16: RewrapManyDataKey
1645+
*
1646+
* @see https://github.com/mongodb/specifications/blob/master/source/client-side-encryption/tests/README.rst#rewrap
1647+
* @dataProvider provideRewrapManyDataKeySrcAndDstProviders
1648+
*/
1649+
public function testRewrapManyDataKey(string $srcProvider, string $dstProvider): void
1650+
{
1651+
$providerMasterKeys = [
1652+
'aws' => ['region' => 'us-east-1', 'key' => 'arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0'],
1653+
'azure' => ['keyVaultEndpoint' => 'key-vault-csfle.vault.azure.net', 'keyName' => 'key-name-csfle'],
1654+
'gcp' => ['projectId' => 'devprod-drivers', 'location' => 'global', 'keyRing' => 'key-ring-csfle', 'keyName' => 'key-name-csfle'],
1655+
'kmip' => [],
1656+
];
1657+
1658+
// Test setup
1659+
$client = static::createTestClient();
1660+
1661+
// Ensure that the key vault is dropped with a majority write concern
1662+
self::insertKeyVaultData($client, []);
1663+
1664+
$clientEncryptionOpts = [
1665+
'keyVaultNamespace' => 'keyvault.datakeys',
1666+
'kmsProviders' => [
1667+
'aws' => Context::getAWSCredentials(),
1668+
'azure' => Context::getAzureCredentials(),
1669+
'gcp' => Context::getGCPCredentials(),
1670+
'kmip' => ['endpoint' => Context::getKmipEndpoint()],
1671+
'local' => ['key' => new Binary(base64_decode(self::LOCAL_MASTERKEY), 0)],
1672+
],
1673+
'tlsOptions' => [
1674+
'kmip' => Context::getKmsTlsOptions(),
1675+
],
1676+
];
1677+
1678+
$clientEncryption1 = $client->createClientEncryption($clientEncryptionOpts);
1679+
1680+
$createDataKeyOpts = [];
1681+
1682+
if (isset($providerMasterKeys[$srcProvider])) {
1683+
$createDataKeyOpts['masterKey'] = $providerMasterKeys[$srcProvider];
1684+
}
1685+
1686+
$keyId = $clientEncryption1->createDataKey($srcProvider, $createDataKeyOpts);
1687+
1688+
$ciphertext = $clientEncryption1->encrypt('test', ['algorithm' => ClientEncryption::AEAD_AES_256_CBC_HMAC_SHA_512_DETERMINISTIC, 'keyId' => $keyId]);
1689+
1690+
$clientEncryption2 = $client->createClientEncryption($clientEncryptionOpts);
1691+
1692+
$rewrapManyDataKeyOpts = ['provider' => $dstProvider];
1693+
1694+
if (isset($providerMasterKeys[$dstProvider])) {
1695+
$rewrapManyDataKeyOpts['masterKey'] = $providerMasterKeys[$dstProvider];
1696+
}
1697+
1698+
$result = $clientEncryption2->rewrapManyDataKey([], $rewrapManyDataKeyOpts);
1699+
1700+
$this->assertObjectHasAttribute('bulkWriteResult', $result);
1701+
$this->assertIsObject($result->bulkWriteResult);
1702+
// libmongoc uses different field names for its BulkWriteResult
1703+
$this->assertObjectHasAttribute('nModified', $result->bulkWriteResult);
1704+
$this->assertSame(1, $result->bulkWriteResult->nModified);
1705+
1706+
$this->assertSame('test', $clientEncryption1->decrypt($ciphertext));
1707+
$this->assertSame('test', $clientEncryption2->decrypt($ciphertext));
1708+
}
1709+
1710+
public static function provideRewrapManyDataKeySrcAndDstProviders()
1711+
{
1712+
$providers = ['aws', 'azure', 'gcp', 'kmip', 'local'];
1713+
1714+
foreach ($providers as $srcProvider) {
1715+
foreach ($providers as $dstProvider) {
1716+
yield [$srcProvider, $dstProvider];
1717+
}
1718+
}
1719+
}
1720+
16431721
private function createInt64(string $value): Int64
16441722
{
16451723
$array = sprintf('a:1:{s:7:"integer";s:%d:"%s";}', strlen($value), $value);

0 commit comments

Comments
 (0)