Projects: Include libsodium (#1051)

Add libsodium fuzzers.

Add secret_key_auth_fuzzer and secretbox_easy_fuzzer targets from libsodium.
This commit is contained in:
Chris Wolfe 2018-01-17 10:13:47 -06:00 committed by jonathanmetzman
parent c8fa101330
commit 2a4963cffb
6 changed files with 154 additions and 0 deletions

View File

@ -0,0 +1,22 @@
# Copyright 2018 Google Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
################################################################################
FROM gcr.io/oss-fuzz-base/base-builder
MAINTAINER chriswwolfe@gmail.com
RUN apt-get update && apt-get install -y make
RUN git clone --depth 1 https://github.com/jedisct1/libsodium.git --branch stable libsodium
WORKDIR libsodium
COPY build.sh *.cc *.h $SRC/

28
projects/libsodium/build.sh Executable file
View File

@ -0,0 +1,28 @@
#!/bin/bash -eu
# Copyright 2018 Google Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
################################################################################
# build project
./configure --prefix="$WORK" --disable-shared --enable-static LDFLAGS="$CXXFLAGS"
make -j$(nproc) all
# build fuzzers
for f in $SRC/*_fuzzer.cc; do
fuzzer=$(basename "$f" _fuzzer.cc)
$CXX $CXXFLAGS -std=c++11 -I"$WORK/include" \
"$f" -o "$OUT/${fuzzer}_fuzzer" \
"$WORK/lib/libsodium.a" -lFuzzingEngine
done

View File

@ -0,0 +1,51 @@
#ifndef FAKE_RANDOM_H_
#define FAKE_RANDOM_H_
#include <sodium.h>
#include <assert.h>
#include <stdint.h>
#include <string.h>
#include <algorithm>
static const unsigned char * SEED_DATA;
static size_t SEED_SIZE;
static const char *
fake_implementation_name(void) {
return "fake_random";
}
static void
fake_random_buffer(void * const buf, const size_t size) {
static unsigned char seed[randombytes_SEEDBYTES];
memset(seed, '0', randombytes_SEEDBYTES);
size_t boundary = std::min((size_t) randombytes_SEEDBYTES, SEED_SIZE);
memcpy(&seed, SEED_DATA, boundary);
randombytes_buf_deterministic(buf, size, seed);
}
struct randombytes_implementation fake_random = {
.implementation_name = fake_implementation_name,
.random = NULL,
.stir = NULL,
.uniform = NULL,
.buf = fake_random_buffer,
.close = NULL
};
void
setup_fake_random(const unsigned char * seed, const size_t seed_size) {
SEED_DATA = seed;
SEED_SIZE = seed_size;
int fake_random_set = randombytes_set_implementation(&fake_random);
assert(fake_random_set == 0);
assert(randombytes_implementation_name() == "fake_random");
int initialized = sodium_init();
assert(initialized >= 0);
}
#endif // FAKE_RANDOM_H_

View File

@ -0,0 +1,4 @@
homepage: "https://libsodium.org"
primary_contact: "ossfuzzz+sodium@gmail.com"
auto_ccs:
- "chriswwolfe@gmail.com"

View File

@ -0,0 +1,21 @@
#include <assert.h>
#include <sodium.h>
#include "fake_random.h"
extern "C" int LLVMFuzzerTestOneInput(const unsigned char *data, size_t size) {
int initialized = sodium_init();
assert(initialized >= 0);
setup_fake_random(data, size);
unsigned char key[crypto_auth_KEYBYTES];
unsigned char mac[crypto_auth_BYTES];
// this uses a deterministic generator
crypto_auth_keygen(key);
crypto_auth(mac, data, size, key);
crypto_auth_verify(mac, data, size, key);
return 0;
}

View File

@ -0,0 +1,28 @@
#include <assert.h>
#include <sodium.h>
#include "fake_random.h"
extern "C" int LLVMFuzzerTestOneInput(const unsigned char *data, size_t size) {
int initialized = sodium_init();
assert(initialized >= 0);
setup_fake_random(data, size);
unsigned char key[crypto_secretbox_KEYBYTES];
unsigned char nonce[crypto_secretbox_NONCEBYTES];
// these use a deterministic generator
crypto_secretbox_keygen(key);
randombytes_buf(nonce, sizeof nonce);
size_t ciphertext_len = crypto_secretbox_MACBYTES + size;
unsigned char ciphertext[ciphertext_len];
crypto_secretbox_easy(ciphertext, data, size, nonce, key);
unsigned char decrypted[size];
crypto_secretbox_open_easy(decrypted, ciphertext, ciphertext_len, nonce, key);
return 0;
}