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

gnu.crypto.jce.params.BlockCipherParameters Maven / Gradle / Ivy

The newest version!
package gnu.crypto.jce.params;

// --------------------------------------------------------------------------
// $Id: BlockCipherParameters.java,v 1.2 2003/04/28 10:39:00 raif Exp $
//
// Copyright (C) 2002, 2003 Free Software Foundation, Inc.
//
// This file is part of GNU Crypto.
//
// GNU Crypto 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.
//
// GNU Crypto 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.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the
//
//    Free Software Foundation, Inc.,
//    59 Temple Place, Suite 330,
//    Boston, MA  02111-1307
//    USA
//
// Linking this library statically or dynamically with other modules is
// making a combined work based on this library.  Thus, the terms and
// conditions of the GNU General Public License cover the whole
// combination.
//
// As a special exception, the copyright holders of this library give
// you permission to link this library with independent modules to
// produce an executable, regardless of the license terms of these
// independent modules, and to copy and distribute the resulting
// executable under terms of your choice, provided that you also meet,
// for each linked independent module, the terms and conditions of the
// license of that module.  An independent module is a module which is
// not derived from or based on this library.  If you modify this
// library, you may extend this exception to your version of the
// library, but you are not obligated to do so.  If you do not wish to
// do so, delete this exception statement from your version.
//
// --------------------------------------------------------------------------

import gnu.crypto.jce.spec.BlockCipherParameterSpec;

import java.io.IOException;
import java.math.BigInteger;

import java.security.AlgorithmParametersSpi;
import java.security.spec.AlgorithmParameterSpec;
import java.security.spec.InvalidParameterSpecException;

/**
 * An implementation of algorithm parameters for the GNU Crypto block
 * ciphers. This encompasses the cipher's block size, its key size, and
 * an optional initialization vector (IV).
 *
 * @version $Revision: 1.2 $
 */
public class BlockCipherParameters extends AlgorithmParametersSpi {

   // Constants and variables.
   // -----------------------------------------------------------------------

   /**
    * The underlying block cipher specification.
    */
   protected BlockCipherParameterSpec cipherSpec;

   private static final String DEFAULT_FORMAT = "ASN.1";

   // Instance methods implementing AlgorithmParametersSpi.
   // -----------------------------------------------------------------------

   /**
    * Return these parameters encoded in ASN.1 (DER).
    *
    * 

For GNU Crypto block ciphers we will define these parameters as * *

*
BlockCipherParameters ::= SEQUENCE {
    *   blockSize            INTEGER,
    *   keySize              INTEGER,
    *   initializationVector OCTET STRING OPTIONAL }
*
* * @return The parameters, encoded an an ASN.1 DER sequence. * @throws java.io.IOException If encoding these parameters fails. */ protected byte[] engineGetEncoded() throws IOException { return engineGetEncoded(DEFAULT_FORMAT); } protected byte[] engineGetEncoded(String format) throws IOException { if (!format.equalsIgnoreCase(DEFAULT_FORMAT) && !format.equalsIgnoreCase("asn1")) { throw new IOException("unknown format \"" + format + "\""); } // This is probably a bad idea. /* int len = 12 + ((cipherSpec.getIV() != null) ? cipherSpec.getIV().length + 2 : 0); ByteArrayOutputStream out = new ByteArrayOutputStream(); out.write(0x30); out.write(len); out.write(0x02); out.write(4); out.write(cipherSpec.getBlockSize() >>> 24 & 0xff); out.write(cipherSpec.getBlockSize() >>> 16 & 0xff); out.write(cipherSpec.getBlockSize() >>> 8 & 0xff); out.write(cipherSpec.getBlockSize() & 0xff); out.write(0x02); out.write(4); out.write(cipherSpec.getKeySize() >>> 24 & 0xff); out.write(cipherSpec.getKeySize() >>> 16 & 0xff); out.write(cipherSpec.getKeySize() >>> 8 & 0xff); out.write(cipherSpec.getKeySize() & 0xff); if (cipherSpec.getIV() != null) { out.write(0x04); len = cipherSpec.getIV().length; out.write(len & 0xff); out.write(cipherSpec.getIV()); } out.write(0); out.write(0); return out.toByteArray();*/ DERWriter writer = new DERWriter(); return writer.joinarrays( writer.writeBigInteger(BigInteger.valueOf(cipherSpec.getBlockSize())), writer.writeBigInteger(BigInteger.valueOf(cipherSpec.getKeySize())), (cipherSpec.getIV() != null) ? writer.writeBigInteger(new BigInteger(cipherSpec.getIV())) : new byte[0]); } protected void engineInit(AlgorithmParameterSpec spec) throws InvalidParameterSpecException { if (spec instanceof BlockCipherParameterSpec) { cipherSpec = (BlockCipherParameterSpec) spec; } else { throw new InvalidParameterSpecException(); } } protected void engineInit(byte[] encoded, String format) throws IOException { if (!format.equalsIgnoreCase(DEFAULT_FORMAT) && !format.equalsIgnoreCase("ASN1")) { throw new IOException("invalid format: only accepts ASN.1"); } engineInit(encoded); } protected void engineInit(byte[] encoded) throws IOException { // This is probably an equally bad idea. /*if (encoded[0] != 0x30) { throw new IOException("malformed ASN.1 sequence"); } if (encoded[2] != 0x02 || encoded[3] != 4) { throw new IOException("malformed ASN.1 sequence"); } int blockSize = encoded[4] << 24 | encoded[5] << 16 | encoded[6] << 8 | encoded[7]; if (encoded[8] != 0x02 || encoded[9] != 4) { throw new IOException("malformed ASN.1 sequence"); } int keySize = encoded[10] << 24 | encoded[11] << 16 | encoded[12] << 8 | encoded[13]; if (encoded[14] == 0x04) { int len = encoded[15] & 0xff; byte[] iv = new byte[len]; System.arraycopy(encoded, 16, iv, 0, len); cipherSpec = new BlockCipherParameterSpec(iv, blockSize, keySize); } else if (encoded[14] == 0) { cipherSpec = new BlockCipherParameterSpec(blockSize, keySize); } else { throw new IOException("malformed ASN.1 sequence"); }*/ DERReader reader = new DERReader(encoded); int bs = reader.getBigInteger().intValue(); int ks = reader.getBigInteger().intValue(); byte[] iv = null; if (reader.hasMorePrimitives()) { iv = reader.getBigInteger().toByteArray(); } cipherSpec = new BlockCipherParameterSpec(iv, bs, ks); System.out.println(cipherSpec); } protected AlgorithmParameterSpec engineGetParameterSpec(Class c) throws InvalidParameterSpecException { if (c.isInstance(cipherSpec)) { return cipherSpec; } throw new InvalidParameterSpecException(); } protected String engineToString() { return cipherSpec.toString(); } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy