keri 1.2.0.dev1__tar.gz → 1.2.0.dev2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (180) hide show
  1. {keri-1.2.0.dev1/src/keri.egg-info → keri-1.2.0.dev2}/PKG-INFO +1 -1
  2. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/setup.py +1 -1
  3. keri-1.2.0.dev2/src/keri/__init__.py +5 -0
  4. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/ipex/agree.py +2 -2
  5. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/ipex/apply.py +2 -2
  6. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/ipex/list.py +7 -0
  7. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/ipex/offer.py +2 -2
  8. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/nonce.py +2 -2
  9. keri-1.2.0.dev2/src/keri/app/cli/commands/watcher/__init__.py +6 -0
  10. keri-1.2.0.dev2/src/keri/app/cli/commands/watcher/add.py +132 -0
  11. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/witness/authenticate.py +5 -2
  12. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/habbing.py +1 -1
  13. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/indirecting.py +7 -5
  14. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/oobiing.py +93 -4
  15. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/core/__init__.py +0 -3
  16. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/core/coring.py +25 -77
  17. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/core/counting.py +37 -6
  18. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/core/eventing.py +10 -17
  19. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/core/indexing.py +16 -1
  20. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/core/parsing.py +4 -4
  21. keri-1.2.0.dev2/src/keri/core/streaming.py +391 -0
  22. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/core/structing.py +1 -0
  23. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/db/basing.py +3 -0
  24. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/db/escrowing.py +0 -2
  25. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/end/ending.py +4 -0
  26. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/help/helping.py +1 -1
  27. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/kering.py +10 -1
  28. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/vdr/eventing.py +2 -1
  29. {keri-1.2.0.dev1 → keri-1.2.0.dev2/src/keri.egg-info}/PKG-INFO +1 -1
  30. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri.egg-info/SOURCES.txt +3 -0
  31. keri-1.2.0.dev1/src/keri/__init__.py +0 -5
  32. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/LICENSE +0 -0
  33. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/README.md +0 -0
  34. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/setup.cfg +0 -0
  35. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/__init__.py +0 -0
  36. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/agenting.py +0 -0
  37. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/apping.py +0 -0
  38. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/challenging.py +0 -0
  39. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/__init__.py +0 -0
  40. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/__init__.py +0 -0
  41. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/challenge/__init__.py +0 -0
  42. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/challenge/generate.py +0 -0
  43. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/challenge/respond.py +0 -0
  44. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/challenge/verify.py +0 -0
  45. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/clean.py +0 -0
  46. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/contacts/__init__.py +0 -0
  47. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/contacts/list.py +0 -0
  48. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/decrypt.py +0 -0
  49. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/delegate/__init__.py +0 -0
  50. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/delegate/confirm.py +0 -0
  51. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/delegate/request.py +0 -0
  52. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/did/__init__.py +0 -0
  53. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/did/generate.py +0 -0
  54. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/ends/__init__.py +0 -0
  55. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/ends/add.py +0 -0
  56. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/ends/export.py +0 -0
  57. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/ends/list.py +0 -0
  58. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/escrow.py +0 -0
  59. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/export.py +0 -0
  60. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/incept.py +0 -0
  61. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/init.py +0 -0
  62. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/interact.py +0 -0
  63. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/ipex/__init__.py +0 -0
  64. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/ipex/admit.py +0 -0
  65. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/ipex/grant.py +0 -0
  66. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/ipex/join.py +0 -0
  67. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/ipex/spurn.py +0 -0
  68. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/kevers.py +0 -0
  69. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/list.py +0 -0
  70. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/local/__init__.py +0 -0
  71. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/local/watch.py +0 -0
  72. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/mailbox/__init__.py +0 -0
  73. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/mailbox/debug.py +0 -0
  74. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/mailbox/update.py +0 -0
  75. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/migrate/__init__.py +0 -0
  76. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/migrate/list.py +0 -0
  77. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/migrate/run.py +0 -0
  78. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/migrate/show.py +0 -0
  79. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/migrate.py +0 -0
  80. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/multisig/__init__.py +0 -0
  81. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/multisig/continue.py +0 -0
  82. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/multisig/demo.py +0 -0
  83. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/multisig/incept.py +0 -0
  84. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/multisig/interact.py +0 -0
  85. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/multisig/join.py +0 -0
  86. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/multisig/notice.py +0 -0
  87. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/multisig/rotate.py +0 -0
  88. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/multisig/shell.py +0 -0
  89. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/multisig/update.py +0 -0
  90. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/oobi/__init__.py +0 -0
  91. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/oobi/clean.py +0 -0
  92. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/oobi/generate.py +0 -0
  93. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/oobi/resolve.py +0 -0
  94. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/passcode/__init__.py +0 -0
  95. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/passcode/generate.py +0 -0
  96. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/passcode/remove.py +0 -0
  97. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/passcode/set.py +0 -0
  98. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/query.py +0 -0
  99. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/rename.py +0 -0
  100. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/rollback.py +0 -0
  101. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/rotate.py +0 -0
  102. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/saidify.py +0 -0
  103. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/salt.py +0 -0
  104. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/sign.py +0 -0
  105. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/ssh/__init__.py +0 -0
  106. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/ssh/export.py +0 -0
  107. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/status.py +0 -0
  108. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/time.py +0 -0
  109. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/vc/__init__.py +0 -0
  110. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/vc/create.py +0 -0
  111. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/vc/export.py +0 -0
  112. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/vc/list.py +0 -0
  113. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/vc/registry/__init__.py +0 -0
  114. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/vc/registry/incept.py +0 -0
  115. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/vc/registry/list.py +0 -0
  116. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/vc/registry/status.py +0 -0
  117. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/vc/revoke.py +0 -0
  118. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/verify.py +0 -0
  119. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/version.py +0 -0
  120. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/witness/__init__.py +0 -0
  121. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/witness/demo.py +0 -0
  122. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/witness/start.py +0 -0
  123. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/commands/witness/submit.py +0 -0
  124. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/common/__init__.py +0 -0
  125. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/common/config.py +0 -0
  126. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/common/displaying.py +0 -0
  127. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/common/existing.py +0 -0
  128. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/common/incepting.py +0 -0
  129. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/common/rotating.py +0 -0
  130. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/common/terming.py +0 -0
  131. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/cli/kli.py +0 -0
  132. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/configing.py +0 -0
  133. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/connecting.py +0 -0
  134. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/delegating.py +0 -0
  135. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/directing.py +0 -0
  136. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/forwarding.py +0 -0
  137. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/grouping.py +0 -0
  138. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/httping.py +0 -0
  139. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/keeping.py +0 -0
  140. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/notifying.py +0 -0
  141. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/querying.py +0 -0
  142. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/signaling.py +0 -0
  143. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/signing.py +0 -0
  144. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/specing.py +0 -0
  145. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/app/storing.py +0 -0
  146. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/core/routing.py +0 -0
  147. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/core/scheming.py +0 -0
  148. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/core/serdering.py +0 -0
  149. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/core/signing.py +0 -0
  150. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/db/__init__.py +0 -0
  151. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/db/dbing.py +0 -0
  152. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/db/koming.py +0 -0
  153. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/db/migrations/__init__.py +0 -0
  154. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/db/migrations/rekey_habs.py +0 -0
  155. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/db/subing.py +0 -0
  156. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/demo/__init__.py +0 -0
  157. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/demo/demo_bob.py +0 -0
  158. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/demo/demo_eve.py +0 -0
  159. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/demo/demo_kev.py +0 -0
  160. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/demo/demo_sam.py +0 -0
  161. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/demo/demoing.py +0 -0
  162. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/end/__init__.py +0 -0
  163. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/end/priming.py +0 -0
  164. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/help/__init__.py +0 -0
  165. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/peer/__init__.py +0 -0
  166. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/peer/exchanging.py +0 -0
  167. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/vc/__init__.py +0 -0
  168. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/vc/protocoling.py +0 -0
  169. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/vc/proving.py +0 -0
  170. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/vc/walleting.py +0 -0
  171. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/vdr/__init__.py +0 -0
  172. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/vdr/credentialing.py +0 -0
  173. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/vdr/verifying.py +0 -0
  174. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri/vdr/viring.py +0 -0
  175. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri.egg-info/dependency_links.txt +0 -0
  176. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri.egg-info/entry_points.txt +0 -0
  177. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri.egg-info/not-zip-safe +0 -0
  178. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri.egg-info/requires.txt +0 -0
  179. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/src/keri.egg-info/top_level.txt +0 -0
  180. {keri-1.2.0.dev1 → keri-1.2.0.dev2}/tests/test_kering.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: keri
