@Test
  public void test3() {

    String reg = "Chinese Eyes";
    char[] password = "******".toCharArray();
    RSAKeyContents contents = CryptoFactory.INSTANCE.generateKeys(password);
    RSAKeyForPublication fp = contents.cloneForPublication();

    JSONFormatter builder = new JSONFormatter(reg);
    builder.add(contents);
    builder.add(fp);

    StringWriter writer = new StringWriter();
    builder.format(writer);
    String out = writer.toString();
    System.err.println(out);
    StringReader r = new StringReader(out);
    JSONReader reader = new JSONReader(r);
    KeyMaterials km = reader.parse();
    Assert.assertEquals(2, km.keys().size());

    CryptoKeyWrapper wrapper = km.keys().get(0);
    boolean ok = wrapper.unlock(new Password(password));
    if (ok) {
      contents = (RSAKeyContents) wrapper.getKeyContents();
      System.err.println(contents.toString());
    }
  }
  @Test
  public void test0() {

    CryptoContact contact = new CryptoContact();
    contact.add("GivenName.0", "David");
    contact.add("GivenName.1", "Richard");
    contact.add("FamilyName.0", "Smith");
    contact.add("Address.0", "1714 Roberts Ct.");
    contact.add("City", "Madison");
    contact.add("State", "Wisconsin");
    contact.add("PostalCode", "53711");
    contact.add("CountryCode", "US");

    MapData ld = new MapData();
    ld.put("Copyright", "\u00A9 2014, David R. Smith. All Rights Reserved");
    ld.put("License", "http://www.apache.org/licenses/LICENSE-2.0.txt");

    ListData rd = new ListData();
    rd.addURL("http://buttermilk.googlecode.com/svn/trunk/buttermilk-core/data/test0.json");

    RSAKeyContents contents = CryptoFactory.INSTANCE.generateKeys();
    MapIterator iter = new RSAKeyContentsIterator(contents);
    MapIterator iter2 = new ContactContentsIterator(contact);
    MapIterator iter3 = new MapDataContentsIterator(ld);
    ListDataContentsIterator remoteIter = new ListDataContentsIterator(rd);
    RSASignatureBuilder sigBuilder = new RSASignatureBuilder("Chinese Eyes", contents);

    while (iter.hasNext()) {
      String label = iter.next();
      sigBuilder.update(label, iter.get(label));
    }
    while (iter2.hasNext()) {
      String label = iter2.next();
      sigBuilder.update(label, iter2.get(label));
    }
    while (iter3.hasNext()) {
      String label = iter3.next();
      sigBuilder.update(label, iter3.get(label));
    }

    // a bit more complex - the List iterator outputs a list resolved into MapData
    while (remoteIter.hasNext()) {
      List<MapData> list = remoteIter.nextData();
      for (MapData data : list) {
        MapIterator inner = new MapDataContentsIterator(data);
        while (inner.hasNext()) {
          String label = inner.next();
          sigBuilder.update(label, inner.get(label));
        }
      }
    }

    CryptoSignature sig = sigBuilder.build();

    JSONFormatter builder = new JSONFormatter("Chinese Eyes");
    builder.add(contact).add(contents).add(sig).add(ld).add(rd);

    StringWriter writer = new StringWriter();
    builder.format(writer);
    String output = writer.toString();

    Assert.assertTrue(output != null);
  }