Пример #1
0
int iriver_decode(const char *infile_name, const char *outfile_name, BOOL modify,
                  enum striptype stripmode )
{
    FILE * infile = NULL;
    FILE * outfile = NULL;
    int i = -1;
    unsigned char headerdata[512];
    unsigned long dwLength1, dwLength2, dwLength3, fp = 0;
    unsigned char blockdata[16+16];
    unsigned char out[16];
    unsigned char newmunge;
    signed long lenread;
    int s = 0;
    unsigned char * pChecksums, * ppChecksums = 0;
    unsigned char ck;

    infile = openinfile(infile_name);
    outfile = openoutfile(outfile_name);

    lenread = fread( headerdata, 1, 512, infile );
    if( lenread != 512 )
    {
        fprintf( stderr, "This doesn't look like a valid encrypted iHP "
                 "firmware - reason: header length\n" );
        fclose(infile);
        fclose(outfile);
        return -1;
    };

    i = testheader( headerdata );
    if( i == -1 )
    {
        fprintf( stderr, "This firmware is for an unknown model, or is not"
                 " a valid encrypted iHP firmware\n" );
        fclose(infile);
        fclose(outfile);
        return -2;
    };
    fprintf( stderr, "Model %s\n", models[ i ] );

    dwLength1 = headerdata[0] | (headerdata[1]<<8) |
        (headerdata[2]<<16) | (headerdata[3]<<24);
    dwLength2 = headerdata[4] | (headerdata[5]<<8) |
        (headerdata[6]<<16) | (headerdata[7]<<24);
    dwLength3 = headerdata[8] | (headerdata[9]<<8) |
        (headerdata[10]<<16) | (headerdata[11]<<24);

    if( dwLength1 < firmware_minsize[ i ] ||
        dwLength1 > firmware_maxsize[ i ] ||
        dwLength2 < firmware_minsize[ i ] ||
        dwLength2 > dwLength1 ||
        dwLength3 > dwLength1 ||
        dwLength2>>9 != dwLength3 ||
        dwLength2+dwLength3+512 != dwLength1 )
    {
        fprintf( stderr, "This doesn't look like a valid encrypted "
                 "iHP firmware - reason: file 'length' data\n" );
        fclose(infile);
        fclose(outfile);
        return -3;
    };

    pChecksums = ppChecksums = (unsigned char *)( malloc( dwLength3 ) );

    if( modify )
    {
        modifyheader( headerdata );
    };

    if( stripmode == STRIP_NONE )
        fwrite( headerdata, 512, 1, outfile );

    memset( blockdata, 0, 16 );

    ck = 0;
    while( ( fp < dwLength2 ) &&
           ( lenread = fread( blockdata+16, 1, 16, infile ) ) == 16 )
    {
        fp += 16;

        for( i=0; i<16; ++i )
        {
            newmunge = blockdata[16+i] ^ munge[i];
            out[i] = newmunge ^ blockdata[i];
            blockdata[i] = newmunge;
            ck += out[i];
        }

        if( fp > ESTF_SIZE || stripmode != STRIP_HEADER_CHECKSUM_ESTF )
        {
            fwrite( out+4, 1, 12, outfile );
            fwrite( out, 1, 4, outfile );
        }
        else
        {
            if( ESTF_SIZE - fp < 16 )
            {
                memcpy( out+4, blockdata+16, 12 );
                memcpy( out, blockdata+28, 4 );
                fwrite( blockdata+16+ESTF_SIZE-fp, 1, ESTF_SIZE-fp, outfile );
            }
        }


        if( s == 496 )
        {
            s = 0;
            memset( blockdata, 0, 16 );
            *ppChecksums++ = ck;
            ck = 0;
        }
        else
            s+=16;
    };

    if( fp != dwLength2 )
    {
        fprintf( stderr, "This doesn't look like a valid encrypted "
                 "iHP firmware - reason: 'length2' mismatch\n" );
        fclose(infile);
        fclose(outfile);
        return -4;
    };

    fp = 0;
    ppChecksums = pChecksums;
    while( ( fp < dwLength3 ) &&
           ( lenread = fread( blockdata, 1, 32, infile ) ) > 0 )
    {
        fp += lenread;
        if( stripmode == STRIP_NONE )
            fwrite( blockdata, 1, lenread, outfile );
        if( memcmp( ppChecksums, blockdata, lenread ) != 0 )
        {
            fprintf( stderr, "This doesn't look like a valid encrypted "
                     "iHP firmware - reason: Checksum mismatch!" );
            fclose(infile);
            fclose(outfile);
            return -5;
        };
        ppChecksums += lenread;
    };

