File Coverage

blib/lib/Webqq/Encryption/RSA.pm
Criterion Covered Total %
statement 16 54 29.6
branch 3 18 16.6
condition 0 3 0.0
subroutine 3 4 75.0
pod 0 1 0.0
total 22 80 27.5


line stmt bran cond sub pod time code
1             package Webqq::Encryption::RSA;
2 1     1   5 use strict;
  1         1  
  1         34  
3 1     1   5 use Carp;
  1         1  
  1         151  
4              
5             BEGIN{
6 1     1   2 eval{
7 1         138 require Crypt::RSA::ES::PKCS1v15;
8 0         0 require Crypt::RSA::Key::Public;
9             };
10 1 50       3 unless($@){
11 0         0 $Webqq::Encryption::RSA::has_crypt_rsa = 1;
12             }
13             else{
14 1         1 eval{
15 1         109 require Crypt::OpenSSL::RSA;
16 0         0 require Crypt::OpenSSL::Bignum;
17             };
18 1 50       4 unless($@){
19 0         0 $Webqq::Encryption::RSA::has_crypt_openssl_rsa = 1;
20             }
21             else{
22 1         1 eval{require JE;};
  1         3  
23 1 50       2 unless($@){
24 1         259 $Webqq::Encryption::RSA::has_je = 1;
25             }
26             else{
27 0           croak "You must install Crypt::RSA or Crypt::OpenSSL::RSA or JE module to support rsa encrypt\n";
28             }
29             }
30             }
31            
32             }
33              
34             sub encrypt {
35 0     0 0   my $data = shift;
36 0 0         if($Webqq::Encryption::RSA::has_crypt_rsa){
    0          
37 0           my $n = "0xF20CE00BAE5361F8FA3AE9CEFA495362FF7DA1BA628F64A347F0A8C012BF0B254A30CD92ABFFE7A6EE0DC424CB6166F8819EFA5BCCB20EDFB4AD02E412CCF579B1CA711D55B8B0B3AEB60153D5E0693A2A86F3167D7847A0CB8B00004716A9095D9BADC977CBB804DBDCBA6029A9710869A453F27DFDDF83C016D928B3CBF4C7";
38 0           my $public = Crypt::RSA::Key::Public->new();
39 0           $public->e("0x3");
40 0           $public->n($n);
41 0           my $rsa = Crypt::RSA::ES::PKCS1v15->new();
42 0           return lc join "",unpack "H*", $rsa->encrypt(Message=>$data,Key=>$public,);
43             }
44             elsif($Webqq::Encryption::RSA::has_crypt_openssl_rsa){
45 0           my $n = Crypt::OpenSSL::Bignum->new_from_hex("F20CE00BAE5361F8FA3AE9CEFA495362FF7DA1BA628F64A347F0A8C012BF0B254A30CD92ABFFE7A6EE0DC424CB6166F8819EFA5BCCB20EDFB4AD02E412CCF579B1CA711D55B8B0B3AEB60153D5E0693A2A86F3167D7847A0CB8B00004716A9095D9BADC977CBB804DBDCBA6029A9710869A453F27DFDDF83C016D928B3CBF4C7");
46 0           my $e = Crypt::OpenSSL::Bignum->new_from_hex("3");
47 0           my $rsa = Crypt::OpenSSL::RSA->new_key_from_parameters($n,$e);
48 0           $rsa->use_pkcs1_padding();
49 0           return lc join "",unpack "H*", $rsa->encrypt($data);
50             }
51              
52 0           $data = join "",map {"\\x$_"} unpack "H2"x length($data),$data;
  0            
53 0           my $je;
54 0 0         if(defined $Webqq::Encryption::RSA::_je ){
55 0           $je = $Webqq::Encryption::RSA::_je ;
56             }
57             else{
58 0           my $javascript;
59 0 0         if(defined $Webqq::Encryption::RSA::_javascript){
60 0           $javascript = $Webqq::Encryption::RSA::_javascript;
61             }
62             else{
63 0           local $/ = undef;
64 0           $javascript = ;
65 0           $Webqq::Encryption::RSA::_javascript = $javascript;
66 0           close DATA;
67             }
68 0           $je = JE->new;
69 0           $je->eval($javascript);
70 0 0         croak "Webqq::Encryption::RSA load javascript error: $@\n" if $@;
71 0           $Webqq::Encryption::RSA::_je = $je;
72             }
73            
74             #print qq#
75             # var rsa = RSA();
76             # var r = rsa.rsa_encrypt('$data');
77             # return(r);
78             ##;
79 0           my $p = $je->eval(qq#
80             var rsa = RSA();
81             var r = rsa.rsa_encrypt('$data');
82             return(r);
83             #);
84 0 0 0       if($p and !$@){
85 0           return $p;
86             }
87             else{
88 0           croak "Webqq::Encryption::RSA error: $@\n";
89             }
90            
91             }
92              
93             1;
94             __DATA__