Appendix (sample code)

Appendix (sample code)

Sample code for creating a signature

You'll need to pass along a signature and a developer ID – or "devid" – with every request using HTTP GET. The signature value is a HMAC-SHA1 hash of the completed request (minus the base URL but including your developer ID, known as "devid") and the key.

Example in .net C

The following is the .net C# code snippet for the signature calculation.(Figure 1)⇒

(Figure 1).

C# sample code

Note: key values are used for example purposes only.

string key = "9c132d31-6a30-4cac-8d8b-8a1970834799"; // supplied by PTV
int developerId = 2; // supplied by PTV
string url = "/v2/mode/2/line/787/stops-for-line"; // the PTV api method we want

// add developer id
url = string.Format("{0}{1}devid={2}",url,url.Contains("?") ? "&" : "?",developerId);
System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
// encode key
byte[] keyBytes = encoding.GetBytes(key);
// encode url
byte[] urlBytes = encoding.GetBytes(url);
byte[] tokenBytes = new System.Security.Cryptography.HMACSHA1(keyBytes).ComputeHash(urlBytes);
var sb = new System.Text.StringBuilder();
// convert signature to string
Array.ForEach(tokenBytes, x => sb.Append (x.ToString("X2")));
// add signature to url
url = string.Format("{0}&signature={1}",url,sb.ToString());


// extra code to add base URL – the resultant url should be:
//  http://timetableapi.ptv.vic.gov.au/v2/mode/2/line/787/stops-for-line?devid=2&signature=D5474F344CDAA7B92F2253169F6C1D66C1A15001

Example in Java

The following is the Java code snippet for the signature calculation. Note: key values are used for example purposes only.(Figure 2)⇒

(Figure 2).

Java sample code

/**
 * Generates a signature using the HMAC-SHA1 algorithm 
 * 
 * @param privateKey - Developer Key supplied by PTV
 * @param uri - request uri (Example :/v2/HealthCheck) 
 * @param developerId - Developer ID supplied by PTV
 * @return Unique Signature Value  
 */
public String generateSignature(final String privateKey, final String uri, final int developerId)
{
    String encoding = "UTF-8";
    String HMAC_SHA1_ALGORITHM = "HmacSHA1";
    String signature;
    StringBuffer uriWithDeveloperID = new StringBuffer();
    uriWithDeveloperID.append(uri).append(uri.contains("?") ? "&" : "?").append("devid="+developerId);     
    try
    {
        byte[] keyBytes = privateKey.getBytes(encoding);
        byte[] uriBytes = uriWithDeveloperID.toString().getBytes(encoding);
        Key signingKey = new SecretKeySpec(keyBytes, HMAC_SHA1_ALGORITHM);
        Mac mac = Mac.getInstance(HMAC_SHA1_ALGORITHM);
        mac.init(signingKey);
        byte[] signatureBytes = mac.doFinal(uriBytes);
        StringBuffer buf = new StringBuffer(signatureBytes.length * 2);
        for (byte signatureByte : signatureBytes)
        {
            int intVal = signatureByte & 0xff;
            if (intVal < 0x10)
            {
                buf.append("0");
            }
            buf.append(Integer.toHexString(intVal));
        }
        signature = buf.toString();
    }
    catch (UnsupportedEncodingException e)
    {
        throw new RuntimeException(e);
    }
    catch (NoSuchAlgorithmException e)
    {
        throw new RuntimeException(e);
    }
    catch (InvalidKeyException e)
    {
        throw new RuntimeException(e);
    }
    return signature.toString().toUpperCase();
}

/**
 * Generate full URL using generateSignature() method
 * 
 * @param privateKey - Developer Key supplied by PTV (Example :  "92dknhh31-6a30-4cac-8d8b-8a1970834799");
 * @param uri - request uri (Example :"/v2/mode/2/line/787/stops-for-line) 
 * @param developerId - Developer ID supplied by PTV( int developerId )
 * @return - Full URL with Signature
 */
public String generateCompleteURLWithSignature(final String privateKey, final String uri, final int developerId)
{

    String baseURL="http://timetableapi.ptv.vic.gov.au";
    StringBuffer url = new StringBuffer(baseURL).append(uri).append(uri.contains("?") ? "&" : "?").append("devid="+developerId).append("&signature="+generateSignature(privateKey, uri, developerId));
    return url.toString();

}

