/*
 * Copyright (C) 2019 The Android Open Source Project
 *
 * Licensed 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.
 */
package com.android.se.security.gpac;

import java.io.ByteArrayOutputStream;
import java.io.IOException;

/**
 * PERM-AR-DO: The access rule for Device API control consists of a permission bit mask of 8 bytes.
 */
public class PERM_AR_DO extends BerTlv {

    public static final int TAG = 0xDB;

    public static final int PERM_MASK_LEN = 8;

    private byte[] mPermissionMask = new byte[0];

    public PERM_AR_DO(byte[] rawData, int valueIndex, int valueLength) {
        super(rawData, TAG, valueIndex, valueLength);
    }

    public PERM_AR_DO(byte[] permissionMask) {
        super(permissionMask, TAG, 0, (permissionMask == null ? 0 : permissionMask.length));
        if (permissionMask != null) mPermissionMask = permissionMask;
    }

    public byte[] getPermissionMask() {
        return mPermissionMask;
    }

    @Override
    /**
     * Tag: DB Length: 8 Value: Contains a permission mask
     */
    public void interpret() throws ParserException {
        mPermissionMask = new byte[0];

        byte[] data = getRawData();
        int index = getValueIndex();
        int length = getValueLength();

        if (index + getValueLength() > data.length) {
            throw new ParserException("Not enough data for PERM-AR-DO!");
        }

        if (length == PERM_MASK_LEN) {
            mPermissionMask = new byte[length];
            System.arraycopy(data, index, mPermissionMask, 0, length);
        } else {
            throw new ParserException("Invalid length of PERM-AR-DO!");
        }
    }

    @Override
    /**
     * Tag: DB Length: 8 Value: Contains a permission mask
     */
    public void build(ByteArrayOutputStream stream) throws DO_Exception {

        // quick checks
        if (mPermissionMask.length != PERM_MASK_LEN) {
            throw new DO_Exception("Invalid value length for PERM-AR-DO!");
        }

        // write tag
        stream.write(getTag());
        try {
            stream.write(mPermissionMask.length);
            stream.write(mPermissionMask);
        } catch (IOException ioe) {
            throw new DO_Exception("PERM could not be written!");
        }
    }
}
