package io.cattle.platform.register.util; import io.cattle.platform.archaius.util.ArchaiusUtil; import java.io.UnsupportedEncodingException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.util.Calendar; import java.util.Date; import java.util.TimeZone; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import org.apache.commons.codec.binary.Base64; import com.netflix.config.DynamicLongProperty; public class RegistrationToken { public static final String HMAC_SHA1_ALGORITHM = "HmacSHA1"; private static final DynamicLongProperty TOKEN_PERIOD = ArchaiusUtil.getLong("registration.token.period.millis"); public static long getAllowedTime() { return TOKEN_PERIOD.get(); } public static final String createToken(String accessKey, String secretKey) { Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC")); cal.set(Calendar.HOUR_OF_DAY, 0); cal.set(Calendar.MINUTE, 0); cal.set(Calendar.SECOND, 0); cal.set(Calendar.MILLISECOND, 0); cal.set(Calendar.DAY_OF_YEAR, 0); return createToken(accessKey, secretKey, cal.getTime()); } public static final String createToken(String accessKey, String secretKey, Date date) { String prefix = String.format("%s:%d", accessKey, date.getTime()); try { SecretKeySpec signingKey = new SecretKeySpec(secretKey.getBytes("UTF-8"), HMAC_SHA1_ALGORITHM); Mac mac = Mac.getInstance(HMAC_SHA1_ALGORITHM); mac.init(signingKey); String signature = Base64.encodeBase64String(mac.doFinal(prefix.getBytes("UTF-8"))).replaceAll("[/=+]", ""); return String.format("%s:%s", prefix, signature); } catch (InvalidKeyException e) { throw new IllegalStateException("Failed to generate signature key for [" + prefix + "]", e); } catch (NoSuchAlgorithmException e) { throw new IllegalStateException("Failed to generate signature key for [" + prefix + "]", e); } catch (UnsupportedEncodingException e) { throw new IllegalStateException("Failed to generate signature key for [" + prefix + "]", e); } } }