0N/A/*
2362N/A * Copyright (c) 1998, 2007, Oracle and/or its affiliates. All rights reserved.
0N/A * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
0N/A *
0N/A * This code is free software; you can redistribute it and/or modify it
0N/A * under the terms of the GNU General Public License version 2 only, as
2362N/A * published by the Free Software Foundation. Oracle designates this
0N/A * particular file as subject to the "Classpath" exception as provided
2362N/A * by Oracle in the LICENSE file that accompanied this code.
0N/A *
0N/A * This code is distributed in the hope that it will be useful, but WITHOUT
0N/A * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
0N/A * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
0N/A * version 2 for more details (a copy is included in the LICENSE file that
0N/A * accompanied this code).
0N/A *
0N/A * You should have received a copy of the GNU General Public License version
0N/A * 2 along with this work; if not, write to the Free Software Foundation,
0N/A * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
0N/A *
2362N/A * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2362N/A * or visit www.oracle.com if you need additional information or have any
2362N/A * questions.
0N/A */
0N/A
0N/Apackage com.sun.crypto.provider;
0N/A
0N/Aimport java.util.*;
0N/Aimport java.io.*;
0N/Aimport java.math.BigInteger;
0N/Aimport java.security.AlgorithmParametersSpi;
0N/Aimport java.security.spec.AlgorithmParameterSpec;
0N/Aimport java.security.spec.InvalidParameterSpecException;
0N/Aimport javax.crypto.spec.PBEParameterSpec;
0N/Aimport sun.misc.HexDumpEncoder;
0N/Aimport sun.security.util.*;
0N/A
0N/A
0N/A/**
0N/A * This class implements the parameter set used with password-based
0N/A * encryption, which is defined in PKCS#5 as follows:
0N/A *
0N/A * <pre>
0N/A * PBEParameter ::= SEQUENCE {
0N/A * salt OCTET STRING SIZE(8),
0N/A * iterationCount INTEGER }
0N/A * </pre>
0N/A *
0N/A * @author Jan Luehe
0N/A *
0N/A */
0N/A
0N/Apublic final class PBEParameters extends AlgorithmParametersSpi {
0N/A
0N/A // the salt
0N/A private byte[] salt = null;
0N/A
0N/A // the iteration count
0N/A private int iCount = 0;
0N/A
0N/A protected void engineInit(AlgorithmParameterSpec paramSpec)
0N/A throws InvalidParameterSpecException
0N/A {
0N/A if (!(paramSpec instanceof PBEParameterSpec)) {
0N/A throw new InvalidParameterSpecException
0N/A ("Inappropriate parameter specification");
0N/A }
0N/A this.salt = (byte[])((PBEParameterSpec)paramSpec).getSalt().clone();
0N/A this.iCount = ((PBEParameterSpec)paramSpec).getIterationCount();
0N/A }
0N/A
0N/A protected void engineInit(byte[] encoded)
0N/A throws IOException
0N/A {
0N/A try {
0N/A DerValue val = new DerValue(encoded);
0N/A if (val.tag != DerValue.tag_Sequence) {
0N/A throw new IOException("PBE parameter parsing error: "
0N/A + "not a sequence");
0N/A }
0N/A val.data.reset();
0N/A
0N/A this.salt = val.data.getOctetString();
0N/A this.iCount = val.data.getInteger();
0N/A
0N/A if (val.data.available() != 0) {
0N/A throw new IOException
0N/A ("PBE parameter parsing error: extra data");
0N/A }
0N/A } catch (NumberFormatException e) {
0N/A throw new IOException("iteration count too big");
0N/A }
0N/A }
0N/A
0N/A protected void engineInit(byte[] encoded, String decodingMethod)
0N/A throws IOException
0N/A {
0N/A engineInit(encoded);
0N/A }
0N/A
0N/A protected AlgorithmParameterSpec engineGetParameterSpec(Class paramSpec)
0N/A throws InvalidParameterSpecException
0N/A {
0N/A if (PBEParameterSpec.class.isAssignableFrom(paramSpec)) {
0N/A return new PBEParameterSpec(this.salt, this.iCount);
0N/A } else {
0N/A throw new InvalidParameterSpecException
0N/A ("Inappropriate parameter specification");
0N/A }
0N/A }
0N/A
0N/A protected byte[] engineGetEncoded() throws IOException {
0N/A DerOutputStream out = new DerOutputStream();
0N/A DerOutputStream bytes = new DerOutputStream();
0N/A
0N/A bytes.putOctetString(this.salt);
0N/A bytes.putInteger(this.iCount);
0N/A
0N/A out.write(DerValue.tag_Sequence, bytes);
0N/A return out.toByteArray();
0N/A }
0N/A
0N/A protected byte[] engineGetEncoded(String encodingMethod)
0N/A throws IOException
0N/A {
0N/A return engineGetEncoded();
0N/A }
0N/A
0N/A /*
0N/A * Returns a formatted string describing the parameters.
0N/A */
0N/A protected String engineToString() {
0N/A String LINE_SEP = System.getProperty("line.separator");
0N/A String saltString = LINE_SEP + " salt:" + LINE_SEP + "[";
0N/A HexDumpEncoder encoder = new HexDumpEncoder();
0N/A saltString += encoder.encodeBuffer(salt);
0N/A saltString += "]";
0N/A
0N/A return saltString + LINE_SEP + " iterationCount:"
0N/A + LINE_SEP + Debug.toHexString(BigInteger.valueOf(iCount))
0N/A + LINE_SEP;
0N/A }
0N/A}