All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.aowagie.text.pdf.OutputStreamEncryption Maven / Gradle / Ivy

Go to download

Version modificada de iText 2.1.7 con el paquete cambiado, adaptaciones menores para firma y dependencias actualizadas.

There is a newer version: 1.5
Show newest version
/*
 * $Id: OutputStreamEncryption.java 3117 2008-01-31 05:53:22Z xlv $
 *
 * Copyright 2006 Paulo Soares
 *
 * The contents of this file are subject to the Mozilla Public License Version 1.1
 * (the "License"); you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at http://www.mozilla.org/MPL/
 *
 * Software distributed under the License is distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
 * for the specific language governing rights and limitations under the License.
 *
 * The Original Code is 'iText, a free JAVA-PDF library'.
 *
 * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
 * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
 * All Rights Reserved.
 * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
 * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
 *
 * Contributor(s): all the names of the contributors are added in the source code
 * where applicable.
 *
 * Alternatively, the contents of this file may be used under the terms of the
 * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
 * provisions of LGPL are applicable instead of those above.  If you wish to
 * allow use of your version of this file only under the terms of the LGPL
 * License and not to allow others to use your version of this file under
 * the MPL, indicate your decision by deleting the provisions above and
 * replace them with the notice and other provisions required by the LGPL.
 * If you do not delete the provisions above, a recipient may use your version
 * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
 *
 * This library is free software; you can redistribute it and/or modify it
 * under the terms of the MPL as stated above or under the terms of the GNU
 * Library General Public License as published by the Free Software Foundation;
 * either version 2 of the License, or any later version.
 *
 * This library 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 Library general Public License for more
 * details.
 *
 * If you didn't download this code from the following link, you should check if
 * you aren't using an obsolete version:
 * http://www.lowagie.com/iText/
 */
package com.aowagie.text.pdf;
import java.io.IOException;
import java.io.OutputStream;

import com.aowagie.text.ExceptionConverter;
import com.aowagie.text.pdf.crypto.AESCipher;
import com.aowagie.text.pdf.crypto.ARCFOUREncryption;
import com.aowagie.text.pdf.crypto.IVGenerator;

class OutputStreamEncryption extends OutputStream {

    private OutputStream out;
    private ARCFOUREncryption arcfour;
    private AESCipher cipher;
    private final byte[] sb = new byte[1];
    private static final int AES_128 = 4;
    private boolean aes;
    private boolean finished;

    /** Creates a new instance of OutputStreamCounter */
    OutputStreamEncryption(final OutputStream out, final byte key[], final int off, final int len, final int revision) {
        try {
            this.out = out;
            this.aes = revision == AES_128;
            if (this.aes) {
                final byte[] iv = IVGenerator.getIV();
                final byte[] nkey = new byte[len];
                System.arraycopy(key, off, nkey, 0, len);
                this.cipher = new AESCipher(true, nkey, iv);
                write(iv);
            }
            else {
                this.arcfour = new ARCFOUREncryption();
                this.arcfour.prepareARCFOURKey(key, off, len);
            }
        } catch (final Exception ex) {
            throw new ExceptionConverter(ex);
        }
    }



    /** Closes this output stream and releases any system resources
     * associated with this stream. The general contract of close
     * is that it closes the output stream. A closed stream cannot perform
     * output operations and cannot be reopened.
     * 

* The close method of OutputStream does nothing. * * @exception IOException if an I/O error occurs. * */ @Override public void close() throws IOException { finish(); this.out.close(); } /** Flushes this output stream and forces any buffered output bytes * to be written out. The general contract of flush is * that calling it is an indication that, if any bytes previously * written have been buffered by the implementation of the output * stream, such bytes should immediately be written to their * intended destination. *

* The flush method of OutputStream does nothing. * * @exception IOException if an I/O error occurs. * */ @Override public void flush() throws IOException { this.out.flush(); } /** Writes b.length bytes from the specified byte array * to this output stream. The general contract for write(b) * is that it should have exactly the same effect as the call * write(b, 0, b.length). * * @param b the data. * @exception IOException if an I/O error occurs. * @see java.io.OutputStream#write(byte[], int, int) * */ @Override public void write(final byte[] b) throws IOException { write(b, 0, b.length); } /** Writes the specified byte to this output stream. The general * contract for write is that one byte is written * to the output stream. The byte to be written is the eight * low-order bits of the argument b. The 24 * high-order bits of b are ignored. *

* Subclasses of OutputStream must provide an * implementation for this method. * * @param b the byte. * @exception IOException if an I/O error occurs. In particular, * an IOException may be thrown if the * output stream has been closed. * */ @Override public void write(final int b) throws IOException { this.sb[0] = (byte)b; write(this.sb, 0, 1); } /** Writes len bytes from the specified byte array * starting at offset off to this output stream. * The general contract for write(b, off, len) is that * some of the bytes in the array b are written to the * output stream in order; element b[off] is the first * byte written and b[off+len-1] is the last byte written * by this operation. *

* The write method of OutputStream calls * the write method of one argument on each of the bytes to be * written out. Subclasses are encouraged to override this method and * provide a more efficient implementation. *

* If b is null, a * NullPointerException is thrown. *

* If off is negative, or len is negative, or * off+len is greater than the length of the array * b, then an IndexOutOfBoundsException is thrown. * * @param b the data. * @param off the start offset in the data. * @param len the number of bytes to write. * @exception IOException if an I/O error occurs. In particular, * an IOException is thrown if the output * stream is closed. * */ @Override public void write(final byte[] b, int off, int len) throws IOException { if (this.aes) { final byte[] b2 = this.cipher.update(b, off, len); if (b2 == null || b2.length == 0) { return; } this.out.write(b2, 0, b2.length); } else { final byte[] b2 = new byte[Math.min(len, 4192)]; while (len > 0) { final int sz = Math.min(len, b2.length); this.arcfour.encryptARCFOUR(b, off, sz, b2, 0); this.out.write(b2, 0, sz); len -= sz; off += sz; } } } void finish() throws IOException { if (!this.finished) { this.finished = true; if (this.aes) { byte[] b; try { b = this.cipher.doFinal(); } catch (final Exception ex) { throw new ExceptionConverter(ex); } this.out.write(b, 0, b.length); } } } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy