⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rsa.c

📁 一个用纯C写的RSA_SHA1数字签名库
💻 C
📖 第 1 页 / 共 2 页
字号:
            return( XYSSL_ERR_RSA_INVALID_PADDING );    }    *olen = ilen - (int)(p - buf);    memcpy( output, p, *olen );    return( 0 );}/* * Do an RSA operation to sign the message digest */int rsa_pkcs1_sign( rsa_context *ctx,                    int mode,                    int hash_id,                    int hashlen,                    unsigned char *hash,                    unsigned char *sig ){    int nb_pad, olen;    unsigned char *p = sig;    olen = ctx->len;    switch( ctx->padding )    {        case RSA_PKCS_V15:            switch( hash_id )            {                case RSA_RAW:                    nb_pad = olen - 3 - hashlen;                    break;                case RSA_MD2:                case RSA_MD4:                case RSA_MD5:                    nb_pad = olen - 3 - 34;                    break;                case RSA_SHA1:                    nb_pad = olen - 3 - 35;                    break;                default:                    return( XYSSL_ERR_RSA_BAD_INPUT_DATA );            }            if( nb_pad < 8 )                return( XYSSL_ERR_RSA_BAD_INPUT_DATA );            *p++ = 0;            *p++ = RSA_SIGN;            memset( p, 0xFF, nb_pad );            p += nb_pad;            *p++ = 0;            break;        default:            return( XYSSL_ERR_RSA_INVALID_PADDING );    }    switch( hash_id )    {        case RSA_RAW:            memcpy( p, hash, hashlen );            break;        case RSA_MD2:            memcpy( p, ASN1_HASH_MDX, 18 );            memcpy( p + 18, hash, 16 );            p[13] = 2; break;        case RSA_MD4:            memcpy( p, ASN1_HASH_MDX, 18 );            memcpy( p + 18, hash, 16 );            p[13] = 4; break;        case RSA_MD5:            memcpy( p, ASN1_HASH_MDX, 18 );            memcpy( p + 18, hash, 16 );            p[13] = 5; break;        case RSA_SHA1:            memcpy( p, ASN1_HASH_SHA1, 15 );            memcpy( p + 15, hash, 20 );            break;        default:            return( XYSSL_ERR_RSA_BAD_INPUT_DATA );    }    return( ( mode == RSA_PUBLIC )            ? rsa_public(  ctx, sig, sig )            : rsa_private( ctx, sig, sig ) );}/* * Do an RSA operation and check the message digest */int rsa_pkcs1_verify( rsa_context *ctx,                      int mode,                      int hash_id,                      int hashlen,                      unsigned char *hash,                      unsigned char *sig ){    int ret, len, siglen;    unsigned char *p, c;    unsigned char buf[512];    siglen = ctx->len;    if( siglen < 16 || siglen > (int) sizeof( buf ) )        return( XYSSL_ERR_RSA_BAD_INPUT_DATA );    ret = ( mode == RSA_PUBLIC )          ? rsa_public(  ctx, sig, buf )          : rsa_private( ctx, sig, buf );    if( ret != 0 )        return( ret );    p = buf;    switch( ctx->padding )    {        case RSA_PKCS_V15:            if( *p++ != 0 || *p++ != RSA_SIGN )                return( XYSSL_ERR_RSA_INVALID_PADDING );            while( *p != 0 )            {                if( p >= buf + siglen - 1 || *p != 0xFF )                    return( XYSSL_ERR_RSA_INVALID_PADDING );                p++;            }            p++;            break;        default:            return( XYSSL_ERR_RSA_INVALID_PADDING );    }    len = siglen - (int)( p - buf );    if( len == 34 )    {        c = p[13];        p[13] = 0;        if( memcmp( p, ASN1_HASH_MDX, 18 ) != 0 )            return( XYSSL_ERR_RSA_VERIFY_FAILED );        if( ( c == 2 && hash_id == RSA_MD2 ) ||            ( c == 4 && hash_id == RSA_MD4 ) ||            ( c == 5 && hash_id == RSA_MD5 ) )        {            if( memcmp( p + 18, hash, 16 ) == 0 )                 return( 0 );            else                return( XYSSL_ERR_RSA_VERIFY_FAILED );        }    }    if( len == 35 && hash_id == RSA_SHA1 )    {        if( memcmp( p, ASN1_HASH_SHA1, 15 ) == 0 &&            memcmp( p + 15, hash, 20 ) == 0 )            return( 0 );        else            return( XYSSL_ERR_RSA_VERIFY_FAILED );    }    if( len == hashlen && hash_id == RSA_RAW )    {        if( memcmp( p, hash, hashlen ) == 0 )            return( 0 );        else            return( XYSSL_ERR_RSA_VERIFY_FAILED );    }    return( XYSSL_ERR_RSA_INVALID_PADDING );}/* * Free the components of an RSA key */void rsa_free( rsa_context *ctx ){    mpi_free( &ctx->RQ, &ctx->RP, &ctx->RN,              &ctx->QP, &ctx->DQ, &ctx->DP,              &ctx->Q,  &ctx->P,  &ctx->D,              &ctx->E,  &ctx->N,  NULL );}#if defined(XYSSL_SELF_TEST)#include "sha1.h"/* * Example RSA-1024 keypair, for test purposes */#define KEY_LEN 128#define RSA_N   "9292758453063D803DD603D5E777D788" \                "8ED1D5BF35786190FA2F23EBC0848AEA" \                "DDA92CA6C3D80B32C4D109BE0F36D6AE" \                "7130B9CED7ACDF54CFC7555AC14EEBAB" \                "93A89813FBF3C4F8066D2D800F7C38A8" \                "1AE31942917403FF4946B0A83D3D3E05" \                "EE57C6F5F5606FB5D4BC6CD34EE0801A" \                "5E94BB77B07507233A0BC7BAC8F90F79"#define RSA_E   "10001"#define RSA_D   "24BF6185468786FDD303083D25E64EFC" \                "66CA472BC44D253102F8B4A9D3BFA750" \                "91386C0077937FE33FA3252D28855837" \                "AE1B484A8A9A45F7EE8C0C634F99E8CD" \                "DF79C5CE07EE72C7F123142198164234" \                "CABB724CF78B8173B9F880FC86322407" \                "AF1FEDFDDE2BEB674CA15F3E81A1521E" \                "071513A1E85B5DFA031F21ECAE91A34D"#define RSA_P   "C36D0EB7FCD285223CFB5AABA5BDA3D8" \                "2C01CAD19EA484A87EA4377637E75500" \                "FCB2005C5C7DD6EC4AC023CDA285D796" \                "C3D9E75E1EFC42488BB4F1D13AC30A57"#define RSA_Q   "C000DF51A7C77AE8D7C7370C1FF55B69" \                "E211C2B9E5DB1ED0BF61D0D9899620F4" \                "910E4168387E3C30AA1E00C339A79508" \                "8452DD96A9A5EA5D9DCA68DA636032AF"#define RSA_DP  "C1ACF567564274FB07A0BBAD5D26E298" \                "3C94D22288ACD763FD8E5600ED4A702D" \                "F84198A5F06C2E72236AE490C93F07F8" \                "3CC559CD27BC2D1CA488811730BB5725"#define RSA_DQ  "4959CBF6F8FEF750AEE6977C155579C7" \                "D8AAEA56749EA28623272E4F7D0592AF" \                "7C1F1313CAC9471B5C523BFE592F517B" \                "407A1BD76C164B93DA2D32A383E58357"#define RSA_QP  "9AE7FBC99546432DF71896FC239EADAE" \                "F38D18D2B2F0E2DD275AA977E2BF4411" \                "F5A3B2A5D33605AEBBCCBA7FEB9F2D2F" \                "A74206CEC169D74BF5A8C50D6F48EA08"#define PT_LEN  24#define RSA_PT  "\xAA\xBB\xCC\x03\x02\x01\x00\xFF\xFF\xFF\xFF\xFF" \                "\x11\x22\x33\x0A\x0B\x0C\xCC\xDD\xDD\xDD\xDD\xDD"/* * Checkup routine */int rsa_self_test( int verbose ){    int len;    rsa_context rsa;    unsigned char sha1sum[20];    unsigned char rsa_plaintext[PT_LEN];    unsigned char rsa_decrypted[PT_LEN];    unsigned char rsa_ciphertext[KEY_LEN];    memset( &rsa, 0, sizeof( rsa_context ) );    rsa.len = KEY_LEN;    mpi_read_string( &rsa.N , 16, RSA_N  );    mpi_read_string( &rsa.E , 16, RSA_E  );    mpi_read_string( &rsa.D , 16, RSA_D  );    mpi_read_string( &rsa.P , 16, RSA_P  );    mpi_read_string( &rsa.Q , 16, RSA_Q  );    mpi_read_string( &rsa.DP, 16, RSA_DP );    mpi_read_string( &rsa.DQ, 16, RSA_DQ );    mpi_read_string( &rsa.QP, 16, RSA_QP );    if( verbose != 0 )        printf( "  RSA key validation: " );    if( rsa_check_pubkey(  &rsa ) != 0 ||        rsa_check_privkey( &rsa ) != 0 )    {        if( verbose != 0 )            printf( "failed\n" );        return( 1 );    }    if( verbose != 0 )        printf( "passed\n  PKCS#1 encryption : " );    memcpy( rsa_plaintext, RSA_PT, PT_LEN );    if( rsa_pkcs1_encrypt( &rsa, RSA_PUBLIC, PT_LEN,                           rsa_plaintext, rsa_ciphertext ) != 0 )    {        if( verbose != 0 )            printf( "failed\n" );        return( 1 );    }    if( verbose != 0 )        printf( "passed\n  PKCS#1 decryption : " );    if( rsa_pkcs1_decrypt( &rsa, RSA_PRIVATE, &len,                           rsa_ciphertext, rsa_decrypted ) != 0 )    {        if( verbose != 0 )            printf( "failed\n" );        return( 1 );    }    if( memcmp( rsa_decrypted, rsa_plaintext, len ) != 0 )    {        if( verbose != 0 )            printf( "failed\n" );        return( 1 );    }    if( verbose != 0 )        printf( "passed\n  PKCS#1 data sign  : " );    sha1( rsa_plaintext, PT_LEN, sha1sum );    if( rsa_pkcs1_sign( &rsa, RSA_PRIVATE, RSA_SHA1, 20,                        sha1sum, rsa_ciphertext ) != 0 )    {        if( verbose != 0 )            printf( "failed\n" );        return( 1 );    }    if( verbose != 0 )        printf( "passed\n  PKCS#1 sig. verify: " );    if( rsa_pkcs1_verify( &rsa, RSA_PUBLIC, RSA_SHA1, 20,                          sha1sum, rsa_ciphertext ) != 0 )    {        if( verbose != 0 )            printf( "failed\n" );        return( 1 );    }    if( verbose != 0 )        printf( "passed\n\n" );    rsa_free( &rsa );    return( 0 );}#endif#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -