From 8fea1ef7bf377a314a5c9e963a708ff0f057194a Mon Sep 17 00:00:00 2001 From: Andreas Eversberg Date: Fri, 1 May 2020 19:01:39 +0200 Subject: [PATCH] Added SIM card emulator/sniffer for C-Netz --- .gitignore | 1 + configure.ac | 1 + docs/index.html | 1 + docs/sim.html | 472 +++++ docs/sim.jpg | Bin 0 -> 176303 bytes docs/style.css | 9 + docs/tv.html | 2 +- layout/telekarte.brd | 1786 ++++++++++++++++ layout/telekarte.pdf | Bin 0 -> 18567 bytes layout/telekarte.sch | 4796 ++++++++++++++++++++++++++++++++++++++++++ src/Makefile.am | 3 +- src/libdebug/debug.c | 4 + src/libdebug/debug.h | 4 + src/sim/Makefile.am | 18 + src/sim/eeprom.h | 33 + src/sim/image.c | 97 + src/sim/main.c | 489 +++++ src/sim/sim.c | 1438 +++++++++++++ src/sim/sim.h | 148 ++ src/sim/sim.ino | 287 +++ src/sim/sniffer.c | 798 +++++++ src/sim/sniffer.h | 26 + 22 files changed, 10411 insertions(+), 2 deletions(-) create mode 100644 docs/sim.html create mode 100644 docs/sim.jpg create mode 100755 layout/telekarte.brd create mode 100755 layout/telekarte.pdf create mode 100755 layout/telekarte.sch create mode 100644 src/sim/Makefile.am create mode 100644 src/sim/eeprom.h create mode 100644 src/sim/image.c create mode 100644 src/sim/main.c create mode 100644 src/sim/sim.c create mode 100644 src/sim/sim.h create mode 100644 src/sim/sim.ino create mode 100644 src/sim/sniffer.c create mode 100644 src/sim/sniffer.h diff --git a/.gitignore b/.gitignore index d0f0cd0..9c57ee7 100644 --- a/.gitignore +++ b/.gitignore @@ -69,6 +69,7 @@ src/tv/osmotv src/radio/osmoradio src/datenklo/datenklo src/zeitansage/zeitansage +src/sim/cnetz_sim extra/cnetz_memory_card_generator src/test/test_filter src/test/test_sendevolumenregler diff --git a/configure.ac b/configure.ac index a09e5d6..42921eb 100644 --- a/configure.ac +++ b/configure.ac @@ -100,6 +100,7 @@ AC_OUTPUT( src/radio/Makefile src/datenklo/Makefile src/zeitansage/Makefile + src/sim/Makefile src/test/Makefile src/Makefile extra/Makefile diff --git a/docs/index.html b/docs/index.html index 25dbaa0..ac17e70 100644 --- a/docs/index.html +++ b/docs/index.html @@ -112,6 +112,7 @@ Additional features: diff --git a/docs/sim.html b/docs/sim.html new file mode 100644 index 0000000..e9826fe --- /dev/null +++ b/docs/sim.html @@ -0,0 +1,472 @@ + + + +osmocom-analog + + +
+ +

C-Netz SIM Emulator

+ +
+ +

+Why emulating a SIM card? +Maybe you got an a C-Netz phone from the attic, friend or Ebay? +But the SIM card is missing. Without SIM card you cannot use your C-Netz phone at all. +Then you buy a high price on Ebay to get a used SIM card. +You find out that the SIM card requires a PIN that you don't know. +Even if you find a SIM card with no PIN enabled, it may not work with newer phones. +The emulator can help you in this case. +

+ +

+Also the emulator can be used to emulate service cards or special cards that enable cell monitoring. +With this emulator you can modify all subscriber data without restrictions. +

+ + + + +

+ +Emulating SIM Card +

+ +
+ +

+The easiest way to emulate a C-Netz SIM card is to use your Linux PC with a serial interface connected to the card reader of the phone. +Connection can be made directly via wires or via ISO card PCB. +You may also use an old ISO card an drill away the chip inside. Then solder thin wires close to the pads and connect them to a serial interface. +

+ +

+In order to connect the card to your Linux PC, you need a serial-to-USB interface. +Don't use the 9 pin SUB-D type of interface, because they have level shifters and will brick your phone. +Use TTL level interface as shown in the image above. +

+ +

+Because the SIM cards uses TTL level, we can connect a CP2102 controller directly to the card reader of a phone. +Don't worry about 5 Volts level from the card reader. The CP2102 can handle it. +In order to connect TX and RX together on one pad of the SIM card, we need to add a diode between the I/O pad and the TX output. +The cathode must point towards the TX output, so that TX can only pull the I/O line low (0). +Use a diode with a low forward voltage drop, like a Schottky diode. I use a simple 1n4148 Silicon diode and it works too. +

+ +

+Important: Some serial interfaces have wrong signal labels. +TX and RX might be reversed, so that TX is actually an input and RX an ouput. +You will find out when you connect an Milliamp meter between signal and ground. +The output will have several Milliamps, but the input doesn't. + +

+ +

+Important: Be sure to run your phone on battery and not via gounded power supply. +If the output of the power supply is grounded, the ground of your power line is also connected to the phone's card reader. +Voltage spikes on the power line's ground between your PC and your phone may kill the card reader or the USB port. +Use an isolating transformer! + +

+ +

+Important: The serial interface must support 8e2. (8 data bits, even parity, two stop bits) +I suggest to use the CP2102. If you know other serial interfaces that work, let me know. + +

+ + + + +

+Connect Ground to GND. +
+Connect CTS input to RESET. +
+Connect RX input to I/O. +
+Connect TX output via diode to I/O. +
+(Place cathode towards TX output) +

+ +

+To run the emulator, use the "sim" keyword at the end of the command line. +Use the '-s' option to give the correct serial interface: +

+ +
+
+# src/sim/cnetz_sim -s /dev/ttyUSB0 sim
+
+...
+FUTLN=23100001, Sicherungscode=3103, Kartekennung=3, Sonderheitenschluessel=0, Wartungsschluessel=65535
+Telephone directory has 80 entries.
+SIM emulator ready, please start the phone!
+sim.c:1352 info   : Reset singnal on (low)
+sim.c:1352 info   : Reset singnal off (high)
+sim.c:1371 info   : Card has disabled PIN (system PIN '0000') Selecting card #1.
+sim.c:1374 info   : Sending ATR
+sim.c:1125 info   : RX message
+sim.c:1135 info   :  control I: N(S)=0 N(R)=0
+sim.c: 473 info   :  SL-APPL app 3
+sim.c:1222 info   : TX resonse
+sim.c:1228 info   :  control I: N(S)=0 N(R)=1
+sim.c:1125 info   : RX message
+sim.c:1135 info   :  control I: N(S)=1 N(R)=1
+sim.c: 558 info   :  RD-EBDT
+sim.c:1222 info   : TX resonse
+sim.c:1228 info   :  control I: N(S)=1 N(R)=2
+sim.c:1125 info   : RX message
+sim.c:1135 info   :  control I: N(S)=2 N(R)=2
+sim.c: 473 info   :  SL-APPL app 4
+sim.c:1222 info   : TX resonse
+sim.c:1228 info   :  control I: N(S)=2 N(R)=3
+sim.c:1125 info   : RX message
+sim.c:1135 info   :  control I: N(S)=3 N(R)=3
+sim.c: 473 info   :  SL-APPL app 3
+sim.c:1222 info   : TX resonse
+sim.c:1228 info   :  control I: N(S)=3 N(R)=4
+sim.c:1125 info   : RX message
+sim.c:1135 info   :  control I: N(S)=4 N(R)=4
+sim.c: 558 info   :  RD-EBDT
+sim.c:1222 info   : TX resonse
+sim.c:1228 info   :  control I: N(S)=4 N(R)=5
+sim.c:1125 info   : RX message
+sim.c:1135 info   :  control I: N(S)=5 N(R)=5
+sim.c: 599 info   :  RD-RUFN (loc=0)
+sim.c: 655 info   :  80 numbers can be stored in EEPROM
+sim.c:1222 info   : TX resonse
+sim.c:1228 info   :  control I: N(S)=5 N(R)=6
+sim.c:1352 info   : Reset singnal on (low)
+
+
+ +

+Use '-h' command line option to get a list of all options. +

+ + +

+ +Sniffing SIM Card +

+ +

+To run the sniffer, use the "sniff" keyword at the end of the command line. +You only need to connect I/O line to the RX line of your serial interface. (And ground of course!) +Use the '-s' option to give the correct serial interface: +

+ + +
+
+# src/sim/cnetz_sim -s /dev/ttyUSB0 sniff
+
+sniffer.c: 602 info   : ----------------------------------------
+sniffer.c: 609 info   : Reading ATR normal bit order:
+sniffer.c: 547 info   :  TD1 T=14: Refers to transmission protocols not standardized by ISO/IEC JTC 1/SC 17.
+sniffer.c: 590 info   : ----------------------------------------
+sniffer.c: 547 info   :  TD2 T=14: Refers to transmission protocols not standardized by ISO/IEC JTC 1/SC 17.
+sniffer.c: 590 info   : ----------------------------------------
+sniffer.c: 418 info   :  TA3 fsmin = 3 MHz
+sniffer.c: 433 info   :  TA3 fsmax = 5 MHz (Default)
+sniffer.c: 470 info   :  TB3 Maximum block size = 42
+sniffer.c: 516 info   :  TC3 Character Waiting Time = 3
+sniffer.c: 547 info   :  TD3 T=14: Refers to transmission protocols not standardized by ISO/IEC JTC 1/SC 17.
+sniffer.c: 590 info   : ----------------------------------------
+sniffer.c: 440 info   :  TA4 Block Waiting Time = 4
+sniffer.c: 590 info   : ----------------------------------------
+sniffer.c: 595 info   :  History byte #1: 0x92
+sniffer.c: 595 info   :  History byte #2: 0x80
+sniffer.c: 595 info   :  History byte #3: 0x00
+sniffer.c: 595 info   :  History byte #4: 0x41
+sniffer.c: 595 info   :  History byte #5: 0x32
+sniffer.c: 595 info   :  History byte #6: 0x36
+sniffer.c: 595 info   :  History byte #7: 0x01
+sniffer.c: 595 info   :  History byte #8: 0x11
+sniffer.c: 690 info   :  Checksum 0xe4 ok.
+sniffer.c: 697 info   : ATR done!
+sniffer.c: 715 info   : ----------------------------------------
+sniffer.c: 734 info   : Layer 2:
+sniffer.c: 735 info   :  source 3 -> to 1
+sniffer.c: 737 info   :  control I: N(S)=0 N(R)=0
+sniffer.c: 744 info   :  length 15
+sniffer.c: 203 info   : Interface control layer ICB1:
+sniffer.c: 207 info   :  ON-LINE-BIT:         0 = Off-line data
+sniffer.c: 211 info   :  CONFIRM-BIT:         0 = No meaning
+sniffer.c: 213 info   :  MASTER/SLAVE-BIT:    1 = Sender is master
+sniffer.c: 219 info   :  WT-EXTENSION-BIT:    0 = No request for WT-Extension
+sniffer.c: 223 info   :  ABORT/TERMINATE-BIT: 0 = No meaning
+sniffer.c: 227 info   :  ERROR-BIT:           0 = No meaning
+sniffer.c: 231 info   :  CHAINING-BIT:        0 = No more ICL data follows
+sniffer.c: 235 info   :  ICB-EXTENSION-BIT:   0 = no ICB follows
+sniffer.c:  48 info   : Layer 7:
+sniffer.c:  50 info   :  I = Command
+sniffer.c:  51 info   :  CLA = 0x02
+sniffer.c:  54 info   :   -> CNTR (Control Class)
+sniffer.c:  75 info   :  INS = 0xf1
+sniffer.c:  80 info   :   -> SL-APPL (Select Application)
+sniffer.c: 180 info   :  DLNG = 11
+sniffer.c: 187 info   :  DATA(0) = 0x38 '8' 56
+sniffer.c: 187 info   :  DATA(1) = 0x39 '9' 57
+sniffer.c: 187 info   :  DATA(2) = 0x34 '4' 52
+sniffer.c: 187 info   :  DATA(3) = 0x39 '9' 57
+sniffer.c: 187 info   :  DATA(4) = 0x30 '0' 48
+sniffer.c: 187 info   :  DATA(5) = 0x31 '1' 49
+sniffer.c: 187 info   :  DATA(6) = 0x30 '0' 48
+sniffer.c: 187 info   :  DATA(7) = 0x30 '0' 48
+sniffer.c: 187 info   :  DATA(8) = 0x33 '3' 51
+sniffer.c: 187 info   :  DATA(9) = 0x30 '0' 48
+sniffer.c: 187 info   :  DATA(10) = 0x31 '1' 49
+sniffer.c: 715 info   : ----------------------------------------
+sniffer.c: 734 info   : Layer 2:
+sniffer.c: 735 info   :  source 1 -> to 3
+sniffer.c: 737 info   :  control I: N(S)=0 N(R)=1
+sniffer.c: 744 info   :  length 4
+sniffer.c: 203 info   : Interface control layer ICB1:
+sniffer.c: 207 info   :  ON-LINE-BIT:         0 = Off-line data
+sniffer.c: 211 info   :  CONFIRM-BIT:         0 = No meaning
+sniffer.c: 215 info   :  MASTER/SLAVE-BIT:    0 = Sender is slave
+sniffer.c: 219 info   :  WT-EXTENSION-BIT:    0 = No request for WT-Extension
+sniffer.c: 223 info   :  ABORT/TERMINATE-BIT: 0 = No meaning
+sniffer.c: 227 info   :  ERROR-BIT:           0 = No meaning
+sniffer.c: 231 info   :  CHAINING-BIT:        0 = No more ICL data follows
+sniffer.c: 235 info   :  ICB-EXTENSION-BIT:   0 = no ICB follows
+sniffer.c:  48 info   : Layer 7:
+sniffer.c: 142 info   :  I = Response
+sniffer.c: 143 info   :  CCRC = 0x05
+sniffer.c: 145 info   :   -> PIN-NOT-OK
+sniffer.c: 149 info   :   -> APRC valid
+sniffer.c: 158 info   :  APRC = 0x02
+sniffer.c: 160 info   :   -> Bit 2 = 1:PIN-Check required
+sniffer.c: 166 info   :   -> Bit 3 = 0:Application unlocked
+sniffer.c: 170 info   :   -> Bit 5 = 0:GEBZ/RUFN unlocked
+sniffer.c: 174 info   :   -> Bit 6 = 0:GEBZ not full
+sniffer.c: 180 info   :  DLNG = 0
+sniffer.c: 302 info   : Resetting sniffer
+
+
+ +

+When the phone is switched on, the SIM card is powered up and outputs the ATR sequence (Answer To Reset). +

+ +

+The first message is a command message that is transmitted from the phone towards the SIM card. +The layer 2 header indicates the direction and the length of 15 bytes. +The ICR layer has no meaning with the C-Netz. +Except for the MASTER/SLAVE-BIT, no other bit is used. +The layer 7 (application) header indicates the command and the message type and length, followed by 11 bytes of data. +This command tells the SIM card to select C-Netz application. +

+ +

+The second message is a response message that is transmitted from the SIM card towards the phone. +The layer 2 header indicates the direction and the length of 4 bytes. +The layer 7 header indicates the response and status bits and length, followed by 0 bytes of data. +The response tells the SIM card that a PIN is required to complete the command. +The user is prompted to enter the pin. +

+ +

+To read more about the protocol, and the meaning of messages, refer to FTZ 171 TR 60 - Anhang 1 Berechtigungskarte als Prozessorkarte.pdf +

+ + +

+ +Build Your Own SIM Card +

+ +
+ +

+You find the PCB drawings inside the "layout" directory of the git repository. +Be sure to print it without scaling! +Check if the printed size matches an ISO card. +Also there is the source files for the 'Eagle' layout program, if you like to change it. +

+ +

+You may use an "Arduino UNO" or "ATTINY85" to emulate a SIM card without a PC. +In case of the Arduino, you still need wires to connect it to the card reader of the phone. +If you use an ATTINY85, you can put the micro controller directly on a PCB card, as shown on top of this page. +

+ +

+To compile and run with Arduino, you need to open "src/sim/sim.ino" with Arduino software and select the "Arduino UNO" board. +The RESET input is at pin 6 and the I/O line at pin 7. +Connect these two lines together with ground line to the card reader or ISO card PCB. +You don't need a diode this time, since pin 7 is automatically switched between input and output. +The serial protocol is emulated in software. +The status LED (pin 13) will flash whenever a message is received from the card reader. +

+ +

+To compile and run with ATTINY85, you need to open "src/sim/sim.ino" with Arduino software and select the "ATiny25/45/85" board and the "ATiny85" chip. +Refer to the internet on how to compile and flash the ATTINY85 without boot-loader. +It is beyond the scope of this documentation. +This time you need 5 wires to connect (VCC and Clock also). +

+ +

+Important: After flashing you need to wait 10 seconds before removing power. +During that time the EEPROM is initialized. +If you would read out the EEPROM, you will notice the letter 'C' at address 0. +Then you would know that the init process was finished with success. + +

+ +

+If you use the DIP version of the ATTINY85, you cannot put it on the card itself. +The PCB in the picture on top of this page shows the DIP socket next to the actual card area. +Be sure to put the chip on the back side of the SIM card. +This works only if the phone does not completely enclose the card. +

+ +

+If you use the SOIC version of the ATTINY85, you need to make it flat, so it fits into your phone. +You may use the full size SIM or just the mini SIM. +I prefer the mini SIM and use an adapter card for larger phones. +

+ +
+ +

+The original ATTINY85 (1) is shown upside down. +Bend the legs straight and shorten them, so they still fit into a programmer's socket. (2) +The use P400 sand paper to sand off the bottom of the case until you reach copper plate. (3) +Make a hole into the PBC and solder the chip upside down into that hole. +Pin 1 is marked on the PCB. +

+ +

+Important: You need to change clock source to pin 1. + +

+ +

+Change lower fuse of 0xc0. +Note that you will not be able to do any further programming unless you apply clock signal to pin 1. +Use a crystal oscillator connected to pin 1 when you like to update the firmware in the future. +You may also use other type of clock signal. +Try something between 1 and 8 MHz. +I recommend to use the USBasp or a clone of that. It is cheap and easy and works with USB. +To set the fuses using "avrdude" in conjunction with "usbasp" flash tool, use:
+
+avrdude -c usbasp-clone -p t85 -U lfuse:w:0xc0:m -U hfuse:w:0xdf:m -U efuse:w:0xff:m
+
+If you run it again, you might notice that there is no response without a clock applied. +Apply a clock to pin 1 and see if you get a response again. +

+ +

+ +Using the SIM Card +

+ +

+After powering up the phone with SIM adapter/emulator attached, the phone should show the default subscriber number (FUTLN) on the display. +(Not all phones do. Read the manual to get the key code on how to show the subscriber number.) +There is no PIN enabled by default, so the SIM card is ready after inserting or poweing up the phone. +Now you can make calls, add telephone numbers or change PIN. +

+ +

+The SIM card can emulate 8 different cards. +They share the same telephone directory, but have different subscriber data. +Subscriber data can be changed to anything you like. +This way it is possible to even emulate service cards ("Wartungskarten"), to put phones into service mode or special cell monitor mode. +

+ +

+If the PIN is disabled (default), the first card with first subscriber data is emulates. +To select different card with dfferent subscriber data, change the PIN to 0001 .. 0008. +Refer to the phone's manual on how to change the PIN. +E.g. if you store the PIN 0000 or 0001, the first card with the first subscriber data is emulated. +E.g. if you store the PIN 0005, the fifth card with the fifth subscriber data is emulated. +In all cases, there is no PIN required when you turn on the phone. +

+ +

+ + + + + + + + + + +
PINFUTLN =
Subscriber
Sicherungs-
code
Karten-
kennung
Sonderheiten-
schlüssel
Wartungs-
schlüssel
0000 or 0001222200131033065535
0002222200231033065535
0003222200331033065535
0004222200431033065535
0005222200531033065535
0006222200631033065535
0007222200731033065535
0008222200831033065535
+

+ +

+You may want to use a PIN to select the card whenever you turn on the phone. +Use the phone to enable a PIN that does not start with "000". +When you restart your phone, you may enter that PIN, to select the first card. +Alternatively you may enter the PIN 0000 or 0001, to select the first card, no matter what the PIN was. +Or you may enter the PIN 0002 .. 0008, to select second to eight card. +

+ +

+You may also alter each of the 8 different subscriber data store on the SIM. +In order to do that, you need to set a PIN, so the phone will ask for a PIN whenever it is turned on. +Choose any PIN you like, but not a PIN stat starts with 000. +Turn on the phone and you will be asked for a PIN. +Enter the PIN 9991 to alter the first subscriber data. +Enter the PIN 9992 .. 9998 to alter second to eigtht subscriber data. +The subscriber data is shown in the telephone directory and can be altered by changing the numbers in that directory. +

+ +

+The default subscriber data and where to change them in the telephone directory: +

+ + + + + + + +
EntryNameNumber
01FUTLN2222001 *
02Sicherungscode3103
03Kartenkennung3
04Sonderheitsschl.0
05Wartungsschl.65535
+
+(*) When PIN 9991 was entered. +

+ + +

+ +Service Cards +

+ +

+To program one of the following service cards, change the subscriber data to the indicated values. +

+ +

+ + + + + + + +
TypeFUTLN =
Subscriber
Sicherungs-
code
Karten-
kennung
Sonderheiten-
schlüssel
Wartungs-
schlüssel
Siemens C5
service mode
---9001000
Phillips Miniporty
service mode
---9001000
Phillips Miniporty
cell monitor
---9001728 or
2729
Phillips Porty
service mode
0002304-
Phillips Porty
cell monitor
---898-
+

+ + +
[Back to main page]

+
+ + diff --git a/docs/sim.jpg b/docs/sim.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1f2a037a4dabd08f4bde2d4f7ca864312ea5c459 GIT binary patch literal 176303 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�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�sZy&h$t*_47{&uo5)i`FDjjhvoS<6>V{^Nb2 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

;&B;q&Xb6ASO@Hdy`NK_?KTC`nal+Qr+ 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 ZkAM3Kx~sz(hND8n2}E$Ke!v71|Jkl&F`)ne literal 0 HcmV?d00001 diff --git a/docs/style.css b/docs/style.css index 06b6850..8232fb6 100644 --- a/docs/style.css +++ b/docs/style.css @@ -91,6 +91,15 @@ table.imts { border-collapse: collapse; } +table.sim { + width: 816; + text-align: left; + table-layout: fixed; + border-spacing: 0px; + border: none; + border-collapse: collapse; +} + li { font-size: 20; color: #000000; diff --git a/docs/tv.html b/docs/tv.html index 81f7122..38f3747 100644 --- a/docs/tv.html +++ b/docs/tv.html @@ -27,7 +27,7 @@ The following test signals are supported:

-Importaint: SDR is required! It must be capable of about 15 Mega samples per second. +Important: SDR is required! It must be capable of about 15 Mega samples per second.

If you use LimeSDR, you MUST use USB 3.0 to have enough bandwidth!

diff --git a/layout/telekarte.brd b/layout/telekarte.brd new file mode 100755 index 0000000..1592e74 --- /dev/null +++ b/layout/telekarte.brd @@ -0,0 +1,1786 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Jolly's +TeleKarte +1 +1 + + +VCC +GND +RES +CLK +I/O + + + +<b>ISO 7816 Chipcard (Package)</b><p> +<author>Created by librarian@cadsoft.de</author> + + +<b>ISO7816-1 Standard</b> Chip Card<p> +Source: http://www.didya.com/iso-7816.asp + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +VCC +RST +CLK +NC +I/O +GND +>NAME +>VALUE +NC +NC + + + + + + + + + + + + +<b>AVR Devices</b><p> +Configurable logic, microcontrollers, nonvolatile memories<p> +Based on the following sources:<p> +<ul> +<li>www.atmel.com +<li>CD-ROM : Configurable Logic Microcontroller Nonvolatile Memory +<li>CadSoft download site, www.cadsoft.de or www.cadsoftusa.com , file at90smcu_v400.zip +</ul> +<author>Revised by librarian@cadsoft.de</author> + + +<b>SMALL OUTLINE INTEGRATED CIRCUIT</b><p> +body 3.9 mm/JEDEC MS-012AA + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + +<b>Dual In Line Package</b> + + + + + + + + + + + + + + +>NAME +>VALUE + + + + +<b>Test Pins/Pads</b><p> +Cream on SMD OFF.<br> +new: Attribute TP_SIGNAL_NAME<br> +<author>Created by librarian@cadsoft.de</author> + + +<b>TEST PAD</b> + +>NAME +>VALUE +>TP_SIGNAL_NAME + + + + +<b>Resistors, Capacitors, Inductors</b><p> +Based on the previous libraries: +<ul> +<li>r.lbr +<li>cap.lbr +<li>cap-fe.lbr +<li>captant.lbr +<li>polcap.lbr +<li>ipc-smd.lbr +</ul> +All SMD packages are defined according to the IPC specifications and CECC<p> +<author>Created by librarian@cadsoft.de</author><p> +<p> +for Electrolyt Capacitors see also :<p> +www.bccomponents.com <p> +www.panasonic.com<p> +www.kemet.com<p> +<p> +for trimmer refence see : <u>www.electrospec-inc.com/cross_references/trimpotcrossref.asp</u><p> + +<map name="nav_main"> +<area shape="rect" coords="0,1,140,23" href="../military_specs.asp" title=""> +<area shape="rect" coords="0,24,140,51" href="../about.asp" title=""> +<area shape="rect" coords="1,52,140,77" href="../rfq.asp" title=""> +<area shape="rect" coords="0,78,139,103" href="../products.asp" title=""> +<area shape="rect" coords="1,102,138,128" href="../excess_inventory.asp" title=""> +<area shape="rect" coords="1,129,138,150" href="../edge.asp" title=""> +<area shape="rect" coords="1,151,139,178" href="../industry_links.asp" title=""> +<area shape="rect" coords="0,179,139,201" href="../comments.asp" title=""> +<area shape="rect" coords="1,203,138,231" href="../directory.asp" title=""> +<area shape="default" nohref> +</map> + +<html> + +<title></title> + + <LINK REL="StyleSheet" TYPE="text/css" HREF="style-sheet.css"> + +<body bgcolor="#ffffff" text="#000000" marginwidth="0" marginheight="0" topmargin="0" leftmargin="0"> +<table border=0 cellspacing=0 cellpadding=0 width="100%" cellpaddding=0 height="55%"> +<tr valign="top"> + +</td> +<! <td width="10">&nbsp;</td> +<td width="90%"> + +<b><font color="#0000FF" size="4">TRIM-POT CROSS REFERENCE</font></b> +<P> +<TABLE BORDER=0 CELLSPACING=1 CELLPADDING=2> + <TR> + <TD COLSPAN=8> + <FONT SIZE=3 FACE=ARIAL><B>RECTANGULAR MULTI-TURN</B></FONT> + </TD> + </TR> + <TR> + <TD ALIGN=CENTER> + <B> + <FONT SIZE=3 FACE=ARIAL color="#FF0000">BOURNS</FONT> + </B> + </TD> + <TD ALIGN=CENTER> + <B> + <FONT SIZE=3 FACE=ARIAL color="#FF0000">BI&nbsp;TECH</FONT> + </B> + </TD> + <TD ALIGN=CENTER> + <B> + <FONT SIZE=3 FACE=ARIAL color="#FF0000">DALE-VISHAY</FONT> + </B> + </TD> + <TD ALIGN=CENTER> + <B> + <FONT SIZE=3 FACE=ARIAL color="#FF0000">PHILIPS/MEPCO</FONT> + </B> + </TD> + <TD ALIGN=CENTER> + <B> + <FONT SIZE=3 FACE=ARIAL color="#FF0000">MURATA</FONT> + </B> + </TD> + <TD ALIGN=CENTER> + <B> + <FONT SIZE=3 FACE=ARIAL color="#FF0000">PANASONIC</FONT> + </B> + </TD> + <TD ALIGN=CENTER> + <B> + <FONT SIZE=3 FACE=ARIAL color="#FF0000">SPECTROL</FONT> + </B> + </TD> + <TD ALIGN=CENTER> + <B> + <FONT SIZE=3 FACE=ARIAL color="#FF0000">MILSPEC</FONT> + </B> + </TD><TD>&nbsp;</TD> + </TR> + <TR> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3 > + 3005P<BR> + 3006P<BR> + 3006W<BR> + 3006Y<BR> + 3009P<BR> + 3009W<BR> + 3009Y<BR> + 3057J<BR> + 3057L<BR> + 3057P<BR> + 3057Y<BR> + 3059J<BR> + 3059L<BR> + 3059P<BR> + 3059Y<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + 89P<BR> + 89W<BR> + 89X<BR> + 89PH<BR> + 76P<BR> + 89XH<BR> + 78SLT<BR> + 78L&nbsp;ALT<BR> + 56P&nbsp;ALT<BR> + 78P&nbsp;ALT<BR> + T8S<BR> + 78L<BR> + 56P<BR> + 78P<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + T18/784<BR> + 783<BR> + 781<BR> + -<BR> + -<BR> + -<BR> + 2199<BR> + 1697/1897<BR> + 1680/1880<BR> + 2187<BR> + -<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + 8035EKP/CT20/RJ-20P<BR> + -<BR> + RJ-20X<BR> + -<BR> + -<BR> + -<BR> + 1211L<BR> + 8012EKQ&nbsp;ALT<BR> + 8012EKR&nbsp;ALT<BR> + 1211P<BR> + 8012EKJ<BR> + 8012EKL<BR> + 8012EKQ<BR> + 8012EKR<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + 2101P<BR> + 2101W<BR> + 2101Y<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + 2102L<BR> + 2102S<BR> + 2102Y<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + EVMCOG<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + 43P<BR> + 43W<BR> + 43Y<BR> + -<BR> + -<BR> + -<BR> + -<BR> + 40L<BR> + 40P<BR> + 40Y<BR> + 70Y-T602<BR> + 70L<BR> + 70P<BR> + 70Y<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + RT/RTR12<BR> + RT/RTR12<BR> + RT/RTR12<BR> + -<BR> + RJ/RJR12<BR> + RJ/RJR12<BR> + RJ/RJR12<BR></FONT> + </TD> + </TR> + <TR> + <TD COLSPAN=8>&nbsp; + </TD> + </TR> + <TR> + <TD COLSPAN=8> + <FONT SIZE=4 FACE=ARIAL><B>SQUARE MULTI-TURN</B></FONT> + </TD> + </TR> + <TR> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>BOURN</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>BI&nbsp;TECH</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>DALE-VISHAY</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>PHILIPS/MEPCO</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>MURATA</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>PANASONIC</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>SPECTROL</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>MILSPEC</B></FONT> + </TD> + </TR> + <TR> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + 3250L<BR> + 3250P<BR> + 3250W<BR> + 3250X<BR> + 3252P<BR> + 3252W<BR> + 3252X<BR> + 3260P<BR> + 3260W<BR> + 3260X<BR> + 3262P<BR> + 3262W<BR> + 3262X<BR> + 3266P<BR> + 3266W<BR> + 3266X<BR> + 3290H<BR> + 3290P<BR> + 3290W<BR> + 3292P<BR> + 3292W<BR> + 3292X<BR> + 3296P<BR> + 3296W<BR> + 3296X<BR> + 3296Y<BR> + 3296Z<BR> + 3299P<BR> + 3299W<BR> + 3299X<BR> + 3299Y<BR> + 3299Z<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + 66P&nbsp;ALT<BR> + 66W&nbsp;ALT<BR> + 66X&nbsp;ALT<BR> + 66P&nbsp;ALT<BR> + 66W&nbsp;ALT<BR> + 66X&nbsp;ALT<BR> + -<BR> + 64W&nbsp;ALT<BR> + -<BR> + 64P&nbsp;ALT<BR> + 64W&nbsp;ALT<BR> + 64X&nbsp;ALT<BR> + 64P<BR> + 64W<BR> + 64X<BR> + 66X&nbsp;ALT<BR> + 66P&nbsp;ALT<BR> + 66W&nbsp;ALT<BR> + 66P<BR> + 66W<BR> + 66X<BR> + 67P<BR> + 67W<BR> + 67X<BR> + 67Y<BR> + 67Z<BR> + 68P<BR> + 68W<BR> + 68X<BR> + 67Y&nbsp;ALT<BR> + 67Z&nbsp;ALT<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + 5050<BR> + 5091<BR> + 5080<BR> + 5087<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + T63YB<BR> + T63XB<BR> + -<BR> + -<BR> + -<BR> + 5887<BR> + 5891<BR> + 5880<BR> + -<BR> + -<BR> + -<BR> + T93Z<BR> + T93YA<BR> + T93XA<BR> + T93YB<BR> + T93XB<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + 8026EKP<BR> + 8026EKW<BR> + 8026EKM<BR> + 8026EKP<BR> + 8026EKB<BR> + 8026EKM<BR> + 1309X<BR> + 1309P<BR> + 1309W<BR> + 8024EKP<BR> + 8024EKW<BR> + 8024EKN<BR> + RJ-9P/CT9P<BR> + RJ-9W<BR> + RJ-9X<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + 3103P<BR> + 3103Y<BR> + 3103Z<BR> + 3103P<BR> + 3103Y<BR> + 3103Z<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + 3105P/3106P<BR> + 3105W/3106W<BR> + 3105X/3106X<BR> + 3105Y/3106Y<BR> + 3105Z/3105Z<BR> + 3102P<BR> + 3102W<BR> + 3102X<BR> + 3102Y<BR> + 3102Z<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + EVMCBG<BR> + EVMCCG<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + 55-1-X<BR> + 55-4-X<BR> + 55-3-X<BR> + 55-2-X<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + 50-2-X<BR> + 50-4-X<BR> + 50-3-X<BR> + -<BR> + -<BR> + -<BR> + 64P<BR> + 64W<BR> + 64X<BR> + 64Y<BR> + 64Z<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + RT/RTR22<BR> + RT/RTR22<BR> + RT/RTR22<BR> + RT/RTR22<BR> + RJ/RJR22<BR> + RJ/RJR22<BR> + RJ/RJR22<BR> + RT/RTR26<BR> + RT/RTR26<BR> + RT/RTR26<BR> + RJ/RJR26<BR> + RJ/RJR26<BR> + RJ/RJR26<BR> + RJ/RJR26<BR> + RJ/RJR26<BR> + RJ/RJR26<BR> + RT/RTR24<BR> + RT/RTR24<BR> + RT/RTR24<BR> + RJ/RJR24<BR> + RJ/RJR24<BR> + RJ/RJR24<BR> + RJ/RJR24<BR> + RJ/RJR24<BR> + RJ/RJR24<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + </TR> + <TR> + <TD COLSPAN=8>&nbsp; + </TD> + </TR> + <TR> + <TD COLSPAN=8> + <FONT SIZE=4 FACE=ARIAL><B>SINGLE TURN</B></FONT> + </TD> + </TR> + <TR> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>BOURN</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>BI&nbsp;TECH</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>DALE-VISHAY</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>PHILIPS/MEPCO</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>MURATA</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>PANASONIC</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>SPECTROL</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>MILSPEC</B></FONT> + </TD> + </TR> + <TR> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + 3323P<BR> + 3323S<BR> + 3323W<BR> + 3329H<BR> + 3329P<BR> + 3329W<BR> + 3339H<BR> + 3339P<BR> + 3339W<BR> + 3352E<BR> + 3352H<BR> + 3352K<BR> + 3352P<BR> + 3352T<BR> + 3352V<BR> + 3352W<BR> + 3362H<BR> + 3362M<BR> + 3362P<BR> + 3362R<BR> + 3362S<BR> + 3362U<BR> + 3362W<BR> + 3362X<BR> + 3386B<BR> + 3386C<BR> + 3386F<BR> + 3386H<BR> + 3386K<BR> + 3386M<BR> + 3386P<BR> + 3386S<BR> + 3386W<BR> + 3386X<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + 25P<BR> + 25S<BR> + 25RX<BR> + 82P<BR> + 82M<BR> + 82PA<BR> + -<BR> + -<BR> + -<BR> + 91E<BR> + 91X<BR> + 91T<BR> + 91B<BR> + 91A<BR> + 91V<BR> + 91W<BR> + 25W<BR> + 25V<BR> + 25P<BR> + -<BR> + 25S<BR> + 25U<BR> + 25RX<BR> + 25X<BR> + 72XW<BR> + 72XL<BR> + 72PM<BR> + 72RX<BR> + -<BR> + 72PX<BR> + 72P<BR> + 72RXW<BR> + 72RXL<BR> + 72X<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + T7YB<BR> + T7YA<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + TXD<BR> + TYA<BR> + TYP<BR> + -<BR> + TYD<BR> + TX<BR> + -<BR> + 150SX<BR> + 100SX<BR> + 102T<BR> + 101S<BR> + 190T<BR> + 150TX<BR> + 101<BR> + -<BR> + -<BR> + 101SX<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + ET6P<BR> + ET6S<BR> + ET6X<BR> + RJ-6W/8014EMW<BR> + RJ-6P/8014EMP<BR> + RJ-6X/8014EMX<BR> + TM7W<BR> + TM7P<BR> + TM7X<BR> + -<BR> + 8017SMS<BR> + -<BR> + 8017SMB<BR> + 8017SMA<BR> + -<BR> + -<BR> + CT-6W<BR> + CT-6H<BR> + CT-6P<BR> + CT-6R<BR> + -<BR> + CT-6V<BR> + CT-6X<BR> + -<BR> + -<BR> + 8038EKV<BR> + -<BR> + 8038EKX<BR> + -<BR> + -<BR> + 8038EKP<BR> + 8038EKZ<BR> + 8038EKW<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + 3321H<BR> + 3321P<BR> + 3321N<BR> + 1102H<BR> + 1102P<BR> + 1102T<BR> + RVA0911V304A<BR> + -<BR> + RVA0911H413A<BR> + RVG0707V100A<BR> + RVA0607V(H)306A<BR> + RVA1214H213A<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + 3104B<BR> + 3104C<BR> + 3104F<BR> + 3104H<BR> + -<BR> + 3104M<BR> + 3104P<BR> + 3104S<BR> + 3104W<BR> + 3104X<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + EVMQ0G<BR> + EVMQIG<BR> + EVMQ3G<BR> + EVMS0G<BR> + EVMQ0G<BR> + EVMG0G<BR> + -<BR> + -<BR> + -<BR> + EVMK4GA00B<BR> + EVM30GA00B<BR> + EVMK0GA00B<BR> + EVM38GA00B<BR> + EVMB6<BR> + EVLQ0<BR> + -<BR> + EVMMSG<BR> + EVMMBG<BR> + EVMMAG<BR> + -<BR> + -<BR> + EVMMCS<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + EVMM1<BR> + -<BR> + -<BR> + EVMM0<BR> + -<BR> + -<BR> + EVMM3<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + 62-3-1<BR> + 62-1-2<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + 67R<BR> + -<BR> + 67P<BR> + -<BR> + -<BR> + -<BR> + -<BR> + 67X<BR> + 63V<BR> + 63S<BR> + 63M<BR> + -<BR> + -<BR> + 63H<BR> + 63P<BR> + -<BR> + -<BR> + 63X<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + RJ/RJR50<BR> + RJ/RJR50<BR> + RJ/RJR50<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + </TR> +</TABLE> +<P>&nbsp;<P> +<TABLE BORDER=0 CELLSPACING=1 CELLPADDING=3> + <TR> + <TD COLSPAN=7> + <FONT color="#0000FF" SIZE=4 FACE=ARIAL><B>SMD TRIM-POT CROSS REFERENCE</B></FONT> + <P> + <FONT SIZE=4 FACE=ARIAL><B>MULTI-TURN</B></FONT> + </TD> + </TR> + <TR> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>BOURNS</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>BI&nbsp;TECH</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>DALE-VISHAY</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>PHILIPS/MEPCO</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>PANASONIC</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>TOCOS</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>AUX/KYOCERA</B></FONT> + </TD> + </TR> + <TR> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + 3224G<BR> + 3224J<BR> + 3224W<BR> + 3269P<BR> + 3269W<BR> + 3269X<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + 44G<BR> + 44J<BR> + 44W<BR> + 84P<BR> + 84W<BR> + 84X<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + ST63Z<BR> + ST63Y<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + ST5P<BR> + ST5W<BR> + ST5X<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + </TR> + <TR> + <TD COLSPAN=7>&nbsp; + </TD> + </TR> + <TR> + <TD COLSPAN=7> + <FONT SIZE=4 FACE=ARIAL><B>SINGLE TURN</B></FONT> + </TD> + </TR> + <TR> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>BOURNS</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>BI&nbsp;TECH</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>DALE-VISHAY</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>PHILIPS/MEPCO</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>PANASONIC</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>TOCOS</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>AUX/KYOCERA</B></FONT> + </TD> + </TR> + <TR> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + 3314G<BR> + 3314J<BR> + 3364A/B<BR> + 3364C/D<BR> + 3364W/X<BR> + 3313G<BR> + 3313J<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + 23B<BR> + 23A<BR> + 21X<BR> + 21W<BR> + -<BR> + 22B<BR> + 22A<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + ST5YL/ST53YL<BR> + ST5YJ/5T53YJ<BR> + ST-23A<BR> + ST-22B<BR> + ST-22<BR> + -<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + ST-4B<BR> + ST-4A<BR> + -<BR> + -<BR> + -<BR> + ST-3B<BR> + ST-3A<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + EVM-6YS<BR> + EVM-1E<BR> + EVM-1G<BR> + EVM-1D<BR> + -<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + G4B<BR> + G4A<BR> + TR04-3S1<BR> + TRG04-2S1<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + DVR-43A<BR> + CVR-42C<BR> + CVR-42A/C<BR> + -<BR> + -<BR></FONT> + </TD> + </TR> +</TABLE> +<P> +<FONT SIZE=4 FACE=ARIAL><B>ALT =&nbsp;ALTERNATE</B></FONT> +<P> + +&nbsp; +<P> +</td> +</tr> +</table> +</BODY></HTML> + + +<b>CAPACITOR</b><p> +chip + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + + +<b>EAGLE Design Rules</b> +<p> +Die Standard-Design-Rules sind so gewählt, dass sie für +die meisten Anwendungen passen. Sollte ihre Platine +besondere Anforderungen haben, treffen Sie die erforderlichen +Einstellungen hier und speichern die Design Rules unter +einem neuen Namen ab. +<b>EAGLE Design Rules</b> +<p> +The default Design Rules have been set to cover +a wide range of applications. Your particular design +may have different requirements, so please make the +necessary adjustments and save your customized +design rules under a new name. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/layout/telekarte.pdf b/layout/telekarte.pdf new file mode 100755 index 0000000000000000000000000000000000000000..e95ad0c1a2f9295b456d64afe7716a6d820f1555 GIT binary patch literal 18567 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +<b>ISO 7816 Chipcard (Package)</b><p> +<author>Created by librarian@cadsoft.de</author> + + +<b>ISO 7816 Chipcard</b> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +VCC +RST +CLK +NC +I/O +GND +>NAME +>VALUE +NC +NC + + + + + + + + + + +<b>ISO7816-1 Standard</b> Chip Card<p> +Source: http://www.didya.com/iso-7816.asp + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +VCC +RST +CLK +NC +I/O +GND +>NAME +>VALUE +NC +NC + + + + + + + + + + +<b>AFNOR Chip Card</b><p> +Source: http://www.didya.com/iso-7816.asp + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +VCC +RST +CLK +NC +I/O +GND +>NAME +>VALUE +NC +NC + + + + + + + + + + + + + + + + + + + + +<b>Chip card connector ISO 7816</b> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +<b>AVR Devices</b><p> +Configurable logic, microcontrollers, nonvolatile memories<p> +Based on the following sources:<p> +<ul> +<li>www.atmel.com +<li>CD-ROM : Configurable Logic Microcontroller Nonvolatile Memory +<li>CadSoft download site, www.cadsoft.de or www.cadsoftusa.com , file at90smcu_v400.zip +</ul> +<author>Revised by librarian@cadsoft.de</author> + + +<b>Dual In Line Package</b> + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>SMALL OUTLINE INTEGRATED CIRCUIT</b><p> +body 3.9 mm/JEDEC MS-012AA + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + +<b>MICROCONTROLLER</b><p> +1 Kbytes ROM + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +<b>Test Pins/Pads</b><p> +Cream on SMD OFF.<br> +new: Attribute TP_SIGNAL_NAME<br> +<author>Created by librarian@cadsoft.de</author> + + +<b>TEST PAD</b> + + + +>NAME +>VALUE +>TP_SIGNAL_NAME + + +<b>TEST PAD</b> + + + + +>NAME +>VALUE +>TP_SIGNAL_NAME + + +<b>TEST PAD</b> + + +>NAME +>VALUE +>TP_SIGNAL_NAME + + + +<b>TEST PAD</b> + + +>NAME +>VALUE +>TP_SIGNAL_NAME + + + +<b>TEST PAD</b> + + +>NAME +>VALUE +>TP_SIGNAL_NAME + + + +<b>TEST PAD</b> + + +>NAME +>VALUE +>TP_SIGNAL_NAME + + + +<b>TEST PAD</b> + + +>NAME +>VALUE +>TP_SIGNAL_NAME + + + +<b>TEST PAD</b> + + +>NAME +>VALUE +>TP_SIGNAL_NAME + + + +<b>TEST PAD</b> + +>NAME +>VALUE +>TP_SIGNAL_NAME + + +<b>TEST PAD</b> + +>NAME +>VALUE +>TP_SIGNAL_NAME + + +<b>TEST PAD</b> + +>NAME +>VALUE +>TP_SIGNAL_NAME + + +<b>TEST PAD</b> + +>NAME +>VALUE +>TP_SIGNAL_NAME + + +<b>TEST PAD</b> + +>NAME +>VALUE +>TP_SIGNAL_NAME + + +<b>TEST PAD</b> + +>NAME +>VALUE +>TP_SIGNAL_NAME + + +<b>TEST PAD</b> + +>NAME +>VALUE +>TP_SIGNAL_NAME + + +<b>TEST PAD</b> + +>NAME +>VALUE +>TP_SIGNAL_NAME + + +<b>TEST PAD</b> + +>NAME +>VALUE +>TP_SIGNAL_NAME + + +<b>TEST PAD</b> + +>NAME +>VALUE +>TP_SIGNAL_NAME + + +<b>TEST PAD</b> + +>NAME +>VALUE +>TP_SIGNAL_NAME + + +<b>TEST PAD</b> + +>NAME +>VALUE +>TP_SIGNAL_NAME + + +<b>TEST PAD</b> + +>NAME +>VALUE +>TP_SIGNAL_NAME + + +<b>TEST PAD</b> + +>NAME +>VALUE +>TP_SIGNAL_NAME + + +<b>TEST PAD</b> + +>NAME +>VALUE +>TP_SIGNAL_NAME + + +<b>TEST PAD</b> + +>NAME +>VALUE +>TP_SIGNAL_NAME + + +<b>TEST PAD</b> + +>NAME +>VALUE +>TP_SIGNAL_NAME + + +<b>TEST PAD</b> + +>NAME +>VALUE +>TP_SIGNAL_NAME + + +<b>TEST PAD</b> + +>NAME +>VALUE +>TP_SIGNAL_NAME + + +<b>TEST PAD</b> + +>NAME +>VALUE +>TP_SIGNAL_NAME + + +<b>TEST PAD</b> + +>NAME +>VALUE +>TP_SIGNAL_NAME + + +<b>TEST PAD</b> + +>NAME +>VALUE +>TP_SIGNAL_NAME + + +<b>TEST PAD</b> + +>NAME +>VALUE +>TP_SIGNAL_NAME + + +<b>TEST PAD</b> + +>NAME +>VALUE +>TP_SIGNAL_NAME + + +<b>TEST PAD</b> + +>NAME +>VALUE +>TP_SIGNAL_NAME + + +<b>TEST PAD</b> + +>NAME +>VALUE +>TP_SIGNAL_NAME + + +<b>TEST PAD</b> + +>NAME +>VALUE +>TP_SIGNAL_NAME + + +<b>TEST PAD</b> + +>NAME +>VALUE +>TP_SIGNAL_NAME + + +<b>TEST PAD</b> + +>NAME +>VALUE +>TP_SIGNAL_NAME + + +<b>TEST PAD</b> + +>NAME +>VALUE +>TP_SIGNAL_NAME + + + + + + + + +>NAME +>TP_SIGNAL_NAME + + + + + +<b>Test pad</b> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +<b>Resistors, Capacitors, Inductors</b><p> +Based on the previous libraries: +<ul> +<li>r.lbr +<li>cap.lbr +<li>cap-fe.lbr +<li>captant.lbr +<li>polcap.lbr +<li>ipc-smd.lbr +</ul> +All SMD packages are defined according to the IPC specifications and CECC<p> +<author>Created by librarian@cadsoft.de</author><p> +<p> +for Electrolyt Capacitors see also :<p> +www.bccomponents.com <p> +www.panasonic.com<p> +www.kemet.com<p> +<p> +for trimmer refence see : <u>www.electrospec-inc.com/cross_references/trimpotcrossref.asp</u><p> + +<map name="nav_main"> +<area shape="rect" coords="0,1,140,23" href="../military_specs.asp" title=""> +<area shape="rect" coords="0,24,140,51" href="../about.asp" title=""> +<area shape="rect" coords="1,52,140,77" href="../rfq.asp" title=""> +<area shape="rect" coords="0,78,139,103" href="../products.asp" title=""> +<area shape="rect" coords="1,102,138,128" href="../excess_inventory.asp" title=""> +<area shape="rect" coords="1,129,138,150" href="../edge.asp" title=""> +<area shape="rect" coords="1,151,139,178" href="../industry_links.asp" title=""> +<area shape="rect" coords="0,179,139,201" href="../comments.asp" title=""> +<area shape="rect" coords="1,203,138,231" href="../directory.asp" title=""> +<area shape="default" nohref> +</map> + +<html> + +<title></title> + + <LINK REL="StyleSheet" TYPE="text/css" HREF="style-sheet.css"> + +<body bgcolor="#ffffff" text="#000000" marginwidth="0" marginheight="0" topmargin="0" leftmargin="0"> +<table border=0 cellspacing=0 cellpadding=0 width="100%" cellpaddding=0 height="55%"> +<tr valign="top"> + +</td> +<! <td width="10">&nbsp;</td> +<td width="90%"> + +<b><font color="#0000FF" size="4">TRIM-POT CROSS REFERENCE</font></b> +<P> +<TABLE BORDER=0 CELLSPACING=1 CELLPADDING=2> + <TR> + <TD COLSPAN=8> + <FONT SIZE=3 FACE=ARIAL><B>RECTANGULAR MULTI-TURN</B></FONT> + </TD> + </TR> + <TR> + <TD ALIGN=CENTER> + <B> + <FONT SIZE=3 FACE=ARIAL color="#FF0000">BOURNS</FONT> + </B> + </TD> + <TD ALIGN=CENTER> + <B> + <FONT SIZE=3 FACE=ARIAL color="#FF0000">BI&nbsp;TECH</FONT> + </B> + </TD> + <TD ALIGN=CENTER> + <B> + <FONT SIZE=3 FACE=ARIAL color="#FF0000">DALE-VISHAY</FONT> + </B> + </TD> + <TD ALIGN=CENTER> + <B> + <FONT SIZE=3 FACE=ARIAL color="#FF0000">PHILIPS/MEPCO</FONT> + </B> + </TD> + <TD ALIGN=CENTER> + <B> + <FONT SIZE=3 FACE=ARIAL color="#FF0000">MURATA</FONT> + </B> + </TD> + <TD ALIGN=CENTER> + <B> + <FONT SIZE=3 FACE=ARIAL color="#FF0000">PANASONIC</FONT> + </B> + </TD> + <TD ALIGN=CENTER> + <B> + <FONT SIZE=3 FACE=ARIAL color="#FF0000">SPECTROL</FONT> + </B> + </TD> + <TD ALIGN=CENTER> + <B> + <FONT SIZE=3 FACE=ARIAL color="#FF0000">MILSPEC</FONT> + </B> + </TD><TD>&nbsp;</TD> + </TR> + <TR> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3 > + 3005P<BR> + 3006P<BR> + 3006W<BR> + 3006Y<BR> + 3009P<BR> + 3009W<BR> + 3009Y<BR> + 3057J<BR> + 3057L<BR> + 3057P<BR> + 3057Y<BR> + 3059J<BR> + 3059L<BR> + 3059P<BR> + 3059Y<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + 89P<BR> + 89W<BR> + 89X<BR> + 89PH<BR> + 76P<BR> + 89XH<BR> + 78SLT<BR> + 78L&nbsp;ALT<BR> + 56P&nbsp;ALT<BR> + 78P&nbsp;ALT<BR> + T8S<BR> + 78L<BR> + 56P<BR> + 78P<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + T18/784<BR> + 783<BR> + 781<BR> + -<BR> + -<BR> + -<BR> + 2199<BR> + 1697/1897<BR> + 1680/1880<BR> + 2187<BR> + -<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + 8035EKP/CT20/RJ-20P<BR> + -<BR> + RJ-20X<BR> + -<BR> + -<BR> + -<BR> + 1211L<BR> + 8012EKQ&nbsp;ALT<BR> + 8012EKR&nbsp;ALT<BR> + 1211P<BR> + 8012EKJ<BR> + 8012EKL<BR> + 8012EKQ<BR> + 8012EKR<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + 2101P<BR> + 2101W<BR> + 2101Y<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + 2102L<BR> + 2102S<BR> + 2102Y<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + EVMCOG<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + 43P<BR> + 43W<BR> + 43Y<BR> + -<BR> + -<BR> + -<BR> + -<BR> + 40L<BR> + 40P<BR> + 40Y<BR> + 70Y-T602<BR> + 70L<BR> + 70P<BR> + 70Y<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + RT/RTR12<BR> + RT/RTR12<BR> + RT/RTR12<BR> + -<BR> + RJ/RJR12<BR> + RJ/RJR12<BR> + RJ/RJR12<BR></FONT> + </TD> + </TR> + <TR> + <TD COLSPAN=8>&nbsp; + </TD> + </TR> + <TR> + <TD COLSPAN=8> + <FONT SIZE=4 FACE=ARIAL><B>SQUARE MULTI-TURN</B></FONT> + </TD> + </TR> + <TR> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>BOURN</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>BI&nbsp;TECH</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>DALE-VISHAY</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>PHILIPS/MEPCO</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>MURATA</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>PANASONIC</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>SPECTROL</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>MILSPEC</B></FONT> + </TD> + </TR> + <TR> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + 3250L<BR> + 3250P<BR> + 3250W<BR> + 3250X<BR> + 3252P<BR> + 3252W<BR> + 3252X<BR> + 3260P<BR> + 3260W<BR> + 3260X<BR> + 3262P<BR> + 3262W<BR> + 3262X<BR> + 3266P<BR> + 3266W<BR> + 3266X<BR> + 3290H<BR> + 3290P<BR> + 3290W<BR> + 3292P<BR> + 3292W<BR> + 3292X<BR> + 3296P<BR> + 3296W<BR> + 3296X<BR> + 3296Y<BR> + 3296Z<BR> + 3299P<BR> + 3299W<BR> + 3299X<BR> + 3299Y<BR> + 3299Z<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + 66P&nbsp;ALT<BR> + 66W&nbsp;ALT<BR> + 66X&nbsp;ALT<BR> + 66P&nbsp;ALT<BR> + 66W&nbsp;ALT<BR> + 66X&nbsp;ALT<BR> + -<BR> + 64W&nbsp;ALT<BR> + -<BR> + 64P&nbsp;ALT<BR> + 64W&nbsp;ALT<BR> + 64X&nbsp;ALT<BR> + 64P<BR> + 64W<BR> + 64X<BR> + 66X&nbsp;ALT<BR> + 66P&nbsp;ALT<BR> + 66W&nbsp;ALT<BR> + 66P<BR> + 66W<BR> + 66X<BR> + 67P<BR> + 67W<BR> + 67X<BR> + 67Y<BR> + 67Z<BR> + 68P<BR> + 68W<BR> + 68X<BR> + 67Y&nbsp;ALT<BR> + 67Z&nbsp;ALT<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + 5050<BR> + 5091<BR> + 5080<BR> + 5087<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + T63YB<BR> + T63XB<BR> + -<BR> + -<BR> + -<BR> + 5887<BR> + 5891<BR> + 5880<BR> + -<BR> + -<BR> + -<BR> + T93Z<BR> + T93YA<BR> + T93XA<BR> + T93YB<BR> + T93XB<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + 8026EKP<BR> + 8026EKW<BR> + 8026EKM<BR> + 8026EKP<BR> + 8026EKB<BR> + 8026EKM<BR> + 1309X<BR> + 1309P<BR> + 1309W<BR> + 8024EKP<BR> + 8024EKW<BR> + 8024EKN<BR> + RJ-9P/CT9P<BR> + RJ-9W<BR> + RJ-9X<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + 3103P<BR> + 3103Y<BR> + 3103Z<BR> + 3103P<BR> + 3103Y<BR> + 3103Z<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + 3105P/3106P<BR> + 3105W/3106W<BR> + 3105X/3106X<BR> + 3105Y/3106Y<BR> + 3105Z/3105Z<BR> + 3102P<BR> + 3102W<BR> + 3102X<BR> + 3102Y<BR> + 3102Z<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + EVMCBG<BR> + EVMCCG<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + 55-1-X<BR> + 55-4-X<BR> + 55-3-X<BR> + 55-2-X<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + 50-2-X<BR> + 50-4-X<BR> + 50-3-X<BR> + -<BR> + -<BR> + -<BR> + 64P<BR> + 64W<BR> + 64X<BR> + 64Y<BR> + 64Z<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + RT/RTR22<BR> + RT/RTR22<BR> + RT/RTR22<BR> + RT/RTR22<BR> + RJ/RJR22<BR> + RJ/RJR22<BR> + RJ/RJR22<BR> + RT/RTR26<BR> + RT/RTR26<BR> + RT/RTR26<BR> + RJ/RJR26<BR> + RJ/RJR26<BR> + RJ/RJR26<BR> + RJ/RJR26<BR> + RJ/RJR26<BR> + RJ/RJR26<BR> + RT/RTR24<BR> + RT/RTR24<BR> + RT/RTR24<BR> + RJ/RJR24<BR> + RJ/RJR24<BR> + RJ/RJR24<BR> + RJ/RJR24<BR> + RJ/RJR24<BR> + RJ/RJR24<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + </TR> + <TR> + <TD COLSPAN=8>&nbsp; + </TD> + </TR> + <TR> + <TD COLSPAN=8> + <FONT SIZE=4 FACE=ARIAL><B>SINGLE TURN</B></FONT> + </TD> + </TR> + <TR> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>BOURN</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>BI&nbsp;TECH</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>DALE-VISHAY</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>PHILIPS/MEPCO</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>MURATA</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>PANASONIC</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>SPECTROL</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>MILSPEC</B></FONT> + </TD> + </TR> + <TR> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + 3323P<BR> + 3323S<BR> + 3323W<BR> + 3329H<BR> + 3329P<BR> + 3329W<BR> + 3339H<BR> + 3339P<BR> + 3339W<BR> + 3352E<BR> + 3352H<BR> + 3352K<BR> + 3352P<BR> + 3352T<BR> + 3352V<BR> + 3352W<BR> + 3362H<BR> + 3362M<BR> + 3362P<BR> + 3362R<BR> + 3362S<BR> + 3362U<BR> + 3362W<BR> + 3362X<BR> + 3386B<BR> + 3386C<BR> + 3386F<BR> + 3386H<BR> + 3386K<BR> + 3386M<BR> + 3386P<BR> + 3386S<BR> + 3386W<BR> + 3386X<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + 25P<BR> + 25S<BR> + 25RX<BR> + 82P<BR> + 82M<BR> + 82PA<BR> + -<BR> + -<BR> + -<BR> + 91E<BR> + 91X<BR> + 91T<BR> + 91B<BR> + 91A<BR> + 91V<BR> + 91W<BR> + 25W<BR> + 25V<BR> + 25P<BR> + -<BR> + 25S<BR> + 25U<BR> + 25RX<BR> + 25X<BR> + 72XW<BR> + 72XL<BR> + 72PM<BR> + 72RX<BR> + -<BR> + 72PX<BR> + 72P<BR> + 72RXW<BR> + 72RXL<BR> + 72X<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + T7YB<BR> + T7YA<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + TXD<BR> + TYA<BR> + TYP<BR> + -<BR> + TYD<BR> + TX<BR> + -<BR> + 150SX<BR> + 100SX<BR> + 102T<BR> + 101S<BR> + 190T<BR> + 150TX<BR> + 101<BR> + -<BR> + -<BR> + 101SX<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + ET6P<BR> + ET6S<BR> + ET6X<BR> + RJ-6W/8014EMW<BR> + RJ-6P/8014EMP<BR> + RJ-6X/8014EMX<BR> + TM7W<BR> + TM7P<BR> + TM7X<BR> + -<BR> + 8017SMS<BR> + -<BR> + 8017SMB<BR> + 8017SMA<BR> + -<BR> + -<BR> + CT-6W<BR> + CT-6H<BR> + CT-6P<BR> + CT-6R<BR> + -<BR> + CT-6V<BR> + CT-6X<BR> + -<BR> + -<BR> + 8038EKV<BR> + -<BR> + 8038EKX<BR> + -<BR> + -<BR> + 8038EKP<BR> + 8038EKZ<BR> + 8038EKW<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + 3321H<BR> + 3321P<BR> + 3321N<BR> + 1102H<BR> + 1102P<BR> + 1102T<BR> + RVA0911V304A<BR> + -<BR> + RVA0911H413A<BR> + RVG0707V100A<BR> + RVA0607V(H)306A<BR> + RVA1214H213A<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + 3104B<BR> + 3104C<BR> + 3104F<BR> + 3104H<BR> + -<BR> + 3104M<BR> + 3104P<BR> + 3104S<BR> + 3104W<BR> + 3104X<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + EVMQ0G<BR> + EVMQIG<BR> + EVMQ3G<BR> + EVMS0G<BR> + EVMQ0G<BR> + EVMG0G<BR> + -<BR> + -<BR> + -<BR> + EVMK4GA00B<BR> + EVM30GA00B<BR> + EVMK0GA00B<BR> + EVM38GA00B<BR> + EVMB6<BR> + EVLQ0<BR> + -<BR> + EVMMSG<BR> + EVMMBG<BR> + EVMMAG<BR> + -<BR> + -<BR> + EVMMCS<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + EVMM1<BR> + -<BR> + -<BR> + EVMM0<BR> + -<BR> + -<BR> + EVMM3<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + 62-3-1<BR> + 62-1-2<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + 67R<BR> + -<BR> + 67P<BR> + -<BR> + -<BR> + -<BR> + -<BR> + 67X<BR> + 63V<BR> + 63S<BR> + 63M<BR> + -<BR> + -<BR> + 63H<BR> + 63P<BR> + -<BR> + -<BR> + 63X<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + RJ/RJR50<BR> + RJ/RJR50<BR> + RJ/RJR50<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + </TR> +</TABLE> +<P>&nbsp;<P> +<TABLE BORDER=0 CELLSPACING=1 CELLPADDING=3> + <TR> + <TD COLSPAN=7> + <FONT color="#0000FF" SIZE=4 FACE=ARIAL><B>SMD TRIM-POT CROSS REFERENCE</B></FONT> + <P> + <FONT SIZE=4 FACE=ARIAL><B>MULTI-TURN</B></FONT> + </TD> + </TR> + <TR> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>BOURNS</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>BI&nbsp;TECH</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>DALE-VISHAY</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>PHILIPS/MEPCO</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>PANASONIC</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>TOCOS</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>AUX/KYOCERA</B></FONT> + </TD> + </TR> + <TR> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + 3224G<BR> + 3224J<BR> + 3224W<BR> + 3269P<BR> + 3269W<BR> + 3269X<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + 44G<BR> + 44J<BR> + 44W<BR> + 84P<BR> + 84W<BR> + 84X<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + ST63Z<BR> + ST63Y<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + ST5P<BR> + ST5W<BR> + ST5X<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + </TR> + <TR> + <TD COLSPAN=7>&nbsp; + </TD> + </TR> + <TR> + <TD COLSPAN=7> + <FONT SIZE=4 FACE=ARIAL><B>SINGLE TURN</B></FONT> + </TD> + </TR> + <TR> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>BOURNS</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>BI&nbsp;TECH</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>DALE-VISHAY</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>PHILIPS/MEPCO</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>PANASONIC</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>TOCOS</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>AUX/KYOCERA</B></FONT> + </TD> + </TR> + <TR> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + 3314G<BR> + 3314J<BR> + 3364A/B<BR> + 3364C/D<BR> + 3364W/X<BR> + 3313G<BR> + 3313J<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + 23B<BR> + 23A<BR> + 21X<BR> + 21W<BR> + -<BR> + 22B<BR> + 22A<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + ST5YL/ST53YL<BR> + ST5YJ/5T53YJ<BR> + ST-23A<BR> + ST-22B<BR> + ST-22<BR> + -<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + ST-4B<BR> + ST-4A<BR> + -<BR> + -<BR> + -<BR> + ST-3B<BR> + ST-3A<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + EVM-6YS<BR> + EVM-1E<BR> + EVM-1G<BR> + EVM-1D<BR> + -<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + G4B<BR> + G4A<BR> + TR04-3S1<BR> + TRG04-2S1<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + DVR-43A<BR> + CVR-42C<BR> + CVR-42A/C<BR> + -<BR> + -<BR></FONT> + </TD> + </TR> +</TABLE> +<P> +<FONT SIZE=4 FACE=ARIAL><B>ALT =&nbsp;ALTERNATE</B></FONT> +<P> + +&nbsp; +<P> +</td> +</tr> +</table> +</BODY></HTML> + + +<b>CAPACITOR</b><p> +chip + + + + + + + + +>NAME +>VALUE + + + + + +<b>CAPACITOR</b><p> +chip + + + + + + + + +>NAME +>VALUE + + + + + +<b>CAPACITOR</b><p> +chip + + + + + + + + +>NAME +>VALUE + + + + + +<b>CAPACITOR</b><p> +chip + + + + + + + + +>NAME +>VALUE + + + + + +<b>CAPACITOR</b><p> +chip + + + + + + + + +>NAME +>VALUE + + + + + +<b>CAPACITOR</b><p> +chip + + + + + + + + +>NAME +>VALUE + + + + + +<b>CAPACITOR</b><p> +chip + + + + + + + + +>NAME +>VALUE + + + + + +<b>CAPACITOR</b><p> +chip + + + + + + + + +>NAME +>VALUE + + + + + +<b>CAPACITOR</b><p> +chip + + + + + + + + +>NAME +>VALUE + + + + + +<b>CAPACITOR</b><p> +chip + + + + + + + + +>NAME +>VALUE + + + + + +<b>CAPACITOR</b><p> +chip + + + + + + + + +>NAME +>VALUE + + + + + +<b>CAPACITOR</b><p> +chip + + + + + + + + +>NAME +>VALUE + + + + + +<b>CAPACITOR</b><p> +chip + + + + + + + + +>NAME +>VALUE + + + + + +<b>CAPACITOR</b><p> +chip + + + + + + + + +>NAME +>VALUE + + + + + +<b>CAPACITOR</b><p> +chip + + + + + + + + +>NAME +>VALUE + + + + + +<b>CAPACITOR</b><p> +chip + + + + + + + + +>NAME +>VALUE + + + + + +<b>CAPACITOR</b><p> +grid 2.5 mm, outline 2.4 x 4.4 mm + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 2.5 mm, outline 2.5 x 5 mm + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 2.5 mm, outline 3 x 5 mm + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 2.5 mm, outline 4 x 5 mm + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 2.5 mm, outline 5 x 5 mm + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 2.5 mm, outline 6 x 5 mm + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 2.5 mm + 5 mm, outline 2.4 x 7 mm + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 2.5 + 5 mm, outline 2.5 x 7.5 mm + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 2.5 + 5 mm, outline 3.5 x 7.5 mm + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 2.5 + 5 mm, outline 4.5 x 7.5 mm + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 2.5 + 5 mm, outline 5.5 x 7.5 mm + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 5 mm, outline 2.4 x 4.4 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + +<b>CAPACITOR</b><p> +grid 5 mm, outline 2.5 x 7.5 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 5 mm, outline 4.5 x 7.5 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 5 mm, outline 3 x 7.5 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 5 mm, outline 5 x 7.5 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 5 mm, outline 5.5 x 7.5 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 5 mm, outline 7.5 x 7.5 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +Horizontal, grid 5 mm, outline 7.5 x 7.5 mm + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + +<b>CAPACITOR</b><p> +grid 7.5 mm, outline 3.2 x 10.3 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 7.5 mm, outline 4.2 x 10.3 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 7.5 mm, outline 5.2 x 10.6 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 10.2 mm, outline 4.3 x 13.3 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 10.2 mm, outline 5.4 x 13.3 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 10.2 mm, outline 6.4 x 13.3 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 10.2 mm + 15.2 mm, outline 6.2 x 18.4 mm + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 15 mm, outline 5.4 x 18.3 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 15 mm, outline 6.4 x 18.3 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 15 mm, outline 7.2 x 18.3 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 15 mm, outline 8.4 x 18.3 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 15 mm, outline 9.1 x 18.2 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 22.5 mm, outline 6.2 x 26.8 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 22.5 mm, outline 7.4 x 26.8 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 22.5 mm, outline 8.7 x 26.8 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 22.5 mm, outline 10.8 x 26.8 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 22.5 mm, outline 11.3 x 26.8 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 27.5 mm, outline 9.3 x 31.6 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 27.5 mm, outline 11.3 x 31.6 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 27.5 mm, outline 13.4 x 31.6 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 27.5 mm, outline 20.5 x 31.6 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 32.5 mm, outline 13.7 x 37.4 mm + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 32.5 mm, outline 16.2 x 37.4 mm + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 32.5 mm, outline 18.2 x 37.4 mm + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 37.5 mm, outline 19.2 x 41.8 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 37.5 mm, outline 20.3 x 41.8 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 5 mm, outline 3.5 x 7.5 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 37.5 mm, outline 15.5 x 41.8 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 7.5 mm, outline 6.3 x 10.6 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 27.5 mm, outline 15.4 x 31.6 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 27.5 mm, outline 17.3 x 31.6 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>Ceramic Chip Capacitor KEMET 0204 Reflow solder</b><p> +Metric Code Size 1005 + + + + +>NAME +>VALUE + + + + +<b>Ceramic Chip Capacitor KEMET 0603 Reflow solder</b><p> +Metric Code Size 1608 + + + + +>NAME +>VALUE + + + + +<b>Ceramic Chip Capacitor KEMET 0805 Reflow solder</b><p> +Metric Code Size 2012 + + + + +>NAME +>VALUE + + + + +<b>Ceramic Chip Capacitor KEMET 1206 Reflow solder</b><p> +Metric Code Size 3216 + + + + +>NAME +>VALUE + + + + +<b>Ceramic Chip Capacitor KEMET 1210 Reflow solder</b><p> +Metric Code Size 3225 + + + + +>NAME +>VALUE + + + + +<b>Ceramic Chip Capacitor KEMET 1812 Reflow solder</b><p> +Metric Code Size 4532 + + + + +>NAME +>VALUE + + + + +<b>Ceramic Chip Capacitor KEMET 1825 Reflow solder</b><p> +Metric Code Size 4564 + + + + +>NAME +>VALUE + + + + +<b>Ceramic Chip Capacitor KEMET 2220 Reflow solder</b><p> +Metric Code Size 5650 + + + + +>NAME +>VALUE + + + + +<b>Ceramic Chip Capacitor KEMET 2225 Reflow solder</b><p> +Metric Code Size 5664 + + + + +>NAME +>VALUE + + + + + + + + +>NAME +>VALUE + + + + + + + + +<B>CAPACITOR</B>, European symbol + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Makefile.am b/src/Makefile.am index 94c3f6c..40271e5 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -52,7 +52,8 @@ SUBDIRS += \ eurosignal \ tv \ radio \ - zeitansage + zeitansage \ + sim if HAVE_SDR if HAVE_FUSE diff --git a/src/libdebug/debug.c b/src/libdebug/debug.c index 5d2db98..89e0c16 100644 --- a/src/libdebug/debug.c +++ b/src/libdebug/debug.c @@ -71,6 +71,10 @@ struct debug_cat { { "device", "\033[0;33m" }, { "datenklo", "\033[1;34m" }, { "zeit", "\033[1;34m" }, + { "sim layer 1", "\033[0;31m" }, + { "sim layer 2", "\033[0;33m" }, + { "sim ICL layer", "\033[0;36m" }, + { "sim layer 7", "\033[0;37m" }, { NULL, NULL } }; diff --git a/src/libdebug/debug.h b/src/libdebug/debug.h index 1f74946..33b188f 100644 --- a/src/libdebug/debug.h +++ b/src/libdebug/debug.h @@ -34,6 +34,10 @@ #define DDEVICE 27 #define DDATENKLO 28 #define DZEIT 29 +#define DSIM1 30 +#define DSIM2 31 +#define DSIMI 32 +#define DSIM7 33 void get_win_size(int *w, int *h); diff --git a/src/sim/Makefile.am b/src/sim/Makefile.am new file mode 100644 index 0000000..7d8d402 --- /dev/null +++ b/src/sim/Makefile.am @@ -0,0 +1,18 @@ +AM_CPPFLAGS = -Wall -Wextra -g $(all_includes) + +bin_PROGRAMS = \ + cnetz_sim + +cnetz_sim_SOURCES = \ + sim.c \ + sniffer.c \ + image.c \ + main.c + +cnetz_sim_LDADD = \ + $(COMMON_LA) \ + $(top_builddir)/src/libdebug/libdebug.a \ + $(top_builddir)/src/liboptions/liboptions.a \ + $(top_builddir)/src/libserial/libserial.a \ + -lm + diff --git a/src/sim/eeprom.h b/src/sim/eeprom.h new file mode 100644 index 0000000..b4c8637 --- /dev/null +++ b/src/sim/eeprom.h @@ -0,0 +1,33 @@ + +enum eeprom_locations { + EEPROM_MAGIC = 0x00, + EEPROM_FUTLN_H = 0x02, + EEPROM_FUTLN_M = 0x0a, + EEPROM_FUTLN_L = 0x12, + EEPROM_SICH_H = 0x1a, + EEPROM_SICH_L = 0x22, + EEPROM_SONDER_H = 0x2a, + EEPROM_SONDER_L = 0x32, + EEPROM_WARTUNG_H = 0x3a, + EEPROM_WARTUNG_L = 0x42, + EEPROM_GEBZ_H = 0x4a, + EEPROM_GEBZ_M = 0x4b, + EEPROM_GEBZ_L = 0x4c, + EEPROM_FLAGS = 0x4d, + EEPROM_PIN_DATA = 0x50, + EEPROM_AUTH_DATA = 0x58, + EEPROM_RUFN = 0x60, +}; + +#define EEPROM_VERSION 1 /* version eeprom layout */ + +#define EEPROM_FLAG_PIN_LEN 0 /* pin length */ +#define EEPROM_FLAG_PIN_TRY 4 /* pin retires left */ +#define EEPROM_FLAG_GEBZ 6 /* metering locked */ +#define EEPROM_FLAG_APP 7 /* application locked */ + +uint8_t eeprom_read(enum eeprom_locations loc); +void eeprom_write(enum eeprom_locations loc, uint8_t value); +uint8_t *eeprom_memory(void); +size_t eeprom_length(); + diff --git a/src/sim/image.c b/src/sim/image.c new file mode 100644 index 0000000..92060c4 --- /dev/null +++ b/src/sim/image.c @@ -0,0 +1,97 @@ +#ifndef ARDUINO + +#include +#include +#include "../libmobile/image.h" + +const char *image[] = { + "@w", + " ()", + " // _______________________________________________", + " // / \\", + " @WC-NETZ SIM@w // | |", + " __________//_ | @WJ o l l y ' s@w |", + " / o o /| | |", + " /__________ / | | @Y _ __ _ @w |", + " //_________// / | @bVCC@Y (_)__(_) @bGND@w |", + " /@B_@g()@B_/ /_@r()@B_@w/ / | @bRES@Y (_)__(_) @w |", + " /@B_@W1@B_/_@W2@B_/_@W3@B_@w/ / | @bCLK@Y (_)__(_) @bI/O@w |", + " /@B_@W4@B_/_@W5@B_/_@W6@B_@w/ / | |", + " /@B_@W7@B_/_@W8@B_/_@W9@B_@w/ / | |", + " /@B_@W*@B_/_@W0@B_/_@W#@B_@w/ / | @y/|_____@w |", + " /___________/ / | @y/ @w @WT e l e K a r t e@w |", + " | _ _ | / | @y\\ _____@w |", + " |____________|/ | @y\\| @w |", + " \\_______________________________________________/", + + "", + NULL +}; + +void print_image(void) +{ + int i, j; + + for (i = 0; image[i]; i++) { + for (j = 0; j < (int)strlen(image[i]); j++) { + if (image[i][j] == '@') { + j++; + switch(image[i][j]) { + case 'k': /* black */ + printf("\033[0;30m"); + break; + case 'r': /* red */ + printf("\033[0;31m"); + break; + case 'g': /* green */ + printf("\033[0;32m"); + break; + case 'y': /* yellow */ + printf("\033[0;33m"); + break; + case 'b': /* blue */ + printf("\033[0;34m"); + break; + case 'm': /* magenta */ + printf("\033[0;35m"); + break; + case 'c': /* cyan */ + printf("\033[0;36m"); + break; + case 'w': /* white */ + printf("\033[0;37m"); + break; + case 'K': /* bright black */ + printf("\033[1;30m"); + break; + case 'R': /* bright red */ + printf("\033[1;31m"); + break; + case 'G': /* bright green */ + printf("\033[1;32m"); + break; + case 'Y': /* bright yellow */ + printf("\033[1;33m"); + break; + case 'B': /* bright blue */ + printf("\033[1;34m"); + break; + case 'M': /* bright magenta */ + printf("\033[1;35m"); + break; + case 'C': /* bright cyan */ + printf("\033[1;36m"); + break; + case 'W': /* bright white */ + printf("\033[1;37m"); + break; + } + } else + printf("%c", image[i][j]); + } + printf("\n"); + } + printf("\033[0;39m"); +} + +#endif /* ARDUINO */ diff --git a/src/sim/main.c b/src/sim/main.c new file mode 100644 index 0000000..fdc352a --- /dev/null +++ b/src/sim/main.c @@ -0,0 +1,489 @@ +/* main function + * + * (C) 2020 by Andreas Eversberg + * All Rights Reserved + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef ARDUINO + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "../libdebug/debug.h" +#include "../liboptions/options.h" +#include "../libserial/serial.h" +#include "../libmobile/image.h" +#include "sim.h" +#include "sniffer.h" +#include "eeprom.h" + +int num_kanal = 1; +sim_sniffer_t sim_sniffer; +sim_sim_t sim_sim; +static int quit = 0; +static const char *serialdev = "/dev/ttyUSB0"; +static int baudrate = 9600; + +static const char *eeprom_name = NULL; +static const char *futln = NULL; +static const char *sicherung = NULL; +static const char *karten = NULL; +static const char *sonder = NULL; +static const char *wartung = NULL; +static const char *pin = NULL; +#define MAX_DIR_COUNT 64 +static int dir_count = 0; +static int dir_location[MAX_DIR_COUNT]; +static const char *dir_number[MAX_DIR_COUNT]; +static const char *dir_name[MAX_DIR_COUNT]; +static const char *auth = NULL; + +#define TIMEOUT 0.2 + +void print_help(const char *arg0) +{ + printf("Usage: %s [options] \n", arg0); + /* - - */ + printf("General options:\n"); + printf(" -h --help\n"); + printf(" This help\n"); + printf(" -v --verbose | ,[,[,...]] | list\n"); + printf(" Use 'list' to get a list of all levels and categories\n"); + printf(" Verbose level: digit of debug level (default = '%d')\n", debuglevel); + printf(" Verbose level+category: level digit followed by one or more categories\n"); + printf(" -> If no category is specified, all categories are selected\n"); + printf(" -s --serial-device \n"); + printf(" Serial device (default = '%s')\n", serialdev); + printf(" -b --baud-rate \n"); + printf(" Serial baud rate (default = %d)\n", baudrate); + printf("\nSIM card simulator options:\n"); + printf(" -E --eeprom \n"); + printf(" Stores and reads EEPROM data to/from file. The file is stored at\n"); + printf(" \"~/osmocom/analog/sim_.eeprom\". If the file dos not exit yet,\n"); + printf(" the default values are used. Values are always overwritten with card\n"); + printf(" data, if defined.\n"); + printf(" -F --futln \n"); + printf(" Give 7 digits subsriber ID (default = '%s')\n", FUTLN_DEFAULT); + printf(" --sicherung \n"); + printf(" Card's security code for simple authentication (default = '%s')\n", SICHERUNG_DEFAULT); + printf(" --kartenkennung \n"); + printf(" Card's ID. Not relevant! (default = '%s')\n", KARTEN_DEFAULT); + printf(" --sonder \n"); + printf(" Special codes are used for service cards (default = '%s')\n", SONDER_DEFAULT); + printf(" --wartung \n"); + printf(" May define features of service cards (default = '%s')\n", WARTUNG_DEFAULT); + printf(" -P --pin | 0000\n"); + printf(" Give 4 .. 8 digits of pin. Use '0000' to disable. (default = '%s')\n", PIN_DEFAULT); + printf(" This will also reset the PIN error counter and unlocks the card.\n"); + printf(" -D --directory [--directory ...]\n"); + printf(" Give storage location '01' .. '%02d'. To erase give \"\" as number\n", directory_size() - 1); + printf(" and name. This option can be given multiple times for more entries.\n"); + printf(" -A --authenticate 0x...\n"); + printf(" Give 64 Bit value for authentication response. (default = all bits 1)\n"); + printf("\nCommands are:\n"); + printf(" sniff - To passively sniff ATR and message\n"); + printf(" sim - To simulate a SIM card\n"); +} + +#define OPT_SICHERUNG 256 +#define OPT_KARTEN 257 +#define OPT_SONDER 258 +#define OPT_WARTUNG 259 + +void add_options(void) +{ + option_add('h', "help", 0); + option_add('v', "debug", 1); + option_add('s', "serial-device", 1); + option_add('b', "baud-rate", 1); + option_add('E', "eeprom", 1); + option_add('F', "futln", 1); + option_add(OPT_SICHERUNG, "sicherung", 1); + option_add(OPT_KARTEN, "kartenkennung", 1); + option_add(OPT_SONDER, "sonder", 1); + option_add(OPT_WARTUNG, "wartung", 1); + option_add('P', "pin", 1); + option_add('D', "directory", 3); + option_add('A', "auth", 1); +}; + +int handle_options(int short_option, int argi, char **argv) +{ + int rc; + + switch (short_option) { + case 'h': + print_help(argv[0]); + return 0; + case 'v': + if (!strcasecmp(argv[argi], "list")) { + debug_list_cat(); + return 0; + } + rc = parse_debug_opt(argv[argi]); + if (rc < 0) { + fprintf(stderr, "Failed to parse debug option, please use -h for help.\n"); + return rc; + } + break; + case 's': + serialdev = strdup(argv[argi]); + break; + case 'b': + baudrate = atoi(argv[argi]); + break; + case 'E': + eeprom_name = strdup(argv[argi]); + break; + case 'F': + futln = strdup(argv[argi]); + break; + case OPT_SICHERUNG: + sicherung = strdup(argv[argi]); + break; + case OPT_KARTEN: + karten = strdup(argv[argi]); + break; + case OPT_SONDER: + sonder = strdup(argv[argi]); + break; + case OPT_WARTUNG: + wartung = strdup(argv[argi]); + break; + case 'P': + pin = strdup(argv[argi]); + break; + case 'D': + if (dir_count == MAX_DIR_COUNT) + break; + dir_location[dir_count] = atoi(argv[argi + 0]); + dir_number[dir_count] = strdup(argv[argi + 1]); + dir_name[dir_count] = strdup(argv[argi + 2]); + dir_count++; + break; + case 'A': + auth = strdup(argv[argi]); + break; + default: + return -EINVAL; + } + + return 1; +} + +/* EERPOM emulation */ + +static uint8_t eeprom[2048]; + +uint8_t eeprom_read(enum eeprom_locations loc) +{ + if (loc >= sizeof(eeprom)) + abort(); + + return eeprom[loc]; +} + +void eeprom_write(enum eeprom_locations loc, uint8_t value) +{ + if (loc >= sizeof(eeprom)) + abort(); + + eeprom[loc] = value; +} + +uint8_t *eeprom_memory(void) +{ + return eeprom; +} + +size_t eeprom_length(void) +{ + return sizeof(eeprom); +} + +/* main loop for interfacing serial with sim / sniffer */ + +int main_loop(serial_t *serial, int sniffer) +{ + int rc, cts, last_cts = 0; + uint8_t byte; + int skip_bytes = 0; + int work = 0; + + struct timeval tv; + double now, timer = 0; + + quit = 0; + + while (!quit) { + gettimeofday(&tv, NULL); + now = (double)tv.tv_usec * 0.000001 + tv.tv_sec; + + /* only check CTS when no work was done + * this is because USB query may take some time + * and we don't want to block transfer + */ + if (!work) { + cts = serial_cts(serial); + /* initally AND when CTS becomes 1 (pulled to low by reset line) */ + if (last_cts != cts) { + if (sniffer == 1) + sniffer_reset(&sim_sniffer); + else + sim_reset(&sim_sim, cts); + timer = 0; + } + last_cts = cts; + } + work = 0; + + if (sniffer == 0) { + rc = sim_tx(&sim_sim); + if (rc >= 0) { + byte = rc; + serial_write(serial, &byte, 1); + work = 1; + skip_bytes++; + } + } + + rc = serial_read(serial, &byte, 1); + if (rc > 0) + work = 1; + /* ignore while reset is low */ + if (cts) + continue; + if (rc == 1) { + timer = now; + /* count length, to remove echo from transmission */ + if (!skip_bytes) { + if (sniffer == 1) + sniffer_rx(&sim_sniffer, byte); + else + sim_rx(&sim_sim, byte); + } else { + /* done eliminating TX data, so we reset timer */ + if (--skip_bytes == 0) + timer = 0; + } + } else { + rc = -1; + if (timer && now - timer > 12.0 * 5.0 / (double)baudrate) { + if (sniffer == 1) + sniffer_timeout(&sim_sniffer); + else + sim_timeout(&sim_sim); + timer = 0; + skip_bytes = 0; + } + } + + if (!work) { + /* sleep some time if nothing was received */ + usleep(100); + } + } + + return quit; +} + +void sighandler(int sigset) +{ + if (sigset == SIGHUP) + return; + if (sigset == SIGPIPE) + return; + + printf("Signal received: %d\n", sigset); + + quit = -1; +} + +int main(int argc, char *argv[]) +{ + const char *home; + char eeprom_file[128]; + FILE *fp; + serial_t *serial = NULL; + uint8_t ebdt_data[9]; + int rc, argi; + int sniffer = 0; + int i; + + debuglevel = DEBUG_INFO; + + add_options(); + rc = options_config_file("~/.osmocom/analog/simsim.conf", handle_options); + if (rc < 0) + return 0; + + rc = sim_init_eeprom(); + if (rc < 0) + return rc; + + /* parse command line */ + argi = options_command_line(argc, argv, handle_options); + if (argi <= 0) + return argi; + + /* read from eeprom file, if defined and exists */ + if (eeprom_name) { + /* open config file */ + home = getenv("HOME"); + if (home == NULL) + return 1; + sprintf(eeprom_file, "%s/.osmocom/analog/sim_%s.eeprom", home, eeprom_name); + + fp = fopen(eeprom_file, "r"); + if (fp) { + rc = fread(eeprom_memory(), eeprom_length(), 1, fp); + fclose(fp); + } else + PDEBUG(DOPTIONS, DEBUG_INFO, "EEPROM file '%s' does not exist yet.\n", eeprom_file); + + } + + /* check version */ + if (eeprom_read(EEPROM_MAGIC + 0) != 'C' || eeprom_read(EEPROM_MAGIC + 1) != '0' + EEPROM_VERSION) { + PDEBUG(DOPTIONS, DEBUG_ERROR, "EEPROM file '%s' is not compatible with this version of program, please remove it!\n", eeprom_file); + return 1; + } + + /* apply config to eeprom, if defined */ + ebdt_data[0] = eeprom_read(EEPROM_FUTLN_H); + ebdt_data[1] = eeprom_read(EEPROM_FUTLN_M); + ebdt_data[2] = eeprom_read(EEPROM_FUTLN_L); + ebdt_data[3] = eeprom_read(EEPROM_SICH_H); + ebdt_data[4] = eeprom_read(EEPROM_SICH_L); + ebdt_data[5] = eeprom_read(EEPROM_SONDER_H); + ebdt_data[6] = eeprom_read(EEPROM_SONDER_L); + ebdt_data[7] = eeprom_read(EEPROM_WARTUNG_H); + ebdt_data[8] = eeprom_read(EEPROM_WARTUNG_L); + rc = encode_ebdt(ebdt_data, futln, sicherung, karten, sonder, wartung); + if (rc < 0) + return 0; + eeprom_write(EEPROM_FUTLN_H, ebdt_data[0]); + eeprom_write(EEPROM_FUTLN_M, ebdt_data[1]); + eeprom_write(EEPROM_FUTLN_L, ebdt_data[2]); + eeprom_write(EEPROM_SICH_H, ebdt_data[3]); + eeprom_write(EEPROM_SICH_L, ebdt_data[4]); + eeprom_write(EEPROM_SONDER_H, ebdt_data[5]); + eeprom_write(EEPROM_SONDER_L, ebdt_data[6]); + eeprom_write(EEPROM_WARTUNG_H, ebdt_data[7]); + eeprom_write(EEPROM_WARTUNG_L, ebdt_data[8]); + if (pin) { + if (strlen(pin) < 4 || strlen(pin) > 8) { + PDEBUG(DSIM7, DEBUG_NOTICE, "Given PIN '%s' has invalid length. (Must be 4 .. 8)\n", pin); + return 0; + } + eeprom_write(EEPROM_FLAGS, (strlen(pin) << EEPROM_FLAG_PIN_LEN) | (MAX_PIN_TRY << EEPROM_FLAG_PIN_TRY)); + for (i = 0; i < (int)strlen(pin); i++) + eeprom_write(EEPROM_PIN_DATA + i, pin[i]); + } + for (i = 0; i < dir_count; i++) { + uint8_t data[24]; + rc = encode_directory(data, dir_number[i], dir_name[i]); + if (rc < 0) + return 0; + rc = save_directory(dir_location[i], data); + if (rc < 0) + return 0; + } + if (auth) { + uint64_t value = strtoull(auth, NULL, 0); + for (i = 0; i < 8; i++) + eeprom_write(EEPROM_AUTH_DATA, value >> (8 * (7 - i))); + } + + if (argi >= argc) { + fprintf(stderr, "Expecting command, use '-h' for help!\n"); + return 0; + } else if (!strcmp(argv[argi], "sniff")) { + sniffer = 1; + } else if (!strcmp(argv[argi], "sim")) { + sniffer = 0; + } else { + fprintf(stderr, "Unknown command '%s', use '-h' for help!\n", argv[argi]); + return -EINVAL; + } + + /* open serial device */ + serial = serial_open(serialdev, baudrate, 8, 'e', 2, 'd', 'd', 0, 1.0, 0.0); + if (!serial) { + printf("Serial failed: %s\n", serial_errnostr); + goto error; + } + + if (sniffer == 1) + printf("SIM analyzer ready, please start the phone!\n"); + else { + char temp[5][16]; + print_image(); + decode_ebdt(ebdt_data, temp[0], temp[1], temp[2], temp[3], temp[4]); + printf("FUTLN=%s, Sicherungscode=%s, Kartekennung=%s, Sonderheitenschluessel=%s, Wartungsschluessel=%s\n", temp[0], temp[1], temp[2], temp[3], temp[4]); + printf("Telephone directory has %d entries.\n", directory_size() - 1); + for (i = 0; i < directory_size() - 1; i++) { + uint8_t data[24]; + char number[32], name[32]; + load_directory(i + 1, data); + decode_directory(data, number, name); + if (number[0]) + printf(" -> %02d %16s %s\n", i + 1, number, name); + } + printf("SIM emulator ready, please start the phone!\n"); + } + + /* catch signals */ + signal(SIGINT, sighandler); + signal(SIGHUP, sighandler); + signal(SIGTERM, sighandler); + signal(SIGPIPE, sighandler); + + /* run main loop until terminated by user */ + main_loop(serial, sniffer); + + /* reset signals */ + signal(SIGINT, SIG_DFL); + signal(SIGHUP, SIG_DFL); + signal(SIGTERM, SIG_DFL); + signal(SIGPIPE, SIG_DFL); + + /* write to eeprom file, if defined */ + if (eeprom_name) { + fp = fopen(eeprom_file, "w"); + if (fp) { + fwrite(eeprom_memory(), eeprom_length(), 1, fp); + fclose(fp); + PDEBUG(DOPTIONS, DEBUG_INFO, "EEPROM file '%s' written.\n", eeprom_file); + } else + PDEBUG(DOPTIONS, DEBUG_INFO, "EEPROM file '%s' cannot be written. (errno = %d)\n", eeprom_file, errno); + } + +error: + if (serial) + serial_close(serial); + + return 0; +} + +#endif /* ARDUINO */ diff --git a/src/sim/sim.c b/src/sim/sim.c new file mode 100644 index 0000000..fba9417 --- /dev/null +++ b/src/sim/sim.c @@ -0,0 +1,1438 @@ +/* SIM card emulator + * + * (C) 2020 by Andreas Eversberg + * All Rights Reserved + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include +#include +#include +#include +#include +#ifndef ARDUINO +#include "../libdebug/debug.h" +#endif +#include "sim.h" +#include "eeprom.h" + +#ifdef ARDUINO +#define PDEBUG(cat, level, fmt, arg...) while(0) +#define EINVAL 22 +static uint32_t my_strtoul(const char *nptr, char **endptr, int base) +{ + uint32_t number = 0; + + while (*nptr >= '0' && *nptr <= '9') + number = number * 10 + (*nptr++ - '0'); + + return number; +} +#else +#define my_strtoul strtoul +#endif + +static void my_ultostr(char *nptr, uint32_t value, int zeros) +{ + int digits = 0; + uint32_t temp; + + /* count digits */ + temp = value; + while (temp) { + temp /= 10; + digits++; + } + + /* minium digits to fill up with '0' */ + if (digits < zeros) + digits = zeros; + + /* go to end and terminate */ + nptr += digits; + *nptr-- = '\0'; + + /* apply digits backwards */ + while (digits--) { + *nptr-- = (value % 10) + '0'; + value /= 10; + } +} + +static void tx_sdu(sim_sim_t *sim, uint8_t ccrc, uint8_t *data, int length); +static void tx_pdu(sim_sim_t *sim, uint8_t *data, int length); +static void tx_block(sim_sim_t *sim, enum l2_cmd cmd, uint8_t *data, int length); + +/* read flags from eeprom */ +static void read_flags(sim_sim_t *sim) +{ + uint8_t flags; + + flags = eeprom_read(EEPROM_FLAGS); + sim->pin_len = (flags >> EEPROM_FLAG_PIN_LEN) & 0xf; + sim->pin_try = (flags >> EEPROM_FLAG_PIN_TRY) & 0x3; + if ((flags >> EEPROM_FLAG_GEBZ) & 0x1) + sim->gebz_locked = 1; + if ((flags >> EEPROM_FLAG_APP) & 0x1) + sim->app_locked = 1; +} + +/* write flags to eeprom */ +static void write_flags(sim_sim_t *sim) +{ + uint8_t flags = 0; + + flags |= sim->pin_len << EEPROM_FLAG_PIN_LEN; + flags |= sim->pin_try << EEPROM_FLAG_PIN_TRY; + if (sim->gebz_locked) + flags |= (1 << EEPROM_FLAG_GEBZ); + if (sim->app_locked) + flags |= (1 << EEPROM_FLAG_APP); + eeprom_write(EEPROM_FLAGS, flags); +} + +/* encode EBDT from strings */ +int encode_ebdt(uint8_t *data, const char *futln, const char *sicherung, const char *karten, const char *sonder, const char *wartung) +{ + uint32_t temp; + int i; + + if (futln) { + temp = strlen(futln); + if (temp < 7 || temp > 8) { + PDEBUG(DSIM7, DEBUG_NOTICE, "Given FUTLN '%s' invalid length. (Must be 7 or 8 Digits)\n", futln); + return -EINVAL; + } + if (futln[0] < '0' || futln[0] > '7') { + PDEBUG(DSIM7, DEBUG_NOTICE, "Given FUTLN '%s' has invalid first digit. (Must be '0' .. '7')\n", futln); + return -EINVAL; + } + data[0] = (futln[0] - '0') << 5; + futln++; + if (temp == 8) { + /* 8 digits */ + temp = (futln[0] - '0') * 10 + (futln[1] - '0'); + if (futln[0] < '0' || futln[0] > '9' || futln[1] < '0' || futln[1] > '9' || temp > 31) { + PDEBUG(DSIM7, DEBUG_NOTICE, "Given FUTLN '%s' has invalid second and third digit. (Must be '00' .. '31')\n", futln); + return -EINVAL; + } + data[0] |= temp; + futln += 2; + } else { + /* 7 digits */ + if (futln[0] < '0' || futln[0] > '9') { + PDEBUG(DSIM7, DEBUG_NOTICE, "Given FUTLN '%s' has invalid second digit. (Must be '0' .. '9')\n", futln); + return -EINVAL; + } + data[0] |= (futln[0] - '0'); + futln++; + } + for (i = 0; i < 5; i++) { + if (futln[i] < '0' || futln[i] > '9') + break; + } + temp = my_strtoul(futln, NULL, 0); + if (i < 5 || temp > 65535) { + PDEBUG(DSIM7, DEBUG_NOTICE, "Given FUTLN '%s' has invalid last digits. (Must be '00000' .. '65535')\n", futln); + return -EINVAL; + } + data[1] = temp >> 8; + data[2] = temp; + } + + if (sicherung) { + temp = my_strtoul(sicherung, NULL, 0); + if (temp > 65535) { + PDEBUG(DSIM7, DEBUG_NOTICE, "Given security code '%s' has invalid digits. (Must be '0' .. '65535')\n", sicherung); + return -EINVAL; + } + data[3] = temp >> 8; + data[4] = temp; + } + + if (karten) { + temp = my_strtoul(karten, NULL, 0); + if (temp > 7) { + PDEBUG(DSIM7, DEBUG_NOTICE, "Given card number '%s' has invalid digit. (Must be '0' .. '7')\n", karten); + return -EINVAL; + } + data[5] = (data[5] & 0x1f) | ((karten[0] - '0') << 5); + } + + if (sonder) { + temp = my_strtoul(sonder, NULL, 0); + if (temp > 8191) { + PDEBUG(DSIM7, DEBUG_NOTICE, "Given spacial code '%s' has invalid digits. (Must be '0' .. '8191')\n", sonder); + return -EINVAL; + } + data[5] = (data[5] & 0xe0) | (temp >> 8); + data[6] = temp; + } + + if (wartung) { + temp = my_strtoul(wartung, NULL, 0); + if (temp > 65535) { + PDEBUG(DSIM7, DEBUG_NOTICE, "Given maintenance code '%s' has invalid digits. (Must be '0' .. '65535')\n", wartung); + return -EINVAL; + } + data[7] = temp >> 8; + data[8] = temp; + } + + return 0; +} + +/* convert EBDT to string */ +void decode_ebdt(uint8_t *data, char *futln, char *sicherung, char *karten, char *sonder, char *wartung) +{ + if (futln) { + /* second value becomes two digits automatically, if > 9 */ + my_ultostr(futln++, data[0] >> 5, 1); + my_ultostr(futln++, data[0] & 0x1f, 1); + if (*futln) + futln++; + my_ultostr(futln, (data[1] << 8) | data[2], 5); + } + + if (sicherung) + my_ultostr(sicherung, (data[3] << 8) | data[4], 1); + + if (karten) + my_ultostr(karten, data[5] >> 5, 1); + + if (sonder) + my_ultostr(sonder, ((data[5] & 0x1f) << 8) | data[6], 1); + + if (wartung) + my_ultostr(wartung, (data[7] << 8) | data[8], 1); +} + +/* get size of phone directory (including allocation map) */ +int directory_size(void) +{ + /* get size from space in eeprom */ + int size = (eeprom_length() - EEPROM_RUFN) / 24; + + /* may have 184 entries (23*8) plus allocation map (entry 0) */ + if (size > 184 + 1) + size = 184 + 1; + + return size; +} + +/* store one phone number in the directory; also set allocation mask) */ +int save_directory(int location, uint8_t *data) +{ + int size, i, pos; + uint8_t mask; + + size = directory_size(); + if (location < 1 || location >= size) { + PDEBUG(DSIM7, DEBUG_NOTICE, "Given location for phone number '%d' is out of range. (Must be '01' .. '%02d')\n", location, size - 1); + return -EINVAL; + } + + /* store entry */ + for (i = 0; i < 24; i++) + eeprom_write(EEPROM_RUFN + 24 * location + i, data[i]); + /* set bit mask */ + pos = EEPROM_RUFN + 1 + ((location - 1) >> 3); + mask = eeprom_read(pos); + if ((data[7] & 0xf) == 0xf) + mask |= (0x80 >> ((location - 1) & 7)); + else + mask &= ~(0x80 >> ((location - 1) & 7)); + eeprom_write(pos, mask); + + return 0; +} + +/* load one phone number from the directory; location 0 is the allocation mask) */ +void load_directory(int location, uint8_t *data) +{ + int i; + + for (i = 0; i < 24; i++) + data[i] = eeprom_read(EEPROM_RUFN + 24 * location + i); + /* set directory size, on allocation map */ + if (location == 0) + data[0] = directory_size() - 1; +} + +/* encode number an name into directory data */ +int encode_directory(uint8_t *data, const char *number, const char *name) +{ + int len, pos, i; + + len = strlen(number); + if (len > 16) { + PDEBUG(DSIM7, DEBUG_NOTICE, "Given phone number '%s' has too many digits. (Must be <= 16)\n", number); + return -EINVAL; + } + + memset(data, 0xff, 8); + memset(data + 8, ' ', 16); + for (i = 0; i < len; i++) { + if (number[i] < '0' || number[i] > '9') { + PDEBUG(DSIM7, DEBUG_NOTICE, "Given phone number '%s' has illegal digits. (Must be '0' .. '9')\n", number); + return -EINVAL; + } + pos = 16 - len + i; + if ((pos & 1) == 0) + data[pos >> 1] += ((number[i] - '0') << 4) - 0xf0; + else + data[pos >> 1] += number[i] - '0' - 0xf; + } + len = strlen(name); + if (len > 16) + len = 16; + for (i = 0; i < len; i++) { + pos = 8 + i; + data[pos] = name[i]; + } + + return 0; +} + +void decode_directory(uint8_t *data, char *number, char *name) +{ + int i, j; + char digit; + + if (number) { + j = 0; + for (i = 0; i < 16; i++) { + if ((i & 1) == 0) + digit = (data[i >> 1] >> 4) + '0'; + else + digit = (data[i >> 1] & 0xf) + '0'; + if (digit <= '9') + number[j++] = digit; + } + number[j] = '\0'; + } + + if (name) { + memcpy(name, data + 8, 16); + name[16] = '\0'; + /* remove spaces in the end of the string */ + for (i = 16 - 1; i >= 0; i--) { + if (name[i] != ' ') + break; + name[i] = '\0'; + } + } +} + +/* get APRC of NETZ-C application */ +static uint8_t get_aprc(sim_sim_t *sim) +{ + uint8_t aprc = 0x00; + + if (sim->pin_required) + aprc |= APRC_PIN_REQ; + if (sim->app_locked) + aprc |= APRC_APP_LOCKED; + if (sim->gebz_locked) + aprc |= APRC_GEBZ_LOCK; + if (sim->gebz_full) + aprc |= APRC_GEBZ_FULL; + + return aprc; +} + +/* validate PIN and change states */ +static int validate_pin(sim_sim_t *sim, uint8_t *data, int length) +{ + uint8_t valid = 0, program_mode = 0; + int i; + + if (!sim->pin_required) + return 0; + + /* no PIN mode */ + if (length == 4 && data[0] == '0' && data[1] == '0' && data[2] == '0' && data[3] >= '0' && data[3] <= '0' + MAX_CARDS) { + valid = 1; + if (data[3] > '0') + sim->card = data[3] - '1'; + PDEBUG(DSIM1, DEBUG_INFO, "System PIN '000%c' entered. Selecting card #%d.\n", data[3], sim->card + 1); + } + + /* programming mode */ + if (length == 4 && data[0] == '9' && data[1] == '9' && data[2] == '9' && data[3] >= '0' && data[3] <= '0' + MAX_CARDS) { + program_mode = 1; + valid = 1; + if (data[3] > '0') + sim->card = data[3] - '1'; + PDEBUG(DSIM1, DEBUG_INFO, "Configuration PIN '999%c' entered. Selecting card #%d in configuration mode.\n", data[3], sim->card + 1); + } + + /* if not 'program mode' and PIN matches EEPROM */ + if (!valid && length == sim->pin_len) { + for (i = 0; i < length; i++) { + if (data[i] != eeprom_read(EEPROM_PIN_DATA + i)) + break; + } + if (i == length) { + valid = 1; + PDEBUG(DSIM1, DEBUG_INFO, "Correct PIN was entered. Selecting card #%d.\n", sim->card + 1); + } + } + + if (valid) { + /* prevent permanent write when not needed */ + if (sim->pin_try != MAX_PIN_TRY) { + sim->pin_try = MAX_PIN_TRY; + write_flags(sim); + } + sim->pin_required = 0; + if (program_mode) + sim->program_mode = 1; + return 0; + } else { + PDEBUG(DSIM1, DEBUG_INFO, "Wrong PIN was entered.\n"); +#ifndef ARDUINO + /* decrement error counter */ + if (sim->pin_try) { + sim->pin_try--; + write_flags(sim); + } +#endif + return -EINVAL; + } +} + +/* message buffer handling */ + +/* get space for return message */ +uint8_t *alloc_msg(sim_sim_t *sim, int size) +{ + /* we add 4, because we push 4 bytes (ICL and L2 header later) */ + if (size + 4 > (int)sizeof(sim->block_tx_data)) + PDEBUG(DSIM1, DEBUG_NOTICE, "TX buffer overflow: size+4=%d > buffer size (%d)\n", size + 4, (int)sizeof(sim->block_tx_data)); + return sim->block_tx_data; +} + +/* push space in front of a message */ +uint8_t *push_msg(uint8_t *data, int length, int offset) +{ + int i; + + for (i = length - 1; i >= 0; --i) + data[i + offset] = data[i]; + + return data; +} + +/* Layer 7 */ + +static void return_error(sim_sim_t *sim) +{ + uint8_t *data; + + data = alloc_msg(sim, 0); + tx_sdu(sim, CCRC_ERROR, data, 0); +} + +static void return_pin_not_ok(sim_sim_t *sim) +{ + uint8_t *data; + + data = alloc_msg(sim, 0); + tx_sdu(sim, CCRC_PIN_NOK, data, 0); +} + +/* command: open application */ +static void sl_appl(sim_sim_t *sim, uint8_t *data, int length) +{ + uint8_t app; + + if (length < 11) { + PDEBUG(DSIM7, DEBUG_NOTICE, "SL-APPL too short\n"); + return_error(sim); + return; + } + + /* application number */ + app = (data[6] - '0') * 100; + app += (data[7] - '0') * 10; + app += data[8] - '0'; + + PDEBUG(DSIM7, DEBUG_INFO, " SL-APPL app %d\n", app); + + /* if PIN is required */ + if (sim->pin_required) { + return_pin_not_ok(sim); + return; + } + + /* check application */ + if (app != APP_NETZ_C && app != APP_RUFN_GEBZ) { + PDEBUG(DSIM7, DEBUG_NOTICE, "SL-APPL invalid app %d\n", sim->app); + return_error(sim); + return; + } + + /* respond */ + sim->app = app; + data = alloc_msg(sim, 0); + tx_sdu(sim, 0, data, 0); +} + +/* command: close application */ +static void cl_appl(sim_sim_t *sim) +{ + uint8_t *data; + + PDEBUG(DSIM7, DEBUG_INFO, " CL-APPL\n"); + + /* remove app */ + sim->app = 0; + + /* respond */ + data = alloc_msg(sim, 0); + tx_sdu(sim, 0, data, 0); +} + +/* command: show application */ +static void sh_appl(sim_sim_t *sim) +{ + uint8_t *data; + + PDEBUG(DSIM7, DEBUG_INFO, " SH-APPL\n"); + + /* respond */ + data = alloc_msg(sim, 33); + switch (sim->sh_appl_count) { + case 0: // first application is shown + /* L */ + data[0] = 11; + /* APP-IDN */ + data[1] = '8'; data[2] = '9'; + data[3] = '4'; data[4] = '9'; + data[5] = '0'; data[6] = '1'; + data[7] = '0'; data[8] = '0'; data[9] = '3'; + data[10] = '0'; data[11] = '1'; + /* APP-TXT */ + memcpy(data + 12, "Netz C ", 20); + /* APP-STS */ + data[32] = get_aprc(sim); + tx_sdu(sim, 0, data, 33); + sim->sh_appl_count++; + break; + default: // no more application + tx_sdu(sim, 0, data, 0); + sim->sh_appl_count = 0; + } +} + +/* command: show state of chip card */ +static void chk_kon(sim_sim_t *sim) +{ + uint8_t *data; + + PDEBUG(DSIM7, DEBUG_INFO, " CHK-KON\n"); + + /* respond */ + data = alloc_msg(sim, 0); + tx_sdu(sim, 0, data, 0); +} + +/* command: read subscriber data */ +static void rd_ebdt(sim_sim_t *sim) +{ + uint8_t *data; + + PDEBUG(DSIM7, DEBUG_INFO, " RD-EBDT\n"); + + /* respond */ + data = alloc_msg(sim, 9); + if (sim->program_mode) { + /* SERVICE MODE */ + data[0] = 0; + data[1] = 0; + data[2] = sim->card + 1; + data[3] = 12345 >> 8; + data[4] = 12345 & 0xff; + data[5] = 3 << 5; + data[6] = 0; + data[7] = 0x0ff; + data[8] = 0x0ff; + } else { + data[0] = eeprom_read(EEPROM_FUTLN_H + sim->card); + data[1] = eeprom_read(EEPROM_FUTLN_M + sim->card); + data[2] = eeprom_read(EEPROM_FUTLN_L + sim->card); + data[3] = eeprom_read(EEPROM_SICH_H + sim->card); + data[4] = eeprom_read(EEPROM_SICH_L + sim->card); + data[5] = eeprom_read(EEPROM_SONDER_H + sim->card); + data[6] = eeprom_read(EEPROM_SONDER_L + sim->card); + data[7] = eeprom_read(EEPROM_WARTUNG_H + sim->card); + data[8] = eeprom_read(EEPROM_WARTUNG_L + sim->card); + } + tx_sdu(sim, 0, data, 9); +} + +/* command: read phone directory */ +static void rd_rufn(sim_sim_t *sim, uint8_t *data, int length) +{ + uint8_t rufn = data[0]; + int size; + + if (length < 1) { + PDEBUG(DSIM7, DEBUG_NOTICE, "RD_RUFN too short\n"); + return_error(sim); + return; + } + + PDEBUG(DSIM7, DEBUG_INFO, " RD-RUFN (loc=%d)\n", rufn); + + /* SERVICE MODE */ + if (sim->program_mode) { + char number[16]; + + /* respond */ + data = alloc_msg(sim, 24); + switch (rufn) { + case 0: /* send bitmap for service mode */ + memset(data, 0xff, 24); + data[0] = 5; /* 5 entries */ + data[1] = 0x07; /* upper 5 bits = 0 */ + break; + case 1: /* FUTLN */ + data[0] = eeprom_read(EEPROM_FUTLN_H + sim->card); + data[1] = eeprom_read(EEPROM_FUTLN_M + sim->card); + data[2] = eeprom_read(EEPROM_FUTLN_L + sim->card); + decode_ebdt(data, number, NULL, NULL, NULL, NULL); + encode_directory(data, number, "FUTLN"); + PDEBUG(DSIM7, DEBUG_INFO, "service mode: FUTLN = %s\n", number); + break; + case 2: /* security code */ + data[3] = eeprom_read(EEPROM_SICH_H + sim->card); + data[4] = eeprom_read(EEPROM_SICH_L + sim->card); + decode_ebdt(data, NULL, number, NULL, NULL, NULL); + encode_directory(data, number, "Sicherungscode"); + PDEBUG(DSIM7, DEBUG_INFO, "service mode: security = %s\n", number); + break; + case 3: /* card ID */ + data[5] = eeprom_read(EEPROM_SONDER_H + sim->card); + decode_ebdt(data, NULL, NULL, number, NULL, NULL); + encode_directory(data, number, "Kartenkennung"); + PDEBUG(DSIM7, DEBUG_INFO, "service mode: card = %s\n", number); + break; + case 4: /* special key */ + data[5] = eeprom_read(EEPROM_SONDER_H + sim->card); + data[6] = eeprom_read(EEPROM_SONDER_L + sim->card); + decode_ebdt(data, NULL, NULL, NULL, number, NULL); + encode_directory(data, number, "Sonderheitsschl."); + PDEBUG(DSIM7, DEBUG_INFO, "service mode: special = %s\n", number); + break; + case 5: /* maintenance key */ + data[7] = eeprom_read(EEPROM_WARTUNG_H + sim->card); + data[8] = eeprom_read(EEPROM_WARTUNG_L + sim->card); + decode_ebdt(data, NULL, NULL, NULL, NULL, number); + encode_directory(data, number, "Wartungsschl."); + PDEBUG(DSIM7, DEBUG_INFO, "service mode: maintenance = %s\n", number); + break; + } + tx_sdu(sim, 0, data, 24); + return; + } + + size = directory_size(); + /* first entry (0) is used as allocation map */ + PDEBUG(DSIM7, DEBUG_INFO, " %d numbers can be stored in EEPROM\n", size - 1); + if (rufn >= size) { + PDEBUG(DSIM7, DEBUG_NOTICE, "RD_RUFN entry #%d out of range\n", rufn); + return_error(sim); + return; + } + + /* respond */ + data = alloc_msg(sim, 24); + load_directory(rufn, data); + tx_sdu(sim, 0, data, 24); +} + +/* command: write phone directory */ +static void wt_rufn(sim_sim_t *sim, uint8_t *data, int length) +{ + uint8_t rufn = data[0]; + + if (length < 25) { + PDEBUG(DSIM7, DEBUG_NOTICE, "WT_RUFN too short\n"); + return_error(sim); + return; + } + + PDEBUG(DSIM7, DEBUG_INFO, " WT-RUFN (loc=%d)\n", rufn); + + /* SERVICE MODE */ + if (sim->program_mode) { + int rc; + char number[17]; + + decode_directory(data + 1, number, NULL); + /* if number is cleared, we ignore that */ + if (number[0] == '\0') + goto respond; + switch (rufn) { + case 1: /* FUTLN */ + PDEBUG(DSIM7, DEBUG_INFO, "service mode: FUTLN = %s\n", number); + rc = encode_ebdt(data, number, NULL, NULL, NULL, NULL); + if (rc < 0) + break; + eeprom_write(EEPROM_FUTLN_H + sim->card, data[0]); + eeprom_write(EEPROM_FUTLN_M + sim->card, data[1]); + eeprom_write(EEPROM_FUTLN_L + sim->card, data[2]); + break; + case 2: /* security code */ + PDEBUG(DSIM7, DEBUG_INFO, "service mode: security = %s\n", number); + rc = encode_ebdt(data, NULL, number, NULL, NULL, NULL); + if (rc < 0) + break; + eeprom_write(EEPROM_SICH_H + sim->card, data[3]); + eeprom_write(EEPROM_SICH_L + sim->card, data[4]); + break; + case 3: /* card ID */ + PDEBUG(DSIM7, DEBUG_INFO, "service mode: card = %s\n", number); + data[5] = eeprom_read(EEPROM_SONDER_H + sim->card); + rc = encode_ebdt(data, NULL, NULL, number, NULL, NULL); + if (rc < 0) + break; + eeprom_write(EEPROM_SONDER_H + sim->card, data[5]); + break; + case 4: /* special key */ + PDEBUG(DSIM7, DEBUG_INFO, "service mode: special = %s\n", number); + data[5] = eeprom_read(EEPROM_SONDER_H + sim->card); + rc = encode_ebdt(data, NULL, NULL, NULL, number, NULL); + if (rc < 0) + break; + eeprom_write(EEPROM_SONDER_H + sim->card, data[5]); + eeprom_write(EEPROM_SONDER_L + sim->card, data[6]); + break; + case 5: /* maintenance key */ + PDEBUG(DSIM7, DEBUG_INFO, "service mode: maintenance = %s\n", number); + rc = encode_ebdt(data, NULL, NULL, NULL, NULL, number); + if (rc < 0) + break; + eeprom_write(EEPROM_WARTUNG_H + sim->card, data[7]); + eeprom_write(EEPROM_WARTUNG_L + sim->card, data[8]); + break; + } + /* respond */ + goto respond; + } + + if (rufn >= directory_size() || rufn < 1) { + PDEBUG(DSIM7, DEBUG_NOTICE, "WT_RUFN entry #%d out of range\n", rufn); + return_error(sim); + return; + } + + save_directory(data[0], data + 1); + + /* respond */ +respond: + data = alloc_msg(sim, 0); + tx_sdu(sim, 0, data, 0); +} + +/* command: check PIN (enter PIN and unlock) */ +static void chk_pin(sim_sim_t *sim, uint8_t *data, int length) +{ + int rc; + + PDEBUG(DSIM7, DEBUG_INFO, " CHK-PIN\n"); + + if (length < 4 || length > 8) { + PDEBUG(DSIM7, DEBUG_NOTICE, "SET-PIN wrong length: %d\n", length); + return_error(sim); + return; + } + + /* validate PIN */ + rc = validate_pin(sim, data, length); + if (rc) { + return_pin_not_ok(sim); + return; + } + + /* respond */ + data = alloc_msg(sim, 0); + tx_sdu(sim, 0, data, 0); +} + +/* command: set PIN */ +static void set_pin(sim_sim_t *sim, uint8_t *data, int length) +{ + uint8_t len_old, len_new; + uint8_t *pin_old, *pin_new; + int i; + int rc; + + PDEBUG(DSIM7, DEBUG_INFO, " SET-PIN\n"); + + if (length < 1) { + PDEBUG(DSIM7, DEBUG_NOTICE, "SET-PIN too short\n"); + return_error(sim); + return; + } + + len_old = data[0]; + pin_old = data + 1; + len_new = length - len_old - 1; + pin_new = data + 1 + len_old; + if (len_new < 4 || len_new > 8) { + PDEBUG(DSIM7, DEBUG_NOTICE, "New PIN wrong length %d!\n", len_new); + return_error(sim); + return; + } + + /* validate PIN */ + rc = validate_pin(sim, pin_old, length); + if (rc) { + return_pin_not_ok(sim); + return; + } + + /* write PIN */ + sim->pin_len = len_new; + write_flags(sim); + for (i = 0; i < len_new; i++) + eeprom_write(EEPROM_PIN_DATA + i, pin_new[i]); + + /* respond */ + data = alloc_msg(sim, 0); + tx_sdu(sim, 0, data, 0); +} + +/* command: increment metering counter */ +static void eh_gebz(sim_sim_t *sim, uint8_t *data, int length) +{ + uint32_t gebz; + + PDEBUG(DSIM7, DEBUG_INFO, " EH-GEBZ\n"); + + if (length < 1) { + PDEBUG(DSIM7, DEBUG_NOTICE, "EH-GEBZ wrong length: %d\n", length); + return_error(sim); + return; + } + + /* increment counter */ + gebz = eeprom_read(EEPROM_GEBZ_H) << 16; + gebz |= eeprom_read(EEPROM_GEBZ_M) << 8; + gebz |= eeprom_read(EEPROM_GEBZ_L); + gebz += data[0]; + eeprom_write(EEPROM_GEBZ_H, gebz >> 16); + eeprom_write(EEPROM_GEBZ_M, gebz >> 8); + eeprom_write(EEPROM_GEBZ_L, gebz); + + /* respond */ + data = alloc_msg(sim, 0); + tx_sdu(sim, 0, data, 0); +} + +/* command: clear metering counter */ +static void cl_gebz(sim_sim_t *sim) +{ + uint8_t *data; + + PDEBUG(DSIM7, DEBUG_INFO, " CL-GEBZ\n"); + + /* clear counter */ + eeprom_write(EEPROM_GEBZ_H, 0); + eeprom_write(EEPROM_GEBZ_M, 0); + eeprom_write(EEPROM_GEBZ_L, 0); + + /* respond */ + data = alloc_msg(sim, 0); + tx_sdu(sim, 0, data, 0); +} + +/* command: read metering counter */ +static void rd_gebz(sim_sim_t *sim) +{ + uint8_t *data; + + PDEBUG(DSIM7, DEBUG_INFO, " RD-GEBZ\n"); + + /* respond */ + data = alloc_msg(sim, 3); + data[0] = eeprom_read(EEPROM_GEBZ_H); + data[1] = eeprom_read(EEPROM_GEBZ_M); + data[2] = eeprom_read(EEPROM_GEBZ_L); + tx_sdu(sim, 0, data, 3); +} + +/* command: lock metering counter and directory */ +static void sp_gzrv(sim_sim_t *sim) +{ + uint8_t *data; + + PDEBUG(DSIM7, DEBUG_INFO, " SP-GZRV\n"); + + sim->gebz_locked = 1; + write_flags(sim); + + /* respond */ + data = alloc_msg(sim, 0); + tx_sdu(sim, 0, data, 0); +} + +/* command: unlock metering counter and directory */ +static void fr_gzrv(sim_sim_t *sim) +{ + uint8_t *data; + + PDEBUG(DSIM7, DEBUG_INFO, " FR-GZRV\n"); + + sim->gebz_locked = 0; + write_flags(sim); + + /* respond */ + data = alloc_msg(sim, 0); + tx_sdu(sim, 0, data, 0); +} + +/* command: authenticate */ +static void aut_1(sim_sim_t *sim) +{ + uint8_t *data; + int i; + + PDEBUG(DSIM7, DEBUG_INFO, " RD-EBDT\n"); + + /* respond */ + data = alloc_msg(sim, 1); + for (i = 0; i < 8; i++) + data[i] = eeprom_read(EEPROM_AUTH_DATA + i); + tx_sdu(sim, 0, data, 8); +} + +/* command: UNKNOWN */ +static void rd_f4(sim_sim_t *sim) +{ + uint8_t *data; + + PDEBUG(DSIM7, DEBUG_INFO, " RD-F4\n"); + + /* respond */ + data = alloc_msg(sim, 2); + data[0] = 0x00; + data[1] = 0x13; + tx_sdu(sim, 0, data, 2); +} + +/* command: UNKNOWN */ +static void rd_f5(sim_sim_t *sim) +{ + uint8_t *data; + + PDEBUG(DSIM7, DEBUG_INFO, " RD-F5\n"); + + /* respond */ + data = alloc_msg(sim, 0); + tx_sdu(sim, 0, data, 0); +} + +/* command: UNKNOWN */ +static void rd_04(sim_sim_t *sim) +{ + uint8_t *data; + + PDEBUG(DSIM7, DEBUG_INFO, " RD-04\n"); + + /* respond */ + data = alloc_msg(sim, 25); + data[0] = 0x63; + memset(data + 1, 0x00, 24); + tx_sdu(sim, 0, data, 25); +} + +/* parse layer 7 header */ +static void rx_sdu(sim_sim_t *sim, uint8_t *data, int length) +{ + uint8_t cla, ins, dlng; + + if (length < 3) { + PDEBUG(DSIM7, DEBUG_NOTICE, "SDU too short\n"); + return; + } + + /* skip all responses, because we don't send commands */ + if (*data & CCRC_IDENT) { + PDEBUG(DSIM7, DEBUG_NOTICE, "Skipping SDU with response\n"); + return; + } + + /* read application layer header */ + cla = *data++ & 0x7f; + ins = *data++; + dlng = *data++; + length -= 3; + + /* check length */ + if (dlng != length) { + PDEBUG(DSIM7, DEBUG_NOTICE, "Skipping SDU with invalid length\n"); + return; + } + + /* select command */ + switch (cla) { + case CLA_CNTR: + switch (ins) { + case SL_APPL: sl_appl(sim, data, length); return; + case CL_APPL: cl_appl(sim); return; + case SH_APPL: sh_appl(sim); return; + } + break; + case CLA_STAT: + switch (ins) { + case CHK_KON: chk_kon(sim); return; + } + break; + case CLA_WRTE: + switch (ins) { + case WT_RUFN: wt_rufn(sim, data, length); return; + } + break; + case CLA_READ: + switch (ins) { + case RD_EBDT: rd_ebdt(sim); return; + case RD_RUFN: rd_rufn(sim, data, length); return; + case RD_GEBZ: rd_gebz(sim); return; + case 0xf4: rd_f4(sim); return; + case 0xf5: rd_f5(sim); return; + case 0x04: rd_04(sim); return; + } + break; + case CLA_EXEC: + switch (ins) { + case CHK_PIN: chk_pin(sim, data, length); return; + case SET_PIN: set_pin(sim, data, length); return; + } + if (sim->app == APP_NETZ_C) switch (ins) { + case EH_GEBZ: eh_gebz(sim, data, length); return; + case CL_GEBZ: cl_gebz(sim); return; + } + if (sim->app == APP_RUFN_GEBZ) switch (ins) { + case SP_GZRV: sp_gzrv(sim); return; + case FR_GZRV: fr_gzrv(sim); return; + } + break; + case CLA_AUTO: + switch (ins) { + case AUT_1: aut_1(sim); return; + } + break; + } + + /* unsupported message */ + PDEBUG(DSIM7, DEBUG_NOTICE, "CLA 0x%02x INS 0x%02x uknown\n", cla, ins); + data = alloc_msg(sim, 0); + tx_sdu(sim, CCRC_ERROR, data, 0); +} + +/* create layer 7 message for ICL layer */ +static void tx_sdu(sim_sim_t *sim, uint8_t ccrc, uint8_t *data, int length) +{ + /* header */ + data = push_msg(data, length, 3); + data[0] = CCRC_IDENT | ccrc | CCRC_APRC_VALID; + data[1] = 0; + if (sim->pin_try == 0) + data[0] |= CCRC_AFBZ_NULL; + data[1] = get_aprc(sim); + data[2] = length; + length += 3; + + /* forward to ICL layer */ + tx_pdu(sim, data, length); +} + +/* ICL layer */ + +/* parse ICL header */ +static void rx_pdu(sim_sim_t *sim, uint8_t *data, int length) +{ + uint8_t ext = 1; + + if (length < 1) { +too_short: + PDEBUG(DSIMI, DEBUG_NOTICE, "PDU too short\n"); + return; + } + + /* read ICB1 */ + sim->icl_online = (*data & ICB1_ONLINE) != 0; + sim->icl_master = (*data & ICB1_MASTER) != 0; + sim->icl_error = (*data & ICB1_ERROR) != 0; + sim->icl_chaining = (*data & ICB1_CHAINING) != 0; + + /* skip all ICBx (should only one exist) */ + while (ext) { + if (length < 1) + goto too_short; + ext = (*data++ & ICB_EXT) != 0; + length--; + } + + rx_sdu(sim, data, length); +} + +/* create ICL layer message for layer 2 */ +static void tx_pdu(sim_sim_t *sim, uint8_t *data, int length) +{ + /* header */ + data = push_msg(data, length, 1); + data[0] = 0; + if (sim->icl_online) + data[0] |= ICB1_ONLINE; + if (!sim->icl_master) + data[0] |= ICB1_MASTER; + if (sim->icl_error) + data[0] |= ICB1_ERROR | ICB1_CONFIRM; + if (sim->icl_chaining) + data[0] |= ICB1_CHAINING | ICB1_CONFIRM; + length++; + + tx_block(sim, L2_I, data, length); +} + +/* Layer 2 */ + +/* process received L2 message */ +static void rx_block(sim_sim_t *sim) +{ + uint8_t ns, nr; + uint8_t *data; + + /* NOTE: This procedure is simplified, it does not comply with the specs. */ + + PDEBUG(DSIM2, DEBUG_INFO, "RX message\n"); + sim->addr_src = sim->block_address >> 4; + sim->addr_dst = sim->block_address & 0xf; + if (sim->block_checksum != 0) { + PDEBUG(DSIM2, DEBUG_NOTICE, "Checksum error!\n"); + goto reject; + } + if ((sim->block_control & 0x11) == 0x00) { + ns = (sim->block_control >> 1) & 7; + nr = sim->block_control >> 5; + PDEBUG(DSIM2, DEBUG_INFO, " control I: N(S)=%d N(R)=%d\n", ns, nr); + if (ns == sim->vr && nr == sim->vs) { + /* receive data */ + sim->vr = (sim->vr + 1) & 0x7; + rx_pdu(sim, sim->block_rx_data, sim->block_rx_length); + return; + } else { + PDEBUG(DSIM2, DEBUG_NOTICE, "Seqeuence error!\n"); +reject: + /* reject (or send resync after 3 times) */ + data = alloc_msg(sim, 0); + if (1) { // if (sim->reject_count < 3) { + tx_block(sim, L2_REJ, data, 0); + sim->reject_count++; + } else { + tx_block(sim, L2_RES, data, 0); + } + return; + } + return; + } + if ((sim->block_control & 0x1f) == 0x09) { + nr = sim->block_control >> 5; + PDEBUG(DSIM2, DEBUG_INFO, " control REJ: N(R)=%d\n", nr); + /* repeat last message */ + if (sim->block_tx_length) { + tx_block(sim, L2_I, sim->block_tx_data, sim->block_tx_length); + return; + } + /* no block sent yet, sending resync */ + data = alloc_msg(sim, 0); + tx_block(sim, L2_RES, data, 0); + return; + } + if (sim->block_control == 0xef) { + PDEBUG(DSIM2, DEBUG_INFO, " control RES\n"); + sim->vr = sim->vs = 0; + sim->reject_count = 0; + if (sim->resync_sent == 0) { + /* resync */ + data = alloc_msg(sim, 0); + tx_block(sim, L2_RES, data, 0); + return; + } + return; + } +} + +/* receive data from layer 1 and create layer 2 message */ +static int rx_char(sim_sim_t *sim, uint8_t c) +{ + sim->block_checksum ^= c; + + switch (sim->block_state) { + case BLOCK_STATE_ADDRESS: + sim->block_address = c; + sim->block_state = BLOCK_STATE_CONTROL; + sim->block_checksum = c; + return 0; + case BLOCK_STATE_CONTROL: + sim->block_control = c; + sim->block_state = BLOCK_STATE_LENGTH; + return 0; + case BLOCK_STATE_LENGTH: + if (c > sizeof(sim->block_rx_data)) { + c = sizeof(sim->block_rx_data); + PDEBUG(DSIM1, DEBUG_NOTICE, "RX buffer overflow: length=%d > buffer size (%d)\n", c, (int)sizeof(sim->block_rx_data)); + } + sim->block_rx_length = c; + sim->block_count = 0; + sim->block_state = BLOCK_STATE_DATA; + return 0; + case BLOCK_STATE_DATA: + if (sim->block_count < sim->block_rx_length) { + sim->block_rx_data[sim->block_count++] = c; + return 0; + } + sim->l1_state = L1_STATE_IDLE; + rx_block(sim); + } + + return -1; +} + +/* create layer 2 message for layer 1 */ +static void tx_block(sim_sim_t *sim, enum l2_cmd cmd, uint8_t __attribute__((unused)) *data, int length) +{ + PDEBUG(DSIM2, DEBUG_INFO, "TX resonse\n"); + + /* header */ + sim->block_address = (sim->addr_dst << 4) | sim->addr_src; + switch (cmd) { + case L2_I: + PDEBUG(DSIM2, DEBUG_INFO, " control I: N(S)=%d N(R)=%d\n", sim->vs, sim->vr); + sim->block_control = (sim->vr << 5) | (sim->vs << 1); + sim->vs = (sim->vs + 1) & 0x7; + sim->resync_sent = 0; + break; + case L2_REJ: + PDEBUG(DSIM2, DEBUG_INFO, " control REJ: N(R)=%d\n", sim->vr); + sim->block_control = (sim->vr << 5) | 0x09; + sim->resync_sent = 0; + break; + case L2_RES: + PDEBUG(DSIM2, DEBUG_INFO, " control RES\n"); + sim->block_control = 0xef; + sim->resync_sent = 1; + break; + } + sim->block_tx_length = length; + + sim->l1_state = L1_STATE_SEND; + sim->block_state = BLOCK_STATE_ADDRESS; +} + +/* transmit character of current message to layer 1 */ +static uint8_t tx_char(sim_sim_t *sim) +{ + uint8_t c = -1; + + switch (sim->block_state) { + case BLOCK_STATE_ADDRESS: + c = sim->block_address; + sim->block_state = BLOCK_STATE_CONTROL; + sim->block_checksum = 0; + break; + case BLOCK_STATE_CONTROL: + c = sim->block_control; + sim->block_state = BLOCK_STATE_LENGTH; + break; + case BLOCK_STATE_LENGTH: + c = sim->block_tx_length; + sim->block_count = 0; + sim->block_state = BLOCK_STATE_DATA; + break; + case BLOCK_STATE_DATA: + if (sim->block_count < sim->block_tx_length) { + c = sim->block_tx_data[sim->block_count++]; + break; + } + c = sim->block_checksum; + sim->l1_state = L1_STATE_IDLE; + break; + } + + sim->block_checksum ^= c; + + return c; +} + +/* ATR */ + +static uint8_t atr[] = { + 0x3b, 0x88, /* TS, T0 */ + 0x8e, + 0xfe, + 0x53, 0x2a, 0x03, 0x1e, + 0x04, + 0x92, 0x80, 0x00, 0x41, 0x32, 0x36, 0x01, 0x11, + 0xe4, /* TCK */ +}; + +static uint8_t tx_atr(sim_sim_t *sim) +{ + uint8_t c; + + c = atr[sim->atr_count++]; + if (sim->atr_count == sizeof(atr)) + sim->l1_state = L1_STATE_IDLE; + + return c; +} + +/* Layer 1 */ + +int sim_init_eeprom(void) +{ + uint8_t ebdt_data[9]; + int i, rc; + + /* init EEPROM with all bits '1' */ + for (i = 0; i < (int)eeprom_length(); i++) + eeprom_write(i, 0xff); + + /* set default values in eeprom */ + rc = encode_ebdt(ebdt_data, FUTLN_DEFAULT, SICHERUNG_DEFAULT, KARTEN_DEFAULT, SONDER_DEFAULT, WARTUNG_DEFAULT); + if (rc < 0) + return rc; + for (i = 0; i < MAX_CARDS; i++) { + eeprom_write(EEPROM_FUTLN_H + i, ebdt_data[0]); + eeprom_write(EEPROM_FUTLN_M + i, ebdt_data[1]); + eeprom_write(EEPROM_FUTLN_L + i, ebdt_data[2] + i); + eeprom_write(EEPROM_SICH_H + i, ebdt_data[3]); + eeprom_write(EEPROM_SICH_L + i, ebdt_data[4]); + eeprom_write(EEPROM_SONDER_H + i, ebdt_data[5]); + eeprom_write(EEPROM_SONDER_L + i, ebdt_data[6]); + eeprom_write(EEPROM_WARTUNG_H + i, ebdt_data[7]); + eeprom_write(EEPROM_WARTUNG_L + i, ebdt_data[8]); + } + eeprom_write(EEPROM_GEBZ_H, 0); + eeprom_write(EEPROM_GEBZ_M, 0); + eeprom_write(EEPROM_GEBZ_L, 0); + eeprom_write(EEPROM_FLAGS, (strlen(PIN_DEFAULT) << EEPROM_FLAG_PIN_LEN) | (MAX_PIN_TRY << EEPROM_FLAG_PIN_TRY)); + for (i = 0; i < (int)strlen(PIN_DEFAULT); i++) + eeprom_write(EEPROM_PIN_DATA + i, PIN_DEFAULT[i]); + + eeprom_write(EEPROM_MAGIC + 0, 'C'); + eeprom_write(EEPROM_MAGIC + 1, '0' + EEPROM_VERSION); + + return 0; +} + +void sim_reset(sim_sim_t *sim, int reset) +{ + int i; + char pin[8]; + + PDEBUG(DSIM1, DEBUG_INFO, "Reset singnal %s\n", (reset) ? "on (low)" : "off (high)"); + memset(sim, 0, sizeof(*sim)); + + if (reset) + return; + + /* read flags from EEPROM data */ + read_flags(sim); + + /* check PIN and set flags */ + for (i = 0; i < sim->pin_len; i++) + pin[i] = eeprom_read(EEPROM_PIN_DATA + i); + + sim->pin_required = 1; + /* 'system' PIN = 0000, 0001, 0002, ... */ + if (sim->pin_len == 4 && pin[0] == '0' && pin[1] == '0' && pin[2] == '0' && pin[3] >= '0' && pin[3] <= '0' + MAX_CARDS) { + sim->pin_required = 0; + if (pin[3] > '0') + sim->card = pin[3] - '1'; + PDEBUG(DSIM1, DEBUG_INFO, "Card has disabled PIN (system PIN '000%c') Selecting card #%d.\n", pin[3], sim->card + 1); + } + + PDEBUG(DSIM1, DEBUG_INFO, "Sending ATR\n"); + sim->l1_state = L1_STATE_ATR; +} + +int sim_rx(sim_sim_t *sim, uint8_t c) +{ + int rc = -1; + + PDEBUG(DSIM1, DEBUG_DEBUG, "Serial RX '0x%02x'\n", c); + + switch (sim->l1_state) { + case L1_STATE_IDLE: + sim->l1_state = L1_STATE_RECEIVE; + sim->block_state = BLOCK_STATE_ADDRESS; + /* fall through */ + case L1_STATE_RECEIVE: + rc = rx_char(sim, c); + break; + default: + break; + } + + return rc; +} + +int sim_tx(sim_sim_t *sim) +{ + int c = -1; + + switch (sim->l1_state) { + case L1_STATE_ATR: + c = tx_atr(sim); + break; + case L1_STATE_SEND: + c = tx_char(sim); + break; + default: + break; + } + + if (c >= 0) + PDEBUG(DSIM1, DEBUG_DEBUG, "Serial TX '0x%02x'\n", c); + + return c; +} + +void sim_timeout(sim_sim_t *sim) +{ + switch (sim->l1_state) { + case L1_STATE_ATR: + PDEBUG(DSIM1, DEBUG_NOTICE, "Timeout while transmitting ATR!\n"); + sim->l1_state = L1_STATE_RESET; + break; + case L1_STATE_RECEIVE: + PDEBUG(DSIM1, DEBUG_NOTICE, "Timeout while receiving message!\n"); + sim->block_state = BLOCK_STATE_ADDRESS; + break; + case L1_STATE_SEND: + PDEBUG(DSIM1, DEBUG_NOTICE, "Timeout while sending message!\n"); + sim->l1_state = L1_STATE_IDLE; + break; + default: + break; + } +} diff --git a/src/sim/sim.h b/src/sim/sim.h new file mode 100644 index 0000000..855cb0b --- /dev/null +++ b/src/sim/sim.h @@ -0,0 +1,148 @@ + +#define FUTLN_DEFAULT "2222001" +#define SICHERUNG_DEFAULT "3103" +#define KARTEN_DEFAULT "3" +#define SONDER_DEFAULT "0" +#define WARTUNG_DEFAULT "65535" +#define PIN_DEFAULT "0000" +#define AUTH_DEFAULT "0xffffffffffffffff" + +enum l1_state { + L1_STATE_RESET = 0, /* reset is held */ + L1_STATE_ATR, /* answer to reset is sent */ + L1_STATE_IDLE, /* waiting for message or reset */ + L1_STATE_SEND, /* sending reply */ + L1_STATE_RECEIVE, /* receiving message */ +}; + +enum block_state { + BLOCK_STATE_ADDRESS = 0, + BLOCK_STATE_CONTROL, + BLOCK_STATE_LENGTH, + BLOCK_STATE_DATA, +}; + +#define MAX_PIN_TRY 3 +#define MAX_CARDS 8 /* must also be defined at eeprom.h */ + +typedef struct sim_sim { + int card; + enum l1_state l1_state; + + /* ATR states */ + int atr_count; + + /* layer 2 states */ + enum block_state block_state; + uint8_t block_address; + uint8_t block_control; + uint8_t block_checksum; + uint8_t block_count; + uint8_t block_rx_data[64]; + uint8_t block_rx_length; + uint8_t block_tx_data[64]; + uint8_t block_tx_length; + uint8_t vs, vr; + int reject_count; + int resync_sent; + + /* ICL layer states */ + int icl_online; + int icl_master; + int icl_chaining; + int icl_error; + + /* layer 7 states */ + int addr_src; + int addr_dst; + int sh_appl_count; /* counts applications for SH_APPL */ + + /* CNETZ states */ + int pin_required; /* pin required an not yet validated */ + int program_mode; /* program mode active (special PIN entered) */ + int pin_len; /* length of pin (4 .. 8) */ + int pin_try; /* number of tries left (0 == card locked) */ + int app; /* currently selected APP number */ + int app_locked; /* application locked */ + int gebz_locked; /* metering counter and phonebook locked */ + int gebz_full; /* metering counter full (does this really happen?) */ +} sim_sim_t; + +/* layer 2 */ +enum l2_cmd { + L2_I, + L2_REJ, + L2_RES, +}; + +/* ICL */ +#define ICB1_ONLINE 0x01 +#define ICB1_CONFIRM 0x02 +#define ICB1_MASTER 0x04 +#define ICB1_WT_EXT 0x08 +#define ICB1_ABORT 0x10 +#define ICB1_ERROR 0x20 +#define ICB1_CHAINING 0x40 +#define ICB2_BUFFER 0x0f +#define ICB2_DYNAMIC 0x10 +#define ICB2_ISO_L2 0x20 +#define ICB2_PRIVATE 0x40 +#define ICB_EXT 0x80 + +/* command */ +#define CLA_CNTR 0x02 +#define SL_APPL 0xf1 +#define CL_APPL 0xf2 +#define SH_APPL 0xf3 + +#define CLA_STAT 0x03 +#define CHK_KON 0xf1 + +#define CLA_WRTE 0x04 +#define WT_RUFN 0x01 + +#define CLA_READ 0x05 +#define RD_EBDT 0x01 +#define RD_RUFN 0x02 +#define RD_GEBZ 0x03 + +#define CLA_EXEC 0x06 +#define CHK_PIN 0xf1 +#define SET_PIN 0xf2 +#define EH_GEBZ 0x01 +#define CL_GEBZ 0x02 +#define SP_GZRV 0x01 +#define FR_GZRV 0x02 + +#define CLA_AUTO 0x07 +#define AUT_1 0x01 + +/* response */ +#define CCRC_PIN_NOK 0x01 +#define CCRC_AFBZ_NULL 0x02 +#define CCRC_APRC_VALID 0x04 +#define CCRC_ERROR 0x40 +#define CCRC_IDENT 0x80 + +#define APRC_PIN_REQ 0x02 +#define APRC_APP_LOCKED 0x04 +#define APRC_GEBZ_LOCK 0x10 +#define APRC_GEBZ_FULL 0x20 + +/* apps */ +#define APP_NETZ_C 3 +#define APP_RUFN_GEBZ 4 + +int encode_ebdt(uint8_t *data, const char *futln, const char *sicherung, const char *karten, const char *sonder, const char *wartung); +void decode_ebdt(uint8_t *data, char *futln, char *sicherung, char *karten, char *sonder, char *wartung); +int directory_size(void); +int save_directory(int location, uint8_t *data); +void load_directory(int location, uint8_t *data); +int encode_directory(uint8_t *data, const char *number, const char *name); +void decode_directory(uint8_t *data, char *number, char *name); + +int sim_init_eeprom(void); +void sim_reset(sim_sim_t *sim, int reset); +int sim_rx(sim_sim_t *sim, uint8_t c); +int sim_tx(sim_sim_t *sim); +void sim_timeout(sim_sim_t *sim); diff --git a/src/sim/sim.ino b/src/sim/sim.ino new file mode 100644 index 0000000..fb12269 --- /dev/null +++ b/src/sim/sim.ino @@ -0,0 +1,287 @@ +/* SIM card for ATMEL + * + * (C) 2020 by Andreas Eversberg + * All Rights Reserved + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +extern "C" +{ + #include "sim.h" + #include "eeprom.h" +} + +/* settings for ATTINY85 */ +#if defined(__AVR_ATtiny85__) +#define SERIAL_DATA 4 +#define SERIAL_DELAY 124 +#define SERIAL_TIMEOUT 1200 /* > two bytes */ +#else +/* settings for Arduino UNO with 16 MHz */ +#define STATUS_LED LED_BUILTIN +#define RESET_PIN 6 +#define SERIAL_DATA 7 +#define SERIAL_DELAY 410 +#define SERIAL_TIMEOUT 2500 /* > two bytes */ +#endif +/* to set fused for ATTINY85: + * avrdude -c usbasp-clone -p t85 -U lfuse:w:0xc0:m -U hfuse:w:0xdf:m -U efuse:w:0xff:m + */ + +/* timing test TX (010101010011) */ +//#define TEST_TX +/* timing test RX (000000000001) */ +//#define TEST_RX +/* timing test timeout (pause + 000000000001) */ +//#define TEST_TO + +sim_sim_t sim; + +#include +#include + +uint8_t eeprom_read(enum eeprom_locations loc) +{ + return eeprom_read_byte((uint8_t *)loc); +} + +void eeprom_write(enum eeprom_locations loc, uint8_t value) +{ + eeprom_write_byte((uint8_t *)loc, value); +} + +size_t eeprom_length(void) +{ + return 512; +} + +#ifdef RESET_PIN +volatile uint8_t *reset_in; +uint8_t reset_bit; + +/* init reset pin */ +void reset_init(uint8_t pin) +{ + uint8_t port; + volatile uint8_t *mode, *out; + + reset_bit = digitalPinToBitMask(pin); + port = digitalPinToPort(pin); + + mode = portModeRegister(port); + out = portOutputRegister(port); + reset_in = portInputRegister(port); + + *mode &= ~reset_bit; /* intput */ + *out |= reset_bit; /* pullup */ +} +#endif + +volatile uint8_t *serial_mode, *serial_out, *serial_in; +uint8_t serial_bit; +uint16_t serial_delay; + +/* init serial pin */ +void serial_init(uint8_t pin, uint16_t delay) +{ + uint8_t port; + + serial_delay = delay; + serial_bit = digitalPinToBitMask(pin); + port = digitalPinToPort(pin); + + serial_mode = portModeRegister(port); + serial_out = portOutputRegister(port); + serial_in = portInputRegister(port); + + *serial_mode &= ~serial_bit; /* input */ + *serial_out |= serial_bit; /* pullup */ +} + +/* wait some time so the stop bits haven been elapsed before transmitting a block */ +void serial_start_tx(void) +{ + /* wait some time, so previous stop bits have been elapsed */ + _delay_loop_2(serial_delay * 3); /* 2..3 bits of time */ +} + +/* transmit a byte */ +void serial_tx(uint8_t b) +{ + uint8_t i, c = 0; + + /* start bit */ + *serial_mode |= serial_bit; /* output */ + *serial_out &= ~serial_bit; /* low */ + _delay_loop_2(serial_delay); + /* 8 data bits */ + for (i = 8; i > 0; --i) { + if (b & 1) + *serial_out |= serial_bit; /* high */ + else + *serial_out &= ~serial_bit; /* low */ + _delay_loop_2(serial_delay); + c ^= b; + b>>= 1; + } + /* even parity */ + if (c & 1) + *serial_out |= serial_bit; /* high */ + else + *serial_out &= ~serial_bit; /* low */ + _delay_loop_2(serial_delay); + /* 2 stop bits */ + *serial_out |= serial_bit; /* high */ + _delay_loop_2(serial_delay); + _delay_loop_2(serial_delay); + *serial_mode &= ~serial_bit; /* input */ +} + +/* receive a byte */ +uint8_t serial_rx(void) +{ + uint8_t i, b = 0; + + /* center read */ + _delay_loop_2(serial_delay >> 1); + /* 8 data bits */ + for (i = 8; i > 0; --i) { + _delay_loop_2(serial_delay); + b >>= 1; + if ((*serial_in & serial_bit)) + b |= 0x80; + } + /* parity */ + _delay_loop_2(serial_delay); + /* move into (first) stop bit */ + _delay_loop_2(serial_delay); + + return b; +} + +void setup() { + uint8_t byte, ver; + +#ifdef STATUS_LED + pinMode(STATUS_LED, OUTPUT); +#endif + + /* intial eeprom init */ + byte = eeprom_read(EEPROM_MAGIC + 0); + ver = eeprom_read(EEPROM_MAGIC + 1); + if (byte != 'C' || ver != '0' + EEPROM_VERSION) + sim_init_eeprom(); + +#ifdef RESET_PIN + reset_init(RESET_PIN); +#endif + serial_init(SERIAL_DATA, SERIAL_DELAY); +#ifdef TEST_TX + while (true) + serial_tx(0x55); +#endif +#ifdef TEST_RX + *serial_mode |= serial_bit; /* output */ + while (true) { + /* show low for start bit up to end of first stop bit */ + *serial_out &= ~serial_bit; /* low */ + serial_rx(); + _delay_loop_2(serial_delay >> 1); + *serial_out |= serial_bit; /* high */ + _delay_loop_2(serial_delay); + } +#endif +#ifdef TEST_TO + uint16_t to; + int rx; + rx_again: + rx = 1; + /* wait until start bit is received or timeout */ + for (to = 0; to <= SERIAL_TIMEOUT;) { + if (!(*serial_in & serial_bit)) { + serial_tx(0x33); + goto rx_again; + } +#ifdef RESET_PIN + if (!(*reset_in & reset_bit)) { + serial_tx(0xf0); + goto rx_again; + } +#endif + if (rx) + to++; + } + serial_tx(0x55); + goto rx_again; +#endif +} + +void loop() { +#if !defined(TEST_TX) && !defined(TEST_RX) && !defined (TEST_TO) + uint16_t to; + int c, rx; + +reset_again: +#ifdef RESET_PIN + /* wait until reset is released */ + while(!(*reset_in & reset_bit)); +#endif + sim_reset(&sim, 0); + +tx_again: +#ifdef STATUS_LED + digitalWrite(STATUS_LED, LOW); +#endif + /* send buffer until no more data to be transmitted */ + serial_start_tx(); + while ((c = sim_tx(&sim)) >= 0) { +#ifdef RESET_PIN + /* perform reset, when low */ + if (!(*reset_in & reset_bit)) + goto reset_again; +#endif + /* perform transmission of a byte */ + serial_tx(c); + } + /* wait until start bit is received or timeout */ + rx = 0; + for (to = 0; to <= SERIAL_TIMEOUT;) { + /* perform RX, when low (start bit) */ + if (!(*serial_in & serial_bit)) { + c = serial_rx(); + /* if block was completly received, go to tx_again */ + if (sim_rx(&sim, c) < 0) + goto tx_again; + /* start counting timeout condition */ + rx = 1; + to = 0; +#ifdef STATUS_LED + digitalWrite(STATUS_LED, HIGH); +#endif + } +#ifdef RESET_PIN + /* perform reset, when low */ + if (!(*reset_in & reset_bit)) + goto reset_again; +#endif + /* only if we have an ongoing reception, we count for the timeout condition */ + if (rx) + to++; + } + /* perform timeout */ + sim_timeout(&sim); + goto tx_again; +#endif +} diff --git a/src/sim/sniffer.c b/src/sim/sniffer.c new file mode 100644 index 0000000..56bc4a6 --- /dev/null +++ b/src/sim/sniffer.c @@ -0,0 +1,798 @@ +/* SIM card sniffer + * + * (C) 2020 by Andreas Eversberg + * All Rights Reserved + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef ARDUINO + +#include +#include +#include +#include "../libdebug/debug.h" +#include "sim.h" +#include "sniffer.h" + +/* Layer 7 */ + +static void rx_icl_sdu(uint8_t *data, int length) +{ + uint8_t I, cla_ccrc, ins_aprc; + uint16_t dlng; + int i; + + if (length < 3) { + PDEBUG(DSIM7, DEBUG_NOTICE, "Message too short\n"); + return; + } + + I = *data >> 7; + cla_ccrc = (*data++ & 0x7f); + ins_aprc = *data++; + dlng = *data++; + length -= 3; + + PDEBUG(DSIM7, DEBUG_INFO, "Layer 7:\n"); + if (I == 0) { + PDEBUG(DSIM7, DEBUG_INFO, " I = Command\n"); + PDEBUG(DSIM7, DEBUG_INFO, " CLA = 0x%02x\n", cla_ccrc); + switch (cla_ccrc) { + case CLA_CNTR: + PDEBUG(DSIM7, DEBUG_INFO, " -> CNTR (Control Class)\n"); + break; + case CLA_STAT: + PDEBUG(DSIM7, DEBUG_INFO, " -> STAT (Status Class)\n"); + break; + case CLA_WRTE: + PDEBUG(DSIM7, DEBUG_INFO, " -> WRTE (Write Class)\n"); + break; + case CLA_READ: + PDEBUG(DSIM7, DEBUG_INFO, " -> READ (Read Class)\n"); + break; + case CLA_EXEC: + PDEBUG(DSIM7, DEBUG_INFO, " -> EXEC (Execute Class)\n"); + break; + case CLA_AUTO: + PDEBUG(DSIM7, DEBUG_INFO, " -> AUTO (Authentication Class)\n"); + break; + default: + PDEBUG(DSIM7, DEBUG_INFO, " -> unknown class\n"); + break; + } + PDEBUG(DSIM7, DEBUG_INFO, " INS = 0x%02x\n", ins_aprc); + switch (cla_ccrc) { + case CLA_CNTR: + switch (ins_aprc) { + case SL_APPL: + PDEBUG(DSIM7, DEBUG_INFO, " -> SL-APPL (Select Application)\n"); + break; + case CL_APPL: + PDEBUG(DSIM7, DEBUG_INFO, " -> CL-APPL (Close Application)\n"); + break; + case SH_APPL: + PDEBUG(DSIM7, DEBUG_INFO, " -> SH-APPL (Show Application)\n"); + break; + } + break; + case CLA_STAT: + switch (ins_aprc) { + case CHK_KON: + PDEBUG(DSIM7, DEBUG_INFO, " -> CHK-KCON (Consistency Check)\n"); + break; + } + break; + case CLA_WRTE: + switch (ins_aprc) { + case WT_RUFN: + PDEBUG(DSIM7, DEBUG_INFO, " -> WR-RUFN (Write Rufnummernsatz)\n"); + break; + } + break; + case CLA_READ: + switch (ins_aprc) { + case RD_EBDT: + PDEBUG(DSIM7, DEBUG_INFO, " -> RD-EBDT (Read Einbuchdaten)\n"); + break; + case RD_RUFN: + PDEBUG(DSIM7, DEBUG_INFO, " -> RD-RUFN (Read Rufnummernsatz)\n"); + break; + case RD_GEBZ: + PDEBUG(DSIM7, DEBUG_INFO, " -> RD-GEBZ (Read Gebuehrenzaehler)\n"); + break; + } + break; + case CLA_EXEC: + switch (ins_aprc) { + case CHK_PIN: + PDEBUG(DSIM7, DEBUG_INFO, " -> CHK-PIN (Check PIN)\n"); + break; + case SET_PIN: + PDEBUG(DSIM7, DEBUG_INFO, " -> SET-PIN (Set PIN)\n"); + break; + case EH_GEBZ: + PDEBUG(DSIM7, DEBUG_INFO, " -> EH-GEBZ (Increment Gebuehrenzaehler)\n"); + break; + case CL_GEBZ: + PDEBUG(DSIM7, DEBUG_INFO, " -> CL-GEBZ (Clear Gebuehrenzaehler)\n"); + break; + } + break; + case CLA_AUTO: + switch (ins_aprc) { + case AUT_1: + PDEBUG(DSIM7, DEBUG_INFO, " -> AUTO-1 (Autorization)\n"); + break; + } + break; + } + } else { + PDEBUG(DSIM7, DEBUG_INFO, " I = Response\n"); + PDEBUG(DSIM7, DEBUG_INFO, " CCRC = 0x%02x\n", cla_ccrc); + if (cla_ccrc & CCRC_PIN_NOK) + PDEBUG(DSIM7, DEBUG_INFO, " -> PIN-NOT-OK\n"); + if (cla_ccrc & CCRC_AFBZ_NULL) + PDEBUG(DSIM7, DEBUG_INFO, " -> AFBZ = NULL\n"); + if (cla_ccrc & CCRC_APRC_VALID) + PDEBUG(DSIM7, DEBUG_INFO, " -> APRC valid\n"); + if (cla_ccrc & 0x08) + PDEBUG(DSIM7, DEBUG_INFO, " -> reserved\n"); + if (cla_ccrc & 0x10) + PDEBUG(DSIM7, DEBUG_INFO, " -> reserved\n"); + if (cla_ccrc & 0x20) + PDEBUG(DSIM7, DEBUG_INFO, " -> reserved\n"); + if (cla_ccrc & CCRC_ERROR) + PDEBUG(DSIM7, DEBUG_INFO, " -> GENERAL ERROR\n"); + PDEBUG(DSIM7, DEBUG_INFO, " APRC = 0x%02x\n", ins_aprc); + if (ins_aprc & APRC_PIN_REQ) + PDEBUG(DSIM7, DEBUG_INFO, " -> Bit 2 = 1:PIN-Check required\n"); + else + PDEBUG(DSIM7, DEBUG_INFO, " -> Bit 2 = 0:PIN-Check not required\n"); + if (ins_aprc & APRC_APP_LOCKED) + PDEBUG(DSIM7, DEBUG_INFO, " -> Bit 3 = 1:Application locked\n"); + else + PDEBUG(DSIM7, DEBUG_INFO, " -> Bit 3 = 0:Application unlocked\n"); + if (ins_aprc & APRC_GEBZ_LOCK) + PDEBUG(DSIM7, DEBUG_INFO, " -> Bit 5 = 1:GEBZ/RUFN locked\n"); + else + PDEBUG(DSIM7, DEBUG_INFO, " -> Bit 5 = 0:GEBZ/RUFN unlocked\n"); + if (ins_aprc & APRC_GEBZ_FULL) + PDEBUG(DSIM7, DEBUG_INFO, " -> Bit 6 = 1:GEBZ full\n"); + else + PDEBUG(DSIM7, DEBUG_INFO, " -> Bit 6 = 0:GEBZ not full\n"); + } + if (dlng == 255) { + PDEBUG(DSIM7, DEBUG_NOTICE, " Unsupported length 255!\n"); + return; + } + PDEBUG(DSIM7, DEBUG_INFO, " DLNG = %d\n", dlng); + if (dlng != length) { + PDEBUG(DSIM7, DEBUG_NOTICE, " DLNG does not match message body!\n"); + return; + } + + for (i = 0; i < length; i++) { + PDEBUG(DSIM7, DEBUG_INFO, " DATA(%d) = 0x%02x '%c' %d\n", i, data[i], (data[i] >= 32 && data[i] <= 126) ? data[i] : '.', data[i]); + } +} + +/* ICL layer */ + +static void rx_icl_pdu(uint8_t *data, int length) +{ + int icb_count, ext = 1; + + if (ext) { + if (length < 1) { + PDEBUG(DSIMI, DEBUG_NOTICE, "Message too short\n"); + return; + } + + PDEBUG(DSIMI, DEBUG_INFO, "Interface control layer ICB1:\n"); + if (*data & ICB1_ONLINE) + PDEBUG(DSIMI, DEBUG_INFO, " ON-LINE-BIT: 1 = On-line data\n"); + else + PDEBUG(DSIMI, DEBUG_INFO, " ON-LINE-BIT: 0 = Off-line data\n"); + if (*data & ICB1_CONFIRM) + PDEBUG(DSIMI, DEBUG_INFO, " CONFIRM-BIT: 1 = Confirmation\n"); + else + PDEBUG(DSIMI, DEBUG_INFO, " CONFIRM-BIT: 0 = No meaning\n"); + if (*data & ICB1_MASTER) + PDEBUG(DSIMI, DEBUG_INFO, " MASTER/SLAVE-BIT: 1 = Sender is master\n"); + else + PDEBUG(DSIMI, DEBUG_INFO, " MASTER/SLAVE-BIT: 0 = Sender is slave\n"); + if (*data & ICB1_WT_EXT) + PDEBUG(DSIMI, DEBUG_INFO, " WT-EXTENSION-BIT: 1 = Request for WT-Extension\n"); + else + PDEBUG(DSIMI, DEBUG_INFO, " WT-EXTENSION-BIT: 0 = No request for WT-Extension\n"); + if (*data & ICB1_ABORT) + PDEBUG(DSIMI, DEBUG_INFO, " ABORT/TERMINATE-BIT: 1 = Abort/Terminate request\n"); + else + PDEBUG(DSIMI, DEBUG_INFO, " ABORT/TERMINATE-BIT: 0 = No meaning\n"); + if (*data & ICB1_ERROR) + PDEBUG(DSIMI, DEBUG_INFO, " ERROR-BIT: 1 = Error\n"); + else + PDEBUG(DSIMI, DEBUG_INFO, " ERROR-BIT: 0 = No meaning\n"); + if (*data & ICB1_CHAINING) + PDEBUG(DSIMI, DEBUG_INFO, " CHAINING-BIT: 1 = More ICL data follows\n"); + else + PDEBUG(DSIMI, DEBUG_INFO, " CHAINING-BIT: 0 = No more ICL data follows\n"); + if (*data & ICB_EXT) + PDEBUG(DSIMI, DEBUG_INFO, " ICB-EXTENSION-BIT: 1 = ICB2 follows\n"); + else { + PDEBUG(DSIMI, DEBUG_INFO, " ICB-EXTENSION-BIT: 0 = no ICB follows\n"); + ext = 0; + } + data++; + length--; + } + + if (ext) { + if (length < 1) { + PDEBUG(DSIMI, DEBUG_NOTICE, "Message too short\n"); + return; + } + + PDEBUG(DSIMI, DEBUG_INFO, "Interface control layer ICB2:\n"); + if (*data & ICB2_DYNAMIC) + PDEBUG(DSIMI, DEBUG_INFO, " DYN-BUFFER-SIZE-BIT: 1 = Buffer size %d\n", (*data & ICB2_BUFFER) * 8); + else + PDEBUG(DSIMI, DEBUG_INFO, " DYN-BUFFER-SIZE-BIT: 0 = No meaning\n"); + if (*data & ICB2_ISO_L2) + PDEBUG(DSIMI, DEBUG_INFO, " ISO-7816-BLOCK-BIT: 1 = Compatible\n"); + else + PDEBUG(DSIMI, DEBUG_INFO, " ISO-7816-BLOCK-BIT: 0 = Incompatible\n"); + if (*data & ICB2_PRIVATE) + PDEBUG(DSIMI, DEBUG_INFO, " PRIVATE-USE-BIT: 1 = Private use layer 7 protocol\n"); + else + PDEBUG(DSIMI, DEBUG_INFO, " PRIVATE-USE-BIT: 0 = No meaning\n"); + if (*data & ICB_EXT) + PDEBUG(DSIMI, DEBUG_INFO, " ICB-EXTENSION-BIT: 1 = ICB3 follows\n"); + else { + PDEBUG(DSIMI, DEBUG_INFO, " ICB-EXTENSION-BIT: 0 = no ICB follows\n"); + ext = 0; + } + data++; + length--; + } + + icb_count = 2; + while (ext) { + if (length < 1) { + PDEBUG(DSIMI, DEBUG_NOTICE, "Message too short\n"); + return; + } + + PDEBUG(DSIMI, DEBUG_INFO, "Interface control layer ICB%d:\n", ++icb_count); + PDEBUG(DSIMI, DEBUG_INFO, " Value: 0x%02x\n", *data); + if (!(*data & 0x80)) + ext = 0; + data++; + length--; + } + + rx_icl_sdu(data, length); +} + +/* Layer 2 */ + +static uint8_t flip(uint8_t c) +{ + c = ((c&0x55) << 1) | ((c&0xaa) >> 1); /* 67452301 */ + c = ((c&0x33) << 2) | ((c&0xcc) >> 2); /* 45670123 */ + c = (c << 4) | (c >> 4); /* 01234567 */ + + return c; +} + +void sniffer_reset(sim_sniffer_t *sim) +{ + PDEBUG(DSIM1, DEBUG_INFO, "Resetting sniffer\n"); + memset(sim, 0, sizeof(*sim)); +} + +static void decode_ta1(sim_sniffer_t __attribute__((unused)) *sim, uint8_t c, int count) +{ + int fi = -1, di = -1; + double fmax = 0.0; + + switch (c >> 4) { + case 0: + fi = 372; fmax = 4.0; + break; + case 1: + fi = 372; fmax = 5.0; + break; + case 2: + fi = 558; fmax = 6.0; + break; + case 3: + fi = 744; fmax = 8.0; + break; + case 4: + fi = 1116; fmax = 12.0; + break; + case 5: + fi = 1488; fmax = 16.0; + break; + case 6: + fi = 1860; fmax = 20.0; + break; + case 9: + fi = 512; fmax = 5.0; + break; + case 10: + fi = 768; fmax = 7.5; + break; + case 11: + fi = 1014; fmax = 10.0; + break; + case 12: + fi = 1536; fmax = 15.0; + break; + case 13: + fi = 2048; fmax = 20.0; + break; + } + + switch (c & 0xf) { + case 1: + di = 1; + break; + case 2: + di = 2; + break; + case 3: + di = 4; + break; + case 4: + di = 8; + break; + case 5: + di = 16; + break; + case 6: + di = 32; + break; + case 7: + di = 64; + break; + case 8: + di = 12; + break; + case 9: + di = 20; + break; + } + + if (fi > 0) + PDEBUG(DSIM2, DEBUG_INFO, " TA%d Fi = %d, f(max.) = %.1f MHz\n", count, fi, fmax); + else + PDEBUG(DSIM2, DEBUG_INFO, " TA%d Fi = RFU\n", count); + if (di > 0) + PDEBUG(DSIM2, DEBUG_INFO, " TA%d Di = %d\n", count, di); + else + PDEBUG(DSIM2, DEBUG_INFO, " TA%d Di = RFU\n", count); +} + +static void decode_ta2(sim_sniffer_t __attribute__((unused)) *sim, uint8_t c, int count) +{ + PDEBUG(DSIM2, DEBUG_INFO, " TA%d T = %d\n", count, c & 0xf); + if (!(c & 0x10)) + PDEBUG(DSIM2, DEBUG_INFO, " TA%d : Fi and Di by TA1 shall apply.\n", count); + else + PDEBUG(DSIM2, DEBUG_INFO, " TA%d : Implicit values (and not Di / Di by TA1) sall apply.\n", count); + if (!(c & 0x80)) + PDEBUG(DSIM2, DEBUG_INFO, " TA%d : Capable to change negotiable/specific mode.\n", count); + else + PDEBUG(DSIM2, DEBUG_INFO, " TA%d : Unable to change negotiable/specific mode.\n", count); +} + +static void decode_tai(sim_sniffer_t *sim, uint8_t c, int count) +{ + if ((sim->atr_td & 0xf) != 14) { + PDEBUG(DSIM2, DEBUG_INFO, " TA%d Value = 0x%02x\n", count, c); + return; + } + + if (count == 3) { + switch (c & 0xf) { + case 0: + PDEBUG(DSIM2, DEBUG_INFO, " TA%d fsmin = Default\n", count); + break; + case 1: + case 2: + case 3: + PDEBUG(DSIM2, DEBUG_INFO, " TA%d fsmin = %d MHz\n", count, c & 0xf); + break; + default: + PDEBUG(DSIM2, DEBUG_INFO, " TA%d fsmin = reserved\n", count); + break; + } + + switch (c >> 4) { + case 0: + case 1: + case 2: + case 3: + PDEBUG(DSIM2, DEBUG_INFO, " TA%d fsmax = reserved\n", count); + break; + case 5: + PDEBUG(DSIM2, DEBUG_INFO, " TA%d fsmax = 5 MHz (Default)\n", count); + break; + default: + PDEBUG(DSIM2, DEBUG_INFO, " TA%d fsmax = %d MHz\n", count, c >> 4); + break; + } + } else { + PDEBUG(DSIM2, DEBUG_INFO, " TA%d Block Waiting Time = %d\n", count, c); + } +} + +static void decode_tb1(sim_sniffer_t __attribute__((unused)) *sim, uint8_t c, int count) +{ + if ((c & 0x1f) == 0) + PDEBUG(DSIM2, DEBUG_INFO, " TB%d PI1=0: VPP not connected\n", count); + else if ((c & 0x1f) == 5) + PDEBUG(DSIM2, DEBUG_INFO, " TB%d PI1=5: VPP is 5 Volts (default)\n", count); + else if ((c & 0x1f) >= 6 && (c & 0x1f) <= 25) + PDEBUG(DSIM2, DEBUG_INFO, " TB%d PI1=%d: VPP is %d Volts\n", count, c & 0x1f, (c & 0x1f) - 1); + else + PDEBUG(DSIM2, DEBUG_INFO, " TB%d PI1=%d: not defined\n", count, c & 0x1f); + PDEBUG(DSIM2, DEBUG_INFO, " TB%d II = %d\n", count, (c >> 5) & 0x3); +} + +static void decode_tb2(sim_sniffer_t __attribute__((unused)) *sim, uint8_t c, int count) +{ + PDEBUG(DSIM2, DEBUG_INFO, " TB%d Value = 0x%02x\n", count, c); +} + +static void decode_tbi(sim_sniffer_t *sim, uint8_t c, int count) +{ + if ((sim->atr_td & 0xf) != 14) { + PDEBUG(DSIM2, DEBUG_INFO, " TB%d Value = 0x%02x\n", count, c); + return; + } + + if (count == 3) { + PDEBUG(DSIM2, DEBUG_INFO, " TB%d Maximum block size = %d\n", count, c); + } else { + if (!(c & 0x01)) + PDEBUG(DSIM2, DEBUG_INFO, " TB%d XOR Checksum\n", count); + else + PDEBUG(DSIM2, DEBUG_INFO, " TB%d CRC Checksum\n", count); + if (!(c & 0x02)) + PDEBUG(DSIM2, DEBUG_INFO, " TB%d 12-etu frame\n", count); + else + PDEBUG(DSIM2, DEBUG_INFO, " TB%d 11-etu frame\n", count); + if (!(c & 0x04)) + PDEBUG(DSIM2, DEBUG_INFO, " TB%d No Chaining in ICL-Layer-Protocol\n", count); + else + PDEBUG(DSIM2, DEBUG_INFO, " TB%d Chaining in ICL-Layer-Protocol\n", count); + if (!(c & 0x08)) + PDEBUG(DSIM2, DEBUG_INFO, " TB%d Incompatible to ISO 7816 (Character Protocol)\n", count); + else + PDEBUG(DSIM2, DEBUG_INFO, " TB%d Compatible to ISO 7816 (Character Protocol)\n", count); + if (!(c & 0x10)) + PDEBUG(DSIM2, DEBUG_INFO, " TB%d No private in ICL-Layer-Protocol\n", count); + else + PDEBUG(DSIM2, DEBUG_INFO, " TB%d Private in ICL-Layer-Protocol\n", count); + if (!(c & 0x20)) + PDEBUG(DSIM2, DEBUG_INFO, " TB%d No ICB-Extension in ICL-Layer-Protocol\n", count); + else + PDEBUG(DSIM2, DEBUG_INFO, " TB%d ICB-Extension in ICL-Layer-Protocol\n", count); + } +} + +static void decode_tc1(sim_sniffer_t __attribute__((unused)) *sim, uint8_t c, int count) +{ + PDEBUG(DSIM2, DEBUG_INFO, " TC%d N = %d\n", count, c); +} + +static void decode_tc2(sim_sniffer_t __attribute__((unused)) *sim, uint8_t c, int count) +{ + PDEBUG(DSIM2, DEBUG_INFO, " TC%d Value = 0x%02x\n", count, c); +} + +static void decode_tci(sim_sniffer_t *sim, uint8_t c, int count) +{ + if ((sim->atr_td & 0xf) != 14) { + PDEBUG(DSIM2, DEBUG_INFO, " TC%d Value = 0x%02x\n", count, c); + return; + } + + PDEBUG(DSIM2, DEBUG_INFO, " TC%d Character Waiting Time = %d\n", count, c); +} + +static void decode_td(sim_sniffer_t __attribute__((unused)) *sim, uint8_t c, int count) +{ + switch (c & 0xf) { + case 0: + PDEBUG(DSIM2, DEBUG_INFO, " TD%d T=1: Half-duplex transmission of characters (ISO 7816).\n", count); + break; + case 1: + PDEBUG(DSIM2, DEBUG_INFO, " TD%d T=1: Half-duplex transmission of blocks (ISO 7816).\n", count); + break; + case 2: + case 3: + PDEBUG(DSIM2, DEBUG_INFO, " TD%d T=%d: Reserved for future full-duplex operations.\n", count, c & 0xf); + break; + case 4: + PDEBUG(DSIM2, DEBUG_INFO, " TD%d T=4: Reserved for an enhanced half-duplex transmission of characters.\n", count); + break; + case 5: + case 6: + case 7: + case 8: + case 9: + case 10: + case 11: + case 12: + case 13: + PDEBUG(DSIM2, DEBUG_INFO, " TD%d T=%d: Reserved for future use by ISO/IEC JTC 1/SC 17.\n", count, c & 0xf); + break; + case 14: + PDEBUG(DSIM2, DEBUG_INFO, " TD%d T=14: Refers to transmission protocols not standardized by ISO/IEC JTC 1/SC 17.\n", count); + break; + case 15: + PDEBUG(DSIM2, DEBUG_INFO, " TD%d T=15: Does not refer to a transmission protocol, but only qualifies global interface bytes.\n", count); + break; + } +} + +static void decode_if(sim_sniffer_t *sim, int count) +{ + switch (count) { + case 1: + if (sim->atr_if_mask & 0x10) + decode_ta1(sim, sim->atr_ta, count); + if (sim->atr_if_mask & 0x20) + decode_tb1(sim, sim->atr_tb, count); + if (sim->atr_if_mask & 0x40) + decode_tc1(sim, sim->atr_tc, count); + if (sim->atr_if_mask & 0x80) + decode_td(sim, sim->atr_td, count); + break; + case 2: + if (sim->atr_if_mask & 0x10) + decode_ta2(sim, sim->atr_ta, count); + if (sim->atr_if_mask & 0x20) + decode_tb2(sim, sim->atr_tb, count); + if (sim->atr_if_mask & 0x40) + decode_tc2(sim, sim->atr_tc, count); + if (sim->atr_if_mask & 0x80) + decode_td(sim, sim->atr_td, count); + break; + default: + if (sim->atr_if_mask & 0x10) + decode_tai(sim, sim->atr_ta, count); + if (sim->atr_if_mask & 0x20) + decode_tbi(sim, sim->atr_tb, count); + if (sim->atr_if_mask & 0x40) + decode_tci(sim, sim->atr_tc, count); + if (sim->atr_if_mask & 0x80) + decode_td(sim, sim->atr_td, count); + } + + if ((sim->atr_td >> 4)) + PDEBUG(DSIM2, DEBUG_INFO, "----------------------------------------\n"); +} + +static void decode_hist(sim_sniffer_t __attribute__((unused)) *sim, uint8_t c, int count) +{ + PDEBUG(DSIM2, DEBUG_INFO, " History byte #%d: 0x%02x\n", count, c); +} + +static void rx_atr(sim_sniffer_t *sim, uint8_t c) +{ + /* TS */ + if (sim->atr_count == 0) { + PDEBUG(DSIM1, DEBUG_INFO, "----------------------------------------\n"); + switch (c) { + case 0x3f: + PDEBUG(DSIM2, DEBUG_INFO, "Reading ATR inverse bit order:\n"); + sim->inverse_order = 1; + break; + case 0x3b: + PDEBUG(DSIM2, DEBUG_INFO, "Reading ATR normal bit order:\n"); + sim->inverse_order = 0; + break; + default: + sniffer_reset(sim); + return; + } + sim->atr_tck = c; + sim->atr_count++; + return; + } + + if (sim->inverse_order) + c = flip (c); + + sim->atr_tck ^= c; + + if (sim->atr_count == 1) { + sim->atr_t0 = c; + sim->atr_if_mask = c; + sim->atr_count++; + return; + } + + /* get TA, if included, or skip by inc. atr_count */ + if (sim->atr_count == 2) { + if (sim->atr_if_mask & 0x10) { + sim->atr_ta = c; + sim->atr_count++; + return; + } else + sim->atr_count++; + } + + /* get TB, if included, or skip by inc. atr_count */ + if (sim->atr_count == 3) { + if (sim->atr_if_mask & 0x20) { + sim->atr_tb = c; + sim->atr_count++; + return; + } else + sim->atr_count++; + } + + /* get TC, if included, or skip by inc. atr_count */ + if (sim->atr_count == 4) { + if (sim->atr_if_mask & 0x40) { + sim->atr_tc = c; + sim->atr_count++; + return; + } else + sim->atr_count++; + } + + /* get TD, if included, or skip by inc. atr_count */ + if (sim->atr_count == 5) { + if (sim->atr_if_mask & 0x80) { + sim->atr_td = c; + /* decode content */ + decode_if(sim, sim->atr_if_count + 1); + /* get new mask byte and start over */ + sim->atr_count = 2; + sim->atr_if_mask = sim->atr_td; + sim->atr_if_count++; + return; + } else + sim->atr_count++; + } + + /* decode content */ + if (sim->atr_count == 6) + decode_if(sim, sim->atr_if_count + 1); + + /* process historical character */ + if (sim->atr_count < 6 + (sim->atr_t0 & 0xf)) { + decode_hist(sim, c, sim->atr_count - 6 + 1); + sim->atr_count++; + return; + } + + if (sim->atr_tck == 0) + PDEBUG(DSIM2, DEBUG_INFO, " Checksum 0x%02x ok.\n", c); + else + PDEBUG(DSIM2, DEBUG_NOTICE, " Checksum 0x%02x error!\n", c); + + + sim->l1_state = L1_STATE_RECEIVE; + sim->block_state = BLOCK_STATE_ADDRESS; + PDEBUG(DSIM2, DEBUG_INFO, "ATR done!\n"); +} + +static void rx_char(sim_sniffer_t *sim, uint8_t c) +{ + if (sim->inverse_order) + c = flip(c); + + sim->block_checksum ^= c; + + switch (sim->block_state) { + case BLOCK_STATE_ADDRESS: + if ((c >> 4) != 1 && (c & 0xf) != 1) { + /* start over if we do not get a valid message start */ + sniffer_reset(sim); + sniffer_rx(sim, c); + return; + } + PDEBUG(DSIM1, DEBUG_INFO, "----------------------------------------\n"); + sim->block_address = c; + sim->block_state = BLOCK_STATE_CONTROL; + sim->block_checksum = c; + return; + case BLOCK_STATE_CONTROL: + sim->block_control = c; + sim->block_state = BLOCK_STATE_LENGTH; + return; + case BLOCK_STATE_LENGTH: + sim->block_length = c; + sim->block_count = 0; + sim->block_state = BLOCK_STATE_DATA; + return; + case BLOCK_STATE_DATA: + if (sim->block_count < sim->block_length) { + sim->block_data[sim->block_count++] = c; + return; + } + PDEBUG(DSIM2, DEBUG_INFO, "Layer 2:\n"); + PDEBUG(DSIM2, DEBUG_INFO, " source %d -> to %d\n", sim->block_address >> 4, sim->block_address & 0xf); + if ((sim->block_control & 0x11) == 0x00) + PDEBUG(DSIM2, DEBUG_INFO, " control I: N(S)=%d N(R)=%d\n", (sim->block_control >> 1) & 7, sim->block_control >> 5); + else if ((sim->block_control & 0x1f) == 0x09) + PDEBUG(DSIM2, DEBUG_INFO, " control REJ: N(R)=%d\n", sim->block_control >> 5); + else if (sim->block_control == 0xef) + PDEBUG(DSIM2, DEBUG_INFO, " control RES"); + else + PDEBUG(DSIM2, DEBUG_INFO, " control unknown 0x%02x\n", sim->block_control); + PDEBUG(DSIM2, DEBUG_INFO, " length %d\n", sim->block_length); + if (sim->block_checksum == 0) + rx_icl_pdu(sim->block_data, sim->block_length); + else + PDEBUG(DSIM2, DEBUG_NOTICE, "Received message with checksum error!\n"); + sim->block_state = BLOCK_STATE_ADDRESS; + } +} + +void sniffer_rx(sim_sniffer_t *sim, uint8_t c) +{ + + PDEBUG(DSIM1, DEBUG_DEBUG, "Serial RX '0x%02x'\n", c); + + switch (sim->l1_state) { + case L1_STATE_RESET: + if (c != 0x3f && c != 0x3b) { + PDEBUG(DSIM1, DEBUG_INFO, "Received garbage '0x%02x' while waiting for ATR\n", c); + break; + } + sim->l1_state = L1_STATE_ATR; + sim->atr_count = 0; + /* fall through */ + case L1_STATE_ATR: + rx_atr(sim, c); + break; + case L1_STATE_RECEIVE: + rx_char(sim, c); + break; + default: + break; + } +} + +void sniffer_timeout(sim_sniffer_t *sim) +{ + switch (sim->l1_state) { + case L1_STATE_RESET: + case L1_STATE_ATR: + if (sim->l1_state == L1_STATE_ATR && sim->atr_count) + PDEBUG(DSIM1, DEBUG_NOTICE, "Timeout while receiving ATR!\n"); + sim->l1_state = L1_STATE_ATR; + sim->atr_count = 0; + break; + case L1_STATE_RECEIVE: + if (sim->block_state != BLOCK_STATE_ADDRESS) + PDEBUG(DSIM1, DEBUG_NOTICE, "Timeout while receiving message!\n"); + sim->block_state = BLOCK_STATE_ADDRESS; + break; + default: + break; + } +} + +#endif /* ARDUINO */ diff --git a/src/sim/sniffer.h b/src/sim/sniffer.h new file mode 100644 index 0000000..be948d6 --- /dev/null +++ b/src/sim/sniffer.h @@ -0,0 +1,26 @@ + +typedef struct sim_sniffer { + enum l1_state l1_state; + int inverse_order; + int atr_count; + int atr_if_count; + uint8_t atr_if_mask; + uint8_t atr_t0; + uint8_t atr_ta; + uint8_t atr_tb; + uint8_t atr_tc; + uint8_t atr_td; + uint8_t atr_tck; + enum block_state block_state; + uint8_t block_address; + uint8_t block_control; + uint8_t block_length; + uint8_t block_count; + uint8_t block_checksum; + uint8_t block_data[256]; +} sim_sniffer_t; + +void sniffer_reset(sim_sniffer_t *sim); +void sniffer_rx(sim_sniffer_t *sim, uint8_t c); +void sniffer_timeout(sim_sniffer_t *sim); +