    if( fp != dwLength3 )
    {
        fprintf( stderr, "This doesn't look like a valid encrypted "
                 "iHP firmware - reason: 'length3' mismatch\n" );
        fclose(infile);
        fclose(outfile);
        return -6;
    };


    fprintf( stderr, "File decoded correctly and all checksums matched!\n" );
    switch( stripmode )
    {
        default:
        case STRIP_NONE:
            fprintf(stderr, "Output file contains all headers and "
                    "checksums\n");
            break;
        case STRIP_HEADER_CHECKSUM:
            fprintf( stderr, "NB:  output file contains only ESTFBINR header"
                     " and decoded firmware code\n" );
            break;
        case STRIP_HEADER_CHECKSUM_ESTF:
            fprintf( stderr, "NB:  output file contains only raw decoded "
                     "firmware code\n" );
            break;
    };

    return 0;
}
Пример #2
0
void scaling() {
    int   nglaciercells=0;
    float volumechange=0,glacarea=0,glacareanew=0,areachange=0,areachange2=0;
    int   areachange_numbercells;   /*number of grid cells to be added or removed*/
    float minimum;
    int min_i,min_j,ii;
    FILE   *outnewDEMglac=NULL;
    char   namenewDEMglac[PFNAME_LEN];

    /* --- DETERMINE GLACIER AREA, count number of glacier gridcells -----------*/
    /*Note that variable nglac refers to all drainage basin grid cells*/
    nglaciercells = 0;
    for (i=1; i<=nrows; i++)
        for (j=1; j<=ncols; j++) {
            if ((griddgmglac[i][j]) != nodata)     /*grid of glacier*/
                nglaciercells += 1;
        }

    /* --- DETERMINE GLACIER AREA, count number of glacier gridcells -----------*/
    glacarea = nglaciercells * gridsize * gridsize;    /*in m2*/

    /* --- CONVERT ANNUAL SPECIFIC MASS BALANCE INTO VOLUME -----------*/
    volumechange = x[11]/100/0.9*glacarea;   /*assuming 900 kg/m3;  x[11] is mean, comes from statist, writeout.c*/
    /*divide by 100 to convert cm into meter*/

    /* -----------------------------------------------*/
    /* --- SCALING ---Arendt JGR 2006 and just simple V-A scaling assumin delta V is prop to delta A--------*/
    /* -----------------------------------------------*/
    areachange = (volumechange/ (c_coefficient*gammaVA*(pow(glacarea,(gammaVA-1))) ));  /*m2, negative in case of retreat*/

    areachange2 = pow( (fabs(volumechange)/c_coefficient),(1/gammaVA) );   /*in m2*/
    /*fabs=absolute value; has to be positive, otherwise NaN*/
    if(volumechange < 0)
        areachange2 = -areachange2;

    /* --- DETERMINE NUMBER OF GRID CELLS TO ADD OR REMOVE--------*/
    areachange_numbercells = (int)(areachange/(gridsize*gridsize));    /*negative in case of retreat, gridsize in m*/

    glacarea = glacarea/1000000;    /*convert m2 to km2*/
    areachange = areachange/1000000;
    areachange2 = areachange2/1000000;

    glacareanew = glacarea + areachange;    /*areachange is negative in case of retreat, in km2*/
    if(glacareanew < 0)
        glacareanew = 0;

    /* --- PRINT AREA AND AREA CHANGE TO MASS BALANCE FILE--------*/

    fprintf(outspecificmassbal," %.4f %.4f %.3f %d %.3f\n",glacarea,glacareanew,areachange,areachange_numbercells,areachange2);

    /* -----------------------------------------------*/
    /* --- REMOVE GRID CELLES FROM GLACIER DEM--------*/
    /* -----------------------------------------------*/

    if((areachange < 0) && (glacareanew > 0))/*;*/     /*only for retreat, no advance*/
    {
        for (ii=1; ii<=  -areachange_numbercells; ii++) {       /*ueber alle Reihen*/
            minimum = 10000.0;      /*minimum, must be initialized high*/
            for (i=1; i<=nrows; i++) {
                for (j=1; j<=ncols; j++) {
                    if (griddgmglac[i][j] != nodata) {   /*only area to be calcualated*/
                        if (griddgmglac[i][j] < minimum) {
                            minimum = griddgmglac[i][j];   /*minimum*/
                            min_i = i;    /*store row, col of cell with minimum value*/
                            min_j = j;
                        }
                    }  /*endif*/
                }  /*for col*/
            }   /*for row*/

            griddgmglac[min_i][min_j] = nodata;
        }  /*for each grid cell to be removed*/
    }  /*endif retreat*/

    /* -----------------------------------------------*/
    /* --- WRITE NEW GLACIER DEM TO FILE--------*/
    /* -----------------------------------------------*/
    sprintf(namenewDEMglac,"DEMglac%04d.bin",(int)year);
    openoutfile(&outnewDEMglac,outpath,namenewDEMglac);
    statist(griddgmglac,x);
    fwrite(&(x[1]),sizeof(float),12,outnewDEMglac);     /*FIRST 12 ROWS*/
    for (i=1; i<=nrows; i++)      /* for all rows (and columns in fwrite command) */
        fwrite(&(griddgmglac[i][1]),sizeof(float),ncols,outnewDEMglac);

    if(outnewDEMglac)
        closefile(&outnewDEMglac,namenewDEMglac);

    return;
}
Пример #3
0
int iriver_encode(const char *infile_name, const char *outfile_name, BOOL modify )
{
    FILE * infile = NULL;
    FILE * outfile = NULL;
    int i = -1;
    unsigned char headerdata[512];
    unsigned long dwLength1, dwLength2, dwLength3, fp = 0;
    unsigned char blockdata[16+16];
    unsigned char out[16];
    unsigned char newmunge;
    signed long lenread;
    int s = 0;
    unsigned char * pChecksums, * ppChecksums;
    unsigned char ck;

    infile = openinfile(infile_name);
    outfile = openoutfile(outfile_name);

    lenread = fread( headerdata, 1, 512, infile );
    if( lenread != 512 )
    {
        fprintf( stderr, "This doesn't look like a valid decoded "
                 "iHP firmware - reason: header length\n" );
        fclose(infile);
        fclose(outfile);
        return -1;
    };

    if( modify )
    {
        modifyheader( headerdata ); /* reversible */
    };

    i = testheader( headerdata );
    if( i == -1 )
    {
        fprintf( stderr, "This firmware is for an unknown model, or is not"
                 " a valid decoded iHP firmware\n" );
        fclose(infile);
        fclose(outfile);
        return -2;
    };
    fprintf( stderr, "Model %s\n", models[ i ] );

    dwLength1 = headerdata[0] | (headerdata[1]<<8) |
        (headerdata[2]<<16) | (headerdata[3]<<24);
    dwLength2 = headerdata[4] | (headerdata[5]<<8) |
        (headerdata[6]<<16) | (headerdata[7]<<24);
    dwLength3 = headerdata[8] | (headerdata[9]<<8) |
        (headerdata[10]<<16) | (headerdata[11]<<24);

    if( dwLength1 < firmware_minsize[i] ||
        dwLength1 > firmware_maxsize[i] ||
        dwLength2 < firmware_minsize[i] ||
        dwLength2 > dwLength1 ||
        dwLength3 > dwLength1 ||
        dwLength2+dwLength3+512 != dwLength1 )
    {
        fprintf( stderr, "This doesn't look like a valid decoded iHP"
                 " firmware - reason: file 'length' data\n" );
        fclose(infile);
        fclose(outfile);
        return -3;
    };

    pChecksums = ppChecksums = (unsigned char *)( malloc( dwLength3 ) );

    fwrite( headerdata, 512, 1, outfile );

    memset( blockdata, 0, 16 );
    ck = 0;
    while( ( fp < dwLength2 ) &&
           ( lenread = fread( blockdata+16, 1, 16, infile ) ) == 16 )
    {
        fp += 16;
        for( i=0; i<16; ++i )
        {
            newmunge = blockdata[16+((12+i)&0xf)] ^ blockdata[i];
            out[i] = newmunge ^ munge[i];
            ck += blockdata[16+i];
            blockdata[i] = newmunge;
        };
        fwrite( out, 1, 16, outfile );

        if( s == 496 )
        {
            s = 0;
            memset( blockdata, 0, 16 );
            *ppChecksums++ = ck;
            ck = 0;
        }
        else
            s+=16;
    };

    if( fp != dwLength2 )
    {
        fprintf( stderr, "This doesn't look like a valid decoded "
                 "iHP firmware - reason: 'length1' mismatch\n" );
        fclose(infile);
        fclose(outfile);
        return -4;
    };

    /* write out remainder w/out applying descrambler */
    fp = 0;
    lenread = dwLength3;
    ppChecksums = pChecksums;
    while( ( fp < dwLength3) &&
           ( lenread = fwrite( ppChecksums, 1, lenread, outfile ) ) > 0 )
    {
        fp += lenread;
        ppChecksums += lenread;
        lenread = dwLength3 - fp;
    };

    if( fp != dwLength3 )
    {
        fprintf( stderr, "This doesn't look like a valid decoded "
                 "iHP firmware - reason: 'length2' mismatch\n" );
        fclose(infile);
        fclose(outfile);
        return -5;
    };

    fprintf( stderr, "File encoded successfully and checksum table built!\n" );

    fclose(infile);
    fclose(outfile);
    return 0;
}