/* $Id: INILetter.java,v 1.1 2011/05/04 22:37:42 willuhn Exp $ This file is part of HBCI4Java Copyright (C) 2001-2008 Stefan Palme HBCI4Java is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. HBCI4Java is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package org.kapott.hbci.passport; import java.io.PrintWriter; import java.io.StringWriter; import java.math.BigInteger; import java.security.MessageDigest; import java.security.interfaces.RSAPublicKey; import java.util.Date; import org.kapott.cryptalgs.SignatureParamSpec; import org.kapott.hbci.exceptions.HBCI_Exception; import org.kapott.hbci.manager.HBCIKey; import org.kapott.hbci.manager.HBCIUtils; /** Hilfsklasse f�r das Erzeugen von INI-Briefen (f�r RDH-Zug�nge). Diese Klasse erm�glicht das Erzeugen von INI-Briefen. Dazu werden Methoden bereitgestellt, mit deren Hilfe die f�r einen INI-Brief ben�tigten Daten ermittelt werden k�nnen. Au�erdem liefert die {@link #toString()}-Methode einen vorgefertigten INI-Brief (kann als Vorlage benutzt werden). */ public class INILetter { /** INI-Brief f�r Institutsschl�ssel (wird f�r Vergleich mit tats�chlichem INI-Brief von der Bank ben�tigt) */ public static final int TYPE_INST=1; /** INI-Brief f�r Nutzerschl�ssel erzeugen (muss nach dem Erstellen neuer Schl�ssel an die Bank versandt werden) */ public static final int TYPE_USER=2; private HBCIPassportInternal passport; private HBCIKey hbcikey; /** Anlegen eines neuen INI-Brief-Objektes. @param passport das Passport-Objekt (entspricht einem HBCI-Zugang), f�r den ein INI-Brief ben�tigt wird @param type gibt an, f�r welche Schl�ssel aus dem <code>passport</code> der INI-Brief ben�tigt wird ({@link #TYPE_INST} f�r die Bankschl�ssel, {@link #TYPE_USER} f�r die Schl�ssel des Nutzers) */ public INILetter(HBCIPassport passport,int type) { this.passport=(HBCIPassportInternal)passport; if (type==TYPE_INST) { hbcikey=passport.getInstSigKey(); if (hbcikey==null) hbcikey=passport.getInstEncKey(); } else { hbcikey=passport.getMyPublicSigKey(); } } public static byte[] formatKeyData(BigInteger x, int minsize) { byte[] xArray=x.toByteArray(); int realbits=x.bitLength(); // System.out.println("bitlength: "+bits); int realbytes=realbits>>3; if ((realbits&0x07)!=0) { realbytes++; } // System.out.println("bytes: "+bytes); int finalsize=Math.max(minsize,realbytes); // System.out.println("size: "+size); byte[] retArray=new byte[finalsize]; System.arraycopy(xArray, xArray.length-realbytes, retArray, finalsize-realbytes, realbytes); return retArray; } private BigInteger getModulus() { return ((RSAPublicKey)hbcikey.key).getModulus(); } private BigInteger getExponent() { return ((RSAPublicKey)hbcikey.key).getPublicExponent(); } /** Gibt den Modulus des �ffentlichen Schl�ssels zur�ck. @return Modulus des �ffentlichen Schl�ssels */ public byte[] getKeyModulusDisplay() { int minsize; if (passport.getProfileVersion().equals("1")) { minsize=96; } else { minsize=0; } return formatKeyData(getModulus(), minsize); } /** Gibt den Exponenten des �ffentlichen Schl�ssels zur�ck. @return Exponent des �ffentlichen Schl�ssels */ public byte[] getKeyExponentDisplay() { int minsize; if (passport.getProfileVersion().equals("1")) { minsize=96; } else { minsize=getKeyModulusDisplay().length; } return formatKeyData(getExponent(), minsize); } /** Gibt den Hashwert des �ffentlichen Schl�ssels zur�ck. @return Hashwert des �ffentlichen Schl�ssels */ public byte[] getKeyHashDisplay() { try { byte[] modulus=formatKeyData(getModulus(), 128); int modSize=modulus.length; byte[] exponent=formatKeyData(getExponent(), Math.max(128, modSize)); int expSize=exponent.length; byte[] retArray=new byte[modSize+expSize]; System.arraycopy(exponent,0, retArray,0, expSize); System.arraycopy(modulus,0, retArray,expSize, modSize); // System.out.println("hashdata: "+HBCIUtils.data2hex(retArray)); // hash-verfahren h�ngt von rdh-profil ab MessageDigest dig; SignatureParamSpec hashSpec=((AbstractRDHPassport)(passport)).getSignatureParamSpec(); String provider=hashSpec.getProvider(); if (provider!=null) { dig=MessageDigest.getInstance(hashSpec.getHashAlg(), provider); } else { dig=MessageDigest.getInstance(hashSpec.getHashAlg()); } return dig.digest(retArray); } catch (Exception e) { throw new HBCI_Exception("*** error while calculating hash value",e); } } /** Gibt einen "fertigen" INI-Brief zur�ck. @return INI-Brief */ public String toString() { StringWriter ret=new StringWriter(); PrintWriter out=new PrintWriter(ret); Date date=new Date(); out.println(); out.println("INI-Brief HBCI"); out.println(); out.println(); out.println("Datum: "+HBCIUtils.date2StringLocal(date)); out.println(); out.println("Uhrzeit: "+HBCIUtils.time2StringLocal(date)); out.println(); out.println("Empf�nger BLZ: "+passport.getBLZ()); out.println(); out.println("Benutzerkennung: "+passport.getUserId()); out.println(); out.println("Schl�sselnummer: "+hbcikey.num); out.println(); out.println("Schl�sselversion: "+hbcikey.version); out.println(); out.println("HBCI-Version: "+passport.getHBCIVersion()); out.println(); out.println("Sicherheitsprofil: "+passport.getProfileMethod()+" "+passport.getProfileVersion()); out.println(); out.println(); out.println("�ffentlicher Schl�ssel f�r die elektronische Signatur"); out.println(); out.println(" Exponent"); out.println(); String st=HBCIUtils.data2hex(getKeyExponentDisplay()); for (int line=0;true;line++) { if (line*16*3>=st.length()) break; out.println(" "+st.substring(line*(16*3), Math.min((line+1)*16*3, st.length()))); } out.println(); out.println(" Modulus"); out.println(); st=HBCIUtils.data2hex(getKeyModulusDisplay()); for (int line=0;true;line++) { if (line*16*3>=st.length()) break; out.println(" "+st.substring(line*(16*3), Math.min((line+1)*16*3, st.length()))); } out.println(); out.println(" Hashwert"); out.println(); st=HBCIUtils.data2hex(getKeyHashDisplay()); for (int line=0;true;line++) { if (line*10*3>=st.length()) break; out.println(" "+st.substring(line*(10*3), Math.min((line+1)*10*3, st.length()))); } out.println(); out.println("Ich best�tige hiermit den obigen �ffentlichen Schl�ssel"); out.println("f�r meine elektronische Signatur"); out.println(); out.println(); out.println(); out.println(); out.println(); out.println(); out.println(); out.println("Ort/Datum Unterschrift"); out.close(); return ret.toString(); } }