package org.apereo.cas.digest.util; import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.lang3.StringUtils; import org.apache.http.impl.auth.DigestScheme; import java.security.SecureRandom; import java.time.ZonedDateTime; /** * This is {@link DigestAuthenticationUtils}. * * @author Misagh Moayyed * @since 5.0.0 */ public final class DigestAuthenticationUtils { private DigestAuthenticationUtils() { } /** * Create nonce string. * * @return the nonce */ public static String createNonce() { final String fmtDate = ZonedDateTime.now().toString(); final SecureRandom rand = new SecureRandom(); final Integer randomInt = rand.nextInt(); return DigestUtils.md5Hex(fmtDate + randomInt); } /** * Create cnonce string. * * @return the cnonce */ public static String createCnonce() { return DigestScheme.createCnonce(); } /** * Create opaque. * * @param domain the domain * @param nonce the nonce * @return the opaque */ public static String createOpaque(final String domain, final String nonce) { return DigestUtils.md5Hex(domain + nonce); } /** * Create authenticate header, containing the realm, nonce, opaque, etc. * * @param realm the realm * @param authMethod the auth method * @param nonce the nonce * @return the header string */ public static String createAuthenticateHeader(final String realm, final String authMethod, final String nonce) { final StringBuilder stringBuilder = new StringBuilder("Digest realm=\"").append(realm).append("\","); if (StringUtils.isNotBlank(authMethod)) { stringBuilder.append("qop=").append(authMethod).append(','); } return stringBuilder.append("nonce=\"").append(nonce) .append("\",opaque=\"").append(createOpaque(realm, nonce)) .append('"') .toString(); } }