FWIW, I agree with Ben here: if the true cryptographically secure random 
numbers force this complexity onto users, then we should settle for something 
close but not quite that bulletproof.

-Chris

> On Oct 4, 2017, at 6:15 PM, Xiaodi Wu via swift-evolution 
> <swift-evolution@swift.org> wrote:
> 
> 
>> On Wed, Oct 4, 2017 at 18:42 Ben Cohen <ben_co...@apple.com> wrote:
>> 
>>> On Oct 4, 2017, at 9:20 AM, Xiaodi Wu via swift-evolution 
>>> <swift-evolution@swift.org> wrote:
>>> 
>>> If trapping is OK, then surely returning Optional is superior; any user who 
>>> is OK with trapping can make that decision for themselves by writing 
>>> `random()!`. Everyone else can then see clearly that trapping is a 
>>> possibility, which is important.
>> 
>> It’s important not to underestimate both the extent to which using `!` 
>> scares people, _and_ the extent to which beginners use it inappropriately. 
>> Both of these mean that it’s very important the standard library not include 
>> anything that makes force-unwrapping a common/routine operation (looking at 
>> you, UnsafeBufferPointer.baseAddress).
> 
> I agree; however, if given the choice of `random()` potentially trapping or 
> `random()!` potentially trapping, I would argue that the latter is strictly 
> superior to the former. If the latter option scares people, the former should 
> scare people more, and its nicer appearance is a bug, not a feature.
> 
>> Given that arc4random, the recommended source of random numbers on Darwin, 
>> is always successful, requiring a force-unwrap when the user is using the 
>> default source doesn’t seem like the right move.
> 
> Always successful for some values of successful. We cannot design our way out 
> of physics.
> 
> Chris has indicated—and I agree—that the default random facilities should do 
> the right thing in terms of cryptographic security. Since arc4random is 
> guaranteed to be successful but the underlying hardware cannot be guaranteed 
> to always have the entropy to make it secure, it must follow that some 
> invocations of arc4random produce results unsuitable for cryptographic use.
> 
> To reiterate, this is one of several options. When there isn’t enough entropy 
> for secure random numbers, the function can:
> 
> - block
> - return an insecure result
> - return nil
> - throw
> - trap
> 
> This is an exhaustive list, as far as I can tell. None of these options are 
> entirely desirable, but it is inescapable that one of these is the default, 
> go-to design for Swift; of course, alternatives can be offered, but the 
> question is, what should we tell the novice user to reach for?
> 
>> 
>>>> On Wed, Oct 4, 2017 at 11:09 David Waite <da...@alkaline-solutions.com> 
>>>> wrote:
>>>> 
>>>>> On Oct 4, 2017, at 4:05 AM, Xiaodi Wu via swift-evolution 
>>>>> <swift-evolution@swift.org> wrote:
>>>>> 
>>>>> 
>>>>> I agree with Felix’s concern, which is why I brought up the question, but 
>>>>> ultimately the issue is unavoidable. It’s not down to global instance or 
>>>>> not. If your source of random numbers is unseedable and may mix in 
>>>>> additional entropy at any time, then it may fail at any time because when 
>>>>> a hardware restart might happen may be transparent to the process. The 
>>>>> user must know about this or else we are laying a trap (pun intended).
>>>> 
>>>> I'm of the mindset (which might be controversial) that we should attempt 
>>>> to expose legacy and cryptographically secure random number generators, 
>>>> even a mixed algorithmic/entropy source like /dev/urandom, but that we 
>>>> should not expose /dev/random at all. If someone is trying to use 
>>>> /dev/random legitimately (such as to generate one-time-pads) they will 
>>>> have to take into account that systems like linux still use algorithmic 
>>>> entropy to drive /dev/random. If someone really has this sort of use case, 
>>>> they have exceeded the bounds of the system randomness protocol.
>>>> 
>>>> Without /dev/random support as a requirement, the only failure cases I 
>>>> know of are reading too much random data in one operation (which could be 
>>>> solved by repeated calls) or calling before sufficient entropy has been 
>>>> set up in /dev/urandom (such as in a system startup process). I'd be fine 
>>>> with the second one being a special case, and such systems needing to know 
>>>> use of the /dev/urandom -backed generator before randomness has been set 
>>>> up will trap or return predictable information on certain platforms.
>>>> 
>>>> -DW
>> 
>>> _______________________________________________
>> 
>>> 
>>> swift-evolution mailing list
>>> swift-evolution@swift.org
>>> https://lists.swift.org/mailman/listinfo/swift-evolution
> _______________________________________________
> swift-evolution mailing list
> swift-evolution@swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution
_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to