3
- Version: 1.2.0.dev1
3
+ Version: 1.2.0.dev2
4
4
  Summary: Key Event Receipt Infrastructure
5
5
  Home-page: https://github.com/WebOfTrust/keripy
6
6
  Author: Samuel M. Smith
@@ -37,7 +37,7 @@ from os.path import splitext
37
37
  from setuptools import find_packages, setup
38
38
  setup(
39
39
  name='keri',
40
- version='1.2.0-dev1', # also change in src/keri/__init__.py
40
+ version='1.2.0-dev2', # also change in src/keri/__init__.py
41
41
  license='Apache Software License 2.0',
42
42
  description='Key Event Receipt Infrastructure',
43
43
  long_description="KERI Decentralized Key Management Infrastructure",
@@ -0,0 +1,5 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ __version__ = '1.2.0-dev2' # also change in setup.py
4
+
5
+
@@ -7,7 +7,7 @@ import argparse
7
7
 
8
8
  from hio.base import doing
9
9
 
10
- from keri.core import coring
10
+ from keri.core import signing
11
11
 
12
12
  parser = argparse.ArgumentParser(description='Reply to IPEX offer message acknowledged willingness to accept offered '
13
13
  'credential')
@@ -23,4 +23,4 @@ def nonce(tymth, tock=0.0):
23
23
  """
24
24
  _ = (yield tock)
25
25
 
26
- print(coring.randomNonce())
26
+ print(signing.Salter().qb64)
@@ -7,7 +7,7 @@ import argparse
7
7
 
8
8
  from hio.base import doing
9
9
 
10
- from keri.core import coring
10
+ from keri.core import signing
11
11
 
12
12
  parser = argparse.ArgumentParser(description='Request a credential from another party by initiating an IPEX exchange')
13
13
  parser.set_defaults(handler=lambda args: handler(args))
@@ -22,4 +22,4 @@ def nonce(tymth, tock=0.0):
22
22
  """
23
23
  _ = (yield tock)
24
24
 
25
- print(coring.randomNonce())
25
+ print(signing.Salter().qb64)
@@ -8,6 +8,7 @@ keri.kli.commands module
8
8
  import argparse
9
9
  import datetime
10
10
  import os
11
+ import json
11
12
  import sys
12
13
 
13
14
  from hio import help
@@ -199,6 +200,12 @@ class ListDoer(doing.DoDoer):
199
200
  if response is not None:
200
201
  print(f" Response: {responseType} ({response.qb64})")
201
202
 
203
+ if self.verbose:
204
+ bsad = json.dumps(sad, indent=2)
205
+ print(" Full Credential:")
206
+ for line in bsad.splitlines():
207
+ print(f"\t{line}")
208
+
202
209
  def apply(self, note, exn, pathed):
203
210
  pass
204
211
 
@@ -7,7 +7,7 @@ import argparse
7
7
 
8
8
  from hio.base import doing
9
9
 
10
- from keri.core import coring
10
+ from keri.core import signing
11
11
 
12
12
  parser = argparse.ArgumentParser(description='Reply to IPEX apply message or initiate an IPEX exchange with an offer'
13
13
  ' for a credential with certain characteristics')
@@ -23,4 +23,4 @@ def nonce(tymth, tock=0.0):
23
23
  """
24
24
  _ = (yield tock)
25
25
 
26
- print(coring.randomNonce())
26
+ print(signing.Salter().qb64)
@@ -8,7 +8,7 @@ import argparse
8
8
  import pysodium
9
9
  from hio.base import doing
10
10
 
11
- from keri.core import coring
11
+ from keri.core import signing
12
12
 
13
13
  parser = argparse.ArgumentParser(description='Print a new random nonce')
14
14
  parser.set_defaults(handler=lambda args: handler(args))
@@ -23,4 +23,4 @@ def nonce(tymth, tock=0.0):
23
23
  """
24
24
  _ = (yield tock)
25
25
 
26
- print(coring.randomNonce())
26
+ print(signing.Salter().qb64)
@@ -0,0 +1,6 @@
1
+ # -*- encoding: utf-8 -*-
2
+ """
3
+ KERI
4
+ keri.app.cli.commands.watcher Package
5
+ """
6
+
@@ -0,0 +1,132 @@
1
+ # -*- encoding: utf-8 -*-
2
+ """
3
+ KERI
4
+ keri.kli.commands module
5
+
6
+ """
7
+ import argparse
8
+
9
+ from hio import help
10
+ from hio.base import doing
11
+
12
+ from keri.app import connecting, habbing, forwarding
13
+ from keri.app.cli.common import existing
14
+ from keri.core import eventing, serdering
15
+
16
+ logger = help.ogler.getLogger()
17
+
18
+ parser = argparse.ArgumentParser(description='Add AID or Alias to list of AIDs for a watcher to watch')
19
+ parser.set_defaults(handler=lambda args: add(args),
20
+ transferable=True)
21
+ parser.add_argument('--name', '-n', help='keystore name and file location of KERI keystore', required=True)
22
+ parser.add_argument('--alias', '-a', help='human readable alias for the identifier to whom the credential was issued',
23
+ required=True)
24
+ parser.add_argument('--base', '-b', help='additional optional prefix to file location of KERI keystore',
25
+ required=False, default="")
26
+ parser.add_argument('--passcode', '-p', help='22 character encryption passcode for keystore (is not saved)',
27
+ dest="bran", default=None) # passcode => bran
28
+ parser.add_argument("--watcher", '-w', help="the watcher AID or alias to add to", required=True)
29
+ parser.add_argument("--watched", '-W', help="the watched AID or alias to add")
30
+
31
+
32
+ def add(args):
33
+ """ Command line handler for adding an aid to a watcher's list of AIds to watch
34
+
35
+ Parameters:
36
+ args(Namespace): parsed command line arguments
37
+
38
+ """
39
+
40
+ ed = AddDoer(name=args.name,
41
+ alias=args.alias,
42
+ base=args.base,
43
+ bran=args.bran,
44
+ watcher=args.watcher,
45
+ watched=args.watched)
46
+ return [ed]
47
+
48
+
49
+ class AddDoer(doing.DoDoer):
50
+
51
+ def __init__(self, name, alias, base, bran, watcher, watched):
52
+ self.hby = existing.setupHby(name=name, base=base, bran=bran)
53
+ self.hab = self.hby.habByName(alias)
54
+ self.org = connecting.Organizer(hby=self.hby)
55
+
56
+ if watcher in self.hby.kevers:
57
+ wat = watcher
58
+ else:
59
+ wat = self.org.find("alias", watcher)
60
+ if len(wat) != 1:
61
+ raise ValueError(f"invalid recipient {watcher}")
62
+ wat = wat[0]['id']
63
+
64
+ if not wat:
65
+ raise ValueError(f"unknown watcher {watcher}")
66
+
67
+ if watched in self.hby.kevers:
68
+ watd = watched
69
+ else:
70
+ watd = self.org.find("alias", watched)
71
+ if len(watd) != 1:
72
+ raise ValueError(f"invalid recipient {watched}")
73
+ watd = watd[0]['id']
74
+
75
+ if not watd:
76
+ raise ValueError(f"unknown watched {watched}")
77
+
78
+ self.watcher = wat
79
+ self.watched = watd
80
+
81
+ self.oobi = None
82
+ for (key,), obr in self.hby.db.roobi.getItemIter():
83
+ if obr.cid == watd:
84
+ self.oobi = key
85
+
86
+ if not self.oobi:
87
+ raise ValueError(f"no valid oobi for watched {self.watched}")
88
+
89
+ doers = [doing.doify(self.addDo)]
90
+
91
+ super(AddDoer, self).__init__(doers=doers)
92
+
93
+ def addDo(self, tymth, tock=0.0):
94
+ """ Grant credential by creating /ipex/grant exn message
95
+
96
+ Parameters:
97
+ tymth (function): injected function wrapper closure returned by .tymen() of
98
+ Tymist instance. Calling tymth() returns associated Tymist .tyme.
99
+ tock (float): injected initial tock value
100
+
101
+ Returns: doifiable Doist compatible generator method
102
+
103
+ """
104
+ # enter context
105
+ self.wind(tymth)
106
+ self.tock = tock
107
+ _ = (yield self.tock)
108
+
109
+ if isinstance(self.hab, habbing.GroupHab):
110
+ raise ValueError("watchers for multisig AIDs not currently supported")
111
+
112
+ postman = forwarding.StreamPoster(hby=self.hby, hab=self.hab, recp=self.watcher, topic="reply")
113
+ for msg in self.hab.db.clonePreIter(pre=self.hab.pre):
114
+ serder = serdering.SerderKERI(raw=msg)
115
+ postman.send(serder=serder, attachment=msg[serder.size:])
116
+
117
+ data = dict(cid=self.hab.pre,
118
+ wid=self.watched,
119
+ oobi=self.oobi)
120
+
121
+ route = "/watcher/aid/add"
122
+ msg = self.hab.reply(route=route, data=data)
123
+ rpy = serdering.SerderKERI(raw=msg)
124
+ postman.send(serder=rpy, attachment=msg[rpy.size:])
125
+
126
+ doer = doing.DoDoer(doers=postman.deliver())
127
+ self.extend([doer])
128
+
129
+ while not doer.done:
130
+ yield self.tock
131
+
132
+ print(f"Request to add {self.watched} to watcher {self.watcher} submitted.")
@@ -35,7 +35,10 @@ parser.add_argument("--witness", '-w', help="the witness AID or alias to authent
35
35
 
36
36
 
37
37
  def auth(args):
38
- """ Command line list credential registries handler
38
+ """ Command line handler for authenticating against a witness by retrieving the secret or a TOTP
39
+
40
+ Parameters:
41
+ args(Namespace): parsed command line arguments
39
42
 
40
43
  """
41
44
 
@@ -65,7 +68,7 @@ class AuthDoer(doing.DoDoer):
65
68
  if not wit:
66
69
  raise ValueError(f"unknown witness {witness}")
67
70
 
68
- self.witness = witness
71
+ self.witness = wit
69
72
  self.clienter = httping.Clienter()
70
73
  doers = [doing.doify(self.authDo), self.clienter]
71
74
 
@@ -2077,7 +2077,7 @@ class BaseHab:
2077
2077
  """
2078
2078
  while cues: # iteratively process each cue in cues
2079
2079
  msgs = bytearray()
2080
- cue = cues.pull() #cues.popleft()
2080
+ cue = cues.pull() # cues.popleft()
2081
2081
  cueKin = cue["kin"] # type or kind of cue
2082
2082
 
2083
2083
  if cueKin in ("receipt",): # cue to receipt a received event from other pre
@@ -40,6 +40,7 @@ def setupWitness(hby, alias="witness", mbx=None, aids=None, tcpPort=5631, httpPo
40
40
  Setup witness controller and doers
41
41
 
42
42
  """
43
+ host = "0.0.0.0"
43
44
  cues = decking.Deck()
44
45
  doers = []
45
46
 
@@ -87,7 +88,7 @@ def setupWitness(hby, alias="witness", mbx=None, aids=None, tcpPort=5631, httpPo
87
88
  receiptEnd = ReceiptEnd(hab=hab, inbound=cues, aids=aids)
88
89
  app.add_route("/receipts", receiptEnd)
89
90
 
90
- server = createHttpServer(httpPort, app, keypath, certpath, cafilepath)
91
+ server = createHttpServer(host, httpPort, app, keypath, certpath, cafilepath)
91
92
  if not server.reopen():
92
93
  raise RuntimeError(f"cannot create http server on port {httpPort}")
93
94
  httpServerDoer = http.ServerDoer(server=server)
@@ -112,10 +113,11 @@ def setupWitness(hby, alias="witness", mbx=None, aids=None, tcpPort=5631, httpPo
112
113
  return doers
113
114
 
114
115
 
115
- def createHttpServer(port, app, keypath=None, certpath=None, cafilepath=None):
116
+ def createHttpServer(host, port, app, keypath=None, certpath=None, cafilepath=None):
116
117
  """
117
118
  Create an HTTP or HTTPS server depending on whether TLS key material is present
118
119
  Parameters:
120
+ host(str) : host to bind to for this server, or None for default of '0.0.0.0', all ifaces
119
121
  port (int) : port to listen on for all HTTP(s) server instances
120
122
  app (falcon.App) : application instance to pass to the http.Server instance
121
123
  keypath (string) : the file path to the TLS private key
@@ -130,9 +132,9 @@ def createHttpServer(port, app, keypath=None, certpath=None, cafilepath=None):
130
132
  certpath=certpath,
131
133
  cafilepath=cafilepath,
132
134
  port=port)
133
- server = http.Server(port=port, app=app, servant=servant)
135
+ server = http.Server(host=host, port=port, app=app, servant=servant)
134
136
  else:
135
- server = http.Server(port=port, app=app)
137
+ server = http.Server(host=host, port=port, app=app)
136
138
  return server
137
139
 
138
140
 
@@ -246,7 +248,7 @@ class WitnessStart(doing.DoDoer):
246
248
 
247
249
  while True:
248
250
  while self.cues:
249
- cue = self.cues.pull() # self.cues.popleft()
251
+ cue = self.cues.pull() # self.cues.popleft()
250
252
  cueKin = cue["kin"]
251
253
  if cueKin == "stream":
252
254
  self.queries.append(cue)
@@ -13,18 +13,18 @@ from urllib.parse import urlparse
13
13
  import falcon
14
14
  from hio.base import doing
15
15
  from hio.help import decking
16
- from keri.core import coring
17
16
 
17
+ from keri.core import coring
18
18
  from . import httping
19
- from .habbing import GroupHab
20
19
  from .. import help
21
20
  from .. import kering
22
- from ..app import forwarding, connecting
21
+ from ..app import connecting
23
22
  from ..core import routing, eventing, parsing, scheming, serdering
24
23
  from ..db import basing
25
24
  from ..end import ending
26
25
  from ..end.ending import OOBI_RE, DOOBI_RE
27
26
  from ..help import helping
27
+ from ..kering import Ilks, ValidationError, UnverifiedReplyError, ConfigurationError
28
28
  from ..peer import exchanging
29
29
 
30
30
  logger = help.ogler.getLogger()
@@ -276,7 +276,7 @@ class Oobiery:
276
276
 
277
277
  RetryDelay = 30
278
278
 
279
- def __init__(self, hby, clienter=None, cues=None):
279
+ def __init__(self, hby, rvy=None, clienter=None, cues=None):
280
280
  """ DoDoer to handle the request and parsing of OOBIs
281
281
 
282
282
  Parameters:
@@ -286,8 +286,14 @@ class Oobiery:
286
286
  """
287
287
 
288
288
  self.hby = hby
289
+ self.rvy = rvy
290
+ if self.rvy is not None:
291
+ self.registerReplyRoutes(self.rvy.rtr)
292
+
289
293
  self.clienter = clienter or httping.Clienter()
290
294
  self.org = connecting.Organizer(hby=self.hby)
295
+
296
+ # Set up a local parser for returned events from OOBI queries.
291
297
  rtr = routing.Router()
292
298
  rvy = routing.Revery(db=self.hby.db, rtr=rtr)
293
299
  kvy = eventing.Kevery(db=self.hby.db, lax=True, local=False, rvy=rvy)
@@ -298,6 +304,89 @@ class Oobiery:
298
304
  self.clients = dict()
299
305
  self.doers = [self.clienter, doing.doify(self.scoobiDo)]
300
306
 
307
+ def registerReplyRoutes(self, router):
308
+ """ Register the routes for processing messages embedded in `rpy` event messages
309
+
310
+ The Oobiery handles rpy messages with the /introduce route by processing the contained oobi
311
+
312
+ Parameters:
313
+ router(Router): reply message router
314
+
315
+ """
316
+ router.addRoute("/introduce", self)
317
+
318
+ def processReply(self, *, serder, saider, route, cigars=None, tsgs=None, **kwargs):
319
+ """
320
+ Process one reply message for route = /introduce
321
+ with either attached nontrans receipt couples in cigars or attached trans
322
+ indexed sig groups in tsgs.
323
+ Assumes already validated saider, dater, and route from serder.ked
324
+
325
+ Parameters:
326
+ serder (SerderKERI): instance of reply msg (SAD)
327
+ saider (Saider): instance from said in serder (SAD)
328
+ route (str): reply route
329
+ cigars (list): of Cigar instances that contain nontrans signing couple
330
+ signature in .raw and public key in .verfer
331
+ tsgs (list): tuples (quadruples) of form
332
+ (prefixer, seqner, diger, [sigers]) where:
333
+ prefixer is pre of trans endorser
334
+ seqner is sequence number of trans endorser's est evt for keys for sigs
335
+ diger is digest of trans endorser's est evt for keys for sigs
336
+ [sigers] is list of indexed sigs from trans endorser's keys from est evt
337
+
338
+ OobiRecord:
339
+ date: str = date time of reply message of the introduction
340
+
341
+ Reply Message:
342
+ {
343
+ "v" : "KERI10JSON00011c_",
344
+ "t" : "rpy",
345
+ "d": "EZ-i0d8JZAoTNZH3ULaU6JR2nmwyvYAfSVPzhzS6b5CM",
346
+ "dt": "2020-08-22T17:50:12.988921+00:00",
347
+ "r" : "/introduce",
348
+ "a" :
349
+ {
350
+ "cid": "ENcOes8_t2C7tck4X4j61fSm0sWkLbZrEZffq7mSn8On",
351
+ "oobi": "http://localhost:5632/oobi/ENcOes8_t2C7tck4X4j61fSm0sWkLbZrEZffq7mSn8On/witness",
352
+ }
353
+ }
354
+
355
+ """
356
+ if route != "/introduce":
357
+ raise ValidationError(f"Usupported route={route} in {Ilks.rpy} "
358
+ f"msg={serder.ked}.")
359
+
360
+ data = serder.ked['a']
361
+ dt = serder.ked["dt"]
362
+
363
+ for k in ("cid", "oobi"):
364
+ if k not in data:
365
+ raise ValidationError(f"Missing element={k} from attributes in"
366
+ f" {Ilks.rpy} msg={serder.ked}.")
367
+
368
+ cider = coring.Prefixer(qb64=data["cid"]) # raises error if unsupported code
369
+ cid = cider.qb64 # controller authorizing eid at role
370
+ aid = cid # authorizing attribution id
371
+
372
+ oobi = data["oobi"]
373
+ url = urlparse(oobi)
374
+ if url.scheme not in ("http", "https"):
375
+ raise ValidationError(f"Invalid url scheme for introduced OOBI scheme={url.scheme}")
376
+
377
+ if self.rvy is None:
378
+ raise ConfigurationError("this oobiery is not configured to handle rpy introductions")
379
+
380
+ # Process BADA RUN but with no previous reply message, always process introductions
381
+ accepted = self.rvy.acceptReply(serder=serder, saider=saider, route=route,
382
+ aid=aid, osaider=None, cigars=cigars,
383
+ tsgs=tsgs)
384
+ if not accepted:
385
+ raise UnverifiedReplyError(f"Unverified introduciton reply. {serder.ked}")
386
+
387
+ obr = basing.OobiRecord(cid=cid, date=dt)
388
+ self.hby.db.oobis.put(keys=(oobi,), val=obr)
389
+
301
390
  def scoobiDo(self, tymth=None, tock=0.0):
302
391
  """
303
392
  Returns doifiable Doist compatibile generator method (doer dog) to process
@@ -4,9 +4,6 @@ KERI
4
4
  keri.core Package
5
5
  """
6
6
 
7
- #__all__ = ["coring", "eventing", "parsing", "scheming"]
8
-
9
-
10
7
  # Constants etc
11
8
  from .coring import (Tiers, )
12
9
 
@@ -8,7 +8,7 @@ import json
8
8
  from typing import Union
9
9
  from collections import namedtuple, deque
10
10
  from collections.abc import Sequence, Mapping
11
- from dataclasses import dataclass, astuple
11
+ from dataclasses import dataclass, astuple, asdict
12
12
  from base64 import urlsafe_b64encode as encodeB64
13
13
  from base64 import urlsafe_b64decode as decodeB64
14
14
  from fractions import Fraction
@@ -184,24 +184,21 @@ def loads(raw, size=None, kind=Serials.json):
184
184
  return ked
185
185
 
186
186
 
187
- # ToDo: nonces only need 128 bits of entropy. a Salt is enough
188
- # Just use Salter().qb64.
189
187
  # Deprecated
188
+ # randomNonce() refactored to match Salter().qb64 and only used in coring to avoid circular dependencies
189
+ # use Salter().qb64 in other places
190
190
 
191
191
  def randomNonce():
192
- """ Generate a random ed25519 seed and encode as qb64
192
+ """ Generate a random 128 bits salt and encode as qb64
193
193
 
194
194
  Returns:
195
- str: qb64 encoded ed25519 random seed
195
+ str: qb64 encoded 128 bits random salt
196
196
  """
197
- preseed = pysodium.randombytes(pysodium.crypto_sign_SEEDBYTES)
198
- seedqb64 = Matter(raw=preseed, code=MtrDex.Ed25519_Seed).qb64
197
+ preseed = pysodium.randombytes(pysodium.crypto_pwhash_SALTBYTES)
198
+ seedqb64 = Matter(raw=preseed, code=MtrDex.Salt_128).qb64
199
199
  return seedqb64
200
200
 
201
201
 
202
-
203
-
204
-
205
202
  # secret derivation security tier
206
203
  Tierage = namedtuple("Tierage", 'low med high')
207
204
 
@@ -906,6 +903,9 @@ class Matter:
906
903
  '9AAE': Sizage(hs=4, ss=4, fs=None, ls=2),
907
904
  }
908
905
 
906
+ Codes = asdict(MtrDex) # map code name to code
907
+ Names = {val : key for key, val in Codes.items()} # invert map code to code name
908
+
909
909
 
910
910
 
911
911
  def __init__(self, raw=None, code=MtrDex.Ed25519N, soft='', rize=None,
@@ -1116,6 +1116,17 @@ class Matter:
1116
1116
  return self._code
1117
1117
 
1118
1118
 
1119
+ @property
1120
+ def name(self):
1121
+ """
1122
+ Returns:
1123
+ name (str): code name for self.code. Used for annotation for
1124
+ primitives like Matter
1125
+
1126
+ """
1127
+ return self.Names[self.code]
1128
+
1129
+
1119
1130
  @property
1120
1131
  def hard(self):
1121
1132
  """
@@ -1700,6 +1711,10 @@ class Number(Matter):
1700
1711
 
1701
1712
  Methods:
1702
1713
  """
1714
+ Codes = asdict(NumDex) # map code name to code
1715
+ Names = {val : key for key, val in Codes.items()} # invert map code to code name
1716
+
1717
+
1703
1718
 
1704
1719
  def __init__(self, raw=None, qb64b=None, qb64=None, qb2=None,
1705
1720
  code=None, num=None, numh=None, **kwa):
@@ -4797,73 +4812,6 @@ class Tholder:
4797
4812
 
4798
4813
 
4799
4814
 
4800
- class Streamer:
4801
- """
4802
- Streamer is CESR sniffable stream class
4803
-
4804
-
4805
- Has the following public properties:
4806
-
4807
- Properties:
4808
-
4809
-
4810
- Methods:
4811
-
4812
-
4813
- Hidden:
4814
-
4815
-
4816
-
4817
- """
4818
-
4819
- def __init__(self, stream):
4820
- """Initialize instance
4821
-
4822
-
4823
- Parameters:
4824
- stream (bytes | bytearray): sniffable CESR stream
4825
-
4826
-
4827
- """
4828
- self._stream = bytes(stream)
4829
-
4830
-
4831
- @property
4832
- def stream(self):
4833
- """stream property getter
4834
- """
4835
- return self._stream
4836
-
4837
- @property
4838
- def text(self):
4839
- """expanded stream as qb64 text
4840
- Returns:
4841
- stream (bytes): expanded text qb64 version of stream
4842
-
4843
- """
4844
- return self._stream
4845
-
4846
- @property
4847
- def binary(self):
4848
- """compacted stream as qb2 binary
4849
- Returns:
4850
- stream (bytes): compacted binary qb2 version of stream
4851
-
4852
- """
4853
- return self._stream
4854
-
4855
- @property
4856
- def texter(self):
4857
- """expanded stream as Texter instance
4858
- Returns:
4859
- texter (Texter): Texter primitive of stream suitable wrapping
4860
-
4861
- """
4862
- return self._stream
4863
-
4864
-
4865
-
4866
-
4867
4815
  class Sadder:
4868
4816
  """
4869
4817
  Sadder is self addressed data (SAD) serializer-deserializer class