Hex Artifact Content

Artifact 2a7170f08929d4f8b0b796f0a67bb3e8e2796b9e:


0000: 2f 2a 0a 20 2a 20 47 53 43 2d 49 53 20 28 76 32  /*. * GSC-IS (v2
0010: 2e 31 29 20 53 65 72 76 69 63 65 20 43 61 6c 6c  .1) Service Call
0020: 20 4c 65 76 65 6c 20 53 65 72 76 69 63 65 20 50   Level Service P
0030: 72 6f 76 69 64 65 72 20 4d 6f 64 75 6c 65 20 66  rovider Module f
0040: 6f 72 20 50 43 2f 53 43 20 4c 69 74 65 20 61 6e  or PC/SC Lite an
0050: 64 0a 20 2a 20 44 6f 44 20 43 41 43 2f 43 41 43  d. * DoD CAC/CAC
0060: 76 32 2f 50 49 56 2f 50 49 56 76 32 20 43 61 72  v2/PIV/PIVv2 Car
0070: 64 73 0a 20 2a 2f 0a 0a 23 69 66 64 65 66 20 48  ds. */..#ifdef H
0080: 41 56 45 5f 43 4f 4e 46 49 47 5f 48 0a 23 69 6e  AVE_CONFIG_H.#in
0090: 63 6c 75 64 65 20 22 63 6f 6e 66 69 67 2e 68 22  clude "config.h"
00a0: 0a 23 65 6e 64 69 66 0a 0a 23 69 6e 63 6c 75 64  .#endif..#includ
00b0: 65 20 22 63 61 63 6b 65 79 5f 73 70 6d 2e 68 22  e "cackey_spm.h"
00c0: 0a 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53 54  ..#ifdef HAVE_ST
00d0: 44 49 4f 5f 48 0a 23 20 20 69 6e 63 6c 75 64 65  DIO_H.#  include
00e0: 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 65 6e 64 69   <stdio.h>.#endi
00f0: 66 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53 54  f.#ifdef HAVE_ST
0100: 44 4c 49 42 5f 48 0a 23 20 20 69 6e 63 6c 75 64  DLIB_H.#  includ
0110: 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 65 6e  e <stdlib.h>.#en
0120: 64 69 66 0a 0a 75 6e 73 69 67 6e 65 64 20 6c 6f  dif..unsigned lo
0130: 6e 67 20 67 73 63 42 73 69 55 74 69 6c 41 63 71  ng gscBsiUtilAcq
0140: 75 69 72 65 43 6f 6e 74 65 78 74 28 75 6e 73 69  uireContext(unsi
0150: 67 6e 65 64 20 6c 6f 6e 67 20 68 43 61 72 64 2c  gned long hCard,
0160: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
0170: 41 49 44 2c 20 73 74 72 75 63 74 20 42 53 49 41  AID, struct BSIA
0180: 75 74 68 65 6e 74 69 63 61 74 6f 72 20 73 74 72  uthenticator str
0190: 63 74 41 75 74 68 65 6e 74 69 63 61 74 6f 72 5b  ctAuthenticator[
01a0: 5d 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ], unsigned long
01b0: 20 61 75 74 68 4e 62 29 20 7b 0a 7d 0a 0a 75 6e   authNb) {.}..un
01c0: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 67 73 63 42  signed long gscB
01d0: 73 69 55 74 69 6c 43 6f 6e 6e 65 63 74 28 75 6e  siUtilConnect(un
01e0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 72 65 61  signed char *rea
01f0: 64 65 72 4e 61 6d 65 2c 20 75 6e 73 69 67 6e 65  derName, unsigne
0200: 64 20 6c 6f 6e 67 20 2a 68 43 61 72 64 29 20 7b  d long *hCard) {
0210: 0a 7d 0a 0a 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  .}..unsigned lon
0220: 67 20 67 73 63 42 73 69 55 74 69 6c 44 69 73 63  g gscBsiUtilDisc
0230: 6f 6e 6e 65 63 74 28 75 6e 73 69 67 6e 65 64 20  onnect(unsigned 
0240: 6c 6f 6e 67 20 68 43 61 72 64 29 20 7b 0a 7d 0a  long hCard) {.}.
0250: 0a 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 67  .unsigned long g
0260: 73 63 42 73 69 55 74 69 6c 42 65 67 69 6e 54 72  scBsiUtilBeginTr
0270: 61 6e 73 61 63 74 69 6f 6e 28 75 6e 73 69 67 6e  ansaction(unsign
0280: 65 64 20 6c 6f 6e 67 20 68 43 61 72 64 2c 20 5f  ed long hCard, _
0290: 42 6f 6f 6c 20 62 6c 54 79 70 65 29 20 7b 0a 7d  Bool blType) {.}
02a0: 0a 0a 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
02b0: 67 73 63 42 73 69 55 74 69 6c 45 6e 64 54 72 61  gscBsiUtilEndTra
02c0: 6e 73 61 63 74 69 6f 6e 28 75 6e 73 69 67 6e 65  nsaction(unsigne
02d0: 64 20 6c 6f 6e 67 20 68 43 61 72 64 29 20 7b 0a  d long hCard) {.
02e0: 7d 0a 0a 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  }..unsigned long
02f0: 20 67 73 63 42 73 69 55 74 69 6c 47 65 74 56 65   gscBsiUtilGetVe
0300: 72 73 69 6f 6e 28 75 6e 73 69 67 6e 65 64 20 63  rsion(unsigned c
0310: 68 61 72 20 2a 2a 76 65 72 73 69 6f 6e 29 20 7b  har **version) {
0320: 0a 09 69 6e 74 20 73 70 72 69 6e 74 66 5f 72 65  ..int sprintf_re
0330: 74 3b 0a 0a 09 69 66 20 28 76 65 72 73 69 6f 6e  t;...if (version
0340: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65   == NULL) {...re
0350: 74 75 72 6e 28 42 53 49 5f 55 4e 4b 4e 4f 57 4e  turn(BSI_UNKNOWN
0360: 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
0370: 20 28 2a 76 65 72 73 69 6f 6e 20 3d 3d 20 4e 55   (*version == NU
0380: 4c 4c 29 20 7b 0a 09 09 73 70 72 69 6e 74 66 5f  LL) {...sprintf_
0390: 72 65 74 20 3d 20 73 70 72 69 6e 74 66 28 4e 55  ret = sprintf(NU
03a0: 4c 4c 2c 20 22 32 2c 31 2c 30 2c 25 73 22 2c 20  LL, "2,1,0,%s", 
03b0: 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29  PACKAGE_VERSION)
03c0: 3b 0a 0a 09 09 69 66 20 28 73 70 72 69 6e 74 66  ;....if (sprintf
03d0: 5f 72 65 74 20 3c 3d 20 30 29 20 7b 0a 09 09 09  _ret <= 0) {....
03e0: 72 65 74 75 72 6e 28 42 53 49 5f 55 4e 4b 4e 4f  return(BSI_UNKNO
03f0: 57 4e 5f 45 52 52 4f 52 29 3b 0a 09 09 7d 0a 0a  WN_ERROR);...}..
0400: 09 09 2a 76 65 72 73 69 6f 6e 20 3d 20 6d 61 6c  ..*version = mal
0410: 6c 6f 63 28 73 70 72 69 6e 74 66 5f 72 65 74 20  loc(sprintf_ret 
0420: 2b 20 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 48 6f  + 1);..}.../* Ho
0430: 70 65 66 75 6c 6c 79 20 74 68 65 69 72 20 62 75  pefully their bu
0440: 66 66 65 72 20 69 73 20 6c 61 72 67 65 20 65 6e  ffer is large en
0450: 6f 75 67 68 20 2e 2e 2e 20 2a 2f 0a 09 73 70 72  ough ... */..spr
0460: 69 6e 74 66 28 2a 76 65 72 73 69 6f 6e 2c 20 22  intf(*version, "
0470: 32 2c 31 2c 30 2c 25 73 22 2c 20 50 41 43 4b 41  2,1,0,%s", PACKA
0480: 47 45 5f 56 45 52 53 49 4f 4e 29 3b 0a 0a 09 72  GE_VERSION);...r
0490: 65 74 75 72 6e 28 42 53 49 5f 4f 4b 29 3b 0a 7d  eturn(BSI_OK);.}
04a0: 0a 0a 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
04b0: 67 73 63 42 73 69 55 74 69 6c 47 65 74 43 61 72  gscBsiUtilGetCar
04c0: 64 50 72 6f 70 65 72 74 69 65 73 28 75 6e 73 69  dProperties(unsi
04d0: 67 6e 65 64 20 6c 6f 6e 67 20 68 43 61 72 64 2c  gned long hCard,
04e0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
04f0: 2a 43 43 43 55 6e 69 71 75 65 49 44 2c 20 75 6e  *CCCUniqueID, un
0500: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 63 61 72  signed long *car
0510: 64 43 61 70 61 62 69 6c 69 74 79 29 20 7b 0a 7d  dCapability) {.}
0520: 0a 0a 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
0530: 67 73 63 42 73 69 55 74 69 6c 47 65 74 43 61 72  gscBsiUtilGetCar
0540: 64 53 74 61 74 75 73 28 75 6e 73 69 67 6e 65 64  dStatus(unsigned
0550: 20 6c 6f 6e 67 20 68 43 61 72 64 29 20 7b 0a 7d   long hCard) {.}
0560: 0a 0a 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
0570: 67 73 63 42 73 69 55 74 69 6c 47 65 74 45 78 74  gscBsiUtilGetExt
0580: 65 6e 64 65 64 45 72 72 6f 72 54 65 78 74 28 75  endedErrorText(u
0590: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 68 43 61  nsigned long hCa
05a0: 72 64 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  rd, unsigned cha
05b0: 72 20 2a 2a 65 72 72 6f 72 54 65 78 74 29 20 7b  r **errorText) {
05c0: 0a 09 69 66 20 28 65 72 72 6f 72 54 65 78 74 20  ..if (errorText 
05d0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74  == NULL) {...ret
05e0: 75 72 6e 28 42 53 49 5f 55 4e 4b 4e 4f 57 4e 5f  urn(BSI_UNKNOWN_
05f0: 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 2a 65 72  ERROR);..}...*er
0600: 72 6f 72 54 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a  rorText = NULL;.
0610: 0a 09 72 65 74 75 72 6e 28 42 53 49 5f 4e 4f 5f  ..return(BSI_NO_
0620: 54 45 58 54 5f 41 56 41 49 4c 41 42 4c 45 29 3b  TEXT_AVAILABLE);
0630: 0a 7d 0a 0a 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  .}..unsigned lon
0640: 67 20 67 73 63 42 73 69 55 74 69 6c 47 65 74 52  g gscBsiUtilGetR
0650: 65 61 64 65 72 4c 69 73 74 28 75 6e 73 69 67 6e  eaderList(unsign
0660: 65 64 20 63 68 61 72 20 2a 2a 2a 72 65 61 64 65  ed char ***reade
0670: 72 4c 69 73 74 29 20 7b 0a 7d 0a 0a 75 6e 73 69  rList) {.}..unsi
0680: 67 6e 65 64 20 6c 6f 6e 67 20 67 73 63 42 73 69  gned long gscBsi
0690: 55 74 69 6c 50 61 73 73 74 68 72 75 28 75 6e 73  UtilPassthru(uns
06a0: 69 67 6e 65 64 20 6c 6f 6e 67 20 68 43 61 72 64  igned long hCard
06b0: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
06c0: 2a 63 61 72 64 43 6f 6d 6d 61 6e 64 2c 20 75 6e  *cardCommand, un
06d0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 2a 63 61  signed char **ca
06e0: 72 64 52 65 73 70 6f 6e 73 65 29 20 7b 0a 7d 0a  rdResponse) {.}.
06f0: 0a 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 67  .unsigned long g
0700: 73 63 42 73 69 55 74 69 6c 52 65 6c 65 61 73 65  scBsiUtilRelease
0710: 43 6f 6e 74 65 78 74 28 75 6e 73 69 67 6e 65 64  Context(unsigned
0720: 20 6c 6f 6e 67 20 68 43 61 72 64 2c 20 75 6e 73   long hCard, uns
0730: 69 67 6e 65 64 20 63 68 61 72 20 2a 41 49 44 29  igned char *AID)
0740: 20 7b 0a 7d 0a 0a 75 6e 73 69 67 6e 65 64 20 6c   {.}..unsigned l
0750: 6f 6e 67 20 67 73 63 42 73 69 47 63 44 61 74 61  ong gscBsiGcData
0760: 43 72 65 61 74 65 28 75 6e 73 69 67 6e 65 64 20  Create(unsigned 
0770: 6c 6f 6e 67 20 68 43 61 72 64 2c 20 75 6e 73 69  long hCard, unsi
0780: 67 6e 65 64 20 63 68 61 72 20 2a 41 49 44 2c 20  gned char *AID, 
0790: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 61  unsigned char ta
07a0: 67 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  g, unsigned char
07b0: 20 2a 76 61 6c 75 65 29 20 7b 0a 7d 0a 0a 75 6e   *value) {.}..un
07c0: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 67 73 63 42  signed long gscB
07d0: 73 69 47 63 44 61 74 61 44 65 6c 65 74 65 28 75  siGcDataDelete(u
07e0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 68 43 61  nsigned long hCa
07f0: 72 64 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  rd, unsigned cha
0800: 72 20 2a 41 49 44 2c 20 75 6e 73 69 67 6e 65 64  r *AID, unsigned
0810: 20 63 68 61 72 20 74 61 67 29 20 7b 0a 7d 0a 0a   char tag) {.}..
0820: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 67 73  unsigned long gs
0830: 63 42 73 69 47 63 47 65 74 43 6f 6e 74 61 69 6e  cBsiGcGetContain
0840: 65 72 50 72 6f 70 65 72 74 69 65 73 28 75 6e 73  erProperties(uns
0850: 69 67 6e 65 64 20 6c 6f 6e 67 20 68 43 61 72 64  igned long hCard
0860: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
0870: 2a 41 49 44 2c 20 73 74 72 75 63 74 20 47 43 61  *AID, struct GCa
0880: 63 72 20 2a 73 74 72 63 74 47 43 61 63 72 2c 20  cr *strctGCacr, 
0890: 73 74 72 75 63 74 20 47 43 43 6f 6e 74 61 69 6e  struct GCContain
08a0: 65 72 53 69 7a 65 20 2a 73 74 72 63 74 43 6f 6e  erSize *strctCon
08b0: 74 61 69 6e 65 72 53 69 7a 65 73 2c 20 75 6e 73  tainerSizes, uns
08c0: 69 67 6e 65 64 20 63 68 61 72 20 2a 2a 63 6f 6e  igned char **con
08d0: 74 61 69 6e 65 72 56 65 72 73 69 6f 6e 29 20 7b  tainerVersion) {
08e0: 0a 7d 0a 0a 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  .}..unsigned lon
08f0: 67 20 67 73 63 42 73 69 47 63 52 65 61 64 54 61  g gscBsiGcReadTa
0900: 67 4c 69 73 74 28 75 6e 73 69 67 6e 65 64 20 6c  gList(unsigned l
0910: 6f 6e 67 20 68 43 61 72 64 2c 20 75 6e 73 69 67  ong hCard, unsig
0920: 6e 65 64 20 63 68 61 72 20 2a 41 49 44 2c 20 75  ned char *AID, u
0930: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 2a 74  nsigned char **t
0940: 61 67 41 72 72 61 79 29 20 7b 0a 7d 0a 0a 75 6e  agArray) {.}..un
0950: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 67 73 63 42  signed long gscB
0960: 73 69 47 63 52 65 61 64 56 61 6c 75 65 28 75 6e  siGcReadValue(un
0970: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 68 43 61 72  signed long hCar
0980: 64 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  d, unsigned char
0990: 20 2a 41 49 44 2c 20 75 6e 73 69 67 6e 65 64 20   *AID, unsigned 
09a0: 63 68 61 72 20 74 61 67 2c 20 75 6e 73 69 67 6e  char tag, unsign
09b0: 65 64 20 63 68 61 72 20 2a 2a 76 61 6c 75 65 29  ed char **value)
09c0: 20 7b 0a 7d 0a 0a 75 6e 73 69 67 6e 65 64 20 6c   {.}..unsigned l
09d0: 6f 6e 67 20 67 73 63 42 73 69 47 63 55 70 64 61  ong gscBsiGcUpda
09e0: 74 65 56 61 6c 75 65 28 75 6e 73 69 67 6e 65 64  teValue(unsigned
09f0: 20 6c 6f 6e 67 20 68 43 61 72 64 2c 20 75 6e 73   long hCard, uns
0a00: 69 67 6e 65 64 20 63 68 61 72 20 2a 41 49 44 2c  igned char *AID,
0a10: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74   unsigned char t
0a20: 61 67 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ag, unsigned cha
0a30: 72 20 2a 76 61 6c 75 65 29 20 7b 0a 7d 0a 0a 75  r *value) {.}..u
0a40: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 67 73 63  nsigned long gsc
0a50: 42 73 69 47 65 74 43 68 61 6c 6c 65 6e 67 65 28  BsiGetChallenge(
0a60: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 68 43  unsigned long hC
0a70: 61 72 64 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  ard, unsigned ch
0a80: 61 72 20 2a 41 49 44 2c 20 75 6e 73 69 67 6e 65  ar *AID, unsigne
0a90: 64 20 63 68 61 72 20 2a 2a 63 68 61 6c 6c 65 6e  d char **challen
0aa0: 67 65 29 20 7b 0a 7d 0a 0a 75 6e 73 69 67 6e 65  ge) {.}..unsigne
0ab0: 64 20 6c 6f 6e 67 20 67 73 63 42 73 69 53 6b 69  d long gscBsiSki
0ac0: 49 6e 74 65 72 6e 61 6c 41 75 74 68 65 6e 74 69  InternalAuthenti
0ad0: 63 61 74 65 28 75 6e 73 69 67 6e 65 64 20 6c 6f  cate(unsigned lo
0ae0: 6e 67 20 68 43 61 72 64 2c 20 75 6e 73 69 67 6e  ng hCard, unsign
0af0: 65 64 20 63 68 61 72 20 2a 41 49 44 2c 20 75 6e  ed char *AID, un
0b00: 73 69 67 6e 65 64 20 63 68 61 72 20 61 6c 67 6f  signed char algo
0b10: 49 44 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ID, unsigned cha
0b20: 72 20 2a 63 68 61 6c 6c 65 6e 67 65 2c 20 75 6e  r *challenge, un
0b30: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 2a 63 72  signed char **cr
0b40: 79 70 74 6f 67 72 61 6d 29 20 7b 0a 7d 0a 0a 75  yptogram) {.}..u
0b50: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 67 73 63  nsigned long gsc
0b60: 42 73 69 50 6b 69 43 6f 6d 70 75 74 65 28 75 6e  BsiPkiCompute(un
0b70: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 68 43 61 72  signed long hCar
0b80: 64 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  d, unsigned char
0b90: 20 2a 41 49 44 2c 20 75 6e 73 69 67 6e 65 64 20   *AID, unsigned 
0ba0: 63 68 61 72 20 61 6c 67 6f 49 44 2c 20 75 6e 73  char algoID, uns
0bb0: 69 67 6e 65 64 20 63 68 61 72 20 2a 6d 65 73 73  igned char *mess
0bc0: 61 67 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  age, unsigned ch
0bd0: 61 72 20 2a 2a 72 65 73 75 6c 74 29 20 7b 0a 7d  ar **result) {.}
0be0: 0a 0a 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
0bf0: 67 73 63 42 73 69 50 6b 69 47 65 74 43 65 72 74  gscBsiPkiGetCert
0c00: 69 66 69 63 61 74 65 28 75 6e 73 69 67 6e 65 64  ificate(unsigned
0c10: 20 6c 6f 6e 67 20 68 43 61 72 64 2c 20 75 6e 73   long hCard, uns
0c20: 69 67 6e 65 64 20 63 68 61 72 20 2a 41 49 44 2c  igned char *AID,
0c30: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
0c40: 2a 43 65 72 74 69 66 69 63 61 74 65 29 20 7b 0a  *Certificate) {.
0c50: 7d 0a 0a 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  }..unsigned long
0c60: 20 67 73 63 42 73 69 47 65 74 43 72 79 70 74 6f   gscBsiGetCrypto
0c70: 50 72 6f 70 65 72 74 69 65 73 28 75 6e 73 69 67  Properties(unsig
0c80: 6e 65 64 20 6c 6f 6e 67 20 68 43 61 72 64 2c 20  ned long hCard, 
0c90: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 41  unsigned char *A
0ca0: 49 44 2c 20 73 74 72 75 63 74 20 43 52 59 50 54  ID, struct CRYPT
0cb0: 4f 61 63 72 20 2a 73 74 72 63 74 43 52 59 50 54  Oacr *strctCRYPT
0cc0: 4f 61 63 72 2c 20 75 6e 73 69 67 6e 65 64 20 6c  Oacr, unsigned l
0cd0: 6f 6e 67 20 2a 6b 65 79 4c 65 6e 29 20 7b 0a 7d  ong *keyLen) {.}
0ce0: 0a                                               .