Why do I need to delete the applet's package to delete my applet? - javacard

I have an empty Javacard as below:
user#system$ java -jar gp.jar --list
ISD: A000000003000000 (OP_READY)
Privs: SecurityDomain, CardLock, CardTerminate, CardReset, CVMManagement
And I have installed a weird applet on it:
user#system$ java -jar gp.jar --install applet.cap
CAP loaded
user#system$
Well, the applet is installed successfully:
user#system$ java -jar gp.jar --list
ISD: A000000003000000 (OP_READY)
Privs: SecurityDomain, CardLock, CardTerminate, CardReset, CVMManagement
APP: 01020304050601(SELECTABLE)
PKG: 010203040506(LOADED)
user#system$
But when I am try to delete the applet I fail:
user#system$ java -jar gp.jar --delete 01020304050601 --debug --verbose
# Successful Mutual Authentication with Security Level = 01 (CMAC)
A>> 84F28002 0A 4F00<CMAC> 00
A<< E3114F08A0000000030000009F700101C5019E 9000
A>> 84F24002 0A 4F00<CMAC> 00
A<< E3104F07010203040506019F700107C50100 9000
A>> 84F21002 0A 4F00<CMAC> 00
A<< E30F4F060102030405069F700101C50100 9000
A>> 84F22002 0A 4F00<CMAC> 00
A<< E30C4F060102030405069F700101 9000
A>> 84E40000 11 4F0701020304050601<CMAC>
A<< 6985
Could not delete D3646467329901. Some app still active?
I have tried the following forms of delete command too:
user#system$ java -jar gp.jar --delete 01020304050601 --force ==> Same result
user#system$ java -jar gp.jar --delete 010203040506 ==> Same result
The only successful form which I can use to delete the applet, is as below:
user#system$ java -jar gp.jar --delete 010203040506 --force
# Successful Mutual Authentication with Security Level = 01 (CMAC)
A>> 84F28002 0A 4F00<CMAC> 00
A<< E3114F08A0000000030000009F700101C5019E 9000
A>> 84F24002 0A 4F00<CMAC> 00
A<< E3104F07010203040506019F700107C50100 9000
A>> 84F21002 0A 4F00<CMAC> 00
A<< E30F4F060102030405069F700101C50100 9000
A>> 84F22002 0A 4F00<CMAC> 00
A<< E30C4F060102030405069F700101 9000
A>> 84E40080 10 4F06010203040506<CMAC>
A<< 9000
The applet and its packages is gone now:
user#system$ java -jar gp.jar --list
ISD: A000000003000000 (OP_READY)
Privs: SecurityDomain, CardLock, CardTerminate, CardReset, CVMManagement
Question: Why do I need to delete the package to delete the applet itself?
Note that this situation appears for a specific cap file only.
FYI: I have tried different tools (Including gpshell, pyapdu, etc.) and I got same results.

The uninstallation process of the applet does not run successfully, therfore the applet instance cannot be deleted alone, most probably you have static content like private static transient byte array declared in the applet code. In this case you must deinitialize any static objects to null by overriding Applet's uninstall method. Check object ownership in the JCRE to understand the problem

Related

How to make CAN bus operate from within a docker container?

I successfully dockerized my nodejs app running on a Beaglebone black. But now I'd like to access to the CAN from within the docker container but it doesn't work.
Note that I successfully configured the CAN ports in the host and candump shows it works.
$ candump can1
can1 18FF30D0 [8] 00 00 00 00 00 00 00 00
can1 18FF02D0 [4] 00 00 00 00
can1 18FF21D0 [3] 00 00 00
can1 18FF3CD0 [4] 00 7D 28 7D
can1 18FF30D0 [8] 00 03 00 00 00 00 00 00
can1 18FF02D0 [4] 00 00 00 00
I build socketcan node module in my Dockerfile as follows:
#If you don't have node/npm already, add that first
RUN apk add --no-cache nodejs
# Add the necessary build and runtime dependencies (see https://stackoverflow.com/questions/36202095/node-serialport-failing-on-alpine-linux)
RUN apk add --no-cache make gcc g++ python3 linux-headers udev
#RUN apk add --no-cache --virtual .gyp python3 make g++
RUN npm install
Once I run my app from the container, I get the following exception:
-- 🟡- 🚎 Canbus:can0: switched to channel "can0"…
Pepsr v2.1.192 5:36:40 PM 📈 [pepsr-iingenierie] -- 🟡- 🚎 Canbus:can0: cancel CAN as other channel "can0" doesn’t work either
Pepsr v2.1.192 5:36:40 PM 📈 [pepsr-iingenierie] -- 🔴- 🚎 Canbus:can0: Error: Error while creating channel
at Object.exports.createRawChannel (/home/debian/Desktop/devel/iot/node_modules/socketcan/socketcan.js:38:12)
at Canbus._connect (/home/debian/Desktop/devel/iot/pepsr.ddk.protocol.canBus.js:308:34)
at Canbus.connect (/home/debian/Desktop/devel/iot/pepsr.module.js:272:9)
at Object.<anonymous> (/home/debian/Desktop/devel/iot/pepsr.js:608:20)
at Module._compile (internal/modules/cjs/loader.js:1015:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1035:10)
at Module.load (internal/modules/cjs/loader.js:879:32)
at Function.Module._load (internal/modules/cjs/loader.js:724:14)
at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:60:12)
at internal/main/run_main_module.js:17:47
Thanks to the contributors who led me to a solution.
I finally found that the easiest way to let the container access to the host CAN bus is to use the --network parameter as follows:
$ docker run --rm --network=host <your image>
Forwarding network interfaces to Docker is more or less described here: Sharing virtual network with docker container

