diff options
author | Tarun Gupta <tarun1995gupta@gmail.com> | 2015-06-02 15:57:26 (GMT) |
---|---|---|
committer | Tarun Gupta <tarun1995gupta@gmail.com> | 2015-06-14 13:25:54 (GMT) |
commit | da6b027a42d980cd918e299b2b0a1e9f7f0c9caa (patch) | |
tree | 5c222d48ade235766c72be909e46ca5366784e16 /src/com/isode/stroke/crypto | |
parent | d90c2cadb3d1bb2b849a448d3482b504bc4706bb (diff) | |
download | stroke-da6b027a42d980cd918e299b2b0a1e9f7f0c9caa.zip stroke-da6b027a42d980cd918e299b2b0a1e9f7f0c9caa.tar.bz2 |
Add support for Crypto-functions.
Completes the JavaCryptoProvider providing functionalities for SHA-1 Hash, MD5 Hash and HMACSHA1 Hash.
Also updates reference for JavaCryptoProvider in JavaNetworkFactories.
License:
This patch is BSD-licensed, see Documentation/Licenses/BSD-simplified.txt for details.
Test-Information:
Tests are added for JavaCryptoProvider, which passes.
Change-Id: I2439e5fd76a23e9b5c4e9132a9856543a7ca53fd
Diffstat (limited to 'src/com/isode/stroke/crypto')
-rw-r--r-- | src/com/isode/stroke/crypto/JavaCryptoProvider.java | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/src/com/isode/stroke/crypto/JavaCryptoProvider.java b/src/com/isode/stroke/crypto/JavaCryptoProvider.java new file mode 100644 index 0000000..1353225 --- /dev/null +++ b/src/com/isode/stroke/crypto/JavaCryptoProvider.java @@ -0,0 +1,144 @@ +/* + * Copyright (c) 2011-2015 Isode Limited, London, England. + * All rights reserved. + */ +/* + * Copyright (c) 2015 Tarun Gupta. + * Licensed under the simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +package com.isode.stroke.crypto; + +import com.isode.stroke.crypto.CryptoProvider; +import com.isode.stroke.crypto.Hash; +import com.isode.stroke.base.ByteArray; +import com.isode.stroke.base.SafeByteArray; +import com.isode.stroke.base.NotNull; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.security.SignatureException; +import java.security.InvalidKeyException; +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; +import java.lang.IllegalStateException; + +public class JavaCryptoProvider extends CryptoProvider { + + private static class HashProvider implements Hash { + + private final MessageDigest digest; + + /** + * Constructor, MessageDigest object that implements MD5 / SHA1. + */ + public HashProvider(String algorithm) { + try { + digest = MessageDigest.getInstance(algorithm); + } + catch (NoSuchAlgorithmException e) { + throw new RuntimeException(e.getMessage()); + } + } + + /** + * Updates the digest using the ByteArray. + * @param data, NotNull. + * @return Hash updated with data. + */ + @Override + public Hash update(ByteArray data) { + NotNull.exceptIfNull(data, "data"); + digest.update(data.getData()); + return this; + } + + /** + * Updates the digest using the SafeByteArray. + * @param data, NotNull. + * @return Hash updated with data. + */ + @Override + public Hash update(SafeByteArray data) { + NotNull.exceptIfNull(data, "data"); + digest.update(data.getData()); + return this; + } + + /** + * Completes the MD5/SHA1 hash computation. + * @return ByteArray containing the MD5/SHA1 Hash. + */ + @Override + public ByteArray getHash() { + return new ByteArray(digest.digest()); + } + + } + + /** + * Computes the HMACSHA1 hash computation. + * @param key NotNull. Key is used for initializing MAC object. + * @param data NotNull. + * @return ByteArray containing the HMACSHA1 Hash. + */ + public ByteArray getHMACSHA1Internal(final ByteArray key, final ByteArray data) { + NotNull.exceptIfNull(key, "key"); + NotNull.exceptIfNull(data, "data"); + try { + SecretKeySpec signingKey = new SecretKeySpec(key.getData(), "HmacSHA1"); + Mac mac = Mac.getInstance("HmacSHA1"); + mac.init(signingKey); + mac.update(data.getData()); + byte[] Hmac = mac.doFinal(); + return (new ByteArray(Hmac)); + } catch (NoSuchAlgorithmException e) { + throw new RuntimeException(e.getMessage()); + } catch (InvalidKeyException e) { + throw new RuntimeException(e.getMessage()); + } + } + + /** + * Creates the SHA1Hash object for performing hash computations. + * @return SHA1Hash object. + */ + @Override + public Hash createSHA1() { + return new HashProvider("SHA-1"); + } + + /** + * Creates the SHA1Hash object for performing hash computations. + * @return MD5Hash object. + */ + @Override + public Hash createMD5() { + return new HashProvider("MD5"); + } + + /** + * @param key, NotNull. + * @param data, NotNull. + * @return ByteArray containing the HMACSHA1 Hash. + */ + @Override + public ByteArray getHMACSHA1(final SafeByteArray key, final ByteArray data) { + return getHMACSHA1Internal(key, data); + } + + /** + * @param key, NotNull. + * @param data, NotNull. + * @return ByteArray containing the HMACSHA1 Hash. + */ + @Override + public ByteArray getHMACSHA1(final ByteArray key, final ByteArray data) { + return getHMACSHA1Internal(key, data); + } + + @Override + public boolean isMD5AllowedForCrypto() { + return false; + } +}
\ No newline at end of file |