Example in Objective C

The following is the Objective C code snippet for the signature calculation. Note: key values are used for example purposes only. (Figure 3)⇒

(Figure 3).

Objective C sample code

-(NSURL) generateURLWithDevIDAndKey:(NSString)urlPath {

NSString *hardcodedURL = @" http://timetableapi.ptv.vic.gov.au";
NSString *hardcodedDevID = @"developerID provided by PTV";
NSString *hardcodedkey = @"developer key provided by PTV";

/ urlPath = @" http://timetableapi.ptv.vic.gov.au/v2/mode/2/line/787/stops-for-line"; / NSRange deleteRange ={0,[hardcodedURL length]}; NSMutableString *urlString = [[NSMutableString alloc]initWithString:urlPath]; [urlString deleteCharactersInRange:deleteRange]; if( [urlString containsString:@"?"]) [urlString appendString:@"&"]; else [urlString appendString:@"?"];

[urlString appendFormat:@"devid=%@",hardcodedDevID];


const char *cKey  = [hardcodedkey cStringUsingEncoding:NSUTF8StringEncoding];
const char *cData = [urlString cStringUsingEncoding:NSUTF8StringEncoding];
unsigned char cHMAC[CC_SHA1_DIGEST_LENGTH];
CCHmac(kCCHmacAlgSHA1, cKey, strlen(cKey), cData, strlen(cData), cHMAC);

NSString *hash;

NSMutableString* output = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2];

for(int i = 0; i < CC_SHA1_DIGEST_LENGTH; i++)
    [output appendFormat:@"%02x", cHMAC[i]];
hash = output;

NSString* signature = [hash uppercaseString];
NSString *urlSuffix = [NSString stringWithFormat:@"devid=%@&signature=%@", hardcodedDevID,signature];

NSURL *url = [NSURL URLWithString:urlPath];
NSString *urlQuery = [url query];
if(urlQuery != nil && [urlQuery length] > 0){
    url = [NSURL URLWithString:[NSString stringWithFormat:@"%@&%@",urlPath,urlSuffix]];
}else{
    url = [NSURL URLWithString:[NSString stringWithFormat:@"%@?%@",urlPath,urlSuffix]];
}

return url;

}

supplescroll:lucid theme
(Figure 1).

C# sample code

Note: key values are used for example purposes only.

string key = "9c132d31-6a30-4cac-8d8b-8a1970834799"; // supplied by PTV
int developerId = 2; // supplied by PTV
string url = "/v2/mode/2/line/787/stops-for-line"; // the PTV api method we want

// add developer id
url = string.Format("{0}{1}devid={2}",url,url.Contains("?") ? "&" : "?",developerId);
System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
// encode key
byte[] keyBytes = encoding.GetBytes(key);
// encode url
byte[] urlBytes = encoding.GetBytes(url);
byte[] tokenBytes = new System.Security.Cryptography.HMACSHA1(keyBytes).ComputeHash(urlBytes);
var sb = new System.Text.StringBuilder();
// convert signature to string
Array.ForEach(tokenBytes, x => sb.Append (x.ToString("X2")));
// add signature to url
url = string.Format("{0}&signature={1}",url,sb.ToString());


// extra code to add base URL – the resultant url should be:
//  http://timetableapi.ptv.vic.gov.au/v2/mode/2/line/787/stops-for-line?devid=2&signature=D5474F344CDAA7B92F2253169F6C1D66C1A15001
(Figure 2).

Java sample code

/**
 * Generates a signature using the HMAC-SHA1 algorithm 
 * 
 * @param privateKey - Developer Key supplied by PTV
 * @param uri - request uri (Example :/v2/HealthCheck) 
 * @param developerId - Developer ID supplied by PTV
 * @return Unique Signature Value  
 */
