Views:

Last Updated: 11/24/2021 1:00:33 AM

API provides a set of integration API interfaces that allows your system to interact with Trend Micro License Management Portal. This section covers some technical detail that you should note when implementing adapting interfaces for your system.

LMPI is a REST API implemented over HTTP Protocol. LMPI decompose complex business logics of License Management Portal following REST API conventions. As you can see in API Reference section, domain models are defined as collections of Resources for developers to operate using HTTP methods defined in REST API standard.

Authentication

To successfully invoke the LMP API, several requirements should be fulfilled. The following is an example of customized HTTP headers that you should specify for every request made to the API:

HTTP header sample:

x-access-token: {Put your access token here}
x-posix-time: 1363797148
x-signature: rnBCnS6YWHvR5PnkM2J44IobfTGcQL039xkRbosIMe8=
x-traceid: 95b794e7-7f4b-4f20-95b6-a16d4143199e
content-type: application/json; charset=utf-8

Please pay attention to header elements as some of them are compulsory headers required for LMPI API to respond to your request. Following table explains it in detail:

Header Name

Type

Description

Validation

Required

x-access-token

GUID

The unique Access Token that you receive from Trend Micro, that is used to identify the integrating partner. The format will be similar to: 975f9ce9-1234-5678-8c2e-9f0b1f27e1b3.

GUID

x-posix-time

long

This value is the standard UNIX time in seconds, which is the number of seconds that have elapsed since midnight Coordinated Universal Time (UTC), January 1, 1970, not counting leap seconds.Use this value to generate the x-signature header.API also checks this value against its own time. If the differences is more than 15 minutes (plus or minus), the request is denied.

1-10 digits, long integer

x-signature

String

This value is calculated based on selected headers, as well as a Secret Key, and is a based on 64 encoded string, which is calculated by the following expression. More details on how to generate the x-signature will be presented in the next section.

1-90 characters.

content-type

String

This should specify the application/json and charset=utf-8 for every API call. Note that the content is UTF-8 encoded.

1-31 characters

x-traceid

String

This is intend to facilitate troubleshooting. The format of the TraceID is simply a String. It is recommended to be in the format of a GUID string (e.g. 975f9ce9-f509-4842-8c2e-9f0b1f27e1b3), and will not check the format. When the server logs the request, the Trace ID is accompanied with the client's access token for it to identify the caller, as well as the request.

1-60 characters

Date

String

The Date is HTTP protocol standard.The format follows RFC 822. It will appear as: Tue, 17 Sep 2013 05:54:38 GMT. Details

1-30 characters

x-signature Generation

The x-signature proves that the message is composed by a trusted Business Partner who owns the Secret Key. It also prevents the message from been hijacked or resent by other parties when sent via the Internet, even when all transactions are forced to be sent over SSL. The x-signature header should be composed using the following matrix.

Payload = [x-posix-time] + [http method] + [request_uri] + [body content]

x-signature = HMAC-SHA256(secret_key, UTF-8 Encoding(Payload))

Payload

Following table explains elements that composes into the Payload string:

Name

Description

Example

x-posix-time

This value is the standard UNIX time in seconds, which is the number of seconds that have elapsed since midnight Coordinated Universal Time (UTC), January 1, 1970, not counting leap seconds.

1363370254

HTTP method

The current HTTP method that is used to request the API. This value should be in upper case.

POST

request_uri

This should be the absolute URI of the current request, including the query string. Please note to percent encode query string parameter values.

/LMPI/v2/me/plans?keyword=serviceplan%201

content

Given that the request contains body content, such as POST or UPDATE, this content should be hashed and appended to the end of the Payload. Hashing algorithm is:

Base64(MD5(content as binary))

Hashed result

Original content

telHj8YUFXO1IenheVsWkg==

{"hello":"json"}

x-signature

Once the Payload is generated, it is ready to be hashed using the Secret Key that was provided to generate the signature. The following algorithm explains how the signature is generated.

Base64 ( HMAC-SHA256(secret_key, Payload) )

