File: RNGCryptoServiceProvider.cs

package info (click to toggle)
mono 1.2.2.1-1etch1
  • links: PTS
  • area: main
  • in suites: etch
  • size: 142,720 kB
  • ctags: 256,408
  • sloc: cs: 1,495,736; ansic: 249,442; sh: 18,327; xml: 12,463; makefile: 5,046; perl: 1,248; asm: 635; yacc: 285; sql: 7
file content (88 lines) | stat: -rw-r--r-- 1,805 bytes parent folder | download | duplicates (15)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
//
// Mono.Security.Cryptography.RNGCryptoServiceProvider
//
// Authors:
//	Sebastien Pouliot (spouliot@motus.com)
//
// Copyright (C) 2003 Motus Technologies Inc. (http://www.motus.com)
//

using System;
using System.Security.Cryptography;
using System.Text;

namespace Mono.Security.Cryptography {
	
public class RNGCryptoServiceProvider : RandomNumberGenerator {

	private CapiRandomNumberGenerator rng;
	private byte[] seed;

	public RNGCryptoServiceProvider () 
	{
		rng = new CapiRandomNumberGenerator ();
		seed = null;
	}

	public RNGCryptoServiceProvider (byte[] rgb) 
	{
		rng = new CapiRandomNumberGenerator ();
		seed = rgb;
	}

	public RNGCryptoServiceProvider (CspParameters cspParams) 
	{
		rng = new CapiRandomNumberGenerator (cspParams);
		seed = null;
	}

	public RNGCryptoServiceProvider (string str) 
	{
		rng = new CapiRandomNumberGenerator ();
		seed = Encoding.Default.GetBytes (str);
	}

	~RNGCryptoServiceProvider () 
	{
		// zeroize seed
		if (seed != null)
			Array.Clear (seed, 0, seed.Length);
		// release unmanaged resources
		rng.Dispose ();
	}

	public override void GetBytes (byte[] data) 
	{
		if (data == null)
			throw new ArgumentNullException ("data");

		// send the seed
		if (seed != null)
			rng.GenRandom (seed);	
		// note: by doing this seed is modified each time

		rng.GenRandom (data);

		// generate random
		if (!rng.Result)
			throw new CryptographicException (rng.Error);
	}

	public override void GetNonZeroBytes (byte[] data) 
	{
		byte[] random = new byte [data.Length * 2];
		int i = 0;
		// one pass should be enough but hey this is random ;-)
		while (i < data.Length) {
			GetBytes (random);
			for (int j=0; j < random.Length; j++) {
				if (i == data.Length)
					break;
				if (random [j] != 0)
					data [i++] = random [j];
			}
		}
	}
}

}