/* SignatureProcMD.java Copyright (c) 2014 NTT DOCOMO,INC. Released under the MIT license http://opensource.org/licenses/mit-license.php */ package org.deviceconnect.android.cipher.signature; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import org.deviceconnect.android.cipher.signature.AuthSignature.SignatureKind; /** * MD*, SHA* を使った暗号化処理. * @author NTT DOCOMO, INC. */ public class SignatureProcMD implements SignatureProc { /** アルゴリズム名. */ private String mAlgorithmName = null; /** * コンストラクタ. * @param signatureKind 暗号種類 */ public SignatureProcMD(final SignatureKind signatureKind) { /* アルゴリズム名取得 */ mAlgorithmName = signatureKind2AlgorithmName(signatureKind); if (mAlgorithmName == null) { throw new IllegalArgumentException("signatureKind is not support."); } } /** * 指定された暗号種類をサポートするか判定. * @param signatureKind 暗号種類 * @return true: サポートする / false: サポートしない */ public static boolean isSupport(final AuthSignature.SignatureKind signatureKind) { boolean result = false; /* アルゴリズム名取得 */ String algorithmName = signatureKind2AlgorithmName(signatureKind); if (algorithmName != null) { result = true; } return result; } /** * アルゴリズム名取得. * @param signatureKind 暗号種別 * @return not null: アルゴリズム名 / null: 該当無し */ private static String signatureKind2AlgorithmName(final AuthSignature.SignatureKind signatureKind) { String algorithmName = null; /* メッセージダイジェストアルゴリズム(MD2, MD5, SHA, SHA-256, SHA-384, SHA-512が利用可能) */ if (signatureKind == SignatureKind.MD2) { algorithmName = "MD2"; } else if (signatureKind == SignatureKind.MD5) { algorithmName = "MD5"; } else if (signatureKind == SignatureKind.SHA) { algorithmName = "SHA"; } else if (signatureKind == SignatureKind.SHA256) { algorithmName = "SHA-256"; } else if (signatureKind == SignatureKind.SHA384) { algorithmName = "SHA-384"; } else if (signatureKind == SignatureKind.SHA512) { algorithmName = "SHA-512"; } return algorithmName; } /** * 暗号用公開鍵設定(使用しないのでnullを返す). * @param cipherPublicKey 公開鍵 */ @Override public void setCipherPublicKey(final String cipherPublicKey) { throw new RuntimeException("setCipherPublicKey() can't use."); } /** * 文字列を暗号化してSignatureを生成する. * * @param string 暗号化する文字列 * @return Signature */ public String generateSignature(final String string) { MessageDigest md; try { md = MessageDigest.getInstance(mAlgorithmName); } catch (NoSuchAlgorithmException e) { throw new RuntimeException(e); } md.update(string.getBytes()); byte[] b = md.digest(); String result = byte2String(b); return result; } /** * byte配列をstringに変換. * @param b byte配列 * @return string */ public static String byte2String(final byte[] b) { // ハッシュを16進数文字列に変換 StringBuffer sb = new StringBuffer(); int cnt = b.length; for (int i = 0; i < cnt; i++) { sb.append(Integer.toHexString((b[i] >> 4) & 0x0F)); sb.append(Integer.toHexString(b[i] & 0x0F)); } return sb.toString(); } }