os/security/crypto/weakcrypto/test/tpadding/tpaddingPKCS1.cpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
sl@0
     1
/*
sl@0
     2
* Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies).
sl@0
     3
* All rights reserved.
sl@0
     4
* This component and the accompanying materials are made available
sl@0
     5
* under the terms of the License "Eclipse Public License v1.0"
sl@0
     6
* which accompanies this distribution, and is available
sl@0
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0
     8
*
sl@0
     9
* Initial Contributors:
sl@0
    10
* Nokia Corporation - initial contribution.
sl@0
    11
*
sl@0
    12
* Contributors:
sl@0
    13
*
sl@0
    14
* Description: 
sl@0
    15
*
sl@0
    16
*/
sl@0
    17
sl@0
    18
sl@0
    19
#include <random.h>
sl@0
    20
#include <padding.h>
sl@0
    21
#include "tpaddingPKCS1.h"
sl@0
    22
sl@0
    23
CTestPadPKCS1::CTestPadPKCS1()
sl@0
    24
{
sl@0
    25
   SetTestStepName(KPadPKCS1);
sl@0
    26
}
sl@0
    27
sl@0
    28
CTestPadPKCS1::~CTestPadPKCS1()
sl@0
    29
{
sl@0
    30
}
sl@0
    31
sl@0
    32
TVerdict CTestPadPKCS1::doTestStepL()
sl@0
    33
{
sl@0
    34
sl@0
    35
   __UHEAP_MARK;
sl@0
    36
   
sl@0
    37
   INFO_PRINTF1(_L("Test of PKCS1 signature padding"));
sl@0
    38
sl@0
    39
   SetTestStepResult(EPass);
sl@0
    40
   INFO_PRINTF1(_L("Blocksize 512"));
sl@0
    41
   TestPKCS1SignaturePadding(512);
sl@0
    42
sl@0
    43
   SetTestStepResult(EPass);
sl@0
    44
   INFO_PRINTF1(_L("Blocksize 1024"));
sl@0
    45
   TestPKCS1SignaturePadding(1024);
sl@0
    46
sl@0
    47
   SetTestStepResult(EPass);
sl@0
    48
   INFO_PRINTF1(_L("Blocksize 2048"));
sl@0
    49
   TestPKCS1SignaturePadding(2048);
sl@0
    50
sl@0
    51
   INFO_PRINTF1(_L("Test of PKCS1 encryption padding"));
sl@0
    52
sl@0
    53
   SetTestStepResult(EPass);
sl@0
    54
   INFO_PRINTF1(_L("Blocksize 512"));
sl@0
    55
   TestPKCS1EncryptionPadding(512);
sl@0
    56
sl@0
    57
   SetTestStepResult(EPass);
sl@0
    58
   INFO_PRINTF1(_L("Blocksize 1024"));
sl@0
    59
   TestPKCS1EncryptionPadding(1024);
sl@0
    60
sl@0
    61
   SetTestStepResult(EPass);
sl@0
    62
   INFO_PRINTF1(_L("Blocksize 2048"));
sl@0
    63
   TestPKCS1EncryptionPadding(2048);
sl@0
    64
   
sl@0
    65
sl@0
    66
   __UHEAP_MARKEND;
sl@0
    67
   return TestStepResult();
sl@0
    68
}
sl@0
    69
sl@0
    70
