public void saveChanges() { try { if (getPassportKey() == null) setPassportKey(calculatePassportKey(FOR_SAVE)); PBEParameterSpec paramspec = new PBEParameterSpec(CIPHER_SALT, CIPHER_ITERATIONS); Cipher cipher = Cipher.getInstance("PBEWithMD5AndDES"); cipher.init(Cipher.ENCRYPT_MODE, getPassportKey(), paramspec); File passportfile = new File(getFilename()); File directory = passportfile.getAbsoluteFile().getParentFile(); String prefix = passportfile.getName() + "_"; File tempfile = File.createTempFile(prefix, "", directory); ObjectOutputStream o = new ObjectOutputStream(new CipherOutputStream(new FileOutputStream(tempfile), cipher)); o.writeObject(getCountry()); o.writeObject(getBLZ()); o.writeObject(getHost()); o.writeObject(getPort()); o.writeObject(getUserId()); o.writeObject(getSysId()); o.writeObject(getSigId()); o.writeObject(getBPD()); o.writeObject(getUPD()); for (int i = 0; i < 3; i++) { for (int j = 0; j < 2; j++) { HBCIKey key = getKey(i, j); if (key != null) { o.writeObject( new HBCIKey(key.country, key.blz, key.userid, key.num, key.version, key.key)); } else o.writeObject(null); } } o.writeObject(getCID()); o.writeObject(getHBCIVersion()); o.writeObject(getCustomerId()); o.close(); passportfile.delete(); tempfile.renameTo(passportfile); HBCIKey k = getMyPrivateSigKey(); if (k != null && k.key != null && !(k.key instanceof RSAPrivateCrtKey)) { HBCIUtils.log( "private sig key is no CRT key, please contact the author!", HBCIUtils.LOG_WARN); } k = getMyPrivateEncKey(); if (k != null && k.key != null && !(k.key instanceof RSAPrivateCrtKey)) { HBCIUtils.log( "private enc key is no CRT key, please contact the author!", HBCIUtils.LOG_WARN); } } catch (Exception e) { throw new HBCI_Exception("*** saving of passport file failed", e); } }
/** * Legt die Versionsnummer des Segments manuell fest. Ist u.a. noetig, um HKTAN-Segmente in genau * der Version zu senden, in der auch die HITANS empfangen wurden. Andernfalls koennte es * passieren, dass wir ein HKTAN mit einem TAN-Verfahren senden, welches in dieser HKTAN-Version * gar nicht von der Bank unterstuetzt wird. Das ist ein Dirty-Hack, ich weiss ;) Falls das noch * IRGENDWO anders verwendet wird, muss man hoellisch aufpassen, dass alle Stellen, wo "this.name" * bzw. "this.segVersion" direkt oder indirekt verwendet wurde, ebenfalls beruecksichtigt werden. * * @param version die neue Versionsnummer. */ public synchronized void setSegVersion(String version) { if (version == null || version.length() == 0) { HBCIUtils.log( "tried to change segment version for task " + this.jobName + " explicit, but no version given", HBCIUtils.LOG_WARN); return; } // Wenn sich die Versionsnummer nicht geaendert hat, muessen wir die // Huehner ja nicht verrueckt machen ;) if (version.equals(this.segVersion)) return; HBCIUtils.log( "changing segment version for task " + this.jobName + " explicit from " + this.segVersion + " to " + version, HBCIUtils.LOG_INFO); // Der alte Name String oldName = this.name; // Neuer Name und neue Versionsnummer this.segVersion = version; this.name = this.jobName + version; // Bereits gesetzte llParams fixen String[] names = this.llParams.keySet().toArray(new String[this.llParams.size()]); for (String s : names) { if (!s.startsWith(oldName)) continue; // nicht betroffen // Alten Schluessel entfernen und neuen einfuegen String value = this.llParams.getProperty(s); String newName = s.replaceFirst(oldName, this.name); this.llParams.remove(s); this.llParams.setProperty(newName, value); } // Destination-Namen in den LowLevel-Parameter auf den neuen Namen umbiegen Enumeration<String> e = constraints.keys(); while (e.hasMoreElements()) { String frontendName = e.nextElement(); String[][] values = constraints.get(frontendName); for (int i = 0; i < values.length; ++i) { String[] value = values[i]; // value[0] ist das Target if (!value[0].startsWith(oldName)) continue; // Hier ersetzen wir z.Bsp. "TAN2Step5.process" gegen "TAN2Step3.process" value[0] = value[0].replaceFirst(oldName, this.name); } } }
@Override public final void run() { init(); try { prepare(); execute(); } catch (Exception e) { HBCIUtils.log(e); } finally { done(); } }
/* wenn wenigstens ein HBCI-Rückgabewert für den aktuellen GV gefunden wurde, so werden im outStore zusätzlich die entsprechenden Dialog-Parameter gespeichert (Property @c basic.*) */ private void saveBasicValues(Properties result, int ref) { // wenn noch keine basic-daten gespeichert sind if (jobResult.getDialogId() == null) { // Pfad des originalen MsgHead-Segmentes holen und um "orig_" ergaenzen, // um den Key fuer die entsprechenden Daten in das result-Property zu erhalten String msgheadName = "orig_" + result.getProperty("1"); jobResult.storeResult("basic.dialogid", result.getProperty(msgheadName + ".dialogid")); jobResult.storeResult("basic.msgnum", result.getProperty(msgheadName + ".msgnum")); jobResult.storeResult("basic.segnum", Integer.toString(ref)); HBCIUtils.log( "basic values for " + getName() + " set to " + jobResult.getDialogId() + "/" + jobResult.getMsgNum() + "/" + jobResult.getSegNum(), HBCIUtils.LOG_DEBUG); } }
public HBCIPassportRDH(Object initObject) { this(initObject, 0); String header = getParamHeader(); String fname = HBCIUtils.getParam(header + ".filename"); boolean init = HBCIUtils.getParam(header + ".init", "1").equals("1"); if (fname == null) { throw new NullPointerException(header + ".filename must not be null"); } HBCIUtils.log("loading passport data from file " + fname, HBCIUtils.LOG_DEBUG); setFilename(fname); if (init) { HBCIUtils.log("loading data from file " + fname, HBCIUtils.LOG_DEBUG); setFilterType("None"); setPort(new Integer(3000)); if (!new File(fname).canRead()) { HBCIUtils.log("have to create new passport file", HBCIUtils.LOG_WARN); askForMissingData(true, true, true, true, false, true, true); saveChanges(); } ObjectInputStream o = null; try { int retries = Integer.parseInt(HBCIUtils.getParam("client.retries.passphrase", "3")); while (true) { // loop for entering the correct passphrase if (getPassportKey() == null) setPassportKey(calculatePassportKey(FOR_LOAD)); PBEParameterSpec paramspec = new PBEParameterSpec(CIPHER_SALT, CIPHER_ITERATIONS); Cipher cipher = Cipher.getInstance("PBEWithMD5AndDES"); cipher.init(Cipher.DECRYPT_MODE, getPassportKey(), paramspec); o = null; try { o = new ObjectInputStream(new CipherInputStream(new FileInputStream(fname), cipher)); } catch (StreamCorruptedException e) { setPassportKey(null); retries--; if (retries <= 0) throw new InvalidPassphraseException(); } if (o != null) break; } setCountry((String) (o.readObject())); setBLZ((String) (o.readObject())); setHost((String) (o.readObject())); setPort((Integer) (o.readObject())); setUserId((String) (o.readObject())); setSysId((String) (o.readObject())); setSigId((Long) (o.readObject())); setBPD((Properties) (o.readObject())); setUPD((Properties) (o.readObject())); for (int i = 0; i < 3; i++) { for (int j = 0; j < 2; j++) { setKey(i, j, (HBCIKey) (o.readObject())); } } setCID((String) (o.readObject())); setHBCIVersion((String) o.readObject()); setCustomerId((String) o.readObject()); HBCIKey k = getMyPrivateSigKey(); if (k != null && k.key != null && !(k.key instanceof RSAPrivateCrtKey)) { HBCIUtils.log( "private sig key is no CRT key, please contact the author!", HBCIUtils.LOG_WARN); } k = getMyPrivateEncKey(); if (k != null && k.key != null && !(k.key instanceof RSAPrivateCrtKey)) { HBCIUtils.log( "private enc key is no CRT key, please contact the author!", HBCIUtils.LOG_WARN); } } catch (Exception e) { throw new HBCI_Exception("*** loading of passport file failed", e); } try { o.close(); } catch (Exception e) { HBCIUtils.log(e); } if (askForMissingData(true, true, true, true, false, true, true)) saveChanges(); } }
protected void setLowlevelParam(String key, String value) { HBCIUtils.log("setting lowlevel parameter " + key + " = " + value, HBCIUtils.LOG_DEBUG); llParams.setProperty(key, value); }
/* gibt zu einem gegebenen jobnamen des namen dieses jobs in der syntax-spez. * zurück (also mit angehängter versionsnummer) */ private void findSpecNameForGV(String jobnameLL, HBCIHandler handler) { int maxVersion = 0; StringBuffer key = new StringBuffer(); // alle param-segmente durchlaufen Properties bpd = handler.getPassport().getBPD(); for (Enumeration i = bpd.propertyNames(); i.hasMoreElements(); ) { String path = (String) i.nextElement(); key.setLength(0); key.append(path); if (key.indexOf("Params") == 0) { key.delete(0, key.indexOf(".") + 1); // wenn segment mit namen des aktuellen jobs gefunden wurde if (key.indexOf(jobnameLL + "Par") == 0 && key.toString().endsWith(".SegHead.code")) { // willuhn 2011-06-06 Maximal zulaessige Segment-Version ermitteln // Hintergrund: Es gibt Szenarien, in denen nicht die hoechste verfuegbare // Versionsnummer verwendet werden kann, weil die Voraussetzungen impliziert, // die beim User nicht gegeben sind. Mit diesem Parameter kann die maximale // Version nach oben begrenzt werden. In AbstractPinTanPassport#setBPD() ist // ein konkretes Beispiel enthalten (Bank macht HITANS5 und damit HHD 1.4, der // User hat aber nur ein HHD-1.3-tauglichen TAN-Generator) int maxAllowedVersion = Integer.parseInt( HBCIUtils.getParam( "kernel.gv." + bpd.getProperty(path, "default") + ".segversion.max", "0")); key.delete(0, jobnameLL.length() + ("Par").length()); // extrahieren der versionsnummer aus dem spez-namen String st = key.substring(0, key.indexOf(".")); int version = 0; try { version = Integer.parseInt(st); } catch (Exception e) { HBCIUtils.log( "found invalid job version: key=" + key + ", jobnameLL=" + jobnameLL + " (this is a known, but harmless bug)", HBCIUtils.LOG_WARN); } // willuhn 2011-06-06 Segment-Versionen ueberspringen, die groesser als die max. // zulaessige sind if (maxAllowedVersion > 0 && version > maxAllowedVersion) { HBCIUtils.log( "skipping segment version " + version + " for task " + jobnameLL + ", larger than allowed version " + maxAllowedVersion, HBCIUtils.LOG_INFO); continue; } // merken der größten jemals aufgetretenen versionsnummer if (version != 0) { HBCIUtils.log( "task " + jobnameLL + " is supported with segment version " + st, HBCIUtils.LOG_DEBUG2); if (version > maxVersion) { maxVersion = version; } } } } } if (maxVersion == 0) { throw new JobNotSupportedException(jobnameLL); } // namen+versionsnummer speichern this.jobName = jobnameLL; this.segVersion = Integer.toString(maxVersion); this.name = jobnameLL + this.segVersion; }
public void addSignaturePassport(HBCIPassport passport, String role) { HBCIUtils.log("adding additional passport to job " + getName(), HBCIUtils.LOG_DEBUG); passports.addPassport((HBCIPassportInternal) passport, role); }