All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.amazonaws.encryptionsdk.MasterKeyRequest Maven / Gradle / Ivy

/*
 * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except
 * in compliance with the License. A copy of the License is located at
 * 
 * http://aws.amazon.com/apache2.0
 * 
 * or in the "license" file accompanying this file. This file 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.amazonaws.encryptionsdk;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;

/**
 * Contains information which {@link MasterKeyProvider}s can use to select which {@link MasterKey}s
 * to use to protect a given plaintext. This class is immutable.
 */
public final class MasterKeyRequest {
    private final Map encryptionContext_;
    private final boolean isStreaming_;
    private final byte[] plaintext_;
    private final long size_;

    private MasterKeyRequest(final Map encryptionContext, final boolean isStreaming,
            final byte[] plaintext, final long size) {
        encryptionContext_ = encryptionContext;
        isStreaming_ = isStreaming;
        plaintext_ = plaintext;
        size_ = size;
    }

    public Map getEncryptionContext() {
        return encryptionContext_;
    }

    public boolean isStreaming() {
        return isStreaming_;
    }

    /**
     * The plaintext, if available, to be protected by this request. Otherwise, {@code null}.
     */
    public byte[] getPlaintext() {
        return plaintext_ != null ? plaintext_.clone() : null;
    }

    /**
     * The size of the plaintext, if available. Otherwise {@code -1}.
     */
    public long getSize() {
        return size_;
    }

    public static Builder newBuilder() {
        return new Builder();
    }

    public final static class Builder {
        private Map encryptionContext_ = new HashMap<>();
        private boolean isStreaming_ = false;
        private byte[] plaintext_ = null;
        private long size_ = -1;

        public Map getEncryptionContext() {
            return encryptionContext_;
        }

        public Builder setEncryptionContext(final Map encryptionContext) {
            encryptionContext_ = encryptionContext;
            return this;
        }

        public boolean isStreaming() {
            return isStreaming_;
        }

        public Builder setStreaming(final boolean isStreaming) {
            isStreaming_ = isStreaming;
            return this;
        }

        /**
         * Please note that this does not make a defensive copy of the plaintext and so any
         * modifications made to the backing array will be reflected in this Builder.
         */
        @SuppressFBWarnings("EI_EXPOSE_REP")
        public byte[] getPlaintext() {
            return plaintext_;
        }

        /**
         * Please note that this does not make a defensive copy of the plaintext and so any
         * modifications made to the backing array will be reflected in this Builder.
         */
        @SuppressFBWarnings("EI_EXPOSE_REP")
        public Builder setPlaintext(final byte[] plaintext) {
            if (size_ != -1) {
                throw new IllegalStateException("The plaintext may only be set if the size has not been explicitly set");
            }
            plaintext_ = plaintext;
            return this;
        }

        public Builder setSize(final long size) {
            if (plaintext_ != null) {
                throw new IllegalStateException("Size may only explicitly set when the plaintext is not set");
            }
            size_ = size;
            return this;
        }

        public long getSize() {
            return size_;
        }

        public MasterKeyRequest build() {
            return new MasterKeyRequest(
                    Collections.unmodifiableMap(new HashMap<>(encryptionContext_)),
                    isStreaming_,
                    plaintext_,
                    plaintext_ != null ? plaintext_.length : size_);
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy