001// SPDX-FileCopyrightText: 2021 Paul Schaub <vanitasvitae@fsfe.org>
002//
003// SPDX-License-Identifier: Apache-2.0
004
005package org.pgpainless.algorithm.negotiation;
006
007import java.util.Set;
008
009import org.pgpainless.algorithm.HashAlgorithm;
010import org.pgpainless.policy.Policy;
011
012public interface HashAlgorithmNegotiator {
013
014    HashAlgorithm negotiateHashAlgorithm(Set<HashAlgorithm> orderedHashAlgorithmPreferencesSet);
015
016    static HashAlgorithmNegotiator negotiateSignatureHashAlgorithm(Policy policy) {
017        return negotiateByPolicy(policy.getSignatureHashAlgorithmPolicy());
018    }
019
020    static HashAlgorithmNegotiator negotiateRevocationSignatureAlgorithm(Policy policy) {
021        return negotiateByPolicy(policy.getRevocationSignatureHashAlgorithmPolicy());
022    }
023
024    static HashAlgorithmNegotiator negotiateByPolicy(Policy.HashAlgorithmPolicy hashAlgorithmPolicy) {
025        return new HashAlgorithmNegotiator() {
026            @Override
027            public HashAlgorithm negotiateHashAlgorithm(Set<HashAlgorithm> orderedPreferencesSet) {
028                for (HashAlgorithm preference : orderedPreferencesSet) {
029                    if (hashAlgorithmPolicy.isAcceptable(preference)) {
030                        return preference;
031                    }
032                }
033                return hashAlgorithmPolicy.defaultHashAlgorithm();
034            }
035        };
036    }
037}