π
<-

Mettre des fichiers tiers sur HP-Prime, mission impossible?

Re: Mettre des fichiers tiers sur HP-Prime, mission impossib

Unread postby Persalteas » 28 Oct 2013, 10:23

Pas (en tout cas moins) de problèmes sous linux, donc ?

Tu vas publier les deux versions en même temps ?
User avatar
PersalteasMembre UPECS
Niveau 16: CC2 (Commandeur des Calculatrices)
Niveau 16: CC2 (Commandeur des Calculatrices)
Level up: 6.2%
 
Posts: 2337
Images: 113
Joined: 04 Feb 2010, 00:00
Location: Evry (France)
Gender: Male
Calculator(s):
MyCalcs profile
Class: PhD candidate, Bioinformatics

Re: Mettre des fichiers tiers sur HP-Prime, mission impossib

Unread postby Lionel Debroux » 28 Oct 2013, 11:38

Pas (en tout cas moins) de problèmes sous linux, donc ?

Je ne sais pas (mais très certainement): critor ne teste que sur Windows, et je n'ai pas de Prime.
Le code compile, en principe, sous Linux (même si je n'ai pas testé la compilation des derniers changements).

Tu vas publier les deux versions en même temps ?

Oui, même si une des versions ne sera alors pas testée - à moins de trouver un beta-testeur Linux :)
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
User avatar
Lionel DebrouxSuper Modo
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Level up: 11.3%
 
Posts: 6865
Joined: 23 Dec 2009, 00:00
Location: France
Gender: Male
Calculator(s):
MyCalcs profile
Class: -
GitHub: debrouxl

Re: Mettre des fichiers tiers sur HP-Prime, mission impossib

Unread postby Persalteas » 28 Oct 2013, 11:40

J'ai un linux et une Prime si tu veux.
User avatar
PersalteasMembre UPECS
Niveau 16: CC2 (Commandeur des Calculatrices)
Niveau 16: CC2 (Commandeur des Calculatrices)
Level up: 6.2%
 
Posts: 2337
Images: 113
Joined: 04 Feb 2010, 00:00
Location: Evry (France)
Gender: Male
Calculator(s):
MyCalcs profile
Class: PhD candidate, Bioinformatics

Re: Mettre des fichiers tiers sur HP-Prime, mission impossib

Unread postby Lionel Debroux » 29 Oct 2013, 07:36

Avant de pouvoir tester vraiment, il faudrait déjà que j'arrive à comprendre le protocole...

Actuellement, je bloque sur la vérification d'intégrité embarquée dans les paquets. Pour le backup, je peux ignorer cette valeur, mais l'envoi et la réception de fichiers individuels ne fonctionneront pas si je ne mets pas la bonne valeur dans la requête (enfin, j'imagine - je n'ai pas essayé, en fait...) - donc il faudrait trouver l'algorithme de calcul, ce que je ne parviens pas à faire...
La valeur de vérification d'intégrité est 16 bits (ça se voit dans les paquets ci-dessous), comme dans les fichiers pour calculatrices TI d'ailleurs. Elle est située vers le début du paquet (à la fin dans les fichiers pour les machines TI). Elle change avec le nom du programme ou son contenu, donc les deux (nom et contenu) sont intégrés dans son calcul, ce qui est au demeurant tout à fait logique.

J'ai fait un programme de brute-force qui calcule CRC et checksum sur de petits paquets (correspondant à des listes L5, L6 et L7), bien entendu après avoir enlevé le checksum lui-même aux offsets 9 et 10. Il montre que ce n'est manifestement pas un checksum, car les valeurs atteintes ne sont pas assez élevées... mais à la fin du programme, le tableau hits ne contient que des 0, ce qui veut dire que l'intersection des patterns possibles pour les trois paquets est vide :(

Code: Select all
#include <inttypes.h>
#include <stdio.h>
#include <string.h>