External USB 3.0 HDD Spin down and power off when powering off or rebooting the Raspberry Pi 4B

An external USB 3.0 HDD Seagate Expantion Drive 1TB is connected to my Raspberry Pi 4B on the Raspbian Buster.
The hard drive rarely works, so the first thing I would like it to shut down during idle time (rotation stopped).
I must say right away that I tried the "hdparm" utility, but it absolutely does not work for me. On my old Raspberry Pi 3B +, it did its job perfectly, but it doesn’t work at all on the new one.
I tried doing
sudo hdparm -S 10 / dev / sda1
and
sudo hdparm -Y / dev / sda1
But all he gives out is
/dev/sda:
issuing sleep command
SG_IO: bad / missing sense data, sb []: 70 00 05 00 00 00 00 0a 00 00 00 00 24 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
At the same time, the disk continues to rotate and the LED on the case is on, no matter how much I wait
I also tried to register the following settings in hdparm.conf:
/dev/sda1 {
spindown_time = 20
}
But this also did not give any effect, the disk continues to rotate.
Also, knowing that udisks2 is installed in the raspbian buster, I tried to create a configuration file Seagate_Expansion_NA4B2GTR-0: 0.conf (this is exactly what the command "udevadm info / dev / sda" gave me) in the directory /etc/udisks2/ with the contents
[ATA]
StandbyTimeout = 20
But it didn't work either.
The fact that the disk does not stop spinning is my first problem. The second problem is that when you turn off or restart Raspberry, the disk does not park its heads and its power is interrupted abruptly, which causes a very unpleasant rattle. I found similar queries on the Internet, this is a very common problem.
I would like that during the procedure of shutting down the OS, the disk should be correctly unmounted and its power turned off before power is lost on the USB 3.0 port.
Fortunately, I was able to write a similar script and it works great:
hddshutdown.sh
sudo umount -f /dev/sda1
sudo udisksclt power-off -b /dev/sda1
sleep 5
If I run this script just while the OS is running, it does exactly what I need: The disk is unmounted, the disk rotation stops and the LED on the case goes out. However, I cannot get this script to work the same way during the OS shutdown procedure.
I wrote this unit for systemd:
hddshutdown.service in /usr/lib/systemd/system/
[Unit]
Description=[=======USB-HDD-spindown============]
DefaultDependencies=no
After=umount.target
Before=shutdown.target poweroff.target reboot.target halt.target
[Service]
ExecStart=/bin/sh /home/pi/hddshutdown.sh
Type=oneshot
RemainAfterExit=yes
[Install]
WantedBy=reboot.target
I did "sudo systemctl enable hddshutdown", tried several different configuration options, played with different Before, After, and WantedBy values, but none of the options worked, just one, the drive is successfully unmounted, but the power does not turn off, the drive continues to spin and LED is on until the moment the Pi is turned off. Moreover, I know for sure that the sh-script starts exactly, the "sleep" delay, which I set at the end of the script, really works.
I do not know Linux very well and this was my first experience writing units for systemd. I found information that udisksctl needs DBus to work, but it doesn’t exist during shutdown, and that’s why the drive’s power cannot turn off. I could not find a way to execute this unit as early as possible during the shutdown procedure when DBus is still available. (I don’t even know what it is, maybe I said stupidity)
Please help me solve 2 of these problems, thanks in advance.
I myself found the answer to my question. Because I use the Seagate Expansion drive, I used the Seagate Dashboard program from the official site to "reprogram" my hard drive. I was able to turn off the external LED-indicator and set the rotation shutdown time to 10 minutes and now on any system the hard disk is turned off after 10 minutes. Using programs like hdparm or udisks is no longer required!
What worked for me to make my HDD spin-down automatically when idle was this new implementation of hd-idle.
My particular setup is: Raspberry Pi 4B + Suptronics X835 + WD Blue WD20EZRZ.
Non of the other usual tools worked for me (hdparm, original hd-idle).

