Author: bblfish
Date: Wed Nov 10 21:40:59 2010
New Revision: 1033729
URL: http://svn.apache.org/viewvc?rev=1033729&view=rev
Log:
Just made cert:hex verification faster. Mow also verify certificate validity
Modified:
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.security.foafssl/core/src/main/scala/org/apache/clerezza/foafssl/ssl/Activator.scala
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.security.foafssl/core/src/main/scala/org/apache/clerezza/foafssl/ssl/X509TrustManagerWrapperService.scala
Modified:
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.security.foafssl/core/src/main/scala/org/apache/clerezza/foafssl/ssl/Activator.scala
URL:
http://svn.apache.org/viewvc/incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.security.foafssl/core/src/main/scala/org/apache/clerezza/foafssl/ssl/Activator.scala?rev=1033729&r1=1033728&r2=1033729&view=diff
==============================================================================
---
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.security.foafssl/core/src/main/scala/org/apache/clerezza/foafssl/ssl/Activator.scala
(original)
+++
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.security.foafssl/core/src/main/scala/org/apache/clerezza/foafssl/ssl/Activator.scala
Wed Nov 10 21:40:59 2010
@@ -90,6 +90,7 @@ class Activator() {
new File(new File(System.getProperty("user.home")),
".keystore").getAbsolutePath
}
}
+
protected def getKeyStorePassword(context: BundleContext) = {
val property =
context.getProperty(ServiceActivator.CONTEXT_PROPERTY_KEYSTORE_PASSWORD);
if (property != null) {
Modified:
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.security.foafssl/core/src/main/scala/org/apache/clerezza/foafssl/ssl/X509TrustManagerWrapperService.scala
URL:
http://svn.apache.org/viewvc/incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.security.foafssl/core/src/main/scala/org/apache/clerezza/foafssl/ssl/X509TrustManagerWrapperService.scala?rev=1033729&r1=1033728&r2=1033729&view=diff
==============================================================================
---
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.security.foafssl/core/src/main/scala/org/apache/clerezza/foafssl/ssl/X509TrustManagerWrapperService.scala
(original)
+++
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.security.foafssl/core/src/main/scala/org/apache/clerezza/foafssl/ssl/X509TrustManagerWrapperService.scala
Wed Nov 10 21:40:59 2010
@@ -23,8 +23,11 @@ import java.io.ByteArrayOutputStream
import java.math.BigInteger
import java.security.PublicKey
import java.security.cert.CertificateException
+import java.security.cert.CertificateExpiredException
+import java.security.cert.CertificateNotYetValidException
import java.security.cert.X509Certificate
import java.security.interfaces.RSAPublicKey
+import java.util.Date
import javax.net.ssl.X509TrustManager;
import org.apache.clerezza.foafssl.Utilities
import org.apache.clerezza.platform.users.WebDescriptionProvider
@@ -86,7 +89,13 @@ class X509TrustManagerWrapperService() e
if (webIdUriRefs.length == 0) {
trustManager.checkClientTrusted(chain,
authType)
} else {
- val publicKey = chain(0).getPublicKey
+ val cert0 = chain(0)
+ val now = new Date();
+ if (now.after(cert0.getNotAfter()))
+ throw new
CertificateExpiredException(String.format("The certificate expires after %c .
It is now %c . ", now, cert0.getNotAfter));
+ if (now.before(cert0.getNotBefore()))
+ throw new
CertificateNotYetValidException(String.format("The certificate is not valid
before %c. It is now %c .", now, cert0.getNotBefore));
+ val publicKey = cert0.getPublicKey
for (uriRef <- webIdUriRefs) {
verify(uriRef, publicKey)
}
@@ -102,38 +111,38 @@ class X509TrustManagerWrapperService() e
var webDescription =
descriptionProvider.getWebDescription(uriRef, false)
if (
!verify(uriRef, publicKey, webDescription.getGraph)
- ) {
- webDescription =
descriptionProvider.getWebDescription(uriRef, true)
- if (
- !verify(uriRef, publicKey,
webDescription.getGraph)
- ) throw new CertificateException
- }
-
systemGraph.addAll(createSystemUserDescription(webDescription))
+ ) {
+ webDescription =
descriptionProvider.getWebDescription(uriRef, true)
+ if (
+ !verify(uriRef, publicKey,
webDescription.getGraph)
+ ) throw new CertificateException
+ }
+ systemGraph.addAll(createSystemUserDescription(webDescription))
}
def createSystemUserDescription(webDescription: GraphNode) = {
val result = new SimpleMGraph()
val webId = webDescription.getNode.asInstanceOf[UriRef]
result.add(new TripleImpl(webId, PLATFORM.userName,
-
new
PlainLiteralImpl(Utilities.cretateUsernameForWebId(webId))))
+ new
PlainLiteralImpl(Utilities.cretateUsernameForWebId(webId))))
result.add(new TripleImpl(webId, RDF.`type` ,
-
FOAF.Agent))
+ FOAF.Agent))
result
}
/*private lazy val selectQuery = {
- val query = """PREFIX cert: <http://www.w3.org/ns/auth/cert#>
- PREFIX rsa: <http://www.w3.org/ns/auth/rsa#>
- SELECT ?m ?e ?mod ?exp
- WHERE {
- [] cert:identity ?webid ;
- rsa:modulus ?m ;
- rsa:public_exponent ?e .
- OPTIONAL { ?m cert:hex ?mod . }
- OPTIONAL { ?e cert:decimal ?exp . }
- }"""
- queryParser.parse(query).asInstanceOf[SelectQuery]
- }*/
+ val query = """PREFIX cert: <http://www.w3.org/ns/auth/cert#>
+ PREFIX rsa: <http://www.w3.org/ns/auth/rsa#>
+ SELECT ?m ?e ?mod ?exp
+ WHERE {
+ [] cert:identity ?webid ;
+ rsa:modulus ?m ;
+ rsa:public_exponent ?e .
+ OPTIONAL { ?m cert:hex ?mod . }
+ OPTIONAL { ?e cert:decimal ?exp . }
+ }"""
+ queryParser.parse(query).asInstanceOf[SelectQuery]
+ }*/
/**
* gets the parts of key from rdf
* @return (mod, exp)
@@ -144,19 +153,19 @@ class X509TrustManagerWrapperService() e
t.getSubject
}
(for (p <- publicKeys) yield {
- val node = new GraphNode(p, tc)
- val modulusRes = node/RSA.modulus
- val modulus = intValueOfResource(modulusRes) match {
- case Some(x) => x
- case _ => BigInt(0)
- }
- val exponentRes = node/RSA.public_exponent
- val exponent = intValueOfResource(exponentRes) match {
- case Some(x) => x
- case _ => BigInt(0)
- }
- (modulus, exponent)
- }).toArray
+ val node = new GraphNode(p, tc)
+ val modulusRes = node/RSA.modulus
+ val modulus = intValueOfResource(modulusRes)
match {
+ case Some(x) => x
+ case _ => BigInt(0)
+ }
+ val exponentRes = node/RSA.public_exponent
+ val exponent = intValueOfResource(exponentRes)
match {
+ case Some(x) => x
+ case _ => BigInt(0)
+ }
+ (modulus, exponent)
+ }).toArray
}
@@ -164,12 +173,12 @@ class X509TrustManagerWrapperService() e
/**
* @return true if the key could be verified
*/
- private def verify(webId: UriRef, publicKey: PublicKey, tc:
TripleCollection): Boolean = {
- publicKey match {
- case k: RSAPublicKey => verify(webId, k, tc);
- case _ => throw new
CertificateException("Unsupported key format")
- }
+ private def verify(webId: UriRef, publicKey: PublicKey, tc:
TripleCollection): Boolean = {
+ publicKey match {
+ case k: RSAPublicKey => verify(webId, k, tc);
+ case _ => throw new CertificateException("Unsupported
key format")
}
+ }
private def verify(webId: UriRef, publicKey: RSAPublicKey, tc:
TripleCollection): Boolean = {
val publicKeysInGraph = getPublicKeysInGraph(webId, tc)
@@ -179,10 +188,10 @@ class X509TrustManagerWrapperService() e
if (!result) {
val baos = new ByteArrayOutputStream
Serializer.getInstance.serialize(baos, tc,
SupportedFormat.TURTLE);
- logger.debug("no mathing key in: \n{}", new
String(baos.toByteArray));
+ logger.debug("no matching key in: \n{}", new
String(baos.toByteArray));
logger.debug("the public key is not among the "+
- publicKeysInGraph.size+" keys in the
profile graph of size "+
- tc.size)
+
publicKeysInGraph.size+" keys in the profile graph of size "+
+ tc.size)
logger.debug("PublicKey: "+publicKeyTuple)
publicKeysInGraph.foreach(k =>
logger.debug("PublikKey in graph: "+ k))
}
@@ -190,11 +199,11 @@ class X509TrustManagerWrapperService() e
result
}
- /**
- * @return the integer value if r is a typedLiteral of cert:hex or
cert:decimal,
- * otherwise the integer value of the cert:hex or cert:decimal
property of r or
- * None if no such value available
- */
+ /**
+ * @return the integer value if r is a typedLiteral of cert:hex or
cert:decimal,
+ * otherwise the integer value of the cert:hex or cert:decimal
property of r or
+ * None if no such value available
+ */
private def intValueOfResource(n: GraphNode): Option[BigInt] = {
n! match {
case l: TypedLiteral => intValueOfTypedLiteral(l);
@@ -240,8 +249,8 @@ class X509TrustManagerWrapperService() e
private def intValueOfHexString(s: String): BigInt = {
val strval = cleanHex(s);
- BigInt(strval, 16);
- }
+ BigInt(strval, 16);
+ }
@@ -255,12 +264,12 @@ class X509TrustManagerWrapperService() e
*/
private def cleanHex( strval: String) = {
- def legal(c: Char) = {
- ((c >= 'a') && (c <= 'f')) ||
- ((c >= 'A') && (c <= 'F')) ||
- ((c >= '0') && (c <= '9'))
- }
+ def legal(c: Char) = { //in order of likelyhood of appearance
+ ((c >= '0') && (c <= '9')) ||
+ ((c >= 'A') && (c <= 'F')) ||
+ ((c >= 'a') && (c <= 'f'))
+ }
(for (c <- strval; if legal(c)) yield c)
}
- }
+}
\ No newline at end of file