/**
  * Signs the specified request.
  *
  * @param      $request
  * @param      $location
  * @param      $action
  * @param      $version
  * @param null $oneWay
  *
  * @return string Signed request.
  * @throws \Exception
  */
 protected function signRequest($request)
 {
     $doc = new \DOMDocument();
     $doc->loadXML($request);
     $wsse = new WSSESoap($doc);
     $wsse->addTimestamp();
     $key = new XMLSecurityKey(XMLSecurityKey::RSA_SHA1, array('type' => 'private'));
     if (!empty($this->options['passphrase'])) {
         $key->passphrase = $this->options['passphrase'];
     }
     $key->loadKey($this->getCertificateContent());
     $wsse->signSoapDoc($key);
     $token = $wsse->addBinaryToken($this->getCertificateContent());
     $wsse->attachTokentoSig($token);
     return $wsse->saveXML();
 }
Beispiel #2
0
 public function decryptSoapDoc($doc, $options)
 {
     $privKey = NULL;
     $privKey_isFile = FALSE;
     $privKey_isCert = FALSE;
     if (is_array($options)) {
         $privKey = !empty($options["keys"]["private"]["key"]) ? $options["keys"]["private"]["key"] : NULL;
         $privKey_isFile = !empty($options["keys"]["private"]["isFile"]) ? TRUE : FALSE;
         $privKey_isCert = !empty($options["keys"]["private"]["isCert"]) ? TRUE : FALSE;
     }
     $objenc = new XMLSecEnc();
     $xpath = new DOMXPath($doc);
     $envns = $doc->documentElement->namespaceURI;
     $xpath->registerNamespace("soapns", $envns);
     $xpath->registerNamespace("soapenc", "http://www.w3.org/2001/04/xmlenc#");
     $nodes = $xpath->query('/soapns:Envelope/soapns:Header/*[local-name()="Security"]/soapenc:EncryptedKey');
     $references = array();
     if ($node = $nodes->item(0)) {
         $objenc = new XMLSecEnc();
         $objenc->setNode($node);
         if (!($objKey = $objenc->locateKey())) {
             throw new Exception("Unable to locate algorithm for this Encrypted Key");
         }
         $objKey->isEncrypted = TRUE;
         $objKey->encryptedCtx = $objenc;
         XMLSecEnc::staticLocateKeyInfo($objKey, $node);
         if ($objKey && $objKey->isEncrypted) {
             $objencKey = $objKey->encryptedCtx;
             $objKey->loadKey($privKey, $privKey_isFile, $privKey_isCert);
             $key = $objencKey->decryptKey($objKey);
             $objKey->loadKey($key);
         }
         $refnodes = $xpath->query('./soapenc:ReferenceList/soapenc:DataReference/@URI', $node);
         foreach ($refnodes as $reference) {
             $references[] = $reference->nodeValue;
         }
     }
     foreach ($references as $reference) {
         $arUrl = parse_url($reference);
         $reference = $arUrl['fragment'];
         $query = '//*[@Id="' . $reference . '"]';
         $nodes = $xpath->query($query);
         $encData = $nodes->item(0);
         if ($algo = $xpath->evaluate("string(./soapenc:EncryptionMethod/@Algorithm)", $encData)) {
             $objKey = new XMLSecurityKey($algo);
             $objKey->loadKey($key);
         }
         $objenc->setNode($encData);
         $objenc->type = $encData->getAttribute("Type");
         $decrypt = $objenc->decryptNode($objKey, TRUE);
     }
     return TRUE;
 }