/*
 *  Licensed to the Apache Software Foundation (ASF) under one or more
 *  contributor license agreements.  See the NOTICE file distributed with
 *  this work for additional information regarding copyright ownership.
 *  The ASF licenses this file to You under the Apache License, Version 2.0
 *  (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.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

/**
* @author Vera Y. Petrashkova
* @version $Revision$
*/

package org.apache.harmony.crypto.tests.support;

import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.spec.AlgorithmParameterSpec;

import javax.crypto.MacSpi;
import javax.crypto.spec.SecretKeySpec;

/**
 * Additional class for verification of MacGeneratorSpi and MacSpi
 *
 */

public class MyMacSpi extends MacSpi {

    private int length = 0;
    @Override
    protected int engineGetMacLength() {
        return length;
    }

    @Override
    protected void engineInit(Key key, AlgorithmParameterSpec params)
            throws InvalidKeyException, InvalidAlgorithmParameterException {
        if (params == null) {
            if (!(key instanceof SecretKeySpec)) {
                throw new IllegalArgumentException("params is null and key is SecretKeySpec");
            }
        }
    }

    @Override
    protected void engineUpdate(byte input) {
    }

    @Override
    protected void engineUpdate(byte[] input, int offset, int len) {
        if (offset >= 0 && len >= 0) {
            length = len;
        }
    }

    @Override
    protected byte[] engineDoFinal() {
        return new byte[length];
    }

    @Override
    protected void engineReset() {
        length++;
    }
}
