Skip to content
This repository was archived by the owner on Jul 19, 2024. It is now read-only.

Commit 1c8416f

Browse files
committed
Java Storage Client Library 4.0-alpha-1 Encryption Preview
1 parent eabe17d commit 1c8416f

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

57 files changed

+6228
-774
lines changed

ChangeLog.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
2015.10.05 Version 4.0-alpha-1
2+
* Added preview support for client side encryption for blobs, queues and tables.
3+
14
2015.10.05 Version 4.0.0
25
* Removed deprecated table AtomPub support.
36
* Removed deprecated constructors which take service clients in favor of constructors which take credentials.
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
/**
2+
* Copyright Microsoft Corporation
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
* http://www.apache.org/licenses/LICENSE-2.0
8+
*
9+
* Unless required by applicable law or agreed to in writing, software
10+
* distributed under the License is distributed on an "AS IS" BASIS,
11+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
* See the License for the specific language governing permissions and
13+
* limitations under the License.
14+
*/
15+
package com.microsoft.azure.storage;
16+
17+
import java.util.HashMap;
18+
import java.util.Map;
19+
import java.util.concurrent.Future;
20+
21+
import org.apache.commons.lang3.concurrent.ConcurrentUtils;
22+
23+
import com.microsoft.azure.keyvault.core.IKey;
24+
import com.microsoft.azure.keyvault.core.IKeyResolver;
25+
26+
public class DictionaryKeyResolver implements IKeyResolver {
27+
private Map<String, IKey> keys = new HashMap<String, IKey>();
28+
29+
public void add(IKey key)
30+
{
31+
this.keys.put(key.getKid(), key);
32+
}
33+
34+
@Override
35+
public Future<IKey> resolveKeyAsync(String keyId)
36+
{
37+
return ConcurrentUtils.constantFuture(this.keys.get(keyId));
38+
}
39+
}

microsoft-azure-storage-test/src/com/microsoft/azure/storage/ServicePropertiesTests.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -830,7 +830,7 @@ else if (client.getClass().equals(CloudFileClient.class)) {
830830
fail();
831831
}
832832

833-
// Thread.sleep(30000);
833+
Thread.sleep(30000);
834834
}
835835

836836
private ServiceProperties callDownloadServiceProperties(ServiceClient client) throws StorageException {

microsoft-azure-storage-test/src/com/microsoft/azure/storage/TestHelper.java

Lines changed: 37 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,22 @@
1919
import java.io.ByteArrayInputStream;
2020
import java.io.File;
2121
import java.io.IOException;
22+
import java.io.InputStream;
2223
import java.net.URI;
2324
import java.net.URISyntaxException;
2425
import java.net.URL;
2526
import java.security.InvalidKeyException;
27+
import java.security.KeyPair;
28+
import java.security.KeyPairGenerator;
29+
import java.security.NoSuchAlgorithmException;
30+
2631
import java.util.ArrayList;
2732
import java.util.Arrays;
2833
import java.util.Random;
2934

35+
import javax.crypto.KeyGenerator;
36+
import javax.crypto.NoSuchPaddingException;
37+
import javax.crypto.SecretKey;
3038
import javax.xml.parsers.DocumentBuilder;
3139
import javax.xml.parsers.DocumentBuilderFactory;
3240
import javax.xml.parsers.ParserConfigurationException;
@@ -37,6 +45,8 @@
3745
import org.w3c.dom.NodeList;
3846
import org.xml.sax.SAXException;
3947

48+
import com.microsoft.azure.keyvault.extensions.RsaKey;
49+
import com.microsoft.azure.keyvault.extensions.SymmetricKey;
4050
import com.microsoft.azure.storage.analytics.CloudAnalyticsClient;
4151
import com.microsoft.azure.storage.blob.CloudBlobClient;
4252
import com.microsoft.azure.storage.file.CloudFileClient;
@@ -193,16 +203,21 @@ public static URI securePortUri(URI uri, boolean useHttps, char service) throws
193203
return new URI(scheme, uri.getUserInfo(), uri.getHost(), port, uri.getPath(), uri.getQuery(), uri.getFragment());
194204
}
195205