Raspberry Pi 3 B+ (Buster) can't control Dynamixel AX-12A with Raspberry Pi 3 B+ (Buster) with half duplex communication

I have a project to make mobile robot with Dynamixel AX-12A as the wheel, so i changes the AX-12A to Wheel Mode with CM-530 and it works well.
I follow the guide from http://www.oppedijk.com/robotics/control-dynamixel-with-raspberrypi
I already check my serial communication (UART) on Raspi using Terminal Minicom with only wiring up GPIO14 and GPIO15 together and it works well
Here is my /boot/config.txt at the end of code:
dtoverlay=pi3-disable-bt
hdmi_force_hotplug=1
enable_uart=1
init_uart_clock=16000000
Here is my /boot/cmdline.txt:
dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p7 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait splash plymouth.ignore-serial-consoles
Here is my Python3 Code:
import serial
import time
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(18, GPIO.OUT)
GPIO.setwarnings(False)
port = serial.Serial("/dev/ttyAMA0", baudrate=1000000, timeout=3.0)
while True:
GPIO.output(18, GPIO.HIGH)
port.write(bytearray.fromhex("FF FF 00 04 03 20 FF D8"))
time.sleep(0.1)
GPIO.output(18, GPIO.LOW)
time.sleep(3)
The problem is dynamixel ax-12a not responding to my hexa which should move with value 255. And there is no error feedback from program.
Btw i'm working this project with VNC through wifi in PC, did this cause problems with the communication?
If someone could help me, i thank you.
*sorry if i have bad english
After very long discussion, now i can control the motor, the problem is i sent the wrong instruction packet FF FF 00 04 03 20 FF D8, it should be FF FF 00 05 03 20 FF 00 D8.

Installing a SIM Toolkit applet on a Java Card fails with SW 6A88

