/* * Copyright 2010 Patrick Woodworth * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.emergent.android.weave.client; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.security.GeneralSecurityException; import java.security.Key; import java.util.Date; import org.json.JSONException; import org.json.JSONObject; /** * @author Patrick Woodworth */ public class WeaveBasicObject { public static class WeaveEncryptedObject { private final JSONObject m_nodeObj; public WeaveEncryptedObject(JSONObject nodeObj) { m_nodeObj = nodeObj; } public JSONObject decryptObject(BulkKeyCouplet keyPair) throws GeneralSecurityException, JSONException { return decryptObject(keyPair.cipherKey, keyPair.hmacKey); } public JSONObject decryptObject(Key key, Key hmacKey) throws GeneralSecurityException, JSONException { byte[] bytes = WeaveCryptoUtil.getInstance().decrypt(key, hmacKey, getCiphertext(), getIv(), getHmac()); return new JSONObject(WeaveUtil.toUtf8String(bytes)); } public String getCiphertext() throws JSONException { return m_nodeObj.getString("ciphertext"); } public String getHmac() throws JSONException { return m_nodeObj.getString("hmac"); } public String getIv() throws JSONException { return m_nodeObj.getString("IV"); } } private URI m_uri = null; private final URI m_queryUri; private final JSONObject m_nodeObj; public WeaveBasicObject(URI queryUri, JSONObject nodeObj) { m_queryUri = queryUri; m_nodeObj = nodeObj; } public JSONObject getEncryptedPayload(Key bulkKey, Key hmacKey) throws JSONException, IOException, GeneralSecurityException, WeaveException { WeaveEncryptedObject weo = new WeaveEncryptedObject(getPayload()); return weo.decryptObject(bulkKey, hmacKey); } public JSONObject getEncryptedPayload(UserWeave weave, char[] secret) throws JSONException, IOException, GeneralSecurityException, WeaveException { WeaveEncryptedObject weo = new WeaveEncryptedObject(getPayload()); byte[] syncKey = Base32.decodeModified(new String(secret)); // todo // don't // convert // to string BulkKeyCouplet bulkKeyPair = weave.getBulkKeyPair(syncKey); return weo.decryptObject(bulkKeyPair); } public String getId() throws JSONException { return m_nodeObj.getString("id"); } public String getModified() throws JSONException { return m_nodeObj.getString("modified"); } public Date getModifiedDate() throws JSONException { return WeaveUtil.toModifiedTimeDate(getModified()); } public JSONObject getPayload() throws JSONException { return new JSONObject(m_nodeObj.getString("payload")); } public String getSortIndex() throws JSONException { return m_nodeObj.getString("sortindex"); } public URI getUri() throws JSONException { if (m_uri == null) { try { String baseUriStr = m_queryUri.toASCIIString(); String queryPart = m_queryUri.getRawQuery(); if (queryPart != null) baseUriStr = baseUriStr.substring(0, baseUriStr.indexOf(queryPart) - 1); if (!baseUriStr.endsWith("/")) baseUriStr += "/"; String nodeUriStr = baseUriStr + new URI(null, null, getId(), null).toASCIIString(); m_uri = new URI(nodeUriStr); } catch (URISyntaxException e) { throw new JSONException(e.getMessage()); } } return m_uri; } public JSONObject toJSONObject() { return m_nodeObj; } public String toJSONObjectString() throws JSONException { return toJSONObject().toString(0); } }