diff --git a/fido2/extensions/extensions.c b/fido2/extensions/extensions.c
index ad8e660..7d413c2 100644
--- a/fido2/extensions/extensions.c
+++ b/fido2/extensions/extensions.c
@@ -1,21 +1,21 @@
/*
* Copyright (C) 2018 SoloKeys, Inc.
- *
+ *
* This file is part of Solo.
- *
+ *
* Solo is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
- *
+ *
* Solo is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
+ *
* You should have received a copy of the GNU General Public License
* along with Solo. If not, see
- *
+ *
* This code is available under licenses for commercial use.
* Please contact SoloKeys for more information.
*/
@@ -23,6 +23,7 @@
#include "extensions.h"
#include "u2f.h"
#include "wallet.h"
+#include "solo.h"
#include "device.h"
#include "log.h"
@@ -69,6 +70,8 @@ int16_t bridge_u2f_to_extensions(uint8_t * _chal, uint8_t * _appid, uint8_t klen
ret = bootloader_bridge(klen, keyh);
#elif defined(WALLET_EXTENSION)
ret = bridge_u2f_to_wallet(_chal, _appid, klen, keyh);
+#else
+ ret = bridge_u2f_to_solo(_chal, _appid, klen, keyh);
#endif
if (ret != 0)
diff --git a/fido2/extensions/solo.c b/fido2/extensions/solo.c
new file mode 100644
index 0000000..9072588
--- /dev/null
+++ b/fido2/extensions/solo.c
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2018 SoloKeys, Inc.
+ *
+ * This file is part of Solo.
+ *
+ * Solo is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Solo is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Solo. If not, see
+ *
+ * This code is available under licenses for commercial use.
+ * Please contact SoloKeys for more information.
+ */
+
+#include
+#include "extensions.h"
+#include "u2f.h"
+#include "wallet.h"
+#include "device.h"
+#include "ctap.h"
+#include "ctap_errors.h"
+
+#include "log.h"
+#include APP_CONFIG
+
+int16_t bridge_u2f_to_solo(uint8_t * _chal, uint8_t * _appid, uint8_t klen, uint8_t * keyh)
+{
+ static uint8_t msg_buf[72];
+ int reqlen = klen;
+ int i;
+ int8_t ret = 0;
+
+ wallet_request * req = (wallet_request *) msg_buf;
+
+ printf1(TAG_WALLET, "u2f-solo [%d]: ", reqlen); dump_hex1(TAG_WALLET, msg_buf, reqlen);
+
+ switch(req->operation)
+ {
+ case WalletVersion:
+ msg_buf[0] = SOLO_VERSION_MAJ;
+ msg_buf[0] = SOLO_VERSION_MIN;
+ u2f_response_writeback((uint8_t*)WALLET_VERSION, sizeof(WALLET_VERSION)-1);
+ break;
+ case WalletRng:
+ printf1(TAG_WALLET,"SoloRng\n");
+
+ ret = ctap_generate_rng(msg_buf, 72);
+ if (ret != 1)
+ {
+ printf1(TAG_WALLET,"Rng failed\n");
+ ret = CTAP2_ERR_PROCESSING;
+ goto cleanup;
+ }
+ ret = 0;
+
+ u2f_response_writeback((uint8_t *)msg_buf,72);
+ break;
+
+ default:
+ printf2(TAG_ERR,"Invalid wallet command: %x\n",req->operation);
+ ret = CTAP1_ERR_INVALID_COMMAND;
+ break;
+ }
+
+cleanup:
+
+ return ret;
+}
diff --git a/fido2/extensions/solo.h b/fido2/extensions/solo.h
new file mode 100644
index 0000000..04e9d8d
--- /dev/null
+++ b/fido2/extensions/solo.h
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2018 SoloKeys, Inc.
+ *
+ * This file is part of Solo.
+ *
+ * Solo is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Solo is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Solo. If not, see
+ *
+ * This code is available under licenses for commercial use.
+ * Please contact SoloKeys for more information.
+ */
+#ifndef SOLO_H_
+#define SOLO_H_
+
+int16_t bridge_u2f_to_solo(uint8_t * _chal, uint8_t * _appid, uint8_t klen, uint8_t * keyh);
+
+#endif
diff --git a/targets/stm32l432/application.mk b/targets/stm32l432/application.mk
index 89ece0d..acc3e48 100644
--- a/targets/stm32l432/application.mk
+++ b/targets/stm32l432/application.mk
@@ -13,6 +13,7 @@ SRC += $(wildcard lib/*.c) $(wildcard lib/usbd/*.c)
SRC += ../../fido2/util.c ../../fido2/u2f.c ../../fido2/test_power.c
SRC += ../../fido2/stubs.c ../../fido2/log.c ../../fido2/ctaphid.c ../../fido2/ctap.c
SRC += ../../fido2/ctap_parse.c ../../fido2/main.c
+SRC += ../../fido2/extensions/extensions.c ../../fido2/extensions/solo.c
# Crypto libs
SRC += ../../crypto/sha256/sha256.c ../../crypto/micro-ecc/uECC.c ../../crypto/tiny-AES-c/aes.c