@@ -1640,6 +1640,84 @@ static function (self $test, Client $setupClient, ClientEncryption $clientEncryp
1640
1640
];
1641
1641
}
1642
1642
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
+
1643
1721
private function createInt64 (string $ value ): Int64
1644
1722
{
1645
1723
$ array = sprintf ('a:1:{s:7:"integer";s:%d:"%s";} ' , strlen ($ value ), $ value );
0 commit comments