{{Header}}
{{#seo:
|description=extracting time from Tor consensus
}}
{{intro|
extracting time from Tor consensus
}}

= anondate-get =
Diagnostic utility. <code>anondate-<u>get</u></code>. A higher level and easier to use tool than the lower level <code>anondate</code>.

Usage of <code>anondate-get</code> should be safe. It does not use networking. It does not change the time. It only looks at locally available information.

{{CodeSelect|code=
sudo anondate-get
}}

Sample output.

<pre>
/usr/sbin/anondate-get: INFO: 100% Tor bootstrap, ok.
/usr/sbin/anondate-get: INFO: tor_circuit_established_check.py, ok.
/usr/sbin/anondate-get: INFO: Tor circuit already established, ok.
/usr/sbin/anondate-get: INFO: current time in valid in range, ok.
/usr/sbin/anondate-get: INFO: Tor certificate lifetime valid, ok.
/usr/sbin/anondate-get: END: Exiting with exit_code '3' indicating 'Could not determine any time using Tor from consensus or certificate life time.'.
</pre>

= anondate-set =
Security impact has yet to be documented.

<code>anondate-<u>set</u></code>.

{{CodeSelect|code=
sudo anondate-set
}}

<pre>
/usr/sbin/anondate-set: INFO: Status file '/run/anondate/tor_certificate_lifetime_set' does not yet exist.
/usr/sbin/anondate-set: INFO: running anondate-get...
/usr/sbin/anondate-get: INFO: 100% Tor bootstrap, ok.
/usr/sbin/anondate-get: INFO: tor_circuit_established_check.py, ok.
/usr/sbin/anondate-get: INFO: Tor circuit already established, ok.
/usr/sbin/anondate-get: INFO: current time in valid in range, ok.
/usr/sbin/anondate-get: INFO: Tor certificate lifetime valid, ok.
/usr/sbin/anondate-get: END: Exiting with exit_code '3' indicating 'Could not determine any time using Tor from consensus or certificate life time.'.
/usr/sbin/anondate-set: END: Exiting with exit_code '3' indicating 'Setting time using anondate either not possible or not required.'.
</pre>

= anondate =
===== Introduction =====

* TODO: documentation on anondate is outdated
* The anondate interface description as per the latest git master:
* https://github.com/{{project_name_short}}/helper-scripts/blob/master/usr/sbin/anondate
* See also: [[#Tor Consensus Method]]
* Needs access to either:
** <code>/var/run/tor/log</code> (default only in {{project_name_long}}).  [Tor Project upstream feature request: [https://gitlab.torproject.org/legacy/trac/-/issues/16821 additional /var/run/tor/log default log]] This is preferable because it contains only Tor's log since the last boot, which is more relevant and easier for <code>anondate</code> to parse.
** Or access to <code>/var/log/tor/log</code>. This is configurable through the environment variable <code>TOR_LOG</code> (<code>export TOR_LOG=/var/log/tor/log</code>). (Alternatively, we could change the default in the code.)

===== Consensus Related Options =====

* <code>--verified-only</code>
* <code>--prefer-verified</code>
* <code>--unverified-only</code>

===== Special Exit Codes =====
* exit <code>3</code>: <code>$TOR_LOG</code> not readable.
* exit <code>4</code>: <code>$consensus</code> not readable.

===== Simple Status Checking =====
====== anondate --has-consensus ======

Useful for checking whether requesting any of the [[#Date Ranges Output]] values is worthwhile.

* yes:
** exit <code>0</code>
* no:
** exit <code>1</code>
<br />
Could be replaced by Tor ControlPort / python-stem?

* verified-only: Yes. (<code>consensus/valid-after</code>)
* unverified: No.

====== anondate --current-time-in-valid-range ======

Useful as a sanity test before setting the time for the first time and before updating it with a newly fetched timestamp.

* yes:
** exit <code>0</code>
* no:
** exit <code>1</code>
<br />
Could be replaced by Tor ControlPort / python-stem?

* verified-only: Yes. (See below.)
* unverified: No. Tor Project upstream feature request: [https://gitlab.torproject.org/legacy/trac/-/issues/16845 make unverified consensus ISOTime accessible through Tor's ControlPort]

===== Date Ranges Output =====
====== anondate --show-valid-after ======

* yes:
** output: <code>2015-08-15 22:00:00</code>
** exit <code>0</code>
* no:
** exit <code>1</code>
<br />
Could be replaced by Tor ControlPort / python-stem?

* verified-only: Yes. <code>consensus/valid-after</code>
* unverified: No. Tor Project upstream feature request: [https://gitlab.torproject.org/legacy/trac/-/issues/16845 make unverified consensus ISOTime accessible through Tor's ControlPort]

====== anondate --show-valid-until ======

* yes:
** output: <code>2015-08-16 01:00:00</code>
** exit <code>0</code>
* no:
** exit <code>1</code>
<br />
Could be replaced by Tor ControlPort / python-stem?

* verified-only: Yes. <code>consensus/valid-until</code>
* unverified: No. Tor Project upstream feature request: [https://gitlab.torproject.org/legacy/trac/-/issues/16845 make unverified consensus ISOTime accessible through Tor's ControlPort]

====== anondate --show-middle-range ======

* yes:
** output: <code>2015-08-15 23:30:00</code>
** exit <code>0</code>
* no:
** exit <code>1</code>
<br />
(A scripted calculation of the above.)

===== Certificate Validity =====
When the clock is several months or years fast or slow, Tor cannot even download the Tor consensus. Tor, however, should always provide a certificate lifetime. For a security discussion, see also [[Dev/TimeSync#Tor_Certificate_Lifetime|Tor Certificate Lifetime]].

====== anondate --tor-cert-lifetime-valid ======
<pre>
Sep 03 10:32:59.000 [warn] Certificate already expired. Either their clock is set wrong, or your clock is wrong.
Sep 03 10:32:59.000 [warn] (certificate lifetime runs from Aug 16 00:00:00 2014 GMT through Jul 29 23:59:59 2015 GMT. Your time is Sep 03 10:32:59 2015 UTC.)
</pre>

* yes:
** output: <code>Sep 03 10:34:00.000 [warn] Certificate already expired. Either their clock is set wrong, or your clock is wrong.</code>
** exit <code>0</code>
* no:
** exit <code>1</code>

Could this be replaced by Tor ControlPort / python-stem? No. Tor Project upstream feature request: [https://gitlab.torproject.org/legacy/trac/-/issues/16822 make certificate lifetime accessible through Tor's ControlPort]

====== anondate --tor-cert-valid-after ======

Similar to the above, but provides less output.

* output: <code>Jun 16 00:00:00 2014 GMT</code>
* Exit codes unreliable.
* Don't use without invoking the above first.
* (Could be fixed in the code if worthwhile.)

{{Footer}}

[[Category:Development]]