StaticCodeReview / AFL / src / giftcard.h
giftcard.h
Raw
/*
 * Gift Card Application
 * Original Author: Shoddycorp's Cut-Rate Contracting
 * Maintainer:
 * Comments added by: Justin Cappos (JAC)
 * Modification Date: 8 July 2020
 */

// The purpose of this app is to read in gift card data.  The format of a gift 
// card looks like this:
//
// thisgiftcard:
//   num_bytes[32 bits]:giftcard_data (see below)
//
// giftcarddata:
//   merchant_id [32 bytes]:customer_id [32 bytes]:num_gift_card_records[32 bits]:gift_card_record_data[variable length]
//
// giftcardrecorddata:
//   num_bytes[32 bits]
//   type_of_record 
//   gift_card_amount_change OR gift_card_message
//
// giftcardamountchange:  Adds or removes money from the card
//   amount_added[32 bits]    Note, amounts are in 1 yen
//   merchant_signature[32 bytes]  USED IFF amount_added is POSITIVE
//
// giftcardmessage:
//   just a null terminated C string.
// 
// giftcardprogram: (BETA)
//   message[32 bytes]
//   program[256 bytes]
//
// So some actual example files might look like this:
//  [bytes][merchant_id][customer_id][num_records][bytes][type][AMOUNT][sig]
//    116     456...       524...         1          44      1   2000   fed...
//  [bytes][merchant_id][customer_id][num_records][bytes][type][AMOUNT][sig][bytes][type][message]
//    124    abc...        123...         2          44      1   1500   fed... 24    2   "Happy Birthday!\0"
//
// [BETA] program spec for animated text feature
// customer requested. Electronic greeting cards use THX-1138 miroprocessor and
// can support small programs to animate the text being displayed. Real processor
// has more opcodes than this but for beta demo just implement these
// programs operate on the message buffer
// note!! it is the gift card producers job to make sure that
// programs in the gift card are VALID
// each "instruction" is 3 bytes
// arithmetic instructions set the zero flag if the result is 0
// opcode (1 byte) arg1 (1 byte) arg2 (1 byte)
// 0x00  no-op (if there is extra space at end of program this should be used)
// 0x01  get current char into register "arg1" (16 registers)
// 0x02  put registar "arg1" into current char
// 0x03  move cursor by "arg1" bytes (can be negative)
// 0x04  put constant "arg1" into register "arg2"
// 0x05  xor register "arg1" with register "arg2" and store result in register "arg1"
// 0x06  add register "arg1" to register "arg2" and store result in register "arg1"
// 0x07  display the current message
// 0x08  end program
// 0x09  jump "arg1" bytes relative to the end of this instruction
// 0x10  if the zero flag is set, jump "arg1" bytes relative to the end of this instruction
// 0x11-0xff not used for now

// BDG note: this program structure looks complex. And I'm worried
//           about that comment that says programs must be "VALID"??

#include<stdlib.h>

struct this_gift_card {
	int num_bytes;
	void *gift_card_data;
}; 

struct gift_card_data {
	char *merchant_id; // always points to 32 bytes of data
	char *customer_id;// always points to 32 bytes of data
	int number_of_gift_card_records;
	void **gift_card_record_data; // many can exist here.
};


struct gift_card_record_data {
	int record_size_in_bytes; // size of this entry, including this field.
	int type_of_record; // 1 for amount change, 2 for message
	void *actual_record; // polymorphism
};


struct gift_card_amount_change {
	int amount_added;
	// always 32 bytes.  Only appears if amount_added is positive
	char *actual_signature; 
};

// BDG: I'm not sure these sizes are right... might want to double-check
// what the actual program does.
struct gift_card_program {
    char *message; // 32 bytes
    unsigned char *program; // 128 bytes
};