in traffic_router/core/src/main/java/org/apache/traffic_control/traffic_router/core/dns/SignatureManager.java [325:387]
private List<DnsSecKeyPair> getKeyPairs(final Name name, final boolean wantKsk, final boolean wantSigningKey, final long maxTTL) throws IOException, NoSuchAlgorithmException {
final List<DnsSecKeyPair> keyPairs = keyMap.get(name.toString().toLowerCase());
DnsSecKeyPair signingKey = null;
if (keyPairs == null) {
return null;
}
final List<DnsSecKeyPair> keys = new ArrayList<DnsSecKeyPair>();
for (final DnsSecKeyPair kpw : keyPairs) {
final Name kn = kpw.getDNSKEYRecord().getName();
final boolean isKsk = kpw.isKeySigningKey();
if (kn.equals(name)) {
if ((isKsk && !wantKsk) || (!isKsk && wantKsk)) {
LOGGER.debug("Skipping key: wantKsk = " + wantKsk + "; key: " + kpw.toString());
continue;
} else if (!wantSigningKey && (isExpiredKeyAllowed() || kpw.isKeyCached(maxTTL))) {
LOGGER.debug("key selected: " + kpw.toString());
keys.add(kpw);
} else if (wantSigningKey) {
if (!kpw.isUsable()) { // effective date in the future
LOGGER.debug("Skipping unusable signing key: " + kpw.toString());
continue;
} else if (!isExpiredKeyAllowed() && kpw.isExpired()) {
LOGGER.warn("Unable to use expired signing key: " + kpw.toString());
continue;
}
// Locate the key with the earliest valid effective date accounting for expiration
if ((isKsk && wantKsk) || (!isKsk && !wantKsk)) {
if (signingKey == null) {
signingKey = kpw;
} else if (signingKey.isExpired() && !kpw.isExpired()) {
signingKey = kpw;
} else if (signingKey.isExpired() && kpw.isNewer(signingKey)) {
signingKey = kpw; // if we have an expired key, try to find the most recent
} else if (!signingKey.isExpired() && !kpw.isExpired() && kpw.isOlder(signingKey)) {
signingKey = kpw; // otherwise use the oldest valid/non-expired key
}
}
}
} else {
LOGGER.warn("Invalid key for " + name + "; it is intended for " + kpw.toString());
}
}
if (wantSigningKey && signingKey != null) {
if (signingKey.isExpired()) {
LOGGER.warn("Using expired signing key: " + signingKey.toString());
} else {
LOGGER.debug("Signing key selected: " + signingKey.toString());
}
keys.clear(); // in case we have something in here for some reason (shouldn't happen)
keys.add(signingKey);
} else if (wantSigningKey && signingKey == null) {
LOGGER.fatal("Unable to find signing key for " + name);
}
return keys;
}