XML Security - приглашаются желающие к тестированию и обсуждению API

Alexandre

PHPПенсионер
XML Security - приглашаются желающие к тестированию и обсуждению API

Коллеги,

желающие внести вклад в OpenSource и имеющие время приглашаются к тестированию beta версии расширения php_xmlsec

Что это из себя представляет, можно подчерпнуть из презентации http://edocs.phpclub.net/xmlsec/frame.htm или одним файлом http://edocs.phpclub.net/xmlsec.ppt

Сам модуль можно скачать http://edocs.phpclub.net/xmlsec/xmlsec.zip
в директории examples - примеры использования.

Инсталляция - предварительно необходимо установить библиотеку libxmlsec http://aleksey.com/xmlsec/
переписываем директорию xmlsec в ext
далее в директории xmlsec запускаем make
В директории modules скомпилируется so модуль, который можно перенести где находятся все экстеншены и подцепить в php.ini. Лично я конфигурацию не трогаю и загружаю dl.

Особенно приветствуются предложения по созданию API, как удобнее.
Готов ответить на любые вопросы.

-~{}~ 31.08.06 10:42:

новые идеи по API выложены тут http://edocs.phpclub.net/xmlsec/index.htm

если есть предложения - пишите в форум

-~{}~ 12.09.06 11:36:

I see the new view of the php_xmlsec API.
I make the simplification of the API. I exclude the class Template and dive the class XmlSecDoc to two classes
- XmlSecEncryptor()
- XmlSecDSigner()

The xmlsec template will generate by new method ( $doc->generateTemplate or $doc->prepare it is more of like ) or load extern template by method $doc->loadTemplate();

If template will generate by "prepare" method, API will use the ini from constructor:

$doc = new XmlSecEncryprot( array(
'KeyName' => 'Alexandre',
'KeyEncAlgorithm' = 'XMLSEC_OAEM',
'TransformAlgorithm'= 'XMLSEC_c14n',
));

So, You can load any template by $doc->loadTemplate() method;

I think, that the "prepare" method may be private and we have the rule: if don't call the "TemplateLoad" method before call the "encrypt" method, we call the "prepere" method.
The next example new API:
PHP:
// create Encryptor class
$xmlSecIni = array( 
	'KeyName' => 'Alexandre',
	'KeyEncAlgorithm' = 'XMLSEC_OAEM',
	'TransformAlgorithm'= 'XMLSEC_c14n',
		);
$doc = new XmlSecEncryptor($xmlSecIni);   

// loading
$doc->load( $xml_string );  // or  $doc->loadTemplate($tpl) - is optional 

// set Key - The XmlSecKey class from old API without change.
$doc->setKey($key);

if ( $doc->encrypt)
  print $doc->save();
else
  print XmlSec->getError();

// Decryption:

$doc = new XmlSecEncryptor();   
$doc->setKey($key);
if ( $doc->decrypt)
  print $doc->save();
else
  print XmlSec->getError();
The the XmlDSigner class is analog hte XmlSecEncryptor class.

-~{}~ 20.10.06 10:43:

Внимание!

Выложена новая версия библиотеки.

Большое спасибо, тем кто принял в тестировании. Все замечания учтены.
 

si

Administrator
[Mon Dec 3 12:21:36 2007] [notice] child pid 26647 exit signal Segmentation fault (11)


PHP:
<?php
<?php

$xmlStrFirst = '';

$iniEnc = array(
    'id'=>'128',
    'KeyName' => 'Alexandre',
    'EncryptionMethod'=> XMLSEC_3DES,
    'EncryptedKeyAlgorithm' => XMLSEC_EN_RSA_1_5,
);

$key = new XMLSecKey();
$key->loadFromFile('rsaprivkey.pem', XMLSEC_KEY_FORMAT_PEM);

$enc = new XMLSecEncryptor($iniEnc);
$enc->load( $xmlStrFirst);
$enc->setKey($key);
$enc->encrypt();

