Example usage for javax.crypto Cipher getOutputSize

List of usage examples for javax.crypto Cipher getOutputSize

Introduction

In this page you can find the example usage for javax.crypto Cipher getOutputSize.

Prototype

public final int getOutputSize(int inputLen) 

Source Link

Document

Returns the length in bytes that an output buffer would need to be in order to hold the result of the next update or doFinal operation, given the input length inputLen (in bytes).

Usage

From source file:org.apache.xml.security.encryption.XMLCipher.java

private EncryptedData encryptData(Document context, Element element, String type, InputStream serializedData)
        throws /* XMLEncryption */ Exception {
    contextDocument = context;//from   www  .j a v a2  s . c o  m

    if (algorithm == null) {
        throw new XMLEncryptionException("XMLCipher instance without transformation specified");
    }

    String serializedOctets = null;
    if (serializedData == null) {
        if (type.equals(EncryptionConstants.TYPE_CONTENT)) {
            NodeList children = element.getChildNodes();
            if (null != children) {
                serializedOctets = serializer.serialize(children);
            } else {
                Object exArgs[] = { "Element has no content." };
                throw new XMLEncryptionException("empty", exArgs);
            }
        } else {
            serializedOctets = serializer.serialize(element);
        }
        if (log.isDebugEnabled()) {
            log.debug("Serialized octets:\n" + serializedOctets);
        }
    }

    byte[] encryptedBytes = null;

    // Now create the working cipher if none was created already
    Cipher c;
    if (contextCipher == null) {
        String jceAlgorithm = JCEMapper.translateURItoJCEID(algorithm);
        if (log.isDebugEnabled()) {
            log.debug("alg = " + jceAlgorithm);
        }

        try {
            if (requestedJCEProvider == null) {
                c = Cipher.getInstance(jceAlgorithm);
            } else {
                c = Cipher.getInstance(jceAlgorithm, requestedJCEProvider);
            }
        } catch (NoSuchAlgorithmException nsae) {
            throw new XMLEncryptionException("empty", nsae);
        } catch (NoSuchProviderException nspre) {
            throw new XMLEncryptionException("empty", nspre);
        } catch (NoSuchPaddingException nspae) {
            throw new XMLEncryptionException("empty", nspae);
        }
    } else {
        c = contextCipher;
    }
    // Now perform the encryption

    try {
        // Should internally generate an IV
        // todo - allow user to set an IV
        c.init(cipherMode, key);
    } catch (InvalidKeyException ike) {
        throw new XMLEncryptionException("empty", ike);
    }

    try {
        if (serializedData != null) {
            int numBytes;
            byte[] buf = new byte[8192];
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            while ((numBytes = serializedData.read(buf)) != -1) {
                byte[] data = c.update(buf, 0, numBytes);
                baos.write(data);
            }
            baos.write(c.doFinal());
            encryptedBytes = baos.toByteArray();
        } else {
            encryptedBytes = c.doFinal(serializedOctets.getBytes("UTF-8"));
            if (log.isDebugEnabled()) {
                log.debug("Expected cipher.outputSize = "
                        + Integer.toString(c.getOutputSize(serializedOctets.getBytes("UTF-8").length)));
            }
        }
        if (log.isDebugEnabled()) {
            log.debug("Actual cipher.outputSize = " + Integer.toString(encryptedBytes.length));
        }
    } catch (IllegalStateException ise) {
        throw new XMLEncryptionException("empty", ise);
    } catch (IllegalBlockSizeException ibse) {
        throw new XMLEncryptionException("empty", ibse);
    } catch (BadPaddingException bpe) {
        throw new XMLEncryptionException("empty", bpe);
    } catch (UnsupportedEncodingException uee) {
        throw new XMLEncryptionException("empty", uee);
    }

    // Now build up to a properly XML Encryption encoded octet stream
    // IvParameterSpec iv;
    byte[] iv = c.getIV();
    byte[] finalEncryptedBytes = new byte[iv.length + encryptedBytes.length];
    System.arraycopy(iv, 0, finalEncryptedBytes, 0, iv.length);
    System.arraycopy(encryptedBytes, 0, finalEncryptedBytes, iv.length, encryptedBytes.length);
    String base64EncodedEncryptedOctets = Base64.encode(finalEncryptedBytes);

    if (log.isDebugEnabled()) {
        log.debug("Encrypted octets:\n" + base64EncodedEncryptedOctets);
        log.debug("Encrypted octets length = " + base64EncodedEncryptedOctets.length());
    }

    try {
        CipherData cd = ed.getCipherData();
        CipherValue cv = cd.getCipherValue();
        // cv.setValue(base64EncodedEncryptedOctets.getBytes());
        cv.setValue(base64EncodedEncryptedOctets);

        if (type != null) {
            ed.setType(new URI(type).toString());
        }
        EncryptionMethod method = factory.newEncryptionMethod(new URI(algorithm).toString());
        ed.setEncryptionMethod(method);
    } catch (URISyntaxException ex) {
        throw new XMLEncryptionException("empty", ex);
    }
    return ed;
}