The first step is to generate a HMAC-SHA256 hash of the Payload using your Secret Key, and then convert the binary into Base64 string.

As for this design, you need to generate a unique x-signature in every request, resulting in a different signature for each request. The x-signature will be verified by the API server in every request.

Request Content

Apart from the header elements. The HTTP request body should also include a valid JSON data structure of the data that you need to send to the LMPI API, if required. The details of the body content is included in each API Specification.

Following the above request to invoke a Create Customer API, if the request was invoked successfully you should have received a response body similar to the following example:

{
    company_id : "17363415-4A9F-4A01-8153-10B8F35B50B1",
    user :
    {
        id : "3CB3C2A5-94C5-4D57-9B97-CF4FCC47FF77",
        login_name : "staygreen_greenery",
        password : "93oap1jv0z"
    }
}

C# Sample Code

Generating x-posix-time

// Verify that if a PosixTime is 15 minutes before or after the server time.
// serverTime: Current server time.
// posixStr: A posix string of seconds.
// timeRangeinMinutes: You may specify a time range in minute. Default value is 15 minutes.
// returns: True if the posixStr time is within +-15 minutes range of the given server time.

public static bool VerifyPosixTime(string posixStr, int timeRangeinMinutes = 15)
{
    long posixSeconds;
    if (!Int64.TryParse(posixStr, out posixSeconds)) return false;

    var from = DateTimeToPosixTimestamp(DateTime.UtcNow.AddMinutes(-timeRangeinMinutes));
    var to = DateTimeToPosixTimestamp(DateTime.UtcNow.AddMinutes(timeRangeinMinutes));

    return (posixSeconds >= from) && (posixSeconds <= to);
}

// Methods to convert DateTime to Posix time(seconds) in Unix time stamp.
// dateTime: Unix time stamp to convert.
// returns: Return Unix time stamp as long type.

public static long DateTimeToPosixTimestamp(DateTime dateTime)
{
    TimeSpan unixTimeSpan = (dateTime - new DateTime(1970, 1, 1, 0, 0, 0));
    return (long) unixTimeSpan.TotalSeconds;
}

Generating x-signature

// Generate a x-signature header value that's required to invoke LMPI API interface.
// secret: The secret key used to hash.
// unixTimestamp: Number of seconds after 1970-01-01 til now.
// method: HTTP method used to invoke LMPI.
// requestUri: The request URI without server host. The request URI should be encoded.
// content: HTTP request content in binary. Pass in null if no content is to be sent to server.
// hexstring: A hexstring of HMAC-SHA256 hashed value will be assigned to this parameter.
// returns: Base64 string encoded x-signature.

public static string GenerateSignature(string secret, long unixTimestamp, string method, string requestUri, byte[] content, out string hexstring)
{
    var posix = unixTimestamp.ToString();
    var payload = posix + method.ToUpper() + requestUri +
        ((content == null) ? "" : CalculateMD5Hash(content));

    HMAC hash = new HMACSHA256();
    hash.Initialize();
    hash.Key = Encoding.UTF8.GetBytes(secret);

    var byteArr = hash.ComputeHash(Encoding.UTF8.GetBytes(payload));
    hexstring = ByteArrayToHexString(byteArr);

    return Convert.ToBase64String(byteArr);
}

// Calculates MD5 Hash of a binary and return it as a BASE64 string.
// input: Binary to be calculated.
// returns: MD5 hashed string result in BASE64.

public static string CalculateMD5Hash(byte[] input)
{
    // step 1, calculate MD5 hash from input
    MD5 md5 = MD5.Create();
    byte[] hash = md5.ComputeHash(input);

    return Convert.ToBase64String(hash);
}

// Converts a byte array into HexString.
// ba: Byte array to be converted.
// returns: HEX String.

public static string ByteArrayToHexString(byte[] ba)
{
    var sb = new StringBuilder(ba.Length*2);
    foreach (var b in ba)
    {
        sb.AppendFormat("{0:x2}", b);
    }
    return sb.ToString();
}