?>
версии софта такие

xmlsec1-1.2.11-1
xmlsec1-openssl-1.2.11-1
apache 1.3.39
php 5.2.5
libxml2-2.6.20-4
libxslt-1.1.14-3

вторая проблема, если собрать php с этим ext при старте апача или php-cli получаем

error : Unknown IO error
 

si

Administrator
suse 10.0

-~{}~ 03.12.07 13:30:

с segmentation понятно это изза пустой $xmlStrFirst
 

phpdev2007

Новичок
Alexandre
Скажите пожалуйста, если я правильно понял, эта библиотека шифрует любой xml файл, тоесть шифрует тело документа xml?
и возвращает в зашифрованном виде?
 

tony2001

TeaM PHPClub
патч для сегфолта:
http://dev.daylessday.org/diff/xmlsec_empty_string_segfault.diff

хинт: та же проблема в XMLSecEncryptor::loadTemplate() (которая в proto почему-то называется setTemplate()), возможно в xmlseckey::load() и в других местах.

Комментарии:
экстеншен, который завязан на внешнюю либу, не может включаться --enable-ext.
должна быть возможность указать где эта либа лежит, а у --enable-.. всего два значения - yes/no.
(xmlreader, xmlwriter & simplexml используют --enable только потому, что есть отдельная опция --with-libxml-dir, одна на всех).

плюс, если либа не найдена, то было бы неплохо об этом сообщать.
поэтому следующий патч:
http://dev.daylessday.org/diff/xmlsec_config.diff