I have been trying to install a very small sample applet using SIM toolkit features, such as uicc.toolkit.ProactiveHandler. After writing the applet and generating a file, sampleapp.cap, using the converter tool from the Java Card SDK I was unable to install sampleapp.cap file on the Java Card I was using for development. I am using global platform pro, and am getting a 6a88 SW in response when trying to load the applet.
To build:
converter -classdir build -applet $APP_AID sampleapp.SampleToolkitApp sampleapp $PKG_AID 1.0 (generates build/sampleapp/javacard/sampleapp.cap)
To install (with java card reader insterted):
gp -d -v --install build/sampleapp/javacard/sampleapp.cap
output:
A>> T=1 (4+0000) 00A40400 00
A<< (0018+2) (45ms) 6F108408A000000003000000A5049F6501FF 9000
[DEBUG] GlobalPlatform - Auto-detected ISD AID: A000000003000000
[DEBUG] GlobalPlatform - Auto-detected block size: 255
A>> T=1 (4+0008) 80500000 08 6CB661C0B31315CB 00
A<< (0028+2) (117ms) 00003126960097F931740102007110F669CA335E5BAF5F8BF724DC1E 9000
[DEBUG] GlobalPlatform - Host challenge: 6CB661C0B31315CB
[DEBUG] GlobalPlatform - Card challenge: 007110F669CA335E
[DEBUG] GlobalPlatform - Card reports SCP02 with version 1 keys
[DEBUG] PlaintextKeys - session keys:
ENC: Ver:0 ID:0 Type:DES3 Len:16 Value:5246B7B44BB830257A6546CF9FF70413 KCV: 9E246B
MAC: Ver:0 ID:0 Type:DES3 Len:16 Value:250DC88427E2C97165280D315EB39640 KCV: 8FE051
KEK: Ver:0 ID:0 Type:DES3 Len:16 Value:AD1197EAA5AAB912CB91F82C7B7DC125 KCV: 55D1A7
[DEBUG] GlobalPlatform - Verified card cryptogram: 5BAF5F8BF724DC1E
[DEBUG] GlobalPlatform - Calculated host cryptogram: 608223EB1CE199AA
A>> T=1 (4+0016) 84820100 10 608223EB1CE199AA6AA94AAC2B12D3C2
A<< (0000+2) (42ms) 9000
CAP file (v2.1) generated on Wed Jun 29 14:12:28 EDT 2016
By Sun Microsystems Inc. converter 1.3 with JDK 1.7.0_80 (Oracle Corporation)
Package: sampleapp v1.0 with AID B115737612
Applet: SampleToolkitApp with AID B1157376121E
Import: A0000000620101 v1.2
Import: A0000000090003FFFFFFFF8910710002 v2.6
Total code size: 445 bytes (672 with debug)
SHA256 (code): E4E65C31237BDA2CF893A4145309C1DA541290028EF7E8B3AEEC1279C58DF805
SHA1 (code): 97C8E9C2E364E4185D501552430FCF65A80A9CCF
A>> T=1 (4+0010) 84F28002 0A 4F00D59C73CC637DAD77 00
A<< (0000+2) (46ms) 6A86
A>> T=1 (4+0010) 84F28000 0A 4F0072678A1AE9D9D06E 00
A<< (0011+2) (50ms) 08A000000003000000079E 9000
A>> T=1 (4+0010) 84F24000 0A 4F0006A4F0528D4EFB48 00
A<< (0009+2) (54ms) 064DF87F7FB8BE0700 9000
A>> T=1 (4+0010) 84F22000 0A 4F0092C86D9389102AD4 00
A<< (0051+2) (68ms) 07A0000000035344010007A0000000035350010009534B544558544C4942010008A0000002270110000100054DF87F7FB80100 9000
A>> T=1 (4+0010) 84F21000 0A 4F001D7AC0FD69CBCB37 00
A<< (0000+2) (46ms) 6A81
[WARN] GlobalPlatform - GET STATUS failed for 80F21000024F0000 with 6a81
A>> T=1 (4+0026) 84E60200 1A 05B11573761208A0000000030000000000009BDAA789A47D5BB5
A<< (0001+2) (138ms) 00 9000
A>> T=1 (4+0255) 84E80000 FF C48201BD01000FDECAFFED010204000105B11573761202001F000F001F000A001E0042002700B40012001D000000E000050002000202010004001E02020107A0000000620101060210A0000000090003FFFFFFFF891071000203000A0106B1157376121E008006002700800300FF00040400000027FFFF001A002E42800301FF000702000000AE00B1800200810101080700B40005318F00013D181D1E8C000F2E1B8B00027A0140188C00037A02107C0004076D0504700303780110038000047A0421188B000560037A198B00062D7C000404415B8000041A032510806A08116E008D00071A042510206B227C0004076C081169868D00479BF5BDFAB2F540
A<< (0000+2) (1s213ms) 6A88
pro.javacard.gp.GPException: LOAD failed SW: 6A88
at pro.javacard.gp.GPException.check(GPException.java:66)
at pro.javacard.gp.GlobalPlatform.loadCapFile(GlobalPlatform.java:667)
at pro.javacard.gp.GlobalPlatform.loadCapFile(GlobalPlatform.java:625)
at pro.javacard.gp.GPTool.main(GPTool.java:518)
LOAD failed SW: 6A88
Using the SmartCafe Expert 3.2 72k, which I purchased as a Java Card. Also using JavaCard SDK 2.2.1, which is the supported version for that card, and have used both 3GPP TS 43.019 v6.0.0 STK API technical specification and ETSI TS 102 241 13.0.0 UICC API for Java Card.
The 6A88 SW indicates "referenced data not found". Is this something specific to my card, in that it hasn't implemented the STK stack?
SmartCafe Expert 3.2 72k is a simple regular Java Card and does not contain SIM Toolkit APIs inside. So it can't install those applets that used SIM Toolkit APIs.
In the loading process, the OPEN on the card is trying to make a link between your applet and the used libraries. As it can't find SIM Toolkit library there, it returns this error.

How to reorder the services startup - CentOS?

I have added a new service to my CentOS box. It should be started after the mounting the file systems.
Would appreciate your assistance,
Liora
You can add the following line in /etc/init.d/<your-service-script> file.
chkconfig: - 00 99
This denotes it will start the service number as 00 (first) and while stopping it is 99 (almost last).
You can make it as 01 and it would be better.

Resources