/**
* Copyright (c) 2006-2007 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM - Initial API and implementation
*/
package org.eclipse.emf.ecore.resource.impl;
import java.io.FilterOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.crypto.Cipher;
import javax.crypto.CipherInputStream;
import javax.crypto.CipherOutputStream;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import org.eclipse.emf.ecore.resource.URIConverter;
/**
* <p>EMF implementation for the {@link URIConverter.Cipher} interface using
* the DES encryption algorithm.</p>
* <p>This shows how this class can be used:</p>
* <pre>
* Map options = new HashMap();
* options.put(Resource.OPTION_CIPHER,
* new DESCipherImpl("a very long key indeed"));
* resource.save(options);
* resource.load(options);
* </pre>
* @since 2.3.0
*/
public class DESCipherImpl implements URIConverter.Cipher
{
protected static final String ENCRYPTION_SCHEME = "DES";
protected static final String UNICODE_FORMAT = "UTF-8";
protected String stringKey;
protected SecretKey key;
public DESCipherImpl()
{
this(null);
}
public DESCipherImpl(String key)
{
this.stringKey = key;
}
public OutputStream encrypt(OutputStream outputStream) throws Exception
{
Cipher cipher = Cipher.getInstance(ENCRYPTION_SCHEME);
cipher.init(Cipher.ENCRYPT_MODE, getKey());
// The CipherOutputStream shoudln't close the underlying stream
//
outputStream = new FilterOutputStream(outputStream)
{
@Override
public void close() throws IOException
{
// Do nothing
}
};
return new CipherOutputStream(outputStream, cipher);
}
public void finish(OutputStream outputStream) throws Exception
{
outputStream.close();
}
public InputStream decrypt(InputStream inputStream) throws Exception
{
Cipher cipher = Cipher.getInstance(ENCRYPTION_SCHEME);
cipher.init(Cipher.DECRYPT_MODE, getKey());
return new CipherInputStream(inputStream, cipher);
}
public void finish(InputStream inputStream) throws Exception
{
// Do nothing.
}
protected SecretKey getKey() throws Exception
{
if (key == null)
{
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ENCRYPTION_SCHEME);
DESKeySpec keySpec = new DESKeySpec(stringKey.getBytes(UNICODE_FORMAT));
key = keyFactory.generateSecret(keySpec);
}
return key;
}
}