summaryrefslogtreecommitdiff
path: root/csrand
diff options
context:
space:
mode:
authorYawning Angel <yawning@schwanenlied.me>2014-05-24 04:47:10 +0000
committerYawning Angel <yawning@schwanenlied.me>2014-05-24 04:47:10 +0000
commitb3f0f51775ae2e19c62c70e15f77ef991ad4bb49 (patch)
tree0a779fe20ffead1e8a87ba209ac566829c7ce93a /csrand
parente77ddddf4d10dbd3387c2e4714c287c546c70512 (diff)
Move utils.go to csrand/csrand.go, and clean up the interface.
All of the obfs4 code except unit tests now uses the csrand wrapper routines.
Diffstat (limited to 'csrand')
-rw-r--r--csrand/csrand.go97
1 files changed, 97 insertions, 0 deletions
diff --git a/csrand/csrand.go b/csrand/csrand.go
new file mode 100644
index 0000000..1700b02
--- /dev/null
+++ b/csrand/csrand.go
@@ -0,0 +1,97 @@
+/*
+ * Copyright (c) 2014, Yawning Angel <yawning at torproject dot org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+// Package csrand implements the math/rand interface over crypto/rand, along
+// with some utility functions for common random number/byte related tasks.
+//
+// Not all of the convinience routines are replicated, only those that are
+// useful for obfs4. The CsRand variable provides access to the full math/rand
+// API.
+package csrand
+
+import (
+ cryptRand "crypto/rand"
+ "fmt"
+ "math/big"
+ "math/rand"
+)
+
+var (
+ csRandSourceInstance csRandSource
+
+ // CsRand is a math/rand instance backed by crypto/rand CSPRNG.
+ CsRand = rand.New(csRandSourceInstance)
+)
+
+type csRandSource struct {
+ // This does not keep any state as it is backed by crypto/rand.
+}
+
+func (r csRandSource) Int63() int64 {
+ ret, err := cryptRand.Int(cryptRand.Reader, big.NewInt(int64((1<<63)-1)))
+ if err != nil {
+ panic(err)
+ }
+
+ return ret.Int64()
+}
+
+func (r csRandSource) Seed(seed int64) {
+ // No-op.
+}
+
+// Float64 returns, as a float 64, a pesudo random number in [0.0,1.0).
+func Float64() float64 {
+ return CsRand.Float64()
+}
+
+// IntRange returns a uniformly distributed int [min, max].
+func IntRange(min, max int) int {
+ if max < min {
+ panic(fmt.Sprintf("IntRange: min > max (%d, %d)", min, max))
+ }
+
+ r := (max + 1) - min
+ ret := CsRand.Intn(r)
+ return ret + min
+}
+
+// Bytes fills the slice with random data.
+func Bytes(buf []byte) error {
+ n, err := cryptRand.Read(buf)
+ if err != nil {
+ // Yes, the go idiom is to check the length, but we panic() when it
+ // does not match because the system is screwed at that point.
+ return err
+ } else if n != len(buf) {
+ panic(fmt.Sprintf("Bytes: truncated rand.Read (%d, %d)", n, len(buf)))
+ }
+
+ return nil
+}
+
+/* vim :set ts=4 sw=4 sts=4 noet : */