<?xml version="1.0" encoding="cp1251"?>
<?xml-stylesheet type="text/css" href="http://www.pgpru.com/styles/atom.css" media="screen"?>
<rss version="2.0">
<channel>
<title>openPGP в России/Черновики/Статьи/Сервисметоквремени/tm-verify</title>
<link>http://www.pgpru.com/%D7%E5%F0%ED%EE%E2%E8%EA%E8/%D1%F2%E0%F2%FC%E8/%D1%E5%F0%E2%E8%F1%EC%E5%F2%EE%EA%E2%F0%E5%EC%E5%ED%E8/tm-verify</link>
<description>История изменений документа Черновики/Статьи/Сервисметоквремени/tm-verify</description>
<copyright>http://www.pgpru.com/%CF%F0%EE%E5%EA%F2/%CF%F0%E0%E2%E8%EB%E0</copyright>
<language>ru</language>
<image>
<title>openPGP в России</title>
<link>http://www.pgpru.com/</link>
<url>http://www.pgpru.com/images/pgpru_banner.gif</url>
<width>88</width>
<height>31</height>
</image>
<item>
<title>Редакция от 03/01/2009 23:41</title>
<link>http://www.pgpru.com/%d7%e5%f0%ed%ee%e2%e8%ea%e8/%d1%f2%e0%f2%fc%e8/%d1%e5%f0%e2%e8%f1%ec%e5%f2%ee%ea%e2%f0%e5%ec%e5%ed%e8/tmverify/show?time=2009-01-03+23%3A41%3A41</link>
<guid isPermaLink="true">http://www.pgpru.com/%d7%e5%f0%ed%ee%e2%e8%ea%e8/%d1%f2%e0%f2%fc%e8/%d1%e5%f0%e2%e8%f1%ec%e5%f2%ee%ea%e2%f0%e5%ec%e5%ed%e8/tmverify</guid>
<description><![CDATA[<div class="pageBefore"></div><div class="page">
<h3>Сравнение редакций документа <a href="http://www.pgpru.com/chernowiki/statji/servismetokvremeni/tmverify">Черновики / Статьи / Сервисметоквремени /&nbsp;tm-verify</a> от <a href="http://www.pgpru.com/chernowiki/statji/servismetokvremeni/tmverify?time=2009-01-03+23%3A41%3A41">03/01/2009 23:41</a> и <a href="http://www.pgpru.com/chernowiki/statji/servismetokvremeni/tmverify">08/07/2009 12:57</a></h3>
<br />
<h2>Удалено:</h2><br />
<div class="deletions"><div class="center"><strong>Скачать tm-verify</strong><br />
<br />
<span class="missingpage" title="404: //files?get=tmverify.py">tm-verify 0.2</span> (<span class="missingpage" title="404: //files?get=tmverify.py.asc">ЭЦП</span>)</div>%%<!--notypo--><fieldset><legend><strong> Оглавление документа:   </strong></legend><div class="toc1"><a href="#h23029-2">Описание</a></div><div class="toc1"><a href="#h23029-3">Функциональность</a></div><div class="toc1"><a href="#h23029-4">Как использовать</a></div><div class="toc1"><a href="#h23029-5">Текущие ограничения</a></div><div class="toc1"><a href="#h23029-6">Планы развития</a></div><div class="toc2"><a href="#h23029-7">Ближайшие</a></div><div class="toc2"><a href="#h23029-8">Отдалённые (после выхода API)</a></div><div class="toc1"><a href="#h23029-9">Код</a></div></fieldset><!--/notypo--></div><br />
<h2>Добавлено:</h2><br />
<div class="additions"><div class="center"><strong>Скачать tm-verify</strong><br />
<br />
<span class="missingpage" title="404: //files?get=tmverify.py">tm-verify 0.2</span> (<span class="missingpage" title="404: //files?get=tmverify.py.asc">ЭЦП</span>)</div>%%<table class="usertable" border="0" cellspacing="1">
<tr class="userrow"><td class="usercell" valign="top"><!--notypo--><small><em>подстраницы отсутствуют</em></small><br/></fieldset>
<!--/notypo--></td><td  class="usercell" valign="top"><!--notypo--><fieldset><legend><strong> Оглавление документа:   </strong></legend><div class="toc1"><a href="#h23029-2">Описание</a></div><div class="toc1"><a href="#h23029-3">Функциональность</a></div><div class="toc1"><a href="#h23029-4">Как использовать</a></div><div class="toc1"><a href="#h23029-5">Текущие ограничения</a></div><div class="toc1"><a href="#h23029-6">Планы развития</a></div><div class="toc2"><a href="#h23029-7">Ближайшие</a></div><div class="toc2"><a href="#h23029-8">Отдалённые (после выхода API)</a></div><div class="toc1"><a href="#h23029-9">Код</a></div></fieldset><!--/notypo--></td></tr>
</table></div></div>
]]></description>
<pubDate>Sat, 03 Jan 2009 23:41:41 +0300</pubDate>
</item>
<item>
<title>Редакция от 09/05/2008 12:14</title>
<link>http://www.pgpru.com/%d7%e5%f0%ed%ee%e2%e8%ea%e8/%d1%f2%e0%f2%fc%e8/%d1%e5%f0%e2%e8%f1%ec%e5%f2%ee%ea%e2%f0%e5%ec%e5%ed%e8/tmverify/show?time=2008-05-09+12%3A14%3A28</link>
<guid isPermaLink="true">http://www.pgpru.com/%d7%e5%f0%ed%ee%e2%e8%ea%e8/%d1%f2%e0%f2%fc%e8/%d1%e5%f0%e2%e8%f1%ec%e5%f2%ee%ea%e2%f0%e5%ec%e5%ed%e8/tmverify</guid>
<description><![CDATA[<div class="pageBefore"></div><div class="page">
<h3>Сравнение редакций документа <a href="http://www.pgpru.com/chernowiki/statji/servismetokvremeni/tmverify">Черновики / Статьи / Сервисметоквремени /&nbsp;tm-verify</a> от <a href="http://www.pgpru.com/chernowiki/statji/servismetokvremeni/tmverify?time=2008-05-09+12%3A14%3A28">09/05/2008 12:14</a> и <a href="http://www.pgpru.com/chernowiki/statji/servismetokvremeni/tmverify?time=2009-01-03+23%3A41%3A41">03/01/2009 23:41</a></h3>
<br />
<h2>Удалено:</h2><br />
<div class="deletions"><ul><li> Взять из <a href="http://timemarker.org/ru/diary.aspx" target="_blank" title="" class="outerlink">нотариального журнала</a> цепочку меток, распаковать в произвольный каталог.</li></ul></div><br />
<h2>Добавлено:</h2><br />
<div class="additions"><ul><li> Взять из <a href="http://timemarker.org/ru/Log.aspx" target="_blank" title="" class="outerlink">нотариального журнала</a> цепочку меток, распаковать в произвольный каталог.</li></ul></div></div>
]]></description>
<pubDate>Fri, 09 May 2008 12:14:28 +0400</pubDate>
</item>
<item>
<title>Редакция от 04/05/2008 23:30</title>
<link>http://www.pgpru.com/%d7%e5%f0%ed%ee%e2%e8%ea%e8/%d1%f2%e0%f2%fc%e8/%d1%e5%f0%e2%e8%f1%ec%e5%f2%ee%ea%e2%f0%e5%ec%e5%ed%e8/tmverify/show?time=2008-05-04+23%3A30%3A49</link>
<guid isPermaLink="true">http://www.pgpru.com/%d7%e5%f0%ed%ee%e2%e8%ea%e8/%d1%f2%e0%f2%fc%e8/%d1%e5%f0%e2%e8%f1%ec%e5%f2%ee%ea%e2%f0%e5%ec%e5%ed%e8/tmverify</guid>
<description><![CDATA[<div class="pageBefore"></div><div class="page">
<h3>Сравнение редакций документа <a href="http://www.pgpru.com/chernowiki/statji/servismetokvremeni/tmverify">Черновики / Статьи / Сервисметоквремени /&nbsp;tm-verify</a> от <a href="http://www.pgpru.com/chernowiki/statji/servismetokvremeni/tmverify?time=2008-05-04+23%3A30%3A49">04/05/2008 23:30</a> и <a href="http://www.pgpru.com/chernowiki/statji/servismetokvremeni/tmverify?time=2008-05-09+12%3A14%3A28">09/05/2008 12:14</a></h3>
<br />
<h2>Удалено:</h2><br />
<div class="deletions">Обратите внимание: все метки, лежащие в конкретном каталоге, должны идти последовательно. Скажем, если в каталоге лежат метки 51, 52, 53, 55, 56, 57, то метка 55 выдаст ошибку связности хэшей из-за отсутствия метки 54. Проверка продолжится несмотря на ошибку, но имейте в виду.</div><br />
<h2>Добавлено:</h2><br />
<div class="additions">Обратите внимание: все метки, лежащие в конкретном каталоге, должны идти последовательно. Скажем, если в каталоге лежат метки 51, 52, 53, 55, 56, 57, то метка 55 выдаст ошибку связности из-за отсутствия метки 54. Проверка продолжится несмотря на ошибку, но имейте в виду.<br />
<ul><li> Корректная проверка цепочек, включающих, помимо метаданных, регулярные метки.
</li><li> Возможность проверки определённого диапазона меток.
</li><li> Совместимость с Windows.</li></ul></div></div>
]]></description>
<pubDate>Sun, 04 May 2008 23:30:49 +0400</pubDate>
</item>
<item>
<title>Редакция от 02/05/2008 16:39</title>
<link>http://www.pgpru.com/%d7%e5%f0%ed%ee%e2%e8%ea%e8/%d1%f2%e0%f2%fc%e8/%d1%e5%f0%e2%e8%f1%ec%e5%f2%ee%ea%e2%f0%e5%ec%e5%ed%e8/tmverify/show?time=2008-05-02+16%3A39%3A49</link>
<guid isPermaLink="true">http://www.pgpru.com/%d7%e5%f0%ed%ee%e2%e8%ea%e8/%d1%f2%e0%f2%fc%e8/%d1%e5%f0%e2%e8%f1%ec%e5%f2%ee%ea%e2%f0%e5%ec%e5%ed%e8/tmverify</guid>
<description><![CDATA[<div class="pageBefore"></div><div class="page">
<h3>Сравнение редакций документа <a href="http://www.pgpru.com/chernowiki/statji/servismetokvremeni/tmverify">Черновики / Статьи / Сервисметоквремени /&nbsp;tm-verify</a> от <a href="http://www.pgpru.com/chernowiki/statji/servismetokvremeni/tmverify?time=2008-05-02+16%3A39%3A49">02/05/2008 16:39</a> и <a href="http://www.pgpru.com/chernowiki/statji/servismetokvremeni/tmverify?time=2008-05-04+23%3A30%3A49">04/05/2008 23:30</a></h3>
<br />
<h2>Удалено:</h2><br />
<div class="deletions"><!--notypo--><fieldset><legend><strong> Оглавление документа:   </strong></legend><div class="toc1"><a href="#h23029-2">Описание</a></div><div class="toc1"><a href="#h23029-3">Функциональность</a></div><div class="toc1"><a href="#h23029-4">Как использовать</a></div><div class="toc1"><a href="#h23029-5">Текущие ограничения</a></div><div class="toc1"><a href="#h23029-6">Планы развития</a></div><div class="toc2"><a href="#h23029-7">Ближайшие</a></div><div class="toc2"><a href="#h23029-8">Отдалённые (после выхода API)</a></div><div class="toc1"><a href="#h23029-9">Код</a></div></fieldset><!--/notypo--><br />
<ul><li> Проверяет связность цепочки меток по хэшам.
</li><li> Выполнить: <tt>./tm-verify.py [путь к каталогу]</tt>. Если не указать путь, проверяется текущий каталог. Подробности через <tt>./tm-verify.py --help</tt>.
</li><li> Все метки, лежащие в конкретном каталоге, должны идти последовательно. Скажем, если в каталоге лежат метки 51, 52, 53, 55, 56, 57, то метка 55 выдаст ошибку связности хэшей из-за отсутствия метки 54. Проверка продолжится несмотря на ошибку, но имейте в виду.
</li><li> Поскольку состояние подписей проверяется только по коду возврата GnuPG (а не через интерфейс статусов), убедитесь, чтобы GnuPG в обычном режиме не возвращал никаких ошибок (типа ненайденных связок ключей и т.п.), иначе все подписи будут опознаваться как повреждённые.
</li><li> По той же причине, что и в предыдущем пункте, существует возможность атаки на процесс сверки цепочек: если взломщик подменит архив с цепочкой меток и тем или иным образом подбросит свой открытый ключ на связку пользователя, программа завершится с корректным результатом (сами подписи ведь верны; другое дело, что проставлены посторонним ключом).
</li><li> Проверка ведётся только по хэшам SHA-512.
</li><li> Не проверяются дополнительные поля: последовательность номеров меток и дат их выдачи и их принадлежность к одному сервису (всё это также оставляет потенциал для атаки).
</li><li> Проверка соответствия дополнительных полей меток: Signed-by, Number, Timestamp (последовательность номеров и дат и принадлежность всех меток одному сервису).
</li><li> Проверка состояния подписей через интерфейс статусов GnuPG.
</li><li> Проверка связности цепочек по обоим хэш-алгоритмам (RIPEMD160 в дополнение к SHA512).</li></ul>
# @version: 0.1<br />
# XXX GnuPG communication relies solely on error codes (no status-fd),<br />
# thus any errors in gpg configuration will lead to 'invalid' sigs<br />
# XXX Only SHA512 referrences is checked<br />
<span class="cite">'TimeMARKER.org chains verifier v.0.1<br />
Usage: ./tm-verify.py [OPTIONS] [PATH]<br />
<div class="indent"><div class="indent"><div class="indent"><div class="indent"> -v, <s>verbose print more information during operation</div></div></div></div>
Optional PATH is a path to the directory containing marker chain files.<br />
Note: All marker files must be in consecutive order, or you will get<br />
verification errors.<br />
<div class="indent"><div class="indent"><div class="indent"><div class="indent"> 1 digsig integrity or hashes chaining errors detected</div></div></div></div>
import sys, os, getopt, glob<br />
<div class="indent"><div class="indent">'Return status code and original plaintext (lines list) of a signed marker'<br />
p = Popen(['gpg', '-q', '-d', filename],<br />
return p.returncode, p.stdout.readlines()</div></div>
def hash(str):<br />
<div class="indent"><div class="indent">'Calculate SHA-512 hash of a marker meta'<br />
p = Popen(['gpg', '-q', '</s>print-md', 'SHA512'], universal_newlines=False,<br />
return o.replace(' ', </span>).replace('\n', <span class="cite">).lower()<br />
<div class="indent"><div class="indent">print 'Directory %s not found.' % path<br />
</div></div>global _verbose<br />
<div class="indent"><div class="indent"><div class="indent"><div class="indent">code, lines = verify(file)<br />
if code != 0:<br />
<div class="indent"><div class="indent">sig_errors.append(f)<br />
print 'BAD signature in', f<br />
</div></div>elif _verbose:<br />
<div class="indent"><div class="indent">print 'Good signature in', f<br />
</div></div>sharef = lines[5][20:].rstrip() # Previous metadata checksum (referrenced)<br />
<div class="indent"><div class="indent">if sharef != digest:<br />
<div class="indent"><div class="indent">print 'BAD Ref-Hash-SHA512 in', f<br />
print 'Good Ref-Hash-SHA512 in', f<br />
</div></div></div></div># Hashing current metadata for future use<br />
digest = hash(</span>.join(lines)[:-2])<br />
# Some debugging data<br />
<div class="indent"><div class="indent">print ' Ref N-1:', sharef[:40] + '...'<br />
print ' Ref N: ', digest[:40] + '...'<br />
print<br />
</div></div></div></div>if not path: path = 'current'<br />
print 'No marker files found in %s directory.' % path<br />
print ' ' + ', '.join(sig_errors)<br />
print '!!! Timestamps hash chaining failed on following markers:'<br />
print ' ' + ', '.join(ref_errors)<br />
print 'All timestamps hashes chained correctly.'<br />
</div></div>if len(sig_errors) or len(ref_errors):</div></div>
def entry(argv):<br />
<div class="indent"><div class="indent">opts, args = getopt.getopt(argv, 'hv', ['help', 'verbose'])<br />
<div class="indent"><div class="indent">if o in ('-h', '--help'):<br />
<div class="indent"><div class="indent">print <u>doc</u><br />
_verbose = 1<br />
</div></div></div></div>entry(sys.argv[1:])</div></div></div><br />
<h2>Добавлено:</h2><br />
<div class="additions"><div class="action" style="float:right; width:250px"><div class="action-content"><div class="center"><strong>Скачать tm-verify</strong><br />
<br />
<span class="missingpage" title="404: //files?get=tmverify.py">tm-verify 0.2</span> (<span class="missingpage" title="404: //files?get=tmverify.py.asc">ЭЦП</span>)</div></div></div><!--notypo--><fieldset><legend><strong> Оглавление документа:   </strong></legend><div class="toc1"><a href="#h23029-2">Описание</a></div><div class="toc1"><a href="#h23029-3">Функциональность</a></div><div class="toc1"><a href="#h23029-4">Как использовать</a></div><div class="toc1"><a href="#h23029-5">Текущие ограничения</a></div><div class="toc1"><a href="#h23029-6">Планы развития</a></div><div class="toc2"><a href="#h23029-7">Ближайшие</a></div><div class="toc2"><a href="#h23029-8">Отдалённые (после выхода API)</a></div><div class="toc1"><a href="#h23029-9">Код</a></div></fieldset><!--/notypo--><br />
<ul><li> Проверяет связность цепочки меток по хэшам и другим мета-данным.
</li><li> Выполнить: <tt>./tmverify.py --keyid &lt;ключСервиса&gt; [путь к каталогу]</tt>. Параметр <tt>--keyid</tt> опционален, но использовать его <u>крайне</u> желательно. Если не указать путь, проверяется текущий каталог. Подробности через <tt>./tmverify.py --help</tt>.</li></ul>
Обратите внимание: все метки, лежащие в конкретном каталоге, должны идти последовательно. Скажем, если в каталоге лежат метки 51, 52, 53, 55, 56, 57, то метка 55 выдаст ошибку связности хэшей из-за отсутствия метки 54. Проверка продолжится несмотря на ошибку, но имейте в виду.<br />
Нету.<br />
<ul><li> <s>Проверка соответствия дополнительных полей меток: Signed-by, Number, Timestamp (последовательность номеров и дат и принадлежность всех меток одному сервису).</s>
</li><li> <s>Проверка состояния подписей через интерфейс статусов GnuPG.</s>
</li><li> <s>Проверка связности цепочек по обоим хэш-алгоритмам (RIPEMD160 в дополнение к SHA512).</s></li></ul>
# @version: 0.2<br />
# None?<br />
<span class="cite">'TimeMARKER.org chains verifier v.0.2<br />
Usage: %s [OPTIONS] [PATH]<br />
<div class="indent"><div class="indent"><div class="indent"><div class="indent"> -k 0x1234ABCD, --keyid 0x1234ABCD<br />
<div class="indent"><div class="indent"><div class="indent"><div class="indent"><div class="indent"><div class="indent"><div class="indent"><div class="indent"> timestamper key ID (8 to 16 digits)<br />
</div></div></div></div></div></div></div></div> -s, --strict warn on every marker signed with an unexpected key<br />
 -v, --verbose print more information during operation (repeat<br />
<div class="indent"><div class="indent"><div class="indent"><div class="indent"><div class="indent"><div class="indent"><div class="indent"><div class="indent"> twice for extra verbose output)<br />
</div></div></div></div></div></div></div></div> --changes display changelog</div></div></div></div>
All arguments are optional. If PATH (path to the directory containing marker<br />
chain files) is omitted, current directory is searched.<br />
All marker files must be in consecutive order, or you will get verification<br />
errors. It is strongly recommended to provide program with an optional keyid<br />
argument, otherwise it's possible to "correctly" verify markers chain signed<br />
with a bogus key.<br />
<div class="indent"><div class="indent"><div class="indent"><div class="indent"> 1 digsig integrity or chaining errors detected</div></div></div></div>
_changelog = </span>'TimeMARKER.org chains verifier <br />
Changelog:<br />
2008-05-04 version 0.2:<br />
<div class="indent"> &ndash; Digsig verification process reimplemented with GPG status codes<br />
 &ndash; Timestamper keyID can be provided with <s>keyid argument<br />
 &ndash; RIPEMD160 hash referrences are checked in addition to SHA512<br />
 &ndash; Checks for proper metadata formatting<br />
 &ndash; All metadata fields are checked for proper chaining</div>
2008-04-28 version 0.1:<br />
<div class="indent"> &ndash; Proof-of-concept, initial release<span class="cite">'</div>
import sys, os, getopt, glob, time<br />
from time import mktime, strptime<br />
_strict = 0<br />
_keyid = </span><br />
class tmExceptions(Exception): pass<br />
class MetaFormatError(tmExceptions): pass<br />
class NoPublicKey(tmExceptions): pass<br />
class Marker:<br />
<div class="indent"><div class="indent">'Marker metadata container'<br />
def <u>init</u>(self, unpackedMeta):<br />
<div class="indent"><div class="indent">self.dict = {}<br />
for k, v in unpackedMeta:<br />
<div class="indent"><div class="indent">self[k] = v<br />
</div></div></div></div>def <u>setitem</u>(self, k, v):<br />
<div class="indent"><div class="indent">self.dict[k] = v<br />
</div></div>def <u>getitem</u>(self, k):<br />
<div class="indent"><div class="indent">return self.dict[k]<br />
</div></div>def <u>gt</u>(self, prevMark):<br />
<div class="indent"><div class="indent">'Assure curMark is consecutive to prevMark'<br />
if \<br />
<div class="indent"><div class="indent">self['fileNum'] &gt; prevMark['fileNum'] and \<br />
self['signer'] == prevMark['signer'] and \<br />
self['date'] &gt; prevMark['date'] and \<br />
self['number'] &gt; prevMark['number'] and \<br />
self['sha_ref'] == prevMark['sha'] and \<br />
self['rmd_ref'] == prevMark['rmd']:<br />
<div class="indent"><div class="indent">return True<br />
</div></div></div></div>else: return False</div></div></div></div>
def unpackMeta(meta, filename):<br />
<div class="indent"><div class="indent">'Parse timestamp metadata'<br />
if \<br />
<div class="indent"><div class="indent">meta[2].startswith('Signed-by: ') and \<br />
meta[3].startswith('Timestamp: ') and \<br />
meta[4].startswith('Number: ') and \<br />
meta[5].startswith('Ref-Hash-SHA512: ') and \<br />
meta[6].startswith('Ref-Hash-RIPEMD160: ') and \<br />
meta[7].startswith('Hash-SHA512: ') and \<br />
meta[8].startswith('Hash-RIPEMD160: '):<br />
<div class="indent"><div class="indent">return [('fileNum', int(filename[6:-4])), <br />
<div class="indent"><div class="indent"><div class="indent"><div class="indent">('signer', meta[2][20:].strip()), <br />
('date', mktime(strptime(meta[3][20:].strip(), '%a, %d %b %Y %H:%M:%S %Z'))), <br />
('number', int(meta[4][20:].strip())), <br />
('sha_ref', meta[5][20:].strip().upper()), <br />
('rmd_ref', meta[6][20:].strip().upper()), <br />
('sha', hash(<span class="cite">.join(meta).strip('\n\r'), 'SHA512')), <br />
('rmd', hash(</span>.join(meta).strip('\n\r'), 'RIPEMD160'))]<br />
</div></div></div></div></div></div>raise MetaFormatError, 'in timestamp %s' % filename</div></div></div></div>
def checkStatus(status):<br />
<div class="indent"><div class="indent">'Check digital signature from GnuPG status codes'<br />
result = keyID = None<br />
for line in status:<br />
<div class="indent"><div class="indent">if line.startswith('[GNUPG:] '):<br />
<div class="indent"><div class="indent">fields = line[9:].strip().split(' ')<br />
if fields[0] == 'GOODSIG':<br />
<div class="indent"><div class="indent">result = True<br />
keyID = fields[1]<br />
</div></div>if fields[0] == 'BADSIG':<br />
<div class="indent"><div class="indent">result = False<br />
keyID = fields[1]<br />
</div></div>if fields[0] == 'ERRSIG':<br />
<div class="indent"><div class="indent">raise NoPublicKey, fields[1] # Expn value is used in the handler<br />
</div></div></div></div></div></div>return result, keyID<br />
'Return verification status and original plaintext (lines list) of a signed marker'<br />
p = Popen(['gpg', '</s>status-fd', '2', '-q', '-d', filename],<br />
status, keyID = checkStatus(p.stderr.readlines())<br />
return status, keyID, p.stdout.readlines()</div></div>
def hash(str, algo):<br />
<div class="indent"><div class="indent">'Calculate hash (SHA512 or RIPEMD160) of a marker meta'<br />
p = Popen(['gpg', '-q', '<s>print-md', algo], universal_newlines=False,<br />
return o.replace(' ', <span class="cite">).replace('\n', </span>)<br />
<div class="indent"><div class="indent">print 'Directory %s not found.' % p<br />
</div></div>global _verbose, _strict, _keyid<br />
key_errors = []<br />
<div class="indent"><div class="indent"><div class="indent"><div class="indent">if _verbose: print 'Checking', f<br />
<div class="indent"><div class="indent">status, signKey, lines = verify(file)<br />
</div></div>except NoPublicKey:<br />
<div class="indent"><div class="indent">print 'Signing key 0x%s not found on your GPG keyring.' % sys.exc_value<br />
print 'Please download it from a keyserver, from timeMarker.org website,'<br />
print 'or get it from some trusted source of your own.'<br />
sys.exit(2)<br />
</div></div>if status is not True: sig_errors.append(f)<br />
<div class="indent"><div class="indent">if status is True: print ' Good signature in', f<br />
elif status is False: print '<span class="cite">! BAD signature in', f<br />
elif status is None: print '</span>! CORRUPT signature in', f # Malformed sig packet<br />
if not _keyid:<br />
<div class="indent"><div class="indent">_keyid = signKey<br />
</div></div>elif not signKey.endswith(_keyid):<br />
<div class="indent"><div class="indent">key_errors.append(f)<br />
print '<span class="cite">! %s is signed with an unexpected key 0x%s' % (f, signKey[-8:])<br />
if not _strict:<br />
<div class="indent"><div class="indent">print '</span>! Switching signing key to 0x%s for subsequent marks' % signKey[-8:]<br />
_keyid = signKey<br />
</div></div></div></div></div></div>except AttributeError: # For CORRUPT sigs<br />
# Marker objects<br />
<div class="indent"><div class="indent">curMark, prevMark = Marker(unpackMeta(lines, f)), curMark<br />
curMark = Marker(unpackMeta(lines, f))<br />
</div></div>except MetaFormatError:<br />
<div class="indent"><div class="indent">print '<span class="cite">! Malformed metadata in', f<br />
if not curMark &gt; prevMark:<br />
<div class="indent"><div class="indent">print '</span>! BAD chaining of', f<br />
print ' Good chaining of', f<br />
</div></div></div></div># More debugging data<br />
if _verbose &gt;= 2:<br />
<div class="indent"><div class="indent">print ''.join(lines).strip()<br />
</div></div>if _verbose: print<br />
</div></div>if not path: path = os.getcwd()<br />
else: path = abspath(expanduser(path))<br />
print 'No marker files found in directory', path<br />
print ', '.join(sig_errors)<br />
</div></div>if len(key_errors):<br />
<div class="indent"><div class="indent">print '<span class="cite">! Signing key changes detected on following markers:'<br />
print ', '.join(key_errors)<br />
print 'All timestams signed with correct key.'<br />
print '</span>! Timestamps chaining failed on following markers:'<br />
print ', '.join(ref_errors)<br />
print 'All timestamps chained correctly.'<br />
</div></div>if len(sig_errors) or len(ref_errors) or len(key_errors):</div></div>
def parseComLine(argv):<br />
<div class="indent"><div class="indent">opts, args = getopt.getopt(argv, 'hvk:s', ['help', 'verbose', 'keyid=',<br />
<div class="indent"><div class="indent"><div class="indent"><div class="indent"><div class="indent"><div class="indent"><div class="indent"><div class="indent"><div class="indent"><div class="indent"><div class="indent"><div class="indent"><div class="indent"> 'strict', 'changes'])<br />
</div></div></div></div></div></div></div></div></div></div></div>if o == '</s>changes':<br />
<div class="indent"><div class="indent">print _changelog<br />
</div></div>elif o in ('-h', '<s>help'):<br />
<div class="indent"><div class="indent">print <u>doc</u> % sys.argv[0]<br />
_verbose = _verbose + 1<br />
</div></div>elif o in ('-s', '</s>strict'):<br />
<div class="indent"><div class="indent">global _strict<br />
_strict = 1<br />
</div></div>elif o in ('-k', '--keyid'):<br />
<div class="indent"><div class="indent">if a.startswith('0x'): a = a[2:]<br />
if len(a) &lt; 8 or len(a) &gt; 16: <br />
<div class="indent"><div class="indent">print 'Timestamping service key ID should be 8 to 16 digits long'<br />
print 'plus an optional "0x" prefix.'<br />
print 'Run with --help flag for more information.'<br />
sys.exit(2)<br />
</div></div>else:<br />
<div class="indent"><div class="indent">global _keyid<br />
_keyid = a.upper()<br />
</div></div></div></div></div></div>parseComLine(sys.argv[1:])</div></div></div></div>
]]></description>
<pubDate>Fri, 02 May 2008 16:39:49 +0400</pubDate>
</item>
<item>
<title>Редакция от 02/05/2008 16:32</title>
<link>http://www.pgpru.com/%d7%e5%f0%ed%ee%e2%e8%ea%e8/%d1%f2%e0%f2%fc%e8/%d1%e5%f0%e2%e8%f1%ec%e5%f2%ee%ea%e2%f0%e5%ec%e5%ed%e8/tmverify/show?time=2008-05-02+16%3A32%3A43</link>
<guid isPermaLink="true">http://www.pgpru.com/%d7%e5%f0%ed%ee%e2%e8%ea%e8/%d1%f2%e0%f2%fc%e8/%d1%e5%f0%e2%e8%f1%ec%e5%f2%ee%ea%e2%f0%e5%ec%e5%ed%e8/tmverify</guid>
<description><![CDATA[<div class="pageBefore"></div><div class="page">
<h3>Сравнение редакций документа <a href="http://www.pgpru.com/chernowiki/statji/servismetokvremeni/tmverify">Черновики / Статьи / Сервисметоквремени /&nbsp;tm-verify</a> от <a href="http://www.pgpru.com/chernowiki/statji/servismetokvremeni/tmverify?time=2008-05-02+16%3A32%3A43">02/05/2008 16:32</a> и <a href="http://www.pgpru.com/chernowiki/statji/servismetokvremeni/tmverify?time=2008-05-02+16%3A39%3A49">02/05/2008 16:39</a></h3>
<br />
<h2>Удалено:</h2><br />
<div class="deletions">tm-verify is a utility program automating verification of TimeMarker.org audit log chains under Linux operating system. Requires installed GnuPG and Python interpreter.<br />
<ul><li> Взять из <a href="http://timemarker.org/ru/diary.aspx" target="_blank" title="" class="outerlink">нотариального журнала</a> цепочку меток (совместимо только с форматом меток от №51 и выше), распаковать в произвольный каталог.</li></ul></div><br />
<h2>Добавлено:</h2><br />
<div class="additions">tm-verify is a utility program that automates verification of TimeMarker.org audit log chains under Linux operating system. Requires installed GnuPG and Python interpreter.<br />
<ul><li> Взять из <a href="http://timemarker.org/ru/diary.aspx" target="_blank" title="" class="outerlink">нотариального журнала</a> цепочку меток, распаковать в произвольный каталог.</li></ul></div></div>
]]></description>
<pubDate>Fri, 02 May 2008 16:32:43 +0400</pubDate>
</item>
<item>
<title>Редакция от 02/05/2008 16:19</title>
<link>http://www.pgpru.com/%d7%e5%f0%ed%ee%e2%e8%ea%e8/%d1%f2%e0%f2%fc%e8/%d1%e5%f0%e2%e8%f1%ec%e5%f2%ee%ea%e2%f0%e5%ec%e5%ed%e8/tmverify/show?time=2008-05-02+16%3A19%3A09</link>
<guid isPermaLink="true">http://www.pgpru.com/%d7%e5%f0%ed%ee%e2%e8%ea%e8/%d1%f2%e0%f2%fc%e8/%d1%e5%f0%e2%e8%f1%ec%e5%f2%ee%ea%e2%f0%e5%ec%e5%ed%e8/tmverify</guid>
<description><![CDATA[<div class="pageBefore"></div><div class="page">
<h3>Сравнение редакций документа <a href="http://www.pgpru.com/chernowiki/statji/servismetokvremeni/tmverify">Черновики / Статьи / Сервисметоквремени /&nbsp;tm-verify</a> от <a href="http://www.pgpru.com/chernowiki/statji/servismetokvremeni/tmverify?time=2008-05-02+16%3A19%3A09">02/05/2008 16:19</a> и <a href="http://www.pgpru.com/chernowiki/statji/servismetokvremeni/tmverify?time=2008-05-02+16%3A32%3A43">02/05/2008 16:32</a></h3>
<br />
<h2>Удалено:</h2><br />
<div class="deletions"><a name="h23029-1"></a><h2>Аннотация</h2>
Ближайшие:<br />
<ul><li> Проверка состояния подписей через интерфейс статусов GnuPG (<span class="cite">в настоящее время проверка подписей уязвима к подмене открытого ключа</span>).</li></ul>
Отдалённые (после выхода API):</div><br />
<h2>Добавлено:</h2><br />
<div class="additions"><!--notypo--><fieldset><legend><strong> Оглавление документа:   </strong></legend><div class="toc1"><a href="#h23029-2">Описание</a></div><div class="toc1"><a href="#h23029-3">Функциональность</a></div><div class="toc1"><a href="#h23029-4">Как использовать</a></div><div class="toc1"><a href="#h23029-5">Текущие ограничения</a></div><div class="toc1"><a href="#h23029-6">Планы развития</a></div><div class="toc2"><a href="#h23029-7">Ближайшие</a></div><div class="toc2"><a href="#h23029-8">Отдалённые (после выхода API)</a></div><div class="toc1"><a href="#h23029-9">Код</a></div></fieldset><!--/notypo--><a name="h23029-1"></a><h2>Описание</h2>
<small>РУС</small><br />
<small>ENG</small><a name="h23029-2"></a><h2>Функциональность</h2>
<ul><li> Сверяет подписи с файлов меток.
</li><li> Проверяет связность цепочки меток по хэшам.
</li><li> Выводит диагностику и результат проверки.</li></ul><a name="h23029-3"></a><h2>Как использовать</h2>
<ul><li> Взять из <a href="http://timemarker.org/ru/diary.aspx" target="_blank" title="" class="outerlink">нотариального журнала</a> цепочку меток (совместимо только с форматом меток от №51 и выше), распаковать в произвольный каталог.
</li><li> Выполнить: <tt>./tm-verify.py [путь к каталогу]</tt>. Если не указать путь, проверяется текущий каталог. Подробности через <tt>./tm-verify.py --help</tt>.</li></ul><a name="h23029-4"></a><h2>Текущие ограничения</h2>
<ul><li> Все метки, лежащие в конкретном каталоге, должны идти последовательно. Скажем, если в каталоге лежат метки 51, 52, 53, 55, 56, 57, то метка 55 выдаст ошибку связности хэшей из-за отсутствия метки 54. Проверка продолжится несмотря на ошибку, но имейте в виду.
</li><li> Поскольку состояние подписей проверяется только по коду возврата GnuPG (а не через интерфейс статусов), убедитесь, чтобы GnuPG в обычном режиме не возвращал никаких ошибок (типа ненайденных связок ключей и т.п.), иначе все подписи будут опознаваться как повреждённые.
</li><li> По той же причине, что и в предыдущем пункте, существует возможность атаки на процесс сверки цепочек: если взломщик подменит архив с цепочкой меток и тем или иным образом подбросит свой открытый ключ на связку пользователя, программа завершится с корректным результатом (сами подписи ведь верны; другое дело, что проставлены посторонним ключом).
</li><li> Проверка ведётся только по хэшам SHA-512.
</li><li> Не проверяются дополнительные поля: последовательность номеров меток и дат их выдачи и их принадлежность к одному сервису (всё это также оставляет потенциал для атаки).</li></ul><a name="h23029-5"></a><h3>Ближайшие</h3>
<ul><li> Проверка состояния подписей через интерфейс статусов GnuPG.</li></ul><a name="h23029-6"></a><h3>Отдалённые (после выхода API)</h3></div></div>
]]></description>
<pubDate>Fri, 02 May 2008 16:19:09 +0400</pubDate>
</item>
<item>
<title>Редакция от 02/05/2008 16:14</title>
<link>http://www.pgpru.com/%d7%e5%f0%ed%ee%e2%e8%ea%e8/%d1%f2%e0%f2%fc%e8/%d1%e5%f0%e2%e8%f1%ec%e5%f2%ee%ea%e2%f0%e5%ec%e5%ed%e8/tmverify/show?time=2008-05-02+16%3A14%3A38</link>
<guid isPermaLink="true">http://www.pgpru.com/%d7%e5%f0%ed%ee%e2%e8%ea%e8/%d1%f2%e0%f2%fc%e8/%d1%e5%f0%e2%e8%f1%ec%e5%f2%ee%ea%e2%f0%e5%ec%e5%ed%e8/tmverify</guid>
<description><![CDATA[<div class="pageBefore"></div><div class="page">
<h3>Сравнение редакций документа <a href="http://www.pgpru.com/chernowiki/statji/servismetokvremeni/tmverify">Черновики / Статьи / Сервисметоквремени /&nbsp;tm-verify</a> от <a href="http://www.pgpru.com/chernowiki/statji/servismetokvremeni/tmverify?time=2008-05-02+16%3A14%3A38">02/05/2008 16:14</a> и <a href="http://www.pgpru.com/chernowiki/statji/servismetokvremeni/tmverify?time=2008-05-02+16%3A19%3A09">02/05/2008 16:19</a></h3>
<br />
<h2>Добавлено:</h2><br />
<div class="additions">Ближайшие:<br />
Отдалённые (после выхода API):<br />
<ul><li> Автоматическое скачивание цепочек.
</li><li> Возможность демонизации программы и/или её исполнение по крону.</li></ul></div></div>
]]></description>
<pubDate>Fri, 02 May 2008 16:14:38 +0400</pubDate>
</item>
<item>
<title>Редакция от 01/05/2008 18:51</title>
<link>http://www.pgpru.com/%d7%e5%f0%ed%ee%e2%e8%ea%e8/%d1%f2%e0%f2%fc%e8/%d1%e5%f0%e2%e8%f1%ec%e5%f2%ee%ea%e2%f0%e5%ec%e5%ed%e8/tmverify/show?time=2008-05-01+18%3A51%3A38</link>
<guid isPermaLink="true">http://www.pgpru.com/%d7%e5%f0%ed%ee%e2%e8%ea%e8/%d1%f2%e0%f2%fc%e8/%d1%e5%f0%e2%e8%f1%ec%e5%f2%ee%ea%e2%f0%e5%ec%e5%ed%e8/tmverify</guid>
<description><![CDATA[<div class="pageBefore"></div><div class="page">
<h3>Сравнение редакций документа <a href="http://www.pgpru.com/chernowiki/statji/servismetokvremeni/tmverify">Черновики / Статьи / Сервисметоквремени /&nbsp;tm-verify</a> от <a href="http://www.pgpru.com/chernowiki/statji/servismetokvremeni/tmverify?time=2008-05-01+18%3A51%3A38">01/05/2008 18:51</a> и <a href="http://www.pgpru.com/chernowiki/statji/servismetokvremeni/tmverify?time=2008-05-02+16%3A14%3A38">02/05/2008 16:14</a></h3>
<br />
<h2>Удалено:</h2><br />
<div class="deletions"><ul><li> Проверка соответствия дополнительных полей меток: Signed-by, Number.</li></ul></div><br />
<h2>Добавлено:</h2><br />
<div class="additions"><ul><li> Проверка соответствия дополнительных полей меток: Signed-by, Number, Timestamp (последовательность номеров и дат и принадлежность всех меток одному сервису).</li></ul></div></div>
]]></description>
<pubDate>Thu, 01 May 2008 18:51:38 +0400</pubDate>
</item>
<item>
<title>Редакция от 30/04/2008 17:18</title>
<link>http://www.pgpru.com/%d7%e5%f0%ed%ee%e2%e8%ea%e8/%d1%f2%e0%f2%fc%e8/%d1%e5%f0%e2%e8%f1%ec%e5%f2%ee%ea%e2%f0%e5%ec%e5%ed%e8/tmverify/show?time=2008-04-30+17%3A18%3A50</link>
<guid isPermaLink="true">http://www.pgpru.com/%d7%e5%f0%ed%ee%e2%e8%ea%e8/%d1%f2%e0%f2%fc%e8/%d1%e5%f0%e2%e8%f1%ec%e5%f2%ee%ea%e2%f0%e5%ec%e5%ed%e8/tmverify</guid>
<description><![CDATA[<div class="pageBefore"></div><div class="page">
<h3>Сравнение редакций документа <a href="http://www.pgpru.com/chernowiki/statji/servismetokvremeni/tmverify">Черновики / Статьи / Сервисметоквремени /&nbsp;tm-verify</a> от <a href="http://www.pgpru.com/chernowiki/statji/servismetokvremeni/tmverify?time=2008-04-30+17%3A18%3A50">30/04/2008 17:18</a> и <a href="http://www.pgpru.com/chernowiki/statji/servismetokvremeni/tmverify?time=2008-05-01+18%3A51%3A38">01/05/2008 18:51</a></h3>
<br />
<h2>Добавлено:</h2><br />
<div class="additions"><a name="h23029-1"></a><h2>Планы развития</h2>
<ul><li> Проверка соответствия дополнительных полей меток: Signed-by, Number.
</li><li> Проверка состояния подписей через интерфейс статусов GnuPG (<span class="cite">в настоящее время проверка подписей уязвима к подмене открытого ключа</span>).<br />
</li><li> Проверка связности цепочек по обоим хэш-алгоритмам (RIPEMD160 в дополнение к SHA512).
</li><li> Распараллеливание процессов сверки подписей и связности цепочек.</li></ul></div></div>
]]></description>
<pubDate>Wed, 30 Apr 2008 17:18:50 +0400</pubDate>
</item>
</channel>
</rss>