// Slow but short and easy to modify with a different poly. Can use a LUT-based implementation later.
static uint16_t crc16_update(uint16_t crc, uint8_t a, uint32_t pattern) {
    int i;

    crc ^= a;
    for (i = 0; i < 8; ++i) {
        if (crc & 1) {
            // IBM: 0x8005 0xA001 0xC002
            // CCITT: 0x1021 0x8408 0x8810
            crc = (crc >> 1) ^ (uint16_t)pattern;
        }
        else {
            crc = (crc >> 1);
        }
    }

    return crc;
}

// File with declared checksum: 0x57 0x9D at offset 9-10
static const uint8_t array2[] = {
0x00, 0xf7, 0x01, 0x00, 0x00, 0x00, 0x10, 0x03, 0x04, 0x00, 0x00, 0x4c, 0x00, 0x35, 0x00, 0x01,
0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x06, 0x10, 0x00, 0x00, 0x74, 0x02, 0x38, 0x30,
0x20, 0xd4, 0x67, 0x31, 0x38, 0xd3, 0x67, 0x31, 0x38, 0xd4, 0x67, 0x31, 0x40, 0x8d, 0x65, 0x31,
0x94, 0x1c, 0x27, 0x31, 0x08, 0x2d, 0x27, 0x31, 0x0c, 0x2d, 0x27, 0x31, 0x00, 0x00, 0x00, 0x00
};

// File with declared checksum: 0x8B 0x06 at offset 9-10
static const uint8_t array3[] = {
0x00, 0xf7, 0x01, 0x00, 0x00, 0x00, 0x10, 0x03, 0x04, 0x00, 0x00, 0x4c, 0x00, 0x36, 0x00, 0x01,
0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x06, 0x10, 0x00, 0x00, 0x74, 0x02, 0x38, 0x30,
0x28, 0xd4, 0x67, 0x31, 0x38, 0xd3, 0x67, 0x31, 0x38, 0xd4, 0x67, 0x31, 0x40, 0x8d, 0x65, 0x31,
0x94, 0x1c, 0x27, 0x31, 0x08, 0x2d, 0x27, 0x31, 0x0c, 0x2d, 0x27, 0x31, 0x00, 0x00, 0x00, 0x00
};

// File with declared checksum: 0x3F 0x70 at offset 9-10
static const uint8_t array4[] = {
0x00, 0xf7, 0x01, 0x00, 0x00, 0x00, 0x10, 0x03, 0x04, 0x00, 0x00, 0x4c, 0x00, 0x37, 0x00, 0x01,
0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x06, 0x10, 0x00, 0x00, 0x74, 0x02, 0x38, 0x30,
0x30, 0xd4, 0x67, 0x31, 0x38, 0xd3, 0x67, 0x31, 0x38, 0xd4, 0x67, 0x31, 0x40, 0x8d, 0x65, 0x31,
0x94, 0x1c, 0x27, 0x31, 0x08, 0x2d, 0x27, 0x31, 0x0c, 0x2d, 0x27, 0x31, 0x00, 0x00, 0x00, 0x00
};

#define CHUNK 64

static uint8_t hits[65536];

static void brute_force(const uint8_t * array, uint32_t size, uint32_t min_start_offset, uint32_t max_start_offset, uint32_t min_end_offset, uint32_t max_end_offset, uint16_t target1, uint16_t target2) {
    #pragma omp parallel for schedule(static, CHUNK)
    for (uint32_t xor_pattern = 0; xor_pattern <= 0xFFFF; xor_pattern++) {
        int found = 0;
        if (!(xor_pattern & (0x3FF))) {
            printf("%" PRIX32 "\n", xor_pattern);
        }
        for (int skip = 0; skip < 2; skip++) {
            for (uint32_t start_offset = min_start_offset; start_offset <= max_start_offset; start_offset++) {
                for (uint32_t end_offset = min_end_offset; end_offset <= max_end_offset; end_offset++) {
                    uint16_t computed_crc = 0xFFFF;
                    uint16_t computed_checksum = 0;
                    const uint8_t * ptr;
                    uint32_t i;
                    for (i = start_offset, ptr = &array[start_offset]; i < size - end_offset; i++, ptr++) {
                        uint8_t data = *ptr;
                        // Skip leading 0 in packets, which is not supposed to be part of the content.
                        if (skip && !(i & 63)) {
                            data = *ptr++;
                        }
                        computed_crc = crc16_update(computed_crc, data, xor_pattern);
                        computed_checksum += data;
                    }
                    if (computed_crc == target1 || computed_crc == target2 || computed_checksum == target1 || computed_checksum == target2) {
                        printf("pattern=%" PRIX16 "\tskip=%d\tstart_offset=%" PRIu32 "\tend_offset=%" PRIu32 "\tcomputed_crc=%" PRIX16 "\tcomputed_checksum=%" PRIX16"\n",
                               xor_pattern, skip, start_offset, end_offset, computed_crc, computed_checksum);
                        found = 1;
                    }
                }
            }
        }
        if (!found) {
            hits[xor_pattern] = 0;
        }
    }
}

