diff options
Diffstat (limited to 'agent/src/main/java/com/code_intelligence/jazzer/instrumentor/DeterministicRandom.kt')
-rw-r--r-- | agent/src/main/java/com/code_intelligence/jazzer/instrumentor/DeterministicRandom.kt | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/agent/src/main/java/com/code_intelligence/jazzer/instrumentor/DeterministicRandom.kt b/agent/src/main/java/com/code_intelligence/jazzer/instrumentor/DeterministicRandom.kt new file mode 100644 index 00000000..d4210dc4 --- /dev/null +++ b/agent/src/main/java/com/code_intelligence/jazzer/instrumentor/DeterministicRandom.kt @@ -0,0 +1,35 @@ +// Copyright 2021 Code Intelligence GmbH +// +// 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. + +package com.code_intelligence.jazzer.instrumentor + +import java.security.MessageDigest +import java.security.SecureRandom + +// This RNG is resistant to collisions (even under XOR) but fully deterministic. +internal class DeterministicRandom(vararg contexts: String) { + private val random = SecureRandom.getInstance("SHA1PRNG").apply { + val contextHash = MessageDigest.getInstance("SHA-256").run { + for (context in contexts) { + update(context.toByteArray()) + } + digest() + } + setSeed(contextHash) + } + + fun nextInt(bound: Int) = random.nextInt(bound) + + fun nextInt() = random.nextInt() +} |