Ejemplo n.º 1
0
void Encrypt(PK0304* le, AE_EXTRA* ae, char* password)
{
 char *salt, *key1, *key2, *check, digest[40];
 u32 key_len = KeySize*2 + 2;
 u32 dig_len = 40;

 salt = BUF;
 key1 = salt+SaltSize;
 key2 = key1+KeySize;
 check = key2+KeySize;

 /* Gets a random salt (8-16 byte) */
 sprng_read(salt, SaltSize, 0);

 /* Generates 2 keys for AES and HMAC, plus 2-byte password verification value */
 if (pkcs_5_alg2(password, strlen(password), salt, SaltSize, 1000, 0, key1, &key_len) != CRYPT_OK)
  Z_ERROR("Failed to derive encryption keys");

// dump("salt", salt, SaltSize);
// dump("key", key1, KeySize);

 if (ctr_start(0, IV, key1, KeySize, 0, CTR_COUNTER_LITTLE_ENDIAN, &ctr) != CRYPT_OK)
  Z_ERROR("Failed to setup AES CTR encoder");
#ifdef GLADMAN_HMAC
 hmac_sha1_begin(&hmac);
 hmac_sha1_key(key2, KeySize, &hmac);
#else
 if (hmac_init(&hmac, 0, key2, KeySize) != CRYPT_OK)
  Z_ERROR("Failed to setup HMAC-SHA1");
#endif
 if (AE2) le->Crc32 = 0;
 le->Flag |= 1;
 le->CompMethod = 99;
 le->ExtraLen += 11;
 le->CompSize += SaltSize + 12; /* variable salt, fixed password check and hmac */

 safeWrite(ZOUT, le, sizeof(PK0304));
 fileCopy(ZOUT, ZIN, le->NameLen+le->ExtraLen-11);
 safeWrite(ZOUT, ae, 11);
 safeWrite(ZOUT, salt, SaltSize);
 safeWrite(ZOUT, check, 2);
 /* encrypt contents */
 fileFilter(ZOUT, ZIN, le->CompSize-SaltSize-12);
#ifdef GLADMAN_HMAC
 hmac_sha1_end(digest, dig_len, &hmac);
#else
 if (hmac_done(&hmac, digest, &dig_len) != CRYPT_OK)
  Z_ERROR("Failed to computate HMAC");
#endif
 safeWrite(ZOUT, digest, 10);
 ctr_done(&ctr);
}
Ejemplo n.º 2
0
FILE* topen(char *name)
{
 u16 u, i;
 FILE *f;

 for (i=0; i<1000; i++) {
  sprng_read(&u, 4, 0);
  sprintf(name, "AE-%05X.TMP", u);
  f = fopen(name, "w+b");
  if (!f) continue;
  else return f;
 }
 Z_ERROR("Can't create a temporary file!");
 return 0; /* never reached */
}
Ejemplo n.º 3
0
Archivo: c4.c Proyecto: rhardman/C4
C4Err RNG_GetBytes(     void *         out,
                      size_t         outLen
                      )
{
    C4Err             err = kC4Err_NoErr;

#if _USES_COMMON_CRYPTO_
   
   if(  CCRandomGenerateBytes(out, outLen) != kCCSuccess)
       err =  kC4Err_ResourceUnavailable;
 
#else
    unsigned long count  =  sprng_read(out,outLen,NULL);
    
    if(count != outLen)
        err =  kC4Err_ResourceUnavailable;
#endif
    
    return (err);
    
}
Ejemplo n.º 4
0
SCLError TestGCM()
{
    SCLError err = kSCLError_NoErr;
    int status = CRYPT_OK;
     uint8_t key[32];

    uint8_t* CT = NULL;
    size_t  CTLen = 0;
    uint8_t* PT = NULL;
    size_t  PTLen = 0;
    unsigned char  T[32];
    unsigned long tagLen = 0;
 
    int i;
    
    register_cipher (&aes_desc);
  
    printf("\nTesting GCM encoding \n\n");

       for(i = 0; Msgs[i] != NULL; i++)
    {
       
        
        unsigned long msgLen;
        uint8_t seqNum[6];
    
        sprng_read(key,sizeof(key),NULL);

        msgLen = strlen(Msgs[i]);
 //       sprintf(seqNum, "%05d ", i);
        
 //       printf("\n%s %3d |%s|\n\n", seqNum, (int)msgLen, Msgs[i]);  
       
          err = GCM_Encrypt( key,    sizeof(key), 
                            seqNum, sizeof(seqNum), 
                            Msgs[i], msgLen, 
                            &CT,    &CTLen, 
                            T,      &tagLen); CKERR;
        
 // Error test        
//         seqNum[0]= seqNum[0]+1;
//        T[0]= T[0]+1;
        
        err = GCM_Decrypt( key,    sizeof(key), 
                            seqNum, sizeof(seqNum), 
                            CT,     CTLen, 
                            T,      tagLen, 
                            &PT,    &PTLen); CKERR;
        

 //       dumpHex(CT, CTLen, 0);
 //       printf("Tag %d: ", (int)tagLen); dumpHex8(T); dumpHex8(T+8); 
 //       printf("\n");
 
        if(msgLen != PTLen)
        {
            printf("ERROR  GCM Decrypt: Expecting %d bytes, got %d\n", (int)msgLen, (int)PTLen );
            RETERR(kSCLError_SelfTestFailed);
        }
        
        if( compareResults( Msgs[i],  PT, msgLen , kResultFormat_Byte, "GCM Decrypt") != CRYPT_OK)
        {
            RETERR(kSCLError_SelfTestFailed);
        }
//        printf(" %5d |%.*s|\n\n",  (int)PTLen,(int)PTLen, PT );  
        
        
        if(CT)
        {
            memset(CT, CTLen, 0);
            XFREE(CT); CT = NULL;
        }
        
        if(PT)
        {
            memset(PT,PTLen, 0);
            XFREE(PT); PT = NULL;
        }

    }
    
done:
    if(status != CRYPT_OK)
        err = sCrypt2SCLError(status);
    
    if(CT)
    {
        memset(CT, CTLen, 0);
        XFREE(CT); CT = NULL;
    }
    
    if(PT)
    {
        memset(PT,PTLen, 0);
        XFREE(PT); PT = NULL;
    }
     
    return err;
    
    
}