196-
public static void assertStreamsAreEqual(ByteArrayInputStream src, ByteArrayInputStream dst) {
206+
public static void assertStreamsAreEqual(InputStream src, InputStream dst) throws IOException {
197207
dst.reset();
198208
src.reset();
199-
assertEquals(src.available(), dst.available());
200209

201-
while (src.available() > 0) {
202-
assertEquals(src.read(), dst.read());
210+
int next = src.read();
211+
while (next != -1) {
212+
assertEquals(next, dst.read());
213+
next = src.read();
203214
}
204215

205-
assertFalse(dst.available() > 0);
216+
next = dst.read();
217+
while (next != -1) {
218+
assertEquals(0, next);
219+
next = dst.read();
220+
}
206221
}
207222

208223
public static void assertStreamsAreEqualAtIndex(ByteArrayInputStream src, ByteArrayInputStream dst, int srcIndex,
@@ -212,10 +227,6 @@ public static void assertStreamsAreEqualAtIndex(ByteArrayInputStream src, ByteAr
212227

213228
dst.skip(dstIndex);
214229
src.skip(srcIndex);
215-
byte[] srcBuffer = new byte[bufferSize];
216-
byte[] destBuffer = new byte[bufferSize];
217-
src.read(srcBuffer);
218-
dst.read(destBuffer);
219230

220231
for (int i = 0; i < length; i++) {
221232
assertEquals(src.read(), dst.read());
@@ -255,6 +266,23 @@ public static URI defiddler(URI uri) throws URISyntaxException {
255266
return uri;
256267
}
257268
}
269+
270+
public static SymmetricKey getSymmetricKey() throws NoSuchAlgorithmException, NoSuchPaddingException,
271+
InvalidKeyException {
272+
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
273+
keyGen.init(128);
274+
SecretKey wrapKey = keyGen.generateKey();
275+
276+
return new SymmetricKey("symmKey1", wrapKey.getEncoded());
277+
}
278+
279+
public static RsaKey getRSAKey() throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException {
280+
final KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
281+
keyGen.initialize(1024);
282+
final KeyPair wrapKey = keyGen.generateKeyPair();
283+
284+
return new RsaKey("rsaKey1", wrapKey);
285+
}
258286

259287
public static void verifyServiceStats(ServiceStats stats) {
260288
assertNotNull(stats);

microsoft-azure-storage-test/src/com/microsoft/azure/storage/TestRunners.java

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import com.microsoft.azure.storage.blob.CloudBlobClientTests;
1414
import com.microsoft.azure.storage.blob.CloudBlobContainerTests;
1515
import com.microsoft.azure.storage.blob.CloudBlobDirectoryTests;
16+
import com.microsoft.azure.storage.blob.CloudBlobEncryptionTests;
1617
import com.microsoft.azure.storage.blob.CloudBlockBlobTests;
1718
import com.microsoft.azure.storage.blob.CloudPageBlobTests;
1819
import com.microsoft.azure.storage.blob.LeaseTests;
@@ -24,10 +25,12 @@
2425
import com.microsoft.azure.storage.file.FileSasTests;
2526
import com.microsoft.azure.storage.queue.CloudQueueClientGB18030Test;
2627
import com.microsoft.azure.storage.queue.CloudQueueClientTests;
28+
import com.microsoft.azure.storage.queue.CloudQueueEncryptionTests;
2729
import com.microsoft.azure.storage.queue.CloudQueueTests;
2830
import com.microsoft.azure.storage.table.TableBatchOperationTests;
2931
import com.microsoft.azure.storage.table.TableClientTests;
3032
import com.microsoft.azure.storage.table.TableDateTests;
33+
import com.microsoft.azure.storage.table.TableEncryptionTests;
3134
import com.microsoft.azure.storage.table.TableEscapingTests;
3235
import com.microsoft.azure.storage.table.TableODataTests;
3336
import com.microsoft.azure.storage.table.TableOperationTests;
@@ -98,19 +101,20 @@ public static class CoreTestSuite {
98101
@RunWith(Suite.class)
99102
@SuiteClasses({ BlobOutputStreamTests.class, CloudBlobClientTests.class, CloudBlobContainerTests.class,
100103
CloudBlobDirectoryTests.class, CloudAppendBlobTests.class, CloudBlockBlobTests.class, CloudPageBlobTests.class,
101-
LeaseTests.class, SasTests.class })
104+
CloudBlobEncryptionTests.class, LeaseTests.class, SasTests.class })
102105
public static class BlobTestSuite {
103106
}
104107

105108
@RunWith(Suite.class)
106-
@SuiteClasses({ CloudQueueClientGB18030Test.class, CloudQueueClientTests.class, CloudQueueTests.class })
109+
@SuiteClasses({ CloudQueueClientGB18030Test.class, CloudQueueClientTests.class, CloudQueueEncryptionTests.class,
110+
CloudQueueTests.class })
107111
public static class QueueTestSuite {
108112
}
109113

110114
@RunWith(Suite.class)
111-
@SuiteClasses({ TableBatchOperationTests.class, TableClientTests.class, TableDateTests.class, TableEscapingTests.class,
112-
TableODataTests.class, TableOperationTests.class, TableQueryTests.class, TableSerializerTests.class,
113-
TableTests.class })
115+
@SuiteClasses({ TableBatchOperationTests.class, TableClientTests.class, TableDateTests.class,
116+
TableEncryptionTests.class, TableEscapingTests.class, TableODataTests.class, TableOperationTests.class,
117+
TableQueryTests.class, TableSerializerTests.class, TableTests.class })
114118
public static class TableTestSuite {
115119
}
116120

@@ -124,6 +128,11 @@ public static class FileTestSuite {
124128
@SuiteClasses({ CloudAnalyticsClientTests.class })
125129
public static class AnalyticsTestSuite {
126130
}
131+
132+
@RunWith(Suite.class)
133+
@SuiteClasses({ CloudBlobEncryptionTests.class, CloudQueueEncryptionTests.class, TableEncryptionTests.class })
134+
public static class EncryptionTestSuite {
135+
}
127136

128137
@RunWith(Suite.class)
129138
@SuiteClasses({ CoreTestSuite.class, BlobTestSuite.class, QueueTestSuite.class, TableTestSuite.class,

microsoft-azure-storage-test/src/com/microsoft/azure/storage/blob/CloudAppendBlobTests.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -442,7 +442,7 @@ public void testAppendBlobDownloadRangeTest() throws URISyntaxException,
442442
ByteArrayOutputStream blobStream2 = new ByteArrayOutputStream();
443443
blob2.downloadRange(1024, new Long(1024), blobStream2);
444444
BlobTestHelper.assertStreamsAreEqualAtIndex(new ByteArrayInputStream(
445-
blobStream2.toByteArray()), wholeBlob, 1024, 1024, 1024,
445+
blobStream2.toByteArray()), wholeBlob, 0, 1024, 1024,
446446
2 * 1024);
447447

448448
BlobTestHelper.assertAreEqual(blob, blob2);

0 commit comments

Comments
 (0)