<html>
  <head>
    <meta content="text/html; charset=ISO-8859-1"
      http-equiv="Content-Type">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    <div class="moz-cite-prefix">On 11/04/2013 11:30 AM, Daniel Passos
      wrote:<br>
    </div>
    <blockquote
cite="mid:CAKjsGbt-7KBGD3U+tsP0Aer5VtBCcGtVBP-4s3NW1mDVg0hikA@mail.gmail.com"
      type="cite">
      <div dir="ltr">
        <div class="markdown-here-wrapper"
          id="markdown-here-wrapper-898051" style=""><a
            moz-do-not-send="true" href="#"
            name="aerogear-android-crypto"></a>
          <h1 id="aerogear-android-crypto" style="margin:1.3em 0px
            1em;padding:0px;font-weight:bold;font-size:1.6em">
            <span style="font-size:small;font-weight:normal">The idea is
              implementing only save(add/update) and delete, using the
              stores we already have today by just adding crypt /
              decrypt and scheduling Query (readWithFilter) for the next
              release</span><br>
          </h1>
        </div>
      </div>
    </blockquote>
    +1, Do we have relevant JIRA's which are up to date with respect to
    query?<br>
    <blockquote
cite="mid:CAKjsGbt-7KBGD3U+tsP0Aer5VtBCcGtVBP-4s3NW1mDVg0hikA@mail.gmail.com"
      type="cite">
      <div dir="ltr">
        <div class="markdown-here-wrapper"
          id="markdown-here-wrapper-898051" style="">
          <h1 id="aerogear-android-crypto" style="margin:1.3em 0px
            1em;padding:0px;font-weight:bold;font-size:1.6em">
          </h1>
          <p style="margin:1.2em 0px!important"><b>DataManager</b></p>
          <pre style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;font-size:1em;line-height:1.2em;margin:1.2em 0px"><code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;display:inline;white-space:pre;overflow:auto;border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;border:1px solid rgb(204,204,204);padding:0.5em 0.7em;display:block!important;display:block;padding:0.5em;color:rgb(51,51,51);background-color:rgb(248,248,255);background-repeat:initial initial">public Store encryptedStore(String storeName, String passphrase) {
        // TODO Create a default passphrase-based KeyStore
        KeyStore keyStore = null;
        return encryptedStore(storeName, keyStore);
}

public Store encryptedStore(String storeName, KeyStore keyStore) {
        StoreConfig storeConfig = new StoreConfig();
        storeConfig.setType(StoreTypes.ENCRYPTED_MEMORY);
        return encryptedStore(storeName, storeConfig, keyStore);
}

public Store encryptedStore(String storeName, StoreConfig config, String passphrase) {
        // TODO Create a default passphrase-based KeyStore
        KeyStore keyStore = null;
        return encryptedStore(storeName, config, keyStore);
}

public Store encryptedStore(String storeName, StoreConfig config, KeyStore keyStore) {
        config.setKeyStore(keyStore);
        Store store = storeFactory.createStore(config);
        stores.put(storeName, store);
        return store;
}</code></pre>
        </div>
      </div>
    </blockquote>
    Maybe it bight be better to extract all of these methods into a
    factory?<br>
    <br>
    From the user's point of view they would preform something like this<br>
    <br>
    <pre style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;font-size:1em;line-height:1.2em;margin:1.2em 0px"><code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;display:inline;white-space:pre;overflow:auto;border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;border:1px solid rgb(204,204,204);padding:0.5em 0.7em;display:block!important;display:block;padding:0.5em;color:rgb(51,51,51);background-color:rgb(248,248,255);background-repeat:initial initial">StoreConfig config = new StoreConfig();
config.setType(ENCRYPTED_MEMORY);
config.setCryptoBox(crypto); 
config.setName("encrypted")
EncryptedStore = dataManager.store(config);
</code></pre>
    and have the selecting which encryptedStore method left up to the
    library on the back end.<br>
    <br>
    My biggest concern is that having so many possible methods.<br>
    <blockquote
