/**
   * Prueft, ob eine gespeicherte PIN fuer diesen Passport vorliegt.
   *
   * @param passport der Passport.
   * @return die PIN oder null, wenn keine gefunden wurde.
   * @throws Exception
   */
  private static String getCachedPIN(HBCIPassport passport) throws Exception {
    String key = getCacheKey(passport);

    // Kein Key - dann brauchen wir auch nicht im Cache schauen
    if (key == null) return null;

    byte[] data = null;

    // Cache checken
    if (Settings.getCachePin()) {
      data = pinCache.get(key);
    }

    // Wenn wir noch nichts im Cache haben, schauen wir im Wallet - wenn das erlaubt ist
    if (data == null && Settings.getStorePin() && (passport instanceof HBCIPassportPinTan)) {
      String s = (String) Settings.getWallet().get(key);
      if (s != null) {
        data = Base64.decode(s);

        // Wenn diese Meldung im Log erscheint, gibts keinen Support mehr von mir.
        // Wer die PIN permament speichert, tut das auf eigenes Risiko
        Logger.info("pin loaded from wallet");
        // Uebernehmen wir gleich in den Cache, damit wir beim
        // naechsten Mal direkt im Cache schauen koennen und nicht
        // mehr im Wallet
        pinCache.put(key, data);
      }
    }

    // Haben wir Daten?
    if (data != null) {
      ByteArrayInputStream bis = new ByteArrayInputStream(data);
      ByteArrayOutputStream bos = new ByteArrayOutputStream();
      Application.getSSLFactory().decrypt(bis, bos);
      String s = bos.toString();
      if (s != null && s.length() > 0) return s;
    }

    return null;
  }
 /** @see de.willuhn.datasource.serialize.AbstractXmlIO.Value#unserialize(java.lang.String) */
 public Object unserialize(String s) throws IOException {
   if (s == null || s.length() == 0) return null;
   return Base64.decode(s);
 }