SLIDE 1
DRM Security David Herrmann <dh.herrmann@gmail.com> DRM - - PowerPoint PPT Presentation
DRM Security David Herrmann <dh.herrmann@gmail.com> DRM - - PowerPoint PPT Presentation
DRM Security David Herrmann <dh.herrmann@gmail.com> DRM rendering mode-setting open(/dev/dri/card0, ...) (Dumb) Buffer Allocation ioctl(fd, DRM_IOCTL_MODE_CREATE_DUMB, &creq) mreq.handle = creq.handle; ioctl(fd,
SLIDE 2
SLIDE 3
- pen(“/dev/dri/card0”, ...)
SLIDE 4
(Dumb) Buffer Allocation
ioctl(fd, DRM_IOCTL_MODE_CREATE_DUMB, &creq) mreq.handle = creq.handle; ioctl(fd, DRM_IOCTL_MODE_MAP_DUMB, &mreq) mmap(fd, size, …, MAP_SHARED, …, mreq.offset)
SLIDE 5
mmap-offsets are globally accessible
SLIDE 6
for (i = 0; i < 0xffffffff; ++i) {
void *p = mmap(fd, …, i); if (p != MAP_FAILED)
break;
}
SLIDE 7
for (i = 0; i < 0xffffffff; ++i) {
void *p = mmap(fd, …, i); if (p != MAP_FAILED)
break;
}
F I X E D
SLIDE 8
ioctl(fd, DRM_IOCTL_MODE_CREATE_DUMB, &creq) mreq.handle = creq.handle; ioctl(fd, DRM_IOCTL_MODE_MAP_DUMB, &mreq) mmap(fd, size, …, MAP_SHARED, …, mreq.offset)
SLIDE 9
Buffer Passing
lreq.handle = mreq.handle; ioctl(fd, DRM_IOCTL_GEM_FLINK, &lreq); send(somewhere, lreq.name, sizeof(lreq.name)); recv(somewhere, &oreq.name, sizeof(oreq.name)); ioctl(fd, DRM_IOCTL_GEM_OPEN, &oreq);
SLIDE 10
for (i = 1; i < 0xffffffff; ++i) {
req.name = i; r = ioctl(fd, DRM_IOCTL_GEM_OPEN, &req); if (!r)
break;
}
SLIDE 11
for (i = 1; i < 0xffffffff; ++i) {
req.name = i; r = ioctl(fd, DRM_IOCTL_GEM_OPEN, &req); if (!r)
break;
}
D E P R E C A T E D
SLIDE 12
dma-buf
SLIDE 13
req.handle = mreq.handle; ioctl(fd, DRM_IOCTL_PRIME_HANDLE_TO_FD, &req); send_unix_fd(somewhere, req.fd); recv_unix_fd(somewhere, &req.fd); ioctl(fd, DRM_IOCTL_PRIME_FD_TO_HANDLE, &req);
SLIDE 14
DRM Authentication
- pen(“/dev/dri/card0”, …);
SLIDE 15
ioctl(fd, DRM_IOCTL_GET_MAGIC, &magic); send(somewhere, &magic, sizeof(magic)); recv(somewhere, &magic, sizeof(magic)); ioctl(fd, DRM_IOCTL_AUTH_MAGIC, &magic);
SLIDE 16
ioctl(fd, DRM_IOCTL_GET_MAGIC, &magic); send(somewhere, &magic, sizeof(magic)); recv(somewhere, &magic, sizeof(magic)); ioctl(fd, DRM_IOCTL_AUTH_MAGIC, &magic);
O B S O L E T E
SLIDE 17
Access-Management is done via file-system modes!
SLIDE 18
There is a reason FD-passing is call SCM_RIGHTS
SLIDE 19
- pen(“/dev/dri/renderD128”, …);
SLIDE 20
Render Nodes
- No GEM_FLINK
- No DRM AUTH/MAGIC
- No Mode-setting
- No global resources
- No legacy DRM API
- No DRM-Master
SLIDE 21
OpenGL with Render-Nodes
fd = open(“/dev/dri/renderD128”, …); dev = gbm_create_device(fd); disp = eglGetDisplay(dev); eglInitialize(disp, major, minor); eglBindAPI(EGL_OPENGL_API); eglChooseConfig(disp, …, &conf); ctx = eglCreateContext(disp, conf, 0, &attrs); eglMakeCurrent(disp, 0, 0, ctx);
SLIDE 22
surf = gbm_surface_create(dev, … attrs ...); wnd = eglCreateWindowSurface(disp, conf, surf, …); eglMakeCurrent(disp, wnd, wnd, ctx);
SLIDE 23
DRM Master
SLIDE 24
- acquire DRM-Master:
– open()
- r
– drmSetMaster()
- drop DRM-Master
– close()
- r
– drmDropMaster()
SLIDE 25
- acquire DRM-Master:
– open()
- r
– drmSetMaster()
- drop DRM-Master
– close()
- r
– drmDropMaster()