pgpainless/pgpainless-core/src/main/kotlin/org/pgpainless/key/_64DigitFingerprint.kt

75 lines
2.2 KiB
Kotlin

// SPDX-FileCopyrightText: 2023 Paul Schaub <vanitasvitae@fsfe.org>
//
// SPDX-License-Identifier: Apache-2.0
package org.pgpainless.key
import java.nio.Buffer
import java.nio.ByteBuffer
import java.nio.charset.Charset
import org.bouncycastle.openpgp.PGPKeyRing
import org.bouncycastle.openpgp.PGPPublicKey
import org.bouncycastle.openpgp.PGPSecretKey
import org.bouncycastle.util.encoders.Hex
/**
* This class represents a hex encoded, upper case OpenPGP v5 or v6 fingerprint. Since both
* fingerprints use the same format, this class is used when parsing the fingerprint without knowing
* the key version.
*/
open class _64DigitFingerprint : OpenPgpFingerprint {
/**
* Create an {@link _64DigitFingerprint}.
*
* @param fingerprint uppercase hexadecimal fingerprint of length 64
*/
constructor(fingerprint: String) : super(fingerprint)
constructor(bytes: ByteArray) : super(bytes)
constructor(key: PGPPublicKey) : super(key)
constructor(key: PGPSecretKey) : super(key)
constructor(keys: PGPKeyRing) : super(keys)
override val keyId: Long
get() {
val bytes = Hex.decode(fingerprint.toByteArray(Charset.forName("UTF-8")))
val buf = ByteBuffer.wrap(bytes)
// The key id is the left-most 8 bytes (conveniently a long).
// We have to cast here in order to be compatible with java 8
// https://github.com/eclipse/jetty.project/issues/3244
(buf as Buffer).position(0)
return buf.getLong()
}
override fun getVersion(): Int {
return -1 // might be v5 or v6
}
override fun isValid(fingerprint: String): Boolean {
return fingerprint.matches(("^[0-9A-F]{64}$".toRegex()))
}
override fun toString(): String {
return super.toString()
}
override fun prettyPrint(): String {
return buildString {
for (i in 0 until 4) {
append(fingerprint, i * 8, (i + 1) * 8).append(' ')
}
append(' ')
for (i in 4 until 7) {
append(fingerprint, i * 8, (i + 1) * 8).append(' ')
}
append(fingerprint, 56, 64)
}
}
}