хорошо бы еще пофиксить варнинги:
Код:
/local/dev/php/5_3/ext/xmlsec/php_xmlsec.c: In function '_php_xmlsec_encryptor_prepare':
/local/dev/php/5_3/ext/xmlsec/php_xmlsec.c:572: warning: unused variable 'key_size'
/local/dev/php/5_3/ext/xmlsec/php_xmlsec.c:569: warning: unused variable 'xmlSecKeyData'
/local/dev/php/5_3/ext/xmlsec/php_xmlsec.c:568: warning: unused variable 'TransformId'
/local/dev/php/5_3/ext/xmlsec/php_xmlsec.c:563: warning: unused variable 'id'
/local/dev/php/5_3/ext/xmlsec/php_xmlsec.c:562: warning: unused variable 'zdata'
/local/dev/php/5_3/ext/xmlsec/php_xmlsec.c:561: warning: unused variable 'key_object'
/local/dev/php/5_3/ext/xmlsec/php_xmlsec.c: In function 'zim_xmlsecencryptor_test':
/local/dev/php/5_3/ext/xmlsec/php_xmlsec.c:680: warning: unused variable 'pDoc'
/local/dev/php/5_3/ext/xmlsec/php_xmlsec.c: In function 'zim_xmlsecencryptor_decrypt':
/local/dev/php/5_3/ext/xmlsec/php_xmlsec.c:871: warning: pointer targets in passing argument 2 of 'xmlSecFindNode' differ in signedness
/local/dev/php/5_3/ext/xmlsec/php_xmlsec.c:877: warning: pointer targets in passing argument 2 of 'xmlSecFindNode' differ in signedness
/local/dev/php/5_3/ext/xmlsec/php_xmlsec.c:883: warning: pointer targets in passing argument 2 of 'xmlGetProp' differ in signedness
/local/dev/php/5_3/ext/xmlsec/php_xmlsec.c:905: warning: pointer targets in passing argument 2 of 'xmlSecFindNode' differ in signedness
/local/dev/php/5_3/ext/xmlsec/php_xmlsec.c:907: warning: pointer targets in passing argument 2 of 'xmlSecFindNode' differ in signedness
/local/dev/php/5_3/ext/xmlsec/php_xmlsec.c:909: warning: pointer targets in passing argument 2 of 'xmlGetProp' differ in signedness
/local/dev/php/5_3/ext/xmlsec/php_xmlsec.c:972: warning: pointer targets in initialization differ in signedness
/local/dev/php/5_3/ext/xmlsec/php_xmlsec.c: In function 'zim_xmlsecencryptor_getKeyName':
/local/dev/php/5_3/ext/xmlsec/php_xmlsec.c:1043: warning: pointer targets in passing argument 2 of 'xmlSecFindNode' differ in signedness
/local/dev/php/5_3/ext/xmlsec/php_xmlsec.c:1046: warning: pointer targets in passing argument 2 of 'xmlSecFindNode' differ in signedness
/local/dev/php/5_3/ext/xmlsec/php_xmlsec.c: In function 'zim_xmlsecdsigner___construct':
/local/dev/php/5_3/ext/xmlsec/php_xmlsec.c:1101: warning: unused variable 'TransformId'
/local/dev/php/5_3/ext/xmlsec/php_xmlsec.c: In function 'zim_xmlsecdsigner_verify':
/local/dev/php/5_3/ext/xmlsec/php_xmlsec.c:1517: warning: unused variable 'docStr'
/local/dev/php/5_3/ext/xmlsec/php_xmlsec.c: In function 'zm_startup_xmlsec':
/local/dev/php/5_3/ext/xmlsec/php_xmlsec.c:1834: warning: unused variable 'err_rsc'
/local/dev/php/5_3/ext/xmlsec/php_xmlsec.c: In function 'zm_shutdown_xmlsec':
/local/dev/php/5_3/ext/xmlsec/php_xmlsec.c:2014: warning: implicit declaration of function 'xsltCleanupGlobals'
/local/dev/php/5_3/ext/xmlsec/php_xmlsec.c: In function 'zm_info_xmlsec':
/local/dev/php/5_3/ext/xmlsec/php_xmlsec.c:2032: warning: implicit declaration of function 'php_info_print_table_start'
/local/dev/php/5_3/ext/xmlsec/php_xmlsec.c:2033: warning: implicit declaration of function 'php_info_print_table_header'
/local/dev/php/5_3/ext/xmlsec/php_xmlsec.c:2034: warning: implicit declaration of function 'php_info_print_table_row'
/local/dev/php/5_3/ext/xmlsec/php_xmlsec.c:2057: warning: implicit declaration of function 'php_info_print_table_end'
/local/dev/php/5_3/ext/xmlsec/php_xmlsec.c: At top level:
/local/dev/php/5_3/ext/xmlsec/php_xmlsec.c:46: warning: 'p_error' defined but not used
и вообще код желательно почистить (начать можно с фолдинга, который на данный момент поломан).

некоторые куски кода выглядят странно:
1.XMLSecDSignner::verify()
Код:
    intern = (xmlsec_dsigner_object *)zend_object_store_get_object(id TSRMLS_CC);

    if (intern->doc == NULL || intern->doc->document->ptr == NULL) {
        php_error_docref(NULL TSRMLS_CC, E_WARNING, "The XML document is not valid");
        RETURN_FALSE;
    }
2. XMLSecDSignner::test()
Код:
    intern = (xmlsec_dsigner_object *)zend_object_store_get_object(id TSRMLS_CC);

    if (intern == NULL){
        php_error_docref(NULL TSRMLS_CC, E_WARNING,  "failed to get class");
        RETURN_FALSE;
    }
т.е. теоретически допускается, что в object storage может оказаться NULL, но почему-то проверяется это только в одном месте.

а вообще, по-хорошему, для каждой функции надо как минимум несколько тестов писать - подавать правильные параметры, неправильные параметры, edge cases и т.п.
 

Alexandre

PHPПенсионер
Скажите пожалуйста, если я правильно понял, эта библиотека шифрует любой xml файл, тоесть шифрует тело документа xml?
и возвращает в зашифрованном виде?
Yes
More information (and link to XMLEcrypt specification ) You can to find at link php_xmlsec
sitomorrow I download fixed version. This version is old.
PS. sorry for english, I d'nt have russian fonts.
 

phpdev2007

