/*
Jreepad - personal information manager.
Copyright (C) 2004-2006 Dan Stowell
This program 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.
This program 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.
The full license can be read online here:
http://www.gnu.org/copyleft/gpl.html
*/
package jreepad.io;
import java.io.IOException;
import java.io.InputStream;
import java.security.GeneralSecurityException;
import java.security.Key;
import javax.crypto.Cipher;
import javax.crypto.CipherInputStream;
import javax.crypto.spec.SecretKeySpec;
import jreepad.JreepadPrefs;
import jreepad.JreepadTreeModel;
/**
* Reads encrypted input into Jreepad. This reader is constructed with
* any other reader as the actual file format which will used when decrypted.
*
* @version $Id: EncryptedReader.java,v 1.2 2008-09-21 10:29:22 danstowell Exp $
*/
public class EncryptedReader implements JreepadReader
{
private JreepadReader reader;
private String password = "";
public EncryptedReader(JreepadReader reader)
{
this.reader = reader;
}
public JreepadTreeModel read(InputStream in)
throws IOException
{
// Read header
while (in.read() != '\n');
Cipher cipher = null;
try
{
cipher = Cipher.getInstance(EncryptedWriter.ALGORITHM);
Key key = new SecretKeySpec(password.getBytes(), EncryptedWriter.ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, key);
}
catch (GeneralSecurityException e)
{
throw new IOException(e.toString());
}
InputStream in2 = new CipherInputStream(in, cipher);
JreepadTreeModel document;
try
{
document = reader.read(in2);
}
catch (IOException e)
{
throw new IOException("Password incorrect or read problem occurred");
}
document.setFileType(JreepadPrefs.FILETYPE_XML_ENCRYPTED);
document.setPassword(password);
return document;
}
public void setPassword(String password)
{
this.password = password;
}
}