Language
gb
Expand
gb
pl
Currency
PLN
Expand
AUD
BGN
BRL
CAD
CHF
CLP
CNY
CZK
DKK
EUR
GBP
HKD
HRK
HUF
ILS
INR
ISK
JPY
KRW
LTL
LVL
MXN
MYR
NOK
NZD
PHP
PLN
RON
RUB
SEK
SGD
THB
TRY
UAH
USD
XDR
ZAR

MTD001/001K

mtd001-package.png This is the first device to be offered, free of third parties code or copyright limitations. It took about one year to develop it. It is ideal for small companies entering the market with their software solutions and also for these having many years of experience behind but still willing to change the way their software is secured.

Firmware written in assembly guarantees an effective usage of MCU's registers and very little bits of its memory. Prepared drivers are available for both, 32 and 64 bit machines. Device allows for selective memory access and also implements own encryption mechanism. It is possible to write more than one license on a single device and secure more than one software product or a modular product (enabling or disabling specific modules).

Software development

Available API supports both, classic C and C++ languages. The job that software developers need to do is to write few lines of essential code and add the libmtdcoder library to the linker's set of parameters. The library can be built into the main program (linked statically), or left as a stand alone DLL (linked dynamically). All needed examples can be found in the libmtdcoder package. The two examples below are pretty much similar. They show how to start the mtdcoder, enumerate devices and unlock the first of them.

// C++ source
// ...
#include "mtdcoder.h"
// ...
int main(){
  MTDCODER m;
  const char myCookie[] = {"ILoveCookies"};
  union {
    BYTE keyCnt; BYTE failCnt;
  };

  if(! m.mtd_enum_keys(keyCnt)) return 1;
     // Device enumeration fialed... Whoops!
  
  if(! m.mtd_log_in(myCookie,
          strlen(myCookie), & failCnt)) return 2;
     // log in failed!

  // Read and test the license, enable modules

  // Huge piece of code to protect
  return 0;
}
/* C source */
/* ... */
#include "mtdcoder-c.h"
/* ... */
int main(void){
  MTDCODER *mPtr;
  const char myCookie[] = {"ILoveCookies"};
  union {
    BYTE keyCnt; BYTE failCnt;
  };

  mPtr = mtd_init();
  if(mPtr == NULL) return 1; /* out of memory ? */

  if(! mtd_enum_keys(mPtr, & keyCnt, 0) ) \
    { mtd_free(mPtr); return 1; }
    /* Device enumeration fialed... Whoops! */

  if(! m.mtd_log_in(mPtr, myCookie, \
          strlen(myCookie), & failCnt)) \
    { mtd_free(mPtr); return 2; }
    /* Log in failed! */

  /* Read and test the license, enable modules */

  /* Huge piece of code to protect */

  mtd_free(mPtr); /* Don't forget! */
  return 0;
}

Next step would be to read and test the data space of the device and make decision whether the program should be continued or not. Software authors are free to decide when and where to make device's presence and/or content tests. It can be made in main window loop or inside some dedicated module, for example...

Dedicated software

With bought devices, clients grant a right to download and use a dedicated software, free of additional fees (also included on CD). Conditions of use are described inside the included software license. The license is also available here. It is a draft. If you are willing to negotiate the conditions, feel free to download and modify it. Next, send it back over the contact form. It is important to keep the file in original, plain text format.

Software updates can be downloaded over the download page. Some of them require from users to log in. Following packages are needed to work with software security devices:

  • libmtdcoder - device access module (communication module),
  • pk-coder - device programming tool,
  • pk-info - test tool,
  • drivers.

Additional resources