Latest Update
This commit is contained in:
+27
-12
@@ -473,7 +473,6 @@ int BN_mod_exp_mont(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p,
|
||||
return ret;
|
||||
}
|
||||
|
||||
#if defined(SPARC_T4_MONT)
|
||||
static BN_ULONG bn_get_bits(const BIGNUM *a, int bitpos)
|
||||
{
|
||||
BN_ULONG ret = 0;
|
||||
@@ -492,7 +491,6 @@ static BN_ULONG bn_get_bits(const BIGNUM *a, int bitpos)
|
||||
|
||||
return ret & BN_MASK2;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* BN_mod_exp_mont_consttime() stores the precomputed powers in a specific
|
||||
@@ -599,7 +597,7 @@ int BN_mod_exp_mont_consttime(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p,
|
||||
const BIGNUM *m, BN_CTX *ctx,
|
||||
BN_MONT_CTX *in_mont)
|
||||
{
|
||||
int i, bits, ret = 0, window, wvalue;
|
||||
int i, bits, ret = 0, window, wvalue, wmask, window0;
|
||||
int top;
|
||||
BN_MONT_CTX *mont = NULL;
|
||||
|
||||
@@ -1040,27 +1038,44 @@ int BN_mod_exp_mont_consttime(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p,
|
||||
}
|
||||
}
|
||||
|
||||
bits--;
|
||||
for (wvalue = 0, i = bits % window; i >= 0; i--, bits--)
|
||||
wvalue = (wvalue << 1) + BN_is_bit_set(p, bits);
|
||||
/*
|
||||
* The exponent may not have a whole number of fixed-size windows.
|
||||
* To simplify the main loop, the initial window has between 1 and
|
||||
* full-window-size bits such that what remains is always a whole
|
||||
* number of windows
|
||||
*/
|
||||
window0 = (bits - 1) % window + 1;
|
||||
wmask = (1 << window0) - 1;
|
||||
bits -= window0;
|
||||
wvalue = bn_get_bits(p, bits) & wmask;
|
||||
if (!MOD_EXP_CTIME_COPY_FROM_PREBUF(&tmp, top, powerbuf, wvalue,
|
||||
window))
|
||||
goto err;
|
||||
|
||||
wmask = (1 << window) - 1;
|
||||
/*
|
||||
* Scan the exponent one window at a time starting from the most
|
||||
* significant bits.
|
||||
*/
|
||||
while (bits >= 0) {
|
||||
wvalue = 0; /* The 'value' of the window */
|
||||
while (bits > 0) {
|
||||
|
||||
/* Scan the window, squaring the result as we go */
|
||||
for (i = 0; i < window; i++, bits--) {
|
||||
/* Square the result window-size times */
|
||||
for (i = 0; i < window; i++)
|
||||
if (!BN_mod_mul_montgomery(&tmp, &tmp, &tmp, mont, ctx))
|
||||
goto err;
|
||||
wvalue = (wvalue << 1) + BN_is_bit_set(p, bits);
|
||||
}
|
||||
|
||||
/*
|
||||
* Get a window's worth of bits from the exponent
|
||||
* This avoids calling BN_is_bit_set for each bit, which
|
||||
* is not only slower but also makes each bit vulnerable to
|
||||
* EM (and likely other) side-channel attacks like One&Done
|
||||
* (for details see "One&Done: A Single-Decryption EM-Based
|
||||
* Attack on OpenSSL’s Constant-Time Blinded RSA" by M. Alam,
|
||||
* H. Khan, M. Dey, N. Sinha, R. Callan, A. Zajic, and
|
||||
* M. Prvulovic, in USENIX Security'18)
|
||||
*/
|
||||
bits -= window;
|
||||
wvalue = bn_get_bits(p, bits) & wmask;
|
||||
/*
|
||||
* Fetch the appropriate pre-computed value from the pre-buf
|
||||
*/
|
||||
|
||||
@@ -23,11 +23,14 @@
|
||||
# IALU/gcc-4.x 3xAltiVec+1xIALU
|
||||
#
|
||||
# Freescale e300 13.6/+115% -
|
||||
# PPC74x0/G4e 6.81/+310% 4.66
|
||||
# PPC970/G5 9.29/+160% 4.60
|
||||
# POWER7 8.62/+61% 4.27
|
||||
# POWER8 8.70/+51% 3.96
|
||||
# POWER9 6.61/+29% 3.67
|
||||
# PPC74x0/G4e 6.81/+310% 3.72
|
||||
# PPC970/G5 9.29/+160% ?
|
||||
# POWER7 8.62/+61% 3.38
|
||||
# POWER8 8.70/+51% 3.36
|
||||
# POWER9 6.61/+29% 3.30(*)
|
||||
#
|
||||
# (*) this is trade-off result, it's possible to improve it, but
|
||||
# then it would negatively affect all others;
|
||||
|
||||
$flavour = shift;
|
||||
|
||||
@@ -392,19 +395,19 @@ Loop_tail: # byte-by-byte loop
|
||||
___
|
||||
|
||||
{{{
|
||||
my ($A0,$B0,$C0,$D0,$A1,$B1,$C1,$D1,$A2,$B2,$C2,$D2,$T0,$T1,$T2) =
|
||||
map("v$_",(0..14));
|
||||
my (@K)=map("v$_",(15..20));
|
||||
my ($FOUR,$sixteen,$twenty4,$twenty,$twelve,$twenty5,$seven) =
|
||||
map("v$_",(21..27));
|
||||
my ($inpperm,$outperm,$outmask) = map("v$_",(28..30));
|
||||
my @D=("v31",$seven,$T0,$T1,$T2);
|
||||
my ($A0,$B0,$C0,$D0,$A1,$B1,$C1,$D1,$A2,$B2,$C2,$D2)
|
||||
= map("v$_",(0..11));
|
||||
my @K = map("v$_",(12..17));
|
||||
my ($FOUR,$sixteen,$twenty4) = map("v$_",(18..20));
|
||||
my ($inpperm,$outperm,$outmask) = map("v$_",(21..23));
|
||||
my @D = map("v$_",(24..28));
|
||||
my ($twelve,$seven,$T0,$T1) = @D;
|
||||
|
||||
my $FRAME=$LOCALS+64+13*16+18*$SIZE_T; # 13*16 is for v20-v31 offload
|
||||
my $FRAME=$LOCALS+64+10*16+18*$SIZE_T; # 10*16 is for v20-v28 offload
|
||||
|
||||
sub VMXROUND {
|
||||
my $odd = pop;
|
||||
my ($a,$b,$c,$d,$t)=@_;
|
||||
my ($a,$b,$c,$d)=@_;
|
||||
|
||||
(
|
||||
"&vadduwm ('$a','$a','$b')",
|
||||
@@ -412,20 +415,16 @@ my ($a,$b,$c,$d,$t)=@_;
|
||||
"&vperm ('$d','$d','$d','$sixteen')",
|
||||
|
||||
"&vadduwm ('$c','$c','$d')",
|
||||
"&vxor ('$t','$b','$c')",
|
||||
"&vsrw ('$b','$t','$twenty')",
|
||||
"&vslw ('$t','$t','$twelve')",
|
||||
"&vor ('$b','$b','$t')",
|
||||
"&vxor ('$b','$b','$c')",
|
||||
"&vrlw ('$b','$b','$twelve')",
|
||||
|
||||
"&vadduwm ('$a','$a','$b')",
|
||||
"&vxor ('$d','$d','$a')",
|
||||
"&vperm ('$d','$d','$d','$twenty4')",
|
||||
|
||||
"&vadduwm ('$c','$c','$d')",
|
||||
"&vxor ('$t','$b','$c')",
|
||||
"&vsrw ('$b','$t','$twenty5')",
|
||||
"&vslw ('$t','$t','$seven')",
|
||||
"&vor ('$b','$b','$t')",
|
||||
"&vxor ('$b','$b','$c')",
|
||||
"&vrlw ('$b','$b','$seven')",
|
||||
|
||||
"&vsldoi ('$c','$c','$c',8)",
|
||||
"&vsldoi ('$b','$b','$b',$odd?4:12)",
|
||||
@@ -461,13 +460,7 @@ $code.=<<___;
|
||||
stvx v26,r10,$sp
|
||||
addi r10,r10,32
|
||||
stvx v27,r11,$sp
|
||||
addi r11,r11,32
|
||||
stvx v28,r10,$sp
|
||||
addi r10,r10,32
|
||||
stvx v29,r11,$sp
|
||||
addi r11,r11,32
|
||||
stvx v30,r10,$sp
|
||||
stvx v31,r11,$sp
|
||||
stw r12,`$FRAME-$SIZE_T*18-4`($sp) # save vrsave
|
||||
$PUSH r14,`$FRAME-$SIZE_T*18`($sp)
|
||||
$PUSH r15,`$FRAME-$SIZE_T*17`($sp)
|
||||
@@ -487,9 +480,9 @@ $code.=<<___;
|
||||
$PUSH r29,`$FRAME-$SIZE_T*3`($sp)
|
||||
$PUSH r30,`$FRAME-$SIZE_T*2`($sp)
|
||||
$PUSH r31,`$FRAME-$SIZE_T*1`($sp)
|
||||
li r12,-1
|
||||
li r12,-8
|
||||
$PUSH r0, `$FRAME+$LRSAVE`($sp)
|
||||
mtspr 256,r12 # preserve all AltiVec registers
|
||||
mtspr 256,r12 # preserve 29 AltiVec registers
|
||||
|
||||
bl Lconsts # returns pointer Lsigma in r12
|
||||
li @x[0],16
|
||||
@@ -526,11 +519,6 @@ $code.=<<___;
|
||||
lwz @d[3],12($ctr)
|
||||
vadduwm @K[5],@K[4],@K[5]
|
||||
|
||||
vspltisw $twenty,-12 # synthesize constants
|
||||
vspltisw $twelve,12
|
||||
vspltisw $twenty5,-7
|
||||
#vspltisw $seven,7 # synthesized in the loop
|
||||
|
||||
vxor $T0,$T0,$T0 # 0x00..00
|
||||
vspltisw $outmask,-1 # 0xff..ff
|
||||
?lvsr $inpperm,0,$inp # prepare for unaligned load
|
||||
@@ -543,6 +531,7 @@ $code.=<<___;
|
||||
be?vxor $outperm,$outperm,$T1
|
||||
be?vperm $inpperm,$inpperm,$inpperm,$T0
|
||||
|
||||
li r0,10 # inner loop counter
|
||||
b Loop_outer_vmx
|
||||
|
||||
.align 4
|
||||
@@ -560,7 +549,6 @@ Loop_outer_vmx:
|
||||
ori @x[3],@x[3],0x6574
|
||||
vmr $B0,@K[1]
|
||||
|
||||
li r0,10 # inner loop counter
|
||||
lwz @x[4],0($key) # load key to GPR
|
||||
vmr $B1,@K[1]
|
||||
lwz @x[5],4($key)
|
||||
@@ -586,15 +574,17 @@ Loop_outer_vmx:
|
||||
mr @t[1],@x[5]
|
||||
mr @t[2],@x[6]
|
||||
mr @t[3],@x[7]
|
||||
|
||||
vspltisw $twelve,12 # synthesize constants
|
||||
vspltisw $seven,7
|
||||
|
||||
mtctr r0
|
||||
nop
|
||||
Loop_vmx:
|
||||
___
|
||||
my @thread0=&VMXROUND($A0,$B0,$C0,$D0,$T0,0);
|
||||
my @thread1=&VMXROUND($A1,$B1,$C1,$D1,$T1,0);
|
||||
my @thread2=&VMXROUND($A2,$B2,$C2,$D2,$T2,0);
|
||||
my @thread0=&VMXROUND($A0,$B0,$C0,$D0,0);
|
||||
my @thread1=&VMXROUND($A1,$B1,$C1,$D1,0);
|
||||
my @thread2=&VMXROUND($A2,$B2,$C2,$D2,0);
|
||||
my @thread3=&ROUND(0,4,8,12);
|
||||
|
||||
foreach (@thread0) {
|
||||
@@ -602,10 +592,11 @@ ___
|
||||
eval(shift(@thread1)); eval(shift(@thread3));
|
||||
eval(shift(@thread2)); eval(shift(@thread3));
|
||||
}
|
||||
foreach (@thread3) { eval; }
|
||||
|
||||
@thread0=&VMXROUND($A0,$B0,$C0,$D0,$T0,1);
|
||||
@thread1=&VMXROUND($A1,$B1,$C1,$D1,$T1,1);
|
||||
@thread2=&VMXROUND($A2,$B2,$C2,$D2,$T2,1);
|
||||
@thread0=&VMXROUND($A0,$B0,$C0,$D0,1);
|
||||
@thread1=&VMXROUND($A1,$B1,$C1,$D1,1);
|
||||
@thread2=&VMXROUND($A2,$B2,$C2,$D2,1);
|
||||
@thread3=&ROUND(0,5,10,15);
|
||||
|
||||
foreach (@thread0) {
|
||||
@@ -613,6 +604,7 @@ ___
|
||||
eval(shift(@thread1)); eval(shift(@thread3));
|
||||
eval(shift(@thread2)); eval(shift(@thread3));
|
||||
}
|
||||
foreach (@thread3) { eval; }
|
||||
$code.=<<___;
|
||||
bdnz Loop_vmx
|
||||
|
||||
@@ -866,13 +858,7 @@ Ldone_vmx:
|
||||
lvx v26,r10,$sp
|
||||
addi r10,r10,32
|
||||
lvx v27,r11,$sp
|
||||
addi r11,r11,32
|
||||
lvx v28,r10,$sp
|
||||
addi r10,r10,32
|
||||
lvx v29,r11,$sp
|
||||
addi r11,r11,32
|
||||
lvx v30,r10,$sp
|
||||
lvx v31,r11,$sp
|
||||
$POP r0, `$FRAME+$LRSAVE`($sp)
|
||||
$POP r14,`$FRAME-$SIZE_T*18`($sp)
|
||||
$POP r15,`$FRAME-$SIZE_T*17`($sp)
|
||||
@@ -904,7 +890,7 @@ Ldone_vmx:
|
||||
Lconsts:
|
||||
mflr r0
|
||||
bcl 20,31,\$+4
|
||||
mflr r12 #vvvvv "distance between . and _vpaes_consts
|
||||
mflr r12 #vvvvv "distance between . and Lsigma
|
||||
addi r12,r12,`64-8`
|
||||
mtlr r0
|
||||
blr
|
||||
|
||||
@@ -253,7 +253,6 @@ c448_error_t c448_ed448_verify(
|
||||
curve448_point_decode_like_eddsa_and_mul_by_ratio(pk_point, pubkey);
|
||||
curve448_scalar_t challenge_scalar;
|
||||
curve448_scalar_t response_scalar;
|
||||
unsigned int c;
|
||||
|
||||
if (C448_SUCCESS != error)
|
||||
return error;
|
||||
@@ -291,9 +290,6 @@ c448_error_t c448_ed448_verify(
|
||||
&signature[EDDSA_448_PUBLIC_BYTES],
|
||||
EDDSA_448_PRIVATE_BYTES);
|
||||
|
||||
for (c = 1; c < C448_EDDSA_DECODE_RATIO; c <<= 1)
|
||||
curve448_scalar_add(response_scalar, response_scalar, response_scalar);
|
||||
|
||||
/* pk_point = -c(x(P)) + (cx + k)G = kG */
|
||||
curve448_base_double_scalarmul_non_secret(pk_point,
|
||||
response_scalar,
|
||||
|
||||
@@ -219,10 +219,8 @@ static int pkey_ecies_encrypt(EVP_PKEY_CTX *ctx,
|
||||
|
||||
if (dctx->md)
|
||||
md_type = EVP_MD_type(dctx->md);
|
||||
else if (ec_nid == NID_sm2)
|
||||
md_type = NID_sm3;
|
||||
else
|
||||
md_type = NID_sha256;
|
||||
md_type = NID_sm3;
|
||||
|
||||
if (out == NULL) {
|
||||
*outlen = SM2_ciphertext_size(ec, EVP_get_digestbynid(md_type),
|
||||
@@ -259,13 +257,12 @@ static int pkey_ecies_decrypt(EVP_PKEY_CTX *ctx,
|
||||
|
||||
if (dctx->md)
|
||||
md_type = EVP_MD_type(dctx->md);
|
||||
else if (ec_nid == NID_sm2)
|
||||
md_type = NID_sm3;
|
||||
else
|
||||
md_type = NID_sha256;
|
||||
md_type = NID_sm3;
|
||||
|
||||
if (out == NULL) {
|
||||
*outlen = SM2_plaintext_size(ec, EVP_get_digestbynid(md_type), inlen);
|
||||
*outlen = SM2_plaintext_size(ec, EVP_get_digestbynid(md_type),
|
||||
inlen);
|
||||
ret = 1;
|
||||
}
|
||||
else {
|
||||
|
||||
@@ -171,7 +171,8 @@ static void look_str_cb(int nid, STACK_OF(ENGINE) *sk, ENGINE *def, void *arg)
|
||||
ENGINE *e = sk_ENGINE_value(sk, i);
|
||||
EVP_PKEY_ASN1_METHOD *ameth;
|
||||
e->pkey_asn1_meths(e, &ameth, NULL, nid);
|
||||
if (((int)strlen(ameth->pem_str) == lk->len)
|
||||
if (ameth != NULL
|
||||
&& ((int)strlen(ameth->pem_str) == lk->len)
|
||||
&& strncasecmp(ameth->pem_str, lk->str, lk->len) == 0) {
|
||||
lk->e = e;
|
||||
lk->ameth = ameth;
|
||||
|
||||
@@ -1685,6 +1685,7 @@ X509_F_X509_GET_PUBKEY_PARAMETERS:110:X509_get_pubkey_parameters
|
||||
X509_F_X509_LOAD_CERT_CRL_FILE:132:X509_load_cert_crl_file
|
||||
X509_F_X509_LOAD_CERT_FILE:111:X509_load_cert_file
|
||||
X509_F_X509_LOAD_CRL_FILE:112:X509_load_crl_file
|
||||
X509_F_X509_LOOKUP_METH_NEW:160:X509_LOOKUP_meth_new
|
||||
X509_F_X509_LOOKUP_NEW:155:X509_LOOKUP_new
|
||||
X509_F_X509_NAME_ADD_ENTRY:113:X509_NAME_add_entry
|
||||
X509_F_X509_NAME_CANON:156:x509_name_canon
|
||||
|
||||
@@ -237,7 +237,7 @@ size_t CRYPTO_128_wrap_pad(void *key, const unsigned char *icv,
|
||||
*
|
||||
* @param[in] key Key value.
|
||||
* @param[in] icv (Non-standard) IV, 4 bytes. NULL = use default_aiv.
|
||||
* @param[out] out Plaintext. Minimal buffer length = inlen bytes.
|
||||
* @param[out] out Plaintext. Minimal buffer length = (inlen - 8) bytes.
|
||||
* Input and output buffers can overlap if block function
|
||||
* supports that.
|
||||
* @param[in] in Ciphertext as n 64-bit blocks.
|
||||
@@ -267,7 +267,6 @@ size_t CRYPTO_128_unwrap_pad(void *key, const unsigned char *icv,
|
||||
if ((inlen & 0x7) != 0 || inlen < 16 || inlen >= CRYPTO128_WRAP_MAX)
|
||||
return 0;
|
||||
|
||||
memmove(out, in, inlen);
|
||||
if (inlen == 16) {
|
||||
/*
|
||||
* Section 4.2 - special case in step 1: When n=1, the ciphertext
|
||||
@@ -275,14 +274,17 @@ size_t CRYPTO_128_unwrap_pad(void *key, const unsigned char *icv,
|
||||
* single AES block using AES in ECB mode: AIV | P[1] = DEC(K, C[0] |
|
||||
* C[1])
|
||||
*/
|
||||
block(out, out, key);
|
||||
memcpy(aiv, out, 8);
|
||||
unsigned char buff[16];
|
||||
|
||||
block(in, buff, key);
|
||||
memcpy(aiv, buff, 8);
|
||||
/* Remove AIV */
|
||||
memmove(out, out + 8, 8);
|
||||
memcpy(out, buff + 8, 8);
|
||||
padded_len = 8;
|
||||
OPENSSL_cleanse(buff, inlen);
|
||||
} else {
|
||||
padded_len = inlen - 8;
|
||||
ret = crypto_128_unwrap_raw(key, aiv, out, out, inlen, block);
|
||||
ret = crypto_128_unwrap_raw(key, aiv, out, in, inlen, block);
|
||||
if (padded_len != ret) {
|
||||
OPENSSL_cleanse(out, inlen);
|
||||
return 0;
|
||||
|
||||
+31
-14
@@ -1,5 +1,5 @@
|
||||
#! /usr/bin/env perl
|
||||
# Copyright 2006-2016 The OpenSSL Project Authors. All Rights Reserved.
|
||||
# Copyright 2006-2018 The OpenSSL Project Authors. All Rights Reserved.
|
||||
#
|
||||
# Licensed under the OpenSSL license (the "License"). You may not use
|
||||
# this file except in compliance with the License. You can obtain a copy
|
||||
@@ -217,6 +217,7 @@ my $stvdx_u = sub { vsxmem_op(@_, 716); }; # stxsdx
|
||||
my $lvx_4w = sub { vsxmem_op(@_, 780); }; # lxvw4x
|
||||
my $stvx_4w = sub { vsxmem_op(@_, 908); }; # stxvw4x
|
||||
my $lvx_splt = sub { vsxmem_op(@_, 332); }; # lxvdsx
|
||||
# VSX instruction[s] masqueraded as made-up AltiVec/VMX
|
||||
my $vpermdi = sub { # xxpermdi
|
||||
my ($f, $vrt, $vra, $vrb, $dm) = @_;
|
||||
$dm = oct($dm) if ($dm =~ /^0/);
|
||||
@@ -228,6 +229,10 @@ sub vcrypto_op {
|
||||
my ($f, $vrt, $vra, $vrb, $op) = @_;
|
||||
" .long ".sprintf "0x%X",(4<<26)|($vrt<<21)|($vra<<16)|($vrb<<11)|$op;
|
||||
}
|
||||
sub vfour {
|
||||
my ($f, $vrt, $vra, $vrb, $vrc, $op) = @_;
|
||||
" .long ".sprintf "0x%X",(4<<26)|($vrt<<21)|($vra<<16)|($vrb<<11)|($vrc<<6)|$op;
|
||||
};
|
||||
my $vcipher = sub { vcrypto_op(@_, 1288); };
|
||||
my $vcipherlast = sub { vcrypto_op(@_, 1289); };
|
||||
my $vncipher = sub { vcrypto_op(@_, 1352); };
|
||||
@@ -239,7 +244,7 @@ my $vpmsumb = sub { vcrypto_op(@_, 1032); };
|
||||
my $vpmsumd = sub { vcrypto_op(@_, 1224); };
|
||||
my $vpmsubh = sub { vcrypto_op(@_, 1096); };
|
||||
my $vpmsumw = sub { vcrypto_op(@_, 1160); };
|
||||
# These are not really crypto, but one can use vcrypto_op
|
||||
# These are not really crypto, but vcrypto_op template works
|
||||
my $vaddudm = sub { vcrypto_op(@_, 192); };
|
||||
my $vadduqm = sub { vcrypto_op(@_, 256); };
|
||||
my $vmuleuw = sub { vcrypto_op(@_, 648); };
|
||||
@@ -247,21 +252,29 @@ my $vmulouw = sub { vcrypto_op(@_, 136); };
|
||||
my $vrld = sub { vcrypto_op(@_, 196); };
|
||||
my $vsld = sub { vcrypto_op(@_, 1476); };
|
||||
my $vsrd = sub { vcrypto_op(@_, 1732); };
|
||||
my $vsubudm = sub { vcrypto_op(@_, 1216); };
|
||||
my $vaddcuq = sub { vcrypto_op(@_, 320); };
|
||||
my $vaddeuqm = sub { vfour(@_,60); };
|
||||
my $vaddecuq = sub { vfour(@_,61); };
|
||||
|
||||
my $mtsle = sub {
|
||||
my ($f, $arg) = @_;
|
||||
" .long ".sprintf "0x%X",(31<<26)|($arg<<21)|(147*2);
|
||||
};
|
||||
|
||||
# VSX instructions masqueraded as AltiVec/VMX
|
||||
my $mtvrd = sub {
|
||||
my ($f, $vrt, $ra) = @_;
|
||||
" .long ".sprintf "0x%X",(31<<26)|($vrt<<21)|($ra<<16)|(179<<1)|1;
|
||||
};
|
||||
my $mtvrwz = sub {
|
||||
my ($f, $vrt, $ra) = @_;
|
||||
" .long ".sprintf "0x%X",(31<<26)|($vrt<<21)|($ra<<16)|(243<<1)|1;
|
||||
};
|
||||
|
||||
# PowerISA 3.0 stuff
|
||||
my $maddhdu = sub {
|
||||
my ($f, $rt, $ra, $rb, $rc) = @_;
|
||||
" .long ".sprintf "0x%X",(4<<26)|($rt<<21)|($ra<<16)|($rb<<11)|($rc<<6)|49;
|
||||
};
|
||||
my $maddld = sub {
|
||||
my ($f, $rt, $ra, $rb, $rc) = @_;
|
||||
" .long ".sprintf "0x%X",(4<<26)|($rt<<21)|($ra<<16)|($rb<<11)|($rc<<6)|51;
|
||||
};
|
||||
my $maddhdu = sub { vfour(@_,49); };
|
||||
my $maddld = sub { vfour(@_,51); };
|
||||
my $darn = sub {
|
||||
my ($f, $rt, $l) = @_;
|
||||
" .long ".sprintf "0x%X",(31<<26)|($rt<<21)|($l<<16)|(755<<1);
|
||||
@@ -270,16 +283,20 @@ my $iseleq = sub {
|
||||
my ($f, $rt, $ra, $rb) = @_;
|
||||
" .long ".sprintf "0x%X",(31<<26)|($rt<<21)|($ra<<16)|($rb<<11)|(2<<6)|30;
|
||||
};
|
||||
# VSX instruction[s] masqueraded as made-up AltiVec/VMX
|
||||
my $vspltib = sub { # xxspltib
|
||||
my ($f, $vrt, $imm8) = @_;
|
||||
$imm8 = oct($imm8) if ($imm8 =~ /^0/);
|
||||
$imm8 &= 0xff;
|
||||
" .long ".sprintf "0x%X",(60<<26)|($vrt<<21)|($imm8<<11)|(360<<1)|1;
|
||||
};
|
||||
|
||||
# PowerISA 3.0B stuff
|
||||
my $addex = sub {
|
||||
my ($f, $rt, $ra, $rb, $cy) = @_; # only cy==0 is specified in 3.0B
|
||||
" .long ".sprintf "0x%X",(31<<26)|($rt<<21)|($ra<<16)|($rb<<11)|($cy<<9)|(170<<1);
|
||||
};
|
||||
my $vmsumudm = sub {
|
||||
my ($f, $vrt, $vra, $vrb, $vrc) = @_;
|
||||
" .long ".sprintf "0x%X",(4<<26)|($vrt<<21)|($vra<<16)|($vrb<<11)|($vrc<<6)|35;
|
||||
};
|
||||
my $vmsumudm = sub { vfour(@_,35); };
|
||||
|
||||
while($line=<>) {
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ SOURCE[../../libcrypto]=\
|
||||
x509_obj.c x509_req.c x509spki.c x509_vfy.c \
|
||||
x509_set.c x509cset.c x509rset.c x509_err.c \
|
||||
x509name.c x509_v3.c x509_ext.c x509_att.c \
|
||||
x509type.c x509_lu.c x_all.c x509_txt.c \
|
||||
x509type.c x509_meth.c x509_lu.c x_all.c x509_txt.c \
|
||||
x509_trs.c by_file.c by_dir.c x509_vpm.c \
|
||||
x_crl.c t_crl.c x_req.c t_req.c x_x509.c t_x509.c \
|
||||
x_pubkey.c x_x509a.c x_attrib.c x_exten.c x_name.c
|
||||
@@ -110,7 +110,7 @@ static int new_dir(X509_LOOKUP *lu)
|
||||
X509err(X509_F_NEW_DIR, ERR_R_MALLOC_FAILURE);
|
||||
goto err;
|
||||
}
|
||||
lu->method_data = (char *)a;
|
||||
lu->method_data = a;
|
||||
return 1;
|
||||
|
||||
err:
|
||||
|
||||
@@ -61,6 +61,8 @@ static const ERR_STRING_DATA X509_str_functs[] = {
|
||||
"X509_load_cert_file"},
|
||||
{ERR_PACK(ERR_LIB_X509, X509_F_X509_LOAD_CRL_FILE, 0),
|
||||
"X509_load_crl_file"},
|
||||
{ERR_PACK(ERR_LIB_X509, X509_F_X509_LOOKUP_METH_NEW, 0),
|
||||
"X509_LOOKUP_meth_new"},
|
||||
{ERR_PACK(ERR_LIB_X509, X509_F_X509_LOOKUP_NEW, 0), "X509_LOOKUP_new"},
|
||||
{ERR_PACK(ERR_LIB_X509, X509_F_X509_NAME_ADD_ENTRY, 0),
|
||||
"X509_NAME_add_entry"},
|
||||
|
||||
@@ -69,7 +69,7 @@ struct x509_crl_method_st {
|
||||
};
|
||||
|
||||
struct x509_lookup_method_st {
|
||||
const char *name;
|
||||
char *name;
|
||||
int (*new_item) (X509_LOOKUP *ctx);
|
||||
void (*free) (X509_LOOKUP *ctx);
|
||||
int (*init) (X509_LOOKUP *ctx);
|
||||
@@ -93,7 +93,7 @@ struct x509_lookup_st {
|
||||
int init; /* have we been started */
|
||||
int skip; /* don't use us. */
|
||||
X509_LOOKUP_METHOD *method; /* the functions */
|
||||
char *method_data; /* method data */
|
||||
void *method_data; /* method data */
|
||||
X509_STORE *store_ctx; /* who owns us */
|
||||
};
|
||||
|
||||
|
||||
+45
-2
@@ -118,6 +118,23 @@ int X509_LOOKUP_by_alias(X509_LOOKUP *ctx, X509_LOOKUP_TYPE type,
|
||||
return ctx->method->get_by_alias(ctx, type, str, len, ret);
|
||||
}
|
||||
|
||||
int X509_LOOKUP_set_method_data(X509_LOOKUP *ctx, void *data)
|
||||
{
|
||||
ctx->method_data = data;
|
||||
return 1;
|
||||
}
|
||||
|
||||
void *X509_LOOKUP_get_method_data(const X509_LOOKUP *ctx)
|
||||
{
|
||||
return ctx->method_data;
|
||||
}
|
||||
|
||||
X509_STORE *X509_LOOKUP_get_store(const X509_LOOKUP *ctx)
|
||||
{
|
||||
return ctx->store_ctx;
|
||||
}
|
||||
|
||||
|
||||
static int x509_object_cmp(const X509_OBJECT *const *a,
|
||||
const X509_OBJECT *const *b)
|
||||
{
|
||||
@@ -403,8 +420,7 @@ X509_OBJECT *X509_OBJECT_new(void)
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
void X509_OBJECT_free(X509_OBJECT *a)
|
||||
static void x509_object_free_internal(X509_OBJECT *a)
|
||||
{
|
||||
if (a == NULL)
|
||||
return;
|
||||
@@ -418,6 +434,33 @@ void X509_OBJECT_free(X509_OBJECT *a)
|
||||
X509_CRL_free(a->data.crl);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
int X509_OBJECT_set1_X509(X509_OBJECT *a, X509 *obj)
|
||||
{
|
||||
if (a == NULL || !X509_up_ref(obj))
|
||||
return 0;
|
||||
|
||||
x509_object_free_internal(a);
|
||||
a->type = X509_LU_X509;
|
||||
a->data.x509 = obj;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int X509_OBJECT_set1_X509_CRL(X509_OBJECT *a, X509_CRL *obj)
|
||||
{
|
||||
if (a == NULL || !X509_CRL_up_ref(obj))
|
||||
return 0;
|
||||
|
||||
x509_object_free_internal(a);
|
||||
a->type = X509_LU_CRL;
|
||||
a->data.crl = obj;
|
||||
return 1;
|
||||
}
|
||||
|
||||
void X509_OBJECT_free(X509_OBJECT *a)
|
||||
{
|
||||
x509_object_free_internal(a);
|
||||
OPENSSL_free(a);
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,166 @@
|
||||
/*
|
||||
* Copyright 2018 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the OpenSSL license (the "License"). You may not use
|
||||
* this file except in compliance with the License. You can obtain a copy
|
||||
* in the file LICENSE in the source distribution or at
|
||||
* https://www.openssl.org/source/license.html
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <time.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include "internal/cryptlib.h"
|
||||
#include <openssl/asn1.h>
|
||||
#include <openssl/x509.h>
|
||||
#include <openssl/ossl_typ.h>
|
||||
#include "x509_lcl.h"
|
||||
|
||||
X509_LOOKUP_METHOD *X509_LOOKUP_meth_new(const char *name)
|
||||
{
|
||||
X509_LOOKUP_METHOD *method = OPENSSL_zalloc(sizeof(X509_LOOKUP_METHOD));
|
||||
|
||||
if (method != NULL) {
|
||||
method->name = OPENSSL_strdup(name);
|
||||
if (method->name == NULL) {
|
||||
X509err(X509_F_X509_LOOKUP_METH_NEW, ERR_R_MALLOC_FAILURE);
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
|
||||
return method;
|
||||
|
||||
err:
|
||||
OPENSSL_free(method);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void X509_LOOKUP_meth_free(X509_LOOKUP_METHOD *method)
|
||||
{
|
||||
if (method != NULL)
|
||||
OPENSSL_free(method->name);
|
||||
OPENSSL_free(method);
|
||||
}
|
||||
|
||||
int X509_LOOKUP_meth_set_new_item(X509_LOOKUP_METHOD *method,
|
||||
int (*new_item) (X509_LOOKUP *ctx))
|
||||
{
|
||||
method->new_item = new_item;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int (*X509_LOOKUP_meth_get_new_item(const X509_LOOKUP_METHOD* method))
|
||||
(X509_LOOKUP *ctx)
|
||||
{
|
||||
return method->new_item;
|
||||
}
|
||||
|
||||
int X509_LOOKUP_meth_set_free(
|
||||
X509_LOOKUP_METHOD *method,
|
||||
void (*free) (X509_LOOKUP *ctx))
|
||||
{
|
||||
method->free = free;
|
||||
return 1;
|
||||
}
|
||||
|
||||
void (*X509_LOOKUP_meth_get_free(const X509_LOOKUP_METHOD* method))
|
||||
(X509_LOOKUP *ctx)
|
||||
{
|
||||
return method->free;
|
||||
}
|
||||
|
||||
int X509_LOOKUP_meth_set_init(X509_LOOKUP_METHOD *method,
|
||||
int (*init) (X509_LOOKUP *ctx))
|
||||
{
|
||||
method->init = init;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int (*X509_LOOKUP_meth_get_init(const X509_LOOKUP_METHOD* method))
|
||||
(X509_LOOKUP *ctx)
|
||||
{
|
||||
return method->init;
|
||||
}
|
||||
|
||||
int X509_LOOKUP_meth_set_shutdown(
|
||||
X509_LOOKUP_METHOD *method,
|
||||
int (*shutdown) (X509_LOOKUP *ctx))
|
||||
{
|
||||
method->shutdown = shutdown;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int (*X509_LOOKUP_meth_get_shutdown(const X509_LOOKUP_METHOD* method))
|
||||
(X509_LOOKUP *ctx)
|
||||
{
|
||||
return method->shutdown;
|
||||
}
|
||||
|
||||
int X509_LOOKUP_meth_set_ctrl(
|
||||
X509_LOOKUP_METHOD *method,
|
||||
X509_LOOKUP_ctrl_fn ctrl)
|
||||
{
|
||||
method->ctrl = ctrl;
|
||||
return 1;
|
||||
}
|
||||
|
||||
X509_LOOKUP_ctrl_fn X509_LOOKUP_meth_get_ctrl(const X509_LOOKUP_METHOD *method)
|
||||
{
|
||||
return method->ctrl;
|
||||
}
|
||||
|
||||
int X509_LOOKUP_meth_set_get_by_subject(X509_LOOKUP_METHOD *method,
|
||||
X509_LOOKUP_get_by_subject_fn get_by_subject)
|
||||
{
|
||||
method->get_by_subject = get_by_subject;
|
||||
return 1;
|
||||
}
|
||||
|
||||
X509_LOOKUP_get_by_subject_fn X509_LOOKUP_meth_get_get_by_subject(
|
||||
const X509_LOOKUP_METHOD *method)
|
||||
{
|
||||
return method->get_by_subject;
|
||||
}
|
||||
|
||||
|
||||
int X509_LOOKUP_meth_set_get_by_issuer_serial(X509_LOOKUP_METHOD *method,
|
||||
X509_LOOKUP_get_by_issuer_serial_fn get_by_issuer_serial)
|
||||
{
|
||||
method->get_by_issuer_serial = get_by_issuer_serial;
|
||||
return 1;
|
||||
}
|
||||
|
||||
X509_LOOKUP_get_by_issuer_serial_fn
|
||||
X509_LOOKUP_meth_get_get_by_issuer_serial(const X509_LOOKUP_METHOD *method)
|
||||
{
|
||||
return method->get_by_issuer_serial;
|
||||
}
|
||||
|
||||
|
||||
int X509_LOOKUP_meth_set_get_by_fingerprint(X509_LOOKUP_METHOD *method,
|
||||
X509_LOOKUP_get_by_fingerprint_fn get_by_fingerprint)
|
||||
{
|
||||
method->get_by_fingerprint = get_by_fingerprint;
|
||||
return 1;
|
||||
}
|
||||
|
||||
X509_LOOKUP_get_by_fingerprint_fn X509_LOOKUP_meth_get_get_by_fingerprint(
|
||||
const X509_LOOKUP_METHOD *method)
|
||||
{
|
||||
return method->get_by_fingerprint;
|
||||
}
|
||||
|
||||
int X509_LOOKUP_meth_set_get_by_alias(X509_LOOKUP_METHOD *method,
|
||||
X509_LOOKUP_get_by_alias_fn get_by_alias)
|
||||
{
|
||||
method->get_by_alias = get_by_alias;
|
||||
return 1;
|
||||
}
|
||||
|
||||
X509_LOOKUP_get_by_alias_fn X509_LOOKUP_meth_get_get_by_alias(
|
||||
const X509_LOOKUP_METHOD *method)
|
||||
{
|
||||
return method->get_by_alias;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user