NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: kern/44539: opencrypto DEFLATE compression output is not correctly terminated



Here is the test program. It compresses some data using opencrypto
and decompresses it with userland zlib.
It fails with current sources and succeeds after the patch in the PR
is applied.
(needs eg. "sysctl -w kern.cryptodevallowsoft=0" for permission)


------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------
Forschungszentrum Juelich GmbH
52425 Juelich
Sitz der Gesellschaft: Juelich
Eingetragen im Handelsregister des Amtsgerichts Dueren Nr. HR B 3498
Vorsitzender des Aufsichtsrats: MinDirig Dr. Karl Eugen Huthmacher
Geschaeftsfuehrung: Prof. Dr. Achim Bachem (Vorsitzender),
Dr. Ulrich Krafft (stellv. Vorsitzender), Prof. Dr.-Ing. Harald Bolt,
Prof. Dr. Sebastian M. Schmidt
------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/time.h>
#include <crypto/cryptodev.h>
#include <string.h>
#include <err.h>
#include <zlib.h>

char text[10000] = {0};

int
main()
{
        int fd, res;
        struct session_op cs;
        struct crypt_op co1;
        unsigned char buf1[10000], buf2[10000];
        z_stream z;

        fd = open("/dev/crypto", O_RDWR, 0);
        if (fd < 0)
                err(1, "open");
        memset(&cs, 0, sizeof(cs));
        cs.comp_alg = CRYPTO_DEFLATE_COMP;
        res = ioctl(fd, CIOCGSESSION, &cs);
        if (res < 0)
                err(1, "CIOCGSESSION");

        memset(&co1, 0, sizeof(co1));
        co1.ses = cs.ses;
        co1.op = COP_COMP;
        co1.len = sizeof(text);
        co1.src = text;
        co1.dst = buf1;
        co1.dst_len = sizeof(buf1);
        res = ioctl(fd, CIOCCRYPT, &co1);
        if (res < 0)
                err(1, "CIOCCRYPT");

        memset(&z, 0, sizeof(z));
        z.next_in = buf1;
        z.avail_in = co1.dst_len;
        z.zalloc = Z_NULL;
        z.zfree = Z_NULL;
        z.opaque = 0;
        z.next_out = buf2;
        z.avail_out = sizeof(buf2);
        res = inflateInit2(&z, -15);
        if (res != Z_OK)
                errx(1, "inflateInit: %d", res);
        do {
                res = inflate(&z, Z_SYNC_FLUSH);
        } while (res == Z_OK);
        if (res != Z_STREAM_END)
                errx(1, "inflate: %d", res);
        if (z.total_out != sizeof(text))
                errx(1, "decomp len %lu", z.total_out);
        if (memcmp(buf2, text, sizeof(text)))
                errx(1, "decomp data mismatch");
        return 0;
}


Home | Main Index | Thread Index | Old Index