shithub: util

Download patch

ref: 9c14131a7c789bf6a9d4f38db48d04461735d948
parent: 2ba828b08e36551863ee2680f4887dc0f97bfaf9
author: glenda <glenda@kingship>
date: Wed Nov 12 09:45:09 EST 2025

ads7830 seeded randomfs

--- /dev/null
+++ b/randomfs.c
@@ -1,0 +1,130 @@
+#include <u.h>
+#include <libc.h>
+#include <fcall.h>
+#include <thread.h>
+#include <9p.h>
+
+#define ADC "/dev/adc%d"
+
+uint seed[16];
+
+int
+readadc(int n)
+{
+	char *fname;
+	int fd;
+	char buf[32];
+	int ret;
+
+	if (n < 0 || n > 7)
+		sysfatal("adc %d?", n);
+
+	fname = smprint(ADC, n);
+	if (fname == nil)
+		sysfatal("smprint: %r");
+
+	fd = open(fname, OREAD);
+	if (fd < 0)
+		sysfatal("open: %r");
+
+	free(fname);
+
+	if ((ret = read(fd, buf, 32)) <= 0)
+		sysfatal("read: %r");
+
+	close(fd);
+
+	buf[ret] = '\0';
+
+	ret = atoi(buf);
+
+	return ret;
+}
+
+#define ROTATE(v,c) ((unsigned long)((v) << (c)) | ((v) >> (32 - (c))))
+
+#define QUARTERROUND(ia,ib,ic,id) { \
+	uint a, b, c, d, t; \
+	a = x[ia]; b = x[ib]; c = x[ic]; d = x[id]; \
+	a += b; t = d^a; d = ROTATE(t,16); \
+	c += d; t = b^c; b = ROTATE(t,12); \
+	a += b; t = d^a; d = ROTATE(t, 8); \
+	c += d; t = b^c; b = ROTATE(t, 7); \
+	x[ia] = a; x[ib] = b; x[ic] = c; x[id] = d; \
+}
+
+void
+_chachablock(uint x[16], int rounds)
+{
+	for(; rounds > 0; rounds -= 2) {
+		QUARTERROUND(0, 4, 8,12)
+		QUARTERROUND(1, 5, 9,13)
+		QUARTERROUND(2, 6,10,14)
+		QUARTERROUND(3, 7,11,15)
+
+		QUARTERROUND(0, 5,10,15)
+		QUARTERROUND(1, 6,11,12)
+		QUARTERROUND(2, 7, 8,13)
+		QUARTERROUND(3, 4, 9,14)
+	}
+}
+
+void
+fsread(Req *r)
+{
+	int i, j, k;
+
+	if ((intptr)(r->fid->file->aux) == 1) {
+		for (i = 0; i < 16; i++) {
+			for (j = 0; j < 8; j++) {
+				seed[i] <<= 1;
+				seed[i] ^= readadc(j) ^ nsec();
+			}
+		}
+
+		for (k = 0; k < r->ifcall.count; k++) {
+			i = k & 15;
+			if (i == 0)
+				_chachablock(seed, 20);
+			r->ofcall.data[k] = seed[i] & 0xFF;
+		}
+
+		r->ofcall.count = k;
+		respond(r, nil);
+	} else {
+		respond(r, "file not found");
+	}
+}
+
+void
+fswrite(Req *r)
+{
+	int i, k;
+	if ((intptr)(r->fid->file->aux) == 1) {
+		for (k = 0; k < r->ifcall.count; k++) {
+			i = k & 15;
+			seed[i] <<= 1;
+			seed[i] ^= r->ifcall.data[k];
+		}
+
+		r->ofcall.count = k;
+		respond(r, nil);
+	} else {
+		respond(r, "file not found");
+	}
+}
+
+Srv fs = {
+.read	= fsread,
+.write	= fswrite,
+};
+
+void
+main()
+{
+	readadc(0);
+
+	fs.tree = alloctree("randomfs", "randomfs", DMDIR|0555, nil);
+	createfile(fs.tree->root, "random", "randomfs", 0666, (void*)1);
+	postmountsrv(&fs, "randomfs", "/dev", MBEFORE);
+}
--