/* $Id: FileHeader.java,v 1.1 2011/05/04 22:37:48 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.rdhXfile;
import java.io.ByteArrayOutputStream;
import java.util.Random;
import org.kapott.hbci.exceptions.HBCI_Exception;
import org.kapott.hbci.manager.HBCIUtils;
public class FileHeader
extends TLV
{
private int profileversion;
private int version;
private byte[] salt;
private long nof_iterations;
public FileHeader()
{
super(0x4e56);
}
public FileHeader(TLV tlv)
{
super(tlv);
byte[] data=this.getData();
int offset;
if (getLength()==26) {
// RDH-2
this.profileversion=2;
offset=0;
} else {
// RDH-10
this.profileversion=(data[1]<<8) | (data[0]&0xFF);
offset=2;
}
this.version=(data[offset+1]<<8) | (data[offset+0]&0xFF);
this.nof_iterations=((data[offset+25]&0xFFL)<<24) | ((data[offset+24]&0xFFL)<<16) |
((data[offset+23]&0xFFL)<<8) | ((data[offset+22]&0xFFL)<<0);
this.salt=new byte[20];
System.arraycopy(data,offset+2, this.salt,0, 20);
HBCIUtils.log(
"file is a RDH-"+this.profileversion+"-file in version "+this.version,
HBCIUtils.LOG_DEBUG);
}
public int getProfileVersion()
{
return this.profileversion;
}
public void setProfileVersion(int pversion)
{
this.profileversion=pversion;
}
public int getVersion()
{
return this.version;
}
public void setVersion(int version)
{
this.version=version;
}
public byte[] getSalt()
{
return this.salt;
}
public void setSalt(byte[] salt)
{
this.salt=salt;
}
public void setRandomSalt()
{
byte[] s=new byte[20];
Random r=new Random();
r.nextBytes(s);
setSalt(s);
}
public long getNofIterations()
{
return this.nof_iterations;
}
public void setNofIterations(int nof_iterations)
{
this.nof_iterations=nof_iterations;
}
public void updateData()
{
try {
ByteArrayOutputStream os=new ByteArrayOutputStream();
if (getProfileVersion()==10) {
// RDH-10: write profile-version
os.write(int2ba(getProfileVersion()));
}
os.write(int2ba(getVersion()));
os.write(getSalt());
os.write(long2ba(getNofIterations()));
setData(os.toByteArray());
} catch (Exception e) {
throw new HBCI_Exception(e);
}
}
public String toString()
{
StringBuffer ret=new StringBuffer();
ret.append("diskhead: profileversion="+this.profileversion);
ret.append("; version="+this.version);
ret.append("; nof_iterations="+this.nof_iterations);
ret.append("; salt=");
for (int i=0;i<this.salt.length;i++) {
int x=salt[i]&0xFF;
if (x<0) {
x+=256;
}
ret.append(Integer.toString(x,16)+" ");
}
return ret.toString();
}
}