// Reset generates a new distribution with the same min/max based on a new // seed. func (w *WeightedDist) Reset(seed *drbg.Seed) { // Initialize the deterministic random number generator. drbg, _ := drbg.NewHashDrbg(seed) rng := rand.New(drbg) w.Lock() defer w.Unlock() w.genValues(rng) if w.biased { w.genBiasedWeights(rng) } else { w.genUniformWeights(rng) } w.genTables() }
// NewDecoder creates a new Decoder instance. It must be supplied a slice // containing exactly KeyLength bytes of keying material. func NewDecoder(key []byte) *Decoder { if len(key) != KeyLength { panic(fmt.Sprintf("BUG: Invalid decoder key length: %d", len(key))) } decoder := new(Decoder) copy(decoder.key[:], key[0:keyLength]) decoder.nonce.init(key[keyLength : keyLength+noncePrefixLength]) seed, err := drbg.SeedFromBytes(key[keyLength+noncePrefixLength:]) if err != nil { panic(fmt.Sprintf("BUG: Failed to initialize DRBG: %s", err)) } decoder.drbg, _ = drbg.NewHashDrbg(seed) return decoder }
// ServerFactory returns a new obfs4ServerFactory instance. func (t *Transport) ServerFactory(stateDir string, args *pt.Args) (base.ServerFactory, error) { st, err := serverStateFromArgs(stateDir, args) if err != nil { return nil, err } var iatSeed *drbg.Seed if st.iatMode != iatNone { iatSeedSrc := sha256.Sum256(st.drbgSeed.Bytes()[:]) var err error iatSeed, err = drbg.SeedFromBytes(iatSeedSrc[:]) if err != nil { return nil, err } } // Store the arguments that should appear in our descriptor for the clients. ptArgs := pt.Args{} ptArgs.Add(certArg, st.cert.String()) ptArgs.Add(iatArg, strconv.Itoa(st.iatMode)) // Initialize the replay filter. filter, err := replayfilter.New(replayTTL) if err != nil { return nil, err } // Initialize the close thresholds for failed connections. drbg, err := drbg.NewHashDrbg(st.drbgSeed) if err != nil { return nil, err } rng := rand.New(drbg) sf := &obfs4ServerFactory{t, &ptArgs, st.nodeID, st.identityKey, st.drbgSeed, iatSeed, st.iatMode, filter, rng.Intn(maxCloseDelayBytes), rng.Intn(maxCloseDelay)} return sf, nil }