1/* Copyright (c) 1998,2011,2014 Apple Inc.  All Rights Reserved.
2 *
3 * NOTICE: USE OF THE MATERIALS ACCOMPANYING THIS NOTICE IS SUBJECT
4 * TO THE TERMS OF THE SIGNED "FAST ELLIPTIC ENCRYPTION (FEE) REFERENCE
5 * SOURCE CODE EVALUATION AGREEMENT" BETWEEN APPLE, INC. AND THE
6 * ORIGINAL LICENSEE THAT OBTAINED THESE MATERIALS FROM APPLE,
7 * INC.  ANY USE OF THESE MATERIALS NOT PERMITTED BY SUCH AGREEMENT WILL
8 * EXPOSE YOU TO LIABILITY.
9 ***************************************************************************
10 *
11 * NSRandomNumberGenerator.m
12 *
13 * Revision History
14 * ----------------
15 * 28 Mar 97 at Apple
16 *	Rewrote using feeRandom module.
17 * ??     96	Blaine Garst at NeXT
18 *	Created.
19 */
20
21/*
22 * Note: out _priv ivar is actually a feeRand pointer.
23 */
24
25#import <Foundation/Foundation.h>
26#import "NSRandomNumberGenerator.h"
27#import "feeRandom.h"
28#import "falloc.h"
29
30@implementation NSRandomNumberGenerator
31
32- init
33{
34	if(_priv == NULL) {
35		_priv = feeRandAlloc();
36	}
37	/*
38	 * else no need to re-init
39	 */
40	return self;
41}
42
43- initWithSeed:(unsigned)seed
44{
45	if(_priv != NULL) {
46		/*
47		 * Free & re-init to use new seed
48		 */
49		feeRandFree(_priv);
50	}
51	_priv = feeRandAllocWithSeed(seed);
52	return self;
53}
54
55- (unsigned)nextNumber
56{
57	if(_priv == NULL) {
58		return 0;
59	}
60	return feeRandNextNum(_priv);
61}
62
63- (unsigned)nextNumberInRange:(NSRange)range
64{
65	if(_priv == NULL) {
66		return 0;
67	}
68    	return range.location + ([self nextNumber] % range.length);
69}
70
71- (NSData *)randomDataWithLength:(unsigned)l
72{
73	unsigned char *cp;
74
75	if(_priv == NULL) {
76		return nil;
77	}
78	cp = fmalloc(l);
79	feeRandBytes(_priv, cp, l);
80	return [NSData dataWithBytesNoCopy:cp length:l];
81}
82
83@end
84