Proprietary information protection method6012033Abstract A method for protecting proprietary information. In one embodiment, the present invention is comprised of the steps of inserting a call to license management code within the proprietary information to be protected. The call to the license management code is inserted into the proprietary information such that at least one statement critical to the function of the proprietary information is embedded within the call to the license management code. Next, the present invention encrypts the call to the license management code having the at least one statement critical to the function of the proprietary information embedded therein. In so doing, the present invention produces a first encrypted code such that removal of the first encrypted code results in the removal of the at least one statement critical to the function of the proprietary information. The present invention then stores the first encrypted code and the proprietary information in computer readable memory. In so doing, the present invention allows a call to license management code to be used in such a manner that unauthorized removal of the call to the license management code compromises the integrity and completeness of the proprietary information. Claims I claim: Description TECHNICAL FIELD
TABLE I
______________________________________
`celldefine
`delay.sub.-- mode.sub.-- path
suppress.sub.-- faults
`enable.sub.-- portfaults
module vcc7ra5.sub.-- 2048x16.sub.-- xn (ar ,aw ,di ,do ,web );
parameter
. . .
//DEFINE PRIMARY I/O
. . .
//DEFINE INTERNAL VARIABLES
. . .
buf u110 (web.sub.-- b, web) ;
vcc7ra5.sub.-- 2048x16.sub.-- xn.sub.-- LOWER mem (ar.sub.-- b, aw.sub.--
b, di.sub.-- b, do.sub.-- b,
web.sub.-- b, web.sub.-- di.sub.-- setup, web.sub.-- aw.sub.-- setup,
web.sub.-- minw, web.sub.-- aw.sub.-- hold,
web.sub.-- di.sub.-- hold) ;
endmodule
`nosuppress.sub.-- faults
`disable.sub.-- portfaults
`endcelldefine
module vcc7ra5.sub.-- 2048x16.sub.-- xn.sub.-- LOWER (ar.sub.-- b,
aw.sub.-- b, di.sub.-- b, do.sub.-- b,
web.sub.-- b, web.sub.-- di.sub.-- setup, web.sub.-- aw.sub.-- setup,
web.sub.-- minw, web.sub.-- aw.sub.-- hold,
web.sub.-- di.sub.-- hold) ;
. . .
endmodule
______________________________________
As stated above in conjunction with step 202, the present invention then inserts the call to the license management code within an initial statement of the simulation model. Table II below shows a portion of simulation software containing an initial statement having the call to the license management code inserted therein. Specifically, the call to the license management code (which begins with $VLSIcheckThis License) is inserted into the simulation software. The call to the license management code is inserted into the simulation software such that at least one statement critical to the function of the simulation software (e.g. the "buf u110 (web.sub.-- b, web)" initial statement) is embedded within the call to the license management code.
TABLE II
______________________________________
`celldefine
`delay.sub.-- mode.sub.-- path
`suppress.sub.-- faults
`enable.sub.-- portfaults
module vcc7ra5.sub.-- 2048x16.sub.-- xn (ar ,aw ,di ,do ,web ) ;
parameter
. . .
//DEFINE PRIMARY I/O
. . .
//DEFINE INTERNAL VARIABLES
. . .
// Since one could simply edit out the encrypted portion of the model in
// an affort to disable the licensing, it's critical that the code
// within the `protect and `unprotect block contain at least one
// statement critical to the function of the model. That way, if the
// encrypted section is edited out, the model will be disabled. Since
// this is just an example, we accomplish this in this model
// simply by including the buf definition for u110. Normally, you'd
// include more of the model within the `protect/` unprotect block.
`protect
buf u110 (web.sub.-- b, web) ;
initial
begin
// Call license validation and checkout function. In the production
// version of this code, since you can't directly pass args to C
// from Verilog, the checkThisLicense function would use the
// PLI to get the license feature name, version, and vendor string
// coded here as `parameter definitions.
// To keep the feature name string out of executable, it needs
// to appear encoded in the source and then decoded before use.
// For the purpose of this prototype, the feature name, version and
// vendor string variables are hardcoded in VLSlcheckThisLicense.
//
// Although not implemented in this example, we could use the
// `misctf` system function to trap when the simulation was about to
// end. That would be the best point at which to checkin the license.
// if we were limiting the number of simultaneous uses. Otherwise,
// we'd immediately check if back in since we only want to validate
// the customer is allowed to use the license. This latter policy is
// what is implemented in this prototype.
// If there is any problem with the license for this model,
// VLSlcheckThisLicense routine will not return.
$VLSlcheckThis License( ) ;
end
`endprotect
vcc7ra5.sub.-- 2048x16.sub.-- xn.sub.-- LOWER mem (ar.sub.-- b, aw.sub.--
b, di.sub.-- b, do.sub.-- b,
web.sub.-- b, web.sub.-- di.sub.-- setup, web.sub.-- aw.sub.-- setup,
web.sub.-- minw, web.sub.-- aw.sub.-- hold,
web.sub.-- di.sub.-- hold) ;
endmodule
`nosuppress.sub.-- faults
`disable.sub.-- portfaults
endcelldefine
module vcc7ra5.sub.-- 2048x16.sub.-- xn.sub.-- LOWER (ar.sub.-- b,
aw.sub.-- b, di.sub.-- b, do.sub.-- b,
web.sub.-- b, web.sub.-- di.sub.-- setup, web.sub.-- aw.sub.-- setup,
web.sub.-- minw, web.sub.-- aw.sub.-- hold,
web.sub.-- di.sub.-- hold) ;
. . .
endmodule
______________________________________
In step 204 of the present embodiment, the present invention inserts protection statements (which begin with the 'protect statement and end with the 'endprotect statement). The statements are used to define the starting and ending points for encryption functions of the Verilog HDL language of the present simulation model. That is, the present embodiment uses verilog encryption capability to encrypt the call to license code having the statement critical to the function of the proprietary information embedded therein. Although such protection statements are used in the present embodiment, it will be understood that the present invention is also well suited to the use of various other types of protection statements corresponding to various other languages. Referring now to step 206, the present embodiment then encrypts the portion of the simulation model containing the call to license management code having the statement critical to the function of the proprietary information embedded therein. In the present embodiment, the encryption is performed on the code residing between the 'protect statement and the 'endprotect statement. In so doing, the present invention produces a first encrypted code. By embedding a statement critical to the function of the present simulation model within the call to the license management code, removal of the first encrypted code results in the removal of the statement critical to the function of the simulation model. Thus, an unscrupulous user of proprietary information containing the present invention will compromise the integrity or operation of the proprietary information by attempting to remove the call to the license management code. That is, by removing the call to the license management code, a statement critical to the function of the proprietary information will also be inadvertently removed. Furthermore, if a user simply attempts to remove the encrypted portion of the proprietary information, user will be removing a statement critical to the function of the proprietary information. Table III below shows the code of Table II after encryption step 206. The encrypted portion of code begins just after the 'protected statement and ends just before the 'endprotected statement.
TABLE III
______________________________________
`celldefine
`delay.sub.-- mode.sub.-- path
`suppress.sub.-- faults
`enable.sub.-- portfaults
module vcc7ra5.sub.-- 2048x16.sub.-- xn (ar ,aw ,di ,do ,web ) ;
parameter
. . .
//DEFINE PRIMARY I/O
. . .
//DEFINE INTERNAL VARIABLES
. . .
// Since one could simply edit out the encrypted portion of the model in
// an affort to disable the licensing, it's critical that the code
// within the `protect and `unprotect block contain at least one
// statement critical to the function of the model. That way, if the
// encrypted section is edited out, the model will be disabled. Since
// this is just a trivial example, we accomplish this in this model
// simply by including the buf definition for u110. Normally, you'd
// include more of the model within the `protect/ `unprotect block.
`protected
Y1]
:1SQV5DT <UMbS2z09Ngk1=C.sub.-- 1=b.backslash.EShLD'JE1YKH2oBT@dM8gh
m0kcJo4<EH ad JApWgofM6K;
@jEM07Y0kB1Reb:MXKi<L @1L4 YUWST
[50kDQLiJ33PBJiF.backslash.FdaSpC] fD =
3lj<kmb72i@<Kj.backslash.oM0dhcdqMi<cHmq?
<em.backslash.BXU15NmcD0nMFD340F j5LYVF;
AK>DbpAbm8 XqCaX@jgeqWBg9mJ7 D9<;
<3?F1I`DK1fPo<UY2HaL4 `ZEo [HG: b<.sub.-- Ljg7W
`iIFidpE52iY<pdD8n7Xpi8f [V`pmP0e.sub.-- `pdB<o]
dqT93J809mBLE71NaLHC`M8A`akcc4HeHFPdSgk`pK7 [Jo1p:
=8jP1qCEZQT7@gDLLHcK3LFYkU34Lo<Z54HVIa
[yh0JE4gcgVW:.sub.-- D1J[Veld?68KG?9FBQ1N9PLdqVh N:
apL`feCQpm Y>c9qT7@a].sub.-- p2110?.sub.-- qH:
c7c=pG>aJbdMYHd5D3R[aXH;nP7Eb@iVirL5<HU1Ree 0.sub.-- Hi0 =
7@S2jT?`
Yfl2FfqD<5.backslash.hkpCRKoZJp.backslash.c<YXWpEd.backslash.Znlp?K01.sub.
-- T6.sub.-- LahDDdQm; 954
zo0 HRHbfM;[Xj5BGQKANBHOI$
`endprotected
vcc7ra5.sub.-- 2048x16.sub.-- xn.sub.-- LOWER mem( ar.sub.-- b ,aw.sub.--
b ,di.sub.-- b ,do.sub.-- b ,
web.sub.-- b,
web.sub.-- di.sub.-- setup, web.sub.-- aw.sub.-- setup, web.sub.-- minw,
web.sub.-- aw.sub.-- hold,
web.sub.-- di.sub.-- hold) ;
endmodule
`nosuppress.sub.-- faults
`disable.sub.-- portfaults
`endcelldefine
module vcc7ra5.sub.-- 2048x16.sub.-- xn.sub.-- LOWER mem( ar.sub.-- b
,aw.sub.-- b ,di.sub.-- b,
do.sub.-- b ,
web.sub.-- b , web.sub.-- di.sub.-- setup, web.sub.-- aw.sub.-- setup,
web.sub.-- minw, web.sub.-- aw.sub.-- hold,
web.sub.-- di.sub.-- hold) ;
. . .
endmodule
______________________________________
In step 208, the present invention creates a customer license file for the simulation model. More specifically, in the present embodiment an intermediate step is performed such that the call to the license management code is comprised of two parts. First, the present embodiment calls a portion of code. Second, the portion of code then calls the license management code. Although such an approach is used in the present embodiment, the present invention is also well suited to operating without the above-described two-step approach to call the license management code. Table IV below lists one embodiment of the portion of the code which is used to call the license management code. Table V below lists one embodiment of the customer license file which is created for the simulation model. That is, the code of Table V is used to determine whether the customer/user has authorization to use/access the proprietary information.
TABLE IV
______________________________________
/* All functions are prefixed with "VLSl" to ensure no Iink conflicts
with
Verilog routines */
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
/* Not sure if all of these header files are needed */
#include <unistd.h> /* for gethostid */
#ifdef MACHINE.sub.-- HP
#include <sys?utsname.h>
#include <fcntl.h>
#include <netio.h>
#endif
#include <ctype.h>
#include "1 mclient.h"
#include "1m.sub.-- code.h"
int VLSlcheckThisLicense( )
/* These strings must be at least as long as the longest string plus 1
for the null terminator */
char nameStr [8], verStr [4];
int rtn;
/* This is a crude method to ensure the name of the license feature
does not appear in the executable symbol table. In production,
we should localize this info in the Verilog HDL model and retrieve
it using the PLI. */
char cn2 =
`c`,
cn5 = `a`,
cn4 = `r`,
cn1 = `c`,
cn6 = `5`,
cn0 = `v`,
cn3 = `7`,
cv1 = `.`,
cv0 = `2`,
cv2 = `1`,
sprintf(nameStr, "%c%c%c%c%c%c%c", cn0, cn1, cn2, cn3, cn4, cn5,
cn6);
sprintf(verStr, "%c%c%c", cv0, cv1, cv2);
rtn = VLSlcheckLicense(nameSTR, verSTR, " ");
/* It would be better if VLSlcheckLicense could return a value to
Verilog which indicated success or failure, but functions don't
appear to work correctly in Verilog PLI. Therefore, we'll just
print a message and exit the program. */
if (rtn !=0)
io.sub.-- printf("The program was unable to check out a license for this
for
this model /nand will now exit. .backslash.n");
return (rtn);
}
int VLSlcheckLicense(feature, version, vendorString)
char *feature, *version, Vendorstring;
{
int status = 0, daysLeft = 0;
CONFIG *thisConfig;
char message [256]
/* PROBLEM: Variables declared stsatic may be a problem in
common code which may be used by seperate calls to this function for
checking out different licenses. However, if the license checkout and
checkin calls are made
at different times, LM.sub.-- HANDLE would need to be declared static.
Since
the calls are made at the same time in this example, it's not a
problem.
*/
LM.sub.-- HANDLE *thisJob + (LM.sub.-- HANDLE *)0; /* Current license job
*/
LM.sub.-- CODE(code, ENCRYPTION-SEED1, ENCRYPTION-SEED2,
VENDOR.sub.-- KEY1, VENDOR.sub.-- KEY2, VENDOR.sub.-- KEY3,
VENDOR.sub.-- KEY4, VENDOR.sub.-- KEY5);
status = 1c.sub.-- checkout(this Job, feature, version, 1, LM.sub.--
CO.sub.-- NOWAIT,
&code,
LM.sub.-- DUP.sub.-- NONE);
}
if (status) {
sprintf (message, ".backslash.nFlexlm license error for feature
(%s).backslash.n%s.backslash.nPlease contact your local VLSl
representative for
assistance. .backslash.n.backslash.n", feature, 1c.sub.-- errstring(thisJo
b));
VLSlprintError(message);
}
else {
/* Report any error with the licensing (number of days)
and check the vendorstring
Return 0 if license is OK else non zero */
thisConfig = 1c.sub.-- auth.sub.-- data(thisJob, feature);
/* If vendorstring is NULL, checks for vendor string are disabled.
Otherwise, it's used to determine what features are available */
if (vendorString != (char*) NULL &&
thisConfig->1c.sub.-- vendor.sub.-- def != (char*) NULL &&
strstr(thisConfig->1c.sub.-- vendor.sub.-- def, vendorString) == (char*)
NULL
&&
strstr(vendorString, thisConfig->1c.sub.-- vendor.sub.-- def) == (char*)
NULL
) {
status = 1;
sprintf(message, ".backslash.nThis feature (%s) is not licensed for this
mode
(%s) of operation..backslash.nPlease contact your local VLSl
representative for
an update..backslash.n.backslash.n", feature, vendorString);
VLSlprintError(message);
}
daysLeft = 1c.sub.-- expire.sub.-- days(thisJob, thisConfig);
if (daysLeft < 46) {
sprintf (message, ".backslash.nYour license for this feature (%s) will
expire in
%d days.backslash.nPlease contact your local VLSl representative for an
update. .backslash.n.backslash.n", feature, daysLeft);
VLSlprintError(message);
}
}
/* Check the license back in since all we want is to verify the user is
authorized to use the model (we're not counting the number of
licenses)
*/
if (thisjob != (LM.sub.-- HANDLE *) NULL) {
1c.sub.-- checkin(thisJob, feature, 0); /* checkin the license */
1c.sub.-- free.sub.-- job(thisJob); /* free the job */
}
return(status);
}
VLSlprintError(errorString)
char *errorString;
{
io.sub.-- printf("%s", errorString0
}
______________________________________
At step 210, the present invention then compiles the license management code. In step 212, the present embodiment stores the proprietary information including the first encrypted code in computer readable memory. In so doing, the proprietary information including the protection provided by the present invention is in condition to be delivered to the customer. It will be understood that the present invention is also well suited to being delivered to the customer electronically, or by other means. With reference next to FIG. 3, a flow chart of steps employed by a customer using proprietary information protected by the present invention is shown. As shown in step 302, the customer first installs the license file. Next, as shown in step 304, a user of proprietary information protected by the present invention integrates object code (containing the call to license management code with a statement critical to the function of the proprietary information embedded therein) into the simulation model. Finally, as shown in step 306, a user of proprietary information protected by the present invention utilizes the proprietary information. Furthermore, any attempt at this point by the user to remove the protection provided by the present invention will result in the removal of a statement critical to the functioning of the proprietary information. Hence the present invention provides protection of proprietary information without substantially complicating or disrupting the customer's authorized use of or access to the proprietary information. Thus, the present invention provides a method to securely protect proprietary information. The present invention further provides such secure protection while still allowing the proprietary information to be dispersed to licensed or otherwise entitled parties. The foregoing descriptions of specific embodiments of the present invention have been presented for purposes of illustration and description. They are not intended to be exhaustive or to limit the invention to the precise forms disclosed, and obviously many modifications and variations are possible in light of the above teaching. The embodiments were chosen and described in order to best explain the principles of the invention and its practical application, to thereby enable others skilled in the art to best utilize the invention and various embodiments with various modifications as are suited to the particular use contemplated. It is intended that the scope of the invention be defined by the claims appended hereto and their equivalents.
|
Same subclass Same class Consider this |
||||||||||
