chiark / gitweb /
Mark Wooding [Thu, 26 Sep 2019 03:45:38 +0000 (04:45 +0100)]
@@@ crypto-test strings
Mark Wooding [Thu, 26 Sep 2019 03:45:18 +0000 (04:45 +0100)]
@@@ 64-bit kludging
Mark Wooding [Thu, 26 Sep 2019 03:45:01 +0000 (04:45 +0100)]
@@@ test copyright dates
Mark Wooding [Thu, 26 Sep 2019 03:44:27 +0000 (04:44 +0100)]
Mark Wooding [Thu, 26 Sep 2019 03:43:26 +0000 (04:43 +0100)]
Update crypto code from Catacomb 2.5.0.
This change committed automatically by `import-catacomb-crypto'.
* Import updated `keccak1600.c' from upstream `symm/keccak1600.c'.
* Import updated `sha3.c' from upstream `symm/sha3.c'.
Detailed list of changes:
* no upstream changes: import-catacomb-crypto patch for keccak1600 and
sha3
Upstream-Revision:
ad7da99a043dab9addc7fce6b22b30f12c7676e6
Mark Wooding [Thu, 26 Sep 2019 03:43:00 +0000 (04:43 +0100)]
@@@ import-catacomb-crypto keccak/sha3
Mark Wooding [Wed, 25 Sep 2019 20:13:09 +0000 (21:13 +0100)]
Mark Wooding [Wed, 25 Sep 2019 19:38:06 +0000 (20:38 +0100)]
@@@ crypto-test
Mark Wooding [Wed, 25 Sep 2019 19:37:08 +0000 (20:37 +0100)]
@@@ fake-mlib-bits
Mark Wooding [Wed, 25 Sep 2019 22:07:32 +0000 (23:07 +0100)]
Update crypto code from Catacomb 2.5.0.
This change committed automatically by `import-catacomb-crypto'.
* Import new `
ed25519-tests.in' from upstream `pub/t/
ed25519.djb' and
`pub/t/
ed25519.local'.
* Import new `
ed25519.c' from upstream `pub/
ed25519.c'.
* Import new `
ed25519.h' from upstream `pub/
ed25519.h'.
* Import new `ed448-tests.in' from upstream `pub/t/ed448'.
* Import new `ed448.c' from upstream `pub/ed448.c'.
* Import new `ed448.h' from upstream `pub/ed448.h'.
* Import updated `f25519-tests.in' from upstream `math/t/f25519'.
* Import updated `f25519.c' from upstream `math/f25519.c'.
* Import updated `f25519.h' from upstream `math/f25519.h'.
* Import updated `fgoldi-tests.in' from upstream `math/t/fgoldi'.
* Import updated `fgoldi.c' from upstream `math/fgoldi.c'.
* Import updated `fgoldi.h' from upstream `math/fgoldi.h'.
* Import new `keccak1600-tests.in' from upstream `symm/t/keccak1600'.
* Import new `keccak1600.c' from upstream `symm/keccak1600.c'.
* Import new `keccak1600.h' from upstream `symm/keccak1600.h'.
* Import new `scaf.c' from upstream `math/scaf.c'.
* Import new `scaf.h' from upstream `math/scaf.h'.
* Import new `scmul.h' from upstream `math/scmul.h'.
* Import new `sha3-tests.in' from upstream
`symm/t/SHA3_224LongMsg.rsp', `symm/t/SHA3_224Monte.rsp',
`symm/t/SHA3_224ShortMsg.rsp', `symm/t/SHA3_256LongMsg.rsp',
`symm/t/SHA3_256Monte.rsp', `symm/t/SHA3_256ShortMsg.rsp',
`symm/t/SHA3_384LongMsg.rsp', `symm/t/SHA3_384Monte.rsp',
`symm/t/SHA3_384ShortMsg.rsp', `symm/t/SHA3_512LongMsg.rsp',
`symm/t/SHA3_512Monte.rsp', `symm/t/SHA3_512ShortMsg.rsp',
`symm/t/SHAKE128LongMsg.rsp', `symm/t/SHAKE128ShortMsg.rsp',
`symm/t/SHAKE128VariableOut.rsp', `symm/t/SHAKE256LongMsg.rsp',
`symm/t/SHAKE256ShortMsg.rsp', `symm/t/SHAKE256VariableOut.rsp', and
`symm/t/sha3.local'.
* Import new `sha3.c' from upstream `symm/sha3.c'.
* Import new `sha3.h' from upstream `symm/sha3.h'.
* Import updated `x25519-tests.in' from upstream `pub/t/x25519'.
* Import new `x25519.slow-tests.in' from upstream `pub/t/x25519.slow'.
* Import updated `x448-tests.in' from upstream `pub/t/x448'.
* Import updated `x448.h' from upstream `pub/x448.h'.
* Import new `x448.slow-tests.in' from upstream `pub/t/x448.slow'.
Detailed list of changes:
commit
f521d4c7a97076db34681c598d7965c7d05713b0
Author: Mark Wooding <mdw@distorted.org.uk>
Date: Wed, 10 May 2017 21:01:03 +0100
math/f{25519,goldi}.[ch]: Export the piece type.
math/f25519.c | 6 ++++--
math/f25519.h | 7 +++++++
math/fgoldi.c | 6 ++++--
math/fgoldi.h | 7 +++++++
4 files changed, 22 insertions(+), 4 deletions(-)
commit
e830bb692041c75eb29b8c511db21af81b3aae2d
Author: Mark Wooding <mdw@distorted.org.uk>
Date: Mon, 1 May 2017 01:38:30 +0100
math/f25519.c, utils/curve25519.sage: Slightly improve `quosqrt' algorithm.
The algorithm from the Bernstein et al. paper was somewhat ugly.
Replace it with a different one using the techniques I used in `fgoldi'
for the main calculation, but with the same end structure.
math/f25519.c | 102 ++++++++++++++++++++++++++++++----------------------------
1 file changed, 53 insertions(+), 49 deletions(-)
commit
1bc00e2a032fa3899ed734f6cfeab88e9000041d
Author: Mark Wooding <mdw@distorted.org.uk>
Date: Mon, 1 May 2017 01:38:30 +0100
math/fgoldi.[ch]: Implement the extra operations needed for Ed448.
math/fgoldi.c | 289 ++++++++++++++++++++++++++++
math/fgoldi.h | 77 ++++++++
math/t/fgoldi | 607 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 973 insertions(+)
commit
c578d5d85b11f004c151948684ca5753a5ac5962
Author: Mark Wooding <mdw@distorted.org.uk>
Date: Wed, 10 May 2017 21:58:36 +0100
pub/ed448.[ch], etc.: Add the Ed448 signature scheme from RFC8032.
pub/x448.h | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
commit
1e4c26653e52aa4c4b06e345617135a6ff271ab5
Author: Mark Wooding <mdw@distorted.org.uk>
Date: Thu, 19 Oct 2017 19:35:23 +0100
pub/t/x*: Rearrange the Monte-Carlo tests.
* Insert more intermediate values, specifically at every power of 10.
* Rather than calculating the whole thing from scratch each time,
tests other than the first one continue from the previous
state (which I had to calculate the hard way and enter into the
test-vector files). The total iteration count and final results
still match the RFC.
* Split the very slow high-iteration-count tests into a separate file,
where they can be run discretionally without having to edit source
files. Arrange to distribute these new files.
pub/t/x25519 | 15 ++++++++-------
pub/t/x448 | 15 ++++++++-------
2 files changed, 16 insertions(+), 14 deletions(-)
commit
89bd399d7d3fdeb58f7a442bcd139b707e08e8d0
Author: Mark Wooding <mdw@distorted.org.uk>
Date: Fri, 1 Mar 2019 12:21:16 +0000
math/f25519.c, math/fgoldi.c: Remove some unused constant definitions.
math/f25519.c | 2 --
math/fgoldi.c | 4 ----
2 files changed, 6 deletions(-)
commit
68012cc7915db546ea09027d41c1360e3a5921c0
Author: Mark Wooding <mdw@distorted.org.uk>
Date: Fri, 1 Mar 2019 12:21:38 +0000
math/f25519.c: Order 10-bit constants the same as 26-bit constants.
math/f25519.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
Upstream-Revision:
ad7da99a043dab9addc7fce6b22b30f12c7676e6
Mark Wooding [Wed, 25 Sep 2019 11:07:17 +0000 (12:07 +0100)]
@@@ import-catacomb-crypto wip
Mark Wooding [Wed, 25 Sep 2019 10:44:59 +0000 (11:44 +0100)]
Update crypto code from Catacomb 2.3.0.1-45-g9c14.
* Imported new `test-import/f25519-tests.in', from upstream
`math/t/f25519'.
* Imported new `test-import/f25519.c', from upstream `math/f25519.c'.
* Imported new `test-import/f25519.h', from upstream `math/f25519.h'.
* Imported new `test-import/fgoldi-tests.in', from upstream
`math/t/fgoldi'.
* Imported new `test-import/fgoldi.c', from upstream `math/fgoldi.c'.
* Imported new `test-import/fgoldi.h', from upstream `math/fgoldi.h'.
* Imported new `test-import/montladder.h', from upstream
`math/montladder.h'.
* Imported new `test-import/qfarith.h', from upstream `math/qfarith.h'.
* Imported new `test-import/x25519-tests.in', from upstream
`pub/t/x25519'.
* Imported new `test-import/x25519.c', from upstream `pub/x25519.c'.
* Imported new `test-import/x25519.h', from upstream `pub/x25519.h'.
* Imported new `test-import/x448-tests.in', from upstream `pub/t/x448'.
* Imported new `test-import/x448.c', from upstream `pub/x448.c'.
* Imported new `test-import/x448.h', from upstream `pub/x448.h'.
Upstream-Revision:
9c1437f372e62f0b3b3a7162aabee73bdc96ce4b
Mark Wooding [Wed, 25 Sep 2019 19:16:24 +0000 (20:16 +0100)]
@@@ delete old catcomb import
Mark Wooding [Sat, 29 Apr 2017 12:55:40 +0000 (13:55 +0100)]
@@@ testing
Mark Wooding [Fri, 28 Apr 2017 21:51:36 +0000 (22:51 +0100)]
make-secnet-sites: Make the `dh' property be listish, and add XDH groups.
Also add these to `mdw-test/sites' to test the new functionality.
Signed-off-by: Mark Wooding <mdw@distorted.org.uk>
Mark Wooding [Fri, 28 Apr 2017 21:51:36 +0000 (22:51 +0100)]
xdh.c: New module defining elliptic curve Diffie--Hellman functions.
This provides X25519 and X448 as premade Diffie--Hellman closures. They
should be used directly rather than applied to arguments.
Signed-off-by: Mark Wooding <mdw@distorted.org.uk>
Mark Wooding [Sat, 29 Apr 2017 12:55:40 +0000 (13:55 +0100)]
Hack on the newly imported X25519 and X448 code.
I've tried to touch the code as little as possible to integrate it with
the rest of Secnet. I've limited myself to:
* adding Secnet notices and GPL-mandated notices;
* removing definitions which obviously won't work;
* removing code which is unnecessary given Secnet's less ambitious
portability objectives; and
* providing substitutes for some of the support types and macros
assumed by the original implementation, in particular a fake version
of <mLib/bits.h>.
I've also written a new test driver for the field and curve arithmetic,
and reformatted the test vectors, though the data remains the same.
The code builds and passes the tests.
Signed-off-by: Mark Wooding <mdw@distorted.org.uk>
Mark Wooding [Wed, 26 Apr 2017 10:53:05 +0000 (11:53 +0100)]
Import implementations of X25519 and X448 from Catacomb.
Taken from https://git.distorted.org.uk/~mdw/catacomb/, commit-id
9c1437f372e62f0b3b3a7162aabee73bdc96ce4b.
These are just the raw files from upstream. Don't try to build them,
because they have all sorts of dependencies on the rest of the library.
But at least this way I can record the hacking I did to integrate them
into Secnet.
The test vector files were originally called things like
`math/t/f25519': I've renamed them here because otherwise they'd briefly
introduce directories or have very unhelpful names. They'll need
radically reformatting anyway, because the test-vector parser didn't
come along for the ride.
Signed-off-by: Mark Wooding <mdw@distorted.org.uk>
Mark Wooding [Wed, 26 Apr 2017 10:53:05 +0000 (11:53 +0100)]
unaligned.h: Add macros for reading and writing little-endian 32-bit words.
Signed-off-by: Mark Wooding <mdw@distorted.org.uk>
Mark Wooding [Fri, 28 Apr 2017 21:51:36 +0000 (22:51 +0100)]
Adjust the DH closure protocol to handle public values as raw binary.
Responsibility for hex-encoding the public value now lies with the
individual DH group implementation, rather than the common site-level
machinery.
Signed-off-by: Mark Wooding <mdw@distorted.org.uk>
Mark Wooding [Sat, 29 Apr 2017 12:55:40 +0000 (13:55 +0100)]
Introduce negotiation for Diffie--Hellman groups.
For the most part, this slots into the space previously prepared for
it. However, there are a few subtleties.
The most significant one is that existing Secnets don't pay attention to
the high 16 cap bits. To bring them into availability, we introduce a
signalling system. If bit 15 is set, then
* all of the bits are scanned for capabilities, and
* it is expected that sender has advertised its DH groups explicitly.
If the bit is clear, then we have the old situation:
* firstly, only the low 16 bits are scanned for transform cap bits,
and
* secondly, it is assumed that the sender only implements traditional
integer Diffie--Hellman, cap 10, with some appropriately determined
group.
We also set the explicit bit if one of the high capability bits is set.
As part of this, add a parameter to the `diffie-hellman' closure to
configure its advertised group cap.
Signed-off-by: Mark Wooding <mdw@distorted.org.uk>
Mark Wooding [Sat, 29 Apr 2017 12:55:40 +0000 (13:55 +0100)]
site.c: Allocate and free the Diffie--Hellman secret buffers each time.
This will allow us to maybe use a different Diffie--Hellman group, with
different size requirements, to communicate with the same peer at a
later time. We can't do this yet, of course, but the negotiation
machinery is coming soon.
Signed-off-by: Mark Wooding <mdw@distorted.org.uk>
Mark Wooding [Sat, 29 Apr 2017 12:55:40 +0000 (13:55 +0100)]
site.c: Abstract out generation of the Diffie--Hellman private secret.
I want to make this more complicated, so it makes sense to have the
logic in one place.
Signed-off-by: Mark Wooding <mdw@distorted.org.uk>
Mark Wooding [Sat, 29 Apr 2017 12:55:40 +0000 (13:55 +0100)]
dh.c, secnet.8: Allow `diffie-hellman' to take a dictionary of arguments.
I want to add more optional arguments to this, but it'll get rather
unwieldy.
Signed-off-by: Mark Wooding <mdw@distorted.org.uk>
Mark Wooding [Sat, 29 Apr 2017 12:55:40 +0000 (13:55 +0100)]
site.c: Pass the length of the actual shared secret to the transform.
The `set_new_transform' function used to grow its `sharedsecret' buffer
to accommodate the chosen transform's desired key length, and then tells
the transform that this is the size of its secret.
Unfortunately this is pretty much a lie. In particular, the traditional
DH closure doesn't actually do anything to fill the rest of the buffer
with random stuff. Probably there ought to be a KDF here, but:
* we can't introduce a KDF globally without breaking compatibility
with old clients; and
* the new EAX-based transform has its own cheap-and-cheerful (but
effective) SHA512-based KDF baked into it.
Anyway, the result is that, if the DH group produces short shared
secrets, and the transform has an explicit key size it wants, then
everything will seem to work right up until the transform tries to use
uninitialized memory as key material. Then the good news is that the
two sites likely end up using different keys and can't talk to each
other. The /bad/ news is that their keys don't have enough entropy, and
an adversary may be able to impersonate them to each other.
We're probably not in this situation yet. We have two transforms and
one DH group type. One transform has its own KDF, so is unaffected by
this. The other, the old `serpent256-cbc (or is it `serpent-cbc256'?)
transform, wants 608 bits (76 bytes) of key. It gets these directly
from the big-endian base-256 encoded DH shared secret, so we OK unless
the DH field is smaller than 608 bits. But if it is then you have other
problems.
Surprisingly, the fix is for the site code to ignore the transform's
reported key size entirely. It tells the transform the size of the
shared secret, and if the transform is unhappy then it can fail or apply
a KDF by itself.
Of course, now we're doing this, there's no need for the transform to
advertise a desired key length, so remove this. Also, this means that
the shared secret buffer isn't going to change size any more, so we can
remove all of the machinery for that, too.
Signed-off-by: Mark Wooding <mdw@distorted.org.uk>
Mark Wooding [Sat, 29 Apr 2017 12:55:40 +0000 (13:55 +0100)]
Change our view of the Diffie--Hellman closure protocol.
Rename `len' to `secret_len' and `ceil_len' to `shared_len', and label
these as the required private secret length and generated shared-secret
length respectively. There's no functional change: that's what these
variables were being used for anyway.
Signed-off-by: Mark Wooding <mdw@distorted.org.uk>
Mark Wooding [Wed, 26 Apr 2017 10:53:05 +0000 (11:53 +0100)]
site.c, dh.c, secnet.h: Allow the dh `makeshared' method to fail.
The only current implementation still can't, and won't, but change the
interface to acknowledge the possibility, and fix callers to propagate
failures.
Signed-off-by: Mark Wooding <mdw@distorted.org.uk>
Mark Wooding [Fri, 28 Apr 2017 21:51:44 +0000 (22:51 +0100)]
sha512.c, etc.: Provide `sha512' as a hash function for signing.
SHA-1 is really creaky these days, though to be fair its use in Secnet
does not depend on collision resistance.
Modify `mdw-test/sites' to allow selection of SHA512.
Signed-off-by: Mark Wooding <mdw@distorted.org.uk>
Mark Wooding [Fri, 28 Apr 2017 21:51:36 +0000 (22:51 +0100)]
sha512.[ch]: Remove a bunch of unused code.
Signed-off-by: Mark Wooding <mdw@distorted.org.uk>
Mark Wooding [Fri, 28 Apr 2017 21:51:36 +0000 (22:51 +0100)]
mdw-test/: Include some random utilities I've found handy for testing.
This allows setting up of a network of multiple Secnets on a single
machine, by an unprivileged user. See `mdw-test/README' for more
information.
Signed-off-by: Mark Wooding <mdw@distorted.org.uk>
Ian Jackson [Sat, 7 Dec 2019 16:05:37 +0000 (16:05 +0000)]
stest: Add test for load-private
The resulting interface for privkey() is a bit odd: it's either a list
of a string, and we look at both ends. Ah well, it's only test code.
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Ian Jackson [Sat, 7 Dec 2019 16:30:17 +0000 (16:30 +0000)]
load-private: Use cfgfile_log, not system_log
Otherwise if this goes wrong, we segfault, because system_log is in
fact not available this early.
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Ian Jackson [Sat, 7 Dec 2019 14:25:53 +0000 (14:25 +0000)]
secnet: Provide `load-private' verb
This allows the config file to specify the use of the scheme loadpriv
call with an arbitrary private key file and algorithm, without having
to enable the private key negotiation system.
This is the private key counterpart to
secnet: Provide `make-public' verb
Like the first provision of `make-public', there is a bug: we use
system_log for reporting errors, but that is not set up until after
the configuration is read. So errors turn into segfaults. We will
fix that in a moment.
Aside from that, with this change, new public key schemes can just
provide an entry in the sigschemes table. They do not need to (and
should not) define their own toplevel config bindings.
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Ian Jackson [Sat, 7 Dec 2019 16:31:08 +0000 (16:31 +0000)]
privcache: Break out DEFAULT_MAXPRIV_BYTES
We're going to reuse this.
No functional change.
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Ian Jackson [Sat, 7 Dec 2019 14:57:04 +0000 (14:57 +0000)]
secnet: loadpriv interface: Return a closure_t too
We are going to want this for the `load-private' verb.
This is the private key counterpart to:
secnet: loadpub interface: Return a closure_t too
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Ian Jackson [Sat, 7 Dec 2019 15:41:06 +0000 (15:41 +0000)]
privcache: Minor style fixes
We had some unconventional-for-secnet whitespace around `='.
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Ian Jackson [Sat, 7 Dec 2019 14:49:50 +0000 (14:49 +0000)]
privcache: Regularise error handling in missing defhash case
Now it is clearer to see that we don't leak sigpriv;
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Ian Jackson [Sat, 7 Dec 2019 14:43:54 +0000 (14:43 +0000)]
privcache; uncached_load_file: Introduce error_out
The error handling here is a bit fragile: we rely on not having set
`ok' inappropriately. Indeed actually we *do* set `ok'
inappropriately if we lack defhash, but in that case we set sigpriv to
0 so do return 0 as needed. So we are fixing a latent bug.
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Ian Jackson [Sat, 7 Dec 2019 14:19:44 +0000 (14:19 +0000)]
CL_GET_STR_ARG: Move into util.h
Move this handy macro from pubkeys.c so that we can reuse it.
(And rename it appropriately.)
No functional change.
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Ian Jackson [Sat, 7 Dec 2019 14:13:24 +0000 (14:13 +0000)]
privcache: Break out uncached_load_file
We are going to want to reuse this to make a new entrypoint.
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Ian Jackson [Sat, 7 Dec 2019 14:04:58 +0000 (14:04 +0000)]
privcache: Transpose scheme lookup and file opening
This makes no real difference, except that it provides a different
error message if both things are wrong.
This new odrering is more consistent with a change we are about to
make.
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Ian Jackson [Sat, 7 Dec 2019 14:02:49 +0000 (14:02 +0000)]
privcache: uncached_get: Introduce `databuf' local
This is a bit more convenient and will also make a future commit much
easier too read.
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Ian Jackson [Sat, 7 Dec 2019 14:01:57 +0000 (14:01 +0000)]
privcache: uncached_get: Introduce `defhash' local
This is a bit more convenient and will also make a future commit much
easier too read.
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Ian Jackson [Sat, 7 Dec 2019 13:01:32 +0000 (13:01 +0000)]
privcache: uncached_get: Introduce `path' local
This is a bit more convenient and will also make a future commit much
easier too read.
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Ian Jackson [Thu, 5 Dec 2019 01:24:02 +0000 (01:24 +0000)]
stest/t-Cnonnego-onr: New test
Check that the new site can initiate key exchange when talking to a
old one, as well as vice versa.
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Ian Jackson [Thu, 5 Dec 2019 01:23:16 +0000 (01:23 +0000)]
stest: Make it possible to have kex initiated by `outside'
Introduce new `initiator' variable. No functional change (other than
to messages) with existing tests.
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Ian Jackson [Thu, 5 Dec 2019 00:58:16 +0000 (00:58 +0000)]
sest/t-Cnonnego-on: New test
See if we can do key exchange with an older secnet, if the user has
told us where to find one to try it with.
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Ian Jackson [Thu, 5 Dec 2019 00:58:10 +0000 (00:58 +0000)]
stest: Machinery for runing an old secnet if a test wants
Tests can now set oldsecnet(SITE).
Old secnets want a "filename" key in their log config.
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Ian Jackson [Fri, 6 Dec 2019 23:00:53 +0000 (23:00 +0000)]
test-common: Framework for compatibility tests
Now normal tests must start with a letter. Ones starting with C
require OLD_SECNET_DIR. (Right now that must be both source and build
dir because it's tedious to have to distinguish them and pass both.)
Update comprehensive-test to (i) notice if the user forgot to set
this (ii) make it into an absolute path. Note that comprehensive-test
therefore has a different default to `make check': If OLD_SECNET_DIR
is not set, `make check' will do none of those tests, but
comprehensive-test will complain (and wants "" to disable those
tests).
We do not need to print this variable in our debugging output about
how we are running secnet (or how the user who specifies _DIVERT_=i
should run it).
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Ian Jackson [Thu, 5 Dec 2019 01:18:26 +0000 (01:18 +0000)]
test-common: Use $(wildcard ) rather than $(shell echo )
This is probably a bit faster, but more relevantly it would DTRT if
for some reason there were no applicable tests. Which is going to
happen in a moment, when we add some machinery before the applicable
test.
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Ian Jackson [Wed, 4 Dec 2019 22:06:37 +0000 (22:06 +0000)]
mtest/t-filter: New test for --filter mode
Checked the output with
env -u LESS git-diff --color --word-diff -w :test-example/sites :mtest/e-filter.sites
and it looks right.
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Ian Jackson [Wed, 4 Dec 2019 16:56:31 +0000 (16:56 +0000)]
make-secnet-sites: Provide --filter mode
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Ian Jackson [Wed, 4 Dec 2019 16:54:59 +0000 (16:54 +0000)]
README.make-secnet-sites: Slightly restructure mode docs
This will make it easier to add a new mode.
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Ian Jackson [Wed, 4 Dec 2019 16:51:52 +0000 (16:51 +0000)]
make-secnet-sites: OpConf: Move positional_args to OpBase
This is actually a general-purpose input/output file handler.
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Ian Jackson [Wed, 4 Dec 2019 16:50:48 +0000 (16:50 +0000)]
make-secnet-sites: OpUserv: Rename sitesfile to outputfile
This is not entirely right for OpUserv because OpUserv reads it too.
But this is going to make sense when we reuse more of OpBase.
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Ian Jackson [Wed, 4 Dec 2019 16:44:58 +0000 (16:44 +0000)]
make-secnet-sites: OpBase.write_out: Move heading back into OpUserv
This relies on self.user, and in more general cases we want the output
to be reproducible so don't want the time either.
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Ian Jackson [Wed, 4 Dec 2019 16:42:46 +0000 (16:42 +0000)]
make-secnet-sites: OpBase.write_out: Tolerate sitesfile is None
This will let us write to stdout. The only user right now is OpUserv
which always sets sitesfile so no functional change yet.
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Ian Jackson [Wed, 4 Dec 2019 16:38:02 +0000 (16:38 +0000)]
make-secnet-sites: Abolish now-obsolete `service' variable
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Ian Jackson [Wed, 4 Dec 2019 16:35:44 +0000 (16:35 +0000)]
make-secnet-sites: Provide explicit --conf mode option
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Ian Jackson [Wed, 4 Dec 2019 16:33:52 +0000 (16:33 +0000)]
make-secnet-sites: OpBase.read_in: save read lines
We are going to use this for a new filtering mode.
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Ian Jackson [Wed, 4 Dec 2019 16:32:41 +0000 (16:32 +0000)]
make-secnet-sites: Move sites file writing into OpBase
We provide a callback for the contents.
This is in OpBase rather than OpUserv because we are going to want to
reuse it.
No functional change.
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Ian Jackson [Wed, 4 Dec 2019 16:19:23 +0000 (16:19 +0000)]
make-secnet-sites: Refactor operational code into OpModes
Everywhere we had conditionals on `service', move the two arms of the
if into methods on OpConf and OpUserv (of which we make one
singleton).
Many global variables become instance variables on the OpMode object.
The read_in method of OpConf is in OpBase because we are going to want
to reuse it.
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Ian Jackson [Wed, 4 Dec 2019 16:06:58 +0000 (16:06 +0000)]
make-secnet-sites: Introduce new OpMod classes
This is going to replace the use of the `service' boolean.
Mode-specific functionality will be moved into these classes.
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Ian Jackson [Tue, 3 Dec 2019 23:33:16 +0000 (23:33 +0000)]
stest/t-nonnego-oo: Use `make-public' verb
This was previously untested. It is awkward to get make-secnet-sites
to generate this right now because it wants to generate `rsa-public'
calls for rsa1 keys for compatibility reasons.
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Ian Jackson [Tue, 3 Dec 2019 23:26:20 +0000 (23:26 +0000)]
stest: Honour new sitesconf_hook
This lets individual tests fiddle with the sites.conf.
By default, we provide a proc that does nothing.
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Ian Jackson [Sun, 1 Dec 2019 14:00:41 +0000 (14:00 +0000)]
mtest: Use --pubkeys-elide instead of --output-version
We don't want our basic tests of make-secnet-sites to produce an
artificially old output version.
But also it's not really convenient for these tests to make a pubkeys
directory. (That functionality is tested by test-example's sites.conf
generator and stest's uses of the resulting pubkeys directory.)
So use --pubkeys-elide, conveniently producing a test case for that
option, which we were previously lacking.
Because we don't pass --pubkeys-dir, the result is that the output
paths contain the default pubkeys directory. That's OK.
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Ian Jackson [Wed, 4 Dec 2019 21:54:31 +0000 (21:54 +0000)]
stest: Fix an entry in &DEPS
We don't want to refer to all-privkeys, actually. This is a phony
target and causes needless rebuilds (well, retests).
Instead, depend on the now-provided $(test-example_PRIVKEYS).
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Ian Jackson [Wed, 4 Dec 2019 21:58:54 +0000 (21:58 +0000)]
test-example: all-privkeys: Define, and indirect through, a variable
This seems more natural. Also it provides a variable
$(test-example_PRIVKEYS) which can be used elsewhere. (We are in fact
going to want that.)
One resulting change is that now the keys in *.privkeys/ are part of
&TARGETS too.
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Ian Jackson [Sat, 16 Nov 2019 17:39:50 +0000 (17:39 +0000)]
test-example: Test new long-term key arrangements
Finally we can test this!
Specifically, we switch the defaults to the privkeys directories,
which affects the existing t-basic-kex test. We introduce two new
tests for testing the old arrangements.
The consequences for the t-basic-kex test are:
* Use the sites file generated with --install-pubkeys, thus
testing the new make-secnet-sites.
* Use peer-keys, so testing secnet's new pubkey loading
mechanisms.
* Use priv-cache, so testing secnet's new privkey loading
mechanisms.
* Test the new public key choice negotation mechanism.
The old tests tests the compatibility of the key choice negotiation
mechanism, as well as the capability to generate
old-style (compatible) sites.conf files.
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Ian Jackson [Tue, 3 Dec 2019 20:45:43 +0000 (20:45 +0000)]
test-example: Generate new style sites.conf
The key change here is to make the `normal' test-exampple/sites.conf
file be new-style, with peer-keys entries.
We also switch the tests to use the old-style file. So the tests in
fact run just as before.
The directory we give to make-secnet-sites is already mkdir'd, and
cleaned, appropriately.
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Ian Jackson [Tue, 3 Dec 2019 21:52:07 +0000 (21:52 +0000)]
test-example: Make sites.conf variable, in principle
In this commit we split the setting of the sites.conf into two
branches depending on the value of privkey($site). The path prefix
is common - only the leafname varies.
Right now there isn't actually any change because both branches use
the same sites.conf. The new-style arrangement needs a new-style
sites file which isn't there yet.
So no functional change.
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Ian Jackson [Fri, 8 Nov 2019 20:09:39 +0000 (20:09 +0000)]
test-example: Provide a new-style public key set for site outside
With --output-version=1, this produces the same output.
The base91 data here is the output of
base91s/base91s -w0 <test-example/rsa1-sites2.key.pub
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Ian Jackson [Sun, 1 Dec 2019 11:35:02 +0000 (11:35 +0000)]
tests: Pass --output-version=1 to make-secnet-sites
We are going to introduce some new public keys in the sites file but
for now we don't want to change the sites.conf output. This is what
--output-version is for.
Later we will relegate this to compatibility tests, and make the new
approach the default.
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Ian Jackson [Tue, 3 Dec 2019 21:03:46 +0000 (21:03 +0000)]
stest: Honour new privkey() hash
If set to a path not ending in /, it refers to a key file, and we
generate the "rsa-private" call. With the default value, this
produces the same path as before.
But now it can be set to a directory ending in /, in which case we
specify a priv-cache.
No functional change yet.
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Ian Jackson [Tue, 3 Dec 2019 21:00:24 +0000 (21:00 +0000)]
stest: Provide a global `hash' key
This is mostly going to be for the benefit of priv-cache, which we are
going to start using. But putting it at the top level seems sensible.
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Ian Jackson [Tue, 3 Dec 2019 20:56:42 +0000 (20:56 +0000)]
stest: Transfer pubkeys from test-example
We are going to have tests which use the peer-keys site config key,
which refers to external key files from a pubkeys directory. In the
case of stest, these are pubkeys from test-example.
Because secnet may rename files etc. in this directory, we need a
private one per test. So, for each test, when making the config file,
make a copy of the pubkeys directory. Of course this means that
directory needs to exist, so mkdir it (and clean it), although the
machinery for populating it doesn't exist yet.
Also, when copying the sites.conf file, adjust references to
test-example to refer to the copy. (Currently there won't be any such
references.)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Ian Jackson [Sat, 16 Nov 2019 15:50:49 +0000 (15:50 +0000)]
test-example: Add a 2nd rsa1 key
We add it to the build rules so we install it in privkeys, and so on,
but right now we don't do anything with it.
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Ian Jackson [Sun, 24 Nov 2019 00:28:38 +0000 (00:28 +0000)]
test-example: Add the inside.key to the privcache too
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Ian Jackson [Sat, 23 Nov 2019 18:55:20 +0000 (18:55 +0000)]
test-example: Make privkeys by default
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Ian Jackson [Mon, 2 Dec 2019 13:45:16 +0000 (13:45 +0000)]
test-example: Rules for making a privkeys directory
This generates a directory suitable for use with the priv-cache
closure. Nothing uses it yet.
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Ian Jackson [Fri, 8 Nov 2019 23:32:31 +0000 (23:32 +0000)]
make-secnet-sites: Declare `pubkey' directive old
In help output and error messages.
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Ian Jackson [Sun, 1 Dec 2019 21:41:01 +0000 (21:41 +0000)]
make-secnet-sites: New --pubkeys-elide mode
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Ian Jackson [Sun, 1 Dec 2019 12:45:15 +0000 (12:45 +0000)]
make-secnet-sites: Rework --pubkeys-MODE, provide --pubkeys-single
Replace the open-coded ifs in sitelevel's sites.conf writer and public
key installation code with calls to a class which manages the
behaviour.
This provides a new --pubkeys-single option which does what
--no-pubkeys-install would have done if it were permitted.
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Ian Jackson [Sun, 1 Dec 2019 17:38:31 +0000 (17:38 +0000)]
make-secnet-sites: Rework with new `inpub' class
The use of k.forsites(,None,) was rather unprincipled and required a
strange comment. Instead, invent a `forpub' method for this use.
`forsites' can be implemented, for these classes, in terms of forpub.
Likewise testing whether the return from forsites was []; replace that
with an okforonlykey method. (The implementation uses the same trick
but now it's inside the class.)
We transpose the if `pubkeys_install' with the `for k' loop. The `not
pubkeys_install' arm is rather different now, accumulating in outk.
The one nontrivial consquence is that now if there are multiple
eligible keys to be written to a sites.conf, we fail, rather than just
choosing the first.
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Ian Jackson [Sun, 1 Dec 2019 17:55:32 +0000 (17:55 +0000)]
make-secnet-sites: In v1 output, ignore keys for non-0 groups
This helps makes us conform to the spec in NOTES.
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Ian Jackson [Sun, 1 Dec 2019 17:55:09 +0000 (17:55 +0000)]
make-secnet-sites: Support `pkg' and `pkgf'
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Ian Jackson [Sun, 1 Dec 2019 17:54:03 +0000 (17:54 +0000)]
make-secnet-sites: Support `serial'
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Ian Jackson [Sat, 7 Dec 2019 17:37:41 +0000 (17:37 +0000)]
make-secnet-sites: Without --pubkeys-install, write appropriate key
Rather than hoping that the first thing in the list is appropriate,
write out the first *key* we come across.
This is needed because we are going to introduce into the 'pub' list
things that are not keys. We don't want to somehow try to write to a
.conf file something corresponding to `serial' or `pkg' or `pkgf'.
The `indefault' variable will tracks whether we are in the default
pubkey group. Right now we don't understand pubkey groups so it is
just `True'.
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Ian Jackson [Sun, 1 Dec 2019 16:53:01 +0000 (16:53 +0000)]
make-secnet-sites: New --pubkeys-install option
This diverts public keys from the sites.conf to the pubkeys directory
and uses the `peer-keys' conf key instead of `key'.
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Ian Jackson [Sun, 1 Dec 2019 16:51:24 +0000 (16:51 +0000)]
make-secnet-sites: Add new pubkeys-dir option, and pubkey paths
This is where we are going to store peer public keys for each site.
Nothing uses it yet.
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Ian Jackson [Sun, 1 Dec 2019 16:47:36 +0000 (16:47 +0000)]
make-secnet-sites: Handle `pub rsa1' properties specially
We construct these as a special kind of `rsakey' object, rather than
`pubkey' objects. This means they will be written out to sites files
the way rsa1 keys are: ie in v1, using `pubkey' rather than `pub' in
sites files and using the rsa-public verb rather than make-public.
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Ian Jackson [Sun, 1 Dec 2019 18:45:44 +0000 (18:45 +0000)]
make-secnet-sites: Write rsa1 keys as `pub rsa1 ...' in >=v2
This effectively deprecates the `pubkey' keyword, relegating it to a
compatibility feature.
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Ian Jackson [Sun, 1 Dec 2019 18:39:36 +0000 (18:39 +0000)]
make-secnet-sites: Do not use `copy' in pubkey forsites
We are going to make some new call sites which don't have a suitable
`copy' available.
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Ian Jackson [Sun, 1 Dec 2019 16:45:28 +0000 (16:45 +0000)]
make-secnet-sites: Do not write `pub' entries in v1 output
This introduces file version 2.
We document the ultimately intended meaning of version 2 even though
we don't implement all that yet. The remaining pieces are on their
way.
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Ian Jackson [Sat, 9 Nov 2019 00:13:52 +0000 (00:13 +0000)]
make-secnet-sites: Make the `pub' key name primary
No outward functional change.
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Ian Jackson [Sat, 9 Nov 2019 00:08:21 +0000 (00:08 +0000)]
make-secnet-sites: Support new `pub' directive
This is how we are going to support multiple public key algorithms.
Right now there is no backward-combinatibility support and no key
negotiation support.
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Ian Jackson [Sat, 9 Nov 2019 00:03:49 +0000 (00:03 +0000)]
make-secnet-sites: Prepare for multiple public key types
* Introduce a general base typee for public keys.
* Indirect public key object construction through a function
which is suitable for passing to listof(), and which will
despatch appropriately. This allows a heterogenous list.
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Ian Jackson [Fri, 29 Nov 2019 21:32:37 +0000 (21:32 +0000)]
make-secnet-sites: Provide `serial' property class
This will be used for public key groupids and key set ids.
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Ian Jackson [Sun, 1 Dec 2019 15:55:48 +0000 (15:55 +0000)]
make-secnet-sites: Provide ArgActionLambda
optparse has a helpful lambda facility, so you can pass a lambda
directly to add_argument. But optparse is deprecated so we are using
argparse, in which this facility was unaccountably removed.
Instead you have to subclass argparse.Action.
The resulting ArgActionLambda will still be a bit awkward to use but a
lot better than lifting what ought to be each lambda body into its own
subclass.
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Ian Jackson [Fri, 29 Nov 2019 20:07:45 +0000 (20:07 +0000)]
make-secnet-sites: Allow properties to control output to sites
When lines containing properties are being copied to an output sites
file, the property can now control what gets written.
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>