/* AuthSignature.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.util.Arrays; import java.util.HashMap; import java.util.Map; /** * Signatureクラス. * * <pre> * (例) * String signature = AuthSignature.generateSignature("clientId", "grantType", * "serviceId", new String[] {"scope1", "scope2"}, clientSecret); * </pre> * @author NTT DOCOMO, INC. */ public final class AuthSignature { /** * 暗号処理の種類. */ public enum SignatureKind { /** 暗号処理の種類. */ RSA1024, /** 暗号処理の種類. */ MD2, /** 暗号処理の種類. */ MD5, /** 暗号処理の種類. */ SHA, /** 暗号処理の種類. */ SHA256, /** 暗号処理の種類. */ SHA384, /** 暗号処理の種類. */ SHA512, }; /** * 入力文字列. */ private Map<String, String> mInputMaps = new HashMap<String, String>(); /** * Signature生成処理. */ private SignatureProc mSignatureProc = null; /** * コンストラクタ. * @param signatureKind 暗号化処理の種類 */ public AuthSignature(final SignatureKind signatureKind) { mSignatureProc = SignatureFactory.getInstance(signatureKind); } /** * 公開鍵設定. * @param cipherPublicKey 公開鍵設定 */ public void setCipherPublicKey(final String cipherPublicKey) { mSignatureProc.setCipherPublicKey(cipherPublicKey); } /** * 連結文字列バッファをクリアする. */ private void empty() { mInputMaps = new HashMap<String, String>(); } /** * 連結する文字列を追加する. * * @param key キー * @param value バリュー */ private void put(final String key, final String value) { mInputMaps.put(key, value); } /** * Signatureを生成して返す. * @param clientSecret クライアントシークレット * @return Signature */ private String generateSignature(final String clientSecret) { Object[] keys = mInputMaps.keySet().toArray(); Arrays.sort(keys); String str = ""; for (int i = 0; i < keys.length; i++) { str += keys[i]; str += mInputMaps.get(keys[i]); } str += "clientSecret"; str += clientSecret; String signature = mSignatureProc.generateSignature(str); return signature; } /** * Signature生成(アクセストークン発行リクエストを送信するときに添付するSignatureを生成する). * * @param clientId クライアントID * @param grantType グラントタイプ * @param serviceId サービスID(UIアプリのときはnullまたは""を指定する) * @param scopes スコープ * @param clientSecret クライアントシークレット * @return Signature */ public static String generateSignature(final String clientId, final String grantType, final String serviceId, final String[] scopes, final String clientSecret) { AuthSignature authSignature = new AuthSignature(AuthSignature.SignatureKind.SHA512); authSignature.empty(); authSignature.put("clientId", clientId); authSignature.put("grantType", grantType); if (serviceId != null && serviceId.length() > 0) { authSignature.put("serviceId", serviceId); } String strScopes = ""; Arrays.sort(scopes); for (int i = 0; i < scopes.length; i++) { String scope = scopes[i]; if (i > 0) { strScopes += ","; } strScopes += scope; } authSignature.put("scopes", strScopes); String signature = authSignature.generateSignature(clientSecret); return signature; } /** * アクセストークン発行のレスポンスを返信するときに添付するSignatureを生成する. * * @param accessToken アクセストークン * @param clientSecret クライアントシークレット * @return Signature */ public static String generateSignature(final String accessToken, final String clientSecret) { AuthSignature authSignature = new AuthSignature(AuthSignature.SignatureKind.SHA512); authSignature.empty(); authSignature.put("accessToken", accessToken); String signature = authSignature.generateSignature(clientSecret); return signature; } }