blob: 6b730ec371415244e0f4f4b4dd6bddad22defc02 [file] [log] [blame]
// 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.google.crypto.tink.subtle.prf;
import java.io.InputStream;
/**
* Streaming API Interface for Pseudo Random Function (Prf)
*
* <h3>Security guarantees</h3>
*
* <p>Pseudorandom functions provide a mapping from an input to an output string which is
* indistinguishable from a pure random function.
*
* <p>In Tink, the pseudorandom interface produces a stream of pseudorandom bytes, from which the
* user can read. The resulting stream may be of (virtually) infinite length, producing bytes as
* long as the user reads from it, or it may produce a finite length stream of a certain length.
* More formally, ignoring timing, every implementation is indistinguishable in the input/output
* behavior from the following ideal implementation, for some length {@code LENGTH}.
* <pre>{@code
* public class IdealPRF {
* private Map<byte[], byte[]> cache = new ArrayMap<>();
* private static final int LENGTH = ...; // Any value; conceptually, Infinite would also be ok.
*
* public InputStream apply(final byte[] input) {
* if (!cache.containsKey(input)) {
* cache.put(input, Random.getBytes(LENGTH)));
* }
* return new ByteArrayInputStream(cache.get(input));
* }
* }
* }</pre>
*/
public interface StreamingPrf {
/**
* Returns an {@link InputStream} which is indistinguishable from a stream returning random bytes
* in the above sense.
*/
InputStream computePrf(final byte[] input);
}