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:

Внимание!

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

Большое спасибо, тем кто принял в тестировании. Все замечания учтены.
 
[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
 
suse 10.0

-~{}~ 03.12.07 13:30:

с segmentation понятно это изза пустой $xmlStrFirst
 
Alexandre
Скажите пожалуйста, если я правильно понял, эта библиотека шифрует любой xml файл, тоесть шифрует тело документа xml?
и возвращает в зашифрованном виде?
 
патч для сегфолта:
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 и т.п.
 
Скажите пожалуйста, если я правильно понял, эта библиотека шифрует любой 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.
 
Alexandre
понятно, спасибо за ответ, я прочитал всю презентацию,
но все равно не смог найти ответ, почему нельзя просто шифровать xml при передачи, средствами php - Mcrypt? в чем преимущество библиотеки, если можно конечно ответьте пожалуйста,
p/s
я не говорю что она не нужна, я просто хочу понять ее преимущества.
 
еще вопрос.

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