public String generateSignature(final String privateKey, final String uri, final int developerId)
{
    String encoding = "UTF-8";
    String HMAC_SHA1_ALGORITHM = "HmacSHA1";
    String signature;
    StringBuffer uriWithDeveloperID = new StringBuffer();
    uriWithDeveloperID.append(uri).append(uri.contains("?") ? "&" : "?").append("devid="+developerId);     
    try
    {
        byte[] keyBytes = privateKey.getBytes(encoding);
        byte[] uriBytes = uriWithDeveloperID.toString().getBytes(encoding);
        Key signingKey = new SecretKeySpec(keyBytes, HMAC_SHA1_ALGORITHM);
        Mac mac = Mac.getInstance(HMAC_SHA1_ALGORITHM);
        mac.init(signingKey);
        byte[] signatureBytes = mac.doFinal(uriBytes);
        StringBuffer buf = new StringBuffer(signatureBytes.length * 2);
        for (byte signatureByte : signatureBytes)
        {
            int intVal = signatureByte & 0xff;
            if (intVal < 0x10)
            {
                buf.append("0");
            }
            buf.append(Integer.toHexString(intVal));
        }
        signature = buf.toString();
    }
    catch (UnsupportedEncodingException e)
    {
        throw new RuntimeException(e);
    }
    catch (NoSuchAlgorithmException e)
    {
        throw new RuntimeException(e);
    }
    catch (InvalidKeyException e)
    {
        throw new RuntimeException(e);
    }
    return signature.toString().toUpperCase();
}

/**
 * Generate full URL using generateSignature() method
 * 
 * @param privateKey - Developer Key supplied by PTV (Example :  "92dknhh31-6a30-4cac-8d8b-8a1970834799");
 * @param uri - request uri (Example :"/v2/mode/2/line/787/stops-for-line) 
 * @param developerId - Developer ID supplied by PTV( int developerId )
 * @return - Full URL with Signature
 */
public String generateCompleteURLWithSignature(final String privateKey, final String uri, final int developerId)
{

    String baseURL="http://timetableapi.ptv.vic.gov.au";
    StringBuffer url = new StringBuffer(baseURL).append(uri).append(uri.contains("?") ? "&" : "?").append("devid="+developerId).append("&signature="+generateSignature(privateKey, uri, developerId));
    return url.toString();

}

(Figure 3).

Objective C sample code

-(NSURL) generateURLWithDevIDAndKey:(NSString)urlPath {

NSString *hardcodedURL = @" http://timetableapi.ptv.vic.gov.au";
NSString *hardcodedDevID = @"developerID provided by PTV";
NSString *hardcodedkey = @"developer key provided by PTV";

/ urlPath = @" http://timetableapi.ptv.vic.gov.au/v2/mode/2/line/787/stops-for-line"; / NSRange deleteRange ={0,[hardcodedURL length]}; NSMutableString *urlString = [[NSMutableString alloc]initWithString:urlPath]; [urlString deleteCharactersInRange:deleteRange]; if( [urlString containsString:@"?"]) [urlString appendString:@"&"]; else [urlString appendString:@"?"];

[urlString appendFormat:@"devid=%@",hardcodedDevID];


const char *cKey  = [hardcodedkey cStringUsingEncoding:NSUTF8StringEncoding];
const char *cData = [urlString cStringUsingEncoding:NSUTF8StringEncoding];
unsigned char cHMAC[CC_SHA1_DIGEST_LENGTH];
CCHmac(kCCHmacAlgSHA1, cKey, strlen(cKey), cData, strlen(cData), cHMAC);

NSString *hash;

NSMutableString* output = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2];

for(int i = 0; i < CC_SHA1_DIGEST_LENGTH; i++)
    [output appendFormat:@"%02x", cHMAC[i]];
hash = output;

NSString* signature = [hash uppercaseString];
NSString *urlSuffix = [NSString stringWithFormat:@"devid=%@&signature=%@", hardcodedDevID,signature];

NSURL *url = [NSURL URLWithString:urlPath];
NSString *urlQuery = [url query];
if(urlQuery != nil && [urlQuery length] > 0){
    url = [NSURL URLWithString:[NSString stringWithFormat:@"%@&%@",urlPath,urlSuffix]];
}else{
    url = [NSURL URLWithString:[NSString stringWithFormat:@"%@?%@",urlPath,urlSuffix]];
}

return url;

}