2 // Mono.Security.Cryptography.RNGCryptoServiceProvider
5 // Sebastien Pouliot (spouliot@motus.com)
7 // Copyright (C) 2003 Motus Technologies Inc. (http://www.motus.com)
11 using System.Security.Cryptography;
14 namespace Mono.Security.Cryptography {
16 public class RNGCryptoServiceProvider : RandomNumberGenerator {
18 private CapiRandomNumberGenerator rng;
21 public RNGCryptoServiceProvider ()
23 rng = new CapiRandomNumberGenerator ();
27 public RNGCryptoServiceProvider (byte[] rgb)
29 rng = new CapiRandomNumberGenerator ();
33 public RNGCryptoServiceProvider (CspParameters cspParams)
35 rng = new CapiRandomNumberGenerator (cspParams);
39 public RNGCryptoServiceProvider (string str)
41 rng = new CapiRandomNumberGenerator ();
42 seed = Encoding.Default.GetBytes (str);
45 ~RNGCryptoServiceProvider ()
49 Array.Clear (seed, 0, seed.Length);
50 // release unmanaged resources
54 public override void GetBytes (byte[] data)
57 throw new ArgumentNullException ("data");
62 // note: by doing this seed is modified each time
68 throw new CryptographicException (rng.Error);
71 public override void GetNonZeroBytes (byte[] data)
73 byte[] random = new byte [data.Length * 2];
75 // one pass should be enough but hey this is random ;-)
76 while (i < data.Length) {
78 for (int j=0; j < random.Length; j++) {
82 data [i++] = random [j];