diff --git a/scala/ppml/src/main/scala/com/intel/analytics/bigdl/ppml/attestation/SGXDCAPQuoteVerifierImpl.scala b/scala/ppml/src/main/scala/com/intel/analytics/bigdl/ppml/attestation/SGXDCAPQuoteVerifierImpl.scala new file mode 100644 index 00000000000..5ba5beb70de --- /dev/null +++ b/scala/ppml/src/main/scala/com/intel/analytics/bigdl/ppml/attestation/SGXDCAPQuoteVerifierImpl.scala @@ -0,0 +1,43 @@ +/* + * Copyright 2016 The BigDL Authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.intel.analytics.bigdl.ppml.attestation + +import com.intel.analytics.bigdl.ppml.dcap.Attestation +import org.apache.logging.log4j.LogManager + +/** + * Verify SGX quote with SGX SDK + */ +class SGXDCAPQuoteVerifierImpl extends QuoteVerifier with Serializable { + val logger = LogManager.getLogger(getClass) + + @throws(classOf[AttestationRuntimeException]) + override def verifyQuote(quote: Array[Byte]): Int = { + + try { + val verifyQuoteResult = Attestation.sdkVerifyQuote(quote) + return verifyQuoteResult + } catch { + case e: Exception => + logger.error(s"Failed to verify quote, ${e}") + throw new AttestationRuntimeException("Failed " + + "to verify quote", e) + } + + throw new AttestationRuntimeException("Unexpected workflow when verifying Quote!") + } +} diff --git a/scala/ppml/src/test/scala/com/intel/analytics/bigdl/ppml/attestation/SGXDCAPQuoteVerifierImplSpec.scala b/scala/ppml/src/test/scala/com/intel/analytics/bigdl/ppml/attestation/SGXDCAPQuoteVerifierImplSpec.scala new file mode 100644 index 00000000000..6a097335d0e --- /dev/null +++ b/scala/ppml/src/test/scala/com/intel/analytics/bigdl/ppml/attestation/SGXDCAPQuoteVerifierImplSpec.scala @@ -0,0 +1,59 @@ +/* + * Copyright 2016 The BigDL Authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.intel.analytics.bigdl.ppml.attestation + +import com.intel.analytics.bigdl.dllib.common.zooUtils +import java.io.{BufferedOutputStream, BufferedInputStream}; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import org.apache.logging.log4j.LogManager +import org.scalatest.{FlatSpec, Matchers} +import scala.io.Source +import scala.language.postfixOps +import sys.env +import sys.process._ + +class SGXDCAPQuoteVerifierImplSpec extends FlatSpec with Matchers { + + val logger = LogManager.getLogger(getClass) + var tmpDir: File = _ + val sGXDCAPQuoteVerifierImplSpec = new SGXDCAPQuoteVerifierImpl() + + val quoteUrl = if (env.contains("FTP_URI")) { + env("FTP_URI").toString + } + + tmpDir = zooUtils.createTmpDir("ZooPPML").toFile() + val dir = new File(s"${tmpDir.getAbsolutePath}/SGXDCAPQuoteVerifierImplSpec").getCanonicalPath + s"wget -nv -P $dir $quoteUrl" !; + val quotePath = s"$dir/sgxdcap_quote.dat" + + // SGXDCAPQuoteVerifierImplSpec + "SGX DCAP verify Quote " should "work" in { + val quoteFile = new File(quotePath) + val in = new FileInputStream(quoteFile) + val bufIn = new BufferedInputStream(in) + val quote = Iterator.continually(bufIn.read()).takeWhile(_ != -1).map(_.toByte).toArray + bufIn.close() + in.close() + logger.info(quote) + val verifyQuoteResult = sGXDCAPQuoteVerifierImplSpec.verifyQuote(quote) + verifyQuoteResult shouldNot equal(-1) + logger.info(verifyQuoteResult) + } +}