bsdkm: kernel example.
parent
123d562214
commit
2d24e854d7
|
|
@ -0,0 +1,15 @@
|
|||
# example module name and sources
|
||||
KMOD=bsd_example
|
||||
SRCS=bsd_example.c
|
||||
|
||||
# path to wolfssl dir
|
||||
WOLFSSL_DIR=../../../wolfssl/
|
||||
|
||||
# suppress wolfcrypt/src/misc.c drops const qualifier
|
||||
CFLAGS+= -Wno-cast-qual
|
||||
CFLAGS+= -Wno-error=cast-qual
|
||||
CFLAGS+= -I/usr/include
|
||||
CFLAGS+=-I${WOLFSSL_DIR} -DWOLFSSL_USE_OPTIONS_H -DWOLFSSL_CUSTOM_CONFIG
|
||||
|
||||
# point to live kernel kmod dot mk
|
||||
.include "/usr/src/sys/conf/kmod.mk"
|
||||
|
|
@ -0,0 +1,118 @@
|
|||
# FreeBSD wolfcrypt kernel module example
|
||||
|
||||
## About
|
||||
|
||||
|
||||
Tested on FreeBSD 14.2:
|
||||
```sh
|
||||
uname -rsm
|
||||
FreeBSD 14.2-RELEASE amd64
|
||||
```
|
||||
|
||||
## Build libwolfssl.ko
|
||||
|
||||
```sh
|
||||
cd ~/
|
||||
git clone https://github.com/philljj/wolfssl.git
|
||||
cd ~/wolfssl && git co bsdkm
|
||||
./autogen.sh
|
||||
./configure --enable-bsdkm --enable-cryptonly --enable-crypttests --enable-all-crypto --disable-asm && make
|
||||
file bsdkm/libwolfssl.ko
|
||||
```
|
||||
|
||||
Load the kernel module:
|
||||
```sh
|
||||
sudo kldload bsdkm/libwolfssl.ko
|
||||
```
|
||||
|
||||
In dmesg output you should see something like:
|
||||
```sh
|
||||
dmesg | tail -n10
|
||||
PKCS7enveloped test passed!
|
||||
PKCS7authenveloped test passed!
|
||||
mp test passed!
|
||||
prime test passed!
|
||||
logging test passed!
|
||||
mutex test passed!
|
||||
crypto callback test passed!
|
||||
Test complete
|
||||
wolfCrypt self-test passed.
|
||||
info: wolfkmod init good
|
||||
```
|
||||
|
||||
and kldstat:
|
||||
```sh
|
||||
kldstat
|
||||
Id Refs Address Size Name
|
||||
1 20 0xffffffff80200000 1f3c6c0 kernel
|
||||
2 1 0xffffffff82818000 3220 intpm.ko
|
||||
3 1 0xffffffff8281c000 2178 smbus.ko
|
||||
4 1 0xffffffff8281f000 430c virtio_console.ko
|
||||
5 1 0xffffffff82824000 3360 uhid.ko
|
||||
6 1 0xffffffff82828000 3360 wmt.ko
|
||||
17 1 0xffffffff8282c000 154520 libwolfssl.ko
|
||||
```
|
||||
|
||||
wolfssl will also appear in vmstat entries:
|
||||
```sh
|
||||
vmstat -m | grep wolf
|
||||
wolfssl 0 0 1275500 16,32,64,128,256,384,512,1024,2048,4096,8192,16384
|
||||
```
|
||||
|
||||
## Build this example
|
||||
|
||||
From this example dir:
|
||||
```sh
|
||||
make && file bsd_example.ko
|
||||
```
|
||||
|
||||
Load it:
|
||||
```sh
|
||||
sudo kldload ./bsd_example.ko
|
||||
```
|
||||
|
||||
dmesg should show:
|
||||
```sh
|
||||
dmesg | tail -n5
|
||||
Test complete
|
||||
wolfCrypt self-test passed.
|
||||
info: wolfkmod init good
|
||||
info: bsdkm_example: running wc_aes_test()
|
||||
info: bsdkm_example: wc_aes_test good
|
||||
```
|
||||
|
||||
and kldstat:
|
||||
```sh
|
||||
kldstat
|
||||
Id Refs Address Size Name
|
||||
1 22 0xffffffff80200000 1f3c6c0 kernel
|
||||
2 1 0xffffffff82818000 3220 intpm.ko
|
||||
3 1 0xffffffff8281c000 2178 smbus.ko
|
||||
4 1 0xffffffff8281f000 430c virtio_console.ko
|
||||
5 1 0xffffffff82824000 3360 uhid.ko
|
||||
6 1 0xffffffff82828000 3360 wmt.ko
|
||||
17 2 0xffffffff8282c000 154520 libwolfssl.ko
|
||||
18 1 0xffffffff82981000 2188 bsd_example.ko
|
||||
```
|
||||
|
||||
Notice `libwolfssl.ko` reference count has incremented.
|
||||
|
||||
Unload in the opposite order as loading:
|
||||
```sh
|
||||
sudo kldunload bsd_example.ko
|
||||
sudo kldunload libwolfssl.ko
|
||||
kldstat
|
||||
Id Refs Address Size Name
|
||||
1 18 0xffffffff80200000 1f3c6c0 kernel
|
||||
2 1 0xffffffff82818000 3220 intpm.ko
|
||||
3 1 0xffffffff8281c000 2178 smbus.ko
|
||||
4 1 0xffffffff8281f000 430c virtio_console.ko
|
||||
5 1 0xffffffff82824000 3360 uhid.ko
|
||||
6 1 0xffffffff82828000 3360 wmt.ko
|
||||
```
|
||||
wolfssl should now have disappeared from the vmstat listing:
|
||||
|
||||
```sh
|
||||
# returns nothing
|
||||
vmstat -m | grep wolf
|
||||
```
|
||||
|
|
@ -0,0 +1,125 @@
|
|||
/* freebsd system includes */
|
||||
#include <sys/param.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/libkern.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/systm.h>
|
||||
|
||||
/* wolfssl includes */
|
||||
#include <wolfssl/options.h>
|
||||
#include <wolfssl/wolfcrypt/settings.h>
|
||||
#include <wolfssl/wolfcrypt/aes.h>
|
||||
#include <wolfssl/wolfcrypt/error-crypt.h>
|
||||
|
||||
MALLOC_DEFINE(M_BSD_EXAMPLE, "bsd_example", "example kernel memory");
|
||||
|
||||
static int wc_aes_test(void);
|
||||
const char * ko_name = "bsdkm_example";
|
||||
|
||||
static int
|
||||
example_loader(struct module * m, int what, void * arg)
|
||||
{
|
||||
int ret = 0;
|
||||
switch (what) {
|
||||
case MOD_LOAD:
|
||||
printf("info: %s: running wc_aes_test()\n", ko_name);
|
||||
ret = wc_aes_test();
|
||||
if (ret != 0) {
|
||||
return ECANCELED;
|
||||
}
|
||||
break;
|
||||
case MOD_UNLOAD:
|
||||
printf("info: %s: unload\n", ko_name);
|
||||
break;
|
||||
default:
|
||||
printf("info: %s: not implemented: %d\n", ko_name, what);
|
||||
return EOPNOTSUPP;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int wc_aes_test(void)
|
||||
{
|
||||
int ret = 0;
|
||||
#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC)
|
||||
Aes *aes = NULL;
|
||||
#else
|
||||
Aes aes[1];
|
||||
#endif
|
||||
|
||||
/* "Now is the time for all " w/o trailing 0 */
|
||||
const byte msg[] = {
|
||||
0x6e,0x6f,0x77,0x20,0x69,0x73,0x20,0x74,
|
||||
0x68,0x65,0x20,0x74,0x69,0x6d,0x65,0x20,
|
||||
0x66,0x6f,0x72,0x20,0x61,0x6c,0x6c,0x20
|
||||
};
|
||||
const byte verify[] =
|
||||
{
|
||||
0x95,0x94,0x92,0x57,0x5f,0x42,0x81,0x53,
|
||||
0x2c,0xcc,0x9d,0x46,0x77,0xa2,0x33,0xcb
|
||||
};
|
||||
/* padded to 16-bytes */
|
||||
const byte key[] = "0123456789abcdef ";
|
||||
/* padded to 16-bytes */
|
||||
const byte iv[] = "1234567890abcdef ";
|
||||
byte cipher[WC_AES_BLOCK_SIZE * 4];
|
||||
|
||||
#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC)
|
||||
if ((aes = (Aes *)malloc(sizeof(*aes), M_BSD_EXAMPLE, M_WAITOK | M_ZERO)) == NULL) {
|
||||
printf("error: %s: xts aes alloc failed\n", ko_name);
|
||||
return MEMORY_E;
|
||||
}
|
||||
#endif
|
||||
|
||||
ret = wc_AesInit(aes, NULL, INVALID_DEVID);
|
||||
if (ret) {
|
||||
printf("error: %s: wc_AesXtsInit returned: %d\n", ko_name, ret);
|
||||
goto wc_aes_test_end;
|
||||
}
|
||||
|
||||
ret = wc_AesSetKey(aes, key, WC_AES_BLOCK_SIZE, iv, AES_ENCRYPTION);
|
||||
if (ret) {
|
||||
printf("error: %s: wc_AesSetKey returned: %d\n", ko_name, ret);
|
||||
goto wc_aes_test_end;
|
||||
}
|
||||
|
||||
memset(cipher, 0, sizeof(cipher));
|
||||
ret = wc_AesCbcEncrypt(aes, cipher, msg, WC_AES_BLOCK_SIZE);
|
||||
if (ret) {
|
||||
printf("error: %s: wc_AesCbcEncrypt returned: %d\n", ko_name, ret);
|
||||
goto wc_aes_test_end;
|
||||
}
|
||||
|
||||
if (XMEMCMP(cipher, verify, WC_AES_BLOCK_SIZE)) {
|
||||
printf("error: %s: wc_AesCbcDecrypt failed cipher-verify compare\n",
|
||||
ko_name);
|
||||
ret = -1;
|
||||
goto wc_aes_test_end;
|
||||
}
|
||||
|
||||
if (ret == 0) {
|
||||
printf("info: %s: wc_aes_test good\n", ko_name);
|
||||
}
|
||||
|
||||
wc_aes_test_end:
|
||||
wc_AesFree(aes);
|
||||
#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC)
|
||||
if (aes) {
|
||||
free(aes, M_BSD_EXAMPLE);
|
||||
aes = NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static moduledata_t hellomod = {
|
||||
"bsdkm_example", /* name */
|
||||
example_loader, /* loader */
|
||||
NULL /* extra data */
|
||||
};
|
||||
|
||||
DECLARE_MODULE(bsdkm_example, hellomod, SI_SUB_DRIVERS, SI_ORDER_MIDDLE);
|
||||
MODULE_DEPEND(bsdkm_example, libwolfssl, 1, 1, 1);
|
||||
Loading…
Reference in New Issue