void CTestPadPKCS1::TestPKCS1SignaturePadding(TInt aBlockSize)
sl@0
    71
{
sl@0
    72
   CPaddingPKCS1Signature *padding = CPaddingPKCS1Signature::NewLC(aBlockSize);
sl@0
    73
   /*
sl@0
    74
    * The length of the data D shall not be more than k-11 octets,
sl@0
    75
    * which is positive since the length k of the modulus is at
sl@0
    76
    * least 12 octets.
sl@0
    77
    */
sl@0
    78
   TInt noDataBytes = aBlockSize-11;
sl@0
    79
   
sl@0
    80
   for (TInt i = 0; i <= noDataBytes; i++)
sl@0
    81
   {
sl@0
    82
      HBufC8 *inData = HBufC8::NewLC(noDataBytes);
sl@0
    83
      HBufC8 *outData = HBufC8::NewLC(aBlockSize);
sl@0
    84
      TPtr8 in(inData->Des());
sl@0
    85
      TPtr8 out(outData->Des());
sl@0
    86
      TInt j;
sl@0
    87
      
sl@0
    88
      for (j = 0; j < i; j++)
sl@0
    89
      {
sl@0
    90
	 TInt text('a'+j%25);
sl@0
    91
	 in.Append(text);
sl@0
    92
      }
sl@0
    93
      
sl@0
    94
      TRAPD(err, padding->DoPadL(in, out));
sl@0
    95
      TEST(err == KErrNone);
sl@0
    96
      
sl@0
    97
      // check the padding.
sl@0
    98
      // should have the following syntax:
sl@0
    99
      // 00 || 01 || PS || 00 || D where PS is the padding octects of value 0xff
sl@0
   100
      
sl@0
   101
      TEST(out[0] == 0 && out[1] == 1);
sl@0
   102
sl@0
   103
      TInt endOfPadding = aBlockSize - 1 - in.Length();
sl@0
   104
      for (j = 2; j < endOfPadding; j++)
sl@0
   105
      {
sl@0
   106
	 TEST(out[j]==0xff);
sl@0
   107
	 
sl@0
   108
      }
sl@0
   109
      // Check for the delimiter
sl@0
   110
      TEST(out[endOfPadding] == 0);
sl@0
   111
      // Check that the rest of the data is not corrupted
sl@0
   112
      TInt startOfData = aBlockSize - in.Length();
sl@0
   113
      TEST(in == out.Mid(startOfData));
sl@0
   114
      CleanupStack::PopAndDestroy(2, inData); // inData, outData
sl@0
   115
   }
sl@0
   116
   TestStepResult() ? INFO_PRINTF1(_L("Test failed")) : INFO_PRINTF1(_L("Test passed"));
sl@0
   117
   CleanupStack::PopAndDestroy(); // padding
sl@0
   118
}
sl@0
   119
sl@0
   120
void CTestPadPKCS1::TestPKCS1EncryptionPadding(TInt aBlockSize)
sl@0
   121
{
sl@0
   122
   CPaddingPKCS1Encryption *padding = CPaddingPKCS1Encryption::NewLC(aBlockSize);
sl@0
   123
   /*
sl@0
   124
    * The length of the data D shall not be more than k-11 octets,
sl@0
   125
    * which is positive since the length k of the modulus is at
sl@0
   126
    * least 12 octets.
sl@0
   127
    */
sl@0
   128
   TInt noDataBytes = aBlockSize-11;
sl@0
   129
   
sl@0
   130
   for (TInt i = 0; i <= noDataBytes; i++)
sl@0
   131
   {
sl@0
   132
      HBufC8 *inData = HBufC8::NewLC(noDataBytes);
sl@0
   133
      HBufC8 *outData = HBufC8::NewLC(aBlockSize);
sl@0
   134
      TPtr8 in(inData->Des());
sl@0
   135
      TPtr8 out(outData->Des());
sl@0
   136
      TInt j;
sl@0
   137
      
sl@0
   138
      for (j = 0; j < i; j++)
sl@0
   139
      {
sl@0
   140
	 TInt text('a'+j%25);
sl@0
   141
	 in.Append(text);
sl@0
   142
      }
sl@0
   143
      
sl@0
   144
      TRAPD(err, padding->DoPadL(in, out));
sl@0
   145
      TEST(err == KErrNone);
sl@0
   146
      // check the padding.
sl@0
   147
      // should have the following syntax:
sl@0
   148
      // 00 || 02 || PS || 00 || D where PS is the padding octects containing random data
sl@0
   149
      
sl@0
   150
      TEST(out[0] == 0 && out[1] == 2);
sl@0
   151
      
sl@0
   152
      TInt endOfPadding = aBlockSize - 1 - in.Length();
sl@0
   153
      for (j = 2; j < endOfPadding; j++)
sl@0
   154
      {
sl@0
   155
	 TEST(out[j]!=0);
sl@0
   156
	 
sl@0
   157
      }
sl@0
   158
      // Check for the delimiter
sl@0
   159
      TEST(out[endOfPadding] == 0);
sl@0
   160
      
sl@0
   161
      // Check that the rest of the data is not corrupted
sl@0
   162
      TInt startOfData = aBlockSize - in.Length();
sl@0
   163
      TEST(in == out.Mid(startOfData));
sl@0
   164
      CleanupStack::PopAndDestroy(2, inData); // inData, outData
sl@0
   165
   }
sl@0
   166
   TestStepResult() ? INFO_PRINTF1(_L("Test failed")) : INFO_PRINTF1(_L("Test passed"));
sl@0
   167
   CleanupStack::PopAndDestroy(); // padding
sl@0
   168
}
sl@0
   169
