Skip to content

Instantly share code, notes, and snippets.

@minux
Last active August 29, 2015 14:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save minux/c7c997669fec1cf391f9 to your computer and use it in GitHub Desktop.
Save minux/c7c997669fec1cf391f9 to your computer and use it in GitHub Desktop.
diff --git a/src/runtime/os1_nacl.go b/src/runtime/os1_nacl.go
index 0a446c4..7b1988e 100644
--- a/src/runtime/os1_nacl.go
+++ b/src/runtime/os1_nacl.go
@@ -46,11 +46,8 @@ func crash() {
*(*int32)(nil) = 0
}
-//go:nosplit
-func getRandomData(r []byte) {
- // TODO: does nacl have a random source we can use?
- extendRandom(r, 0)
-}
+//go:noescape
+func getRandomData([]byte)
func goenvs() {
goenvs_unix()
diff --git a/src/runtime/sys_nacl_386.s b/src/runtime/sys_nacl_386.s
index 85c8175..242040d 100644
--- a/src/runtime/sys_nacl_386.s
+++ b/src/runtime/sys_nacl_386.s
@@ -362,3 +362,12 @@ ret:
// 36(BP) is saved EFLAGS, never to be seen again
MOVL 32(BP), BP // saved PC
JMP BP
+
+// func getRandomData([]byte)
+TEXT runtime·getRandomData(SB),NOSPLIT,$8-12
+ MOVL buf+0(FP), AX
+ MOVL AX, 0(SP)
+ MOVL len+4(FP), AX
+ MOVL AX, 4(SP)
+ NACL_SYSCALL(SYS_get_random_bytes)
+ RET
diff --git a/src/runtime/sys_nacl_amd64p32.s b/src/runtime/sys_nacl_amd64p32.s
index f5624ca..a1398da 100644
--- a/src/runtime/sys_nacl_amd64p32.s
+++ b/src/runtime/sys_nacl_amd64p32.s
@@ -412,6 +412,13 @@ nog:
// cannot do real signal handling yet, because gsignal has not been allocated.
MOVL $1, DI; NACL_SYSCALL(SYS_exit)
+// func getRandomData([]byte)
+TEXT runtime·getRandomData(SB),NOSPLIT,$0-12
+ MOVL buf+0(FP), DI
+ MOVL len+4(FP), SI
+ NACL_SYSCALL(SYS_get_random_bytes)
+ RET
+
TEXT runtime·nacl_sysinfo(SB),NOSPLIT,$16
/*
MOVL di+0(FP), DI
diff --git a/src/runtime/sys_nacl_arm.s b/src/runtime/sys_nacl_arm.s
index ded95a8..1bae0b3 100644
--- a/src/runtime/sys_nacl_arm.s
+++ b/src/runtime/sys_nacl_arm.s
@@ -301,6 +301,13 @@ nog:
TEXT runtime·nacl_sysinfo(SB),NOSPLIT,$16
RET
+// func getRandomData([]byte)
+TEXT runtime·getRandomData(SB),NOSPLIT,$0-12
+ MOVW buf+0(FP), R0
+ MOVW len+4(FP), R1
+ NACL_SYSCALL(SYS_get_random_bytes)
+ RET
+
TEXT runtime·casp1(SB),NOSPLIT,$0
B runtime·cas(SB)
diff --git a/src/runtime/syscall_nacl.h b/src/runtime/syscall_nacl.h
index b33852e..834ecfc 100644
--- a/src/runtime/syscall_nacl.h
+++ b/src/runtime/syscall_nacl.h
@@ -8,10 +8,10 @@
#define SYS_read 12
#define SYS_write 13
#define SYS_lseek 14
-#define SYS_ioctl 15
#define SYS_stat 16
#define SYS_fstat 17
#define SYS_chmod 18
+#define SYS_isatty 19
#define SYS_brk 20
#define SYS_mmap 21
#define SYS_munmap 22
@@ -69,3 +69,16 @@
#define SYS_test_crash 110
#define SYS_test_syscall_1 111
#define SYS_test_syscall_2 112
+#define SYS_futex_wait_abs 120
+#define SYS_futex_wake 121
+#define SYS_pread 130
+#define SYS_pwrite 131
+#define SYS_truncate 140
+#define SYS_lstat 141
+#define SYS_link 142
+#define SYS_rename 143
+#define SYS_symlink 144
+#define SYS_access 145
+#define SYS_readlink 146
+#define SYS_utimes 147
+#define SYS_get_random_bytes 150
diff --git a/src/syscall/fs_nacl.go b/src/syscall/fs_nacl.go
index 6e6ce2a..ca8c75a 100644
--- a/src/syscall/fs_nacl.go
+++ b/src/syscall/fs_nacl.go
@@ -772,29 +772,24 @@ func (f *zeroFile) pread(b []byte, offset int64) (int, error) {
return len(b), nil
}
-type randomFile struct {
- naclFD int
-}
+type randomFile struct{}
func openRandom() (devFile, error) {
- fd, err := openNamedService("SecureRandom", O_RDONLY)
- if err != nil {
- return nil, err
- }
- return &randomFile{naclFD: fd}, nil
+ return randomFile{}, nil
}
-func (f *randomFile) close() error {
- naclClose(f.naclFD)
- f.naclFD = -1
+func (f randomFile) close() error {
return nil
}
-func (f *randomFile) pread(b []byte, offset int64) (int, error) {
- return naclRead(f.naclFD, b)
+func (f randomFile) pread(b []byte, offset int64) (int, error) {
+ if err := naclGetRandomBytes(b); err != nil {
+ return 0, err
+ }
+ return len(b), nil
}
-func (f *randomFile) pwrite(b []byte, offset int64) (int, error) {
+func (f randomFile) pwrite(b []byte, offset int64) (int, error) {
return 0, EPERM
}
diff --git a/src/syscall/syscall_nacl.go b/src/syscall/syscall_nacl.go
index c2788b2..f8f63ef 100644
--- a/src/syscall/syscall_nacl.go
+++ b/src/syscall/syscall_nacl.go
@@ -14,6 +14,7 @@ import (
//sys naclFstat(fd int, stat *Stat_t) (err error) = sys_fstat
//sys naclRead(fd int, b []byte) (n int, err error) = sys_read
//sys naclSeek(fd int, off *int64, whence int) (err error) = sys_lseek
+//sys naclGetRandomBytes(b []byte) (err error) = sys_get_random_bytes
const direntSize = 8 + 8 + 2 + 256
diff --git a/src/syscall/tables_nacl.go b/src/syscall/tables_nacl.go
index 08f4ced..098955e 100644
--- a/src/syscall/tables_nacl.go
+++ b/src/syscall/tables_nacl.go
@@ -15,10 +15,10 @@ const (
sys_read = 12
sys_write = 13
sys_lseek = 14
- sys_ioctl = 15
sys_stat = 16
sys_fstat = 17
sys_chmod = 18
+ sys_isatty = 19
sys_brk = 20
sys_mmap = 21
sys_munmap = 22
@@ -76,6 +76,19 @@ const (
sys_test_crash = 110
sys_test_syscall_1 = 111
sys_test_syscall_2 = 112
+ sys_futex_wait_abs = 120
+ sys_futex_wake = 121
+ sys_pread = 130
+ sys_pwrite = 131
+ sys_truncate = 140
+ sys_lstat = 141
+ sys_link = 142
+ sys_rename = 143
+ sys_symlink = 144
+ sys_access = 145
+ sys_readlink = 146
+ sys_utimes = 147
+ sys_get_random_bytes = 150
)
// TODO: Auto-generate some day. (Hard-coded in binaries so not likely to change.)
diff --git a/src/syscall/zsyscall_nacl_386.go b/src/syscall/zsyscall_nacl_386.go
index 32eed33..6e3220c 100644
--- a/src/syscall/zsyscall_nacl_386.go
+++ b/src/syscall/zsyscall_nacl_386.go
@@ -61,3 +61,19 @@ func naclSeek(fd int, off *int64, whence int) (err error) {
}
return
}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func naclGetRandomBytes(b []byte) (err error) {
+ var _p0 unsafe.Pointer
+ if len(b) > 0 {
+ _p0 = unsafe.Pointer(&b[0])
+ } else {
+ _p0 = unsafe.Pointer(&_zero)
+ }
+ _, _, e1 := Syscall(sys_get_random_bytes, uintptr(_p0), uintptr(len(b)), 0)
+ if e1 != 0 {
+ err = e1
+ }
+ return
+}
diff --git a/src/syscall/zsyscall_nacl_amd64p32.go b/src/syscall/zsyscall_nacl_amd64p32.go
index 8bc81fa..6f06b30 100644
--- a/src/syscall/zsyscall_nacl_amd64p32.go
+++ b/src/syscall/zsyscall_nacl_amd64p32.go
@@ -61,3 +61,19 @@ func naclSeek(fd int, off *int64, whence int) (err error) {
}
return
}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func naclGetRandomBytes(b []byte) (err error) {
+ var _p0 unsafe.Pointer
+ if len(b) > 0 {
+ _p0 = unsafe.Pointer(&b[0])
+ } else {
+ _p0 = unsafe.Pointer(&_zero)
+ }
+ _, _, e1 := Syscall(sys_get_random_bytes, uintptr(_p0), uintptr(len(b)), 0)
+ if e1 != 0 {
+ err = e1
+ }
+ return
+}
diff --git a/src/syscall/zsyscall_nacl_arm.go b/src/syscall/zsyscall_nacl_arm.go
index adbaed0..ccaca3c 100644
--- a/src/syscall/zsyscall_nacl_arm.go
+++ b/src/syscall/zsyscall_nacl_arm.go
@@ -61,3 +61,19 @@ func naclSeek(fd int, off *int64, whence int) (err error) {
}
return
}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func naclGetRandomBytes(b []byte) (err error) {
+ var _p0 unsafe.Pointer
+ if len(b) > 0 {
+ _p0 = unsafe.Pointer(&b[0])
+ } else {
+ _p0 = unsafe.Pointer(&_zero)
+ }
+ _, _, e1 := Syscall(sys_get_random_bytes, uintptr(_p0), uintptr(len(b)), 0)
+ if e1 != 0 {
+ err = e1
+ }
+ return
+}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment