/**
   * Speichert die PIN temporaer fuer diese Session.
   *
   * @param passport der Passport.
   * @param pin die PIN.
   * @throws Exception
   */
  private static void setCachedPIN(HBCIPassport passport, String pin) throws Exception {
    String key = getCacheKey(passport);

    // Kein Key, dann muessen wir nicht cachen
    if (key == null) return;

    ByteArrayInputStream bis = new ByteArrayInputStream(pin.getBytes());
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    Application.getSSLFactory().encrypt(bis, bos);
    byte[] crypted = bos.toByteArray();

    if (Settings.getCachePin()) {
      pinCache.put(key, crypted);
    }

    // Permanentes Speichern der PIN gibts nur bei PIN/TAN, da dort ueber
    // die TAN eine weitere Autorisierung bei der Ausfuehrung von Geschaeftsvorfaellen
    // mit Geldfluss stattfindet. Bei DDV/RDH koennte man sonst beliebig Geld
    // transferieren, ohne jemals wieder nach einem Passwort gefragt zu werden.
    if (Settings.getStorePin() && (passport instanceof HBCIPassportPinTan)) {
      // Nicht direkt das Byte-Array speichern sondern einen Base64-String.
      // Grund: Bei einem Byte-Array wuerde der XML-Serializer fuer jedes
      // Byte ein einzelnes XML-Element anlegen und damit das Wallet aufblasen
      Settings.getWallet().set(key, Base64.encode(crypted));
    }
  }
 /** @see de.willuhn.datasource.serialize.AbstractXmlIO.Value#serialize(java.lang.Object) */
 public String serialize(Object o) throws IOException {
   if (o == null) return "";
   if (!(o instanceof byte[])) throw new IOException("unable to serialize " + o);
   return Base64.encode((byte[]) o);
 }