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}