From 3b70c26fa798a96238cf98e0f36194e51a7a089b Mon Sep 17 00:00:00 2001 From: Chris Rebert Date: Mon, 23 Jan 2017 15:41:14 -0800 Subject: Move HmacSha1 from util package to crypto package (#54) For more logical organization. HmacSha1 is used to verify the integrity and authenticity of requests from GitHub. --- .../com/getbootstrap/savage/crypto/HmacSha1.scala | 30 ++++++++++++++++++++++ .../savage/server/HubSignatureDirectives.scala | 3 ++- .../com/getbootstrap/savage/util/HmacSha1.scala | 29 --------------------- 3 files changed, 32 insertions(+), 30 deletions(-) create mode 100644 src/main/scala/com/getbootstrap/savage/crypto/HmacSha1.scala delete mode 100644 src/main/scala/com/getbootstrap/savage/util/HmacSha1.scala diff --git a/src/main/scala/com/getbootstrap/savage/crypto/HmacSha1.scala b/src/main/scala/com/getbootstrap/savage/crypto/HmacSha1.scala new file mode 100644 index 0000000..2af880b --- /dev/null +++ b/src/main/scala/com/getbootstrap/savage/crypto/HmacSha1.scala @@ -0,0 +1,30 @@ +package com.getbootstrap.savage.crypto + +import javax.crypto.Mac +import javax.crypto.spec.SecretKeySpec +import java.security.{NoSuchAlgorithmException, InvalidKeyException, SignatureException} +import java.security.MessageDigest +import com.getbootstrap.savage.util.HexByteArray + +object HmacSha1 { + private val HmacSha1Algorithm = "HmacSHA1" +} + +case class HmacSha1(mac: Array[Byte], secretKey: Array[Byte], data: Array[Byte]) { + import HmacSha1.HmacSha1Algorithm + + @throws[NoSuchAlgorithmException]("if HMAC-SHA1 is not supported") + @throws[InvalidKeyException]("if the secret key is malformed") + @throws[SignatureException]("under unknown circumstances") + private lazy val correct: Array[Byte] = { + val key = new SecretKeySpec(secretKey, HmacSha1Algorithm) + val mac = Mac.getInstance(HmacSha1Algorithm) + mac.init(key) + mac.doFinal(data) + } + + lazy val isValid: Boolean = MessageDigest.isEqual(mac, correct) + + def givenHex = mac.asHexBytes + def correctHex = correct.asHexBytes +} diff --git a/src/main/scala/com/getbootstrap/savage/server/HubSignatureDirectives.scala b/src/main/scala/com/getbootstrap/savage/server/HubSignatureDirectives.scala index a0d4153..0308757 100644 --- a/src/main/scala/com/getbootstrap/savage/server/HubSignatureDirectives.scala +++ b/src/main/scala/com/getbootstrap/savage/server/HubSignatureDirectives.scala @@ -3,7 +3,8 @@ package com.getbootstrap.savage.server import scala.util.{Try,Success,Failure} import spray.routing.{Directive1, MalformedHeaderRejection, MalformedRequestContentRejection, ValidationRejection} import spray.routing.directives.{BasicDirectives, HeaderDirectives, RouteDirectives, MarshallingDirectives} -import com.getbootstrap.savage.util.{HmacSha1,Utf8ByteArray} +import com.getbootstrap.savage.crypto.HmacSha1 +import com.getbootstrap.savage.util.Utf8ByteArray trait HubSignatureDirectives { import BasicDirectives.provide diff --git a/src/main/scala/com/getbootstrap/savage/util/HmacSha1.scala b/src/main/scala/com/getbootstrap/savage/util/HmacSha1.scala deleted file mode 100644 index 93340ac..0000000 --- a/src/main/scala/com/getbootstrap/savage/util/HmacSha1.scala +++ /dev/null @@ -1,29 +0,0 @@ -package com.getbootstrap.savage.util - -import javax.crypto.Mac -import javax.crypto.spec.SecretKeySpec -import java.security.{NoSuchAlgorithmException, InvalidKeyException, SignatureException} -import java.security.MessageDigest - -object HmacSha1 { - private val HmacSha1Algorithm = "HmacSHA1" -} - -case class HmacSha1(mac: Array[Byte], secretKey: Array[Byte], data: Array[Byte]) { - import HmacSha1.HmacSha1Algorithm - - @throws[NoSuchAlgorithmException]("if HMAC-SHA1 is not supported") - @throws[InvalidKeyException]("if the secret key is malformed") - @throws[SignatureException]("under unknown circumstances") - private lazy val correct: Array[Byte] = { - val key = new SecretKeySpec(secretKey, HmacSha1Algorithm) - val mac = Mac.getInstance(HmacSha1Algorithm) - mac.init(key) - mac.doFinal(data) - } - - lazy val isValid: Boolean = MessageDigest.isEqual(mac, correct) - - def givenHex = mac.asHexBytes - def correctHex = correct.asHexBytes -} -- cgit v1.2.3