|
1 | 1 | package org.bouncycastle.bcpg;
|
2 | 2 |
|
3 | 3 | import org.bouncycastle.util.Pack;
|
| 4 | +import org.bouncycastle.util.encoders.Hex; |
4 | 5 |
|
5 | 6 | public class FingerprintUtil
|
6 | 7 | {
|
7 | 8 |
|
| 9 | + /** |
| 10 | + * Derive a key-id from the given key fingerprint. |
| 11 | + * This method can derive key-ids from v4, v5 (LibrePGP) and v6 keys. |
| 12 | + * For keys with other versions (2,3) it will return 0. |
| 13 | + * |
| 14 | + * @param keyVersion version of the key |
| 15 | + * @param fingerprint fingerprint of the key |
| 16 | + * @return derived key-id |
| 17 | + */ |
| 18 | + public static long keyIdFromFingerprint(int keyVersion, byte[] fingerprint) |
| 19 | + { |
| 20 | + switch (keyVersion) |
| 21 | + { |
| 22 | + case PublicKeyPacket.VERSION_4: |
| 23 | + return keyIdFromV4Fingerprint(fingerprint); |
| 24 | + case PublicKeyPacket.LIBREPGP_5: |
| 25 | + return keyIdFromLibrePgpFingerprint(fingerprint); |
| 26 | + case PublicKeyPacket.VERSION_6: |
| 27 | + return keyIdFromV6Fingerprint(fingerprint); |
| 28 | + default: |
| 29 | + return 0; |
| 30 | + } |
| 31 | + } |
| 32 | + |
8 | 33 | /**
|
9 | 34 | * Derive a 64 bit key-id from a version 6 OpenPGP fingerprint.
|
10 | 35 | * For v6 keys, the key-id corresponds to the left-most 8 octets of the fingerprint.
|
@@ -112,4 +137,55 @@ public static void writeKeyID(long keyID, byte[] bytes)
|
112 | 137 | {
|
113 | 138 | writeKeyID(keyID, bytes, 0);
|
114 | 139 | }
|
| 140 | + |
| 141 | + public static String prettifyFingerprint(byte[] fingerprint) |
| 142 | + { |
| 143 | + // -DM Hex.toHexString |
| 144 | + String hex = Hex.toHexString(fingerprint).toUpperCase(); |
| 145 | + StringBuilder sb = new StringBuilder(); |
| 146 | + switch (hex.length()) |
| 147 | + { |
| 148 | + case 32: |
| 149 | + // v3 keys |
| 150 | + for (int i = 0; i < 4; i++) |
| 151 | + { |
| 152 | + sb.append(hex, i * 4, (i + 1) * 4).append(' '); |
| 153 | + } |
| 154 | + sb.append(' '); |
| 155 | + for (int i = 4; i < 7; i++) |
| 156 | + { |
| 157 | + sb.append(hex, i * 4, (i + 1) * 4).append(' '); |
| 158 | + } |
| 159 | + sb.append(hex, 28, 32); |
| 160 | + return sb.toString(); |
| 161 | + case 40: |
| 162 | + // v4 keys |
| 163 | + for (int i = 0; i <= 4; i++) |
| 164 | + { |
| 165 | + sb.append(hex, i * 4, (i + 1) * 4).append(' '); |
| 166 | + } |
| 167 | + sb.append(' '); |
| 168 | + for (int i = 5; i <= 8; i++) |
| 169 | + { |
| 170 | + sb.append(hex, i * 4, (i + 1) * 4).append(' '); |
| 171 | + } |
| 172 | + sb.append(hex, 36, 40); |
| 173 | + return sb.toString(); |
| 174 | + case 64: |
| 175 | + // v5, v6 keys |
| 176 | + for (int i = 0; i < 4; i++) |
| 177 | + { |
| 178 | + sb.append(hex, i * 8, (i + 1) * 8).append(' '); |
| 179 | + } |
| 180 | + sb.append(' '); |
| 181 | + for (int i = 4; i < 7; i++) |
| 182 | + { |
| 183 | + sb.append(hex, i * 8, (i + 1) * 8).append(' '); |
| 184 | + } |
| 185 | + sb.append(hex, 56, 64); |
| 186 | + return sb.toString(); |
| 187 | + default: |
| 188 | + return hex; |
| 189 | + } |
| 190 | + } |
115 | 191 | }
|
0 commit comments