sl@0
   170
   
sl@0
   171
CTestUnpadPKCS1::CTestUnpadPKCS1()
sl@0
   172
{
sl@0
   173
   SetTestStepName(KUnpadPKCS1);
sl@0
   174
}
sl@0
   175
sl@0
   176
CTestUnpadPKCS1::~CTestUnpadPKCS1()
sl@0
   177
{
sl@0
   178
}
sl@0
   179
sl@0
   180
TVerdict CTestUnpadPKCS1::doTestStepL()
sl@0
   181
{
sl@0
   182
   __UHEAP_MARK;
sl@0
   183
sl@0
   184
   INFO_PRINTF1(_L("Test of PKCS1 signature unpadding"));
sl@0
   185
   INFO_PRINTF1(_L("Blocksize 512"));
sl@0
   186
   SetTestStepResult(EPass);
sl@0
   187
   TestPKCS1SignatureUnpadding(512);
sl@0
   188
   INFO_PRINTF1(_L("Blocksize 1024"));
sl@0
   189
   SetTestStepResult(EPass);
sl@0
   190
   TestPKCS1SignatureUnpadding(1024);
sl@0
   191
   INFO_PRINTF1(_L("Blocksize 2048"));
sl@0
   192
   SetTestStepResult(EPass);
sl@0
   193
   TestPKCS1SignatureUnpadding(2048);
sl@0
   194
sl@0
   195
   INFO_PRINTF1(_L("Test of PKCS1 encryption unpadding"));
sl@0
   196
   INFO_PRINTF1(_L("Blocksize 512"));
sl@0
   197
   SetTestStepResult(EPass);
sl@0
   198
   TestPKCS1EncryptionUnpadding(512);
sl@0
   199
   INFO_PRINTF1(_L("Blocksize 1024"));
sl@0
   200
   SetTestStepResult(EPass);
sl@0
   201
   TestPKCS1EncryptionUnpadding(1024);
sl@0
   202
   INFO_PRINTF1(_L("Blocksize 2048"));
sl@0
   203
   SetTestStepResult(EPass);
sl@0
   204
   TestPKCS1EncryptionUnpadding(2048);
sl@0
   205
sl@0
   206
   __UHEAP_MARKEND;
sl@0
   207
   return TestStepResult();
sl@0
   208
}
sl@0
   209
sl@0
   210
void CTestUnpadPKCS1::TestPKCS1SignatureUnpadding(TInt aBlockSize)
sl@0
   211
{
sl@0
   212
   CPaddingPKCS1Signature *padding = CPaddingPKCS1Signature::NewLC(aBlockSize);
sl@0
   213
   /*
sl@0
   214
    * The length of the data D shall not be more than k-11 octets,
sl@0
   215
    * which is positive since the length k of the modulus is at
sl@0
   216
    * least 12 octets.
sl@0
   217
    */
sl@0
   218
   TInt noDataBytes = aBlockSize-11;
sl@0
   219
   
sl@0
   220
   for (TInt i = 0; i <= noDataBytes; i++)
sl@0
   221
   {
sl@0
   222
      HBufC8 *inData = HBufC8::NewLC(aBlockSize);
sl@0
   223
      HBufC8 *outData = HBufC8::NewLC(noDataBytes);
sl@0
   224
      HBufC8 *compData = HBufC8::NewLC(noDataBytes);
sl@0
   225
      TPtr8 in(inData->Des());
sl@0
   226
      TPtr8 out(outData->Des());
sl@0
   227
      TPtr8 comp(compData->Des());
sl@0
   228
      
sl@0
   229
      TInt endOfPadding = aBlockSize - 1 - i;
sl@0
   230
      in.SetLength(endOfPadding+1);
sl@0
   231
      in[0] = 0;
sl@0
   232
      in[1] = 1;
sl@0
   233
      TInt j;
sl@0
   234
      for (j = 2; j < endOfPadding; j++)
sl@0
   235
      {
sl@0
   236
	 in[j] = 0xff;
sl@0
   237
      }
sl@0
   238
      in[endOfPadding] = 0; // delimiter
sl@0
   239
sl@0
   240
      for (j = 0; j < i; j++)
sl@0
   241
      {
sl@0
   242
	 TInt text('a'+j%25);
sl@0
   243
	 in.Append(text);
sl@0
   244
	 comp.Append(text);
sl@0
   245
      }
sl@0
   246
sl@0
   247
      TRAPD(err, padding->UnPadL(in, out));
sl@0
   248
      TEST(err == KErrNone);
sl@0
   249
sl@0
   250
      TEST(out == comp);
sl@0
   251
sl@0
   252
      TEST(out.Length() == i);
sl@0
   253
sl@0
   254
      
sl@0
   255
      CleanupStack::PopAndDestroy(3, inData); // inData, outData, compData
sl@0
   256
   }
sl@0
   257
   TestStepResult() ? INFO_PRINTF1(_L("Test failed")) : INFO_PRINTF1(_L("Test passed"));
sl@0
   258
   CleanupStack::PopAndDestroy(); // padding
sl@0
   259
}
sl@0
   260