int main(int argc, char * argv[]) {
    memset(hits, 1, sizeof(hits));
    puts("Array2");
    brute_force(array2, sizeof(array2)/sizeof(array2[0]), 0, 12, 0, 48, 0x579D, 0x9D57);
    puts("Array3");
    brute_force(array3, sizeof(array3)/sizeof(array3[0]), 0, 12, 0, 48, 0x8B06, 0x068B);
    puts("Array4");
    brute_force(array4, sizeof(array4)/sizeof(array4[0]), 0, 12, 0, 48, 0x3F70, 0x703F);
    puts("done");
    for (uint32_t i = 0; i < sizeof(hits)/sizeof(hits[0]); i++) {
        if (hits[i] != 0) {
            printf("Hit: %" PRIu32 "\n", i);
        }
    }

    return 0;
}


Quelqu'un aurait-il des idées ? Ca commence par relire mon code et voir si je n'aurais pas fait de grosse bêtise (il y en avait une hier soir) empêchant le programme de trouver, mais ça peut aller jusqu'à trouver un autre algorithme de calcul possible pour la valeur d'intégrité (mais il n'y en a pas beaucoup pour produire une valeur 16 bits !) ;)

array1 est un tableau beaucoup plus gros, qui n'apporte rien ici, je l'ai donc enlevé.
Le programme peut être compilé avec OpenMP (GCC, Clang: -fopenmp). Sur ma machine de 2011, il s'exécute en une quinzaine de secondes, sur 8 threads. Le code nécessite C99 et utilise inttypes.h, donc il ne compile pas out of the box avec cette merde de cl.exe (le compilo de MS, qui refuse d'implémenter ce standard vieux de 14 ans): il faut au moins ajouter une paire inttypes.h+stdint.h trouvée sur Internet.

Merci d'avance :)
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
User avatar
Lionel DebrouxSuper Modo
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Level up: 11.3%
 
Posts: 6865
Joined: 23 Dec 2009, 00:00
Location: France
Gender: Male
Calculator(s):
MyCalcs profile
Class: -
GitHub: debrouxl

Re: Mettre des fichiers tiers sur HP-Prime, mission impossib

Unread postby Persalteas » 29 Oct 2013, 08:15

bien entendu après avoir enlevé le checksum lui-même aux offsets 9 et 10.

Désolé pour mon manque de culture, je connais le principe du checksum pour vérifier l'intégrité, mais qu'est-ce qu'un offset ?
User avatar
PersalteasMembre UPECS
Niveau 16: CC2 (Commandeur des Calculatrices)
Niveau 16: CC2 (Commandeur des Calculatrices)
Level up: 6.2%
 
Posts: 2337
Images: 113
Joined: 04 Feb 2010, 00:00
Location: Evry (France)
Gender: Male
Calculator(s):
MyCalcs profile
Class: PhD candidate, Bioinformatics

Re: Mettre des fichiers tiers sur HP-Prime, mission impossib

Unread postby Lionel Debroux » 29 Oct 2013, 08:20

Offset = décalage, ici par rapport au début du paquet. J'ai remplacé deux octets par 0x00, 0x00 dans chacun des paquets, puisque le checksum ne peut pas faire partie de lui-même :)
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
User avatar
Lionel DebrouxSuper Modo
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Level up: 11.3%
 
