pgpainless/pgpainless-core/src/main/kotlin/org/pgpainless/algorithm/negotiation/HashAlgorithmNegotiator.kt

74 lines
2.5 KiB
Kotlin

// SPDX-FileCopyrightText: 2023 Paul Schaub <vanitasvitae@fsfe.org>
//
// SPDX-License-Identifier: Apache-2.0
package org.pgpainless.algorithm.negotiation
import org.pgpainless.algorithm.HashAlgorithm
import org.pgpainless.policy.Policy
/**
* Interface for a class that negotiates [HashAlgorithms][HashAlgorithm].
*
* You can provide your own implementation using custom logic by implementing the
* [negotiateHashAlgorithm(Set)] method.
*/
interface HashAlgorithmNegotiator {
/**
* Pick one [HashAlgorithm] from the ordered set of acceptable algorithms.
*
* @param orderedPrefs hash algorithm preferences
* @return picked algorithms
*/
fun negotiateHashAlgorithm(orderedPrefs: Set<HashAlgorithm>): HashAlgorithm
companion object {
/**
* Return an instance that negotiates [HashAlgorithms][HashAlgorithm] used for
* non-revocation signatures based on the given [Policy].
*
* @param policy algorithm policy
* @return negotiator
*/
@JvmStatic
fun negotiateSignatureHashAlgorithm(policy: Policy): HashAlgorithmNegotiator {
return negotiateByPolicy(policy.dataSignatureHashAlgorithmPolicy)
}
/**
* Return an instance that negotiates [HashAlgorithms][HashAlgorithm] used for revocation
* signatures based on the given [Policy].
*
* @param policy algorithm policy
* @return negotiator
*/
@JvmStatic
fun negotiateRevocationSignatureAlgorithm(policy: Policy): HashAlgorithmNegotiator {
return negotiateByPolicy(policy.revocationSignatureHashAlgorithmPolicy)
}
/**
* Return an instance that negotiates [HashAlgorithms][HashAlgorithm] based on the given
* [Policy.HashAlgorithmPolicy].
*
* @param hashAlgorithmPolicy algorithm policy for hash algorithms
* @return negotiator
*/
@JvmStatic
fun negotiateByPolicy(
hashAlgorithmPolicy: Policy.HashAlgorithmPolicy
): HashAlgorithmNegotiator {
return object : HashAlgorithmNegotiator {
override fun negotiateHashAlgorithm(
orderedPrefs: Set<HashAlgorithm>
): HashAlgorithm {
return orderedPrefs.firstOrNull { hashAlgorithmPolicy.isAcceptable(it) }
?: hashAlgorithmPolicy.defaultHashAlgorithm()
}
}
}
}
}