// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package org.chromium.net;

import org.chromium.base.CalledByNative;
import org.chromium.base.JNINamespace;

import java.security.cert.CertificateEncodingException;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * The result of a certification verification.
 */
@JNINamespace("net::android")
public class AndroidCertVerifyResult {

    /**
     * The verification status. One of the values in CertVerifyStatusAndroid.
     */
    private final int mStatus;

    /**
     * True if the root CA in the chain is in the system store.
     */
    private final boolean mIsIssuedByKnownRoot;

    /**
     * The properly ordered certificate chain used for verification.
     */
    private final List<X509Certificate> mCertificateChain;

    public AndroidCertVerifyResult(int status,
                                   boolean isIssuedByKnownRoot,
                                   List<X509Certificate> certificateChain) {
        mStatus = status;
        mIsIssuedByKnownRoot = isIssuedByKnownRoot;
        mCertificateChain = new ArrayList<X509Certificate>(certificateChain);
    }

    public AndroidCertVerifyResult(int status) {
        mStatus = status;
        mIsIssuedByKnownRoot = false;
        mCertificateChain = Collections.<X509Certificate>emptyList();
    }

    @CalledByNative
    public int getStatus() {
        return mStatus;
    }

    @CalledByNative
    public boolean isIssuedByKnownRoot() {
        return mIsIssuedByKnownRoot;
    }

    @CalledByNative
    public byte[][] getCertificateChainEncoded() {
        byte[][] verifiedChainArray = new byte[mCertificateChain.size()][];
        try {
            for (int i = 0; i < mCertificateChain.size(); i++) {
                verifiedChainArray[i] = mCertificateChain.get(i).getEncoded();
            }
        } catch (CertificateEncodingException e) {
            return new byte[0][];
        }
        return verifiedChainArray;
    }
}