cite="mid:CAKjsGbt-7KBGD3U+tsP0Aer5VtBCcGtVBP-4s3NW1mDVg0hikA@mail.gmail.com"
      type="cite">
      <div dir="ltr">
        <div class="markdown-here-wrapper"
          id="markdown-here-wrapper-898051" style="">
          <p style="margin:1.2em 0px!important"><b>EncryptedMemoryStore</b></p>
          <pre style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;font-size:1em;line-height:1.2em;margin:1.2em 0px"><code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;display:inline;white-space:pre;overflow:auto;border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;border:1px solid rgb(204,204,204);padding:0.5em 0.7em;display:block!important;display:block;padding:0.5em;color:rgb(51,51,51);background-color:rgb(248,248,255);background-repeat:initial initial">public class EncryptedMemoryStore&lt;T&gt; implements Store&lt;T&gt; {

    private final MemoryStorage&lt;T&gt; memoryStorage;
    private final CryptoUtils&lt;T&gt; cryptoUtils;

    public EncryptedMemoryStore(IdGenerator idGenerator, KeyStore keyStore) {
        memoryStorage = new MemoryStorage(idGenerator);
        cryptoUtils = new CryptoUtils&lt;T&gt;(keyStore);
    }

    @Override
    public StoreType getType() {
        return StoreTypes.ENCRYPTED_MEMORY;
    }

    @Override
    public Collection&lt;T&gt; readAll() throws InvalidKeyException {
        Collection&lt;T&gt; encryptedCollection = memoryStorage.readAll();
        return cryptoUtils.decrypt(encryptedCollection);
    }

    @Override
    public T read(Serializable id) throws InvalidKeyException {
        T encryptedItem = memoryStorage.read(id);
        return cryptoUtils.decrypt(encryptedItem);
    }

    @Override
    public List&lt;T&gt; readWithFilter(ReadFilter filter) throws InvalidKeyException {
        List&lt;T&gt; encryptedList = memoryStorage.readWithFilter(filter);
        return cryptoUtils.decrypt(encryptedList);
    }

    @Override
    public void save(T item) {
        memoryStorage.save(cryptoUtils.encrypt(item));
    }

    @Override
    public void reset() {
        memoryStorage.reset();
    }

    @Override
    public void remove(Serializable id) {
        memoryStorage.remove(id);
    }

    @Override
    public boolean isEmpty() {
        return memoryStorage.isEmpty();
    }

}</code></pre>
        </div>
      </div>
    </blockquote>
    So do we need a KeyStore with an in memory implementation?&nbsp; Since
    the data will be wiped every time the app starts, we could just
    generate the key on the fly and keep it resident while the store is
    around.&nbsp; If the store gets GC'd then we have to fetch the data again
    anyway.<br>
    <br>
    Alternatively, if we are NOT keeping a reference to the key, how do
    we make sure it is only in memory for a little time as possible?<br>
    <br>
    <blockquote
cite="mid:CAKjsGbt-7KBGD3U+tsP0Aer5VtBCcGtVBP-4s3NW1mDVg0hikA@mail.gmail.com"
      type="cite">
      <div dir="ltr">
        <div class="markdown-here-wrapper"
          id="markdown-here-wrapper-898051" style="">
          <p style="margin:1.2em 0px!important"><b>CryptoUtils</b> <br>
            <br>
            Here is where the magic happens.</p>
          <pre style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;font-size:1em;line-height:1.2em;margin:1.2em 0px"><code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;display:inline;white-space:pre;overflow:auto;border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;border:1px solid rgb(204,204,204);padding:0.5em 0.7em;display:block!important;display:block;padding:0.5em;color:rgb(51,51,51);background-color:rgb(248,248,255);background-repeat:initial initial">
public class CryptoUtils&lt;T&gt; {

    private final KeyStore keyStore;

    public CryptoUtils(KeyStore keyStore) {
        this.keyStore = keyStore;
    }

    public Collection&lt;T&gt; decrypt(Collection&lt;T&gt; encryptedCollection) {
        List&lt;T&gt; decryptedList = new ArrayList&lt;T&gt;();
        for (T item : encryptedCollection) {
            decryptedList.add(decrypt(item));
        }
        return decryptedList;
    }

    public List&lt;T&gt; decrypt(List&lt;T&gt; encryptedList) {
        List&lt;T&gt; decryptedList = new ArrayList&lt;T&gt;();
        for (T item : encryptedList) {
            decryptedList.add(decrypt(item));
        }
        return decryptedList;
    }

    public T decrypt(T item) {
        // TODO Read all fields and decrypt
        return item;
    }

    public T encrypt(T item) {
        // TODO Read all fields and encrypt    
        return item;
    }

}</code></pre>
        </div>
      </div>
      <br>
      <fieldset class="mimeAttachmentHeader"></fieldset>
      <br>
      <pre wrap="">_______________________________________________
aerogear-dev mailing list
<a class="moz-txt-link-abbreviated" href="mailto:aerogear-dev@lists.jboss.org">aerogear-dev@lists.jboss.org</a>
<a class="moz-txt-link-freetext" href="https://lists.jboss.org/mailman/listinfo/aerogear-dev">https://lists.jboss.org/mailman/listinfo/aerogear-dev</a></pre>
    </blockquote>
    <br>
  </body>
</html>