151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/*
251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Copyright (c) 1997, 2007, Oracle and/or its affiliates. All rights reserved.
351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is free software; you can redistribute it and/or modify it
651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * under the terms of the GNU General Public License version 2 only, as
751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * published by the Free Software Foundation.  Oracle designates this
851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * particular file as subject to the "Classpath" exception as provided
951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * by Oracle in the LICENSE file that accompanied this code.
1051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
1151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is distributed in the hope that it will be useful, but WITHOUT
1251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
1451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * version 2 for more details (a copy is included in the LICENSE file that
1551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * accompanied this code).
1651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
1751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * You should have received a copy of the GNU General Public License version
1851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2 along with this work; if not, write to the Free Software Foundation,
1951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
2051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
2151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or visit www.oracle.com if you need additional information or have any
2351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * questions.
2451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */
2551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
2651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipackage javax.crypto;
2751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
2851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.io.*;
2951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
3051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/**
3151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * A CipherOutputStream is composed of an OutputStream and a Cipher so
3251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * that write() methods first process the data before writing them out
3351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * to the underlying OutputStream.  The cipher must be fully
3451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * initialized before being used by a CipherOutputStream.
3551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
3651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> For example, if the cipher is initialized for encryption, the
3751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * CipherOutputStream will attempt to encrypt data before writing out the
3851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * encrypted data.
3951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
4051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> This class adheres strictly to the semantics, especially the
4151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * failure semantics, of its ancestor classes
4251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * java.io.OutputStream and java.io.FilterOutputStream.  This class
4351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * has exactly those methods specified in its ancestor classes, and
4451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * overrides them all.  Moreover, this class catches all exceptions
4551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * that are not thrown by its ancestor classes.
4651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
4751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> It is crucial for a programmer using this class not to use
4851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * methods that are not defined or overriden in this class (such as a
4951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * new method or constructor that is later added to one of the super
5051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * classes), because the design and implementation of those methods
5151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * are unlikely to have considered security impact with regard to
5251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * CipherOutputStream.
5351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
5451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @author  Li Gong
5551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see     java.io.OutputStream
5651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see     java.io.FilterOutputStream
5751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see     javax.crypto.Cipher
5851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see     javax.crypto.CipherInputStream
5951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
6051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.4
6151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */
6251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
6351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipublic class CipherOutputStream extends FilterOutputStream {
6451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
6551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    // the cipher engine to use to process stream data
6651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private Cipher cipher;
6751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
6851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    // the underlying output stream
6951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private OutputStream output;
7051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
7151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /* the buffer holding one byte of incoming data */
7251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private byte[] ibuffer = new byte[1];
7351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
7451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    // the buffer holding data ready to be written out
7551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private byte[] obuffer;
7651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
7751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
7851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
7951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Constructs a CipherOutputStream from an OutputStream and a
8051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Cipher.
8151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <br>Note: if the specified output stream or cipher is
8251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * null, a NullPointerException may be thrown later when
8351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * they are used.
8451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
8551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param os  the OutputStream object
8651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param c   an initialized Cipher object
8751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
8851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public CipherOutputStream(OutputStream os, Cipher c) {
8951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        super(os);
9051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        output = os;
9151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        cipher = c;
9251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    };
9351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
9451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
9551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Constructs a CipherOutputStream from an OutputStream without
9651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * specifying a Cipher. This has the effect of constructing a
9751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * CipherOutputStream using a NullCipher.
9851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <br>Note: if the specified output stream is null, a
9951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * NullPointerException may be thrown later when it is used.
10051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
10151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param os  the OutputStream object
10251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
10351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    protected CipherOutputStream(OutputStream os) {
10451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        super(os);
10551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        output = os;
10651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        cipher = new NullCipher();
10751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
10851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
10951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
11051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Writes the specified byte to this output stream.
11151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
11251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param      b   the <code>byte</code>.
11351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @exception  IOException  if an I/O error occurs.
11451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @since      JCE1.2
11551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
11651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void write(int b) throws IOException {
11751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        ibuffer[0] = (byte) b;
11851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        obuffer = cipher.update(ibuffer, 0, 1);
11951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (obuffer != null) {
12051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            output.write(obuffer);
12151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            obuffer = null;
12251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
12351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    };
12451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
12551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
12651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Writes <code>b.length</code> bytes from the specified byte array
12751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * to this output stream.
12851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>
12951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * The <code>write</code> method of
13051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>CipherOutputStream</code> calls the <code>write</code>
13151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * method of three arguments with the three arguments
13251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>b</code>, <code>0</code>, and <code>b.length</code>.
13351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
13451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param      b   the data.
13551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @exception  NullPointerException if <code>b</code> is null.
13651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @exception  IOException  if an I/O error occurs.
13751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see        javax.crypto.CipherOutputStream#write(byte[], int, int)
13851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @since JCE1.2
13951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
14051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void write(byte b[]) throws IOException {
14151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        write(b, 0, b.length);
14251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
14351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
14451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
14551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Writes <code>len</code> bytes from the specified byte array
14651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * starting at offset <code>off</code> to this output stream.
14751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
14851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param      b     the data.
14951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param      off   the start offset in the data.
15051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param      len   the number of bytes to write.
15151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @exception  IOException  if an I/O error occurs.
15251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @since      JCE1.2
15351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
15451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void write(byte b[], int off, int len) throws IOException {
15551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        obuffer = cipher.update(b, off, len);
15651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (obuffer != null) {
15751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            output.write(obuffer);
15851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            obuffer = null;
15951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
16051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
16151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
16251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
16351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Flushes this output stream by forcing any buffered output bytes
16451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * that have already been processed by the encapsulated cipher object
16551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * to be written out.
16651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
16751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>Any bytes buffered by the encapsulated cipher
16851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * and waiting to be processed by it will not be written out. For example,
16951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * if the encapsulated cipher is a block cipher, and the total number of
17051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * bytes written using one of the <code>write</code> methods is less than
17151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * the cipher's block size, no bytes will be written out.
17251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
17351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @exception  IOException  if an I/O error occurs.
17451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @since      JCE1.2
17551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
17651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void flush() throws IOException {
17751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (obuffer != null) {
17851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            output.write(obuffer);
17951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            obuffer = null;
18051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
18151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        output.flush();
18251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
18351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
18451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
18551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Closes this output stream and releases any system resources
18651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * associated with this stream.
18751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>
18851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * This method invokes the <code>doFinal</code> method of the encapsulated
18951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * cipher object, which causes any bytes buffered by the encapsulated
19051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * cipher to be processed. The result is written out by calling the
19151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>flush</code> method of this output stream.
19251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>
19351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * This method resets the encapsulated cipher object to its initial state
19451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * and calls the <code>close</code> method of the underlying output
19551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * stream.
19651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
19751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @exception  IOException  if an I/O error occurs.
19851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @since      JCE1.2
19951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
20051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void close() throws IOException {
20151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        try {
20251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            obuffer = cipher.doFinal();
20351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        } catch (IllegalBlockSizeException e) {
20451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            obuffer = null;
20551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        } catch (BadPaddingException e) {
20651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            obuffer = null;
20751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
20851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        try {
20951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            flush();
21051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        } catch (IOException ignored) {}
21151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        out.close();
21251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
21351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski}
214