#include <stddef.h>
#include <stdio.h>
#include <string.h>
#include <assert.h>

// 100MiB
#define BUF_SIZE (100*1024*1024)
unsigned char buf[BUF_SIZE];

const char* header="-----BEGIN OPENSSH PRIVATE KEY-----\n";
size_t header_size=36;
const char* footer="-----END OPENSSH PRIVATE KEY-----\n";
size_t footer_size=34;

int main(int argc, char* argv[])
{
    assert (argc==2);
    int dump_count=0;
    FILE* hdl=fopen(argv[1], "rb");
    assert (hdl!=NULL);
    for (long pos=0; ; pos+=(BUF_SIZE-4096))
    {
        printf ("pos=%ld or ~%ldGiB or ~%ldGB\n", pos, pos/0x40000000, pos/(1000*1000*1000));
        int rt=fseek(hdl, pos, SEEK_SET);
        assert (rt!=-1);
        size_t buf_read=fread(buf, 1, BUF_SIZE, hdl);

        void* ptr1=memmem(buf, buf_read, header, header_size);
        if (ptr1!=NULL)
        {
            ptrdiff_t ofs=ptr1-(void*)buf;
            void* ptr2=memmem(ptr1, buf_read-ofs, footer, footer_size);
            if (ptr2!=NULL)
            {
                size_t dump_size=(ptr2-ptr1)+footer_size;
                char fname[128];
                snprintf(fname, sizeof(fname), "dump_%d_pos_%ld", dump_count, pos+ofs);
                dump_count++;
                FILE* f2=fopen(fname, "wb");
                assert (f2!=NULL);
                fwrite(ptr1, dump_size, 1, f2);
                fclose(f2);
                printf ("Something found. Dumped: %s, size %ld\n", fname, dump_size);
            };
        };

        if (buf_read<BUF_SIZE)
            break;
    };
}

/* vi: set sw=4 ts=4: */

