package org.jboss.resteasy.jose.jwe.crypto;

import org.jboss.resteasy.jose.i18n.Messages;

/**
 * The cryptographic parts of a JSON Web Encryption (JWE) object. This class is
 * an immutable simple wrapper for returning the cipher text, initialisation
 * vector (IV), encrypted key and authentication tag
 * implementations.
 *
 * @author Vladimir Dzhuvinov
 * @version $version$ (2012-05-05)
 */
public final class JWECryptoParts {

    /**
     * The encrypted key (optional).
     */
    private final String encryptedKey;

    /**
     * The initialisation vector (optional).
     */
    private final String iv;

    /**
     * The cipher text.
     */
    private final String cipherText;

    /**
     * The authentication tag (optional).
     */
    private final String authenticationTag;

    /**
     * Creates a new cryptograhic JWE parts instance.
     *
     * @param encryptedKey      The encrypted key, {@code null} if not
     *                          required by the encryption algorithm.
     * @param iv                The initialisation vector (IV),
     *                          {@code null} if not required by the
     *                          encryption algorithm.
     * @param cipherText        The cipher text. Must not be {@code null}.
     * @param authenticationTag The authentication tag, {@code null} if the
     *                          JWE algorithm provides built-in integrity
     *                          check.
     */
    public JWECryptoParts(final String encryptedKey,
            final String iv,
            final String cipherText,
            final String authenticationTag) {

        this.encryptedKey = encryptedKey;

        this.iv = iv;

        if (cipherText == null) {

            throw new IllegalArgumentException(Messages.MESSAGES.cipherTextMustNotBeNull());
        }

        this.cipherText = cipherText;

        this.authenticationTag = authenticationTag;
    }

    /**
     * Gets the encrypted key.
     *
     * @return The encrypted key, {@code null} if not required by
     *         the JWE algorithm.
     */
    public String getEncryptedKey() {

        return encryptedKey;
    }

    /**
     * Gets the initialisation vector (IV).
     *
     * @return The initialisation vector (IV), {@code null} if not required
     *         by the JWE algorithm.
     */
    public String getInitializationVector() {

        return iv;
    }

    /**
     * Gets the cipher text.
     *
     * @return The cipher text.
     */
    public String getCipherText() {

        return cipherText;
    }

    /**
     * Gets the authentication tag.
     *
     * @return The authentication tag, {@code null} if the encryption
     *         algorithm provides built-in integrity checking.
     */
    public String getAuthenticationTag() {

        return authenticationTag;
    }

}
