diff options
Diffstat (limited to 'lib/libsectok/ifd/todos_ag/atr.c')
-rw-r--r-- | lib/libsectok/ifd/todos_ag/atr.c | 340 |
1 files changed, 0 insertions, 340 deletions
diff --git a/lib/libsectok/ifd/todos_ag/atr.c b/lib/libsectok/ifd/todos_ag/atr.c deleted file mode 100644 index b510e07e6a0..00000000000 --- a/lib/libsectok/ifd/todos_ag/atr.c +++ /dev/null @@ -1,340 +0,0 @@ -/* - * Parse smart card atr, return proto params - * - * Jim Rees, University of Michigan CITI - */ -static char *rcsid = "$Id: atr.c,v 1.1 2001/05/22 15:35:57 rees Exp $"; - -#include <stdio.h> -#include <string.h> - -#include "todos_scrw.h" - -/* - * 7816 says ATR will appear within 40000 clocks (12 msec) - * BUT some cards violate the spec and require more time - */ -#define ATRTIME 120 -#define BYTETIME 1000 - -/* Global interface bytes */ -#define TA1 (tpb[0][0]) -#define TB1 (tpb[0][1]) -#define TC1 (tpb[0][2]) -#define TD1 (tpb[0][3]) -#define TC2 (tpb[1][2]) -#define TA2 (tpb[1][0]) - -static char dummyatr[] = {0x3b, 0x25, 0x00, 0x44, 0x55, 0x4d, 0x4d, 0x59}; - -/* Inversion table, for inverse convention */ -unsigned char scinvert[] = { - 0xff, 0x7f, 0xbf, 0x3f, 0xdf, 0x5f, 0x9f, 0x1f, - 0xef, 0x6f, 0xaf, 0x2f, 0xcf, 0x4f, 0x8f, 0x0f, - 0xf7, 0x77, 0xb7, 0x37, 0xd7, 0x57, 0x97, 0x17, - 0xe7, 0x67, 0xa7, 0x27, 0xc7, 0x47, 0x87, 0x07, - 0xfb, 0x7b, 0xbb, 0x3b, 0xdb, 0x5b, 0x9b, 0x1b, - 0xeb, 0x6b, 0xab, 0x2b, 0xcb, 0x4b, 0x8b, 0x0b, - 0xf3, 0x73, 0xb3, 0x33, 0xd3, 0x53, 0x93, 0x13, - 0xe3, 0x63, 0xa3, 0x23, 0xc3, 0x43, 0x83, 0x03, - 0xfd, 0x7d, 0xbd, 0x3d, 0xdd, 0x5d, 0x9d, 0x1d, - 0xed, 0x6d, 0xad, 0x2d, 0xcd, 0x4d, 0x8d, 0x0d, - 0xf5, 0x75, 0xb5, 0x35, 0xd5, 0x55, 0x95, 0x15, - 0xe5, 0x65, 0xa5, 0x25, 0xc5, 0x45, 0x85, 0x05, - 0xf9, 0x79, 0xb9, 0x39, 0xd9, 0x59, 0x99, 0x19, - 0xe9, 0x69, 0xa9, 0x29, 0xc9, 0x49, 0x89, 0x09, - 0xf1, 0x71, 0xb1, 0x31, 0xd1, 0x51, 0x91, 0x11, - 0xe1, 0x61, 0xa1, 0x21, 0xc1, 0x41, 0x81, 0x01, - 0xfe, 0x7e, 0xbe, 0x3e, 0xde, 0x5e, 0x9e, 0x1e, - 0xee, 0x6e, 0xae, 0x2e, 0xce, 0x4e, 0x8e, 0x0e, - 0xf6, 0x76, 0xb6, 0x36, 0xd6, 0x56, 0x96, 0x16, - 0xe6, 0x66, 0xa6, 0x26, 0xc6, 0x46, 0x86, 0x06, - 0xfa, 0x7a, 0xba, 0x3a, 0xda, 0x5a, 0x9a, 0x1a, - 0xea, 0x6a, 0xaa, 0x2a, 0xca, 0x4a, 0x8a, 0x0a, - 0xf2, 0x72, 0xb2, 0x32, 0xd2, 0x52, 0x92, 0x12, - 0xe2, 0x62, 0xa2, 0x22, 0xc2, 0x42, 0x82, 0x02, - 0xfc, 0x7c, 0xbc, 0x3c, 0xdc, 0x5c, 0x9c, 0x1c, - 0xec, 0x6c, 0xac, 0x2c, 0xcc, 0x4c, 0x8c, 0x0c, - 0xf4, 0x74, 0xb4, 0x34, 0xd4, 0x54, 0x94, 0x14, - 0xe4, 0x64, 0xa4, 0x24, 0xc4, 0x44, 0x84, 0x04, - 0xf8, 0x78, 0xb8, 0x38, 0xd8, 0x58, 0x98, 0x18, - 0xe8, 0x68, 0xa8, 0x28, 0xc8, 0x48, 0x88, 0x08, - 0xf0, 0x70, 0xb0, 0x30, 0xd0, 0x50, 0x90, 0x10, - 0xe0, 0x60, 0xa0, 0x20, 0xc0, 0x40, 0x80, 0x00, -}; - -/* 7816-3 1997 Table 7, 8 */ -static short Ftab[] = { 372, 372, 558, 744, 1116, 1488, 1860, -1, - -1, 512, 768, 1024, 1536, 2048, -1, -1 }; -static short Dtab[] = { -1, 1, 2, 4, 8, 16, 32, -1, 12, 20, -1, -1, -1, -1, -1, -1 }; - -/* - * Table generated by mkFDtab. - */ - -static struct bps { - unsigned char Fi, Di; - long bps; -} bps[] = { - { 0x01, 0x08, 115464 }, - { 0x09, 0x05, 111856 }, - { 0x0b, 0x06, 111840 }, - { 0x03, 0x08, 57732 }, - { 0x09, 0x04, 55928 }, - { 0x0a, 0x08, 55920 }, - { 0x0b, 0x05, 55920 }, - { 0x0d, 0x06, 55904 }, - { 0x03, 0x04, 38488 }, - { 0x01, 0x03, 38488 }, - { 0x04, 0x08, 38484 }, - { 0x06, 0x09, 38480 }, - { 0x05, 0x05, 38480 }, - { 0x0a, 0x04, 37280 }, - { 0x0c, 0x05, 37280 }, - { 0x05, 0x08, 28860 }, - { 0x09, 0x03, 27964 }, - { 0x0c, 0x08, 27960 }, - { 0x0b, 0x04, 27960 }, - { 0x0d, 0x05, 27952 }, - { 0x06, 0x08, 23088 }, - { 0x01, 0x02, 19244 }, - { 0x03, 0x03, 19244 }, - { 0x05, 0x04, 19240 }, - { 0x0a, 0x03, 18640 }, - { 0x0c, 0x04, 18640 }, - { 0x09, 0x02, 13982 }, - { 0x0b, 0x03, 13980 }, - { 0x0d, 0x04, 13976 }, - { 0x02, 0x02, 12828 }, - { 0x04, 0x03, 12828 }, - { 0, 0, 0 } -}; - - -#define SCGETC if (todos_scgetc(ttyn, ap, (len ? BYTETIME : ATRTIME)) != SCEOK) goto timedout; else len++ - -int -todos_get_atr(int ttyn, int flags, unsigned char *atr, struct scparam *param) -{ - int len, i, c, t, ts, t0, tck, nhb, pbn; - int F, D, Fi, Di, N, etu, WI; - unsigned char *ap, *hb; - unsigned char tpb[8][4]; - int hiproto = 0; - - if (flags & SCRFORCE) { - len = sizeof dummyatr; - memcpy(atr, dummyatr, len); - param->t = 0; - param->etu = 100; - param->n = 0; - param->cwt = 1000; - return len; - } - -#ifndef DEBUG - flags &= ~SCRV; -#endif - - ap = atr; - len = 0; - - /* TS */ - SCGETC; - ts = *ap++; - if (ts == 0x3) { - if (flags & SCRV) - printf("inverse conversion\n"); - todos_scsetflags(ttyn, SCOINVRT, SCOINVRT); - ts = scinvert[ts]; - } - if (ts != 0x3b && ts != 0x3f) { - if (flags & SCRV) - printf("TS=%02x (not default timing)\n", ts); - param->t = -1; - return 0; - } - - /* T0 */ - SCGETC; - t0 = *ap++; - nhb = t0 & 0xf; - - /* Fill in defaults */ - TA1 = 0x11; - TB1 = 0x4d; - TC1 = 0x00; - TC2 = 10; - TA2 = 0xff; - TD1 = 0; - - Fi = 1; - Di = 1; - - /* Get up to 8 sets of protocol bytes */ - for (i = 0; i < 8; i++) { - tpb[i][3] = 0; - for (pbn = 0; pbn < 4; pbn++) { - /* If T0 (or TD(i)) indicates presence of proto byte, get it */ - if (t0 & (1 << (4 + pbn))) { - SCGETC; - tpb[i][pbn] = *ap++; - } - } - t = tpb[i][3] & 0xf; - if (t > hiproto) - hiproto = t; - - if (flags & SCRV) { - printf("proto %d T=%d", i + 1, t); - for (pbn = 0; pbn < 4; pbn++) - if (t0 & (1 << (4 + pbn))) - printf(" T%c%d=%02x", 'A' + pbn, i + 1, tpb[i][pbn]); - printf("\n"); - } - - t0 = tpb[i][3]; - if (!(t0 & 0xf0)) - break; - } - - /* Historical bytes */ - if (nhb) { - for (i = 0; i < nhb; i++) { - SCGETC; - ap++; - } - if ((flags & SCRV)) - printf("%d historical bytes\n", nhb); - } - - /* TCK */ - if (hiproto > 0) { - SCGETC; - ap++; - tck = 0; - for (i = 1; i < len; i++) - tck ^= atr[i]; - if (tck != 0 && (flags & SCRV)) - printf("Checksum failed, TCK=%x sum=%x\n", atr[len-1], tck); - } - - /* - * I'm a little unclear on this. If TA2 is present, it indicates a specific mode. - * Else it's negotiable, and starts out with proto 1? - * 7816-3 6.6.1 - */ - if (TA2 != 0xff) - t = TA2 & 0xf; - else - t = TD1 & 0xf; - - /* Todos reader won't do higher speeds */ - if (!(flags & SCRTODOS)) { - for (i = 0; bps[i].bps; i++) { - if (((TA1 >> 4) & 0xf) >= bps[i].Fi && (TA1 & 0xf) >= bps[i].Di) { - int j; - unsigned char c; - static unsigned char pps[4] = {0xff, 0x10, 0, 0}; - - pps[2] = (bps[i].Fi << 4) | bps[i].Di; - pps[3] = 0; - - if (flags & SCRV) - printf("speed %ld\n", bps[i].bps); - -#ifdef SCPPS - /* Compute checksum */ - for (j = 0; j < 3; j++) - pps[3] ^= pps[j]; - - for (j = 0; j < 4; j++) - todos_scputc(ttyn, pps[j]); - for (j = 0; j < 4; j++) - if (todos_scgetc(ttyn, &c, 100) != SCEOK || c != pps[j]) - break; - if (j != 4) - continue; - if (todos_scsetspeed(ttyn, bps[i].bps) < 0) { - /* We already sent the pps, can't back out now, so fail. */ - if (flags & SCRV) - printf("scsetspeed %ld failed\n", bps[i].bps); - param->t = -1; - return len; - } -#endif - Fi = bps[i].Fi; - Di = bps[i].Di; - break; - } - } - } - - F = Ftab[Fi]; - D = Dtab[Di]; - N = TC1; - - /* 1/f = 1/3.579545 ~= 50/179; etu in microsec */ - param->etu = etu = (F * 50L) / (D * 179L); - param->n = (N < 255) ? N : 0; - - if (flags & SCRV) { - printf("%d etu = %d F / %d D * 3.58 f\n", etu, F, D); - if (N) - printf("%d N\n", N); - } - - if (t == 0) { - WI = TC2; - - /* cwt is in milliseconds */ - param->cwt = (960L * WI * F) / 3580L; - if ((flags & SCRV) && WI != 10) - printf("%d cwt = (960 * %d WI * %d F) / 3.58 f / 1000\n", - param->cwt, WI, F); - } else if (t == 1) { - /* add 100 to each for engineering safety margin */ - param->cwt = (11L + (1 << (TB1 & 0xf))) * etu / 1000 + 100; - param->bwt = (11L * etu / 1000L) + ((1 << ((TB1 >> 4) & 0xf)) * 100) + 100; - if (flags & SCRV) - printf("%d cwt, %d bwt\n", param->cwt, param->bwt); - } - param->t = t; - return len; - - timedout: - if (flags & SCRV) - printf("timed out after %d atr bytes\n", len); - param->t = -1; - return 0; -} - -/* -copyright 1997, 1999, 2000 -the regents of the university of michigan -all rights reserved - -permission is granted to use, copy, create derivative works -and redistribute this software and such derivative works -for any purpose, so long as the name of the university of -michigan is not used in any advertising or publicity -pertaining to the use or distribution of this software -without specific, written prior authorization. if the -above copyright notice or any other identification of the -university of michigan is included in any copy of any -portion of this software, then the disclaimer below must -also be included. - -this software is provided as is, without representation -from the university of michigan as to its fitness for any -purpose, and without warranty by the university of -michigan of any kind, either express or implied, including -without limitation the implied warranties of -merchantability and fitness for a particular purpose. the -regents of the university of michigan shall not be liable -for any damages, including special, indirect, incidental, or -consequential damages, with respect to any claim arising -out of or in connection with the use of the software, even -if it has been or is hereafter advised of the possibility of -such damages. -*/ |