Posts: 6865
Joined: 23 Dec 2009, 00:00
Location: France
Gender: Male
Calculator(s):
MyCalcs profile
Class: -
GitHub: debrouxl

Re: Mettre des fichiers tiers sur HP-Prime, mission impossib

Unread postby Persalteas » 29 Oct 2013, 09:00

Ah, tout simplement - Merci ;)
User avatar
PersalteasMembre UPECS
Niveau 16: CC2 (Commandeur des Calculatrices)
Niveau 16: CC2 (Commandeur des Calculatrices)
Level up: 6.2%
 
Posts: 2337
Images: 113
Joined: 04 Feb 2010, 00:00
Location: Evry (France)
Gender: Male
Calculator(s):
MyCalcs profile
Class: PhD candidate, Bioinformatics

Re: Mettre des fichiers tiers sur HP-Prime, mission impossib

Unread postby Lionel Debroux » 01 Nov 2013, 21:49

* sur Omnimaga, Tim Wessman a débloqué la situation en fournissant des infos qui permettent de calculer le CRC correctement. Je ne sais toujours pas pourquoi mon programme de brute-forcing ne fonctionnait pas, mais ce n'est plus très grave.
* pour les screenshots, le CRC semble différent, et je n'ai pas trouvé non plus comment le calculer. C'est moins grave que pour les fichiers, car à court terme, on peut ignorer le CRC des screenshots (alors que sans CRC correct, pas d'envoi de fichiers).
* l'envoi de fichiers marchouille depuis ce soir, encore des problèmes à régler, et davantage de tests à faire;
* la réception de fichiers individuels n'est pas testée, donc elle ne fonctionne très probablement pas, comme presque tout code non testé :)
* il faudra faire des expériences pour documenter et trouver davantage de commandes actuellement inconnues, à commencer par la commande bizarre 0xE7 envoyée par le HP Connectivity Kit, qui ne semble pas nécessaire pour communiquer correctement avec la machine. Si on trouve une commande de type dirlist, comme sur les TI-Z80, TI-68k et Nspire, ça sera pas mal... parce que sans une telle commande (= si le backup complet est la seule façon de savoir ce que contient la machine), la gestion des données sur la machine va être désagréable, même pour des tailles de données assez limitées, à cause du faible taux de transfert.
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
User avatar
Lionel DebrouxSuper Modo
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Level up: 11.3%
 
Posts: 6865
Joined: 23 Dec 2009, 00:00
Location: France
Gender: Male
Calculator(s):
MyCalcs profile
Class: -
GitHub: debrouxl

Previous

Return to News HP

Who is online

Users browsing this forum: ClaudeBot [spider] and 1 guest

-
Search
-
Social TI-Planet
-
Featured topics
Comparaisons des meilleurs prix pour acheter sa calculatrice !
"1 calculatrice pour tous", le programme solidaire de Texas Instruments. Reçois gratuitement et sans aucune obligation d'achat, 5 calculatrices couleur programmables en Python à donner aux élèves les plus nécessiteux de ton lycée. Tu peux recevoir au choix 5 TI-82 Advanced Edition Python ou bien 5 TI-83 Premium CE Edition Python.
Enseignant(e), reçois gratuitement 1 exemplaire de test de la TI-82 Advanced Edition Python. À demander d'ici le 31 décembre 2024.
Aidez la communauté à documenter les révisions matérielles en listant vos calculatrices graphiques !
1234
-
Donations / Premium
For more contests, prizes, reviews, helping us pay the server and domains...
Donate
Discover the the advantages of a donor account !
JoinRejoignez the donors and/or premium!les donateurs et/ou premium !


Partner and ad
Notre partenaire Jarrety Calculatrices à acheter chez Calcuso
-
Stats.
714 utilisateurs:
>690 invités
>17 membres
>7 robots
Record simultané (sur 6 mois):
6892 utilisateurs (le 07/06/2017)
-
Other interesting websites
Texas Instruments Education
Global | France
 (English / Français)
Banque de programmes TI
ticalc.org
 (English)
La communauté TI-82
tout82.free.fr
 (Français)