
#include <stdio.h>

main()
{
  char name[81];
  char node[10];
  char key[128];
  char input[80];
  char s[80];
  int i;

  fprintf(stderr,"\n\n\n");
  fprintf(stderr,"---------------------------------------------");
  fprintf(stderr,"\n Key Generation Program - Please Enter Data\n");
  fprintf(stderr,"---------------------------------------------");
  fprintf(stderr,"\n");
  fprintf(stderr," Node: ");
  gets(node);

  fprintf(stderr," Name: ");
  gets(name);

  makekey(name,node,key);

  fprintf(stderr," Enter Key> ");
  gets(input);

/*      printf("key=\"%s\"\ninput=\"%s\"\n",key,input); */

  if (strcmp(key,input)){
    fprintf(stderr," ERROR: The key did not verify properly.\n");
    printf(" ERROR: The key did not verify properly.\n");
  }
  else{
    fprintf(stderr," OK: This key has been verified.\n");
    printf("\n   OK: This key has been verified.\n");
  }
  printf("---------------------------------------------\n");
}

makekey(name,node,key)
char name[];
char node[];
char key[];
{
  char s[81];

  int i,j,k,check_sum;

  static char tr[2][255] ={
    {
      'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o',
      'p','q','r','s','t','u','v','w','x','y','z',
      'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O',
      'P','Q','R','S','T','U','V','W','X','Y','Z',
      '!','@','#','$','%','^','&','*','(',')','-','+','-','=',
      '{','}','[',']',':','"',';','\'','<','>','?',',','.','/','\\',
      '~','`','|','0','1','2','3','4','5','6','7','8','9','\007'
    },
    {
      'x','k','h','u','e','c','4','5','v','0','q','l','L','v','R',
      'q','f','g','d','M','v','7','c','3','c','k',
      'v','F','L','w','P','e','E','N','m','z','u','B','H','i','F',
      'J','j','b','g','W','m','o','8','5','B','3',
      '7','n','4','T','U','G','J','K','e','U','K','j','k','f',
      'k','y','h','n','y','6','j','j','6','r','9','h','v','7','h',
      'S','7','s','i','0','j','g','l','o','t','m','k','1','B'
    },
  };

  check_sum=0;
  k=0;

  /* encode the name and calulate checksum */
  for(i=0;name[i]!='\0';i++,k++){
    key[k]='.';
    for(j=0;j<255;j++){
      if(name[i]==tr[0][j]){
        key[k]=tr[1][j];
        check_sum+=key[k];
      }
    }
  }


  sprintf(s,"%d",check_sum);
  fprintf(stderr,"Check=%s\n",s); /* DEBUG */
  /* add encoded version checksum so far */
  for(i=0;s[i]!='\0';i++,k++){
    key[k]='.';
    for(j=0;j<255;j++){
      if(s[i]==tr[0][j]){
        key[k]=tr[1][j];
/*         check_sum+=key[k]; */
      }
    }
  }

  /* encode node number and keep adding to check sum */
  for(i=0;node[i]!='\0';i++,k++){
    key[k]='.';
    for(j=0;j<255;j++){
      if(node[i]==tr[0][j]){
        key[k]=tr[1][j];
        check_sum+=key[k];
      }
    }
  }


  sprintf(s,"%d",check_sum);
  fprintf(stderr,"Check=%s\n",s); /* DEBUG */
  /* add in encoded final value of checksum */
  for(i=0;s[i]!='\0';i++,k++){
    key[k]='.';
    for(j=0;j<255;j++){
      if(s[i]==tr[0][j]){
        key[k]=tr[1][j];
/*         check_sum+=key[k]; */
      }
    }
  }
  key[k]='\0';


  printf("\n\n\n");
  printf("---------------------------------------------");
  printf("\n Registration Data\n");
  printf("---------------------------------------------");
  printf("\n Name: \"%s\"\n Node: \"%s\"\n  Key: \"%s\"\n",name,node,key);


  if(stderr!=stdout){
  fprintf(stderr,"\n\n\n");
  fprintf(stderr,"---------------------------------------------");
  fprintf(stderr,"\n Registration Data\n");
  fprintf(stderr,"---------------------------------------------");
  fprintf(stderr,"\n Name: \"%s\"\n Node: \"%s\"\n  Key: \"%s\"\n",name,node,key);
  }
  fprintf(stderr,"\n\n\n");
  fprintf(stderr,"---------------------------------------------");
  fprintf(stderr,"\n Test Results\n");
  fprintf(stderr,"---------------------------------------------");
  fprintf(stderr,"\n");
}
