001// SPDX-FileCopyrightText: 2018 Paul Schaub <vanitasvitae@fsfe.org>
002//
003// SPDX-License-Identifier: Apache-2.0
004
005package org.pgpainless.algorithm;
006
007import java.util.Arrays;
008import java.util.Collections;
009import java.util.LinkedHashSet;
010import java.util.List;
011import java.util.Set;
012
013/**
014 * The {@link AlgorithmSuite} class is consulted when new OpenPGP keys are being generated to set
015 * preferred algorithms on the key.
016 */
017public class AlgorithmSuite {
018
019    private static final AlgorithmSuite defaultAlgorithmSuite = new AlgorithmSuite(
020            Arrays.asList(
021                    SymmetricKeyAlgorithm.AES_256,
022                    SymmetricKeyAlgorithm.AES_192,
023                    SymmetricKeyAlgorithm.AES_128),
024            Arrays.asList(
025                    HashAlgorithm.SHA512,
026                    HashAlgorithm.SHA384,
027                    HashAlgorithm.SHA256,
028                    HashAlgorithm.SHA224),
029            Arrays.asList(
030                    CompressionAlgorithm.ZLIB,
031                    CompressionAlgorithm.BZIP2,
032                    CompressionAlgorithm.ZIP,
033                    CompressionAlgorithm.UNCOMPRESSED)
034    );
035
036    private final Set<SymmetricKeyAlgorithm> symmetricKeyAlgorithms;
037    private final Set<HashAlgorithm> hashAlgorithms;
038    private final Set<CompressionAlgorithm> compressionAlgorithms;
039
040    public AlgorithmSuite(List<SymmetricKeyAlgorithm> symmetricKeyAlgorithms,
041                          List<HashAlgorithm> hashAlgorithms,
042                          List<CompressionAlgorithm> compressionAlgorithms) {
043        this.symmetricKeyAlgorithms = Collections.unmodifiableSet(new LinkedHashSet<>(symmetricKeyAlgorithms));
044        this.hashAlgorithms = Collections.unmodifiableSet(new LinkedHashSet<>(hashAlgorithms));
045        this.compressionAlgorithms = Collections.unmodifiableSet(new LinkedHashSet<>(compressionAlgorithms));
046    }
047
048    public Set<SymmetricKeyAlgorithm> getSymmetricKeyAlgorithms() {
049        return new LinkedHashSet<>(symmetricKeyAlgorithms);
050    }
051
052    public Set<HashAlgorithm> getHashAlgorithms() {
053        return new LinkedHashSet<>(hashAlgorithms);
054    }
055
056    public Set<CompressionAlgorithm> getCompressionAlgorithms() {
057        return new LinkedHashSet<>(compressionAlgorithms);
058    }
059
060    public static AlgorithmSuite getDefaultAlgorithmSuite() {
061        return defaultAlgorithmSuite;
062    }
063}