[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Minios-devel] [UNIKRAFT PATCH 1/1] lib/ukswrand: Add /dev/random and /dev/urandom



Hey Yuri,

Thanks for the review. I'll add the proposed changes in the v2.

On 4/23/19 3:51 PM, Yuri Volchkov wrote:
> Hi Vlad,
>
> "Vlad-Andrei BĂDOIU (78692)" <vlad_andrei.badoiu@xxxxxxxxxxxxxxx>
> writes:
>
>> This patch adds the /dev/random and
>> /dev/urandom devices. Since we
>> do not currenly have any entropy generating
>> function they share the same handlers. The
>> registration of the devices is guarded
>> by the config option CONFIG_DEV_RANDOM.
>>
>> The devfs patch series is required.
>>
>> Signed-off-by: Vlad-Andrei Badoiu <vlad_andrei.badoiu@xxxxxxxxxxxxxxx>
>> ---
>>   lib/ukswrand/Config.uk |  5 ++++
>>   lib/ukswrand/mwc.c     | 65 ++++++++++++++++++++++++++++++++++++++++++
>>   2 files changed, 70 insertions(+)
>>
>> diff --git a/lib/ukswrand/Config.uk b/lib/ukswrand/Config.uk
>> index 44f6ee50..d694b61d 100644
>> --- a/lib/ukswrand/Config.uk
>> +++ b/lib/ukswrand/Config.uk
>> @@ -14,6 +14,11 @@ config LIBUKSWRAND_MWC
>>              Use multiply-with-carry algorithm
>>   endchoice
>>   
>> +
>> +config DEV_RANDOM
>> +    bool "/dev/random device"
>> +    select LIBDEVFS
>> +
>>   config LIBUKSWRAND_INITIALSEED
>>      int "Initial random seed"
>>      default 23
>> diff --git a/lib/ukswrand/mwc.c b/lib/ukswrand/mwc.c
>> index 199247d3..a276d657 100644
>> --- a/lib/ukswrand/mwc.c
>> +++ b/lib/ukswrand/mwc.c
>> @@ -37,6 +37,7 @@
>>   #include <uk/print.h>
>>   #include <uk/assert.h>
>>   #include <uk/ctors.h>
>> +#include <uk/config.h>
>>   
>>   /* 
>> https://stackoverflow.com/questions/9492581/c-random-number-generation-pure-c-code-no-libraries-or-functions
>>  */
>>   #define PHI 0x9e3779b9
>> @@ -97,3 +98,67 @@ static void _uk_swrand_ctor(void)
>>   }
>>   
>>   UK_CTOR_FUNC(UK_SWRAND_CTOR_PRIO, _uk_swrand_ctor);
>> +
>> +#ifdef CONFIG_DEV_RANDOM
>> +
>> +#include <vfscore/device.h>
>> +#include <vfscore/uio.h>
>> +#include <stdlib.h>
>> +
>> +static const char dev_name[] = "urandom";
>> +
>> +int dev_random_read(struct device *dev, struct uio *uio, int flags)
>> +{
>> +    char *buf;
>> +    size_t count;
>> +
>> +    buf = uio->uio_iov->iov_base;
>> +    count = uio->uio_iov->iov_len;
> It can be multiple vectors here. At least add assertion. But better to
> iterate all of them.
>
>> +
>> +    for (int i = 0; i < count; ++i)
>> +            buf[i] = uk_swrand_randr_r(&uk_swrand_def);
> The uk_swrand_randr_r gives you 4 bytes, only one of them is used. I
> think this inefficiency needs fixing.
>
>> +
>> +    uio->uio_resid = 0;
>> +    return 0;
>> +}
>> +
>> +int dev_random_open(const char *c, int i, struct device **dev)
>> +{
>> +    return 0;
>> +}
>> +
>> +
>> +int dev_random_close(const char *c, int i, struct device **dev)
>> +{
>> +    return 0;
>> +}
>> +
>> +static struct devops random_devops = {
>> +    .read = dev_random_read,
>> +    .open = dev_random_open,
>> +    .close = dev_random_close,
>> +};
>> +
>> +static struct driver drv = {
>> +    .devops = &random_devops,
>> +    .devsz = 0,
>> +    .name = dev_name
>> +};
>> +
>> +__constructor_prio(102) static void _uk_dev_swrand_ctor(void)
>> +{
>> +    struct device *dev;
>> +
>> +    uk_pr_info("Add /dev/random and /dev/urandom\n");
> Sounds more like uk_pr_debug to me
>
>> +
>> +    /* register /dev/urandom */
>> +    dev = device_create(&drv, dev_name, D_CHR);
>> +    if (dev == NULL)
>> +            uk_pr_info("Failed to register /dev/urandom\n");
>> +
>> +    /* register /dev/random */
>> +    dev = device_create(&drv, dev_name + 1, D_CHR);
>> +    if (dev == NULL)
>> +            uk_pr_info("Failed to register /dev/random\n");
>> +}
>> +#endif
>> -- 
>> 2.20.1
>>
_______________________________________________
Minios-devel mailing list
Minios-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/minios-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.