Compare commits
5 Commits
v2.0.0
...
feature_se
Author | SHA1 | Date | |
---|---|---|---|
|
b6e761fffc | ||
|
6eecea264e | ||
|
13975eaf2d | ||
|
d9e94bdcb6 | ||
|
cef96ee36a |
4
.github/workflows/build_all.yml
vendored
4
.github/workflows/build_all.yml
vendored
@@ -24,7 +24,7 @@ jobs:
|
|||||||
- name: Create Build Dir
|
- name: Create Build Dir
|
||||||
run: mkdir build
|
run: mkdir build
|
||||||
- name: Clone
|
- name: Clone
|
||||||
run: git clone https://github.com/microsoft/vcpkg.git && cd vcpkg && git checkout 772d435ba18bf2f342458e0187ab7b48b84fe3f0
|
run: git clone --branch 2020.11-1 https://github.com/microsoft/vcpkg.git
|
||||||
- name: Build VCPKG
|
- name: Build VCPKG
|
||||||
run: cd vcpkg && bootstrap-vcpkg.bat
|
run: cd vcpkg && bootstrap-vcpkg.bat
|
||||||
shell: cmd
|
shell: cmd
|
||||||
@@ -71,7 +71,7 @@ jobs:
|
|||||||
- name: Create Build Dir
|
- name: Create Build Dir
|
||||||
run: mkdir build
|
run: mkdir build
|
||||||
- name: Clone
|
- name: Clone
|
||||||
run: git clone https://github.com/microsoft/vcpkg.git && cd vcpkg && git checkout 772d435ba18bf2f342458e0187ab7b48b84fe3f0
|
run: git clone --branch 2020.11-1 https://github.com/microsoft/vcpkg.git
|
||||||
- name: Build VCPKG
|
- name: Build VCPKG
|
||||||
run: cd vcpkg && ./bootstrap-vcpkg.sh
|
run: cd vcpkg && ./bootstrap-vcpkg.sh
|
||||||
shell: bash
|
shell: bash
|
||||||
|
20
.github/workflows/changelog.yml
vendored
20
.github/workflows/changelog.yml
vendored
@@ -1,20 +0,0 @@
|
|||||||
name: Changelog Generator
|
|
||||||
|
|
||||||
on:
|
|
||||||
pull_request:
|
|
||||||
branches: [ master ]
|
|
||||||
workflow_dispatch:
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v2
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
- run: docker run -v $PWD:/workdir quay.io/git-chglog/git-chglog --next-tag vNext --output CHANGELOG-new.md vNext..
|
|
||||||
- name: GitHub Upload Release Artifacts
|
|
||||||
uses: actions/upload-artifact@v2
|
|
||||||
with:
|
|
||||||
name: CHANGELOG-new.md
|
|
||||||
path: |
|
|
||||||
./CHANGELOG-new.md
|
|
7
.github/workflows/ci.yml
vendored
7
.github/workflows/ci.yml
vendored
@@ -21,7 +21,7 @@ jobs:
|
|||||||
- name: Create Build Dir
|
- name: Create Build Dir
|
||||||
run: mkdir build
|
run: mkdir build
|
||||||
- name: Clone
|
- name: Clone
|
||||||
run: git clone https://github.com/microsoft/vcpkg.git && cd vcpkg && git checkout 772d435ba18bf2f342458e0187ab7b48b84fe3f0
|
run: git clone --branch 2020.11-1 https://github.com/microsoft/vcpkg.git
|
||||||
- name: Build VCPKG
|
- name: Build VCPKG
|
||||||
run: cd vcpkg && bootstrap-vcpkg.bat
|
run: cd vcpkg && bootstrap-vcpkg.bat
|
||||||
shell: cmd
|
shell: cmd
|
||||||
@@ -41,7 +41,8 @@ jobs:
|
|||||||
run: cd build && cmake --build . --config Release
|
run: cd build && cmake --build . --config Release
|
||||||
- name: Build RPC (Debug)
|
- name: Build RPC (Debug)
|
||||||
run: cd build && cmake --build . --config Debug
|
run: cd build && cmake --build . --config Debug
|
||||||
|
|
||||||
|
|
||||||
build-linux:
|
build-linux:
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
strategy:
|
strategy:
|
||||||
@@ -54,7 +55,7 @@ jobs:
|
|||||||
- name: Create Build Dir
|
- name: Create Build Dir
|
||||||
run: mkdir build
|
run: mkdir build
|
||||||
- name: Clone
|
- name: Clone
|
||||||
run: git clone https://github.com/microsoft/vcpkg.git && cd vcpkg && git checkout 772d435ba18bf2f342458e0187ab7b48b84fe3f0
|
run: git clone --branch 2020.11-1 https://github.com/microsoft/vcpkg.git
|
||||||
- name: Build VCPKG
|
- name: Build VCPKG
|
||||||
run: cd vcpkg && ./bootstrap-vcpkg.sh
|
run: cd vcpkg && ./bootstrap-vcpkg.sh
|
||||||
shell: bash
|
shell: bash
|
||||||
|
29
.github/workflows/docker-ci.yml
vendored
29
.github/workflows/docker-ci.yml
vendored
@@ -1,29 +0,0 @@
|
|||||||
#*********************************************************************
|
|
||||||
# Copyright (c) Intel Corporation 2020
|
|
||||||
# SPDX-License-Identifier: Apache-2.0
|
|
||||||
#*********************************************************************/
|
|
||||||
|
|
||||||
name: Docker Image CI
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: [ master ]
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v2
|
|
||||||
- name: Build the Docker image
|
|
||||||
run: docker build -f "Dockerfile" --tag vprodemo.azurecr.io/rpc:${{ github.sha }} --tag vprodemo.azurecr.io/rpc:latest .
|
|
||||||
- name: Docker Login
|
|
||||||
uses: docker/login-action@v1.6.0
|
|
||||||
with:
|
|
||||||
registry: vprodemo.azurecr.io
|
|
||||||
username: ${{ secrets.DOCKER_USERNAME }}
|
|
||||||
password: ${{ secrets.DOCKER_PASSWORD }}
|
|
||||||
logout: true
|
|
||||||
- name: Push the Docker image to the registry
|
|
||||||
run: docker push vprodemo.azurecr.io/rpc:${{ github.sha }}
|
|
||||||
- name: Push the Docker image to the registry
|
|
||||||
run: docker push vprodemo.azurecr.io/rpc:latest
|
|
6
Build.md
6
Build.md
@@ -25,9 +25,8 @@ sudo apt install git cmake build-essential curl zip unzip tar pkg-config
|
|||||||
Open a Terminal window.
|
Open a Terminal window.
|
||||||
|
|
||||||
```
|
```
|
||||||
git clone https://github.com/microsoft/vcpkg.git
|
git clone -b 2020.11-1 https://github.com/microsoft/vcpkg.git
|
||||||
cd vcpkg
|
cd vcpkg
|
||||||
git checkout 772d435ba18bf2f342458e0187ab7b48b84fe3f0
|
|
||||||
./bootstrap-vcpkg.sh
|
./bootstrap-vcpkg.sh
|
||||||
./vcpkg install cpprestsdk[websockets]
|
./vcpkg install cpprestsdk[websockets]
|
||||||
```
|
```
|
||||||
@@ -69,9 +68,8 @@ Steps below are for Windows 10 and Visual Studio 2019 Professional.
|
|||||||
Open an x64 Native Tools Command Prompt for Visual Studio 2019.
|
Open an x64 Native Tools Command Prompt for Visual Studio 2019.
|
||||||
|
|
||||||
```
|
```
|
||||||
git clone https://github.com/microsoft/vcpkg.git
|
git clone -b 2020.11-1 https://github.com/microsoft/vcpkg.git
|
||||||
cd vcpkg
|
cd vcpkg
|
||||||
git checkout 772d435ba18bf2f342458e0187ab7b48b84fe3f0
|
|
||||||
bootstrap-vcpkg.bat
|
bootstrap-vcpkg.bat
|
||||||
vcpkg install cpprestsdk[websockets]:x64-windows-static
|
vcpkg install cpprestsdk[websockets]:x64-windows-static
|
||||||
```
|
```
|
||||||
|
59
CHANGELOG.md
59
CHANGELOG.md
@@ -1,62 +1,3 @@
|
|||||||
<a name="v2.0.0"></a>
|
|
||||||
## v2.0.0
|
|
||||||
|
|
||||||
### Build
|
|
||||||
- bump version to v1.3.0
|
|
||||||
- bump version to v2.0.0
|
|
||||||
|
|
||||||
### Ci
|
|
||||||
- update scanning
|
|
||||||
|
|
||||||
### Docs
|
|
||||||
- **readme:** wording
|
|
||||||
- **readme:** update readme
|
|
||||||
- **security:** added SECURITY.md file
|
|
||||||
|
|
||||||
### Feat
|
|
||||||
- update to OpenSSL 1.1.1l
|
|
||||||
- update workflows and Docker build.
|
|
||||||
- Update to latest vcpkg
|
|
||||||
- Update docs and scripts for Windows and Ubuntu.
|
|
||||||
- format json status messages
|
|
||||||
- add AMT wireless adapter info to amtinfo LAN settings.
|
|
||||||
|
|
||||||
### Fix
|
|
||||||
- klockwork reported success / failure check fix
|
|
||||||
- **spelling:** lan inteface -> lan interface in amtinfo
|
|
||||||
|
|
||||||
<a name="v1.2.2"></a>
|
|
||||||
## [v1.2.2] - 2021-06-22
|
|
||||||
### Ci
|
|
||||||
- remove Jenkins chron
|
|
||||||
- **changelog:** add automation for changelog generation
|
|
||||||
|
|
||||||
### Fix
|
|
||||||
- update examples text and version
|
|
||||||
|
|
||||||
<a name="v1.2.1"></a>
|
|
||||||
## [v1.2.1] - 2021-05-06
|
|
||||||
|
|
||||||
### Fix
|
|
||||||
**docker:** add missing ca-certs
|
|
||||||
|
|
||||||
<a name="v1.2.0"></a>
|
|
||||||
## v1.2.0
|
|
||||||
|
|
||||||
### Ci
|
|
||||||
- breakout docker build for merge only
|
|
||||||
|
|
||||||
### Feat
|
|
||||||
- update RPC version to 1.2.0.
|
|
||||||
- BREAKING CHANGE: add heartbeat capability, bump RPC Protocol version to 4.0.0
|
|
||||||
- add unit test framework
|
|
||||||
- add hostname to activation info
|
|
||||||
- **docker:** add dockerfile support for RPC
|
|
||||||
|
|
||||||
### Fix
|
|
||||||
- use message status instead, cleanup message fields.
|
|
||||||
|
|
||||||
|
|
||||||
<a name="v1.1.0"></a>
|
<a name="v1.1.0"></a>
|
||||||
## [v1.1.0] - 2021-02-09
|
## [v1.1.0] - 2021-02-09
|
||||||
|
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
cmake_minimum_required (VERSION 3.1)
|
cmake_minimum_required (VERSION 3.1)
|
||||||
|
|
||||||
project (rpc VERSION 2.0.0)
|
project (rpc VERSION 1.1.0)
|
||||||
|
|
||||||
set (CMAKE_CXX_STANDARD 11)
|
set (CMAKE_CXX_STANDARD 11)
|
||||||
|
|
||||||
@@ -98,8 +98,8 @@ add_executable (rpc
|
|||||||
commands.cpp
|
commands.cpp
|
||||||
activation.h
|
activation.h
|
||||||
activation.cpp
|
activation.cpp
|
||||||
heartbeat.h
|
shbc.h
|
||||||
heartbeat.cpp
|
shbc.cpp
|
||||||
lms.h
|
lms.h
|
||||||
lms.cpp
|
lms.cpp
|
||||||
main.cpp
|
main.cpp
|
||||||
|
@@ -50,9 +50,8 @@ export PATH=/home/user/Downloads/git:$PATH
|
|||||||
Using a Terminal window with the PATH and devtoolset enabled per the Dependencies.
|
Using a Terminal window with the PATH and devtoolset enabled per the Dependencies.
|
||||||
|
|
||||||
```
|
```
|
||||||
git clone https://github.com/microsoft/vcpkg.git
|
git clone -b 2020.11-1 https://github.com/microsoft/vcpkg.git
|
||||||
cd vcpkg
|
cd vcpkg
|
||||||
git checkout 772d435ba18bf2f342458e0187ab7b48b84fe3f0
|
|
||||||
./bootstrap-vcpkg.sh
|
./bootstrap-vcpkg.sh
|
||||||
./vcpkg install cpprestsdk[websockets]
|
./vcpkg install cpprestsdk[websockets]
|
||||||
```
|
```
|
||||||
|
@@ -28,9 +28,8 @@ sudo yum install cmake
|
|||||||
Using a Terminal window with the PATH and devtoolset enabled per the Dependencies.
|
Using a Terminal window with the PATH and devtoolset enabled per the Dependencies.
|
||||||
|
|
||||||
```
|
```
|
||||||
git clone https://github.com/microsoft/vcpkg.git
|
git clone -b 2020.11-1 https://github.com/microsoft/vcpkg.git
|
||||||
cd vcpkg
|
cd vcpkg
|
||||||
git checkout 772d435ba18bf2f342458e0187ab7b48b84fe3f0
|
|
||||||
./bootstrap-vcpkg.sh
|
./bootstrap-vcpkg.sh
|
||||||
./vcpkg install cpprestsdk[websockets]
|
./vcpkg install cpprestsdk[websockets]
|
||||||
```
|
```
|
||||||
|
37
Dockerfile
37
Dockerfile
@@ -1,37 +0,0 @@
|
|||||||
#*********************************************************************
|
|
||||||
# Copyright (c) Intel Corporation 2021
|
|
||||||
# SPDX-License-Identifier: Apache-2.0
|
|
||||||
#*********************************************************************/
|
|
||||||
|
|
||||||
FROM ubuntu:20.04 AS rpc-builder
|
|
||||||
|
|
||||||
WORKDIR /
|
|
||||||
ARG DEBIAN_FRONTEND=noninteractive
|
|
||||||
RUN \
|
|
||||||
apt-get update -y -qq && \
|
|
||||||
apt install -y -qq \
|
|
||||||
git cmake build-essential libssl-dev zlib1g-dev \
|
|
||||||
curl unzip zip pkg-config ca-certificates
|
|
||||||
RUN git clone https://github.com/open-amt-cloud-toolkit/rpc.git
|
|
||||||
WORKDIR /rpc
|
|
||||||
RUN mkdir -p build
|
|
||||||
RUN git clone https://github.com/microsoft/vcpkg.git && cd vcpkg && git checkout 772d435ba18bf2f342458e0187ab7b48b84fe3f0
|
|
||||||
RUN cd vcpkg && ./bootstrap-vcpkg.sh
|
|
||||||
RUN ./vcpkg/vcpkg install cpprestsdk[websockets]
|
|
||||||
|
|
||||||
WORKDIR /rpc/build
|
|
||||||
RUN cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_TOOLCHAIN_FILE=/rpc/vcpkg/scripts/buildsystems/vcpkg.cmake ..
|
|
||||||
RUN cmake --build .
|
|
||||||
|
|
||||||
FROM ubuntu:20.04
|
|
||||||
|
|
||||||
LABEL license='SPDX-License-Identifier: Apache-2.0' \
|
|
||||||
copyright='Copyright (c) 2021: Intel'
|
|
||||||
|
|
||||||
WORKDIR /root
|
|
||||||
RUN \
|
|
||||||
apt-get update -y -qq && \
|
|
||||||
apt install -y -qq \
|
|
||||||
libssl-dev
|
|
||||||
COPY --from=rpc-builder /rpc/build/rpc .
|
|
||||||
ENTRYPOINT ["/root/rpc"]
|
|
154
Jenkinsfile
vendored
154
Jenkinsfile
vendored
@@ -1,154 +0,0 @@
|
|||||||
pipeline {
|
|
||||||
agent {
|
|
||||||
label 'docker-amt'
|
|
||||||
}
|
|
||||||
options {
|
|
||||||
buildDiscarder(logRotator(numToKeepStr: '5', daysToKeepStr: '30'))
|
|
||||||
timestamps()
|
|
||||||
timeout(unit: 'HOURS', time: 2)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
stages {
|
|
||||||
stage ('Cloning Repository') {
|
|
||||||
steps {
|
|
||||||
script {
|
|
||||||
scmCheckout {
|
|
||||||
clean = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
stage('Static Code Scan - Protex') {
|
|
||||||
environment{
|
|
||||||
PROJECT_NAME = 'OpenAMT - RPC'
|
|
||||||
SCANNERS = 'protex'
|
|
||||||
}
|
|
||||||
steps {
|
|
||||||
rbheStaticCodeScan()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
stage ('Parallel Builds') {
|
|
||||||
parallel {
|
|
||||||
stage ('Linux') {
|
|
||||||
agent { label 'docker-amt' }
|
|
||||||
stages {
|
|
||||||
stage('Build') {
|
|
||||||
agent {
|
|
||||||
docker {
|
|
||||||
image 'ubuntu:18.04'
|
|
||||||
reuseNode true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
steps {
|
|
||||||
sh './scripts/jenkins-pre-build.sh'
|
|
||||||
sh './scripts/jenkins-build.sh'
|
|
||||||
stash includes: 'build/rpc', name: 'linux-rpc-app'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
stage ('Archive') {
|
|
||||||
steps {
|
|
||||||
archiveArtifacts allowEmptyArchive: true, artifacts: 'build/rpc', caseSensitive: false, onlyIfSuccessful: true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
stage ('Windows') {
|
|
||||||
agent { label 'openamt-win' }
|
|
||||||
stages{
|
|
||||||
stage ('Build') {
|
|
||||||
steps {
|
|
||||||
bat 'scripts\\jenkins-pre-build.cmd'
|
|
||||||
bat 'scripts\\jenkins-build.cmd'
|
|
||||||
// prepare stash for the binary scan
|
|
||||||
stash includes: '**/*.exe', name: 'win-rpc-app'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
stage ('Archive') {
|
|
||||||
steps {
|
|
||||||
archiveArtifacts allowEmptyArchive: true, artifacts: 'build\\Release\\rpc.exe', caseSensitive: false, onlyIfSuccessful: true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
stage('Prep Binary') {
|
|
||||||
steps {
|
|
||||||
sh 'mkdir -p ./bin'
|
|
||||||
dir('./bin') {
|
|
||||||
unstash 'linux-rpc-app'
|
|
||||||
unstash 'win-rpc-app'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
stage('Linux Scans') {
|
|
||||||
environment{
|
|
||||||
PROJECT_NAME = 'OpenAMT - RPC - Linux'
|
|
||||||
SCANNERS = 'bdba,klocwork'
|
|
||||||
|
|
||||||
// protecode details
|
|
||||||
PROTECODE_BIN_DIR = './bin'
|
|
||||||
PROTECODE_INCLUDE_SUB_DIRS = true
|
|
||||||
|
|
||||||
// klocwork details
|
|
||||||
KLOCWORK_SCAN_TYPE = 'c++'
|
|
||||||
KLOCWORK_PRE_BUILD_SCRIPT = './scripts/jenkins-pre-build.sh'
|
|
||||||
KLOCWORK_BUILD_COMMAND = './scripts/jenkins-build.sh'
|
|
||||||
KLOCWORK_IGNORE_COMPILE_ERRORS = true
|
|
||||||
|
|
||||||
// publishArtifacts details
|
|
||||||
PUBLISH_TO_ARTIFACTORY = true
|
|
||||||
}
|
|
||||||
steps {
|
|
||||||
rbheStaticCodeScan()
|
|
||||||
dir('artifacts/Klockwork'){
|
|
||||||
sh 'cp kw_report.html kw_report_linux.html'
|
|
||||||
sh 'cp kw_report.csv kw_report_linux.csv'
|
|
||||||
archiveArtifacts allowEmptyArchive: true, artifacts: 'kw_report_linux.html'
|
|
||||||
archiveArtifacts allowEmptyArchive: true, artifacts: 'kw_report_linux.csv'
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
stage('Windows Scans'){
|
|
||||||
agent { label 'openamt-win' }
|
|
||||||
stages{
|
|
||||||
stage ('Windows Scans - klocwork') {
|
|
||||||
environment {
|
|
||||||
PROJECT_NAME = 'OpenAMT - RPC - Windows'
|
|
||||||
SCANNERS = 'klocwork'
|
|
||||||
|
|
||||||
// klocwork details
|
|
||||||
KLOCWORK_SCAN_TYPE = 'c++'
|
|
||||||
KLOCWORK_PRE_BUILD_SCRIPT = 'scripts\\jenkins-pre-build.cmd'
|
|
||||||
KLOCWORK_BUILD_COMMAND = 'scripts\\jenkins-build.cmd'
|
|
||||||
KLOCWORK_IGNORE_COMPILE_ERRORS = true
|
|
||||||
|
|
||||||
// publishArtifacts details
|
|
||||||
PUBLISH_TO_ARTIFACTORY = true
|
|
||||||
}
|
|
||||||
steps {
|
|
||||||
rbheStaticCodeScan()
|
|
||||||
dir('artifacts\\Klockwork'){
|
|
||||||
bat 'copy kw_report.html kw_report_windows.html'
|
|
||||||
bat 'copy kw_report.csv kw_report_windows.csv'
|
|
||||||
stash includes: 'kw_report_windows.*', name: 'win-kwreports'
|
|
||||||
archiveArtifacts allowEmptyArchive: true, artifacts: 'kw_report_windows.html'
|
|
||||||
archiveArtifacts allowEmptyArchive: true, artifacts: 'kw_report_windows.csv'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
stage('Publish Artifacts'){
|
|
||||||
steps{
|
|
||||||
dir('artifacts/Klockwork'){
|
|
||||||
unstash 'win-kwreports'
|
|
||||||
}
|
|
||||||
publishArtifacts()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@@ -171,6 +171,10 @@ const PTHI_MESSAGE_HEADER GET_UUID_REQUEST_HEADER = {
|
|||||||
{AMT_MAJOR_VERSION, AMT_MINOR_VERSION}, 0, {{GET_UUID_REQUEST}}, 0
|
{AMT_MAJOR_VERSION, AMT_MINOR_VERSION}, 0, {{GET_UUID_REQUEST}}, 0
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const PTHI_MESSAGE_HEADER GET_START_CONFIG_HBASED_REQUEST_HEADER = {
|
||||||
|
{AMT_MAJOR_VERSION, AMT_MINOR_VERSION}, 0, {{GET_START_CONFIG_HBASED_REQUEST}}, 396
|
||||||
|
};
|
||||||
|
|
||||||
AMT_STATUS _call(const unsigned char *command, UINT32 command_size, UINT8 **readBuffer, UINT32 rcmd, unsigned int expSize)
|
AMT_STATUS _call(const unsigned char *command, UINT32 command_size, UINT8 **readBuffer, UINT32 rcmd, unsigned int expSize)
|
||||||
{
|
{
|
||||||
UINT32 inBuffSize;
|
UINT32 inBuffSize;
|
||||||
@@ -1502,4 +1506,43 @@ AMT_STATUS pthi_GetUUID(AMT_UUID *uuid)
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Start Configuration Host Based
|
||||||
|
* Arguments:
|
||||||
|
* request - host based configuration input parameters provided by the caller
|
||||||
|
* response - host based configuration output parameters returned to the caller
|
||||||
|
* Return values: (A status code returned in a response message that indicates whether the operation specified in the corresponding request message succeeded or failed. If the operation failed, this code indicates the specific reason for failure. Possible values described below.)
|
||||||
|
* AMT_STATUS_SUCCESS - Request succeeded.
|
||||||
|
* AMT_STATUS_INTERNAL_ERROR - An internal error to the AMT device has occurred. This may indicate an interface error, or a AMT application error.
|
||||||
|
* AMT_STATUS_INVALID_MESSAGE_LENGTH - Length field of header is invalid.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
AMT_STATUS pthi_StartConfigHBased(CFG_START_CONFIG_HBASED_REQUEST_INFO *request, CFG_START_CONFIG_HBASED_RESPONSE_INFO *response)
|
||||||
|
{
|
||||||
|
UINT8* readBuffer = NULL;
|
||||||
|
UINT32 command_size = sizeof(CFG_START_CONFIG_HBASED_REQUEST);
|
||||||
|
unsigned char command[sizeof(CFG_START_CONFIG_HBASED_REQUEST)];
|
||||||
|
AMT_STATUS status;
|
||||||
|
CFG_START_CONFIG_HBASED_RESPONSE* tmp_response;
|
||||||
|
|
||||||
|
memset(command, 0, sizeof(CFG_START_CONFIG_HBASED_REQUEST));
|
||||||
|
memcpy_s(command, sizeof(command), (char*)&(GET_START_CONFIG_HBASED_REQUEST_HEADER), sizeof(GET_START_CONFIG_HBASED_REQUEST_HEADER));
|
||||||
|
|
||||||
|
((CFG_START_CONFIG_HBASED_REQUEST*)command)->Info.ServerHashAlgorithm = request->ServerHashAlgorithm;
|
||||||
|
((CFG_START_CONFIG_HBASED_REQUEST*)command)->Info.HostVPNEnable = request->HostVPNEnable;
|
||||||
|
((CFG_START_CONFIG_HBASED_REQUEST*)command)->Info.SuffixListLen = request->SuffixListLen;
|
||||||
|
memcpy_s(((CFG_START_CONFIG_HBASED_REQUEST*)command)->Info.ServerCertHash, 64, request->ServerCertHash, 64);
|
||||||
|
memcpy_s(((CFG_START_CONFIG_HBASED_REQUEST*)command)->Info.NetworkDnsSuffixList, 320, request->NetworkDnsSuffixList, 320);
|
||||||
|
|
||||||
|
status = _call(command, command_size, &readBuffer, GET_START_CONFIG_HBASED_RESPONSE, sizeof(CFG_START_CONFIG_HBASED_RESPONSE));
|
||||||
|
|
||||||
|
if (status == AMT_STATUS_SUCCESS)
|
||||||
|
{
|
||||||
|
tmp_response = (CFG_START_CONFIG_HBASED_RESPONSE*)readBuffer;
|
||||||
|
memcpy_s(response, sizeof(CFG_START_CONFIG_HBASED_RESPONSE_INFO), &(tmp_response->Info), sizeof(CFG_START_CONFIG_HBASED_RESPONSE_INFO));
|
||||||
|
}
|
||||||
|
if (readBuffer != NULL) free(readBuffer);
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -664,6 +664,38 @@ typedef struct _CFG_GET_UUID_RESPONSE
|
|||||||
AMT_UUID UUID;
|
AMT_UUID UUID;
|
||||||
} CFG_GET_UUID_RESPONSE;
|
} CFG_GET_UUID_RESPONSE;
|
||||||
|
|
||||||
|
typedef struct _CFG_START_CONFIG_HBASED_REQUEST_INFO
|
||||||
|
{
|
||||||
|
CERT_HASH_ALGORITHM ServerHashAlgorithm;
|
||||||
|
UINT8 ServerCertHash[CERT_HASH_MAX_LENGTH];
|
||||||
|
AMT_BOOLEAN HostVPNEnable;
|
||||||
|
UINT32 SuffixListLen;
|
||||||
|
CHAR NetworkDnsSuffixList[320];
|
||||||
|
|
||||||
|
} CFG_START_CONFIG_HBASED_REQUEST_INFO;
|
||||||
|
|
||||||
|
typedef struct _CFG_START_CONFIG_HBASED_REQUEST
|
||||||
|
{
|
||||||
|
PTHI_MESSAGE_HEADER Header;
|
||||||
|
CFG_START_CONFIG_HBASED_REQUEST_INFO Info;
|
||||||
|
|
||||||
|
} CFG_START_CONFIG_HBASED_REQUEST;
|
||||||
|
|
||||||
|
typedef struct _CFG_START_CONFIG_HBASED_RESPONSE_INFO
|
||||||
|
{
|
||||||
|
PTHI_RESPONSE_MESSAGE_HEADER Header;
|
||||||
|
AMT_STATUS Status;
|
||||||
|
CERT_HASH_ALGORITHM HashAlgorithm;
|
||||||
|
UINT8 AMTCertHash[CERT_HASH_MAX_LENGTH];
|
||||||
|
} CFG_START_CONFIG_HBASED_RESPONSE_INFO;
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct _CFG_START_CONFIG_HBASED_RESPONSE
|
||||||
|
{
|
||||||
|
PTHI_RESPONSE_MESSAGE_HEADER Header;
|
||||||
|
CFG_START_CONFIG_HBASED_RESPONSE_INFO Info;
|
||||||
|
} CFG_START_CONFIG_HBASED_RESPONSE;
|
||||||
|
|
||||||
#pragma pack()
|
#pragma pack()
|
||||||
|
|
||||||
|
|
||||||
@@ -701,6 +733,7 @@ AMT_STATUS pthi_Unprovision(CFG_PROVISIONING_MODE provisionMode);
|
|||||||
AMT_STATUS pthi_GetStateEHBC(AMT_EHBC_STATE *state);
|
AMT_STATUS pthi_GetStateEHBC(AMT_EHBC_STATE *state);
|
||||||
AMT_STATUS pthi_GetControlMode(int *state);
|
AMT_STATUS pthi_GetControlMode(int *state);
|
||||||
AMT_STATUS pthi_GetUUID(AMT_UUID *uuid);
|
AMT_STATUS pthi_GetUUID(AMT_UUID *uuid);
|
||||||
|
AMT_STATUS pthi_StartConfigHBased(CFG_START_CONFIG_HBASED_REQUEST_INFO* request, CFG_START_CONFIG_HBASED_RESPONSE_INFO* response);
|
||||||
|
|
||||||
#define PROVISIONING_MODE_REQUEST 0x04000008
|
#define PROVISIONING_MODE_REQUEST 0x04000008
|
||||||
#define PROVISIONING_MODE_RESPONSE 0x04800008
|
#define PROVISIONING_MODE_RESPONSE 0x04800008
|
||||||
@@ -831,6 +864,9 @@ const PTHI_MESSAGE_HEADER GET_CONTROL_MODE_HEADER;
|
|||||||
#define GET_UUID_REQUEST 0x400005c
|
#define GET_UUID_REQUEST 0x400005c
|
||||||
#define GET_UUID_RESPONSE 0x480005c
|
#define GET_UUID_RESPONSE 0x480005c
|
||||||
|
|
||||||
|
#define GET_START_CONFIG_HBASED_REQUEST 0x400008b
|
||||||
|
#define GET_START_CONFIG_HBASED_RESPONSE 0x480008b
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
31
README.md
31
README.md
@@ -4,43 +4,26 @@
|
|||||||
|
|
||||||
The Remote Provisioning Client (RPC) is an application that enables remote capabilities for Intel® AMT, such as as device activation and configuration. To accomplish this, RPC communicates with the Remote Provisioning Server (RPS) to activate and connect the edge device.
|
The Remote Provisioning Client (RPC) is an application that enables remote capabilities for Intel® AMT, such as as device activation and configuration. To accomplish this, RPC communicates with the Remote Provisioning Server (RPS) to activate and connect the edge device.
|
||||||
|
|
||||||
<br><br>
|
|
||||||
|
|
||||||
**For detailed documentation** about RPC or other features of the Open AMT Cloud Toolkit, see the [docs](https://open-amt-cloud-toolkit.github.io/docs/).
|
**For detailed documentation** about RPC or other features of the Open AMT Cloud Toolkit, see the [docs](https://open-amt-cloud-toolkit.github.io/docs/).
|
||||||
|
|
||||||
<br>
|
|
||||||
|
|
||||||
## Prerequisites
|
## Prerequisites
|
||||||
|
|
||||||
We leverage GitHub Actions as a means to build RPC automatically leveraging Github's CI/CD Infrastructure. This avoids having to deal with the challenges of getting your build environment just right on your local machine and allows you to get up and running much faster. Read more about GitHub Actions [here](https://github.blog/2019-08-08-github-actions-now-supports-ci-cd/#:~:text=GitHub%20Actions%20is%20an%20API,every%20step%20along%20the%20way.)
|
We leverage GitHub Actions as a means to build RPC automatically leveraging Github's CI/CD Infrastructure. This avoids having to deal with the challenges of getting your build environment just right on your local machine and allows you to get up and running much faster. Read more about GitHub Actions [here](https://github.blog/2019-08-08-github-actions-now-supports-ci-cd/#:~:text=GitHub%20Actions%20is%20an%20API,every%20step%20along%20the%20way.)
|
||||||
|
|
||||||
|
## Build the Remote Provisioning Client (RPC)
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<img src="assets/animations/forkandbuild.gif" width="650" />
|
<img src="assets/animations/forkandbuild.gif" width="650" />
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
## Build the Remote Provisioning Client (RPC)
|
1. Create a fork of the rpc repository [here](https://github.com/open-amt-cloud-toolkit/rpc/fork) or via the Fork button in the top-right corner of the rpc repository.
|
||||||
|
|
||||||
1. <a href="https://github.com/open-amt-cloud-toolkit/rpc/fork" target="_blank">Create a fork of rpc on GitHub.</a>
|
2. Click on "Actions" and Select "Build RPC (Native)" Workflow.
|
||||||
|
|
||||||
2. Click on the **Actions** tab at the top and select **Build RPC (Native) Debug/Release**.
|
3. Click "Run Workflow", select branch "master", and click "Run Workflow".
|
||||||
|
|
||||||
3. Click the **Run Workflow** dropdown.
|
4. Grab a coffee. The build for Windows will take approximately 30 minutes and the build for Linux will take approximately 5 minutes.
|
||||||
|
|
||||||
4. Select the **Branch: master**, or a preferred version, from the **Use workflow from** dropdown.
|
5. Once complete, click the completed job, and download the appropriate RPC for your OS under the "Artifacts" section.
|
||||||
|
|
||||||
5. By default, the Build Type should be **release**.
|
For detailed documentation about RPC and using it to activate a device, see the [docs](https://open-amt-cloud-toolkit.github.io/docs/)
|
||||||
|
|
||||||
6. Click the **Run Workflow** button. Grab a coffee and take a break! The build time ranges from 15 to 20 minutes.
|
|
||||||
|
|
||||||
8. Once the download is complete, click the completed job which will feature a green checkmark.
|
|
||||||
|
|
||||||
9. Download the appropriate RPC for your managed device's OS under the **Artifacts** section.
|
|
||||||
|
|
||||||
### To Delete your workflow run
|
|
||||||
|
|
||||||
1. Click the ellipsis ( **...** ) menu for the workflow.
|
|
||||||
|
|
||||||
2. Choose the **Delete workflow run** option.
|
|
||||||
|
|
||||||
For detailed documentation about RPC and using it to activate a device, see the [docs](https://open-amt-cloud-toolkit.github.io/docs/)
|
|
||||||
|
@@ -1,5 +0,0 @@
|
|||||||
# Security Policy
|
|
||||||
Intel is committed to rapidly addressing security vulnerabilities affecting our customers and providing clear guidance on the solution, impact, severity and mitigation.
|
|
||||||
|
|
||||||
## Reporting a Vulnerability
|
|
||||||
Please report any security vulnerabilities in this project utilizing the guidelines [here](https://www.intel.com/content/www/us/en/security-center/vulnerability-handling-guidelines.html).
|
|
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
#define PROTOCOL_VERSION "4.0.0"
|
#define PROTOCOL_VERSION "3.0.0"
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
#define convertstring to_utf16string
|
#define convertstring to_utf16string
|
||||||
|
165
commands.cpp
165
commands.cpp
@@ -32,6 +32,9 @@ bool cmd_is_admin()
|
|||||||
|
|
||||||
bool cmd_get_version(std::string& version)
|
bool cmd_get_version(std::string& version)
|
||||||
{
|
{
|
||||||
|
version = "14.0.0"; // FIXME: REMOVE WHEN HW AVAILABLE
|
||||||
|
return true; // FIXME: REMOVE WHEN HW AVAILABLE
|
||||||
|
|
||||||
version.clear();
|
version.clear();
|
||||||
|
|
||||||
// initialize HECI interface
|
// initialize HECI interface
|
||||||
@@ -282,54 +285,51 @@ bool cmd_get_certificate_hashes(std::vector<cert_hash_entry>& hash_entries)
|
|||||||
for (int i = 0; i < (int) amt_hash_handles.Length; i++)
|
for (int i = 0; i < (int) amt_hash_handles.Length; i++)
|
||||||
{
|
{
|
||||||
// get each entry
|
// get each entry
|
||||||
AMT_STATUS amt_status = pthi_GetCertificateHashEntry(amt_hash_handles.Handles[i], &certhash_entry);
|
AMT_STATUS status = pthi_GetCertificateHashEntry(amt_hash_handles.Handles[i], &certhash_entry);
|
||||||
|
|
||||||
if (amt_status == 0)
|
int hashSize;
|
||||||
|
cert_hash_entry tmp;
|
||||||
|
switch (certhash_entry.HashAlgorithm) {
|
||||||
|
case 0: // MD5
|
||||||
|
hashSize = 16;
|
||||||
|
tmp.algorithm = "MD5";
|
||||||
|
break;
|
||||||
|
case 1: // SHA1
|
||||||
|
hashSize = 20;
|
||||||
|
tmp.algorithm = "SHA1";
|
||||||
|
break;
|
||||||
|
case 2: // SHA256
|
||||||
|
hashSize = 32;
|
||||||
|
tmp.algorithm = "SHA256";
|
||||||
|
break;
|
||||||
|
case 3: // SHA512
|
||||||
|
hashSize = 64;
|
||||||
|
tmp.algorithm = "SHA512";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
hashSize = 0;
|
||||||
|
tmp.algorithm = "UNKNOWN";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (certhash_entry.IsActive == 1)
|
||||||
{
|
{
|
||||||
int hashSize;
|
std::string cert_name(certhash_entry.Name.Buffer, certhash_entry.Name.Length);
|
||||||
cert_hash_entry tmp;
|
tmp.name = cert_name;
|
||||||
switch (certhash_entry.HashAlgorithm) {
|
tmp.is_default = certhash_entry.IsDefault;
|
||||||
case 0: // MD5
|
tmp.is_active = certhash_entry.IsActive;
|
||||||
hashSize = 16;
|
|
||||||
tmp.algorithm = "MD5";
|
|
||||||
break;
|
|
||||||
case 1: // SHA1
|
|
||||||
hashSize = 20;
|
|
||||||
tmp.algorithm = "SHA1";
|
|
||||||
break;
|
|
||||||
case 2: // SHA256
|
|
||||||
hashSize = 32;
|
|
||||||
tmp.algorithm = "SHA256";
|
|
||||||
break;
|
|
||||||
case 3: // SHA512
|
|
||||||
hashSize = 64;
|
|
||||||
tmp.algorithm = "SHA512";
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
hashSize = 0;
|
|
||||||
tmp.algorithm = "UNKNOWN";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (certhash_entry.IsActive == 1)
|
std::string hashString;
|
||||||
|
for (int i = 0; i < hashSize; i++)
|
||||||
{
|
{
|
||||||
std::string cert_name(certhash_entry.Name.Buffer, certhash_entry.Name.Length);
|
char hex[10];
|
||||||
tmp.name = cert_name;
|
snprintf(hex, 10, "%02x", certhash_entry.CertificateHash[i]);
|
||||||
tmp.is_default = certhash_entry.IsDefault;
|
hashString += hex;
|
||||||
tmp.is_active = certhash_entry.IsActive;
|
|
||||||
|
|
||||||
std::string hashString;
|
|
||||||
for (int i = 0; i < hashSize; i++)
|
|
||||||
{
|
|
||||||
char hex[10];
|
|
||||||
snprintf(hex, 10, "%02x", certhash_entry.CertificateHash[i]);
|
|
||||||
hashString += hex;
|
|
||||||
}
|
|
||||||
|
|
||||||
tmp.hash = hashString;
|
|
||||||
|
|
||||||
hash_entries.push_back(tmp);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tmp.hash = hashString;
|
||||||
|
|
||||||
|
hash_entries.push_back(tmp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -380,14 +380,14 @@ bool cmd_get_remote_access_connection_status(int& network_status, int& remote_st
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool cmd_get_lan_interface_settings(lan_interface_settings& lan_interface_settings, bool wired_interface)
|
bool cmd_get_lan_interface_settings(lan_interface_settings& lan_interface_settings)
|
||||||
{
|
{
|
||||||
// initialize HECI interface
|
// initialize HECI interface
|
||||||
if (heci_Init(NULL, PTHI_CLIENT) == 0) return false;
|
if (heci_Init(NULL, PTHI_CLIENT) == 0) return false;
|
||||||
|
|
||||||
// get wired interface
|
// get wired interface
|
||||||
LAN_SETTINGS lan_settings;
|
LAN_SETTINGS lan_settings;
|
||||||
UINT32 interface_settings = (wired_interface) ? 0 : 1; // wired=0, wireless=1
|
UINT32 interface_settings = 0; // wired=0, wireless=1
|
||||||
AMT_STATUS amt_status = pthi_GetLanInterfaceSettings(interface_settings, &lan_settings);
|
AMT_STATUS amt_status = pthi_GetLanInterfaceSettings(interface_settings, &lan_settings);
|
||||||
if (amt_status == 0)
|
if (amt_status == 0)
|
||||||
{
|
{
|
||||||
@@ -396,13 +396,11 @@ bool cmd_get_lan_interface_settings(lan_interface_settings& lan_interface_settin
|
|||||||
lan_interface_settings.dhcp_enabled = lan_settings.DhcpEnabled;
|
lan_interface_settings.dhcp_enabled = lan_settings.DhcpEnabled;
|
||||||
lan_interface_settings.link_status = lan_settings.LinkStatus;
|
lan_interface_settings.link_status = lan_settings.LinkStatus;
|
||||||
|
|
||||||
lan_interface_settings.ip_address.clear();
|
|
||||||
lan_interface_settings.ip_address.push_back((lan_settings.Ipv4Address >> 24) & 0xff);
|
lan_interface_settings.ip_address.push_back((lan_settings.Ipv4Address >> 24) & 0xff);
|
||||||
lan_interface_settings.ip_address.push_back((lan_settings.Ipv4Address >> 16) & 0xff);
|
lan_interface_settings.ip_address.push_back((lan_settings.Ipv4Address >> 16) & 0xff);
|
||||||
lan_interface_settings.ip_address.push_back((lan_settings.Ipv4Address >> 8) & 0xff);
|
lan_interface_settings.ip_address.push_back((lan_settings.Ipv4Address >> 8) & 0xff);
|
||||||
lan_interface_settings.ip_address.push_back((lan_settings.Ipv4Address) & 0xff);
|
lan_interface_settings.ip_address.push_back((lan_settings.Ipv4Address) & 0xff);
|
||||||
|
|
||||||
lan_interface_settings.mac_address.clear();
|
|
||||||
lan_interface_settings.mac_address.push_back(lan_settings.MacAddress[0]);
|
lan_interface_settings.mac_address.push_back(lan_settings.MacAddress[0]);
|
||||||
lan_interface_settings.mac_address.push_back(lan_settings.MacAddress[1]);
|
lan_interface_settings.mac_address.push_back(lan_settings.MacAddress[1]);
|
||||||
lan_interface_settings.mac_address.push_back(lan_settings.MacAddress[2]);
|
lan_interface_settings.mac_address.push_back(lan_settings.MacAddress[2]);
|
||||||
@@ -415,3 +413,76 @@ bool cmd_get_lan_interface_settings(lan_interface_settings& lan_interface_settin
|
|||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool cmd_start_config_host_based(config_host_based_settings& server_cert, config_host_based_settings& amt_cert)
|
||||||
|
{
|
||||||
|
amt_cert.algorithm = "MD5"; // FIXME: REMOVE WHEN HW AVAILABLE
|
||||||
|
amt_cert.hash = "000102030405060708090a0b0c0d0e0f"; // FIXME: REMOVE WHEN HW AVAILABLE
|
||||||
|
return true; // FIXME: REMOVE WHEN HW AVAILABLE
|
||||||
|
|
||||||
|
// initialize HECI interface
|
||||||
|
if (heci_Init(NULL, PTHI_CLIENT) == 0) return false;
|
||||||
|
|
||||||
|
CFG_START_CONFIG_HBASED_REQUEST_INFO request;
|
||||||
|
CFG_START_CONFIG_HBASED_RESPONSE_INFO response;
|
||||||
|
|
||||||
|
memset(&request, 0, sizeof(CFG_START_CONFIG_HBASED_REQUEST_INFO));
|
||||||
|
memset(&response, 0, sizeof(CFG_START_CONFIG_HBASED_RESPONSE_INFO));
|
||||||
|
|
||||||
|
if (server_cert.algorithm == "MD5")
|
||||||
|
{
|
||||||
|
request.ServerHashAlgorithm = CERT_HASH_ALGORITHM_MD5;
|
||||||
|
}
|
||||||
|
else if (server_cert.algorithm == "SHA1")
|
||||||
|
{
|
||||||
|
request.ServerHashAlgorithm = CERT_HASH_ALGORITHM_SHA1;
|
||||||
|
}
|
||||||
|
else if (server_cert.algorithm == "SHA256")
|
||||||
|
{
|
||||||
|
request.ServerHashAlgorithm = CERT_HASH_ALGORITHM_SHA256;
|
||||||
|
}
|
||||||
|
else if (server_cert.algorithm == "SHA512")
|
||||||
|
{
|
||||||
|
request.ServerHashAlgorithm = CERT_HASH_ALGORITHM_SHA512;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<char> cert_bytes;
|
||||||
|
util_hex_string_to_bytes(server_cert.hash, cert_bytes);
|
||||||
|
std::copy(std::begin(cert_bytes), std::end(cert_bytes), request.ServerCertHash);
|
||||||
|
|
||||||
|
// start secure host based configuration
|
||||||
|
AMT_STATUS amt_status = pthi_StartConfigHBased(&request, &response);
|
||||||
|
|
||||||
|
if (amt_status == 0)
|
||||||
|
{
|
||||||
|
switch (response.HashAlgorithm)
|
||||||
|
{
|
||||||
|
case CERT_HASH_ALGORITHM_MD5:
|
||||||
|
amt_cert.algorithm = "MD5";
|
||||||
|
break;
|
||||||
|
case CERT_HASH_ALGORITHM_SHA1:
|
||||||
|
amt_cert.algorithm = "SHA1";
|
||||||
|
break;
|
||||||
|
case CERT_HASH_ALGORITHM_SHA256:
|
||||||
|
amt_cert.algorithm = "SHA256";
|
||||||
|
break;
|
||||||
|
case CERT_HASH_ALGORITHM_SHA512:
|
||||||
|
amt_cert.algorithm = "SHA512";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<char> hash;
|
||||||
|
std::copy(std::begin(response.AMTCertHash), std::end(response.AMTCertHash), std::begin(hash));
|
||||||
|
util_bytes_to_hex_string(hash, amt_cert.hash);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
@@ -37,6 +37,12 @@ struct fqdn_settings
|
|||||||
std::string fqdn;
|
std::string fqdn;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct config_host_based_settings
|
||||||
|
{
|
||||||
|
std::string hash;
|
||||||
|
std::string algorithm;
|
||||||
|
};
|
||||||
|
|
||||||
bool cmd_is_admin();
|
bool cmd_is_admin();
|
||||||
bool cmd_get_version(std::string& version);
|
bool cmd_get_version(std::string& version);
|
||||||
bool cmd_get_build_number(std::string& version);
|
bool cmd_get_build_number(std::string& version);
|
||||||
@@ -49,6 +55,7 @@ bool cmd_get_dns_suffix(std::string& suffix);
|
|||||||
bool cmd_get_wired_mac_address(std::vector<unsigned char>& address);
|
bool cmd_get_wired_mac_address(std::vector<unsigned char>& address);
|
||||||
bool cmd_get_certificate_hashes(std::vector<cert_hash_entry>& hash_entries);
|
bool cmd_get_certificate_hashes(std::vector<cert_hash_entry>& hash_entries);
|
||||||
bool cmd_get_remote_access_connection_status(int& network_status, int& remote_status, int& remote_trigger, std::string& mps_hostname);
|
bool cmd_get_remote_access_connection_status(int& network_status, int& remote_status, int& remote_trigger, std::string& mps_hostname);
|
||||||
bool cmd_get_lan_interface_settings(lan_interface_settings& lan_interface_settings, bool wired_interface = true);
|
bool cmd_get_lan_interface_settings(lan_interface_settings& lan_interface_settings);
|
||||||
|
bool cmd_start_config_host_based(config_host_based_settings& server_cert, config_host_based_settings& amt_cert);
|
||||||
|
|
||||||
#endif
|
#endif
|
44
info.cpp
44
info.cpp
@@ -20,7 +20,7 @@ void out_text(const std::string name, const std::vector<unsigned char> value, co
|
|||||||
for (unsigned char tmp : value)
|
for (unsigned char tmp : value)
|
||||||
{
|
{
|
||||||
(hex) ? std::cout << std::setfill('0') << std::setw(2) << std::hex << (unsigned int)tmp
|
(hex) ? std::cout << std::setfill('0') << std::setw(2) << std::hex << (unsigned int)tmp
|
||||||
: std::cout << std::dec << (unsigned int)tmp;
|
: std::cout << (unsigned int)tmp;
|
||||||
|
|
||||||
if (char_count++ < value.size())
|
if (char_count++ < value.size())
|
||||||
{
|
{
|
||||||
@@ -270,41 +270,15 @@ bool info_get_lan_interface_settings()
|
|||||||
tmp.ip_address.clear();
|
tmp.ip_address.clear();
|
||||||
tmp.mac_address.clear();
|
tmp.mac_address.clear();
|
||||||
|
|
||||||
bool hasWired = cmd_get_lan_interface_settings(tmp);
|
if (!cmd_get_lan_interface_settings(tmp)) return false;
|
||||||
if (hasWired)
|
|
||||||
{
|
|
||||||
out_text("LAN Interface", "wired");
|
|
||||||
out_text("DHCP Enabled", (tmp.dhcp_enabled) ? "true" : "false");
|
|
||||||
out_text("DHCP Mode", (tmp.dhcp_mode == 1) ? "active" : "passive");
|
|
||||||
out_text("Link Status", (tmp.link_status) ? "up" : "down");
|
|
||||||
out_text("IP Address", tmp.ip_address, '.', false);
|
|
||||||
out_text("MAC Address", tmp.mac_address, ':');
|
|
||||||
}
|
|
||||||
|
|
||||||
tmp.is_enabled = false;
|
|
||||||
tmp.link_status = false;
|
|
||||||
tmp.dhcp_enabled = false;
|
|
||||||
tmp.dhcp_mode = 0;
|
|
||||||
tmp.ip_address.clear();
|
|
||||||
tmp.mac_address.clear();
|
|
||||||
|
|
||||||
bool hasWireless = cmd_get_lan_interface_settings(tmp, false);
|
out_text("DHCP Enabled", (tmp.dhcp_enabled) ? "true" : "false");
|
||||||
if (hasWireless)
|
out_text("DHCP Mode", (tmp.dhcp_mode == 1) ? "active" : "passive");
|
||||||
{
|
out_text("Link Status", (tmp.link_status) ? "up" : "down");
|
||||||
out_text("LAN Interface", "wireless");
|
out_text("IP Address", tmp.ip_address, '.', false);
|
||||||
out_text("DHCP Enabled", (tmp.dhcp_enabled) ? "true" : "false");
|
out_text("MAC Address", tmp.mac_address, ':');
|
||||||
out_text("DHCP Mode", (tmp.dhcp_mode == 1) ? "active" : "passive");
|
|
||||||
out_text("Link Status", (tmp.link_status) ? "up" : "down");
|
|
||||||
out_text("IP Address", tmp.ip_address, '.', false);
|
|
||||||
out_text("MAC Address", tmp.mac_address, ':');
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hasWired || hasWireless)
|
return true;
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool info_get(const std::string info)
|
bool info_get(const std::string info)
|
||||||
@@ -368,4 +342,4 @@ bool info_get_verify(const std::string info)
|
|||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
13
lms.cpp
13
lms.cpp
@@ -15,13 +15,22 @@
|
|||||||
#include <netdb.h>
|
#include <netdb.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
SOCKET lms_connect()
|
SOCKET lms_connect(bool securePort)
|
||||||
{
|
{
|
||||||
std::string lmsAddress = "localhost";
|
std::string lmsAddress = "localhost";
|
||||||
std::string lmsPort = "16992";
|
std::string lmsPort;
|
||||||
SOCKET s = INVALID_SOCKET;
|
SOCKET s = INVALID_SOCKET;
|
||||||
struct addrinfo *addr, hints;
|
struct addrinfo *addr, hints;
|
||||||
|
|
||||||
|
if (securePort)
|
||||||
|
{
|
||||||
|
lmsPort = "16993";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
lmsPort = "16992";
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
WSADATA wsa;
|
WSADATA wsa;
|
||||||
if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
|
if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
|
||||||
|
2
lms.h
2
lms.h
@@ -28,6 +28,6 @@ static inline int closesocket(int fd)
|
|||||||
#define SD_BOTH SHUT_RDWR
|
#define SD_BOTH SHUT_RDWR
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
SOCKET lms_connect();
|
SOCKET lms_connect(bool securePort = false);
|
||||||
|
|
||||||
#endif
|
#endif
|
96
main.cpp
96
main.cpp
@@ -7,12 +7,11 @@
|
|||||||
#include <thread>
|
#include <thread>
|
||||||
#include <cpprest/ws_client.h>
|
#include <cpprest/ws_client.h>
|
||||||
#include <cpprest/json.h>
|
#include <cpprest/json.h>
|
||||||
#include <algorithm>
|
|
||||||
#include "port.h"
|
#include "port.h"
|
||||||
#include "lms.h"
|
#include "lms.h"
|
||||||
#include "commands.h"
|
#include "commands.h"
|
||||||
#include "activation.h"
|
#include "activation.h"
|
||||||
#include "heartbeat.h"
|
#include "shbc.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
#include "usage.h"
|
#include "usage.h"
|
||||||
#include "args.h"
|
#include "args.h"
|
||||||
@@ -63,6 +62,7 @@ int main(int argc, char* argv[])
|
|||||||
std::string arg_info;
|
std::string arg_info;
|
||||||
bool arg_verbose = false;
|
bool arg_verbose = false;
|
||||||
bool arg_nocertcheck = false;
|
bool arg_nocertcheck = false;
|
||||||
|
bool secureHostBasedConfig = false;
|
||||||
|
|
||||||
if (argc == 1)
|
if (argc == 1)
|
||||||
{
|
{
|
||||||
@@ -186,7 +186,7 @@ int main(int argc, char* argv[])
|
|||||||
memset(&lms_socket, 0, sizeof(SOCKET));
|
memset(&lms_socket, 0, sizeof(SOCKET));
|
||||||
|
|
||||||
// set receive handler
|
// set receive handler
|
||||||
client.set_message_handler([&client, &mx, &cv, &lms_socket, arg_verbose](web::websockets::client::websocket_incoming_message ret_msg)
|
client.set_message_handler([&client, &mx, &cv, &lms_socket, arg_verbose, &secureHostBasedConfig](web::websockets::client::websocket_incoming_message ret_msg)
|
||||||
{
|
{
|
||||||
// kick the timer
|
// kick the timer
|
||||||
std::chrono::time_point<std::chrono::system_clock> now = std::chrono::system_clock::now();
|
std::chrono::time_point<std::chrono::system_clock> now = std::chrono::system_clock::now();
|
||||||
@@ -248,20 +248,56 @@ int main(int argc, char* argv[])
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (msgMethod.compare("heartbeat_request") == 0)
|
if (msgMethod.compare("secure_config_request") == 0)
|
||||||
{
|
{
|
||||||
// create the response
|
std::string certAlgo;
|
||||||
std::string response;
|
std::string certHash;
|
||||||
if (!heartbeat_create_response(response)) return;
|
|
||||||
|
|
||||||
// send it
|
// get server configuration
|
||||||
web::websockets::client::websocket_outgoing_message send_websocket_msg;
|
try
|
||||||
std::string send_websocket_buffer(response);
|
{
|
||||||
send_websocket_msg.set_utf8_message(send_websocket_buffer);
|
tmp = parsed[U("payload")].as_string();
|
||||||
client.send(send_websocket_msg).wait();
|
web::json::value parsed_cert_info = web::json::value::parse(tmp);
|
||||||
|
|
||||||
|
out = parsed_cert_info[U("algorithm")].as_string();
|
||||||
|
certAlgo = utility::conversions::to_utf8string(out);
|
||||||
|
|
||||||
|
out = parsed_cert_info[U("hash")].as_string();
|
||||||
|
certHash = utility::conversions::to_utf8string(out);
|
||||||
|
}
|
||||||
|
catch (...)
|
||||||
|
{
|
||||||
|
std::cerr << std::endl << "JSON format error. Unable to parse message." << std::endl;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// send secure config request
|
||||||
|
config_host_based_settings server_cert;
|
||||||
|
config_host_based_settings amt_cert;
|
||||||
|
server_cert.algorithm = certAlgo;
|
||||||
|
server_cert.hash = certHash;
|
||||||
|
if (cmd_start_config_host_based(server_cert, amt_cert))
|
||||||
|
{
|
||||||
|
// create the response
|
||||||
|
std::string response;
|
||||||
|
if (!shbc_create_response(amt_cert.algorithm, amt_cert.hash, response)) return;
|
||||||
|
|
||||||
|
// send it
|
||||||
|
web::websockets::client::websocket_outgoing_message send_websocket_msg;
|
||||||
|
std::string send_websocket_buffer(response);
|
||||||
|
send_websocket_msg.set_utf8_message(send_websocket_buffer);
|
||||||
|
client.send(send_websocket_msg).wait();
|
||||||
|
|
||||||
|
// use secure host post for LMS going forward
|
||||||
|
secureHostBasedConfig = true;
|
||||||
|
|
||||||
|
return;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// process any messages we can
|
// process any messages we can
|
||||||
// - if success, done
|
// - if success, done
|
||||||
@@ -272,22 +308,7 @@ int main(int argc, char* argv[])
|
|||||||
g_timeout_val = 0;
|
g_timeout_val = 0;
|
||||||
|
|
||||||
// exit
|
// exit
|
||||||
try {
|
std::cout << std::endl << msgMessage << std::endl;
|
||||||
std::cout << std::endl;
|
|
||||||
utility::string_t tmp = utility::conversions::convertstring(msgMessage);
|
|
||||||
web::json::value parsed = web::json::value::parse(tmp);
|
|
||||||
for (const auto& obj : parsed.as_object()) {
|
|
||||||
std::string key = utility::conversions::to_utf8string(obj.first);
|
|
||||||
std::string value = utility::conversions::to_utf8string(obj.second.serialize());
|
|
||||||
value.erase(std::remove(value.begin(), value.end(), '"'), value.end());
|
|
||||||
std::cout << key << ": " << value << std::endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (...)
|
|
||||||
{
|
|
||||||
std::cout << std::endl << msgMessage << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else if (msgStatus.compare("failed")==0)
|
else if (msgStatus.compare("failed")==0)
|
||||||
@@ -296,22 +317,7 @@ int main(int argc, char* argv[])
|
|||||||
g_timeout_val = 0;
|
g_timeout_val = 0;
|
||||||
|
|
||||||
// exit
|
// exit
|
||||||
try {
|
std::cout << std::endl << msgMessage << std::endl;
|
||||||
std::cout << std::endl;
|
|
||||||
utility::string_t tmp = utility::conversions::convertstring(msgMessage);
|
|
||||||
web::json::value parsed = web::json::value::parse(tmp);
|
|
||||||
for (const auto& obj : parsed.as_object()) {
|
|
||||||
std::string key = utility::conversions::to_utf8string(obj.first);
|
|
||||||
std::string value = utility::conversions::to_utf8string(obj.second.serialize());
|
|
||||||
value.erase(std::remove(value.begin(), value.end(), '"'), value.end());
|
|
||||||
std::cout << key << ": " << value << std::endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (...)
|
|
||||||
{
|
|
||||||
std::cout << std::endl << msgMessage << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -343,7 +349,7 @@ int main(int argc, char* argv[])
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
// conntect to lms
|
// conntect to lms
|
||||||
lms_socket = lms_connect();
|
lms_socket = lms_connect(secureHostBasedConfig);
|
||||||
}
|
}
|
||||||
catch (...)
|
catch (...)
|
||||||
{
|
{
|
||||||
|
@@ -14,7 +14,7 @@ set BASE_DIR=%cd%
|
|||||||
set VCPKG_DIR=C:\opt\vcpkg-source
|
set VCPKG_DIR=C:\opt\vcpkg-source
|
||||||
|
|
||||||
REM build RPC
|
REM build RPC
|
||||||
|
cd %BASE_DIR%/rpc
|
||||||
|
|
||||||
if exist "build" rd /q /s "build"
|
if exist "build" rd /q /s "build"
|
||||||
|
|
||||||
@@ -23,4 +23,4 @@ cd build
|
|||||||
echo %VCPKG_DIR%\vcpkg\scripts\buildsystems\vcpkg.cmake
|
echo %VCPKG_DIR%\vcpkg\scripts\buildsystems\vcpkg.cmake
|
||||||
cmake -DVCPKG_TARGET_TRIPLET=x64-windows-static -DCMAKE_TOOLCHAIN_FILE=%VCPKG_DIR%\vcpkg\scripts\buildsystems\vcpkg.cmake ..
|
cmake -DVCPKG_TARGET_TRIPLET=x64-windows-static -DCMAKE_TOOLCHAIN_FILE=%VCPKG_DIR%\vcpkg\scripts\buildsystems\vcpkg.cmake ..
|
||||||
cmake --build . --config Release
|
cmake --build . --config Release
|
||||||
dir %BASE_DIR%\build
|
dir %BASE_DIR%\rpc\build
|
||||||
|
@@ -5,9 +5,9 @@ set -x
|
|||||||
# Jenkins Build script
|
# Jenkins Build script
|
||||||
# - Ubuntu 18.04
|
# - Ubuntu 18.04
|
||||||
#
|
#
|
||||||
export BASE_DIR="$PWD"
|
|
||||||
export CMAKE_CXX_FLAGS="-isystem /usr/lib/gcc/x86_64-linux-gnu/7/include"
|
|
||||||
|
|
||||||
|
export CMAKE_CXX_FLAGS="-isystem /usr/lib/gcc/x86_64-linux-gnu/7/include"
|
||||||
|
cd "$BASE_DIR"/rpc
|
||||||
|
|
||||||
if [ -d "build" ]; then
|
if [ -d "build" ]; then
|
||||||
rm -rf build
|
rm -rf build
|
||||||
@@ -15,5 +15,5 @@ fi
|
|||||||
|
|
||||||
mkdir build
|
mkdir build
|
||||||
cd build
|
cd build
|
||||||
cmake -DCMAKE_TOOLCHAIN_FILE="$BASE_DIR"/vcpkg/scripts/buildsystems/vcpkg.cmake -DCMAKE_BUILD_TYPE=Release ..
|
cmake -DCMAKE_TOOLCHAIN_FILE="$BASE_DIR"/rpc/vcpkg/scripts/buildsystems/vcpkg.cmake -DCMAKE_BUILD_TYPE=Release ..
|
||||||
cmake --build .
|
cmake --build .
|
||||||
|
@@ -15,9 +15,8 @@ set VCPKG_DIR=C:\opt\vcpkg-source
|
|||||||
cd %VCPKG_DIR%
|
cd %VCPKG_DIR%
|
||||||
|
|
||||||
REM build vcpkg
|
REM build vcpkg
|
||||||
git clone https://github.com/microsoft/vcpkg.git
|
git clone --branch 2020.11-1 https://github.com/microsoft/vcpkg.git
|
||||||
cd vcpkg
|
cd vcpkg
|
||||||
git checkout 772d435ba18bf2f342458e0187ab7b48b84fe3f0
|
|
||||||
cmd /c bootstrap-vcpkg.bat
|
cmd /c bootstrap-vcpkg.bat
|
||||||
|
|
||||||
REM install CPPRestSDK
|
REM install CPPRestSDK
|
||||||
|
@@ -4,17 +4,15 @@
|
|||||||
# - Ubuntu 18.04
|
# - Ubuntu 18.04
|
||||||
#
|
#
|
||||||
|
|
||||||
apt update
|
sudo apt install git cmake build-essential curl zip unzip tar pkg-config
|
||||||
apt install git cmake build-essential curl zip unzip tar pkg-config -y
|
|
||||||
|
|
||||||
## current dir - RPC source directory
|
## current dir - RPC source directory
|
||||||
#export BASE_DIR="$PWD"
|
export BASE_DIR="$PWD"
|
||||||
|
|
||||||
#cd "$BASE_DIR"/rpc
|
cd "$BASE_DIR"/rpc
|
||||||
## build vcpkg
|
## build vcpkg
|
||||||
git -C vcpkg pull || git clone https://github.com/microsoft/vcpkg.git vcpkg
|
git clone --branch 2020.11-1 https://github.com/microsoft/vcpkg.git
|
||||||
cd vcpkg
|
cd vcpkg
|
||||||
git checkout 772d435ba18bf2f342458e0187ab7b48b84fe3f0
|
|
||||||
./bootstrap-vcpkg.sh
|
./bootstrap-vcpkg.sh
|
||||||
|
|
||||||
## install CPPRestSDK
|
## install CPPRestSDK
|
||||||
|
@@ -3,23 +3,41 @@
|
|||||||
* SPDX-License-Identifier: Apache-2.0
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
**********************************************************************/
|
**********************************************************************/
|
||||||
|
|
||||||
#include "heartbeat.h"
|
#include "activation.h"
|
||||||
#include <cpprest/ws_client.h>
|
#include <cpprest/ws_client.h>
|
||||||
#include <cpprest/json.h>
|
#include <cpprest/json.h>
|
||||||
#include <cpprest/streams.h>
|
#include <cpprest/streams.h>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include "activation.h"
|
|
||||||
#include "version.h"
|
#include "version.h"
|
||||||
#include "commands.h"
|
#include "commands.h"
|
||||||
#include "network.h"
|
#include "network.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
|
||||||
bool heartbeat_create_response(std::string& response)
|
bool get_response_payload(std::string cert_algo, std::string cert_hash, web::json::value& payload)
|
||||||
|
{
|
||||||
|
web::json::value value;
|
||||||
|
utility::string_t tmp;
|
||||||
|
web::json::value configParams;
|
||||||
|
|
||||||
|
// get client string
|
||||||
|
tmp = utility::conversions::convertstring(cert_algo);
|
||||||
|
configParams[U("algorithm")] = web::json::value::string(tmp);
|
||||||
|
|
||||||
|
// get certificate hashes
|
||||||
|
tmp = utility::conversions::convertstring(cert_hash);
|
||||||
|
configParams[U("hash")] = web::json::value::string(tmp);
|
||||||
|
|
||||||
|
payload = configParams;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool shbc_create_response(std::string cert_algo, std::string cert_hash, std::string& response)
|
||||||
{
|
{
|
||||||
web::json::value msg;
|
web::json::value msg;
|
||||||
|
|
||||||
utility::string_t tmp = utility::conversions::convertstring("heartbeat_response");
|
utility::string_t tmp = utility::conversions::convertstring("secure_config_response");
|
||||||
msg[U("method")] = web::json::value::string(tmp);
|
msg[U("method")] = web::json::value::string(tmp);
|
||||||
|
|
||||||
tmp = utility::conversions::convertstring("");
|
tmp = utility::conversions::convertstring("");
|
||||||
@@ -31,15 +49,21 @@ bool heartbeat_create_response(std::string& response)
|
|||||||
tmp = utility::conversions::convertstring(PROTOCOL_VERSION);
|
tmp = utility::conversions::convertstring(PROTOCOL_VERSION);
|
||||||
msg[U("protocolVersion")] = web::json::value::string(tmp);
|
msg[U("protocolVersion")] = web::json::value::string(tmp);
|
||||||
|
|
||||||
tmp = utility::conversions::convertstring("success");
|
tmp = utility::conversions::convertstring("");
|
||||||
msg[U("status")] = web::json::value::string(tmp);
|
msg[U("status")] = web::json::value::string(tmp);
|
||||||
|
|
||||||
tmp = utility::conversions::convertstring("");
|
tmp = utility::conversions::convertstring("");
|
||||||
msg[U("message")] = web::json::value::string(tmp);
|
msg[U("message")] = web::json::value::string(tmp);
|
||||||
|
|
||||||
// set empty payload
|
// get the activation payload
|
||||||
tmp = utility::conversions::convertstring("");
|
web::json::value responsePayload;
|
||||||
msg[U("payload")] = web::json::value::string(tmp);
|
if (!get_response_payload(cert_algo, cert_hash, responsePayload)) return false;
|
||||||
|
|
||||||
|
// serialize payload
|
||||||
|
std::string serializedPayload = utility::conversions::to_utf8string(responsePayload.serialize());
|
||||||
|
std::string encodedPayload = util_encode_base64(serializedPayload);
|
||||||
|
utility::string_t payload = utility::conversions::to_string_t(encodedPayload);
|
||||||
|
msg[U("payload")] = web::json::value::string(payload);
|
||||||
|
|
||||||
// serialize the entire message
|
// serialize the entire message
|
||||||
response = utility::conversions::to_utf8string(msg.serialize());
|
response = utility::conversions::to_utf8string(msg.serialize());
|
@@ -3,11 +3,17 @@
|
|||||||
* SPDX-License-Identifier: Apache-2.0
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
**********************************************************************/
|
**********************************************************************/
|
||||||
|
|
||||||
#ifndef __HEARTBEAT_H__
|
#ifndef __SHBC_H__
|
||||||
#define __HEARTBEAT_H__
|
#define __SHBC_H__
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
bool heartbeat_create_response(std::string& response);
|
#ifdef _WIN32
|
||||||
|
#define convertstring to_utf16string
|
||||||
|
#else
|
||||||
|
#define convertstring to_utf8string
|
||||||
|
#endif
|
||||||
|
|
||||||
|
bool shbc_create_response(std::string cert_algo, std::string cert_hash, std::string& response);
|
||||||
|
|
||||||
#endif
|
#endif
|
@@ -49,15 +49,15 @@ void usage_show_help()
|
|||||||
std::cout << "Examples:" << std::endl;
|
std::cout << "Examples:" << std::endl;
|
||||||
std::cout << " # Activate platform using profile1" << std::endl;
|
std::cout << " # Activate platform using profile1" << std::endl;
|
||||||
std::cout << " " << PROJECT_NAME << \
|
std::cout << " " << PROJECT_NAME << \
|
||||||
" --url wss://192.168.86.100/activate --cmd \"-t activate --profile profile1\"" << std::endl;
|
" --url wss://localhost:8080 --cmd \"-t activate --profile profile1\"" << std::endl;
|
||||||
std::cout << std::endl;
|
std::cout << std::endl;
|
||||||
std::cout << " # Activate platform using profile1 and override DNS detection" << std::endl;
|
std::cout << " # Activate platform using profile1 and override DNS detection" << std::endl;
|
||||||
std::cout << " " << PROJECT_NAME << \
|
std::cout << " " << PROJECT_NAME << \
|
||||||
" --url wss://mycloud.com/activate --cmd \"-t activate --profile profile1\" --dns corp.com" << std::endl;
|
" --url wss://localhost:8080 --cmd \"-t activate --profile profile1\" --dns corp.com" << std::endl;
|
||||||
std::cout << std::endl;
|
std::cout << std::endl;
|
||||||
std::cout << " # Deactivate platform and connect through a proxy" << std::endl;
|
std::cout << " # Deactivate platform and connect through a proxy" << std::endl;
|
||||||
std::cout << " " << PROJECT_NAME << \
|
std::cout << " " << PROJECT_NAME << \
|
||||||
" -u wss://mycloud.com/activate -c \"-t deactivate --password P@ssw0rd\" -p http://proxy.com:1000" << std::endl;
|
" -u wss://localhost:8080 -c \"-t deactivate --password P@ssw0rd\" -p http://proxy.com:1000" << std::endl;
|
||||||
std::cout << std::endl;
|
std::cout << std::endl;
|
||||||
std::cout << " # Show all informational items" << std::endl;
|
std::cout << " # Show all informational items" << std::endl;
|
||||||
std::cout << " " << PROJECT_NAME << " --amtinfo all" << std::endl;
|
std::cout << " " << PROJECT_NAME << " --amtinfo all" << std::endl;
|
||||||
|
27
utils.cpp
27
utils.cpp
@@ -57,3 +57,30 @@ bool util_format_uuid(std::vector<unsigned char> uuid_bytes, std::string& uuid_s
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool util_hex_string_to_bytes(std::string hex_string, std::vector<char>& hex_bytes)
|
||||||
|
{
|
||||||
|
hex_bytes.clear();
|
||||||
|
|
||||||
|
for (int i = 0; i < hex_string.length(); i += 2)
|
||||||
|
{
|
||||||
|
std::string byte_string = hex_string.substr(i, 2);
|
||||||
|
char value = (char)strtol(byte_string.c_str(), NULL, 16);
|
||||||
|
hex_bytes.push_back(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool util_bytes_to_hex_string(std::vector<char> hex_bytes, std::string& hex_string)
|
||||||
|
{
|
||||||
|
hex_string.clear();
|
||||||
|
|
||||||
|
for (char hex_char : hex_bytes)
|
||||||
|
{
|
||||||
|
char hex[10];
|
||||||
|
snprintf(hex, 10, "%02x", hex_char);
|
||||||
|
hex_string += hex;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
2
utils.h
2
utils.h
@@ -13,5 +13,7 @@ std::string util_encode_base64(std::string str);
|
|||||||
std::string util_decode_base64(std::string str);
|
std::string util_decode_base64(std::string str);
|
||||||
bool util_is_printable(std::string str);
|
bool util_is_printable(std::string str);
|
||||||
bool util_format_uuid(std::vector<unsigned char> uuid_bytes, std::string& uuid_string);
|
bool util_format_uuid(std::vector<unsigned char> uuid_bytes, std::string& uuid_string);
|
||||||
|
bool util_hex_string_to_bytes(std::string hex_string, std::vector<char>& hex_bytes);
|
||||||
|
bool util_bytes_to_hex_string(std::vector<char> hex_bytes, std::string& hex_string);
|
||||||
|
|
||||||
#endif
|
#endif
|
Reference in New Issue
Block a user