Working prototype for search
authorkristianf <devnull@localhost>
Mon, 1 Dec 2014 20:39:06 +0000 (21:39 +0100)
committerkristianf <devnull@localhost>
Mon, 1 Dec 2014 20:39:06 +0000 (21:39 +0100)
hkp_search.php [new file with mode: 0755]
pgp-keyserver.schema [new file with mode: 0644]

diff --git a/hkp_search.php b/hkp_search.php
new file mode 100755 (executable)
index 0000000..23097f0
--- /dev/null
@@ -0,0 +1,127 @@
+#!/usr/bin/php
+<?php
+ini_set("date.timezone", "Europe/Oslo"); 
+$stdin = fopen('php://stdin', 'r');
+$str = stream_get_contents($stdin);
+$in = preg_split("/\n/", $str);
+
+$data[] = array();
+
+
+class hkp
+{
+       private $hkp_host = "192.168.0.33";
+       private $hkp_port = "11371";
+
+       public function epoch2ldap($epoch)
+       {
+               return  date("YmdHis", $epoch)."Z"; 
+       }
+
+       public function vindex($search)
+       {
+
+               $url = "http://{$this->hkp_host}:{$this->hkp_port}/pks/lookup?op=vindex&options=mr&search={$search}";
+               $f = file_get_contents($url);
+               return $f;
+       }
+
+       public function map_algoid_to_type($algoid)
+       {
+               switch($algoid)
+               {
+                       case "1":
+                               return "RSA";
+                       case "17":
+                               return "DSA";
+                       case "19":
+                               return "ECC";
+               }
+       }
+
+       public function print_pgp_key($search)
+       {
+               $vindex = $this->vindex($search);
+               $vindex_array = explode("\n", $vindex);
+               foreach($vindex_array as $line)
+               {
+                       $col = explode(":", $line);
+                       if($col[0] == "pub")
+                       {
+                               echo "\n";      
+                               echo "dn: ou=PGP Keys,dc=sumptuouscapital,dc=com\n"; 
+                               echo "objectClass: pgpKeyInfo\n";
+                               echo "pgpCertID: ${col[1]}\n";
+                               echo "pgpKeyType: ".$this->map_algoid_to_type($col[2])."\n";
+                               echo "pgpKeySize: {$col[3]}\n";
+                               echo "pgpKeyCreateTime: ".$this->epoch2ldap($col[4])."\n";
+                               echo "pgpKeyExpireTime: ".$this->epoch2ldap($col[5])."\n";
+                               echo "pgpKey: sss\n";
+                       }
+                       else if($col[0] == "uid")
+                       {
+                               echo "pgpUserID: {$col[1]}\n";
+                       }
+               }
+       }
+}
+
+function printServerInfo($base)
+{
+       echo "dn: cn=pgpServerInfo,ou=PGP Keys,dc=sumptuouscapital,dc=com\n"; 
+       echo "cn: pgpServerInfo\n";
+       echo "objectClass: pgpServerInfo\n";
+       echo "pgpSoftware: OpenLDAP slapd\n";
+       echo "pgpVersion: 2.1.23.8\n";
+       echo "pgpBaseKeySpaceDN: ou=PGP Keys,dc=sumptuouscapital,dc=com\n";
+       echo "\n";
+       echo "RESULT\n";
+}
+
+function printPgpKey($filter)
+{
+       $filter = preg_match("/\(pgpUserID=\*?(.+?)\*?\)/", $filter, $matches); 
+       if(count($matches) > 1)
+       {
+               $search = $matches[1];
+               $hkp = new hkp;         
+               $hkp->print_pgp_key($search);
+               echo "\n"; 
+               echo "RESULT\n";
+       }
+       else
+       {
+               echo "DEBUG: No matches found";
+               exit(1); 
+       }
+}
+
+foreach($in as $line)
+{
+       $l = preg_split("/:/", $line);
+       if(count($l)>1)
+               $data[$l[0]] = trim($l[1]);
+       else
+               $data[] = trim($line);
+}
+
+//var_dump($data);
+
+if(isset($data['base']))
+{
+       $base = preg_split("/,/", $data['base']);
+//     var_dump($base);
+       if(in_array("cn=pgpServerInfo", $base))
+               printServerInfo($base);
+       else if(in_array("ou=PGP Keys", $base))
+               printPgpKey($data['filter']);
+}
+else
+{
+       echo "DEBUG: no base";
+       exit(1); 
+}
+
+file_put_contents("/var/tmp/ldaptest.txt", $str);
+fclose($stdin);
+?>
diff --git a/pgp-keyserver.schema b/pgp-keyserver.schema
new file mode 100644 (file)
index 0000000..358a227
--- /dev/null
@@ -0,0 +1,142 @@
+###############################################################################
+#                                                                       
+#      PGP Keyserver schema for OpenLDAP                                 
+#      Copyright 2001, 2002, 2003 PGP Corporation
+#      All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+# 
+# Redistributions of source code must retain the above copyright notice, this
+# list of conditions and the following disclaimer. 
+# 
+# Redistributions in binary form must reproduce the above copyright notice,
+# this list of conditions and the following disclaimer in the documentation
+# and/or other materials provided with the distribution. 
+# 
+# Neither the name of PGP Corporation nor its trademarks nor the names of its
+# contributors may be used to endorse or promote products containing this
+# software without specific prior written permission. 
+# 
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY, TITLE, NONINFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
+# 
+# IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+###############################################################################
+
+
+attributeType ( 1.3.6.1.4.1.3401.8.2.8 NAME 'pgpBaseKeySpaceDN'
+    DESC 'Points to DN of the object that will store the PGP keys.'
+    SYNTAX 1.3.6.1.4.1.1466.115.121.1.12
+    SINGLE-VALUE 
+    X-ORIGIN 'Pretty Good Privacy (PGP)' )
+attributeType ( 1.3.6.1.4.1.3401.8.2.9 NAME 'pgpSoftware' 
+    DESC 'pgpSoftware attribute for PGP' 
+    SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 
+    SINGLE-VALUE 
+    X-ORIGIN 'Pretty Good Privacy (PGP)' )
+attributeType ( 1.3.6.1.4.1.3401.8.2.10 NAME 'pgpVersion' 
+    DESC 'pgpVersion attribute for PGP' 
+    SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 
+    SINGLE-VALUE 
+    X-ORIGIN 'Pretty Good Privacy (PGP)' )
+attributeType ( 1.3.6.1.4.1.3401.8.2.11 NAME 'pgpKey' 
+    DESC 'pgpKey attribute for PGP' 
+    SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 
+    SINGLE-VALUE 
+    X-ORIGIN 'Pretty Good Privacy (PGP)' )
+attributeType ( 1.3.6.1.4.1.3401.8.2.12 NAME 'pgpCertID' 
+    DESC 'pgpCertID attribute for PGP' 
+       EQUALITY caseIgnoreMatch
+       SUBSTR caseIgnoreSubstringsMatch
+    SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 
+    SINGLE-VALUE 
+    X-ORIGIN 'Pretty Good Privacy (PGP)' )
+attributeType ( 1.3.6.1.4.1.3401.8.2.13 NAME 'pgpDisabled' 
+    DESC 'pgpDisabled attribute for PGP' 
+       EQUALITY caseIgnoreMatch
+    SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 
+    SINGLE-VALUE 
+    X-ORIGIN 'Pretty Good Privacy (PGP)' )
+attributeType ( 1.3.6.1.4.1.3401.8.2.14 NAME 'pgpKeyID' 
+    DESC 'pgpKeyID attribute for PGP' 
+       EQUALITY caseIgnoreMatch
+       SUBSTR caseIgnoreSubstringsMatch
+    SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 
+    SINGLE-VALUE 
+    X-ORIGIN 'Pretty Good Privacy (PGP)' )
+attributeType ( 1.3.6.1.4.1.3401.8.2.15 NAME 'pgpKeyType' 
+    DESC 'pgpKeyType attribute for PGP' 
+       EQUALITY caseIgnoreMatch
+       SUBSTR caseIgnoreSubstringsMatch
+    SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 
+    SINGLE-VALUE 
+    X-ORIGIN 'Pretty Good Privacy (PGP)' )
+attributeType ( 1.3.6.1.4.1.3401.8.2.16 NAME 'pgpUserID' 
+    DESC 'User ID(s) associated with the PGP key.' 
+       EQUALITY caseIgnoreMatch
+       SUBSTR caseIgnoreSubstringsMatch
+    SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 
+    X-ORIGIN 'Pretty Good Privacy (PGP)' )
+attributeType ( 1.3.6.1.4.1.3401.8.2.17 NAME 'pgpKeyCreateTime' 
+    DESC 'pgpKeyCreateTime attribute for PGP' 
+       EQUALITY caseIgnoreMatch
+    ORDERING caseIgnoreOrderingMatch
+       SUBSTR caseIgnoreSubstringsMatch
+    SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 
+    SINGLE-VALUE 
+    X-ORIGIN 'Pretty Good Privacy (PGP)' )
+attributeType ( 1.3.6.1.4.1.3401.8.2.18 NAME 'pgpSignerID' 
+    DESC 'pgpSignerID attribute for PGP' 
+       EQUALITY caseIgnoreMatch
+       SUBSTR caseIgnoreSubstringsMatch
+    SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 
+    X-ORIGIN 'Pretty Good Privacy (PGP)' )
+attributeType ( 1.3.6.1.4.1.3401.8.2.19 NAME 'pgpRevoked' 
+    DESC 'pgpRevoked attribute for PGP' 
+       EQUALITY caseIgnoreMatch
+    SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 
+    SINGLE-VALUE 
+    X-ORIGIN 'Pretty Good Privacy (PGP)' )
+attributeType ( 1.3.6.1.4.1.3401.8.2.20 NAME 'pgpSubKeyID' 
+    DESC 'Sub-key ID(s) of the PGP key.' 
+       EQUALITY caseIgnoreMatch
+    SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 
+       SUBSTR caseIgnoreSubstringsMatch
+    X-ORIGIN 'Pretty Good Privacy (PGP)' )
+attributeType ( 1.3.6.1.4.1.3401.8.2.21 NAME 'pgpKeySize' 
+    DESC 'pgpKeySize attribute for PGP' 
+       EQUALITY caseIgnoreMatch
+    ORDERING caseIgnoreOrderingMatch
+       SUBSTR caseIgnoreSubstringsMatch
+    SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 
+    X-ORIGIN 'Pretty Good Privacy (PGP)' )
+attributeType ( 1.3.6.1.4.1.3401.8.2.22 NAME 'pgpKeyExpireTime' 
+    DESC 'pgpKeyExpireTime attribute for PGP' 
+       EQUALITY caseIgnoreMatch
+    ORDERING caseIgnoreOrderingMatch
+       SUBSTR caseIgnoreSubstringsMatch
+    SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 
+    SINGLE-VALUE 
+    X-ORIGIN 'Pretty Good Privacy (PGP)' )
+
+objectClass ( 1.3.6.1.4.1.3401.8.2.23 NAME 'pgpServerInfo' 
+    DESC 'PGP defined objectclass to maintain information about PGP key space store' 
+    SUP top
+    MUST ( cn $ pgpBaseKeySpaceDN ) 
+    MAY ( pgpSoftware $ pgpVersion )
+    X-ORIGIN 'Pretty Good Privacy (PGP)' )
+objectClass ( 1.3.6.1.4.1.3401.8.2.24 NAME 'pgpKeyInfo' 
+    DESC 'PGP defined objectclass to maintain information about a PGP key' 
+    SUP top 
+    MUST ( pgpCertID $ pgpKey ) 
+    MAY ( pgpDisabled $ pgpKeyID $ pgpKeyType $ pgpUserID $ pgpKeyCreateTime $ pgpSignerID $ pgpRevoked $ pgpSubKeyID $ pgpKeySize $ pgpKeyExpireTime ) 
+    X-ORIGIN 'Pretty Good Privacy (PGP)' )