sl@0
   261
void CTestUnpadPKCS1::TestPKCS1EncryptionUnpadding(TInt aBlockSize)
sl@0
   262
{
sl@0
   263
   CPaddingPKCS1Encryption *padding = CPaddingPKCS1Encryption::NewLC(aBlockSize);
sl@0
   264
   /*
sl@0
   265
    * "The length of the data D shall not be more than k-11 octets,
sl@0
   266
    * which is positive since the length k of the modulus is at
sl@0
   267
    * least 12 octets."
sl@0
   268
    */
sl@0
   269
   TInt noDataBytes = aBlockSize-11;
sl@0
   270
   for (TInt i = 0; i <= noDataBytes; i++)
sl@0
   271
   {
sl@0
   272
      HBufC8 *inData = HBufC8::NewLC(aBlockSize);
sl@0
   273
      HBufC8 *outData = HBufC8::NewLC(noDataBytes);
sl@0
   274
      HBufC8 *compData = HBufC8::NewLC(noDataBytes);
sl@0
   275
      TPtr8 in(inData->Des());
sl@0
   276
      TPtr8 out(outData->Des());
sl@0
   277
      TPtr8 comp(compData->Des());
sl@0
   278
      
sl@0
   279
      TInt endOfPadding = aBlockSize - 1 - i;
sl@0
   280
      in.SetLength(endOfPadding+1);
sl@0
   281
      in[0] = 0;
sl@0
   282
      in[1] = 2;
sl@0
   283
      TBuf8<256> rnd(256);
sl@0
   284
      GenerateRandomBytesL(rnd);
sl@0
   285
sl@0
   286
      TInt k = 2;
sl@0
   287
      TInt j = 0;
sl@0
   288
      while (k < endOfPadding)
sl@0
   289
      {
sl@0
   290
         if (rnd[j%256])
sl@0
   291
         {
sl@0
   292
            in[k++] = rnd[j%256];
sl@0
   293
         }
sl@0
   294
         
sl@0
   295
         if (++j%256 == 0)
sl@0
   296
         {
sl@0
   297
            GenerateRandomBytesL(rnd);
sl@0
   298
         }
sl@0
   299
      }
sl@0
   300
      in[endOfPadding] = 0; // delimiter
sl@0
   301
sl@0
   302
      for (j = 0; j < i; j++)
sl@0
   303
      {
sl@0
   304
	 TInt text('a'+j%25);
sl@0
   305
	 in.Append(text);
sl@0
   306
     comp.Append(text);
sl@0
   307
      }
sl@0
   308
sl@0
   309
      TRAPD(err, padding->UnPadL(in, out));
sl@0
   310
      TEST(err == KErrNone);
sl@0
   311
sl@0
   312
	  TEST(out == comp);		  
sl@0
   313
sl@0
   314
      TEST(out.Length() == i);
sl@0
   315
sl@0
   316
      
sl@0
   317
      CleanupStack::PopAndDestroy(3, inData); // inData, outData, compData
sl@0
   318
   }
sl@0
   319
   TestStepResult() ? INFO_PRINTF1(_L("Test failed")) : INFO_PRINTF1(_L("Test passed"));
sl@0
   320
   CleanupStack::PopAndDestroy(); // padding
sl@0
   321
}