Новичок
Alexandre
понятно, спасибо за ответ, я прочитал всю презентацию,
но все равно не смог найти ответ, почему нельзя просто шифровать xml при передачи, средствами php - Mcrypt? в чем преимущество библиотеки, если можно конечно ответьте пожалуйста,
p/s
я не говорю что она не нужна, я просто хочу понять ее преимущества.
 

si

Administrator
еще вопрос.

сама либа xmlsec (если использовтаь cli или php_sec) работает как-то странно.

если она использует дефолтный openssl конфиг, то она ищет в /etc/ssl файл cert.pem которого нету, как результат

Код:
#>xmlsec1 sign --privkey-pem dsaprivkey.pem,dsacert.pem --pubkey-cert-pem dsacert.pem --output out.xml 1.xml
error : Unknown IO error
func=xmlSecOpenSSLX509StoreInitialize:file=x509vfy.c:line=651:obj=x509-store:subj=X509_LOOKUP_add_dir:error=4:crypto library function failed: 
func=xmlSecKeyDataStoreCreate:file=keysdata.c:line=1328:obj=x509-store:subj=id->initialize:error=1:xmlsec library function failed: 
func=xmlSecOpenSSLKeysMngrInit:file=crypto.c:line=313:obj=unknown:subj=xmlSecKeyDataStoreCreate:error=1:xmlsec library function failed:xmlSecOpenSSLX509StoreId
func=xmlSecOpenSSLAppDefaultKeysMngrInit:file=app.c:line=1270:obj=unknown:subj=xmlSecOpenSSLKeysMngrInit:error=1:xmlsec library function failed: 
Error: failed to initialize keys manager.
сейчас как workaround использую --crypto-config /dev/null но хотелось бы понять как правильно конфигурить этот xmlsec (или openssl для него).
 

Alexandre

PHPПенсионер
но все равно не смог найти ответ, почему нельзя просто шифровать xml при передачи, средствами php - Mcrypt? в чем преимущество библиотеки, если можно конечно ответьте пожалуйста
можно шифровать средствами mcrypt, но тогда получится просто бинарное шифрование. Сам стандарт W3C XMLEncrypt предполагает как шифрование всего документа, так и его части. И еще в протоколе продуманы разные мелочи, о которых приходится заботиться, если делаешь что-то используя стандартные методы, например приаттачивание сертификатов, хешей, шифрованных ключей и пр...

Как показывает практика, сам стандарт, в чистом виде, используется редко, но данный стандарт (рекомендация) используются в других стандартах, например cXML, WS-Security (защита SOAP), SAML etc... которые нашли широкое практическое применение в области защиты информации.

-~{}~ 04.12.07 00:16:

сама либа xmlsec (если использовтаь cli или php_sec) работает как-то странно.

если она использует дефолтный openssl конфиг, то она ищет в /etc/ssl файл cert.pem которого нету, как результат
действительно странно, попробуй так
xmlsec1 sign --privkey-pem dsaprivkey.pem --pubkey-cert-pem dsacert.pem --output out.xml 1.xml
попробуй написать полные пути до dsaprivkey.pem и dsacert.pem
выложи 1.xml

-~{}~ 04.12.07 00:20:

для каждой функции надо как минимум несколько тестов писать - подавать правильные параметры, неправильные параметры
согл. постараюсь выложить завтра новую версию. У меня на каждый метод - по тесту.

-~{}~ 04.12.07 02:30:

плюс, если либа не найдена, то было бы неплохо об этом сообщать.
поэтому следующий патч:
http://dev.daylessday.org/diff/xmlsec_config.diff
fixed...

sorry, ftp forbiden
Попросил Сашу, чтоб открыл
 

Alexandre

PHPПенсионер
когда можно ожидать новую версию ?
si, сообщи и я вышлю на мыло,
Саша что-то пока не открывает доступ... У меня на работе идет апгрейт софта... ася пока не установлена и я не имею с ним связи.
 
Сверху