From cb90852dfcc9226edaadff16f880db46be791e67 Mon Sep 17 00:00:00 2001 From: Brock Whitten Date: Wed, 24 Feb 2010 16:18:35 -0800 Subject: [PATCH] Adding Built-In Crypto Library --- framework/src/com/phonegap/CryptoHandler.java | 37 +++++++ framework/src/com/phonegap/DroidGap.java | 8 +- framework/src/com/phonegap/SimpleCrypto.java | 96 +++++++++++++++++++ 3 files changed, 138 insertions(+), 3 deletions(-) create mode 100644 framework/src/com/phonegap/CryptoHandler.java create mode 100644 framework/src/com/phonegap/SimpleCrypto.java diff --git a/framework/src/com/phonegap/CryptoHandler.java b/framework/src/com/phonegap/CryptoHandler.java new file mode 100644 index 00000000..ac6b26cc --- /dev/null +++ b/framework/src/com/phonegap/CryptoHandler.java @@ -0,0 +1,37 @@ +package com.phonegap; + +import android.webkit.WebView; + +public class CryptoHandler { + + WebView mView; + + CryptoHandler(WebView view) + { + mView = view; + } + + public void encrypt(String pass, String text) + { + try { + String encrypted = SimpleCrypto.encrypt(pass,text); + mView.loadUrl("javascript:Crypto.gotCryptedString('" + text + "')"); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + } + + public void decrypt(String pass, String text) + { + try { + String decrypted = SimpleCrypto.decrypt(pass,text); + mView.loadUrl("javascript:Crypto.gotPlainString('" + text + "')"); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + +} diff --git a/framework/src/com/phonegap/DroidGap.java b/framework/src/com/phonegap/DroidGap.java index bb96a73a..b2954ecc 100644 --- a/framework/src/com/phonegap/DroidGap.java +++ b/framework/src/com/phonegap/DroidGap.java @@ -60,8 +60,7 @@ public class DroidGap extends Activity { private NetworkManager netMan; private CompassListener mCompass; private Storage cupcakeStorage; - - + private CryptoHandler crypto; /** Called when the activity is first created. */ @Override @@ -134,7 +133,8 @@ public class DroidGap extends Activity { mContacts = new ContactManager(this, appView); fs = new FileUtils(appView); netMan = new NetworkManager(this, appView); - mCompass = new CompassListener(this, appView); + mCompass = new CompassListener(this, appView); + crypto = new CryptoHandler(appView); // This creates the new javascript interfaces for PhoneGap appView.addJavascriptInterface(gap, "DroidGap"); @@ -145,6 +145,8 @@ public class DroidGap extends Activity { appView.addJavascriptInterface(fs, "FileUtil"); appView.addJavascriptInterface(netMan, "NetworkManager"); appView.addJavascriptInterface(mCompass, "CompassHook"); + appView.addJavascriptInterface(crypto, "GapCrypto"); + if (android.os.Build.VERSION.SDK_INT <= android.os.Build.VERSION_CODES.DONUT) { cupcakeStorage = new Storage(appView); diff --git a/framework/src/com/phonegap/SimpleCrypto.java b/framework/src/com/phonegap/SimpleCrypto.java new file mode 100644 index 00000000..1f877427 --- /dev/null +++ b/framework/src/com/phonegap/SimpleCrypto.java @@ -0,0 +1,96 @@ +/* + * Code originally found on Android Snippets + * Contributed to snippets Ferenc Hechler + * Copyright (c) 2009 Ferenc Hechler + */ + +package com.phonegap; + +import java.security.SecureRandom; + +import javax.crypto.Cipher; +import javax.crypto.KeyGenerator; +import javax.crypto.SecretKey; +import javax.crypto.spec.SecretKeySpec; + +public class SimpleCrypto { + + public static String encrypt(String seed, String cleartext) throws Exception { + byte[] rawKey = getRawKey(seed.getBytes()); + byte[] result = encrypt(rawKey, cleartext.getBytes()); + return toHex(result); + } + + public static String decrypt(String seed, String encrypted) throws Exception { + byte [] rawKey = getRawKey(seed.getBytes()); + byte [] enc = toByte(encrypted); + byte [] result = decrypt(rawKey, enc); + return new String(result); + } + + public static byte[] getRawKey(byte [] seed) throws Exception { + KeyGenerator kgen = KeyGenerator.getInstance("AES"); + SecureRandom sr = SecureRandom.getInstance("SHA1PRNG"); + sr.setSeed(seed); + kgen.init(128, sr); + SecretKey skey = kgen.generateKey(); + byte[] raw = skey.getEncoded(); + return raw; + } + + private static byte[] encrypt(byte[] raw, byte[] clear) throws Exception { + SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); + Cipher cipher = Cipher.getInstance("AES"); + cipher.init(Cipher.ENCRYPT_MODE, skeySpec); + byte[] encrypted = cipher.doFinal(clear); + return encrypted; + } + + private static byte[] decrypt(byte[] raw, byte[] encrypted) throws Exception { + SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); + Cipher cipher = Cipher.getInstance("AES"); + cipher.init(Cipher.DECRYPT_MODE, skeySpec); + byte[] decrypted = cipher.doFinal(encrypted); + return decrypted; + } + + public static String toHex(String txt) + { + return toHex(txt.getBytes()); + } + + public static String fromHex(String hex) + { + return new String(toByte(hex)); + } + + public static byte[] toByte(String hexString) { + int len = hexString.length()/2; + byte[] result = new byte[len]; + for (int i = 0; i < len; ++i) + { + result[i] = Integer.valueOf(hexString.substring(2*i, 2*i+2), 16).byteValue(); + } + return result; + } + + public static String toHex(byte[] buf) { + if (buf == null) + { + return ""; + } + StringBuffer result = new StringBuffer(2*buf.length); + for (int i = 0; i < buf.length; i++) + { + appendHex(result, buf[i]); + } + return result.toString(); + } + + private final static String HEX = "01234567890ABCDEF"; + + private static void appendHex(StringBuffer sb, byte b) + { + sb.append(HEX.charAt((b>>4)&0x0f)).append(HEX.charAt(b&0x0f)); + } +} \ No newline at end of file